Compare commits

..

147 Commits

Author SHA1 Message Date
df53968306 Merge branch 'develop' 2021-08-09 21:47:52 +09:00
19f753c15c 12.85.1 2021-08-09 21:47:43 +09:00
df530bb66d Merge branch 'develop' 2021-08-09 21:47:23 +09:00
fa49427df0 🎨 2021-08-09 21:45:46 +09:00
6678d97cc4 🎨 2021-08-09 21:41:20 +09:00
e3642a8d10 🎨 2021-08-09 18:55:39 +09:00
f9022fdf16 🎨 2021-08-09 18:05:32 +09:00
1c764139bf 🎨 2021-08-09 18:01:12 +09:00
048ed26f41 連合インスタンス設定ダイアログ 2021-08-09 12:28:23 +09:00
c52e30e8e0 Merge branch 'develop' 2021-08-08 23:25:21 +09:00
0cb04ded36 12.85.0 2021-08-08 23:25:13 +09:00
6cfad65ac7 🎨 2021-08-08 21:59:18 +09:00
ed20805b10 New Crowdin updates (#7616)
* New translations troubleshooting.md (Indonesian)

* New translations troubleshooting.md (Chinese Traditional)

* New translations troubleshooting.md (German)

* New translations troubleshooting.md (Chinese Simplified)

* New translations troubleshooting.md (Ukrainian)

* New translations troubleshooting.md (Russian)

* New translations troubleshooting.md (Portuguese)

* New translations troubleshooting.md (Polish)

* New translations troubleshooting.md (Norwegian)

* New translations troubleshooting.md (Dutch)

* New translations troubleshooting.md (Korean)

* New translations troubleshooting.md (Italian)

* New translations report-issue.md (Korean)

* New translations report-issue.md (German)

* New translations links.md (Portuguese)

* New translations links.md (Kannada)

* New translations misskey.md (German)

* New translations misskey.md (Danish)

* New translations misskey.md (Czech)

* New translations misskey.md (Arabic)

* New translations misskey.md (Spanish)

* New translations misskey.md (French)

* New translations links.md (Japanese, Kansai)

* New translations links.md (Kabyle)

* New translations links.md (Haitian Creole)

* New translations links.md (Lojban)

* New translations misskey.md (Korean)

* New translations links.md (Uyghur)

* New translations links.md (Esperanto)

* New translations links.md (Thai)

* New translations links.md (Indonesian)

* New translations links.md (English)

* New translations links.md (Chinese Traditional)

* New translations links.md (Chinese Simplified)

* New translations links.md (Ukrainian)

* New translations links.md (Russian)

* New translations misskey.md (Italian)

* New translations misskey.md (Dutch)

* New translations report-issue.md (Danish)

* New translations misskey.md (Uyghur)

* New translations report-issue.md (Czech)

* New translations report-issue.md (Arabic)

* New translations report-issue.md (Spanish)

* New translations report-issue.md (French)

* New translations misskey.md (Japanese, Kansai)

* New translations misskey.md (Kabyle)

* New translations misskey.md (Haitian Creole)

* New translations misskey.md (Kannada)

* New translations misskey.md (Lojban)

* New translations misskey.md (Esperanto)

* New translations misskey.md (Norwegian)

* New translations misskey.md (Thai)

* New translations misskey.md (Indonesian)

* New translations misskey.md (English)

* New translations misskey.md (Chinese Traditional)

* New translations misskey.md (Chinese Simplified)

* New translations misskey.md (Ukrainian)

* New translations misskey.md (Russian)

* New translations misskey.md (Portuguese)

* New translations misskey.md (Polish)

* New translations widgets.md (Lojban)

* New translations reaction.md (Polish)

* New translations widgets.md (Esperanto)

* New translations pages.md (Esperanto)

* New translations reaction.md (Spanish)

* New translations reaction.md (French)

* New translations pages.md (Japanese, Kansai)

* New translations pages.md (Kabyle)

* New translations pages.md (Haitian Creole)

* New translations pages.md (Kannada)

* New translations pages.md (Lojban)

* New translations pages.md (Uyghur)

* New translations pages.md (Thai)

* New translations reaction.md (Czech)

* New translations pages.md (Indonesian)

* New translations pages.md (English)

* New translations pages.md (Chinese Traditional)

* New translations pages.md (Chinese Simplified)

* New translations pages.md (Ukrainian)

* New translations pages.md (Russian)

* New translations pages.md (Portuguese)

* New translations pages.md (Polish)

* New translations pages.md (Norwegian)

* New translations reaction.md (Arabic)

* New translations reaction.md (Danish)

* New translations pages.md (Korean)

* New translations reaction.md (Indonesian)

* New translations silence.md (French)

* New translations reaction.md (Japanese, Kansai)

* New translations reaction.md (Kabyle)

* New translations reaction.md (Haitian Creole)

* New translations reaction.md (Kannada)

* New translations reaction.md (Lojban)

* New translations reaction.md (Uyghur)

* New translations reaction.md (Esperanto)

* New translations reaction.md (Thai)

* New translations reaction.md (English)

* New translations reaction.md (German)

* New translations reaction.md (Chinese Traditional)

* New translations reaction.md (Chinese Simplified)

* New translations reaction.md (Ukrainian)

* New translations reaction.md (Russian)

* New translations reaction.md (Portuguese)

* New translations reaction.md (Norwegian)

* New translations reaction.md (Dutch)

* New translations reaction.md (Korean)

* New translations reaction.md (Italian)

* New translations pages.md (Dutch)

* New translations pages.md (Italian)

* New translations silence.md (Arabic)

* New translations mute.md (Kabyle)

* New translations note.md (Italian)

* New translations note.md (German)

* New translations note.md (Danish)

* New translations note.md (Czech)

* New translations note.md (Arabic)

* New translations note.md (Spanish)

* New translations note.md (French)

* New translations mute.md (Japanese, Kansai)

* New translations mute.md (Haitian Creole)

* New translations note.md (Dutch)

* New translations mute.md (Kannada)

* New translations mute.md (Lojban)

* New translations mute.md (Uyghur)

* New translations mute.md (Esperanto)

* New translations mute.md (Thai)

* New translations mute.md (Indonesian)

* New translations mute.md (English)

* New translations mute.md (Chinese Traditional)

* New translations mute.md (Chinese Simplified)

* New translations note.md (Korean)

* New translations note.md (Norwegian)

* New translations pages.md (German)

* New translations note.md (Lojban)

* New translations pages.md (Danish)

* New translations pages.md (Czech)

* New translations pages.md (Arabic)

* New translations pages.md (Spanish)

* New translations pages.md (French)

* New translations note.md (Japanese, Kansai)

* New translations note.md (Kabyle)

* New translations note.md (Haitian Creole)

* New translations note.md (Kannada)

* New translations note.md (Uyghur)

* New translations note.md (Polish)

* New translations note.md (Esperanto)

* New translations note.md (Thai)

* New translations note.md (Indonesian)

* New translations note.md (English)

* New translations note.md (Chinese Traditional)

* New translations note.md (Chinese Simplified)

* New translations note.md (Ukrainian)

* New translations note.md (Russian)

* New translations note.md (Portuguese)

* New translations silence.md (Spanish)

* New translations silence.md (Czech)

* New translations widgets.md (Thai)

* New translations timeline.md (Portuguese)

* New translations timeline.md (Esperanto)

* New translations timeline.md (Thai)

* New translations timeline.md (Indonesian)

* New translations timeline.md (English)

* New translations timeline.md (Chinese Traditional)

* New translations timeline.md (Chinese Simplified)

* New translations timeline.md (Ukrainian)

* New translations timeline.md (Russian)

* New translations timeline.md (Polish)

* New translations timeline.md (Lojban)

* New translations timeline.md (Norwegian)

* New translations timeline.md (Dutch)

* New translations timeline.md (Korean)

* New translations timeline.md (Italian)

* New translations timeline.md (German)

* New translations timeline.md (Danish)

* New translations timeline.md (Czech)

* New translations timeline.md (Arabic)

* New translations timeline.md (Spanish)

* New translations timeline.md (Uyghur)

* New translations timeline.md (Kannada)

* New translations theme.md (Japanese, Kansai)

* New translations widgets.md (Dutch)

* New translations widgets.md (Indonesian)

* New translations widgets.md (English)

* New translations widgets.md (Chinese Traditional)

* New translations widgets.md (Chinese Simplified)

* New translations widgets.md (Ukrainian)

* New translations widgets.md (Russian)

* New translations widgets.md (Portuguese)

* New translations widgets.md (Polish)

* New translations widgets.md (Norwegian)

* New translations widgets.md (Korean)

* New translations timeline.md (Haitian Creole)

* New translations widgets.md (Italian)

* New translations widgets.md (German)

* New translations widgets.md (Danish)

* New translations widgets.md (Czech)

* New translations widgets.md (Arabic)

* New translations widgets.md (Spanish)

* New translations widgets.md (French)

* New translations timeline.md (Japanese, Kansai)

* New translations timeline.md (Kabyle)

* New translations timeline.md (French)

* New translations theme.md (Kabyle)

* New translations silence.md (Danish)

* New translations silence.md (Chinese Traditional)

* New translations silence.md (Kabyle)

* New translations silence.md (Haitian Creole)

* New translations silence.md (Kannada)

* New translations silence.md (Lojban)

* New translations silence.md (Uyghur)

* New translations silence.md (Esperanto)

* New translations silence.md (Thai)

* New translations silence.md (Indonesian)

* New translations silence.md (English)

* New translations silence.md (Chinese Simplified)

* New translations theme.md (French)

* New translations silence.md (Ukrainian)

* New translations silence.md (Russian)

* New translations silence.md (Portuguese)

* New translations silence.md (Polish)

* New translations silence.md (Norwegian)

* New translations silence.md (Dutch)

* New translations silence.md (Korean)

* New translations silence.md (Italian)

* New translations silence.md (German)

* New translations silence.md (Japanese, Kansai)

* New translations theme.md (Spanish)

* New translations theme.md (Haitian Creole)

* New translations theme.md (Ukrainian)

* New translations theme.md (Kannada)

* New translations theme.md (Lojban)

* New translations theme.md (Uyghur)

* New translations theme.md (Esperanto)

* New translations theme.md (Thai)

* New translations theme.md (Indonesian)

* New translations theme.md (English)

* New translations theme.md (Chinese Traditional)

* New translations theme.md (Chinese Simplified)

* New translations theme.md (Russian)

* New translations theme.md (Arabic)

* New translations theme.md (Portuguese)

* New translations theme.md (Polish)

* New translations theme.md (Norwegian)

* New translations theme.md (Dutch)

* New translations theme.md (Korean)

* New translations theme.md (Italian)

* New translations theme.md (German)

* New translations theme.md (Danish)

* New translations theme.md (Czech)

* New translations troubleshooting.md (Japanese, Kansai)
2021-08-08 21:39:45 +09:00
576303cd72 Update crowdin.yml 2021-08-08 18:57:07 +09:00
0062e084f8 New Crowdin updates (#7614)
* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Kabyle)

* New translations ja-JP.yml (Kabyle)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Indonesian)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Japanese, Kansai)
2021-08-08 18:55:15 +09:00
b90d76dcfe Update links.md 2021-08-08 18:47:57 +09:00
c95619b2bf Update ja-JP.yml 2021-08-08 17:23:16 +09:00
82150bd5b8 🎨 2021-08-08 16:30:30 +09:00
9e03335ff8 Improve client 2021-08-08 13:02:58 +09:00
b3c5c3f0ea Improve usability 2021-08-08 12:45:44 +09:00
65858dab3e Improve client 2021-08-08 12:19:10 +09:00
c968633d15 Update misskey.md 2021-08-07 23:43:42 +09:00
39a8942daf 🎨 2021-08-07 22:06:50 +09:00
7705a7928e fix bug that docs not loading 2021-08-07 20:39:27 +09:00
d2c14b844e New Crowdin updates (#7610)
* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations mute.md (Esperanto)

* New translations stream.md (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations keyboard-shortcut.md (Esperanto)

* New translations timelines.md (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations follow.md (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations custom-emoji.md (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Arabic)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Indonesian)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Indonesian)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Indonesian)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (Arabic)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)
2021-08-07 19:25:54 +09:00
3e45e6c165 Clean up 2021-08-07 19:21:17 +09:00
fe8334931f user page 🎨 2021-08-07 19:19:43 +09:00
f565c5f730 Improve chat UI (wip) 2021-08-07 19:19:31 +09:00
c03e2febb0 🎨 2021-08-07 19:09:06 +09:00
c2f4fb7ba7 Update troubleshooting.md 2021-08-07 18:10:33 +09:00
5f869e5d87 Improve client 2021-08-07 17:55:16 +09:00
65f1afc4e0 Improve docs 2021-08-07 16:54:51 +09:00
aec2762bf1 🎨 2021-08-07 16:12:42 +09:00
a41144a00f Improve docs 2021-08-07 15:13:38 +09:00
aa28e8a7a6 Update stream.md 2021-08-07 14:42:51 +09:00
a1a51ce518 Improve docs 2021-08-07 14:05:12 +09:00
90999e0ef9 Improve docs 2021-08-07 13:56:18 +09:00
2ceeb17056 Add doc for admin 2021-08-07 13:41:14 +09:00
18afdd6040 Improve docs 2021-08-07 13:35:18 +09:00
b9972ec6bd 🎨 2021-08-07 13:19:00 +09:00
ebb53e87f3 ハッシュタグ入力エリア
Resolve #7600
2021-08-07 12:47:01 +09:00
9f9d7325fd インスタンス一覧ページ 2021-08-07 10:24:50 +09:00
742a005523 カスタム絵文字一覧ページ 2021-08-07 10:23:59 +09:00
3a28c06534 🎨 2021-08-06 22:47:26 +09:00
46d5711071 🎨 2021-08-06 22:29:19 +09:00
48113f3afd Improve doc 2021-08-06 14:28:40 +09:00
be29972ddf Update doc.vue 2021-08-06 13:55:26 +09:00
49b3a83f76 Improve docs 2021-08-06 11:04:17 +09:00
342794c728 Update mfm.md 2021-08-06 10:49:04 +09:00
3739638c81 Improve docs 2021-08-06 03:28:47 +09:00
401351d9c8 Improve docs 2021-08-06 02:38:45 +09:00
6073a03967 Improve docs 2021-08-06 00:33:25 +09:00
3e3d294188 Improve docs 2021-08-06 00:17:40 +09:00
f6f96ae5bf Imorive client 2021-08-05 22:43:14 +09:00
62ccb53c24 Add rainbow function for MFM 2021-08-05 21:55:41 +09:00
e410e22980 Update misskey.md 2021-08-05 18:46:43 +09:00
fc5ceea335 Improve doc 2021-08-05 18:34:59 +09:00
38af8d4737 Update glossary.md 2021-08-05 16:34:24 +09:00
33b0cab596 refactor 2021-08-05 16:34:18 +09:00
2a47e4a1e1 Update misskey.md 2021-08-05 16:29:34 +09:00
46f53868c5 Improve docs 2021-08-05 16:04:31 +09:00
eac7f11aa7 Update glossary.md 2021-08-05 15:48:12 +09:00
e219188f46 Update misskey.md 2021-08-05 15:38:20 +09:00
3df8c701a7 Improve docs 2021-08-05 15:19:55 +09:00
1186813c75 Update glossary.md 2021-08-05 15:08:10 +09:00
645b6fdc8a Improve docs 2021-08-05 13:58:44 +09:00
ae0596a729 improve docs 2021-08-05 13:43:57 +09:00
bb5fd3c1f2 Update misskey.md 2021-08-05 13:02:44 +09:00
532fa9c5f9 🎨 2021-08-05 12:20:27 +09:00
80a4aa6fa6 Update misskey.md 2021-08-05 12:20:21 +09:00
4f218f544f Update misskey.md 2021-08-05 12:14:14 +09:00
f261f8d7d1 Update misskey.md 2021-08-05 10:45:19 +09:00
e044d11782 Improve docs 2021-08-05 00:15:51 +09:00
d2da459dd8 refactor 2021-08-01 14:45:40 +09:00
b1e6a33d6b tweak style 2021-07-29 23:59:45 +09:00
0d276d0d61 Improve usability 2021-07-29 17:10:16 +09:00
998936651a fix style 2021-07-28 14:46:25 +09:00
1bec25e8e6 パスワードリセットしても新しいパスワードが表示されない問題を修正 2021-07-28 14:45:56 +09:00
f220e4183f 🎨 2021-07-27 21:37:32 +09:00
e965b57dc2 Update PULL_REQUEST_TEMPLATE.md 2021-07-27 00:01:21 +09:00
5e6e1e237a Merge branch 'develop' 2021-07-26 11:15:42 +09:00
41fe364b49 12.84.3 2021-07-26 11:15:33 +09:00
2953ba17c3 ストリーミングが不安定な問題を修正 2021-07-26 11:12:06 +09:00
f3b3e06329 fix email notification bug 2021-07-25 13:28:33 +09:00
98249942d5 fix bug 2021-07-25 13:07:08 +09:00
0fc8445425 🎨 2021-07-25 12:55:17 +09:00
943a1940e2 Merge branch 'develop' 2021-07-23 22:43:47 +09:00
15d166e30e 12.84.2 2021-07-23 22:43:34 +09:00
83619fda98 revert vue to 3.1.x 2021-07-23 22:43:24 +09:00
12913a16fd Merge branch 'develop' 2021-07-23 21:37:09 +09:00
e23ad7833d 12.84.1 2021-07-23 21:36:32 +09:00
38aa760b57 update vue 2021-07-23 21:36:30 +09:00
acb9244205 Merge branch 'develop' 2021-07-20 12:11:07 +09:00
3182606e99 12.84.0 2021-07-20 12:10:49 +09:00
7cc8646ad3 Update vue 2021-07-20 12:10:03 +09:00
e793fced61 New Crowdin updates (#7567)
* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations follow.md (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations follow.md (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations reaction.md (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations mute.md (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations timelines.md (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Chinese Traditional)

* New translations keyboard-shortcut.md (Indonesian)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Indonesian)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (Arabic)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations timelines.md (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations stream.md (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Indonesian)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Arabic)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Esperanto)

* New translations ja-JP.yml (Chinese Simplified)
2021-07-20 12:09:39 +09:00
248edb5dfd 🎨 2021-07-19 23:48:22 +09:00
9414a944b7 Tweak design 2021-07-19 23:31:41 +09:00
756b8a2a29 Make thickness of clock hands configuable 2021-07-19 23:31:27 +09:00
f142ed91fb Implement radio type for form dialog 2021-07-19 23:30:45 +09:00
6aef54a9e0 Improve component stability 2021-07-19 23:30:12 +09:00
f1c9e596e8 アイコンを四角で表示するオプション 2021-07-19 15:11:28 +09:00
862ddde0db Tweak style 2021-07-19 13:04:32 +09:00
ee5a060762 Fix stickyTop calculation 2021-07-19 13:00:29 +09:00
42d293ee60 Classic UI 2021-07-19 11:36:35 +09:00
04e27e160e 認証の修正 (#7597)
* authenticateのキャッシュを廃止

* 凍結ユーザーがサインイン出来てしまうのを修正

* 凍結ユーザーはストリーミング接続出来ないように

* 他人のアクセストークンはrevoke出来ないように, 正常削除を待機するように

* ユーザー/アクセストークンを無効化したらストリーミングを切断するように

* Revert TODO

* ストリーミングterminateは、ユーザー削除後に行うように

* signinでsuspendは別のエラーにする

* トークン再生成後のストリーミング切断は少し待つように

* サスペンド後のストリーミング切断はローカルユーザーのみに
2021-07-18 19:57:53 +09:00
62dede02ea API AuthenticateでDB接続エラーなどが発生するとログアウトさせられてしまうのを修正 Fix #7603 (#7604) 2021-07-18 00:53:16 +09:00
6d1d7b5366 Improve type 2021-07-17 15:43:07 +09:00
55e5c12441 Update deps 2021-07-17 13:43:09 +09:00
0b34503c8a Update check-hit-antenna.ts 2021-07-16 19:43:15 +09:00
dc69490e3a Refactoring 2021-07-15 20:45:32 +09:00
1c241776a6 Improve email notification 2021-07-15 20:35:43 +09:00
6812b895e7 Revert "Resolve #6811"
This reverts commit 558d288e7b.
2021-07-14 00:13:23 +09:00
ab439d0ed6 Clean up 2021-07-14 00:12:34 +09:00
c7a2c368d4 Custom CSS 2021-07-14 00:11:05 +09:00
2047860e71 Use unisonReload 2021-07-13 23:30:36 +09:00
1dbe03b210 refactor 2021-07-13 23:30:20 +09:00
b59a19c144 Fix #7576 2021-07-13 23:30:12 +09:00
558d288e7b Resolve #6811 2021-07-12 02:56:33 +09:00
e24c8b6878 Fix video (#7594) 2021-07-10 23:19:56 +09:00
1772af9583 AP Actorの修正 (#7573)
* AP Actorの修正

* Add ActivityPub test

* Fix person

* Test

* ap test

* Revert "Test"

This reverts commit 3c493eff4e89f94fd33f25189ba3bc96ef4366b3.

* Test comment

* fix

* fix

* Update inbox

* indent

* nl

* indent

* TODO

* Fix inbox

* Update test
2021-07-10 23:14:57 +09:00
cb42f94d9c Rich welcome content (#7588)
* Add rich content (polls, media) to the welcome page notes

* Add a simple scrolling animation to welcome page
2021-07-10 02:55:12 +09:00
38474c7316 mfm.jsが更新されたのでもうこのresolutionsはいらない (#7581) 2021-07-09 01:09:02 +09:00
49febe1764 Resolve #7165 2021-07-09 01:07:55 +09:00
65addc8206 refactoring 2021-07-01 00:50:19 +09:00
28f7e48dc6 improve type 2021-06-30 23:33:50 +09:00
d97fc9ce4e カスタム絵文字インポート時もemojiAddedイベントを発行するように 2021-06-23 13:42:02 +09:00
f26aeee819 Update theme.vue 2021-06-14 22:58:43 +09:00
c071467b6a テストがうごかないのを修正 (#7566)
* startServer

* typeorm 0.2.32

* Fix: chartのテストがテストの並び順によっては正しく初期化されない

* initTestDb
2021-06-12 22:40:17 +09:00
334ca01092 Update resolutions (#7572) 2021-06-12 22:32:44 +09:00
c122ec2e79 Update CONTRIBUTING.md (#7570) 2021-06-11 12:19:48 +09:00
d04014f875 Merge branch 'develop' 2021-06-10 14:03:28 +09:00
e1247b3e45 12.83.0 2021-06-10 14:03:19 +09:00
8b9c445fef New Crowdin updates (#7554)
* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations api.md (Korean)

* New translations mfm.md (Korean)

* New translations api.md (Korean)

* New translations timelines.md (Spanish)

* New translations timelines.md (Spanish)

* New translations timelines.md (Spanish)

* New translations theme.md (Spanish)

* New translations ja-JP.yml (Chinese Simplified)

* New translations theme.md (Spanish)

* New translations theme.md (Spanish)

* New translations theme.md (Spanish)

* New translations theme.md (Spanish)

* New translations theme.md (Spanish)

* New translations theme.md (Spanish)

* New translations stream.md (Spanish)

* New translations stream.md (Spanish)

* New translations stream.md (Spanish)

* New translations stream.md (Spanish)
2021-06-10 14:01:09 +09:00
a65eb502d2 fix api response definition 2021-06-08 14:26:52 +09:00
55c549a9f8 Remove entity descriptions
#6627
2021-06-08 14:24:21 +09:00
56600ba1df refactor type 2021-06-08 14:14:58 +09:00
6b312f755e Remove endpoint descriptions
#6627
2021-06-08 14:09:32 +09:00
d6267f797d 外部リンクアイコンが表示されない問題を修正 2021-06-08 12:19:55 +09:00
a2b8097b4b 歓迎ページでバナー画像が表示されない問題を修正 (#7559)
* 歓迎ページでバナー画像が表示されない問題

* revert

* 背景画像設定オプションを追加
2021-06-08 12:17:17 +09:00
22bbee1fa3 Update deps 2021-06-08 11:40:08 +09:00
fa1b38394c Updated divisions to math.div (#7549)
* Updated divisions to math.div on Reversi (game.board.vue)

* Update src/client/pages/reversi/game.board.vue

Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>

* Oops. Forgot to put it all through parenthesis

* Imported sass:math

* Fixes on drive.vue

* Forgot the stupid comma

Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
2021-06-05 14:57:52 +09:00
441790be2d Fix resync-remote-user (#7556)
* Fix resync-remote-user

* tune
2021-06-05 14:55:41 +09:00
5d66bb8794 ランダムにテストがコケるのを修正 (#7553)
* Test shutdown

* Revert "Test shutdown"

This reverts commit 85182e7dd196cdd9ecb46cfb50adaabd04c5ba60.

* Skip beforeShutdown in test

* Wait shutdown in test

* Revert "Skip beforeShutdown in test"

This reverts commit 79c33ab53615e8fa4820d2abfc2494cba55c441c.

* Revert "Revert "Skip beforeShutdown in test""

This reverts commit 3423133a137c79b64f3ff6ef9dbe433a441a47b0.
2021-06-05 14:54:07 +09:00
a5cdc9a1f4 Add missing migrations (#7552) 2021-06-04 20:40:47 +09:00
a5a2f9d01e Update misskey.js 2021-06-01 19:17:25 +09:00
89fb727f61 Update type.ts 2021-06-01 19:17:17 +09:00
1382 changed files with 41158 additions and 6395 deletions

View File

@ -1,13 +1,32 @@
## Summary <!-- お読みください
PRありがとうございます PRを作成する前に、以下をご確認ください:
可能であればタイトルに、以下で示すようなPRの種類が分かるキーワードをプリフィクスしてください。
fix / refactor / feat / enhance / perf / chore
また、PRの粒度が適切であることを確認してください。ひとつのPRに複数の種類の変更や関心を含めることは避けてください。
このPRによって解決されるIssueがある場合は、そのIssue IDを本文内に記入してください。
CHANGELOG.mdに変更点を追記してください。リファクタリングなど、利用者に影響を与えない変更についてはこの限りではありません。
機能追加やバグ修正をした場合は、可能であればテストケースを追加してください。
ご協力ありがとうございます🤗
-->
<!-- README
Thank you for your PR! Before creating a PR, please check the following:
If possible, prefix the title with a keyword that identifies the type of this PR, as shown below.
fix / refactor / feat / enhance / perf / chore
Also, make sure that the granularity of this PR is appropriate. Please do not include more than one type of change or interest in a single PR.
If there is an issue to be resolved by this PR, please include the Issue ID in the text.
Please add the summary of the changes to CHANGELOG.md. However, this is not necessary for changes that do not affect the users, such as refactoring.
If you have added a feature or fixed a bug, please add a test case if possible.
Thanks for your cooperation 🤗
-->
<!-- # What
- <!-- このPRで何をしたのか どう変わるのか? -->
- * Please describe your changes here * <!-- What did you do with this PR? How will it change things? -->
-
- If you are going to resolve some issue, please add this context. # Why
- Resolve #ISSUE_NUMBER <!-- なぜそうするのか? どういう意図なのか? 何が困っているのか? -->
- <!-- Why do you do it? What are your intentions? What is the problem? -->
- If you are going to fix some bug issue, please add this context.
- Fix #ISSUE_NUMBER # Additional info (optional)
- <!-- テスト観点など -->
--> <!-- Test perspective, etc -->

View File

@ -2,6 +2,6 @@
"extension": ["ts","js","cjs","mjs"], "extension": ["ts","js","cjs","mjs"],
"require": ["ts-node/register", "tsconfig-paths/register"], "require": ["ts-node/register", "tsconfig-paths/register"],
"slow": 1000, "slow": 1000,
"timeout": 30000, "timeout": 35000,
"exit": true "exit": true
} }

View File

@ -28,12 +28,7 @@ If your language is not listed in Crowdin, please open an issue.
![Crowdin](https://d322cqt584bo4o.cloudfront.net/misskey/localized.svg) ![Crowdin](https://d322cqt584bo4o.cloudfront.net/misskey/localized.svg)
## Internationalization (i18n)
Misskey uses the Vue.js plugin [Vue I18n](https://github.com/kazupon/vue-i18n).
Documentation of Vue I18n is available at http://kazupon.github.io/vue-i18n/introduction.html .
## Documentation ## Documentation
* Documents for contributors are located in [`/docs`](/docs).
* Documents for instance admins are located in [`/docs`](/docs). * Documents for instance admins are located in [`/docs`](/docs).
* Documents for end users are located in [`/src/docs`](/src/docs). * Documents for end users are located in [`/src/docs`](/src/docs).
@ -41,8 +36,8 @@ Documentation of Vue I18n is available at http://kazupon.github.io/vue-i18n/intr
* Test codes are located in [`/test`](/test). * Test codes are located in [`/test`](/test).
## Continuous integration ## Continuous integration
Misskey uses CircleCI for executing automated tests. Misskey uses GitHub Actions for executing automated tests.
Configuration files are located in [`/.circleci`](/.circleci). Configuration files are located in [`/.github/workflows`](/.github/workflows).
## Adding MisskeyRoom items ## Adding MisskeyRoom items
* Use English for material, object and texture names. * Use English for material, object and texture names.
@ -247,6 +242,9 @@ npx ts-node ./node_modules/typeorm/cli.js migration:generate -n 変更の名前
作成されたスクリプトは不必要な変更を含むため除去してください。 作成されたスクリプトは不必要な変更を含むため除去してください。
### コネクションには`markRaw`せよ
**Vueのコンポーネントのdataオプションとして**misskey.jsのコネクションを設定するとき、必ず`markRaw`でラップしてください。インスタンスが不必要にリアクティブ化されることで、misskey.js内の処理で不具合が発生するとともに、パフォーマンス上の問題にも繋がる。なお、Composition APIを使う場合はこの限りではない(リアクティブ化はマニュアルなため)。
## その他 ## その他
### HTMLのクラス名で follow という単語は使わない ### HTMLのクラス名で follow という単語は使わない
広告ブロッカーで誤ってブロックされる 広告ブロッカーで誤ってブロックされる

View File

@ -2,6 +2,6 @@ files:
- source: /locales/ja-JP.yml - source: /locales/ja-JP.yml
translation: /locales/%locale%.yml translation: /locales/%locale%.yml
update_option: update_as_unapproved update_option: update_as_unapproved
- source: /src/docs/ja-JP/*.md - source: /src/docs/ja-JP/**/*.md
translation: /src/docs/%locale%/%original_file_name% translation: /src/docs/%locale%/**/%original_file_name%
update_option: update_as_unapproved update_option: update_as_unapproved

View File

@ -385,7 +385,6 @@ updateRemoteUser: "تحديث المعلومات عن المستخدم البع
deleteAllFiles: "حذف كافة الملفات" deleteAllFiles: "حذف كافة الملفات"
userSuspended: "تم تعليق هذا المستخدم." userSuspended: "تم تعليق هذا المستخدم."
userSilenced: "تم إسكات هذا المستخدم." userSilenced: "تم إسكات هذا المستخدم."
sidebar: "الشريط الجانبي"
addItem: "إضافة عنصر" addItem: "إضافة عنصر"
rooms: "الغرفة" rooms: "الغرفة"
relays: "المُرَحلات" relays: "المُرَحلات"
@ -428,8 +427,13 @@ inUse: "مستخدم"
info: "عن" info: "عن"
user: "المستخدمون" user: "المستخدمون"
administration: "إدارة " administration: "إدارة "
postToGallery: "انشر في المعرض"
gallery: "المعرض"
expiration: "ينتهي استطلاع الرأي في" expiration: "ينتهي استطلاع الرأي في"
middle: "متوسط" middle: "متوسط"
global: "الشامل"
_docs:
admin: "إدارة "
_email: _email:
_follow: _follow:
title: "يتابعك" title: "يتابعك"
@ -442,9 +446,7 @@ _reversi:
total: "المجموع" total: "المجموع"
_channel: _channel:
featured: "المتداوَلة" featured: "المتداوَلة"
_sidebar: _menuDisplay:
full: "كامل"
icon: "الصورة الرمزية"
hide: "إخفاء" hide: "إخفاء"
_theme: _theme:
explore: "استكشف قوالب المظهر" explore: "استكشف قوالب المظهر"

View File

@ -111,6 +111,7 @@ editWidgets: "Upravit widget"
editWidgetsExit: "Hotovo" editWidgetsExit: "Hotovo"
customEmojis: "Vlastní emoji" customEmojis: "Vlastní emoji"
emoji: "Emoji" emoji: "Emoji"
emojis: "Emoji"
emojiName: "Jméno emoji" emojiName: "Jméno emoji"
emojiUrl: "URL obrázku" emojiUrl: "URL obrázku"
addEmoji: "Přidat emoji" addEmoji: "Přidat emoji"
@ -390,7 +391,6 @@ script: "Skript"
deleteAllFiles: "Smazat všechny soubory" deleteAllFiles: "Smazat všechny soubory"
deleteAllFilesConfirm: "Jste si jistí že chcete smazat všechny soubory?" deleteAllFilesConfirm: "Jste si jistí že chcete smazat všechny soubory?"
userSuspended: "Tomuto uživateli byl pozastaven účet." userSuspended: "Tomuto uživateli byl pozastaven účet."
sidebar: "Postranní panel"
addItem: "Přidat položku" addItem: "Přidat položku"
rooms: "Místnost" rooms: "Místnost"
inboxUrl: "Inbox URL" inboxUrl: "Inbox URL"
@ -409,8 +409,6 @@ _mfm:
search: "Vyhledávání" search: "Vyhledávání"
_reversi: _reversi:
total: "Celkem" total: "Celkem"
_sidebar:
icon: "Avatar"
_theme: _theme:
keys: keys:
mention: "Zmínění" mention: "Zmínění"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

507
locales/eo-UY.yml Normal file
View File

@ -0,0 +1,507 @@
---
_lang_: "Esperanto"
headlineMisskey: "Reto ligiĝanta per notoj"
introMisskey: "Bonvenon! Misskey (Ĉi-sekve Miskejo) estas malfermitkoda malcentriza mikrobloga servo.\nKreu \"noto\"n por ke kunhavu tion kio nun okazas aŭ ke eksendu tion kio pri vi📡\nFunkcion \"reago\" vi povas uzi kaj aldoni vian reagon pri ciu noto de ĉiu homo👍\nVolu esplori nova mondo🚀"
monthAndDay: "{day}-a/{month}"
search: "Serĉi"
notifications: "Sciigoj"
username: "Uzantnomo"
password: "Pasvorto"
forgotPassword: "Ĉu vi forgesis pasvorton?"
fetchingAsApObject: "Informpetado de Fediverso..."
ok: "Akcepteble"
gotIt: "Mi konprenas!"
cancel: "Nuligi"
enterUsername: "Entajpu uzantnomon"
renotedBy: "Renoton faras {user}"
noNotes: "Neniu noto!"
noNotifications: "Vi ne havas sciigojn."
instance: "Ekzemplo"
settings: "Agordoj"
basicSettings: "Ĝeneralaj agordoj"
otherSettings: "Aliaj agordoj"
openInWindow: "Malfermi en nova fenestro"
profile: "Profilo"
timeline: "Templinio"
noAccountDescription: "Tiu uzanto ne enhavas biografion je la profilo."
login: "Ensaluti"
loggingIn: "Ensalutado..."
logout: "Elsaluti"
signup: "Krei konton"
uploading: "Alŝutado..."
save: "Konservi"
users: "Uzanto"
addUser: "Aldoni uzanton"
favorite: "Preferi"
favorites: "Preferataj"
unfavorite: "Malpreferi"
favorited: "Aldonita al preferatoj"
alreadyFavorited: "Jame aldonita al preferatoj"
cantFavorite: "Ne aldonita al preferatoj"
pin: "Alpingli sur la profilo"
unpin: "Depingli"
copyContent: "Kopii enhavon"
copyLink: "Kopii ligilon"
delete: "Forviŝi"
deleteAndEdit: "Foriginte redakti"
deleteAndEditConfirm: "Ĉu vi certas, ke vi volas forigi la noton kaj redakti ĝin? Ĉiuj reagoj, renotoj, kaj respondoj ankaŭ foriĝos."
addToList: "Aldoni al la listo"
sendMessage: "Sendi mesaĝon"
copyUsername: "Kopii uzantnomon"
searchUser: "Serĉi uzanton"
reply: "Respondi"
loadMore: "Vidu pli"
showMore: "Vidi pli"
youGotNewFollower: "Vin eksekvis"
receiveFollowRequest: "Eksekvopeton riceviĝis."
followRequestAccepted: "La eksekvopeto akceptiĝis."
mention: "Mencioj"
mentions: "Al vi"
importAndExport: "Importaĵo / Eksportaĵo"
import: "Importi"
export: "Eksporti"
files: "Dosieroj"
download: "Elŝuti"
driveFileDeleteConfirm: "Ĉu vi certas ke vi volas forviŝi la dosierujon {name}? Noto aldonita ĝin ankaŭ foriĝos."
unfollowConfirm: "Ĉu vi certas, ke vi volas ne plu sekvi {name}'(o)n?"
lists: "Listoj"
noLists: "Neniu listo"
note: "Elsendi noto"
notes: "Notoj"
following: "Sekvatoj"
followers: "Sekvantoj"
followsYou: "Vin sekvas "
createList: "Kreii liston"
error: "Eraro"
somethingHappened: "Problemo okazis."
retry: "Reprovi"
enterListName: "Entajpu nomon de la listo"
privacy: "Privateco"
follow: "Sekvi"
followRequest: "Peti akcepti de vi eksekvi"
followRequests: "Eksekvopetoj"
unfollow: "Ne plu sekvi"
enterEmoji: "Entajpu emoĵion"
renote: "Fari renoton"
unrenote: "Malfari renoton"
renoted: "Renoton fariĝis."
cantRenote: "Tiu noto ne estas renototebla."
cantReRenote: "Oni ne povas fari renoton kiu enhavas renoto."
quote: "Citi"
pinnedNote: "Pinglita noto"
pinned: "Alpingli sur la profilo"
you: "Vi"
clickToShow: "Klaku por malkaŝu"
sensitive: "Enhavo ne estas deca por laborejo (NSFW)"
add: "Aldoni"
reaction: "Reagoj"
enterFileName: "Entajpu dosiernomon"
mute: "Silentigi"
unmute: "Malsilentigi"
block: "Bloki"
unblock: "Malbloki"
suspend: "Flostigi"
unsuspend: "Fandi"
blockConfirm: "Ĉu vi certas ke vi volas bloki la uzanton?"
unblockConfirm: "Ĉu vi certas ke vi volas malbloki la uzanton?"
suspendConfirm: "Ĉu vi certas ke vi volas frostigi la uzanton?"
unsuspendConfirm: "Ĉu vi certas ke vi volas fandi la uzanton?"
selectList: "Elekti liston"
selectAntenna: "Elekti antenon"
selectWidget: "Elekti enestraĵon"
editWidgets: "Redakti fenestraĵon"
editWidgetsExit: "Fini la redaktadon"
customEmojis: "Personecigitaj emoĵioj"
emoji: "Emoĵio"
emojis: "Emoĵio"
emojiName: "Nomo de emoĵio"
emojiUrl: "URL de la bildo de emoĵio"
addEmoji: "Aldoni emoĵion"
cacheRemoteFiles: "Havi staplon por foraj dosieroj"
flagAsBot: "Tiu uzanto estas roboto"
flagAsCat: "Tiu uzanto estas kato"
addAccount: "Aldoni konton"
showOnRemote: "Vidi sur la fora ekzemplo"
general: "Ĝenerala"
searchWith: "Serĉi: {q}"
youHaveNoLists: "Vi ne havas listojn."
followConfirm: "Ĉu vi certas ke vi volas sekvi {name}'(o)n?"
selectUser: "Elekti uzanton"
annotation: "Komentarioj"
federation: "Fediverso"
instances: "Ekzemplo"
perHour: "Po horo"
perDay: "Po tago"
blockThisInstance: "Bloki tiu ekzemplo"
withNFiles: "{n} dosiero(j)"
disk: "Diskilo"
instanceInfo: "Informo pri la ekzemplo"
clearCachedFiles: "Forviŝi datumon en staplo"
clearCachedFilesConfirm: "Ĉu vi certas, ke vi volas forviŝi ĉiujn transajn dosierojn en la staplo?"
blockedInstances: "Blokataj ekzemploj"
muteAndBlock: "Silentitaj / Blokitaj"
mutedUsers: "Silentigitaj uzantoj"
blockedUsers: "Blokitaj uzantoj"
noUsers: "Sen uzantoj"
editProfile: "Redakti profilon"
noteDeleteConfirm: "Ĉu vi certas ke vi volas forviŝi la noton?"
pinLimitExceeded: "Vi ne plu povas alpingli noton."
noCustomEmojis: "Neniu emoĵio"
federating: "Konfederado"
blocked: "Blokita"
subscribing: "Abonita"
notResponding: "Alvokato ne disponeblas"
instanceFollowing: "Sekvatoj sur la ekzemplo"
instanceFollowers: "Sekvantoj el la ekzemplo"
instanceUsers: "Uzantoj de la ekzemplo"
changePassword: "Ŝanĝi pasvorton"
currentPassword: "Aktuala pasvorto"
newPassword: "Nova pasvorto"
newPasswordRetype: "Reentajpu la novan pasvorton"
attachFile: "Aldoni dosieron"
more: "Plu!"
usernameOrUserId: "Uzantnomo aŭ identigilo de uzanto"
noSuchUser: "Neniuj uzantoj trovitaj."
imageUrl: "URL de bildo"
remove: "Forigi"
removed: "Forviŝis"
removeAreYouSure: "Ĉu vi certas ke vi volas forigi \"{x}\"'(o)n?"
deleteAreYouSure: "Ĉu vi certas ke vi volas forviŝi \"{x}\"'(o)n?"
messaging: "Retbabili"
upload: "Alŝuti"
fromDrive: "De la diskingo en Miskejo"
fromUrl: "De URL"
uploadFromUrl: "Alŝuti de URL"
uploadFromUrlDescription: "URL de la dosiero kiun vi volu alŝuti"
games: "Ludoj sur Miskejo"
messageRead: "Legita"
startMessaging: "Komenci babiladon"
tos: "Kondiĉoj de Uzado"
start: "Komenciĝi"
home: "Hejmo"
remoteUserCaution: "Ĉi tiu Infomoj estas ne tute ekzakta pro distanca uzanto."
images: "Bildoj"
birthday: "Naskiĝtago"
registeredDate: "Registriĝdato"
drive: "Diskingo"
fileName: "Dosiernomo"
selectFile: "Elekti dosieron"
selectFiles: "Elekti dosieron"
renameFile: "Alinomi la dosieron"
folderName: "Nomo de la dosierujo"
renameFolder: "Alinomi la dosierujon"
deleteFolder: "Forviŝi dosierujon"
addFile: "Aldoni dosieron"
emptyDrive: "La diskingo enhavas neniun."
unableToDelete: "Ne forigebla"
inputNewFileName: "Entajpu nova dosiernomon"
inputNewFolderName: "Entajpu nova nomon de la dosierujo"
hasChildFilesOrFolders: "La dosierujo enhavas dosieron kaj ne estas forigebla."
copyUrl: "Kopii URL"
rename: "Alinomi"
avatar: "Ikono"
nsfw: "Enhavo ne estas deca por laborejo (NSFW)"
instanceName: "Nomo de la ekzemplo"
maintainerName: "Nomo de la administranto"
maintainerEmail: "Retpoŝto de la administranto"
tosUrl: "URL de kondiĉoj de uzado"
thisYear: "Ĉi-jare"
thisMonth: "Ĉi-monate"
today: "Hodiaŭ"
dayX: "{day}-a"
monthX: "{month}"
yearX: "La jaro {year}"
connectService: "Konekti"
disconnectService: "Farkonektiĝi"
driveCapacityPerLocalAccount: "Volumo de miskej-diskingo po unu loka uzanto"
driveCapacityPerRemoteAccount: "Volumo de miskej-diskingo po unu transa uzanto"
iconUrl: "URL de la ikono (retpaĝsimbolo, ktp.)"
pinnedUsers: "Alpinglita uzanto"
pinnedNotes: "Pinglita noto"
name: "Nomo"
withFileAntenna: "Nur kun aldonaĵo"
notesAndReplies: "Kun respondoj"
withFiles: "Kun aldonaĵo"
silenceConfirm: "Ĉu vi certas ke vi volas silentigi la uzanton?"
unsilenceConfirm: "Ĉu vi certas, ke vi ne plu volas ke la uzanto silentas?"
popularTags: "Popularaj kradvortoj"
userList: "Listoj"
aboutMisskey: "Pri Miskejo"
securityKeyName: "Nomo de la ŝlosilo"
passwordLessLogin: "Ensaluti sen pasvorto"
resetPassword: "Restarigi pasvorton"
newPasswordIs: "La nova pasvorto estas {password}."
cacheClear: "Forviŝi datumon en stalo"
help: "Manlibro de uzado"
inputMessageHere: "Entajpu masaĝo tie ĉi"
groupName: "Grupa nomo"
messagingWithUser: "Mesaĝado kun uzanto"
messagingWithGroup: "Mesaĝi kun grupo"
noteOf: "Noto de {user}"
noMessagesYet: "Neniu mesaĝo"
newMessageExists: "Vi ricevis novan mesaĝon."
onlyOneFileCanBeAttached: "Vi povas aldoni nur unu dosieron po unu mesaĝo."
uiLanguage: "Lingvo de la interfaco"
tags: "Etikedoj"
createAccount: "Krei konton"
existingAccount: "Ekzista konto"
noFollowRequests: "Vi ne havas eksekvopetojn."
openImageInNewTab: "Fermi la bildo sur nova tablo"
local: "Loka"
remote: "Transa"
accountSettings: "Agordoj de Konto"
numberOfDays: "Nombro de tagoj"
hideThisNote: "Kaŝi tiun noton"
objectStorageBaseUrl: "Baza URL"
deleteAll: "Forviŝi ĉiujn"
showInPage: "Vidi en paĝo"
deleteAllFiles: "Forviŝi ĉiujn dosierojn"
deleteAllFilesConfirm: "Ĉu vi certas, ke vi volas forviŝi ĉiujn viajn dosierojn?"
deletedNote: "Forviŝita noto"
invisibleNote: "Malpublika noto"
poll: "Balotujo"
emailServer: "Retpoŝta servilo"
email: "Retpoŝto"
emailAddress: "Retpoŝta adreso"
smtpUser: "Uzantnomo"
smtpPass: "Pasvorto"
userSaysSomething: "{name} parolis ion"
display: "Vidi"
database: "Datumbazo"
channel: "Kanalo"
fileIdOrUrl: "Dosiera identigilo aŭ URL"
abuseReports: "Signali"
reportAbuse: "Signali"
reportAbuseOf: "Signali {name}'(o)n"
send: "Sendi"
i18nInfo: "Misskey estas tradukata en diversaj lingvoj far volontuloj. Oni povas kontribui por la tradukado sur {link}."
followingCount: "Numero de sekvatoj"
followersCount: "Numero de sekvantoj"
yes: "Jes"
no: "Ne"
driveFilesCount: "Numero de dosieroj en la diskingo"
noteFavoritesCount: "Numero de la preferataj notoj"
makeExplorable: "Igi videbla konto sur la paĝo \"Esplorado\""
showTitlebar: "Montri titolobredon"
clearCache: "Forviŝi datumon en staplo"
onlineUsersCount: "{n} uzanto(j) estas surlinea"
nUsers: "{n} uzanto(j)"
saveAs: "Konservi kiel…"
createdAt: "Kreita je"
updatedAt: "Laste ĝisdatigita"
deleteConfirm: "Ĉu certas forviŝi?"
closeAccount: "Forigi konton"
emailNotification: "Sciigoj per retpoŝto"
publish: "Publikigi"
inChannelSearch: "Serĉi en kanalo"
typingUsers: "{users} estas entajpanta(j)..."
online: "Surkonektita"
offline: "Forkonektita"
instanceBlocking: "Blokado de ekzemplo"
selectAccount: "Elekti konton"
user: "Uzanto"
accounts: "Kontoj"
global: "Konfederacia"
sent: "Sendi"
hashtags: "Kradvorto"
_gallery:
liked: "Ŝatitaj notoj"
_email:
_follow:
title: "Vin eksekvis"
_receiveFollowRequest:
title: "Vi ricevis eksekvopeton."
_aboutMisskey:
about: "Misskey estas malfermitkoda programo evoluigata de syuilo ekde la 2014."
contributors: "Precipaj kontribuantoj"
allContributors: "Ĉiuj kontribuintoj"
source: "Fontkodo"
translation: "Traduki Miskejon"
patrons: "Mecenatoj"
_mfm:
mention: "Mencioj"
hashtag: "Kradvorto"
url: "URL"
blockCode: "Kodo (Ujo)"
blockMath: "Formulo (Ujo)"
quote: "Citi"
emoji: "Personecigitaj emoĵioj"
search: "Serĉi"
_instanceTicker:
none: "Ne montri"
remote: "Montri al transaj uzantoj"
always: "Ĉiam montri"
_channel:
create: "Krei kanalon"
edit: "Redakti kanalon"
following: "Sekvata"
_menuDisplay:
hide: "Kaŝi"
_wordMute:
muteWords: "Silentanta vorto"
mutedNotes: "Silentigataj notoj"
_theme:
keys:
hashtag: "Kradvorto"
mention: "Mencioj"
renote: "Fari renoton"
_sfx:
note: "Nova noto"
noteMy: "Mia noto"
notification: "Sciigoj"
chat: "Retbabilejo"
chatBg: "Retbabilejo (BG)"
antenna: "Ricevo de anteno"
channel: "Sciigoj de kanalo"
_ago:
secondsAgo: "Antaŭ {n} sekundoj"
minutesAgo: "Antaŭ {n} minutoj"
hoursAgo: "Antaŭ {n} horoj"
daysAgo: "Antaŭ {n} tagoj"
weeksAgo: "Antaŭ {n} semajnoj"
monthsAgo: "Antaŭ {n} monatoj"
yearsAgo: "Antaŭ {n} jaroj"
_time:
second: "sek"
minute: "min"
hour: "hor"
day: "Tago"
_tutorial:
title: "Uzado de Misskey"
step1_1: "Bonvenon."
step7_2: "Se vi volus scii pli pri Miskejon, volu rigardi la fako {help}."
_permissions:
"read:blocks": "Vidi la listo de la uzantoj kiun vi blokis."
"write:blocks": "Redakti la liston de la uzantoj kiun vi blokis."
"read:drive": "Ĉia operacio por legi la informon de dosiero en via diskingo de Miskejo"
"write:drive": "Ĉia operacio por skribi, forviŝi, aŭ alimaniere ŝanĝi la informon de dosiero en via diskingo de Miskejo"
"read:favorites": "Vidi la listo de la preferoj"
"read:following": "Vidi tion kion vi sekvas"
"write:following": "Sekvi kaj/aŭ malsekvi alian uzanton"
"read:messaging": "Vidi via retbabilado"
"write:notes": "Krei / Forviŝi noton"
"read:notifications": "Vidi sciigojn"
"read:reactions": "Vidi reagojn"
"read:pages": "Vidi via paĝojn"
"read:page-likes": "Vidi ŝatojn de paĝo"
"read:channels": "Vidi kanalojn"
_antennaSources:
homeTimeline: "Notoj far uzantoj sekvataj de vi"
_weekday:
sunday: "dimanĉo"
monday: "lundo"
tuesday: "mardo"
wednesday: "merkredo"
thursday: "ĵaŭdo"
friday: "vendredo"
saturday: "sabato"
_widgets:
notifications: "Sciigoj"
timeline: "Templinio"
clock: "Horloĝo"
federation: "Fediverso"
onlineUsers: "Surkonektita uzanto"
_cw:
show: "Vidu pli"
files: "{count} dosiero(j)"
_poll:
choiceN: "Balotilo {n}"
noMore: "Oni ne plu povas aldoni."
infinite: "Neniam"
deadlineTime: "hor"
votesCount: "{n} balotiloj"
vote: "Baloti"
closed: "Oni jam balotis ĝin"
_visibility:
publicDescription: "Via noto aperiĝos sur la konfederacia templinio"
home: "Hejmo"
homeDescription: "Elsendi nur sur la hejmtemplinio"
followers: "Sekvantoj"
followersDescription: "Elsendi nur al sekvantoj al mi"
localOnly: "Nur loka"
localOnlyDescription: "Ne montri al transaj uzantoj"
_postForm:
replyPlaceholder: "Respondado al tiu noto..."
quotePlaceholder: "Citado tiun noton..."
channelPlaceholder: "Sendi sur la kanalo"
_profile:
name: "Nomo"
username: "Uzantnomo"
changeAvatar: "Ŝanĝi profilbildon"
_exportOrImport:
followingList: "Sekvataj"
muteList: "Silentigado"
blockingList: "Blokado"
userLists: "Listoj"
_timelines:
home: "Hejmo"
local: "Loka"
social: "Sociala"
global: "Konfederacia"
_rooms:
translate: "Movi"
chooseImage: "Elekti bildon"
_furnitures:
server: "Servilo"
moon: "La luno"
_pages:
deleted: "La paĝo estas forigita."
viewPage: "Vidi via paĝojn"
my: "Miaj paĝoj"
content: "Blokado de paĝo"
url: "URL de paĝo"
chooseBlock: "Aldoni ujon"
blocks:
image: "Bildoj"
_post:
canvasId: "Kanvasa identigilo"
_canvas:
id: "Kanvasa identigilo"
_note:
id: "Identigilo de noto"
_button:
_action:
_pushEvent:
event: "Nomo de la evento"
script:
categories:
list: "Listoj"
blocks:
_join:
arg1: "Listoj"
_randomPick:
arg1: "Listoj"
_dailyRandomPick:
arg1: "Listoj"
_seedRandomPick:
arg2: "Listoj"
pick: "Elekti de la listo"
_pick:
arg1: "Listoj"
_listLen:
arg1: "Listoj"
types:
array: "Listoj"
stringArray: "List de teksto"
_notification:
fileUploaded: "La dosiero sukcese alŝutiĝis."
youGotPoll: "{name} balotis"
youGotMessagingMessageFromUser: "{name} sentis mesaĝon al vi."
youWereFollowed: "Vin eksekvis"
youReceivedFollowRequest: "Vi ricevis eksekvopeton."
yourFollowRequestAccepted: "Via eksekvopeto estas akceptita."
_types:
follow: "Sekvatoj"
mention: "Mencioj"
renote: "Fari renoton"
quote: "Citi"
reaction: "Reagoj"
receiveFollowRequest: "Eksekvopeto ricevita"
followRequestAccepted: "Eksekvopeto akceptiĝis."
_deck:
profile: "Agordaro"
_columns:
notifications: "Sciigoj"
tl: "Templinio"
list: "Listoj"
mentions: "Al vi"

View File

@ -127,6 +127,7 @@ editWidgets: "Editar widgets"
editWidgetsExit: "Terminar edición" editWidgetsExit: "Terminar edición"
customEmojis: "Emojis personalizados" customEmojis: "Emojis personalizados"
emoji: "Emoji" emoji: "Emoji"
emojis: "Emoji"
emojiName: "Nombre del emoji" emojiName: "Nombre del emoji"
emojiUrl: "URL de la imágen del emoji" emojiUrl: "URL de la imágen del emoji"
addEmoji: "Agregar emoji" addEmoji: "Agregar emoji"
@ -523,7 +524,6 @@ removeAllFollowing: "Retener todos los siguientes"
removeAllFollowingDescription: "Cancelar todos los siguientes del servidor {host}. Ejecutar en caso de que esta instancia haya dejado de existir" removeAllFollowingDescription: "Cancelar todos los siguientes del servidor {host}. Ejecutar en caso de que esta instancia haya dejado de existir"
userSuspended: "Este usuario ha sido suspendido." userSuspended: "Este usuario ha sido suspendido."
userSilenced: "Este usuario ha sido silenciado." userSilenced: "Este usuario ha sido silenciado."
sidebar: "Barra lateral"
divider: "Divisor" divider: "Divisor"
addItem: "Agregar elemento" addItem: "Agregar elemento"
rooms: "Cuartos" rooms: "Cuartos"
@ -665,6 +665,11 @@ user: "Usuarios"
administration: "Administrar" administration: "Administrar"
expiration: "Termina el" expiration: "Termina el"
middle: "Mediano" middle: "Mediano"
global: "Global"
sent: "Enviar"
hashtags: "Hashtag"
_docs:
admin: "Administrar"
_ad: _ad:
back: "Deseleccionar" back: "Deseleccionar"
_gallery: _gallery:
@ -744,9 +749,7 @@ _channel:
following: "Siguiendo" following: "Siguiendo"
usersCount: "{n} participantes" usersCount: "{n} participantes"
notesCount: "{n} notas" notesCount: "{n} notas"
_sidebar: _menuDisplay:
full: "Completo"
icon: "Avatar"
hide: "Ocultar" hide: "Ocultar"
_wordMute: _wordMute:
muteWords: "Palabras que silenciar" muteWords: "Palabras que silenciar"

View File

@ -128,6 +128,7 @@ editWidgets: "Modifier les widgets"
editWidgetsExit: "Valider les modifications" editWidgetsExit: "Valider les modifications"
customEmojis: "Émojis personnalisés" customEmojis: "Émojis personnalisés"
emoji: "Émoji" emoji: "Émoji"
emojis: "Émoji"
emojiName: "Nom de lémoji" emojiName: "Nom de lémoji"
emojiUrl: "URL de lémoji" emojiUrl: "URL de lémoji"
addEmoji: "Ajouter un émoji" addEmoji: "Ajouter un émoji"
@ -279,6 +280,7 @@ emptyDrive: "Le Drive est vide"
emptyFolder: "Le dossier est vide" emptyFolder: "Le dossier est vide"
unableToDelete: "Suppression impossible" unableToDelete: "Suppression impossible"
inputNewFileName: "Entrez un nouveau nom de fichier" inputNewFileName: "Entrez un nouveau nom de fichier"
inputNewDescription: "Veuillez entrer une nouvelle description"
inputNewFolderName: "Entrez un nouveau nom de dossier" inputNewFolderName: "Entrez un nouveau nom de dossier"
circularReferenceFolder: "Le dossier de destination est un sous-dossier du dossier que vous souhaitez déplacer." circularReferenceFolder: "Le dossier de destination est un sous-dossier du dossier que vous souhaitez déplacer."
hasChildFilesOrFolders: "Impossible de supprimer ce dossier car il n'est pas vide." hasChildFilesOrFolders: "Impossible de supprimer ce dossier car il n'est pas vide."
@ -310,6 +312,8 @@ monthX: "{month}"
yearX: "{year}" yearX: "{year}"
pages: "Pages" pages: "Pages"
integration: "Intégrations" integration: "Intégrations"
connectService: "Connexion"
disconnectService: "Déconnexion"
enableLocalTimeline: "Activer le fil local" enableLocalTimeline: "Activer le fil local"
enableGlobalTimeline: "Activer le fil global" enableGlobalTimeline: "Activer le fil global"
disablingTimelinesInfo: "Même si vous désactivez ces fils, les administrateur·rice·s et les modérateur·rice·s pourront toujours y accéder." disablingTimelinesInfo: "Même si vous désactivez ces fils, les administrateur·rice·s et les modérateur·rice·s pourront toujours y accéder."
@ -323,6 +327,7 @@ driveCapacityPerRemoteAccount: "Volume du Drive par utilisateur distant"
inMb: "en mégaoctets" inMb: "en mégaoctets"
iconUrl: "URL de l'icône" iconUrl: "URL de l'icône"
bannerUrl: "URL de limage de la bannière" bannerUrl: "URL de limage de la bannière"
backgroundImageUrl: "URL de l'image d'arrière-plan"
basicInfo: "Informations basiques" basicInfo: "Informations basiques"
pinnedUsers: "Utilisateur·rice épinglé·e" pinnedUsers: "Utilisateur·rice épinglé·e"
pinnedUsersDescription: "Listez les utilisateur·rice·s que vous souhaitez voir épinglé·e·s sur la page \"Découvrir\", un·e par ligne." pinnedUsersDescription: "Listez les utilisateur·rice·s que vous souhaitez voir épinglé·e·s sur la page \"Découvrir\", un·e par ligne."
@ -524,7 +529,7 @@ removeAllFollowing: "Retenir tous les abonnements"
removeAllFollowingDescription: "Se désabonner de tous les comptes de {host}. Veuillez lancer cette action uniquement si linstance nexiste plus." removeAllFollowingDescription: "Se désabonner de tous les comptes de {host}. Veuillez lancer cette action uniquement si linstance nexiste plus."
userSuspended: "Cet·te utilisateur·rice a été suspendu·e." userSuspended: "Cet·te utilisateur·rice a été suspendu·e."
userSilenced: "Cette utilisateur·trice a été mis·e en sourdine." userSilenced: "Cette utilisateur·trice a été mis·e en sourdine."
sidebar: "Barre latérale" menu: "Menu"
divider: "Séparateur" divider: "Séparateur"
addItem: "Ajouter un élément" addItem: "Ajouter un élément"
rooms: "Chambre" rooms: "Chambre"
@ -544,6 +549,8 @@ disablePlayer: "Fermer le lecteur vidéo"
expandTweet: "Étendre le tweet" expandTweet: "Étendre le tweet"
themeEditor: "Éditeur de thèmes" themeEditor: "Éditeur de thèmes"
description: "Description" description: "Description"
describeFile: "Ajouter une description d'image"
enterFileDescription: "Saisissez une description"
author: "Auteur·rice" author: "Auteur·rice"
leaveConfirm: "Vous avez des modifications non-sauvegardées. Voulez-vous les ignorer ?" leaveConfirm: "Vous avez des modifications non-sauvegardées. Voulez-vous les ignorer ?"
manage: "Gestion" manage: "Gestion"
@ -755,6 +762,19 @@ middle: "Moyen"
low: "Basse" low: "Basse"
emailNotConfiguredWarning: "Vous n'avez pas configuré d'adresse e-mail." emailNotConfiguredWarning: "Vous n'avez pas configuré d'adresse e-mail."
ratio: "Ratio" ratio: "Ratio"
customCss: "CSS personnalisé"
customCssWarn: "Utilisez cette fonctionnalité uniquement si vous savez exactement ce que vous faites. Une configuration inadaptée peut empêcher le client de s'exécuter normalement."
global: "Global"
squareAvatars: "Avatars carrés"
sent: "Envoyer"
hashtags: "Hashtags"
troubleshooting: "Résolution de problèmes"
_docs:
continueReading: "Lire plus"
features: "Fonctionnalités"
generalTopics: "Sujets généraux"
advancedTopics: "Sujets avancés"
admin: "Gestion"
_ad: _ad:
back: "Retour" back: "Retour"
reduceFrequencyOfThisAd: "Voir cette publicité moins souvent" reduceFrequencyOfThisAd: "Voir cette publicité moins souvent"
@ -853,6 +873,8 @@ _mfm:
blurDescription: "Le contenu peut être flouté ; il sera visible en le survolant avec le curseur." blurDescription: "Le contenu peut être flouté ; il sera visible en le survolant avec le curseur."
font: "Police de caractères" font: "Police de caractères"
fontDescription: "Il est possible de choisir la police." fontDescription: "Il est possible de choisir la police."
rainbow: "Arc-en-ciel"
rainbowDescription: "Permet d'afficher le contenu en couleurs arc-en-ciel."
_reversi: _reversi:
reversi: "Reversi" reversi: "Reversi"
gameSettings: "Réglages de la partie" gameSettings: "Réglages de la partie"
@ -904,9 +926,10 @@ _channel:
following: "Abonné·e" following: "Abonné·e"
usersCount: "{n} Participant·e·s" usersCount: "{n} Participant·e·s"
notesCount: "{n} Notes" notesCount: "{n} Notes"
_sidebar: _menuDisplay:
full: "Complet" sideFull: "Latéral"
icon: "Icônes" sideIcon: "Latéral (icônes)"
top: "Haut de page"
hide: "Masquer" hide: "Masquer"
_wordMute: _wordMute:
muteWords: "Mots à filtrer" muteWords: "Mots à filtrer"
@ -1586,11 +1609,11 @@ _notification:
youWereInvitedToGroup: "Invité·e au groupe" youWereInvitedToGroup: "Invité·e au groupe"
_types: _types:
all: "Toutes" all: "Toutes"
follow: "Abonnements" follow: "Nouvel·le abonné·e"
mention: "Mentions" mention: "Mentions"
reply: "Réponses" reply: "Réponses"
renote: "Partager" renote: "Renotes"
quote: "Citer" quote: "Citations"
reaction: "Réactions" reaction: "Réactions"
pollVote: "Votes dans des sondages" pollVote: "Votes dans des sondages"
receiveFollowRequest: "Demande d'abonnement reçue" receiveFollowRequest: "Demande d'abonnement reçue"

View File

@ -1,10 +1,10 @@
--- ---
_lang_: "Bahasa Indonesia" _lang_: "Bahasa Indonesia"
headlineMisskey: "Jaringan terhubung melalui note" headlineMisskey: "Jaringan terhubung melalui catatan"
introMisskey: "Selamat datang! Misskey adalah perangkat mikroblog tercatu bersifat sumber terbuka.\nMulailah menuliskan catatan, bagikan peristiwa terkini, serta ceritakan segala tentangmu.📡\nTunjukkan juga reaksimu pada catatan pengguna lain.👍\nMari jelajahi dunia baru🚀" introMisskey: "Selamat datang! Misskey adalah perangkat mikroblog tercatu bersifat sumber terbuka.\nMulailah menuliskan catatan, bagikan peristiwa terkini, serta ceritakan segala tentangmu.📡\nTunjukkan juga reaksimu pada catatan pengguna lain.👍\nMari jelajahi dunia baru🚀"
monthAndDay: "{day} {month}" monthAndDay: "{day} {month}"
search: "Pencarian" search: "Penelusuran"
notifications: "Notifikasi" notifications: "Pemberitahuan"
username: "Nama Pengguna" username: "Nama Pengguna"
password: "Kata sandi" password: "Kata sandi"
forgotPassword: "Lupa Kata Sandi" forgotPassword: "Lupa Kata Sandi"
@ -14,8 +14,8 @@ gotIt: "Saya mengerti"
cancel: "Batalkan" cancel: "Batalkan"
enterUsername: "Masukkan nama pengguna" enterUsername: "Masukkan nama pengguna"
renotedBy: "direnote oleh {user}" renotedBy: "direnote oleh {user}"
noNotes: "Tidak ada notes" noNotes: "Tidak ada catatan"
noNotifications: "Tidak ada notifikasi" noNotifications: "Tidak ada pemberitahuan"
instance: "Instansi" instance: "Instansi"
settings: "Pengaturan" settings: "Pengaturan"
basicSettings: "Pengaturan umum" basicSettings: "Pengaturan umum"
@ -52,25 +52,25 @@ searchUser: "Cari pengguna"
reply: "Balas" reply: "Balas"
loadMore: "Selebihnya" loadMore: "Selebihnya"
showMore: "Selebihnya" showMore: "Selebihnya"
youGotNewFollower: "Sedang mengikuti" youGotNewFollower: "Mengikuti kamu"
receiveFollowRequest: "Permintaan mengikuti terkirim" receiveFollowRequest: "Ingin mengikuti kamu"
followRequestAccepted: "Permintaan diikuti telah diterima" followRequestAccepted: "Permintaan mengikuti telah disetujui"
mention: "Sebutan" mention: "Sebut"
mentions: "Sebutan" mentions: "Sebutan"
directNotes: "Note langsung" directNotes: "Catatan langsung"
importAndExport: "Impor & Ekspor" importAndExport: "Impor & Ekspor"
import: "Impor" import: "Impor"
export: "Ekspor" export: "Ekspor"
files: "Berkas" files: "Berkas"
download: "Unduh" download: "Unduh"
driveFileDeleteConfirm: "Hapus {name}? Note dengan berkas terkait juga akan terhapus." driveFileDeleteConfirm: "Hapus {name}? Catatan dengan berkas terkait juga akan terhapus."
unfollowConfirm: "Berhenti mengikuti {name}?" unfollowConfirm: "Berhenti mengikuti {name}?"
exportRequested: "Kamu telah meminta ekspor. Ini akan memakan waktu sesaat. Setelah ekspor selesai, berkas yang dihasilkan akan ditambahkan ke Drive" exportRequested: "Kamu telah meminta ekspor. Ini akan memakan waktu sesaat. Setelah ekspor selesai, berkas yang dihasilkan akan ditambahkan ke Drive"
importRequested: "Kamu telah meminta impor. Ini akan memakan waktu sesaat." importRequested: "Kamu telah meminta impor. Ini akan memakan waktu sesaat."
lists: "Daftar" lists: "Daftar"
noLists: "Kamu tidak memiliki daftar apapun" noLists: "Kamu tidak memiliki daftar apapun"
note: "Catatan" note: "Catat"
notes: "Note" notes: "Catatan"
following: "Ikuti" following: "Ikuti"
followers: "Pengikut" followers: "Pengikut"
followsYou: "Mengikuti kamu" followsYou: "Mengikuti kamu"
@ -83,13 +83,13 @@ pageLoadError: "Gagal memuat halaman."
pageLoadErrorDescription: "Umumnya disebabkan jaringan atau tembolok perambah. Cobalah bersihkan tembolok peramban lalu tunggu sesaat sebelum mencoba kembali." pageLoadErrorDescription: "Umumnya disebabkan jaringan atau tembolok perambah. Cobalah bersihkan tembolok peramban lalu tunggu sesaat sebelum mencoba kembali."
enterListName: "Masukkan nama daftar" enterListName: "Masukkan nama daftar"
privacy: "Privasi" privacy: "Privasi"
makeFollowManuallyApprove: "Permintaan ikuti membutuhkan persetujuan" makeFollowManuallyApprove: "Permintaan mengikuti membutuhkan persetujuan"
defaultNoteVisibility: "Privasi bawaan Note" defaultNoteVisibility: "Privasi bawaan catatan"
follow: "Ikuti" follow: "Ikuti"
followRequest: "Minta ikuti" followRequest: "Permintaan mengikuti"
followRequests: "Permintaan ikuti" followRequests: "Permintaan mengikuti"
unfollow: "Berhenti mengikuti" unfollow: "Berhenti mengikuti"
followRequestPending: "Permintaan ikuti yang menunggu" followRequestPending: "Permintaan mengikuti yang menunggu"
enterEmoji: "Masukkan emoji" enterEmoji: "Masukkan emoji"
renote: "Renote" renote: "Renote"
unrenote: "Hapus renote" unrenote: "Hapus renote"
@ -97,16 +97,16 @@ renoted: "Telah direnote"
cantRenote: "Postingan ini tidak dapat direnote" cantRenote: "Postingan ini tidak dapat direnote"
cantReRenote: "Renote tidak dapat direnote" cantReRenote: "Renote tidak dapat direnote"
quote: "Kutip" quote: "Kutip"
pinnedNote: "Note yang disematkan" pinnedNote: "Catatan yang disematkan"
pinned: "Sematkan ke profil" pinned: "Sematkan ke profil"
you: "Anda" you: "Kamu"
clickToShow: "Klik untuk melihat" clickToShow: "Klik untuk melihat"
sensitive: "Konten sensitif" sensitive: "Konten sensitif"
add: "Tambahkan" add: "Tambahkan"
reaction: "Reaksi" reaction: "Reaksi"
reactionSettingDescription: "Masukkan reaksi favorit yang ingin anda sematkan pada bilah reaksi" reactionSettingDescription: "Masukkan reaksi favorit yang ingin kamu sematkan pada bilah reaksi"
reactionSettingDescription2: "Geser untuk memindah urutkan, klik untuk menghapus, tekan \"+\" untuk menambahkan" reactionSettingDescription2: "Geser untuk memindah urutkan, klik untuk menghapus, tekan \"+\" untuk menambahkan"
rememberNoteVisibility: "Ingat pengaturan visibilitas note" rememberNoteVisibility: "Ingat pengaturan visibilitas catatan"
attachCancel: "Hapus lampiran" attachCancel: "Hapus lampiran"
markAsSensitive: "Tandai sebagai konten sensitif" markAsSensitive: "Tandai sebagai konten sensitif"
unmarkAsSensitive: "Hapus tanda konten sensitif" unmarkAsSensitive: "Hapus tanda konten sensitif"
@ -117,10 +117,10 @@ block: "Blokir"
unblock: "Buka blokir" unblock: "Buka blokir"
suspend: "Bekukan" suspend: "Bekukan"
unsuspend: "Buka pembekuan" unsuspend: "Buka pembekuan"
blockConfirm: "Apakah anda yakin ingin memblokir akun ini?" blockConfirm: "Apakah kamu yakin ingin memblokir akun ini?"
unblockConfirm: "Apakah anda yakin ingin membuka blokir akun ini?" unblockConfirm: "Apakah kamu yakin ingin membuka blokir akun ini?"
suspendConfirm: "Apakah anda yakin ingin membekukan akun ini?" suspendConfirm: "Apakah kamu yakin ingin membekukan akun ini?"
unsuspendConfirm: "Apakah anda yakin ingin membuka pembekuan akun ini?" unsuspendConfirm: "Apakah kamu yakin ingin membuka pembekuan akun ini?"
selectList: "Pilih daftar" selectList: "Pilih daftar"
selectAntenna: "Pilih Antena" selectAntenna: "Pilih Antena"
selectWidget: "Pilih gawit" selectWidget: "Pilih gawit"
@ -128,6 +128,7 @@ editWidgets: "Sunting gawit"
editWidgetsExit: "Selesai" editWidgetsExit: "Selesai"
customEmojis: "Emoji kustom" customEmojis: "Emoji kustom"
emoji: "Emoji" emoji: "Emoji"
emojis: "Emoji"
emojiName: "Nama emoji" emojiName: "Nama emoji"
emojiUrl: "URL Emoji" emojiUrl: "URL Emoji"
addEmoji: "Tambahkan emoji" addEmoji: "Tambahkan emoji"
@ -138,7 +139,7 @@ flagAsBot: "Atur akun ini sebagai Bot"
flagAsBotDescription: "Jika akun ini dikendalikan oleh program, tetapkanlah opsi ini. Jika diaktifkan, ini akan berfungsi sebagai tanda bagi pengembang lain untuk mencegah interaksi berantai dengan bot lain dan menyesuaikan sistem internal Misskey untuk memperlakukan akun ini sebagai bot." flagAsBotDescription: "Jika akun ini dikendalikan oleh program, tetapkanlah opsi ini. Jika diaktifkan, ini akan berfungsi sebagai tanda bagi pengembang lain untuk mencegah interaksi berantai dengan bot lain dan menyesuaikan sistem internal Misskey untuk memperlakukan akun ini sebagai bot."
flagAsCat: "Atur akun ini sebagai kucing" flagAsCat: "Atur akun ini sebagai kucing"
flagAsCatDescription: "Nyalakan tanda ini untuk menandai akun ini sebagai kucing." flagAsCatDescription: "Nyalakan tanda ini untuk menandai akun ini sebagai kucing."
autoAcceptFollowed: "Setujui otomatis permintaan mengikuti dari pengguna yang anda ikuti" autoAcceptFollowed: "Setujui otomatis permintaan mengikuti dari pengguna yang kamu ikuti"
addAccount: "Tambahkan akun" addAccount: "Tambahkan akun"
loginFailed: "Gagal untuk masuk" loginFailed: "Gagal untuk masuk"
showOnRemote: "Lihat profil asli" showOnRemote: "Lihat profil asli"
@ -154,7 +155,7 @@ proxyAccountDescription: "Akun proksi merupakan sebuah akun yang bertindak sebag
host: "Host" host: "Host"
selectUser: "Pilih pengguna" selectUser: "Pilih pengguna"
recipient: "Penerima" recipient: "Penerima"
annotation: "Komentar" annotation: "Keterangan konten"
federation: "Federasi" federation: "Federasi"
instances: "Instansi" instances: "Instansi"
registeredAt: "Terdaftar" registeredAt: "Terdaftar"
@ -226,8 +227,8 @@ announcements: "Pengumuman"
imageUrl: "URL Gambar" imageUrl: "URL Gambar"
remove: "Hapus" remove: "Hapus"
removed: "Telah dihapus" removed: "Telah dihapus"
removeAreYouSure: "Apakah anda yakin ingin menghapus \"{x}\"?" removeAreYouSure: "Apakah kamu yakin ingin menghapus \"{x}\"?"
deleteAreYouSure: "Apakah anda yakin ingin menghapus \"{x}\"?" deleteAreYouSure: "Apakah kamu yakin ingin menghapus \"{x}\"?"
resetAreYouSure: "Yakin mau atur ulang?" resetAreYouSure: "Yakin mau atur ulang?"
saved: "Telah disimpan" saved: "Telah disimpan"
messaging: "Pesan" messaging: "Pesan"
@ -235,7 +236,7 @@ upload: "Unggah"
fromDrive: "Dari Drive" fromDrive: "Dari Drive"
fromUrl: "Dari URL" fromUrl: "Dari URL"
uploadFromUrl: "Unggah dari URL" uploadFromUrl: "Unggah dari URL"
uploadFromUrlDescription: "URL berkas yang ingin anda unggah" uploadFromUrlDescription: "URL berkas yang ingin kamu unggah"
uploadFromUrlRequested: "Pengunggahan telah diminta" uploadFromUrlRequested: "Pengunggahan telah diminta"
uploadFromUrlMayTakeTime: "Membutuhkan beberapa waktu hingga pengunggahan selesai" uploadFromUrlMayTakeTime: "Membutuhkan beberapa waktu hingga pengunggahan selesai"
explore: "Jelajahi" explore: "Jelajahi"
@ -251,7 +252,7 @@ home: "Beranda"
remoteUserCaution: "Informasi ini mungkin tidak mutakhir, karena pengguna ini berasal dari instansi luar." remoteUserCaution: "Informasi ini mungkin tidak mutakhir, karena pengguna ini berasal dari instansi luar."
activity: "Aktivitas" activity: "Aktivitas"
images: "Gambar" images: "Gambar"
birthday: "Hari Lahir" birthday: "Tanggal lahir"
yearsOld: "{age} tahun" yearsOld: "{age} tahun"
registeredDate: "Bergabung pada" registeredDate: "Bergabung pada"
location: "Lokasi" location: "Lokasi"
@ -279,6 +280,7 @@ emptyDrive: "Drive kosong"
emptyFolder: "Folder kosong" emptyFolder: "Folder kosong"
unableToDelete: "Tidak dapat menghapus" unableToDelete: "Tidak dapat menghapus"
inputNewFileName: "Masukkan nama berkas yang baru" inputNewFileName: "Masukkan nama berkas yang baru"
inputNewDescription: "Masukkan keterangan disini"
inputNewFolderName: "Masukkan nama folder yang baru" inputNewFolderName: "Masukkan nama folder yang baru"
circularReferenceFolder: "Folder tujuan adalah subfolder dari folder yang ingin kamu pindahkan." circularReferenceFolder: "Folder tujuan adalah subfolder dari folder yang ingin kamu pindahkan."
hasChildFilesOrFolders: "Karena folder ini tidak kosong, maka tidak dapat dihapus." hasChildFilesOrFolders: "Karena folder ini tidak kosong, maka tidak dapat dihapus."
@ -310,6 +312,8 @@ monthX: "{month}"
yearX: "{year}" yearX: "{year}"
pages: "Halaman" pages: "Halaman"
integration: "Integrasi" integration: "Integrasi"
connectService: "Sambungkan"
disconnectService: "Putuskan"
enableLocalTimeline: "Nyalakan linimasa lokal" enableLocalTimeline: "Nyalakan linimasa lokal"
enableGlobalTimeline: "Nyalakan linimasa global" enableGlobalTimeline: "Nyalakan linimasa global"
disablingTimelinesInfo: "Admin dan Moderator akan selalu memiliki akses ke semua linimasa meskipun linimasa tersebut tidak diaktifkan." disablingTimelinesInfo: "Admin dan Moderator akan selalu memiliki akses ke semua linimasa meskipun linimasa tersebut tidak diaktifkan."
@ -323,13 +327,14 @@ driveCapacityPerRemoteAccount: "Kapasitas drive per pengguna remote"
inMb: "dalam Megabytes" inMb: "dalam Megabytes"
iconUrl: "URL Gambar ikon" iconUrl: "URL Gambar ikon"
bannerUrl: "URL Banner" bannerUrl: "URL Banner"
backgroundImageUrl: "URL Gambar latar"
basicInfo: "Informasi Umum" basicInfo: "Informasi Umum"
pinnedUsers: "Pengguna yang disematkan" pinnedUsers: "Pengguna yang disematkan"
pinnedUsersDescription: "Tuliskan satu nama pengguna dalam satu baris. Pengguna yang dituliskan disini akan disematkan dalam bilah \"Jelajahi\"." pinnedUsersDescription: "Tuliskan satu nama pengguna dalam satu baris. Pengguna yang dituliskan disini akan disematkan dalam bilah \"Jelajahi\"."
pinnedPages: "Halaman yang disematkan" pinnedPages: "Halaman yang disematkan"
pinnedPagesDescription: "Masukkan tautan dari halaman yang kamu ingin sematkan ke halaman utama dari instansi ini, dipisah dengan membuat baris baru." pinnedPagesDescription: "Masukkan tautan dari halaman yang kamu ingin sematkan ke halaman utama dari instansi ini, dipisah dengan membuat baris baru."
pinnedClipId: "ID dari klip yang disematkan" pinnedClipId: "ID dari klip yang disematkan"
pinnedNotes: "Note yang disematkan" pinnedNotes: "Catatan yang disematkan"
hcaptcha: "hCaptcha" hcaptcha: "hCaptcha"
enableHcaptcha: "Nyalakan hCaptcha" enableHcaptcha: "Nyalakan hCaptcha"
hcaptchaSiteKey: "Site Key" hcaptchaSiteKey: "Site Key"
@ -346,14 +351,14 @@ antennaSource: "Sumber Antenna"
antennaKeywords: "Kata kunci yang diterima" antennaKeywords: "Kata kunci yang diterima"
antennaExcludeKeywords: "Kata kunci yang dikecualikan" antennaExcludeKeywords: "Kata kunci yang dikecualikan"
antennaKeywordsDescription: "Pisahkan dengan spasi untuk kondisi AND. Pisahkan dengan baris baru untuk kondisi OR." antennaKeywordsDescription: "Pisahkan dengan spasi untuk kondisi AND. Pisahkan dengan baris baru untuk kondisi OR."
notifyAntenna: "Beritahu untuk note baru" notifyAntenna: "Beritahu untuk catatan baru"
withFileAntenna: "Hanya tampilkan note dengan berkas yang dilampirkan" withFileAntenna: "Hanya tampilkan catatan dengan berkas yang dilampirkan"
enableServiceworker: "Aktifkan ServiceWorker" enableServiceworker: "Aktifkan ServiceWorker"
antennaUsersDescription: "Tuliskan satu nama pengguna per baris" antennaUsersDescription: "Tuliskan satu nama pengguna per baris"
caseSensitive: "Peka huruf besar dan huruf kecil" caseSensitive: "Peka huruf besar dan huruf kecil"
withReplies: "Termasuk balasan" withReplies: "Termasuk balasan"
connectedTo: "Akun yang mengikuti telah terhubung" connectedTo: "Akun yang mengikuti telah terhubung"
notesAndReplies: "Note dan balasan" notesAndReplies: "Catatan dan balasan"
withFiles: "Media" withFiles: "Media"
silence: "Bungkam" silence: "Bungkam"
silenceConfirm: "Apakah kamu yakin ingin membungkam pengguna ini?" silenceConfirm: "Apakah kamu yakin ingin membungkam pengguna ini?"
@ -389,7 +394,7 @@ notFoundDescription: "Tidak ada halaman sesuai dengan URL yang ditentukan."
uploadFolder: "Lokasi unggah folder bawaan" uploadFolder: "Lokasi unggah folder bawaan"
cacheClear: "Bersihkan tembolok" cacheClear: "Bersihkan tembolok"
markAsReadAllNotifications: "Tandai semua pemberitahuan telah dibaca" markAsReadAllNotifications: "Tandai semua pemberitahuan telah dibaca"
markAsReadAllUnreadNotes: "Tandai semua note telah dibaca" markAsReadAllUnreadNotes: "Tandai semua catatan telah dibaca"
markAsReadAllTalkMessages: "Tandai semua pesan telah dibaca" markAsReadAllTalkMessages: "Tandai semua pesan telah dibaca"
help: "Bantuan" help: "Bantuan"
inputMessageHere: "Ketik pesan disini" inputMessageHere: "Ketik pesan disini"
@ -410,9 +415,9 @@ text: "Teks"
enable: "Aktifkan" enable: "Aktifkan"
next: "Selanjutnya" next: "Selanjutnya"
retype: "Masukkan ulang" retype: "Masukkan ulang"
noteOf: "Note milik {user}" noteOf: "Catatan milik {user}"
inviteToGroup: "Undang ke grup" inviteToGroup: "Undang ke grup"
maxNoteTextLength: "Batas karakter dari note" maxNoteTextLength: "Batas karakter catatan"
quoteAttached: "Dikutip" quoteAttached: "Dikutip"
quoteQuestion: "Apakah kamu ingin menambahkan kutipan?" quoteQuestion: "Apakah kamu ingin menambahkan kutipan?"
noMessagesYet: "Tidak ada pesan" noMessagesYet: "Tidak ada pesan"
@ -524,7 +529,7 @@ removeAllFollowing: "Tahan semua mengikuti"
removeAllFollowingDescription: "Batal mengikuti semua akun dari {host}. Mohon jalankan ini ketika instansi sudah tidak ada lagi." removeAllFollowingDescription: "Batal mengikuti semua akun dari {host}. Mohon jalankan ini ketika instansi sudah tidak ada lagi."
userSuspended: "Pengguna ini telah dibekukan." userSuspended: "Pengguna ini telah dibekukan."
userSilenced: "Pengguna ini telah dibungkam." userSilenced: "Pengguna ini telah dibungkam."
sidebar: "Bilah samping" menu: "Menu"
divider: "Pembagi" divider: "Pembagi"
addItem: "Tambahkan item" addItem: "Tambahkan item"
rooms: "Ruang" rooms: "Ruang"
@ -533,8 +538,8 @@ addRelay: "Tambahkan relay"
inboxUrl: "URL Kotak masuk" inboxUrl: "URL Kotak masuk"
addedRelays: "Relay yang ditambahkan" addedRelays: "Relay yang ditambahkan"
serviceworkerInfo: "Harus diaktifkan untuk pemberitahuan push." serviceworkerInfo: "Harus diaktifkan untuk pemberitahuan push."
deletedNote: "Note yang dihapus" deletedNote: "Catatan yang dihapus"
invisibleNote: "Postingan yang disembunyikan" invisibleNote: "Catatan yang disembunyikan"
enableInfiniteScroll: "Aktifkan gulir tak terbatas" enableInfiniteScroll: "Aktifkan gulir tak terbatas"
visibility: "Visibilitas" visibility: "Visibilitas"
poll: "Angket" poll: "Angket"
@ -544,6 +549,8 @@ disablePlayer: "Tutup pemutar video"
expandTweet: "Perluas utas" expandTweet: "Perluas utas"
themeEditor: "Penyunting tema" themeEditor: "Penyunting tema"
description: "Deskripsi" description: "Deskripsi"
describeFile: "Tambahkan keterangan"
enterFileDescription: "Masukkan keterangan"
author: "Pembuat" author: "Pembuat"
leaveConfirm: "Ada perubahan yang belum disimpan. Apakah kamu ingin membuangnya?" leaveConfirm: "Ada perubahan yang belum disimpan. Apakah kamu ingin membuangnya?"
manage: "Manajemen" manage: "Manajemen"
@ -595,7 +602,7 @@ create: "Buat"
notificationSetting: "Pengaturan Pemberitahuan" notificationSetting: "Pengaturan Pemberitahuan"
notificationSettingDesc: "Pilih tipe pemberitahuan untuk ditampilkan" notificationSettingDesc: "Pilih tipe pemberitahuan untuk ditampilkan"
useGlobalSetting: "Gunakan setelan global" useGlobalSetting: "Gunakan setelan global"
useGlobalSettingDesc: "Jika dinyalakan, setelan pemberitahuan akun anda akan digunakan. Jika dimatikan, konfigurasi secara individu dapat dibuat." useGlobalSettingDesc: "Jika dinyalakan, setelan pemberitahuan akun kamu akan digunakan. Jika dimatikan, konfigurasi secara individu dapat dibuat."
other: "Lainnya" other: "Lainnya"
regenerateLoginToken: "Perbarui token login" regenerateLoginToken: "Perbarui token login"
regenerateLoginTokenDescription: "Perbarui token yang digunakan secara internal saat login. Normalnya aksi ini tidak diperlukan. Jika diperbarui, semua perangkat akan dilogout." regenerateLoginTokenDescription: "Perbarui token yang digunakan secara internal saat login. Normalnya aksi ini tidak diperlukan. Jika diperbarui, semua perangkat akan dilogout."
@ -629,7 +636,7 @@ public: "Publik"
i18nInfo: "Misskey diterjemahkan ke dalam banyak bahasa oleh sukarelawan. Kamu dapat ikut membantu di {link}." i18nInfo: "Misskey diterjemahkan ke dalam banyak bahasa oleh sukarelawan. Kamu dapat ikut membantu di {link}."
manageAccessTokens: "Kelola access token" manageAccessTokens: "Kelola access token"
accountInfo: "Informasi akun" accountInfo: "Informasi akun"
notesCount: "Jumlah note" notesCount: "Jumlah catatan"
repliesCount: "Jumlah balasan terkirim" repliesCount: "Jumlah balasan terkirim"
renotesCount: "Jumlah renote terkirim" renotesCount: "Jumlah renote terkirim"
repliedCount: "Jumlah balasan diterima" repliedCount: "Jumlah balasan diterima"
@ -645,15 +652,15 @@ no: "Tidak"
driveFilesCount: "Jumlah berkas drive" driveFilesCount: "Jumlah berkas drive"
driveUsage: "Penggunaan ruang penyimpanan drive" driveUsage: "Penggunaan ruang penyimpanan drive"
noCrawle: "Tolak pengindeksan crawler" noCrawle: "Tolak pengindeksan crawler"
noCrawleDescription: "Meminta mesin pencari untuk tidak mengindeks halaman profil kamu, note, Halaman, dll." noCrawleDescription: "Meminta mesin pencari untuk tidak mengindeks halaman profil kamu, catatan, Halaman, dll."
lockedAccountInfo: "Kecuali kamu menyetel visibilitas note milikmu ke \"Hanya pengikut\", note milikmu akan dapat dilihat oleh siapa saja, bahkan jika kamu memerlukan pengikut untuk disetujui secara manual." lockedAccountInfo: "Kecuali kamu menyetel visibilitas catatan milikmu ke \"Hanya pengikut\", catatan milikmu akan dapat dilihat oleh siapa saja, bahkan jika kamu memerlukan pengikut untuk disetujui secara manual."
alwaysMarkSensitive: "Tandai NSFW sebagai bawaan" alwaysMarkSensitive: "Tandai media dalam catatan sebagai media sensitif"
loadRawImages: "Tampilkan lampiran gambar secara penuh daripada thumbnail" loadRawImages: "Tampilkan lampiran gambar secara penuh daripada thumbnail"
disableShowingAnimatedImages: "Jangan mainkan gambar bergerak" disableShowingAnimatedImages: "Jangan mainkan gambar bergerak"
verificationEmailSent: "Surel verifikasi telah dikirimkan. Mohon akses tautan yang telah disertakan untuk menyelesaikan verifikasi." verificationEmailSent: "Surel verifikasi telah dikirimkan. Mohon akses tautan yang telah disertakan untuk menyelesaikan verifikasi."
notSet: "Tidak disetel" notSet: "Tidak disetel"
emailVerified: "Surel telah diverifikasi" emailVerified: "Surel telah diverifikasi"
noteFavoritesCount: "Jumlah note yang difavoritkan" noteFavoritesCount: "Jumlah catatan yang difavoritkan"
pageLikesCount: "Jumlah suka yang diterima Halaman" pageLikesCount: "Jumlah suka yang diterima Halaman"
pageLikedCount: "Jumlah Halaman yang disukai" pageLikedCount: "Jumlah Halaman yang disukai"
reversiCount: "Jumlah pertandingan Reversi" reversiCount: "Jumlah pertandingan Reversi"
@ -664,7 +671,7 @@ experimentalFeatures: "Fitur eksperimental"
developer: "Pengembang" developer: "Pengembang"
makeExplorable: "Buat akun tampil di \"Jelajahi\"" makeExplorable: "Buat akun tampil di \"Jelajahi\""
makeExplorableDescription: "Jika kamu mematikan ini, akun kamu tidak akan muncul di bagian \"Jelajahi:" makeExplorableDescription: "Jika kamu mematikan ini, akun kamu tidak akan muncul di bagian \"Jelajahi:"
showGapBetweenNotesInTimeline: "Tampilkan jarak diantara postingan pada linimasa" showGapBetweenNotesInTimeline: "Tampilkan jarak diantara catatan pada linimasa"
duplicate: "Duplikat" duplicate: "Duplikat"
left: "Kiri" left: "Kiri"
center: "Tengah" center: "Tengah"
@ -716,8 +723,8 @@ unlikeConfirm: "Yakin ingin hapus sukamu?"
fullView: "Tampilan penuh" fullView: "Tampilan penuh"
quitFullView: "Keluar tampilan penuh" quitFullView: "Keluar tampilan penuh"
addDescription: "Tambahkan deskripsi" addDescription: "Tambahkan deskripsi"
userPagePinTip: "Kamu dapat membuat note untuk ditampilkan disini dengan memilih \"Sematkan ke profil\" dari menu pada note individu." userPagePinTip: "Kamu dapat membuat catatan untuk ditampilkan disini dengan memilih \"Sematkan ke profil\" dari menu pada catatan individu."
notSpecifiedMentionWarning: "Note ini mengandung sebutan dari pengguna yang tidak dimuat sebagai penerima" notSpecifiedMentionWarning: "Catatan ini mengandung sebutan dari pengguna yang tidak dimuat sebagai penerima"
info: "Informasi" info: "Informasi"
userInfo: "Informasi pengguna" userInfo: "Informasi pengguna"
unknown: "Tidak diketahui" unknown: "Tidak diketahui"
@ -745,7 +752,7 @@ postToGallery: "Posting ke galeri"
gallery: "Galeri" gallery: "Galeri"
recentPosts: "Postingan terbaru" recentPosts: "Postingan terbaru"
popularPosts: "Postingan populer" popularPosts: "Postingan populer"
shareWithNote: "Bagikan dengan note" shareWithNote: "Bagikan dengan catatan"
ads: "Iklan" ads: "Iklan"
expiration: "Batas akhir" expiration: "Batas akhir"
memo: "Memo" memo: "Memo"
@ -755,6 +762,14 @@ middle: "Sedang"
low: "Rendah" low: "Rendah"
emailNotConfiguredWarning: "Alamat surel tidak disetel." emailNotConfiguredWarning: "Alamat surel tidak disetel."
ratio: "Rasio" ratio: "Rasio"
customCss: "Custom CSS"
customCssWarn: "Pengaturan ini seharusnya digunakan jika kamu tahu cara kerjanya. Memasukkan nilai yang tidak tepat dapat menyebabkan klien tidak berfungsi semestinya."
global: "Global"
squareAvatars: "Tampilkan avatar sebagai persegi"
sent: "Kirim"
hashtags: "Tagar"
_docs:
admin: "Manajemen"
_ad: _ad:
back: "Kembali" back: "Kembali"
reduceFrequencyOfThisAd: "Tampilkan iklan ini lebih sedikit" reduceFrequencyOfThisAd: "Tampilkan iklan ini lebih sedikit"
@ -769,7 +784,7 @@ _gallery:
unlike: "Hapus suka" unlike: "Hapus suka"
_email: _email:
_follow: _follow:
title: "Sedang mengikuti" title: "Mengikuti kamu"
_receiveFollowRequest: _receiveFollowRequest:
title: "Kamu menerima permintaan mengikuti" title: "Kamu menerima permintaan mengikuti"
_plugin: _plugin:
@ -799,7 +814,7 @@ _mfm:
cheatSheet: "Contekan MFM" cheatSheet: "Contekan MFM"
intro: "MFM adalah Misskey-exclusive Markup Language yang dapat digunakan di banyak tempat. Berikut kamu bisa melihat daftar dari syntax MFM yang ada." intro: "MFM adalah Misskey-exclusive Markup Language yang dapat digunakan di banyak tempat. Berikut kamu bisa melihat daftar dari syntax MFM yang ada."
dummy: "Misskey membentangkan dunia Fediverse" dummy: "Misskey membentangkan dunia Fediverse"
mention: "Sebutan" mention: "Sebut"
mentionDescription: "Kamu dapat menentukan pengguna tertentu dengan menggunakan simbol-At dan nama engguna mereka." mentionDescription: "Kamu dapat menentukan pengguna tertentu dengan menggunakan simbol-At dan nama engguna mereka."
hashtag: "Tagar" hashtag: "Tagar"
hashtagDescription: "Kamu dapat menentukan tagar dengan menggunakan angka dan teks." hashtagDescription: "Kamu dapat menentukan tagar dengan menggunakan angka dan teks."
@ -825,7 +840,7 @@ _mfm:
quoteDescription: "Menampilkan konten sebagai kutipan." quoteDescription: "Menampilkan konten sebagai kutipan."
emoji: "Emoji kustom" emoji: "Emoji kustom"
emojiDescription: "Emoji kustom dapat ditampilkan dengan mengurung nama emoji kustom menggunakan tanda titik dua." emojiDescription: "Emoji kustom dapat ditampilkan dengan mengurung nama emoji kustom menggunakan tanda titik dua."
search: "Pencarian" search: "Penelusuran"
searchDescription: "Menampilkan kotak pencarian dengan teks yang sudah dimasukkan." searchDescription: "Menampilkan kotak pencarian dengan teks yang sudah dimasukkan."
flip: "Balik" flip: "Balik"
flipDescription: "Balikkan konten secara horizontal atau vertikal." flipDescription: "Balikkan konten secara horizontal atau vertikal."
@ -903,20 +918,21 @@ _channel:
owned: "Dimiliki" owned: "Dimiliki"
following: "Mengikuti" following: "Mengikuti"
usersCount: "{n} Partisipan" usersCount: "{n} Partisipan"
notesCount: "{n} Note" notesCount: "terdapat {n} catatan"
_sidebar: _menuDisplay:
full: "Penuh" sideFull: "Horisontal"
icon: "Avatar" sideIcon: "Horisontal (Ikon)"
top: "Atas"
hide: "Sembunyikan" hide: "Sembunyikan"
_wordMute: _wordMute:
muteWords: "Kata yang dibisukan" muteWords: "Kata yang dibisukan"
muteWordsDescription: "Pisahkan dengan spasi untuk kondisi AND. Pisahkan dengan baris baru untuk kondisi OR." muteWordsDescription: "Pisahkan dengan spasi untuk kondisi AND. Pisahkan dengan baris baru untuk kondisi OR."
muteWordsDescription2: "Kurung kata kunci dengan garis miring untuk menggunakan regular expressions." muteWordsDescription2: "Kurung kata kunci dengan garis miring untuk menggunakan regular expressions."
softDescription: "Sembunyikan note yang memenuhi aturan kondisi dari linimasa." softDescription: "Sembunyikan catatan yang memenuhi aturan kondisi dari linimasa."
hardDescription: "Cegah note memenuhi aturan kondisi dari ditambahkan ke linimasa. Dengan tambahan, note berikut tidak akan ditambahkan ke linimasa meskipun jika kondisi tersebut diubah." hardDescription: "Cegah catatan memenuhi aturan kondisi dari ditambahkan ke linimasa. Dengan tambahan, catatan berikut tidak akan ditambahkan ke linimasa meskipun jika kondisi tersebut diubah."
soft: "Lembut" soft: "Lembut"
hard: "Keras" hard: "Keras"
mutedNotes: "Note yang dibisukan" mutedNotes: "Catatan yang dibisukan"
_theme: _theme:
explore: "Jelajahi tema" explore: "Jelajahi tema"
install: "Pasang tema" install: "Pasang tema"
@ -963,7 +979,7 @@ _theme:
navIndicator: "Indikator bilah samping" navIndicator: "Indikator bilah samping"
link: "Tautan" link: "Tautan"
hashtag: "Tagar" hashtag: "Tagar"
mention: "Sebutan" mention: "Sebut"
mentionMe: "Sebutan (saya)" mentionMe: "Sebutan (saya)"
renote: "Renote" renote: "Renote"
modalBg: "Latar belakang modal" modalBg: "Latar belakang modal"
@ -992,9 +1008,9 @@ _theme:
accentLighten: "Aksen (Terang)" accentLighten: "Aksen (Terang)"
fgHighlighted: "Teks yang disorot" fgHighlighted: "Teks yang disorot"
_sfx: _sfx:
note: "Note" note: "Catatan"
noteMy: "Note (Saya)" noteMy: "Catatan (Saya)"
notification: "Notifikasi" notification: "Pemberitahuan"
chat: "Pesan" chat: "Pesan"
chatBg: "Obrolan (Latar Belakang)" chatBg: "Obrolan (Latar Belakang)"
antenna: "Penerimaan Antenna" antenna: "Penerimaan Antenna"
@ -1005,13 +1021,13 @@ _ago:
unknown: "Tidak diketahui" unknown: "Tidak diketahui"
future: "Masa depan" future: "Masa depan"
justNow: "Baru saja" justNow: "Baru saja"
secondsAgo: "{n} detik yang lalu" secondsAgo: "{n} detik lalu"
minutesAgo: "{n} menit yang lalu" minutesAgo: "{n} menit lalu"
hoursAgo: "{n} jam yang lalu" hoursAgo: "{n} jam lalu"
daysAgo: "{n} hari yang lalu" daysAgo: "{n} hari lalu"
weeksAgo: "{n} minggu yang lalu" weeksAgo: "{n} minggu lalu"
monthsAgo: "{n} bulan yang lalu" monthsAgo: "{n} bulan lalu"
yearsAgo: "{n} tahun yang lalu" yearsAgo: "{n} tahun lalu"
_time: _time:
second: "detik" second: "detik"
minute: "menit" minute: "menit"
@ -1020,23 +1036,23 @@ _time:
_tutorial: _tutorial:
title: "Cara menggunakan Misskey" title: "Cara menggunakan Misskey"
step1_1: "Selamat datang!" step1_1: "Selamat datang!"
step1_2: "Halaman ini disebut \"linimasa\". Halaman ini menampilkan \"note\" yang diurutkan secara kronologis dari orang-orang yang kamu \"ikuti\"." step1_2: "Halaman ini disebut \"linimasa\". Halaman ini menampilkan \"catatan\" yang diurutkan secara kronologis dari orang-orang yang kamu \"ikuti\"."
step1_3: "Linimasa kamu kosong, karena kamu belum memposting note apapun atau mengikuti siapapun." step1_3: "Linimasa kamu kosong, karena kamu belum mencatat catatan apapun atau mengikuti siapapun."
step2_1: "Selesaikan menyetel profilmu sebelum menulis sebuah note atau mengikuti seseorang." step2_1: "Selesaikan menyetel profilmu sebelum menulis sebuah catatan atau mengikuti seseorang."
step2_2: "Menyediakan beberapa informasi tentang siapa kamu akan membuat orang lain mudah untuk mengikutimu kembali." step2_2: "Menyediakan beberapa informasi tentang siapa kamu akan membuat orang lain mudah untuk mengikutimu kembali."
step3_1: "Selesai menyetel profil kamu?" step3_1: "Selesai menyetel profil kamu?"
step3_2: "Langkah selanjutnya adalah membuat note. Kamu bisa lakukan ini dengan mengklik ikon pensil pada layar kamu." step3_2: "Langkah selanjutnya adalah membuat catatan. Kamu bisa lakukan ini dengan mengklik ikon pensil pada layar kamu."
step3_3: "Isilah di dalam modal dan tekan tombol pada atas kanan untuk memposting note kamu." step3_3: "Isilah di dalam modal dan tekan tombol pada atas kanan untuk memcatat catatan kamu."
step3_4: "Bingung tidak berpikiran untuk mengatakan sesuatu? Coba saja \"baru aja ikutan bikin akun misskey punyaku\"!" step3_4: "Bingung tidak berpikiran untuk mengatakan sesuatu? Coba saja \"baru aja ikutan bikin akun misskey punyaku\"!"
step4_1: "Selesai memposting note pertamamu?" step4_1: "Selesai mencatat catatan pertamamu?"
step4_2: "Horee! Sekarang note pertamamu sudah ditampilkan di linimasa milikmu." step4_2: "Horee! Sekarang catatan pertamamu sudah ditampilkan di linimasa milikmu."
step5_1: "Sekarang, mari mencoba untuk membuat linimasamu lebih hidup dengan mengikuti orang lain." step5_1: "Sekarang, mari mencoba untuk membuat linimasamu lebih hidup dengan mengikuti orang lain."
step5_2: "{featured} akan memperlihatkan note yang sedang tren saat ini untuk kamu. {explore} akan membantumu untuk mencari pengguna yang sedang tren juga saat ini. Coba ikuti seseorang yang kamu suka!" step5_2: "{featured} akan memperlihatkan catatan yang sedang tren saat ini untuk kamu. {explore} akan membantumu untuk mencari pengguna yang sedang tren juga saat ini. Coba ikuti seseorang yang kamu suka!"
step5_3: "Untuk mengikuti pengguna lain, klik pada ikon mereka dan tekan tombol follow pada profil mereka." step5_3: "Untuk mengikuti pengguna lain, klik pada ikon mereka dan tekan tombol follow pada profil mereka."
step5_4: "Jika pengguna lain memiliki ikon gembok di sebelah nama mereka, maka pengguna rersebut harus menyetujui permintaan mengikuti dari kamu secara manual." step5_4: "Jika pengguna lain memiliki ikon gembok di sebelah nama mereka, maka pengguna rersebut harus menyetujui permintaan mengikuti dari kamu secara manual."
step6_1: "Sekarang kamu dapat melihat note pengguna lain pada linimasamu." step6_1: "Sekarang kamu dapat melihat catatan pengguna lain pada linimasamu."
step6_2: "Kamu juga bisa memberikan \"reaksi\" ke note orang lain untuk merespon dengan cepat." step6_2: "Kamu juga bisa memberikan \"reaksi\" ke catatan orang lain untuk merespon dengan cepat."
step6_3: "Untuk memberikan \"reaksi\", tekan tanda \"+\" pada note pengguna lain dan pilih emoji yang kamu suka untuk memberikan reaksimu kepada mereka." step6_3: "Untuk memberikan \"reaksi\", tekan tanda \"+\" pada catatan pengguna lain dan pilih emoji yang kamu suka untuk memberikan reaksimu kepada mereka."
step7_1: "Yay, Selamat! Kamu sudah menyelesaikan tutorial dasar Misskey." step7_1: "Yay, Selamat! Kamu sudah menyelesaikan tutorial dasar Misskey."
step7_2: "Jika kamu ingin mempelajari lebih lanjut tentang Misskey, cobalah berkunjung ke bagian {help}." step7_2: "Jika kamu ingin mempelajari lebih lanjut tentang Misskey, cobalah berkunjung ke bagian {help}."
step7_3: "Semoga berhasil dan bersenang-senanglah! 🚀" step7_3: "Semoga berhasil dan bersenang-senanglah! 🚀"
@ -1064,7 +1080,7 @@ _permissions:
"write:messaging": "Buat atau hapus obrolan" "write:messaging": "Buat atau hapus obrolan"
"read:mutes": "Lihat daftar orang yang dibisukan" "read:mutes": "Lihat daftar orang yang dibisukan"
"write:mutes": "Sunting daftar orang yang dibisukan" "write:mutes": "Sunting daftar orang yang dibisukan"
"write:notes": "Buat atau hapus note" "write:notes": "Buat atau hapus catatan"
"read:notifications": "Lihat pemberitahuan" "read:notifications": "Lihat pemberitahuan"
"write:notifications": "Sunting pemberitahuan" "write:notifications": "Sunting pemberitahuan"
"read:reactions": "Lihat reaksi" "read:reactions": "Lihat reaksi"
@ -1086,11 +1102,11 @@ _auth:
callback: "Mengembalikan kamu ke aplikasi" callback: "Mengembalikan kamu ke aplikasi"
denied: "Akses ditolak" denied: "Akses ditolak"
_antennaSources: _antennaSources:
all: "Semua note" all: "Semua catatan"
homeTimeline: "Note dari pengguna yang diikuti" homeTimeline: "Catatan dari pengguna yang diikuti"
users: "Note dari pengguna tertentu" users: "Catatan dari pengguna tertentu"
userList: "Note dari daftar tertentu" userList: "Catatan dari daftar tertentu"
userGroup: "Note dari pengguna dalam grup yang ditentukan" userGroup: "Catatan dari pengguna dalam grup yang ditentukan"
_weekday: _weekday:
sunday: "Minggu" sunday: "Minggu"
monday: "Senin" monday: "Senin"
@ -1101,7 +1117,7 @@ _weekday:
saturday: "Sabtu" saturday: "Sabtu"
_widgets: _widgets:
memo: "Catatan memo" memo: "Catatan memo"
notifications: "Notifikasi" notifications: "Pemberitahuan"
timeline: "Linimasa" timeline: "Linimasa"
calendar: "Kalender" calendar: "Kalender"
trends: "Tren" trends: "Tren"
@ -1111,7 +1127,7 @@ _widgets:
photos: "Foto" photos: "Foto"
digitalClock: "Jam digital" digitalClock: "Jam digital"
federation: "Federasi" federation: "Federasi"
postForm: "Buat note" postForm: "Buat catatan"
slideshow: "Slideshow" slideshow: "Slideshow"
button: "Tombol" button: "Tombol"
onlineUsers: "Pengguna online" onlineUsers: "Pengguna online"
@ -1147,18 +1163,18 @@ _poll:
remainingSeconds: "Berakhir dalam {s} detik" remainingSeconds: "Berakhir dalam {s} detik"
_visibility: _visibility:
public: "Publik" public: "Publik"
publicDescription: "Note kamu akan muncul di linimasa global" publicDescription: "Catat ke linimasa global"
home: "Beranda" home: "Beranda"
homeDescription: "Posting hanya ke linimasa beranda saja" homeDescription: "Catat ke linimasa beranda saja"
followers: "Pengikut" followers: "Pengikut"
followersDescription: "Posting hanya ke pengikut saja" followersDescription: "Catat ke pengikut saja"
specified: "Direct" specified: "Langsung"
specifiedDescription: "Posting hanya ke pengguna yang ditentukan saja" specifiedDescription: "Catat ke pengguna yang ditentukan saja"
localOnly: "Hanya lokal" localOnly: "Hanya lokal"
localOnlyDescription: "Tidak dapat dilihat oleh pengguna luar" localOnlyDescription: "Hanya dapat dilihat di instansi lokal"
_postForm: _postForm:
replyPlaceholder: "Balas ke note ini..." replyPlaceholder: "Balas ke catatan ini..."
quotePlaceholder: "Kutip note ini..." quotePlaceholder: "Kutip catatan ini..."
channelPlaceholder: "Posting ke kanal" channelPlaceholder: "Posting ke kanal"
_placeholders: _placeholders:
a: "Sedang apa kamu saat ini?" a: "Sedang apa kamu saat ini?"
@ -1180,7 +1196,7 @@ _profile:
changeAvatar: "Ubah avatar" changeAvatar: "Ubah avatar"
changeBanner: "Ubah header" changeBanner: "Ubah header"
_exportOrImport: _exportOrImport:
allNotes: "Semua note" allNotes: "Semua catatan"
followingList: "Ikuti" followingList: "Ikuti"
muteList: "Bisukan" muteList: "Bisukan"
blockingList: "Blokir" blockingList: "Blokir"
@ -1191,10 +1207,10 @@ _charts:
usersIncDec: "Perbedaan dalam # pengguna" usersIncDec: "Perbedaan dalam # pengguna"
usersTotal: "Jumlah # pengguna" usersTotal: "Jumlah # pengguna"
activeUsers: "Pengguna aktif" activeUsers: "Pengguna aktif"
notesIncDec: "Perbedaan # dalam note" notesIncDec: "Perbedaan # dalam catatan"
localNotesIncDec: "Perbedaan # dalam note lokal" localNotesIncDec: "Perbedaan # dalam catatan lokal"
remoteNotesIncDec: "Perbedaan # dalam note luar" remoteNotesIncDec: "Perbedaan # dalam catatan luar"
notesTotal: "Total # note" notesTotal: "Total # catatan"
filesIncDec: "Perbedaan # dalam berkas" filesIncDec: "Perbedaan # dalam berkas"
filesTotal: "Jumlah # berkas" filesTotal: "Jumlah # berkas"
storageUsageIncDec: "Perbedaan dalam penggunaan penyimpanan" storageUsageIncDec: "Perbedaan dalam penggunaan penyimpanan"
@ -1203,8 +1219,8 @@ _instanceCharts:
requests: "Permintaan" requests: "Permintaan"
users: "Perbedaan dalam # pengguna" users: "Perbedaan dalam # pengguna"
usersTotal: "Jumlah # pengguna kumulatif" usersTotal: "Jumlah # pengguna kumulatif"
notes: "Perbedaan # dalam note" notes: "Perbedaan # dalam catatan"
notesTotal: "Jumlah # note kumulatif" notesTotal: "Jumlah # catatan kumulatif"
ff: "Perbedaan jumlah # dalam pengikut" ff: "Perbedaan jumlah # dalam pengikut"
ffTotal: "Jumlah # pengikut kumulatif" ffTotal: "Jumlah # pengikut kumulatif"
cacheSize: "Perbedaan dalam ukuran tembolok" cacheSize: "Perbedaan dalam ukuran tembolok"
@ -1327,7 +1343,7 @@ _pages:
if: "Jika" if: "Jika"
_if: _if:
variable: "Variabel" variable: "Variabel"
post: "Buat note" post: "Buat catatan"
_post: _post:
text: "Isi" text: "Isi"
attachCanvasImage: "Posting dengan kanvas sebagai gambar" attachCanvasImage: "Posting dengan kanvas sebagai gambar"
@ -1352,10 +1368,10 @@ _pages:
id: "ID Kanvas" id: "ID Kanvas"
width: "Lebar" width: "Lebar"
height: "Tinggi" height: "Tinggi"
note: "Note yang ditanam" note: "Catatan yang ditanam"
_note: _note:
id: "ID Note" id: "ID Catatan"
idDescription: "Kamu dapat menyetel ini dengan menempelkan tautan URL Note." idDescription: "Kamu dapat menyetel ini dengan menempelkan tautan URL Catatan."
detailed: "Tampilan rincian" detailed: "Tampilan rincian"
switch: "Beralih" switch: "Beralih"
_switch: _switch:
@ -1580,14 +1596,14 @@ _notification:
youGotPoll: "{name} memilih di angket kamu" youGotPoll: "{name} memilih di angket kamu"
youGotMessagingMessageFromUser: "{name} mengirimi kamu pesan" youGotMessagingMessageFromUser: "{name} mengirimi kamu pesan"
youGotMessagingMessageFromGroup: "Sebuah pesan telah dikirim ke grup {name}" youGotMessagingMessageFromGroup: "Sebuah pesan telah dikirim ke grup {name}"
youWereFollowed: "Sedang mengikuti" youWereFollowed: "Mengikuti kamu"
youReceivedFollowRequest: "Kamu menerima permintaan mengikuti" youReceivedFollowRequest: "Kamu menerima permintaan mengikuti"
yourFollowRequestAccepted: "Permintaan mengikuti kamu telah diterima" yourFollowRequestAccepted: "Permintaan mengikuti kamu telah diterima"
youWereInvitedToGroup: "Telah diundang ke grup" youWereInvitedToGroup: "Telah diundang ke grup"
_types: _types:
all: "Semua" all: "Semua"
follow: "Ikuti" follow: "Ikuti"
mention: "Sebutan" mention: "Sebut"
reply: "Balasan" reply: "Balasan"
renote: "Renote" renote: "Renote"
quote: "Kutip" quote: "Kutip"
@ -1613,9 +1629,9 @@ _deck:
_columns: _columns:
main: "Utama" main: "Utama"
widgets: "Widget" widgets: "Widget"
notifications: "Notifikasi" notifications: "Pemberitahuan"
tl: "Linimasa" tl: "Linimasa"
antenna: "Antena" antenna: "Antena"
list: "Daftar" list: "Daftar"
mentions: "Sebutan" mentions: "Sebutan"
direct: "Direct" direct: "Langsung"

View File

@ -127,6 +127,7 @@ editWidgets: "Modifica i widget"
editWidgetsExit: "Modifica fine" editWidgetsExit: "Modifica fine"
customEmojis: "Emoji personalizzati" customEmojis: "Emoji personalizzati"
emoji: "Emoji" emoji: "Emoji"
emojis: "Emoji"
emojiName: "Nome dell'emoji" emojiName: "Nome dell'emoji"
emojiUrl: "URL dell'emoji" emojiUrl: "URL dell'emoji"
addEmoji: "Aggiungi un emoji" addEmoji: "Aggiungi un emoji"
@ -274,6 +275,7 @@ emptyDrive: "Il Drive è vuoto"
emptyFolder: "La cartella è vuota" emptyFolder: "La cartella è vuota"
unableToDelete: "Eliminazione impossibile" unableToDelete: "Eliminazione impossibile"
inputNewFileName: "Inserisci nome del nuovo file" inputNewFileName: "Inserisci nome del nuovo file"
inputNewDescription: "Inserisci una nuova descrizione"
inputNewFolderName: "Inserisci nome della nuova cartella" inputNewFolderName: "Inserisci nome della nuova cartella"
circularReferenceFolder: "La cartella di destinazione è una sottocartella della cartella che vuoi spostare." circularReferenceFolder: "La cartella di destinazione è una sottocartella della cartella che vuoi spostare."
hasChildFilesOrFolders: "Impossibile eliminare la cartella perché non è vuota" hasChildFilesOrFolders: "Impossibile eliminare la cartella perché non è vuota"
@ -305,6 +307,8 @@ monthX: "{month}"
yearX: "{year}" yearX: "{year}"
pages: "Pagine" pages: "Pagine"
integration: "App collegate" integration: "App collegate"
connectService: "Connessione"
disconnectService: "Disconnessione "
enableLocalTimeline: "Abilita Timeline locale" enableLocalTimeline: "Abilita Timeline locale"
enableGlobalTimeline: "Abilita Timeline federata" enableGlobalTimeline: "Abilita Timeline federata"
disablingTimelinesInfo: "Anche se disabiliti queste timeline, gli amministratori e i moderatori potranno sempre accederci." disablingTimelinesInfo: "Anche se disabiliti queste timeline, gli amministratori e i moderatori potranno sempre accederci."
@ -511,7 +515,6 @@ removeAllFollowing: "Cancella tutti i follows"
removeAllFollowingDescription: "Cancella tutti i follows del server {host}. Per favore, esegui se, ad esempio, l'istanza non esiste più." removeAllFollowingDescription: "Cancella tutti i follows del server {host}. Per favore, esegui se, ad esempio, l'istanza non esiste più."
userSuspended: "L'utente è sospes@." userSuspended: "L'utente è sospes@."
userSilenced: "L'utente è silenziat@." userSilenced: "L'utente è silenziat@."
sidebar: "Barra laterale"
divider: "Linea di separazione" divider: "Linea di separazione"
addItem: "Aggiungi elemento" addItem: "Aggiungi elemento"
rooms: "Camera" rooms: "Camera"
@ -531,6 +534,8 @@ disablePlayer: "Chiudi lettore video"
expandTweet: "Espandi tweet" expandTweet: "Espandi tweet"
themeEditor: "Editor di temi" themeEditor: "Editor di temi"
description: "Descrizione" description: "Descrizione"
describeFile: "Aggiungi una descrizione d'immagine"
enterFileDescription: "Inserisci descrizione"
author: "Autore" author: "Autore"
leaveConfirm: "Ci sono delle modifiche ancora non salvate. Vuoi cancellarle?" leaveConfirm: "Ci sono delle modifiche ancora non salvate. Vuoi cancellarle?"
manage: "Gestione" manage: "Gestione"
@ -736,6 +741,14 @@ middle: "Media"
low: "Bassa" low: "Bassa"
emailNotConfiguredWarning: "Non hai impostato nessun indirizzo e-mail." emailNotConfiguredWarning: "Non hai impostato nessun indirizzo e-mail."
ratio: "Rapporto" ratio: "Rapporto"
global: "Federata"
sent: "Inviare"
hashtags: "Hashtag"
troubleshooting: "Risoluzione problemi"
_docs:
continueReading: "Leggi di più"
features: "Funzionalità"
admin: "Gestione"
_ad: _ad:
back: "Indietro" back: "Indietro"
reduceFrequencyOfThisAd: "Visualizza questa pubblicità meno spesso" reduceFrequencyOfThisAd: "Visualizza questa pubblicità meno spesso"
@ -794,6 +807,7 @@ _mfm:
blur: "Sfocatura" blur: "Sfocatura"
font: "Tipo di carattere" font: "Tipo di carattere"
fontDescription: "Puoi scegliere il tipo di carattere per il contenuto." fontDescription: "Puoi scegliere il tipo di carattere per il contenuto."
rainbow: "Arcobaleno"
_reversi: _reversi:
reversi: "Reversi" reversi: "Reversi"
gameSettings: "Impostazioni di gioco" gameSettings: "Impostazioni di gioco"
@ -820,9 +834,7 @@ _channel:
following: "Seguiti" following: "Seguiti"
usersCount: "{n} partecipanti" usersCount: "{n} partecipanti"
notesCount: "{n} note" notesCount: "{n} note"
_sidebar: _menuDisplay:
full: "Intera"
icon: "Icone"
hide: "Nascondere" hide: "Nascondere"
_wordMute: _wordMute:
muteWords: "Parole da filtrare" muteWords: "Parole da filtrare"
@ -1383,12 +1395,12 @@ _notification:
youWereInvitedToGroup: "Invitat@ al gruppo" youWereInvitedToGroup: "Invitat@ al gruppo"
_types: _types:
all: "Tutto" all: "Tutto"
follow: "Follows" follow: "Nuovə follower"
mention: "Menzioni" mention: "Menzioni"
reply: "Rispondi" reply: "Risposte"
renote: "Rinota" renote: "Rinota"
quote: "Cita" quote: "Cita"
reaction: "Reazione" reaction: "Reazioni"
pollVote: "Voti ricevuti" pollVote: "Voti ricevuti"
receiveFollowRequest: "Richiesta di follow ricevuta" receiveFollowRequest: "Richiesta di follow ricevuta"
followRequestAccepted: "Richiesta di follow accettata" followRequestAccepted: "Richiesta di follow accettata"

View File

@ -128,6 +128,7 @@ editWidgets: "ウィジェットを編集"
editWidgetsExit: "編集を終了" editWidgetsExit: "編集を終了"
customEmojis: "カスタム絵文字" customEmojis: "カスタム絵文字"
emoji: "絵文字" emoji: "絵文字"
emojis: "絵文字"
emojiName: "絵文字名" emojiName: "絵文字名"
emojiUrl: "絵文字画像URL" emojiUrl: "絵文字画像URL"
addEmoji: "絵文字を追加" addEmoji: "絵文字を追加"
@ -326,6 +327,7 @@ driveCapacityPerRemoteAccount: "リモートユーザーひとりあたりのド
inMb: "メガバイト単位" inMb: "メガバイト単位"
iconUrl: "アイコン画像のURL (faviconなど)" iconUrl: "アイコン画像のURL (faviconなど)"
bannerUrl: "バナー画像のURL" bannerUrl: "バナー画像のURL"
backgroundImageUrl: "背景画像のURL"
basicInfo: "基本情報" basicInfo: "基本情報"
pinnedUsers: "ピン留めユーザー" pinnedUsers: "ピン留めユーザー"
pinnedUsersDescription: "「みつける」ページなどにピン留めしたいユーザーを改行で区切って記述します。" pinnedUsersDescription: "「みつける」ページなどにピン留めしたいユーザーを改行で区切って記述します。"
@ -527,7 +529,7 @@ removeAllFollowing: "フォローを全解除"
removeAllFollowingDescription: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。" removeAllFollowingDescription: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。"
userSuspended: "このユーザーは凍結されています。" userSuspended: "このユーザーは凍結されています。"
userSilenced: "このユーザーはサイレンスされています。" userSilenced: "このユーザーはサイレンスされています。"
sidebar: "サイドバー" menu: "メニュー"
divider: "分割線" divider: "分割線"
addItem: "項目を追加" addItem: "項目を追加"
rooms: "ルーム" rooms: "ルーム"
@ -760,6 +762,22 @@ middle: "中"
low: "低" low: "低"
emailNotConfiguredWarning: "メールアドレスの設定がされていません。" emailNotConfiguredWarning: "メールアドレスの設定がされていません。"
ratio: "比率" ratio: "比率"
customCss: "カスタムCSS"
customCssWarn: "この設定は必ず知識のある方が行ってください。不適切な設定を行うとクライアントが正常に使用できなくなる恐れがあります。"
global: "グローバル"
squareAvatars: "アイコンを四角形で表示"
sent: "送信"
received: "受信"
searchResult: "検索結果"
hashtags: "ハッシュタグ"
troubleshooting: "トラブルシューティング"
_docs:
continueReading: "続きを読む"
features: "機能"
generalTopics: "一般的なトピック"
advancedTopics: "高度なトピック"
admin: "管理"
_ad: _ad:
back: "戻る" back: "戻る"
@ -867,6 +885,8 @@ _mfm:
blurDescription: "内容をぼかすことができます。ポインターを上に乗せるとはっきり見えるようになります。" blurDescription: "内容をぼかすことができます。ポインターを上に乗せるとはっきり見えるようになります。"
font: "フォント" font: "フォント"
fontDescription: "内容のフォントを指定することができます。" fontDescription: "内容のフォントを指定することができます。"
rainbow: "レインボー"
rainbowDescription: "内容をレインボーにします。"
_reversi: _reversi:
reversi: "リバーシ" reversi: "リバーシ"
@ -923,9 +943,10 @@ _channel:
usersCount: "{n}人が参加中" usersCount: "{n}人が参加中"
notesCount: "{n}投稿があります" notesCount: "{n}投稿があります"
_sidebar: _menuDisplay:
full: "フル" sideFull: ""
icon: "アイコン" sideIcon: "横(アイコン)"
top: "上部"
hide: "隠す" hide: "隠す"
_wordMute: _wordMute:

View File

@ -127,6 +127,7 @@ editWidgets: "ウィジェットをいじる"
editWidgetsExit: "編集終ったで" editWidgetsExit: "編集終ったで"
customEmojis: "カスタム絵文字" customEmojis: "カスタム絵文字"
emoji: "絵文字" emoji: "絵文字"
emojis: "絵文字"
emojiName: "絵文字名" emojiName: "絵文字名"
emojiUrl: "絵文字画像URL" emojiUrl: "絵文字画像URL"
addEmoji: "絵文字を追加" addEmoji: "絵文字を追加"
@ -511,7 +512,6 @@ removeAllFollowing: "フォローを全解除"
removeAllFollowingDescription: "{host}からのフォローをすべて解除するで。そのインスタンスが消えて無くなった時とかには便利な機能やで。" removeAllFollowingDescription: "{host}からのフォローをすべて解除するで。そのインスタンスが消えて無くなった時とかには便利な機能やで。"
userSuspended: "このユーザーは...凍結されとる。" userSuspended: "このユーザーは...凍結されとる。"
userSilenced: "このユーザーは...サイレンスされとる。" userSilenced: "このユーザーは...サイレンスされとる。"
sidebar: "サイドバー"
divider: "分割線" divider: "分割線"
rooms: "ルーム" rooms: "ルーム"
relays: "リレー" relays: "リレー"
@ -647,6 +647,11 @@ memo: "メモ"
high: "高い" high: "高い"
middle: "中" middle: "中"
low: "低い" low: "低い"
global: "グローバル"
sent: "送信"
hashtags: "ハッシュタグ"
_docs:
admin: "管理"
_ad: _ad:
back: "戻る" back: "戻る"
_gallery: _gallery:
@ -731,9 +736,7 @@ _channel:
removeBanner: "バナーを削除" removeBanner: "バナーを削除"
featured: "トレンド" featured: "トレンド"
notesCount: "{n}こ投稿があるで" notesCount: "{n}こ投稿があるで"
_sidebar: _menuDisplay:
full: "フル"
icon: "アイコン"
hide: "隠す" hide: "隠す"
_wordMute: _wordMute:
soft: "ソフト" soft: "ソフト"

1
locales/jbo-EN.yml Normal file
View File

@ -0,0 +1 @@
---

View File

@ -7,7 +7,9 @@ username: "Isem n umseqdac"
password: "Awal uffir" password: "Awal uffir"
ok: "IH" ok: "IH"
settings: "Iɣewwaṛen" settings: "Iɣewwaṛen"
otherSettings: "Iɣewwaren nniḍen"
profile: "Amaɣnu" profile: "Amaɣnu"
signup: "Jerred"
save: "Sekles" save: "Sekles"
delete: "Kkes" delete: "Kkes"
addToList: "Rnu ɣer tebdart" addToList: "Rnu ɣer tebdart"
@ -27,15 +29,31 @@ followers: "Imeḍfaṛen"
followsYou: "Yeṭṭafaṛ-ik·em-id" followsYou: "Yeṭṭafaṛ-ik·em-id"
createList: "Snulfu-d tabdart" createList: "Snulfu-d tabdart"
enterListName: "Isem n tebdart" enterListName: "Isem n tebdart"
privacy: "Tabaḍnit"
follow: "Ḍfeṛ" follow: "Ḍfeṛ"
you: "Kečči·mmi" you: "Kečči·mmi"
selectList: "Fren tabdart" selectList: "Fren tabdart"
youHaveNoLists: "Ulac ɣur-k·m ula d yiwet n tabdart" youHaveNoLists: "Ulac ɣur-k·m ula d yiwet n tabdart"
security: "Taɣellist"
remove: "Kkes" remove: "Kkes"
userList: "Tibdarin" userList: "Tibdarin"
securityKey: "Tasarutt n tɣellist"
securityKeyName: "Isem n tsarutt"
signinRequired: "Ttxil jerred"
signinWith: "Tuqqna s {x}"
tapSecurityKey: "Sekcem tasarutt-ik·im n tɣellist"
uiLanguage: "Tutlayt n wegrudem" uiLanguage: "Tutlayt n wegrudem"
accountSettings: "Iɣewwaṛen n umiḍan"
plugins: "Izegrar"
email: "Imayl"
emailAddress: "Tansa imayl"
smtpUser: "Isem n umseqdac" smtpUser: "Isem n umseqdac"
smtpPass: "Awal uffir" smtpPass: "Awal uffir"
other: "Wiyyaḍ"
accountInfo: "Talɣut n umiḍan"
emailNotification: "Ilɣa imayl"
selectAccount: "Fren amiḍan"
accounts: "Imiḍan"
_email: _email:
_follow: _follow:
title: "Yeṭṭafaṛ-ik·em-id" title: "Yeṭṭafaṛ-ik·em-id"
@ -48,6 +66,8 @@ _theme:
mention: "Bder" mention: "Bder"
_sfx: _sfx:
notification: "Ilɣuyen" notification: "Ilɣuyen"
_permissions:
"write:account": "Ẓreg talɣut n umiḍan-ik·im"
_widgets: _widgets:
notifications: "Ilɣuyen" notifications: "Ilɣuyen"
_cw: _cw:

View File

@ -128,6 +128,7 @@ editWidgets: "위젯 편집"
editWidgetsExit: "편집 종료" editWidgetsExit: "편집 종료"
customEmojis: "커스텀 이모지" customEmojis: "커스텀 이모지"
emoji: "이모지" emoji: "이모지"
emojis: "이모지"
emojiName: "이모지 이름" emojiName: "이모지 이름"
emojiUrl: "이모지 URL" emojiUrl: "이모지 URL"
addEmoji: "이모지 추가" addEmoji: "이모지 추가"
@ -326,6 +327,7 @@ driveCapacityPerRemoteAccount: "리모트 유저 한 명당 드라이브 용량"
inMb: "메가바이트 단위" inMb: "메가바이트 단위"
iconUrl: "아이콘 URL" iconUrl: "아이콘 URL"
bannerUrl: "배너 이미지 URL" bannerUrl: "배너 이미지 URL"
backgroundImageUrl: "배경 이미지 URL"
basicInfo: "기본 정보" basicInfo: "기본 정보"
pinnedUsers: "고정된 유저" pinnedUsers: "고정된 유저"
pinnedUsersDescription: "\"발견하기\" 페이지 등에 고정하고 싶은 유저를 한 줄에 한 명씩 적습니다." pinnedUsersDescription: "\"발견하기\" 페이지 등에 고정하고 싶은 유저를 한 줄에 한 명씩 적습니다."
@ -527,7 +529,7 @@ removeAllFollowing: "모든 팔로잉 해제"
removeAllFollowingDescription: "{host}(으)로부터 모든 팔로잉을 해제합니다. 해당 인스턴스가 더 이상 존재하지 않게 된 경우 등에 실행해 주세요." removeAllFollowingDescription: "{host}(으)로부터 모든 팔로잉을 해제합니다. 해당 인스턴스가 더 이상 존재하지 않게 된 경우 등에 실행해 주세요."
userSuspended: "이 계정은 정지된 상태입니다." userSuspended: "이 계정은 정지된 상태입니다."
userSilenced: "이 계정은 사일런스된 상태입니다." userSilenced: "이 계정은 사일런스된 상태입니다."
sidebar: "사이드바" menu: "메뉴"
divider: "구분선" divider: "구분선"
addItem: "항목 추가" addItem: "항목 추가"
rooms: "방" rooms: "방"
@ -760,6 +762,21 @@ middle: "보통"
low: "낮음" low: "낮음"
emailNotConfiguredWarning: "메일 주소가 설정되어 있지 않습니다." emailNotConfiguredWarning: "메일 주소가 설정되어 있지 않습니다."
ratio: "비율" ratio: "비율"
customCss: "CSS 사용자화"
customCssWarn: "이 설정은 기능을 알고 있는 경우에만 사용해야 합니다. 잘못된 값을 입력하면 클라이언트가 정상적으로 작동하지 않을 수 있습니다."
global: "글로벌"
squareAvatars: "프로필 아이콘을 사각형으로 표시"
sent: "전송"
received: "수신"
searchResult: "검색 결과"
hashtags: "해시태그"
troubleshooting: "트러블 슈팅"
_docs:
continueReading: "계속 읽기"
features: "기능"
generalTopics: "일반 주제"
advancedTopics: "심화 주제"
admin: "관리"
_ad: _ad:
back: "뒤로" back: "뒤로"
reduceFrequencyOfThisAd: "이 광고의 표시 빈도 낮추기" reduceFrequencyOfThisAd: "이 광고의 표시 빈도 낮추기"
@ -858,6 +875,8 @@ _mfm:
blurDescription: "내용이 흐리게 보입니다. 마우스를 위에 올려두면 내용이 보입니다." blurDescription: "내용이 흐리게 보입니다. 마우스를 위에 올려두면 내용이 보입니다."
font: "폰트" font: "폰트"
fontDescription: "내용의 글꼴을 지정할 수 있습니다." fontDescription: "내용의 글꼴을 지정할 수 있습니다."
rainbow: "무지개"
rainbowDescription: "내용을 무지개로 표시합니다."
_reversi: _reversi:
reversi: "리버시" reversi: "리버시"
gameSettings: "대국 설정" gameSettings: "대국 설정"
@ -909,9 +928,10 @@ _channel:
following: "팔로잉" following: "팔로잉"
usersCount: "{n}명 참여 중" usersCount: "{n}명 참여 중"
notesCount: "{n}노트" notesCount: "{n}노트"
_sidebar: _menuDisplay:
full: "전체" sideFull: "가로"
icon: "아이콘" sideIcon: "가로(아이콘)"
top: "상단"
hide: "숨기기" hide: "숨기기"
_wordMute: _wordMute:
muteWords: "뮤트할 단어" muteWords: "뮤트할 단어"

View File

@ -128,6 +128,7 @@ editWidgets: "Edytuj widżet"
editWidgetsExit: "Gotowe" editWidgetsExit: "Gotowe"
customEmojis: "Niestandardowe emoji" customEmojis: "Niestandardowe emoji"
emoji: "Emoji" emoji: "Emoji"
emojis: "Emoji"
emojiName: "Nazwa emoji" emojiName: "Nazwa emoji"
emojiUrl: "Adres URL emoji" emojiUrl: "Adres URL emoji"
addEmoji: "Dodaj emoji" addEmoji: "Dodaj emoji"
@ -513,7 +514,6 @@ deleteAllFilesConfirm: "Czy na pewno chcesz usunąć wszystkie pliki?"
removeAllFollowingDescription: "Przestań obserwować wszystkie konta z {host}. Wykonaj to, jeżeli instancja już nie istnieje." removeAllFollowingDescription: "Przestań obserwować wszystkie konta z {host}. Wykonaj to, jeżeli instancja już nie istnieje."
userSuspended: "To konto zostało zawieszone." userSuspended: "To konto zostało zawieszone."
userSilenced: "Ten użytkownik został wyciszony." userSilenced: "Ten użytkownik został wyciszony."
sidebar: "Pasek boczny"
divider: "Rozdzielacz" divider: "Rozdzielacz"
addItem: "Dodaj element" addItem: "Dodaj element"
rooms: "Pokój" rooms: "Pokój"
@ -735,6 +735,11 @@ middle: "Średnie"
low: "Niski" low: "Niski"
emailNotConfiguredWarning: "Nie podano adresu e-mail" emailNotConfiguredWarning: "Nie podano adresu e-mail"
ratio: "Stosunek" ratio: "Stosunek"
global: "Globalna"
sent: "Wyślij"
hashtags: "Hashtag"
_docs:
admin: "Zarządzanie"
_ad: _ad:
back: "Wróć" back: "Wróć"
reduceFrequencyOfThisAd: "Pokazuj tę reklamę rzadziej" reduceFrequencyOfThisAd: "Pokazuj tę reklamę rzadziej"
@ -858,9 +863,7 @@ _channel:
following: "Śledzeni" following: "Śledzeni"
usersCount: "{n} uczestnicy" usersCount: "{n} uczestnicy"
notesCount: "{n} wpisy" notesCount: "{n} wpisy"
_sidebar: _menuDisplay:
full: "Pełne"
icon: "Awatar"
hide: "Ukryj" hide: "Ukryj"
_wordMute: _wordMute:
muteWords: "Słowo do wyciszenia" muteWords: "Słowo do wyciszenia"

View File

@ -6,25 +6,72 @@ notifications: "Notificações"
username: "Nome de usuário" username: "Nome de usuário"
password: "Senha" password: "Senha"
ok: "OK" ok: "OK"
gotIt: "Entendi"
cancel: "Cancelar" cancel: "Cancelar"
enterUsername: "Digite o nome de usuário" enterUsername: "Digite o nome de usuário"
renotedBy: "Repostado por {user}" renotedBy: "Repostado por {user}"
noNotes: "Sem posts"
settings: "Configurações" settings: "Configurações"
basicSettings: "Configurações básicas" basicSettings: "Configurações básicas"
otherSettings: "Outras configurações" otherSettings: "Outras configurações"
profile: "Perfil" profile: "Perfil"
timeline: "Timeline" timeline: "Timeline"
logout: "Sair"
users: "Usuários"
favorite: "Favoritar"
favorites: "Favoritar"
showMore: "Ver mais"
youGotNewFollower: "Você tem um novo seguidor"
followRequestAccepted: "Pedido de seguir aceito"
note: "Post"
notes: "Posts"
enterEmoji: "Inserir emoji"
renote: "Repostar"
renoted: "Repostado"
cantRenote: "Não pode repostar"
cantReRenote: "Não pode repostar este repost"
pinnedNote: "Post fixado"
sensitive: "Conteúdo sensível"
mute: "Silenciar"
unmute: "Dessilenciar"
settingGuide: "Guia de configuração"
instances: "Instância"
registeredAt: "Registrado em"
perHour: "por hora"
perDay: "por dia"
noUsers: "Sem usuários"
messageRead: "Lida"
lightThemes: "Tema claro"
darkThemes: "Tema escuro"
addFile: "Adicionar arquivo"
nsfw: "Conteúdo sensível"
monthX: "mês de {month}"
pinnedNotes: "Post fixado"
smtpUser: "Nome de usuário" smtpUser: "Nome de usuário"
smtpPass: "Senha" smtpPass: "Senha"
user: "Usuários"
_email:
_follow:
title: "Você tem um novo seguidor"
_mfm: _mfm:
search: "Pesquisar" search: "Pesquisar"
_theme:
keys:
renote: "Repostar"
_sfx: _sfx:
note: "Posts"
notification: "Notificações" notification: "Notificações"
_widgets: _widgets:
notifications: "Notificações" notifications: "Notificações"
timeline: "Timeline" timeline: "Timeline"
_profile: _profile:
username: "Nome de usuário" username: "Nome de usuário"
_exportOrImport:
muteList: "Silenciar"
_notification:
youWereFollowed: "Você tem um novo seguidor"
_types:
renote: "Repostar"
_deck: _deck:
_columns: _columns:
notifications: "Notificações" notifications: "Notificações"

View File

@ -7,6 +7,7 @@ search: "Поиск"
notifications: "Уведомления" notifications: "Уведомления"
username: "Имя пользователя" username: "Имя пользователя"
password: "Пароль" password: "Пароль"
forgotPassword: "Пароль забыт"
fetchingAsApObject: "Приём с других сайтов" fetchingAsApObject: "Приём с других сайтов"
ok: "Окей" ok: "Окей"
gotIt: "Ясно!" gotIt: "Ясно!"
@ -127,6 +128,7 @@ editWidgets: "Редактировать виджеты"
editWidgetsExit: "Готово" editWidgetsExit: "Готово"
customEmojis: "Эмодзи пользователя" customEmojis: "Эмодзи пользователя"
emoji: "Эмодзи" emoji: "Эмодзи"
emojis: "Эмодзи"
emojiName: "Название эмодзи" emojiName: "Название эмодзи"
emojiUrl: "URL эмодзи" emojiUrl: "URL эмодзи"
addEmoji: "Добавить эмодзи" addEmoji: "Добавить эмодзи"
@ -278,6 +280,7 @@ emptyDrive: "Диск пуст"
emptyFolder: "Папка пуста" emptyFolder: "Папка пуста"
unableToDelete: "Удаление невозможно" unableToDelete: "Удаление невозможно"
inputNewFileName: "Введите имя нового файла" inputNewFileName: "Введите имя нового файла"
inputNewDescription: "Введите новую подпись"
inputNewFolderName: "Пожалуйста, введите новое имя папки!" inputNewFolderName: "Пожалуйста, введите новое имя папки!"
circularReferenceFolder: "Вы пытаетесь переместить папку внутрь себя." circularReferenceFolder: "Вы пытаетесь переместить папку внутрь себя."
hasChildFilesOrFolders: "Эта папка не пуста и не может быть удалена." hasChildFilesOrFolders: "Эта папка не пуста и не может быть удалена."
@ -309,6 +312,8 @@ monthX: "{month} месяц"
yearX: "{year} год" yearX: "{year} год"
pages: "Страницы" pages: "Страницы"
integration: "Интеграция" integration: "Интеграция"
connectService: "Подключиться"
disconnectService: "Отключиться"
enableLocalTimeline: "Включить локальную ленту" enableLocalTimeline: "Включить локальную ленту"
enableGlobalTimeline: "Включить глобальную ленту" enableGlobalTimeline: "Включить глобальную ленту"
disablingTimelinesInfo: "У администраторов и модераторов есть доступ ко всем лентам, даже если они отключены." disablingTimelinesInfo: "У администраторов и модераторов есть доступ ко всем лентам, даже если они отключены."
@ -322,6 +327,7 @@ driveCapacityPerRemoteAccount: "Объём диска на одного поль
inMb: "В мегабайтах" inMb: "В мегабайтах"
iconUrl: "Ссылка на аватар" iconUrl: "Ссылка на аватар"
bannerUrl: "Ссылка на изображение в шапке" bannerUrl: "Ссылка на изображение в шапке"
backgroundImageUrl: "Ссылка на фоновое изображение"
basicInfo: "Общая информация" basicInfo: "Общая информация"
pinnedUsers: "Прикреплённый пользователь" pinnedUsers: "Прикреплённый пользователь"
pinnedUsersDescription: "Перечислите по одному имени пользователя в строке. Пользователи, перечисленные здесь, будут привязаны к закладке \"Изучение\"." pinnedUsersDescription: "Перечислите по одному имени пользователя в строке. Пользователи, перечисленные здесь, будут привязаны к закладке \"Изучение\"."
@ -523,7 +529,6 @@ removeAllFollowing: "Удалить всех подписчиков"
removeAllFollowingDescription: "Отменить все подписки с домена {host}? Пожалуйста, применяйте это действие, если инстанс больше не существует." removeAllFollowingDescription: "Отменить все подписки с домена {host}? Пожалуйста, применяйте это действие, если инстанс больше не существует."
userSuspended: "Эта учётная запись заморожена" userSuspended: "Эта учётная запись заморожена"
userSilenced: "Этот пользователь был заглушен" userSilenced: "Этот пользователь был заглушен"
sidebar: "Боковая панель"
divider: "Линия-разделитель" divider: "Линия-разделитель"
addItem: "Добавить элемент" addItem: "Добавить элемент"
rooms: "Комната" rooms: "Комната"
@ -543,6 +548,8 @@ disablePlayer: "Выключить проигрыватель"
expandTweet: "Развернуть твит" expandTweet: "Развернуть твит"
themeEditor: "Редактор темы оформления" themeEditor: "Редактор темы оформления"
description: "Описание" description: "Описание"
describeFile: "Добавить подпись"
enterFileDescription: "Введите подпись"
author: "Автор" author: "Автор"
leaveConfirm: "Вы не сохранили изменения. Хотите выйти и потерять их?" leaveConfirm: "Вы не сохранили изменения. Хотите выйти и потерять их?"
manage: "Управление" manage: "Управление"
@ -745,10 +752,31 @@ gallery: "Галерея"
recentPosts: "Недавние публикации" recentPosts: "Недавние публикации"
popularPosts: "Популярные публикации" popularPosts: "Популярные публикации"
shareWithNote: "Поделиться заметкой" shareWithNote: "Поделиться заметкой"
ads: "Реклама"
expiration: "Опрос длится" expiration: "Опрос длится"
memo: "Памятка"
priority: "Приоритет"
high: "Высокий"
middle: "Средне" middle: "Средне"
low: "Низкий"
emailNotConfiguredWarning: "Не указан адрес электронной почты"
ratio: "Соотношение"
global: "Всеобщая"
sent: "Отправить"
hashtags: "Хэштег"
_docs:
continueReading: "Читать подробнее"
features: "Возможности"
generalTopics: "Основные темы"
advancedTopics: "Дополнительные темы"
admin: "Управление"
_ad: _ad:
back: "Выход" back: "Выход"
reduceFrequencyOfThisAd: "Реже показывать эту рекламу"
_forgotPassword:
enterEmail: "Введите адрес электронной почты, который ввели при регистрации. На неё будет выслана ссылка для смены пароля."
ifNoEmail: "Если вы не ввели свой адрес электронной почты, свяжитесь с администратором ресурса, чтобы сменить пароль."
contactAdmin: "Здесь не используются адреса электронной почты, так что свяжитесь с администратором, чтобы поменять пароль."
_gallery: _gallery:
my: "Личная" my: "Личная"
liked: "Понравившееся" liked: "Понравившееся"
@ -840,6 +868,8 @@ _mfm:
blurDescription: "Размывает текст до нечитаемости, будто его поместили за матовое стекло. Наведение указателя мыши на размытый текст возвращает чёткость." blurDescription: "Размывает текст до нечитаемости, будто его поместили за матовое стекло. Наведение указателя мыши на размытый текст возвращает чёткость."
font: "Шрифт" font: "Шрифт"
fontDescription: "Так можно писать произвольным шрифтом." fontDescription: "Так можно писать произвольным шрифтом."
rainbow: "Радуга"
rainbowDescription: "Заставлять содержимое отображаться в цветах радуги."
_reversi: _reversi:
reversi: "Реверси" reversi: "Реверси"
gameSettings: "Настройки игры" gameSettings: "Настройки игры"
@ -891,9 +921,10 @@ _channel:
following: "Подписки" following: "Подписки"
usersCount: "Участников: {n}" usersCount: "Участников: {n}"
notesCount: "Заметок: {n}" notesCount: "Заметок: {n}"
_sidebar: _menuDisplay:
full: "Полностью" sideFull: "Сторона"
icon: "Только значки" sideIcon: "Сторона (иконки)"
top: "Вверх"
hide: "Спрятать" hide: "Спрятать"
_wordMute: _wordMute:
muteWords: "Скрыть слово" muteWords: "Скрыть слово"

View File

@ -127,6 +127,7 @@ editWidgets: "Редагувати віджети"
editWidgetsExit: "Готово" editWidgetsExit: "Готово"
customEmojis: "Кастомні емоджі" customEmojis: "Кастомні емоджі"
emoji: "Емоджі" emoji: "Емоджі"
emojis: "Емоджі"
emojiName: "Назва емоджі" emojiName: "Назва емоджі"
emojiUrl: "URL емодзі" emojiUrl: "URL емодзі"
addEmoji: "Додати емодзі" addEmoji: "Додати емодзі"
@ -517,7 +518,6 @@ removeAllFollowing: "Скасувати всі підписки"
removeAllFollowingDescription: "Скасувати підписку на всі акаунти з {host}. Будь ласка, робіть це, якщо інстанс більше не існує." removeAllFollowingDescription: "Скасувати підписку на всі акаунти з {host}. Будь ласка, робіть це, якщо інстанс більше не існує."
userSuspended: "Обліковий запис заблокований." userSuspended: "Обліковий запис заблокований."
userSilenced: "Обліковий запис приглушений." userSilenced: "Обліковий запис приглушений."
sidebar: "Бокова панель"
divider: "Розділювач" divider: "Розділювач"
addItem: "Додати елемент" addItem: "Додати елемент"
rooms: "Кімнати" rooms: "Кімнати"
@ -689,6 +689,11 @@ user: "Користувачі"
administration: "Управління" administration: "Управління"
expiration: "Опитування закінчується" expiration: "Опитування закінчується"
middle: "Середній" middle: "Середній"
global: "Глобальна"
sent: "Відправити"
hashtags: "Хештеґ"
_docs:
admin: "Управління"
_ad: _ad:
back: "Назад" back: "Назад"
_gallery: _gallery:
@ -816,9 +821,7 @@ _channel:
following: "Підписки" following: "Підписки"
usersCount: "{n} учасників" usersCount: "{n} учасників"
notesCount: "{n} дописів" notesCount: "{n} дописів"
_sidebar: _menuDisplay:
full: "Повна"
icon: "Аватар"
hide: "Сховати" hide: "Сховати"
_wordMute: _wordMute:
muteWords: "Заглушені слова" muteWords: "Заглушені слова"

View File

@ -1,13 +1,13 @@
--- ---
_lang_: "中文(简体)" _lang_: "中文(简体)"
headlineMisskey: "通过帖子连接在一起的网络" headlineMisskey: "通过帖子连接在一起的网络"
introMisskey: "欢迎Misskey是一个开源的、去中心化的“微博客”服务。\n通过编写「帖」来和大家分享你的以及你周围的事情吧!📡\n通过「回应」功能可以让你快速地对大家的帖表达反馈👍\n来探索新的世界吧🚀" introMisskey: "欢迎Misskey是一个开源的、去中心化的“微博客”服务。\n通过编写「帖」来和大家分享你的以及你周围的事情吧!📡\n通过「回应」功能可以让你快速地对大家的帖表达反馈👍\n来探索新的世界吧🚀"
monthAndDay: "{month}月 {day}日" monthAndDay: "{month}月 {day}日"
search: "搜索" search: "搜索"
notifications: "通知" notifications: "通知"
username: "用户名" username: "用户名"
password: "密码" password: "密码"
forgotPassword: "忘记密码" forgotPassword: "重置密码"
fetchingAsApObject: "联合查询中" fetchingAsApObject: "联合查询中"
ok: "OK" ok: "OK"
gotIt: "我明白了" gotIt: "我明白了"
@ -63,33 +63,33 @@ import: "导入"
export: "导出" export: "导出"
files: "文件" files: "文件"
download: "下载" download: "下载"
driveFileDeleteConfirm: "要删除「{name}」文件吗?附加此文件的帖子也会消失。" driveFileDeleteConfirm: "要删除「{name}」文件吗?附加此文件的帖子也会被删除。"
unfollowConfirm: "要取消对{name}的关注吗?" unfollowConfirm: "要取消对{name}的关注吗?"
exportRequested: "导出请求已提交可能需要花一些时间导出的文件将保存到网盘中。" exportRequested: "导出请求已提交,这可能需要花一些时间导出的文件将保存到网盘中。"
importRequested: "导入请求已提交这可能需要花一点时间。" importRequested: "导入请求已提交这可能需要花一点时间。"
lists: "列表" lists: "列表"
noLists: "列表为空" noLists: "列表为空"
note: "帖子" note: "帖子"
notes: "帖子" notes: "帖子"
following: "关注中" following: "关注中"
followers: "关注者" followers: "关注者"
followsYou: "关注你" followsYou: "正在关注你"
createList: "创建列表" createList: "创建列表"
manageLists: "管理列表" manageLists: "管理列表"
error: "错误" error: "错误"
somethingHappened: "出现了问题" somethingHappened: "出现了一些问题"
retry: "重试" retry: "重试"
pageLoadError: "页面加载失败。" pageLoadError: "页面加载失败。"
pageLoadErrorDescription: "这通常是由于网络或浏览器缓存的原因。请清除缓存或等待片刻后重试。" pageLoadErrorDescription: "这通常是由于网络或浏览器缓存的原因。请清除缓存或等待片刻后重试。"
enterListName: "输入列表名称" enterListName: "输入列表名称"
privacy: "隐私" privacy: "隐私"
makeFollowManuallyApprove: "关注者请求需要批准" makeFollowManuallyApprove: "关注者的关注请求需要批准"
defaultNoteVisibility: "默认可见性" defaultNoteVisibility: "默认可见性"
follow: "关注" follow: "关注"
followRequest: "关注申请" followRequest: "关注申请"
followRequests: "关注申请" followRequests: "关注申请"
unfollow: "取消关注" unfollow: "取消关注"
followRequestPending: "发送关注请" followRequestPending: "发送关注请"
enterEmoji: "输入表情符号" enterEmoji: "输入表情符号"
renote: "转发" renote: "转发"
unrenote: "取消转发" unrenote: "取消转发"
@ -106,7 +106,7 @@ add: "添加"
reaction: "回应" reaction: "回应"
reactionSettingDescription: "选择您想要置顶的回应。" reactionSettingDescription: "选择您想要置顶的回应。"
reactionSettingDescription2: "拖动重新排序,单击删除,点击 + 添加。" reactionSettingDescription2: "拖动重新排序,单击删除,点击 + 添加。"
rememberNoteVisibility: "记录公开范围" rememberNoteVisibility: "保存上次设置的可见性"
attachCancel: "删除附件" attachCancel: "删除附件"
markAsSensitive: "标记为敏感内容" markAsSensitive: "标记为敏感内容"
unmarkAsSensitive: "取消标记为敏感内容" unmarkAsSensitive: "取消标记为敏感内容"
@ -128,17 +128,18 @@ editWidgets: "编辑小工具"
editWidgetsExit: "完成编辑" editWidgetsExit: "完成编辑"
customEmojis: "自定义表情符号" customEmojis: "自定义表情符号"
emoji: "表情符号" emoji: "表情符号"
emojis: "表情符号"
emojiName: "表情符号名称" emojiName: "表情符号名称"
emojiUrl: "表情符号地址" emojiUrl: "表情符号地址"
addEmoji: "添加表情符号" addEmoji: "添加表情符号"
settingGuide: "推荐配置" settingGuide: "推荐配置"
cacheRemoteFiles: "远程文件缓存" cacheRemoteFiles: "远程文件缓存"
cacheRemoteFilesDescription: "当禁用此设定时远程文件将直接从远程实例载入。禁用后会减小储存空间需求,但是会增加流量,因为缩略图不会被生成。" cacheRemoteFilesDescription: "当禁用此设定时远程文件将直接从远程实例载入。禁用后会减小储存空间需求,但是会增加流量,因为缩略图不会被生成。"
flagAsBot: "这个账户是Bot" flagAsBot: "这是一个机器人账号"
flagAsBotDescription: "如果此帐户由程序控制请启用此项。启用后此标志可以帮助其他开发人员防止机器人之间产生无限互动的行为并让Misskey的内部系统将此帐户识别为机器人。" flagAsBotDescription: "如果此帐户由程序控制请启用此项。启用后此标志可以帮助其他开发人员防止机器人之间产生无限互动的行为并让Misskey的内部系统将此帐户识别为机器人。"
flagAsCat: "这个账户是Cat" flagAsCat: "这个账户是一只猫"
flagAsCatDescription: "如果您想表明此帐户是一只猫,请打开此标志。" flagAsCatDescription: "如果您想表明此帐户是一只猫,请打开此标志。\n开启后会在您的头像上出现猫耳朵并将你的帖子中的「na」替换为「nya」日文同理。"
autoAcceptFollowed: "自动允许关注" autoAcceptFollowed: "自动允许关注者的关注"
addAccount: "添加账户" addAccount: "添加账户"
loginFailed: "登录失败" loginFailed: "登录失败"
showOnRemote: "转到所在实例显示" showOnRemote: "转到所在实例显示"
@ -172,7 +173,7 @@ software: "软件"
version: "版本" version: "版本"
metadata: "元数据" metadata: "元数据"
withNFiles: "{n}个文件" withNFiles: "{n}个文件"
monitor: "监视器" monitor: "服务器状态"
jobQueue: "作业队列" jobQueue: "作业队列"
cpuAndMemory: "CPU和内存" cpuAndMemory: "CPU和内存"
network: "网络" network: "网络"
@ -211,7 +212,7 @@ instanceFollowing: "关注实例"
instanceFollowers: "关注实例" instanceFollowers: "关注实例"
instanceUsers: "实例用户" instanceUsers: "实例用户"
changePassword: "修改密码" changePassword: "修改密码"
security: "安全" security: "安全"
retypedNotMatch: "两次输入不一致!" retypedNotMatch: "两次输入不一致!"
currentPassword: "现在的密码" currentPassword: "现在的密码"
newPassword: "新密码" newPassword: "新密码"
@ -231,18 +232,18 @@ deleteAreYouSure: "要删掉「{x}」吗?"
resetAreYouSure: "恢复默认设置?" resetAreYouSure: "恢复默认设置?"
saved: "已保存" saved: "已保存"
messaging: "聊天" messaging: "聊天"
upload: "上传" upload: "本地上传"
fromDrive: "从网盘中" fromDrive: "从网盘中"
fromUrl: "从 URL" fromUrl: "从 URL"
uploadFromUrl: "从网址上传" uploadFromUrl: "从网址上传"
uploadFromUrlDescription: "要上传的文件的URL" uploadFromUrlDescription: "输入文件的URL"
uploadFromUrlRequested: "请求上传" uploadFromUrlRequested: "请求上传"
uploadFromUrlMayTakeTime: "上传可能需要一些时间完成。" uploadFromUrlMayTakeTime: "上传可能需要一些时间完成。"
explore: "发现" explore: "发现"
games: "Misskey游戏" games: "Misskey游戏"
messageRead: "已读" messageRead: "已读"
noMoreHistory: "没有更多的历史记录" noMoreHistory: "没有更多的历史记录"
startMessaging: "开始聊天" startMessaging: "添加聊天"
nUsersRead: "{n}人已读" nUsersRead: "{n}人已读"
agreeTo: "{0}人同意" agreeTo: "{0}人同意"
tos: "服务条款" tos: "服务条款"
@ -260,8 +261,8 @@ themeForLightMode: "在浅色模式下使用的主题"
themeForDarkMode: "在深色模式下使用的主题" themeForDarkMode: "在深色模式下使用的主题"
light: "浅色" light: "浅色"
dark: "深色" dark: "深色"
lightThemes: "色主题" lightThemes: "色主题"
darkThemes: "色主题" darkThemes: "色主题"
syncDeviceDarkMode: "将深色模式与设备设置同步" syncDeviceDarkMode: "将深色模式与设备设置同步"
drive: "网盘" drive: "网盘"
fileName: "文件名称" fileName: "文件名称"
@ -275,24 +276,24 @@ createFolder: "创建文件夹"
renameFolder: "重命名文件夹" renameFolder: "重命名文件夹"
deleteFolder: "删除文件夹" deleteFolder: "删除文件夹"
addFile: "添加文件" addFile: "添加文件"
emptyDrive: "驱动器为空" emptyDrive: "网盘中无文件"
emptyFolder: "文件夹" emptyFolder: "文件夹中无文件"
unableToDelete: "无法删除" unableToDelete: "无法删除"
inputNewFileName: "请输入新文件名" inputNewFileName: "请输入新文件名"
inputNewDescription: "请输入新标题" inputNewDescription: "请输入新标题"
inputNewFolderName: "请输入新文件名" inputNewFolderName: "请输入新文件名"
circularReferenceFolder: "目标文件夹是您要移动的文件夹的子文件夹。" circularReferenceFolder: "目标文件夹是您要移动的文件夹的子文件夹。"
hasChildFilesOrFolders: "此文件夹不为空,无法删除。" hasChildFilesOrFolders: "此文件夹中有文件,无法删除。"
copyUrl: "复制链接" copyUrl: "复制链接"
rename: "重命名" rename: "重命名"
avatar: "头像" avatar: "头像"
banner: "Banner" banner: "横幅"
nsfw: "敏感内容" nsfw: "敏感内容"
whenServerDisconnected: "与服务器连接中断时" whenServerDisconnected: "与服务器连接中断时"
disconnectedFromServer: "已服务器断开连接" disconnectedFromServer: "已服务器断开连接"
reload: "重新加载" reload: "重新加载"
doNothing: "什么都不做" doNothing: "关闭弹窗"
reloadConfirm: "确定要重新加载吗" reloadConfirm: "确定要重新加载吗"
watch: "关注" watch: "关注"
unwatch: "取消关注" unwatch: "取消关注"
accept: "允许" accept: "允许"
@ -325,13 +326,14 @@ driveCapacityPerLocalAccount: "每个用户的网盘空间"
driveCapacityPerRemoteAccount: "每个远程用户的网盘容量" driveCapacityPerRemoteAccount: "每个远程用户的网盘容量"
inMb: "以兆字节(MegaByte)为单位" inMb: "以兆字节(MegaByte)为单位"
iconUrl: "图标URL" iconUrl: "图标URL"
bannerUrl: "Banner URL" bannerUrl: "横幅URL"
backgroundImageUrl: "背景图URL"
basicInfo: "基本信息" basicInfo: "基本信息"
pinnedUsers: "置顶用户" pinnedUsers: "置顶用户"
pinnedUsersDescription: "在「发现」页面中使用换行标记想要置顶的用户。" pinnedUsersDescription: "在「发现」页面中使用换行标记想要置顶的用户。"
pinnedPages: "固定页面" pinnedPages: "固定页面"
pinnedPagesDescription: "输入您要固定到实例首页的页面路径,以换行符分隔。" pinnedPagesDescription: "输入您要固定到实例首页的页面路径,以换行符分隔。"
pinnedClipId: "置顶的片段ID" pinnedClipId: "置顶的书签ID"
pinnedNotes: "已置顶的帖子" pinnedNotes: "已置顶的帖子"
hcaptcha: "hCaptcha" hcaptcha: "hCaptcha"
enableHcaptcha: "启用 hCaptcha" enableHcaptcha: "启用 hCaptcha"
@ -349,13 +351,13 @@ antennaSource: "接收来源"
antennaKeywords: "包含关键字" antennaKeywords: "包含关键字"
antennaExcludeKeywords: "排除关键字" antennaExcludeKeywords: "排除关键字"
antennaKeywordsDescription: "使用空格分隔会产生AND规范并且使用换行符分隔会产生OR规范" antennaKeywordsDescription: "使用空格分隔会产生AND规范并且使用换行符分隔会产生OR规范"
notifyAntenna: "通知新帖子" notifyAntenna: "开启通知"
withFileAntenna: "仅带有附件的帖子" withFileAntenna: "仅带有附件的帖子"
enableServiceworker: "启用ServiceWorker" enableServiceworker: "启用ServiceWorker"
antennaUsersDescription: "指定用户名,用换行符分隔" antennaUsersDescription: "指定用户名,用换行符分隔"
caseSensitive: "区分大小写" caseSensitive: "区分大小写"
withReplies: "包括回复" withReplies: "包括回复"
connectedTo: "您的账号已连到接以下社交账号" connectedTo: "您的账号已连到接以下第三方账号"
notesAndReplies: "帖子与回复" notesAndReplies: "帖子与回复"
withFiles: "附件" withFiles: "附件"
silence: "禁言" silence: "禁言"
@ -363,8 +365,8 @@ silenceConfirm: "确认要禁言吗?"
unsilence: "解除禁言" unsilence: "解除禁言"
unsilenceConfirm: "要解除禁言吗?" unsilenceConfirm: "要解除禁言吗?"
popularUsers: "热门用户" popularUsers: "热门用户"
recentlyUpdatedUsers: "最近投稿用户" recentlyUpdatedUsers: "最近投稿用户"
recentlyRegisteredUsers: "最近登录用户" recentlyRegisteredUsers: "最近登录用户"
recentlyDiscoveredUsers: "最近发现的用户" recentlyDiscoveredUsers: "最近发现的用户"
exploreUsersCount: "有{count}个用户" exploreUsersCount: "有{count}个用户"
exploreFediverse: "探索Fediverse" exploreFediverse: "探索Fediverse"
@ -373,9 +375,9 @@ userList: "列表"
about: "关于" about: "关于"
aboutMisskey: "关于 Misskey" aboutMisskey: "关于 Misskey"
administrator: "管理员" administrator: "管理员"
token: "令牌" token: "Token (令牌)"
twoStepAuthentication: "两步验证" twoStepAuthentication: "两步验证"
moderator: "版主" moderator: "监察员"
nUsersMentioned: "{n} 被提到" nUsersMentioned: "{n} 被提到"
securityKey: "安全密钥" securityKey: "安全密钥"
securityKeyName: "密钥名称" securityKeyName: "密钥名称"
@ -417,7 +419,7 @@ noteOf: "{user}的帖子"
inviteToGroup: "群组邀请" inviteToGroup: "群组邀请"
maxNoteTextLength: "帖子的字数限制" maxNoteTextLength: "帖子的字数限制"
quoteAttached: "已引用" quoteAttached: "已引用"
quoteQuestion: "是否将其作为引用附上" quoteQuestion: "是否引用此链接内容"
noMessagesYet: "现在没有新的聊天" noMessagesYet: "现在没有新的聊天"
newMessageExists: "新信息" newMessageExists: "新信息"
onlyOneFileCanBeAttached: "只能添加一个附件" onlyOneFileCanBeAttached: "只能添加一个附件"
@ -441,9 +443,9 @@ tapSecurityKey: "轻触硬件安全密钥"
or: "或者" or: "或者"
language: "语言" language: "语言"
uiLanguage: "显示语言" uiLanguage: "显示语言"
groupInvited: "群组招待" groupInvited: "您有新的群组邀请"
aboutX: "关于 {x}" aboutX: "关于 {x}"
useOsNativeEmojis: "使用OS原生表情符号" useOsNativeEmojis: "使用系统的原生表情符号"
youHaveNoGroups: "没有群组" youHaveNoGroups: "没有群组"
joinOrCreateGroup: "请加入一个现有的群组,或者创建新群组。" joinOrCreateGroup: "请加入一个现有的群组,或者创建新群组。"
noHistory: "没有历史记录" noHistory: "没有历史记录"
@ -459,7 +461,7 @@ regenerate: "重新生成"
fontSize: "字体大小" fontSize: "字体大小"
noFollowRequests: "没有关注申请" noFollowRequests: "没有关注申请"
openImageInNewTab: "在新标签页中打开图片" openImageInNewTab: "在新标签页中打开图片"
dashboard: "Dashboard" dashboard: "管理面板"
local: "本地" local: "本地"
remote: "远程" remote: "远程"
total: "总计" total: "总计"
@ -491,12 +493,12 @@ objectStorageUseProxy: "使用代理"
objectStorageUseProxyDesc: "如果您不使用代理进行API连接请将其关闭。" objectStorageUseProxyDesc: "如果您不使用代理进行API连接请将其关闭。"
objectStorageSetPublicRead: "上传时设置为public-read" objectStorageSetPublicRead: "上传时设置为public-read"
serverLogs: "服务器日志" serverLogs: "服务器日志"
deleteAll: "删除全部" deleteAll: "全部删除"
showFixedPostForm: "在时间线顶部显示帖子表单" showFixedPostForm: "在时间线顶部显示发帖框"
newNoteRecived: "有新的帖子" newNoteRecived: "有新的帖子"
sounds: "音" sounds: "提示音"
listen: "听" listen: "听"
none: "" none: ""
showInPage: "在页面中显示" showInPage: "在页面中显示"
popout: "弹窗" popout: "弹窗"
volume: "音量" volume: "音量"
@ -508,15 +510,15 @@ recentUsed: "最近使用"
install: "安装" install: "安装"
uninstall: "卸载" uninstall: "卸载"
installedApps: "已授权的应用" installedApps: "已授权的应用"
nothing: "没什么" nothing: "没"
installedDate: "授权日期" installedDate: "授权日期"
lastUsedDate: "最近使用" lastUsedDate: "最近使用"
state: "状态" state: "状态"
sort: "排序" sort: "排序"
ascendingOrder: "升序" ascendingOrder: "升序"
descendingOrder: "降序" descendingOrder: "降序"
scratchpad: "便签本" scratchpad: "AiScript控制台"
scratchpadDescription: "便签本为AiScript提供了实验环境。您可以编写代码以与Misskey交互运行它并查看结果。" scratchpadDescription: "AiScript控制台为AiScript提供了实验环境。您可以编写代码以与Misskey交互运行它并查看结果。"
output: "输出" output: "输出"
script: "脚本" script: "脚本"
disablePagesScript: "禁用页面脚本" disablePagesScript: "禁用页面脚本"
@ -527,7 +529,7 @@ removeAllFollowing: "取消所有关注"
removeAllFollowingDescription: "取消{host}的所有关注者。当实例不存在时执行。" removeAllFollowingDescription: "取消{host}的所有关注者。当实例不存在时执行。"
userSuspended: "该用户已被冻结。" userSuspended: "该用户已被冻结。"
userSilenced: "该用户已被禁言。" userSilenced: "该用户已被禁言。"
sidebar: "侧边栏" menu: "菜单"
divider: "分割线" divider: "分割线"
addItem: "添加项目" addItem: "添加项目"
rooms: "房间" rooms: "房间"
@ -544,7 +546,7 @@ poll: "调查问卷"
useCw: "隐藏内容" useCw: "隐藏内容"
enablePlayer: "打开播放器" enablePlayer: "打开播放器"
disablePlayer: "关闭播放器" disablePlayer: "关闭播放器"
expandTweet: "展开贴文" expandTweet: "展开帖子"
themeEditor: "主题编辑器" themeEditor: "主题编辑器"
description: "描述" description: "描述"
describeFile: "添加标题" describeFile: "添加标题"
@ -590,10 +592,10 @@ userSaysSomething: "{name}说了什么"
makeActive: "启用" makeActive: "启用"
display: "显示" display: "显示"
copy: "复制" copy: "复制"
metrics: "指标" metrics: "服务器监控"
overview: "概述" overview: "服务器概况"
logs: "日志" logs: "日志"
delayed: "延迟" delayed: "滞后"
database: "数据库" database: "数据库"
channel: "频道" channel: "频道"
create: "创建" create: "创建"
@ -626,17 +628,17 @@ random: "随机"
system: "系统" system: "系统"
switchUi: "切换界面" switchUi: "切换界面"
desktop: "桌面" desktop: "桌面"
clip: "片段" clip: "书签"
createNew: "新建" createNew: "新建"
optional: "可选" optional: "可选"
createNewClip: "新建片段" createNewClip: "新建书签"
public: "公开" public: "公开"
i18nInfo: "Misskey已经被志愿者们翻译到了各种语言。如果你也有兴趣可以通过{link}帮助翻译。" i18nInfo: "Misskey已经被志愿者们翻译到了各种语言。如果你也有兴趣可以通过{link}帮助翻译。"
manageAccessTokens: "管理 Access Tokens" manageAccessTokens: "管理 Access Tokens"
accountInfo: "帐户信息" accountInfo: "帐户信息"
notesCount: "贴文数量" notesCount: "帖子数量"
repliesCount: "回复数量" repliesCount: "回复数量"
renotesCount: "转数量" renotesCount: "转数量"
repliedCount: "回复数" repliedCount: "回复数"
renotedCount: "转发数" renotedCount: "转发数"
followingCount: "正在关注数量" followingCount: "正在关注数量"
@ -647,9 +649,9 @@ pollVotesCount: "问卷调查的投票数"
pollVotedCount: "问卷调查的被投票数" pollVotedCount: "问卷调查的被投票数"
yes: "是" yes: "是"
no: "否" no: "否"
driveFilesCount: "磁盘文件数" driveFilesCount: "网盘的文件数"
driveUsage: "磁盘空间用量" driveUsage: "网盘的空间用量"
noCrawle: "拒绝搜索的索引" noCrawle: "拒绝搜索引擎的索引"
noCrawleDescription: "要求搜索引擎不要收录(索引)您的用户页面,帖子,页面等。" noCrawleDescription: "要求搜索引擎不要收录(索引)您的用户页面,帖子,页面等。"
lockedAccountInfo: "即使通过了关注请求,只要您不将帖子可见范围设置成“关注者”,任何人都可以看到您的帖子。" lockedAccountInfo: "即使通过了关注请求,只要您不将帖子可见范围设置成“关注者”,任何人都可以看到您的帖子。"
alwaysMarkSensitive: "默认将媒体文件标记为敏感内容" alwaysMarkSensitive: "默认将媒体文件标记为敏感内容"
@ -664,7 +666,7 @@ pageLikedCount: "页面被点赞次数"
reversiCount: "黑白棋对战次数" reversiCount: "黑白棋对战次数"
contact: "联系人" contact: "联系人"
useSystemFont: "使用系统默认字体" useSystemFont: "使用系统默认字体"
clips: "片段" clips: "书签"
experimentalFeatures: "实验性功能" experimentalFeatures: "实验性功能"
developer: "开发者" developer: "开发者"
makeExplorable: "使账号可见。" makeExplorable: "使账号可见。"
@ -696,7 +698,7 @@ saveConfirm: "确定保存?"
deleteConfirm: "确定删除?" deleteConfirm: "确定删除?"
invalidValue: "无效值。" invalidValue: "无效值。"
registry: "注册表" registry: "注册表"
closeAccount: "关闭账户" closeAccount: "永久注销账户"
currentVersion: "当前版本" currentVersion: "当前版本"
latestVersion: "最新版本" latestVersion: "最新版本"
youAreRunningUpToDateClient: "您所使用的客户端已经是最新的。" youAreRunningUpToDateClient: "您所使用的客户端已经是最新的。"
@ -760,13 +762,28 @@ middle: "中"
low: "低" low: "低"
emailNotConfiguredWarning: "电子邮件地址未设置。" emailNotConfiguredWarning: "电子邮件地址未设置。"
ratio: "比率" ratio: "比率"
customCss: "自定义 CSS"
customCssWarn: "这些设置必须有相关的基础知识,不当的配置可能导致客户端无法正常使用!"
global: "全局"
squareAvatars: "显示方形头像图标"
sent: "发送"
received: "收取"
searchResult: "搜索结果"
hashtags: "话题标签"
troubleshooting: "故障排除"
_docs:
continueReading: "继续阅读"
features: "特性"
generalTopics: "通常提示"
advancedTopics: "进阶提示"
admin: "管理"
_ad: _ad:
back: "返回" back: "返回"
reduceFrequencyOfThisAd: "减少此广告的频率" reduceFrequencyOfThisAd: "减少此广告的频率"
_forgotPassword: _forgotPassword:
enterEmail: "请输入您用来注册帐户的电子邮地址密码重置链接将发送到该地址。" enterEmail: "请输入您验证账号时用的电子邮地址密码重置链接将发送至该邮箱上。"
ifNoEmail: "如果您没有使用电子邮件地址注册,请联系管理员。" ifNoEmail: "如果您没有使用电子邮件地址进行验证,请联系管理员。"
contactAdmin: "该实例不支持电子邮件。如果您想重设密码,请联系管理员。" contactAdmin: "该实例不支持发送电子邮件。如果您想重设密码,请联系管理员。"
_gallery: _gallery:
my: "我的图库" my: "我的图库"
liked: "喜欢的图片" liked: "喜欢的图片"
@ -776,7 +793,7 @@ _email:
_follow: _follow:
title: "你有新的关注者" title: "你有新的关注者"
_receiveFollowRequest: _receiveFollowRequest:
title: "收到关注请求" title: "收到关注请求"
_plugin: _plugin:
install: "安装插件" install: "安装插件"
installWarn: "请不要安装不可信的插件。" installWarn: "请不要安装不可信的插件。"
@ -858,6 +875,8 @@ _mfm:
blurDescription: "产生模糊效果。将鼠标指针放在上面即可将内容显示出来。" blurDescription: "产生模糊效果。将鼠标指针放在上面即可将内容显示出来。"
font: "字体" font: "字体"
fontDescription: "可以设置内容所使用的字体。" fontDescription: "可以设置内容所使用的字体。"
rainbow: "彩虹"
rainbowDescription: "用彩虹色来显示内容。"
_reversi: _reversi:
reversi: "黑白棋" reversi: "黑白棋"
gameSettings: "对局设置" gameSettings: "对局设置"
@ -909,19 +928,20 @@ _channel:
following: "正在关注" following: "正在关注"
usersCount: "有{n}人参与" usersCount: "有{n}人参与"
notesCount: "有{n}个帖子" notesCount: "有{n}个帖子"
_sidebar: _menuDisplay:
full: "全部" sideFull: "横向"
icon: "图标" sideIcon: "横向(图标)"
top: "顶部"
hide: "隐藏" hide: "隐藏"
_wordMute: _wordMute:
muteWords: "禁用词" muteWords: "禁用词"
muteWordsDescription: "使用空格分隔表示AND逻辑使用换行符分隔表示OR逻辑。" muteWordsDescription: "使用空格分隔表示AND逻辑使用换行符分隔表示OR逻辑。"
muteWordsDescription2: "将关键字用斜线括起来表示正则表达式。" muteWordsDescription2: "将关键字用斜线括起来表示正则表达式。"
softDescription: "隐藏时间线中指定条件的帖。" softDescription: "隐藏时间线中指定条件的帖。"
hardDescription: "防止将具有指定条件的帖添加到时间线。 即使您更改条件,未添加的帖文也会被排除在外。" hardDescription: "防止将具有指定条件的帖添加到时间线。 即使您更改条件,未添加的帖文也会被排除在外。"
soft: "软屏蔽" soft: "软屏蔽"
hard: "硬屏蔽" hard: "硬屏蔽"
mutedNotes: "被屏蔽的帖" mutedNotes: "被屏蔽的帖"
_theme: _theme:
explore: "寻找主题" explore: "寻找主题"
install: "安装主题" install: "安装主题"
@ -947,8 +967,8 @@ _theme:
argument: "参数" argument: "参数"
basedProp: "基于的属性名称" basedProp: "基于的属性名称"
alpha: "不透明度" alpha: "不透明度"
darken: "色" darken: "色"
lighten: "色" lighten: "色"
inputConstantName: "请输入常量名称" inputConstantName: "请输入常量名称"
importInfo: "您可以在此处粘贴主题代码,将其导入到编辑器中" importInfo: "您可以在此处粘贴主题代码,将其导入到编辑器中"
deleteConstantConfirm: "确定要删除常量{const}吗?" deleteConstantConfirm: "确定要删除常量{const}吗?"
@ -983,18 +1003,18 @@ _theme:
cwBg: "CW 按钮背景" cwBg: "CW 按钮背景"
cwFg: "CW 按钮文本" cwFg: "CW 按钮文本"
cwHoverBg: "CW 按钮背景(悬停)" cwHoverBg: "CW 按钮背景(悬停)"
toastBg: "吐司通知背景" toastBg: "Toast通知背景"
toastFg: "吐司通知文本" toastFg: "Toast通知文本"
buttonBg: "按钮背景" buttonBg: "按钮背景"
buttonHoverBg: "按钮背景(悬停)" buttonHoverBg: "按钮背景(悬停)"
inputBorder: "输入框边框" inputBorder: "输入框边框"
listItemHoverBg: "下拉列表项目背景(悬停)" listItemHoverBg: "下拉列表项目背景(悬停)"
driveFolderBg: "驱动器文件夹背景" driveFolderBg: "网盘的文件夹背景"
wallpaperOverlay: "壁纸叠加层" wallpaperOverlay: "壁纸叠加层"
badge: "徽章" badge: "徽章"
messageBg: "聊天背景" messageBg: "聊天背景"
accentDarken: "强调色()" accentDarken: "强调色()"
accentLighten: "强调色()" accentLighten: "强调色()"
fgHighlighted: "高亮显示文本" fgHighlighted: "高亮显示文本"
_sfx: _sfx:
note: "帖子" note: "帖子"
@ -1093,9 +1113,9 @@ _auth:
_antennaSources: _antennaSources:
all: "所有帖子" all: "所有帖子"
homeTimeline: "已关注用户的帖子" homeTimeline: "已关注用户的帖子"
users: "来自定用户的帖子" users: "来自定用户的帖子"
userList: "来自特定清单中的帖子" userList: "来自指定列表中的帖子"
userGroup: "来自特定组中用户的帖子" userGroup: "来自指定群组中用户的帖子"
_weekday: _weekday:
sunday: "星期日" sunday: "星期日"
monday: "星期一" monday: "星期一"
@ -1121,7 +1141,7 @@ _widgets:
button: "按钮" button: "按钮"
onlineUsers: "在线用户" onlineUsers: "在线用户"
jobQueue: "作业队列" jobQueue: "作业队列"
serverMetric: "服务器指标" serverMetric: "服务器监控"
aiscript: "AiScript控制台" aiscript: "AiScript控制台"
_cw: _cw:
hide: "隐藏" hide: "隐藏"
@ -1134,7 +1154,7 @@ _poll:
noMore: "无法再添加更多了" noMore: "无法再添加更多了"
canMultipleVote: "允许多个投票" canMultipleVote: "允许多个投票"
expiration: "截止时间" expiration: "截止时间"
infinite: "无限期" infinite: "不限时间"
at: "指定日期" at: "指定日期"
after: "指定时间" after: "指定时间"
deadlineDate: "截止日期" deadlineDate: "截止日期"
@ -1173,7 +1193,7 @@ _postForm:
e: "请写下来吧" e: "请写下来吧"
f: "等待您的发布..." f: "等待您的发布..."
_profile: _profile:
name: "称" name: "称"
username: "用户名" username: "用户名"
description: "个人简介" description: "个人简介"
youCanIncludeHashtags: "您可以包含一个哈希标签。" youCanIncludeHashtags: "您可以包含一个哈希标签。"
@ -1286,7 +1306,7 @@ _rooms:
_pages: _pages:
newPage: "创建页面" newPage: "创建页面"
editPage: "编辑页面" editPage: "编辑页面"
readPage: "查看" readPage: "查看页面"
created: "页面已创建" created: "页面已创建"
updated: "页面已更新" updated: "页面已更新"
deleted: "该页面已被删除" deleted: "该页面已被删除"
@ -1599,7 +1619,7 @@ _notification:
reaction: "回应" reaction: "回应"
pollVote: "问卷调查被投票" pollVote: "问卷调查被投票"
receiveFollowRequest: "收到关注请求" receiveFollowRequest: "收到关注请求"
followRequestAccepted: "关注请求已接受" followRequestAccepted: "关注请求已通过"
groupInvited: "加入群组邀请" groupInvited: "加入群组邀请"
app: "关联应用的通知" app: "关联应用的通知"
_deck: _deck:

View File

@ -14,7 +14,7 @@ gotIt: "知道了"
cancel: "取消" cancel: "取消"
enterUsername: "輸入使用者名稱" enterUsername: "輸入使用者名稱"
renotedBy: "{user} 轉傳了" renotedBy: "{user} 轉傳了"
noNotes: "貼文不可用。" noNotes: "貼文。"
noNotifications: "沒有通知" noNotifications: "沒有通知"
instance: "實例" instance: "實例"
settings: "設定" settings: "設定"
@ -47,8 +47,8 @@ deleteAndEdit: "刪除並編輯"
deleteAndEditConfirm: "要刪除並再次編輯嗎?此貼文的所有情感、轉發和回覆也將會消失。" deleteAndEditConfirm: "要刪除並再次編輯嗎?此貼文的所有情感、轉發和回覆也將會消失。"
addToList: "加入至清單" addToList: "加入至清單"
sendMessage: "發送訊息" sendMessage: "發送訊息"
copyUsername: "複製用戶名" copyUsername: "複製使用者名稱"
searchUser: "搜尋用戶" searchUser: "搜尋使用者"
reply: "回覆" reply: "回覆"
loadMore: "載入更多" loadMore: "載入更多"
showMore: "載入更多" showMore: "載入更多"
@ -128,6 +128,7 @@ editWidgets: "編輯小工具"
editWidgetsExit: "完成" editWidgetsExit: "完成"
customEmojis: "自訂表情符號" customEmojis: "自訂表情符號"
emoji: "表情符號" emoji: "表情符號"
emojis: "表情符號"
emojiName: "表情符號名稱" emojiName: "表情符號名稱"
emojiUrl: "表情符號URL" emojiUrl: "表情符號URL"
addEmoji: "加入表情符號" addEmoji: "加入表情符號"
@ -279,6 +280,7 @@ emptyDrive: "雲端硬碟為空"
emptyFolder: "資料夾為空" emptyFolder: "資料夾為空"
unableToDelete: "無法刪除" unableToDelete: "無法刪除"
inputNewFileName: "輸入檔案名稱" inputNewFileName: "輸入檔案名稱"
inputNewDescription: "請輸入新標題 "
inputNewFolderName: "輸入新資料夾的名稱" inputNewFolderName: "輸入新資料夾的名稱"
circularReferenceFolder: "目標文件夾是您要移動的文件夾的子文件夾。" circularReferenceFolder: "目標文件夾是您要移動的文件夾的子文件夾。"
hasChildFilesOrFolders: "此文件夾不是空的,無法刪除。" hasChildFilesOrFolders: "此文件夾不是空的,無法刪除。"
@ -310,6 +312,8 @@ monthX: "{month}月"
yearX: "{year}年" yearX: "{year}年"
pages: "頁面" pages: "頁面"
integration: "整合" integration: "整合"
connectService: "己連結"
disconnectService: "己斷開 "
enableLocalTimeline: "開啟本地時間軸" enableLocalTimeline: "開啟本地時間軸"
enableGlobalTimeline: "啟用公開時間軸" enableGlobalTimeline: "啟用公開時間軸"
disablingTimelinesInfo: "即使您關閉了時間線功能,管理員和協調人仍可以繼續使用,以方便您。" disablingTimelinesInfo: "即使您關閉了時間線功能,管理員和協調人仍可以繼續使用,以方便您。"
@ -323,6 +327,7 @@ driveCapacityPerRemoteAccount: "每個非本地用戶的雲端容量"
inMb: "以Mbps為單位" inMb: "以Mbps為單位"
iconUrl: "圖像URL" iconUrl: "圖像URL"
bannerUrl: "橫幅圖像URL" bannerUrl: "橫幅圖像URL"
backgroundImageUrl: "背景圖片的來源網址 "
basicInfo: "基本資訊" basicInfo: "基本資訊"
pinnedUsers: "置頂用戶" pinnedUsers: "置頂用戶"
pinnedUsersDescription: "在「發現」頁面中使用換行標記想要置頂的使用者。" pinnedUsersDescription: "在「發現」頁面中使用換行標記想要置頂的使用者。"
@ -474,7 +479,9 @@ objectStorage: "Object Storage (物件儲存)"
useObjectStorage: "使用Object Storage" useObjectStorage: "使用Object Storage"
objectStorageBaseUrl: "Base URL" objectStorageBaseUrl: "Base URL"
objectStorageBucket: "儲存空間Bucket" objectStorageBucket: "儲存空間Bucket"
objectStorageBucketDesc: "請指定您正在使用的服務的存儲桶名稱。 "
objectStoragePrefix: "前綴" objectStoragePrefix: "前綴"
objectStoragePrefixDesc: "它存儲在此前綴目錄下。"
objectStorageEndpoint: "端點Endpoint" objectStorageEndpoint: "端點Endpoint"
objectStorageEndpointDesc: "如要使用AWS S3請留空。否則請依照你使用的服務商的說明書進行設定以'<host>'或 '<host>:<port>'的形式設定端點Endpoint。" objectStorageEndpointDesc: "如要使用AWS S3請留空。否則請依照你使用的服務商的說明書進行設定以'<host>'或 '<host>:<port>'的形式設定端點Endpoint。"
objectStorageRegion: "地域Region" objectStorageRegion: "地域Region"
@ -517,7 +524,6 @@ removeAllFollowing: "解除所有追蹤"
removeAllFollowingDescription: "解除{host}所有的追蹤。在實例不再存在時執行。" removeAllFollowingDescription: "解除{host}所有的追蹤。在實例不再存在時執行。"
userSuspended: "該使用者已被停用" userSuspended: "該使用者已被停用"
userSilenced: "該用戶已被禁言。" userSilenced: "該用戶已被禁言。"
sidebar: "側邊列"
divider: "分割線" divider: "分割線"
addItem: "新增項目" addItem: "新增項目"
rooms: "房間" rooms: "房間"
@ -537,6 +543,8 @@ disablePlayer: "關閉播放器"
expandTweet: "展開推文" expandTweet: "展開推文"
themeEditor: "主題編輯器" themeEditor: "主題編輯器"
description: "描述" description: "描述"
describeFile: "添加標題 "
enterFileDescription: "輸入標題 "
author: "作者" author: "作者"
leaveConfirm: "有未保存的更改。要放棄嗎?" leaveConfirm: "有未保存的更改。要放棄嗎?"
manage: "管理" manage: "管理"
@ -730,12 +738,35 @@ switch: "切換"
noMaintainerInformationWarning: "尚未設定管理員信息。" noMaintainerInformationWarning: "尚未設定管理員信息。"
noBotProtectionWarning: "尚未設定Bot防護。" noBotProtectionWarning: "尚未設定Bot防護。"
configure: "設定" configure: "設定"
postToGallery: "發佈到相簿"
gallery: "相簿"
recentPosts: "最新貼文"
popularPosts: "熱門的貼文"
ads: "廣告"
expiration: "期限" expiration: "期限"
memo: "備忘錄"
priority: "優先級"
high: "高"
middle: "中" middle: "中"
low: "低"
emailNotConfiguredWarning: "沒有設定電子郵件地址" emailNotConfiguredWarning: "沒有設定電子郵件地址"
ratio: "%"
global: "公開"
sent: "發送"
hashtags: "#tag"
_docs:
admin: "管理"
_ad: _ad:
back: "返回" back: "返回"
reduceFrequencyOfThisAd: "降低此廣告的頻率 "
_forgotPassword:
enterEmail: "請輸入您的帳戶註冊的電子郵件地址。 密碼重置連結將被發送到該電子郵件地址。"
ifNoEmail: "如果您還沒有註冊您的電子郵件地址,請聯繫管理員。 "
contactAdmin: "此實例不支持電子郵件,請聯繫您的管理員重置您的密碼。 "
_gallery: _gallery:
my: "我的貼文"
liked: "喜歡的貼文"
like: "讚"
unlike: "收回喜歡" unlike: "收回喜歡"
_email: _email:
_follow: _follow:
@ -776,6 +807,7 @@ _mfm:
url: "URL" url: "URL"
urlDescription: "可以展示URL位址。" urlDescription: "可以展示URL位址。"
link: "鏈接" link: "鏈接"
linkDescription: "您可以將特定範圍的文章與 URL 相關聯。 "
bold: "粗體" bold: "粗體"
small: "縮小" small: "縮小"
center: "置中" center: "置中"
@ -786,7 +818,9 @@ _mfm:
blockMath: "數學公式(方塊)" blockMath: "數學公式(方塊)"
quote: "引用" quote: "引用"
emoji: "自訂表情符號" emoji: "自訂表情符號"
emojiDescription: "您可以通過將自定義表情符號名稱括在冒號中來顯示自定義表情符號。 "
search: "搜尋" search: "搜尋"
searchDescription: "您可以顯示所輸入的搜索框。"
flip: "翻轉" flip: "翻轉"
flipDescription: "將內容上下或左右翻轉。" flipDescription: "將內容上下或左右翻轉。"
jelly: "動畫(果凍)" jelly: "動畫(果凍)"
@ -855,9 +889,7 @@ _channel:
following: "關注中" following: "關注中"
usersCount: "有{n}人參與" usersCount: "有{n}人參與"
notesCount: "有{n}個貼文" notesCount: "有{n}個貼文"
_sidebar: _menuDisplay:
full: "全部"
icon: "大頭貼"
hide: "隱藏" hide: "隱藏"
_wordMute: _wordMute:
muteWords: "加入靜音文字" muteWords: "加入靜音文字"
@ -879,17 +911,27 @@ _theme:
constant: "常數" constant: "常數"
defaultValue: "預設值" defaultValue: "預設值"
color: "顏色" color: "顏色"
refProp: "查看屬性 "
key: "按鍵"
func: "函数" func: "函数"
funcKind: "功能類型" funcKind: "功能類型"
argument: "參數" argument: "參數"
basedProp: "要基於的屬性的名稱 "
alpha: "透明度" alpha: "透明度"
darken: "暗度" darken: "暗度"
lighten: "亮度" lighten: "亮度"
keys: keys:
accent: "重點色彩"
bg: "背景" bg: "背景"
fg: "文本" fg: "文本"
focus: "聚焦"
indicator: "指標"
panel: "面板" panel: "面板"
shadow: "陰影" shadow: "陰影"
header: "標題"
navBg: "側邊欄的背景 "
navFg: "側邊欄的文字"
navHoverFg: "側邊欄文字(懸停) "
navActive: "側邊欄文本 (活動)" navActive: "側邊欄文本 (活動)"
navIndicator: "側邊欄指示符" navIndicator: "側邊欄指示符"
link: "鏈接" link: "鏈接"
@ -971,6 +1013,7 @@ _tutorial:
_2fa: _2fa:
alreadyRegistered: "此設備已經被註冊過了" alreadyRegistered: "此設備已經被註冊過了"
registerDevice: "註冊裝置" registerDevice: "註冊裝置"
registerKey: "註冊鍵"
step1: "首先,在您的設備上安裝二步驗證程式,例如{a}或{b}。" step1: "首先,在您的設備上安裝二步驗證程式,例如{a}或{b}。"
step2: "然後掃描螢幕上的QR code。" step2: "然後掃描螢幕上的QR code。"
_permissions: _permissions:
@ -1040,6 +1083,7 @@ _widgets:
button: "按鈕" button: "按鈕"
onlineUsers: "線上的用戶" onlineUsers: "線上的用戶"
jobQueue: "佇列" jobQueue: "佇列"
serverMetric: "服務器指標 "
_cw: _cw:
hide: "隱藏" hide: "隱藏"
show: "瀏覽更多" show: "瀏覽更多"
@ -1053,6 +1097,7 @@ _poll:
expiration: "期限" expiration: "期限"
infinite: "無期限" infinite: "無期限"
at: "結束時間" at: "結束時間"
after: "進度指定 "
deadlineDate: "截止日期" deadlineDate: "截止日期"
deadlineTime: "小時" deadlineTime: "小時"
duration: "時長" duration: "時長"
@ -1067,6 +1112,7 @@ _poll:
remainingSeconds: "{s}秒後截止" remainingSeconds: "{s}秒後截止"
_visibility: _visibility:
public: "公開" public: "公開"
publicDescription: "發布給所有用戶 "
home: "首頁" home: "首頁"
followers: "追隨者" followers: "追隨者"
specified: "指定使用者" specified: "指定使用者"
@ -1180,6 +1226,7 @@ _rooms:
cube: "立方體" cube: "立方體"
tv: "電視" tv: "電視"
pinguin: "企鵝蠟像" pinguin: "企鵝蠟像"
rubik-cube: "魔術方塊"
poster-h: "海報(橫向)" poster-h: "海報(橫向)"
poster-v: "海報(直向)" poster-v: "海報(直向)"
sofa: " 沙發" sofa: " 沙發"
@ -1242,6 +1289,7 @@ _pages:
post: "發佈窗口" post: "發佈窗口"
_post: _post:
text: "内容" text: "内容"
attachCanvasImage: "附加相簿圖像 "
canvasId: "畫布ID" canvasId: "畫布ID"
textInput: "插入字串" textInput: "插入字串"
_textInput: _textInput:
@ -1266,6 +1314,7 @@ _pages:
note: "嵌式貼文" note: "嵌式貼文"
_note: _note:
id: "貼文ID" id: "貼文ID"
idDescription: "您也可以粘貼筆記 URL 並進行設置。 "
detailed: "顯示詳細內容" detailed: "顯示詳細內容"
switch: "開關" switch: "開關"
_switch: _switch:
@ -1282,12 +1331,15 @@ _pages:
colored: "彩色" colored: "彩色"
action: "按下按鈕後發生的行為" action: "按下按鈕後發生的行為"
_action: _action:
dialog: "顯示對話框 "
_dialog: _dialog:
content: "内容" content: "内容"
resetRandom: "重設亂數" resetRandom: "重設亂數"
pushEvent: "發送事件" pushEvent: "發送事件"
_pushEvent: _pushEvent:
event: "事件名稱" event: "事件名稱"
message: "按下時顯示的消息 "
variable: "要發送的變數"
no-variable: "沒有" no-variable: "沒有"
callAiScript: "調用AiScript" callAiScript: "調用AiScript"
_callAiScript: _callAiScript:
@ -1296,6 +1348,7 @@ _pages:
_radioButton: _radioButton:
name: "變數名稱" name: "變數名稱"
title: "標題" title: "標題"
values: "由換行符分隔的選項"
default: "預設值" default: "預設值"
script: script:
categories: categories:
@ -1313,6 +1366,8 @@ _pages:
text: "字串" text: "字串"
multiLineText: "字串(多行)" multiLineText: "字串(多行)"
textList: "字串串列" textList: "字串串列"
_textList:
info: "請分開每個換行符 "
strLen: "字串長度" strLen: "字串長度"
_strLen: _strLen:
arg1: "字串" arg1: "字串"
@ -1323,6 +1378,8 @@ _pages:
strReplace: "替換字串" strReplace: "替換字串"
_strReplace: _strReplace:
arg1: "字串" arg1: "字串"
arg2: "替換前"
arg3: "替換後"
strReverse: "倒轉字串" strReverse: "倒轉字串"
_strReverse: _strReverse:
arg1: "字串" arg1: "字串"
@ -1389,6 +1446,7 @@ _pages:
_if: _if:
arg1: "如果" arg1: "如果"
arg2: "如果" arg2: "如果"
arg3: "除此以外 "
not: "否" not: "否"
_not: _not:
arg1: "否" arg1: "否"
@ -1399,13 +1457,17 @@ _pages:
_rannum: _rannum:
arg1: "下限" arg1: "下限"
arg2: "上限" arg2: "上限"
randomPick: "從列表中隨機選擇 "
_randomPick: _randomPick:
arg1: "清單" arg1: "清單"
dailyRandom: "隨機(使用者每日變化 )"
_dailyRandom: _dailyRandom:
arg1: "機率" arg1: "機率"
dailyRannum: "亂數(使用者每日變化)"
_dailyRannum: _dailyRannum:
arg1: "下限" arg1: "下限"
arg2: "上限" arg2: "上限"
dailyRandomPick: "從列表中隨機選擇(使用者每日變化 "
_dailyRandomPick: _dailyRandomPick:
arg1: "清單" arg1: "清單"
seedRandom: "隨機抽選種子碼" seedRandom: "隨機抽選種子碼"
@ -1444,7 +1506,10 @@ _pages:
aiScriptVar: "AiScript的變數" aiScriptVar: "AiScript的變數"
fn: "函数" fn: "函数"
_fn: _fn:
slots: "欄位"
slots-info: "用換行符分隔每個欄位"
arg1: "輸出" arg1: "輸出"
for: "重複 "
_for: _for:
arg1: "重複次數" arg1: "重複次數"
arg2: "處理" arg2: "處理"
@ -1454,13 +1519,16 @@ _pages:
boolean: "標記" boolean: "標記"
array: "清單" array: "清單"
stringArray: "字串列表" stringArray: "字串列表"
emptySlot: "空欄位"
enviromentVariables: "環境變數" enviromentVariables: "環境變數"
pageVariables: "頁面元素" pageVariables: "頁面元素"
argVariables: "輸入欄位"
_relayStatus: _relayStatus:
requesting: "等待核准" requesting: "等待核准"
accepted: "已通過核准" accepted: "已通過核准"
rejected: "已拒絕" rejected: "已拒絕"
_notification: _notification:
fileUploaded: "上傳檔案成功。"
youGotMention: "{name}提及到您" youGotMention: "{name}提及到您"
youGotReply: "{name}回覆了您" youGotReply: "{name}回覆了您"
youGotQuote: "{name}引用了您" youGotQuote: "{name}引用了您"

View File

@ -0,0 +1,13 @@
import {MigrationInterface, QueryRunner} from "typeorm";
export class userProfileDescriptionLength1622679304522 implements MigrationInterface {
name = 'userProfileDescriptionLength1622679304522';
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "description" TYPE character varying(2048)`, undefined);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "description" TYPE character varying(1024)`, undefined);
}
}

View File

@ -0,0 +1,12 @@
import {MigrationInterface, QueryRunner} from "typeorm";
export class logMessageLength1622681548499 implements MigrationInterface {
name = 'logMessageLength1622681548499';
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`ALTER TABLE "log" ALTER COLUMN "message" TYPE character varying(2048)`, undefined);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`ALTER TABLE "log" ALTER COLUMN "message" TYPE character varying(1024)`, undefined);
}
}

View File

@ -1,7 +1,7 @@
{ {
"name": "misskey", "name": "misskey",
"author": "syuilo <syuilotan@yahoo.co.jp>", "author": "syuilo <syuilotan@yahoo.co.jp>",
"version": "12.82.0", "version": "12.85.1",
"codename": "indigo", "codename": "indigo",
"repository": { "repository": {
"type": "git", "type": "git",
@ -30,14 +30,11 @@
"format": "gulp format" "format": "gulp format"
}, },
"resolutions": { "resolutions": {
"mfm-js/twemoji-parser": "13.1.x",
"chokidar": "^3.3.1", "chokidar": "^3.3.1",
"constantinople": "^4.0.1", "lodash": "^4.17.21"
"jsonld/rdf-canonize/node-forge": "0.10.0",
"lodash": "^4.17.20"
}, },
"dependencies": { "dependencies": {
"@babel/plugin-transform-runtime": "7.14.3", "@babel/plugin-transform-runtime": "7.14.5",
"@elastic/elasticsearch": "7.11.0", "@elastic/elasticsearch": "7.11.0",
"@koa/cors": "3.1.0", "@koa/cors": "3.1.0",
"@koa/multer": "3.0.0", "@koa/multer": "3.0.0",
@ -47,94 +44,94 @@
"@sinonjs/fake-timers": "7.1.2", "@sinonjs/fake-timers": "7.1.2",
"@syuilo/aiscript": "0.11.1", "@syuilo/aiscript": "0.11.1",
"@types/bcryptjs": "2.4.2", "@types/bcryptjs": "2.4.2",
"@types/bull": "3.15.1", "@types/bull": "3.15.2",
"@types/cbor": "6.0.0", "@types/cbor": "6.0.0",
"@types/dateformat": "3.0.1", "@types/dateformat": "3.0.1",
"@types/escape-regexp": "0.0.0", "@types/escape-regexp": "0.0.0",
"@types/glob": "7.1.3", "@types/glob": "7.1.4",
"@types/gulp": "4.0.8", "@types/gulp": "4.0.9",
"@types/gulp-rename": "2.0.0", "@types/gulp-rename": "2.0.1",
"@types/is-url": "1.2.29", "@types/is-url": "1.2.30",
"@types/js-yaml": "4.0.1", "@types/js-yaml": "4.0.2",
"@types/jsdom": "16.2.10", "@types/jsdom": "16.2.13",
"@types/jsonld": "1.5.5", "@types/jsonld": "1.5.6",
"@types/katex": "0.11.0", "@types/katex": "0.11.1",
"@types/koa": "2.13.3", "@types/koa": "2.13.4",
"@types/koa-bodyparser": "4.3.0", "@types/koa-bodyparser": "4.3.2",
"@types/koa-cors": "0.0.0", "@types/koa-cors": "0.0.1",
"@types/koa-favicon": "2.0.19", "@types/koa-favicon": "2.0.21",
"@types/koa-logger": "3.1.1", "@types/koa-logger": "3.1.1",
"@types/koa-mount": "4.0.0", "@types/koa-mount": "4.0.0",
"@types/koa-send": "4.1.2", "@types/koa-send": "4.1.3",
"@types/koa-views": "7.0.0", "@types/koa-views": "7.0.0",
"@types/koa__cors": "3.0.2", "@types/koa__cors": "3.0.3",
"@types/koa__multer": "2.0.2", "@types/koa__multer": "2.0.3",
"@types/koa__router": "8.0.4", "@types/koa__router": "8.0.7",
"@types/markdown-it": "12.0.1", "@types/markdown-it": "12.0.3",
"@types/matter-js": "0.14.12", "@types/matter-js": "0.17.3",
"@types/mocha": "8.2.2", "@types/mocha": "8.2.3",
"@types/node": "15.6.1", "@types/node": "16.3.3",
"@types/node-fetch": "2.5.10", "@types/node-fetch": "2.5.11",
"@types/nodemailer": "6.4.2", "@types/nodemailer": "6.4.4",
"@types/nprogress": "0.2.0", "@types/nprogress": "0.2.0",
"@types/oauth": "0.9.1", "@types/oauth": "0.9.1",
"@types/parse5": "6.0.0", "@types/parse5": "6.0.1",
"@types/parsimmon": "1.10.6", "@types/parsimmon": "1.10.6",
"@types/portscanner": "2.1.0", "@types/portscanner": "2.1.1",
"@types/pug": "2.0.4", "@types/pug": "2.0.5",
"@types/punycode": "2.1.0", "@types/punycode": "2.1.0",
"@types/qrcode": "1.4.0", "@types/qrcode": "1.4.1",
"@types/random-seed": "0.3.3", "@types/random-seed": "0.3.3",
"@types/ratelimiter": "3.4.1", "@types/ratelimiter": "3.4.2",
"@types/redis": "2.8.29", "@types/redis": "2.8.31",
"@types/rename": "1.0.3", "@types/rename": "1.0.4",
"@types/request-stats": "3.0.0", "@types/request-stats": "3.0.0",
"@types/rimraf": "3.0.0", "@types/rimraf": "3.0.1",
"@types/seedrandom": "2.4.28", "@types/seedrandom": "2.4.28",
"@types/sharp": "0.28.2", "@types/sharp": "0.28.4",
"@types/sinonjs__fake-timers": "6.0.2", "@types/sinonjs__fake-timers": "6.0.3",
"@types/speakeasy": "2.0.5", "@types/speakeasy": "2.0.6",
"@types/throttle-debounce": "2.1.0", "@types/throttle-debounce": "2.1.0",
"@types/tinycolor2": "1.4.2", "@types/tinycolor2": "1.4.3",
"@types/tmp": "0.2.0", "@types/tmp": "0.2.1",
"@types/uuid": "8.3.0", "@types/uuid": "8.3.1",
"@types/web-push": "3.3.0", "@types/web-push": "3.3.2",
"@types/webpack": "5.28.0", "@types/webpack": "5.28.0",
"@types/webpack-stream": "3.2.12", "@types/webpack-stream": "3.2.12",
"@types/websocket": "1.0.2", "@types/websocket": "1.0.3",
"@types/ws": "7.4.4", "@types/ws": "7.4.6",
"@typescript-eslint/parser": "4.25.0", "@typescript-eslint/parser": "4.28.3",
"@vue/compiler-sfc": "3.0.11", "@vue/compiler-sfc": "3.1.5",
"abort-controller": "3.0.0", "abort-controller": "3.0.0",
"apexcharts": "3.26.3", "apexcharts": "3.27.2",
"autobind-decorator": "2.4.0", "autobind-decorator": "2.4.0",
"autosize": "4.0.4", "autosize": "4.0.4",
"autwh": "0.1.0", "autwh": "0.1.0",
"aws-sdk": "2.918.0", "aws-sdk": "2.948.0",
"bcryptjs": "2.4.3", "bcryptjs": "2.4.3",
"blurhash": "1.1.3", "blurhash": "1.1.3",
"broadcast-channel": "3.6.0", "broadcast-channel": "3.7.0",
"bull": "3.22.6", "bull": "3.26.0",
"cafy": "15.2.1", "cafy": "15.2.1",
"cbor": "7.0.5", "cbor": "7.0.6",
"chalk": "4.1.1", "chalk": "4.1.1",
"chart.js": "2.9.4", "chart.js": "2.9.4",
"cli-highlight": "2.1.11", "cli-highlight": "2.1.11",
"commander": "7.2.0", "commander": "7.2.0",
"concurrently": "6.2.0", "concurrently": "6.2.0",
"content-disposition": "0.5.3", "content-disposition": "0.5.3",
"core-js": "3.13.1", "core-js": "3.15.2",
"crc-32": "1.2.0", "crc-32": "1.2.0",
"css-loader": "5.2.6", "css-loader": "6.0.0",
"cssnano": "5.0.5", "cssnano": "5.0.6",
"dateformat": "4.5.1", "dateformat": "4.5.1",
"diskusage": "1.1.3", "diskusage": "1.1.3",
"escape-regexp": "0.0.1", "escape-regexp": "0.0.1",
"eslint": "7.27.0", "eslint": "7.30.0",
"eslint-plugin-vue": "7.10.0", "eslint-plugin-vue": "7.13.0",
"eventemitter3": "4.0.7", "eventemitter3": "4.0.7",
"feed": "4.2.2", "feed": "4.2.2",
"file-type": "16.5.0", "file-type": "16.5.1",
"fluent-ffmpeg": "2.1.2", "fluent-ffmpeg": "2.1.2",
"glob": "7.1.7", "glob": "7.1.7",
"got": "11.8.2", "got": "11.8.2",
@ -157,7 +154,7 @@
"jsdom": "16.6.0", "jsdom": "16.6.0",
"json5": "2.2.0", "json5": "2.2.0",
"json5-loader": "4.0.1", "json5-loader": "4.0.1",
"jsonld": "4.0.1", "jsonld": "5.2.0",
"jsrsasign": "8.0.20", "jsrsasign": "8.0.20",
"katex": "0.13.11", "katex": "0.13.11",
"koa": "2.13.1", "koa": "2.13.1",
@ -171,27 +168,27 @@
"koa-views": "7.0.1", "koa-views": "7.0.1",
"langmap": "0.0.16", "langmap": "0.0.16",
"lookup-dns-cache": "2.1.0", "lookup-dns-cache": "2.1.0",
"markdown-it": "12.0.6", "markdown-it": "12.1.0",
"markdown-it-anchor": "7.1.0", "markdown-it-anchor": "7.1.0",
"matter-js": "0.17.1", "matter-js": "0.17.1",
"mfm-js": "0.16.4", "mfm-js": "0.19.0",
"misskey-js": "0.0.2", "misskey-js": "0.0.6",
"mocha": "8.4.0", "mocha": "8.4.0",
"moji": "0.5.1", "moji": "0.5.1",
"ms": "2.1.3", "ms": "2.1.3",
"multer": "1.4.2", "multer": "1.4.2",
"nested-property": "4.0.0", "nested-property": "4.0.0",
"node-fetch": "2.6.1", "node-fetch": "2.6.1",
"nodemailer": "6.6.1", "nodemailer": "6.6.3",
"object-assign-deep": "0.4.0", "object-assign-deep": "0.4.0",
"os-utils": "0.0.14", "os-utils": "0.0.14",
"parse5": "6.0.1", "parse5": "6.0.1",
"pg": "8.6.0", "pg": "8.6.0",
"portscanner": "2.2.0", "portscanner": "2.2.0",
"postcss": "8.3.0", "postcss": "8.3.5",
"postcss-loader": "5.3.0", "postcss-loader": "6.1.1",
"prismjs": "1.23.0", "prismjs": "1.24.1",
"probe-image-size": "7.1.1", "probe-image-size": "7.2.1",
"promise-limit": "2.7.0", "promise-limit": "2.7.0",
"promise-sequential": "1.1.1", "promise-sequential": "1.1.1",
"pug": "3.0.2", "pug": "3.0.2",
@ -212,49 +209,49 @@
"rimraf": "3.0.2", "rimraf": "3.0.2",
"rndstr": "1.0.0", "rndstr": "1.0.0",
"s-age": "1.1.2", "s-age": "1.1.2",
"sass": "1.34.0", "sass": "1.35.2",
"sass-loader": "11.1.1", "sass-loader": "12.1.0",
"seedrandom": "3.0.5", "seedrandom": "3.0.5",
"sharp": "0.28.3", "sharp": "0.28.3",
"speakeasy": "2.0.0", "speakeasy": "2.0.0",
"stringz": "2.1.0", "stringz": "2.1.0",
"style-loader": "2.0.0", "style-loader": "3.1.0",
"summaly": "2.4.0", "summaly": "2.4.0",
"syslog-pro": "1.0.0", "syslog-pro": "1.0.0",
"systeminformation": "5.7.4", "systeminformation": "5.7.7",
"syuilo-password-strength": "0.0.1", "syuilo-password-strength": "0.0.1",
"textarea-caret": "3.1.0", "textarea-caret": "3.1.0",
"three": "0.117.1", "three": "0.117.1",
"throttle-debounce": "3.0.1", "throttle-debounce": "3.0.1",
"tinycolor2": "1.4.2", "tinycolor2": "1.4.2",
"tmp": "0.2.1", "tmp": "0.2.1",
"ts-loader": "9.2.2", "ts-loader": "9.2.3",
"ts-node": "10.0.0", "ts-node": "10.1.0",
"tsc-alias": "1.2.11", "tsc-alias": "1.3.7",
"tsconfig-paths": "3.9.0", "tsconfig-paths": "3.10.1",
"tslint": "6.1.3", "tslint": "6.1.3",
"tslint-sonarts": "1.9.0", "tslint-sonarts": "1.9.0",
"twemoji-parser": "13.1.0", "twemoji-parser": "13.1.0",
"typeorm": "0.2.32", "typeorm": "0.2.32",
"typescript": "4.3.2", "typescript": "4.3.5",
"ulid": "2.3.0", "ulid": "2.3.0",
"uuid": "8.3.2", "uuid": "8.3.2",
"v-debounce": "0.1.2", "v-debounce": "0.1.2",
"vanilla-tilt": "1.7.0", "vanilla-tilt": "1.7.0",
"vue": "3.0.11", "vue": "3.1.5",
"vue-color": "2.8.1", "vue-color": "2.8.1",
"vue-json-pretty": "1.7.1", "vue-json-pretty": "1.8.1",
"vue-loader": "16.1.2", "vue-loader": "16.3.1",
"vue-prism-editor": "2.0.0-alpha.2", "vue-prism-editor": "2.0.0-alpha.2",
"vue-router": "4.0.5", "vue-router": "4.0.5",
"vue-style-loader": "4.1.3", "vue-style-loader": "4.1.3",
"vue-svg-loader": "0.17.0-beta.2", "vue-svg-loader": "0.17.0-beta.2",
"vuedraggable": "4.0.1", "vuedraggable": "4.0.1",
"web-push": "3.4.4", "web-push": "3.4.5",
"webpack": "5.38.1", "webpack": "5.45.1",
"webpack-cli": "4.7.0", "webpack-cli": "4.7.2",
"websocket": "1.0.34", "websocket": "1.0.34",
"ws": "7.4.6", "ws": "7.5.3",
"xev": "2.0.1" "xev": "2.0.1"
}, },
"devDependencies": { "devDependencies": {

View File

@ -8,6 +8,8 @@ import { unisonReload } from '@client/scripts/unison-reload';
type Account = { type Account = {
id: string; id: string;
token: string; token: string;
isModerator: boolean;
isAdmin: boolean;
}; };
const data = localStorage.getItem('account'); const data = localStorage.getItem('account');
@ -45,7 +47,7 @@ function fetchAccount(token): Promise<Account> {
}) })
.then(res => { .then(res => {
// When failed to authenticate user // When failed to authenticate user
if (res.status !== 200 && res.status < 500) { if (res.status >= 400 && res.status < 500) {
return signout(); return signout();
} }

View File

@ -10,9 +10,9 @@
</template> </template>
<div class="dpvffvvy _monolithic_"> <div class="dpvffvvy _monolithic_">
<div class="_section"> <div class="_section">
<MkTextarea v-model:value="comment"> <MkTextarea v-model="comment">
<span>{{ $ts.details }}</span> <template #label>{{ $ts.details }}</template>
<template #desc>{{ $ts.fillAbuseReportDescription }}</template> <template #caption>{{ $ts.fillAbuseReportDescription }}</template>
</MkTextarea> </MkTextarea>
</div> </div>
<div class="_section"> <div class="_section">

View File

@ -5,7 +5,8 @@
:cy="5 - (Math.cos(angle) * (5 - graduationsPadding))" :cy="5 - (Math.cos(angle) * (5 - graduationsPadding))"
:r="i % 5 == 0 ? 0.125 : 0.05" :r="i % 5 == 0 ? 0.125 : 0.05"
:fill="i % 5 == 0 ? majorGraduationColor : minorGraduationColor" :fill="i % 5 == 0 ? majorGraduationColor : minorGraduationColor"
:key="i"/> :key="i"
/>
<line <line
:x1="5 - (Math.sin(sAngle) * (sHandLengthRatio * handsTailLength))" :x1="5 - (Math.sin(sAngle) * (sHandLengthRatio * handsTailLength))"
@ -13,7 +14,9 @@
:x2="5 + (Math.sin(sAngle) * ((sHandLengthRatio * 5) - handsPadding))" :x2="5 + (Math.sin(sAngle) * ((sHandLengthRatio * 5) - handsPadding))"
:y2="5 - (Math.cos(sAngle) * ((sHandLengthRatio * 5) - handsPadding))" :y2="5 - (Math.cos(sAngle) * ((sHandLengthRatio * 5) - handsPadding))"
:stroke="sHandColor" :stroke="sHandColor"
stroke-width="0.05"/> :stroke-width="thickness / 2"
stroke-linecap="round"
/>
<line <line
:x1="5 - (Math.sin(mAngle) * (mHandLengthRatio * handsTailLength))" :x1="5 - (Math.sin(mAngle) * (mHandLengthRatio * handsTailLength))"
@ -21,7 +24,9 @@
:x2="5 + (Math.sin(mAngle) * ((mHandLengthRatio * 5) - handsPadding))" :x2="5 + (Math.sin(mAngle) * ((mHandLengthRatio * 5) - handsPadding))"
:y2="5 - (Math.cos(mAngle) * ((mHandLengthRatio * 5) - handsPadding))" :y2="5 - (Math.cos(mAngle) * ((mHandLengthRatio * 5) - handsPadding))"
:stroke="mHandColor" :stroke="mHandColor"
stroke-width="0.1"/> :stroke-width="thickness"
stroke-linecap="round"
/>
<line <line
:x1="5 - (Math.sin(hAngle) * (hHandLengthRatio * handsTailLength))" :x1="5 - (Math.sin(hAngle) * (hHandLengthRatio * handsTailLength))"
@ -29,16 +34,24 @@
:x2="5 + (Math.sin(hAngle) * ((hHandLengthRatio * 5) - handsPadding))" :x2="5 + (Math.sin(hAngle) * ((hHandLengthRatio * 5) - handsPadding))"
:y2="5 - (Math.cos(hAngle) * ((hHandLengthRatio * 5) - handsPadding))" :y2="5 - (Math.cos(hAngle) * ((hHandLengthRatio * 5) - handsPadding))"
:stroke="hHandColor" :stroke="hHandColor"
stroke-width="0.1"/> :stroke-width="thickness"
stroke-linecap="round"
/>
</svg> </svg>
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent } from 'vue';
import * as tinycolor from 'tinycolor2'; import * as tinycolor from 'tinycolor2';
import * as os from '@client/os';
export default defineComponent({ export default defineComponent({
props: {
thickness: {
type: Number,
default: 0.1
}
},
data() { data() {
return { return {
now: new Date(), now: new Date(),

View File

@ -14,8 +14,8 @@
</div> </div>
<header v-if="title"><Mfm :text="title"/></header> <header v-if="title"><Mfm :text="title"/></header>
<div class="body" v-if="text"><Mfm :text="text"/></div> <div class="body" v-if="text"><Mfm :text="text"/></div>
<MkInput v-if="input" v-model:value="inputValue" autofocus :type="input.type || 'text'" :placeholder="input.placeholder" @keydown="onInputKeydown"></MkInput> <MkInput v-if="input" v-model="inputValue" autofocus :type="input.type || 'text'" :placeholder="input.placeholder" @keydown="onInputKeydown"></MkInput>
<MkSelect v-if="select" v-model:value="selectedValue" autofocus> <MkSelect v-if="select" v-model="selectedValue" autofocus>
<template v-if="select.items"> <template v-if="select.items">
<option v-for="item in select.items" :value="item.value">{{ item.text }}</option> <option v-for="item in select.items" :value="item.value">{{ item.text }}</option>
</template> </template>

View File

@ -114,7 +114,7 @@ export default defineComponent({
if (this.selectMode) { if (this.selectMode) {
this.$emit('chosen', this.file); this.$emit('chosen', this.file);
} else { } else {
os.modalMenu(this.getMenu(), ev.currentTarget || ev.target); os.popupMenu(this.getMenu(), ev.currentTarget || ev.target);
} }
}, },

View File

@ -10,6 +10,7 @@
<span class="separator" v-if="folder != null"><i class="fas fa-angle-right"></i></span> <span class="separator" v-if="folder != null"><i class="fas fa-angle-right"></i></span>
<span class="folder current" v-if="folder != null">{{ folder.name }}</span> <span class="folder current" v-if="folder != null">{{ folder.name }}</span>
</div> </div>
<button @click="showMenu" class="menu _button"><i class="fas fa-ellipsis-h"></i></button>
</nav> </nav>
<div class="main" :class="{ uploading: uploadings.length > 0, fetching }" <div class="main" :class="{ uploading: uploadings.length > 0, fetching }"
ref="main" ref="main"
@ -46,7 +47,7 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent, markRaw } from 'vue';
import XNavFolder from './drive.nav-folder.vue'; import XNavFolder from './drive.nav-folder.vue';
import XFolder from './drive.folder.vue'; import XFolder from './drive.folder.vue';
import XFile from './drive.file.vue'; import XFile from './drive.file.vue';
@ -139,7 +140,7 @@ export default defineComponent({
}); });
} }
this.connection = os.stream.useChannel('drive'); this.connection = markRaw(os.stream.useChannel('drive'));
this.connection.on('fileCreated', this.onStreamDriveFileCreated); this.connection.on('fileCreated', this.onStreamDriveFileCreated);
this.connection.on('fileUpdated', this.onStreamDriveFileUpdated); this.connection.on('fileUpdated', this.onStreamDriveFileUpdated);
@ -627,8 +628,12 @@ export default defineComponent({
}]; }];
}, },
onContextmenu(e) { showMenu(ev) {
os.contextMenu(this.getMenu(), e); os.popupMenu(this.getMenu(), ev.currentTarget || ev.target);
},
onContextmenu(ev) {
os.contextMenu(this.getMenu(), ev);
}, },
} }
}); });
@ -641,7 +646,7 @@ export default defineComponent({
height: 100%; height: 100%;
> nav { > nav {
display: block; display: flex;
z-index: 2; z-index: 2;
width: 100%; width: 100%;
padding: 0 8px; padding: 0 8px;
@ -696,6 +701,10 @@ export default defineComponent({
} }
} }
} }
> .menu {
margin-left: auto;
}
} }
> .main { > .main {

View File

@ -1,17 +1,17 @@
<template> <template>
<MkModal ref="modal" :manual-showing="manualShowing" :src="src" :front="true" @click="$refs.modal.close()" @opening="opening" @close="$emit('close')" @closed="$emit('closed')"> <MkPopup ref="popup" :manual-showing="manualShowing" :src="src" :front="true" @click="$refs.popup.close()" @opening="opening" @close="$emit('close')" @closed="$emit('closed')" #default="{point}">
<MkEmojiPicker :show-pinned="showPinned" :as-reaction-picker="asReactionPicker" @chosen="chosen" ref="picker"/> <MkEmojiPicker class="ryghynhb _popup _shadow" :class="{ pointer: point === 'top' }" :show-pinned="showPinned" :as-reaction-picker="asReactionPicker" @chosen="chosen" ref="picker"/>
</MkModal> </MkPopup>
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent, markRaw } from 'vue'; import { defineComponent, markRaw } from 'vue';
import MkModal from '@client/components/ui/modal.vue'; import MkPopup from '@client/components/ui/popup.vue';
import MkEmojiPicker from '@client/components/emoji-picker.vue'; import MkEmojiPicker from '@client/components/emoji-picker.vue';
export default defineComponent({ export default defineComponent({
components: { components: {
MkModal, MkPopup,
MkEmojiPicker, MkEmojiPicker,
}, },
@ -33,7 +33,7 @@ export default defineComponent({
}, },
}, },
emits: ['done', 'closed'], emits: ['done', 'close', 'closed'],
data() { data() {
return { return {
@ -44,7 +44,7 @@ export default defineComponent({
methods: { methods: {
chosen(emoji: any) { chosen(emoji: any) {
this.$emit('done', emoji); this.$emit('done', emoji);
this.$refs.modal.close(); this.$refs.popup.close();
}, },
opening() { opening() {
@ -56,145 +56,20 @@ export default defineComponent({
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.omfetrab { .ryghynhb {
$pad: 8px; &.pointer {
--eachSize: 40px; &:before {
--size: 8px;
display: flex; content: '';
flex-direction: column; display: block;
contain: content; position: absolute;
top: calc(0px - (var(--size) * 2));
&.big { left: 0;
--eachSize: 44px; right: 0;
} width: 0;
margin: auto;
&.w1 { border: solid var(--size) transparent;
width: calc((var(--eachSize) * 5) + (#{$pad} * 2)); border-bottom-color: var(--popup);
}
&.w2 {
width: calc((var(--eachSize) * 6) + (#{$pad} * 2));
}
&.w3 {
width: calc((var(--eachSize) * 7) + (#{$pad} * 2));
}
&.h1 {
--height: calc((var(--eachSize) * 4) + (#{$pad} * 2));
}
&.h2 {
--height: calc((var(--eachSize) * 6) + (#{$pad} * 2));
}
&.h3 {
--height: calc((var(--eachSize) * 8) + (#{$pad} * 2));
}
> .search {
width: 100%;
padding: 12px;
box-sizing: border-box;
font-size: 1em;
outline: none;
border: none;
background: transparent;
color: var(--fg);
&:not(.filled) {
order: 1;
z-index: 2;
box-shadow: 0px -1px 0 0px var(--divider);
}
}
> .emojis {
height: var(--height);
overflow-y: auto;
overflow-x: hidden;
scrollbar-width: none;
&::-webkit-scrollbar {
display: none;
}
> .index {
min-height: var(--height);
position: relative;
border-bottom: solid 0.5px var(--divider);
> .arrow {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
padding: 16px 0;
text-align: center;
opacity: 0.5;
pointer-events: none;
}
}
section {
> header {
position: sticky;
top: 0;
left: 0;
z-index: 1;
padding: 8px;
font-size: 12px;
}
> div {
padding: $pad;
> button {
position: relative;
padding: 0;
width: var(--eachSize);
height: var(--eachSize);
border-radius: 4px;
&:focus {
outline: solid 2px var(--focus);
z-index: 1;
}
&:hover {
background: rgba(0, 0, 0, 0.05);
}
&:active {
background: var(--accent);
box-shadow: inset 0 0.15em 0.3em rgba(27, 31, 35, 0.15);
}
> * {
font-size: 24px;
height: 1.25em;
vertical-align: -.25em;
pointer-events: none;
}
}
}
&.result {
border-bottom: solid 0.5px var(--divider);
&:empty {
display: none;
}
}
&.unicode {
min-height: 384px;
}
&.custom {
min-height: 64px;
}
} }
} }
} }

View File

@ -1,5 +1,5 @@
<template> <template>
<div class="omfetrab _popup" :class="['w' + width, 'h' + height, { big }]"> <div class="omfetrab" :class="['w' + width, 'h' + height, { big }]">
<input ref="search" class="search" data-prevent-emoji-insert :class="{ filled: q != null && q != '' }" v-model.trim="q" :placeholder="$ts.search" @paste.stop="paste" @keyup.enter="done()"> <input ref="search" class="search" data-prevent-emoji-insert :class="{ filled: q != null && q != '' }" v-model.trim="q" :placeholder="$ts.search" @paste.stop="paste" @keyup.enter="done()">
<div class="emojis" ref="emojis"> <div class="emojis" ref="emojis">
<section class="result"> <section class="result">
@ -346,7 +346,6 @@ export default defineComponent({
display: flex; display: flex;
flex-direction: column; flex-direction: column;
contain: content;
&.big { &.big {
--eachSize: 44px; --eachSize: 44px;

View File

@ -1,7 +1,5 @@
<template> <template>
<div class="xfbouadm" v-if="meta" :style="{ backgroundImage: `url(${ meta.backgroundImageUrl })` }"> <div class="xfbouadm" v-if="meta" :style="{ backgroundImage: `url(${ meta.backgroundImageUrl })` }"></div>
</div>
</template> </template>
<script lang="ts"> <script lang="ts">

View File

@ -28,7 +28,7 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent, markRaw } from 'vue';
import * as os from '@client/os'; import * as os from '@client/os';
export default defineComponent({ export default defineComponent({
@ -71,7 +71,7 @@ export default defineComponent({
}, },
mounted() { mounted() {
this.connection = os.stream.useChannel('main'); this.connection = markRaw(os.stream.useChannel('main'));
this.connection.on('follow', this.onFollowChange); this.connection.on('follow', this.onFollowChange);
this.connection.on('unfollow', this.onFollowChange); this.connection.on('unfollow', this.onFollowChange);

View File

@ -9,14 +9,14 @@
<form class="_monolithic_" @submit.prevent="onSubmit" v-if="$instance.enableEmail"> <form class="_monolithic_" @submit.prevent="onSubmit" v-if="$instance.enableEmail">
<div class="_section"> <div class="_section">
<MkInput v-model:value="username" type="text" pattern="^[a-zA-Z0-9_]+$" spellcheck="false" autofocus required> <MkInput v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" spellcheck="false" autofocus required>
<span>{{ $ts.username }}</span> <template #label>{{ $ts.username }}</template>
<template #prefix>@</template> <template #prefix>@</template>
</MkInput> </MkInput>
<MkInput v-model:value="email" type="email" spellcheck="false" required> <MkInput v-model="email" type="email" spellcheck="false" required>
<span>{{ $ts.emailAddress }}</span> <template #label>{{ $ts.emailAddress }}</template>
<template #desc>{{ $ts._forgotPassword.enterEmail }}</template> <template #caption>{{ $ts._forgotPassword.enterEmail }}</template>
</MkInput> </MkInput>
<MkButton type="submit" :disabled="processing" primary style="margin: 0 auto;">{{ $ts.send }}</MkButton> <MkButton type="submit" :disabled="processing" primary style="margin: 0 auto;">{{ $ts.send }}</MkButton>

View File

@ -34,6 +34,10 @@
<template #label><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $ts.optional }})</span></template> <template #label><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $ts.optional }})</span></template>
<option v-for="item in form[item].enum" :value="item.value" :key="item.value">{{ item.label }}</option> <option v-for="item in form[item].enum" :value="item.value" :key="item.value">{{ item.label }}</option>
</FormSelect> </FormSelect>
<FormRadios v-else-if="form[item].type === 'radio'" v-model="values[item]">
<template #desc><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $ts.optional }})</span></template>
<option v-for="item in form[item].options" :value="item.value" :key="item.value">{{ item.label }}</option>
</FormRadios>
<FormRange v-else-if="form[item].type === 'range'" v-model:value="values[item]" :min="form[item].mim" :max="form[item].max" :step="form[item].step"> <FormRange v-else-if="form[item].type === 'range'" v-model:value="values[item]" :min="form[item].mim" :max="form[item].max" :step="form[item].step">
<template #label><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $ts.optional }})</span></template> <template #label><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $ts.optional }})</span></template>
<template v-if="form[item].description" #desc>{{ form[item].description }}</template> <template v-if="form[item].description" #desc>{{ form[item].description }}</template>
@ -56,6 +60,7 @@ import FormSwitch from './form/switch.vue';
import FormSelect from './form/select.vue'; import FormSelect from './form/select.vue';
import FormRange from './form/range.vue'; import FormRange from './form/range.vue';
import FormButton from './form/button.vue'; import FormButton from './form/button.vue';
import FormRadios from './form/radios.vue';
export default defineComponent({ export default defineComponent({
components: { components: {
@ -67,6 +72,7 @@ export default defineComponent({
FormSelect, FormSelect,
FormRange, FormRange,
FormButton, FormButton,
FormRadios,
}, },
props: { props: {

View File

@ -27,7 +27,10 @@ export default defineComponent({
}, },
render() { render() {
const label = this.$slots.desc(); const label = this.$slots.desc();
const options = this.$slots.default(); let options = this.$slots.default();
// なぜかFragmentになることがあるため
if (options.length === 1 && options[0].props == null) options = options[0].children;
return h('div', { return h('div', {
class: 'cnklmpwm _formItem' class: 'cnklmpwm _formItem'
@ -37,7 +40,7 @@ export default defineComponent({
}, label), }, label),
...options.map(option => h('button', { ...options.map(option => h('button', {
class: '_button _formPanel _formClickable', class: '_button _formPanel _formClickable',
key: option.props.value, key: option.key,
onClick: () => this.value = option.props.value, onClick: () => this.value = option.props.value,
}, [h('span', { }, [h('span', {
class: ['check', { checked: this.value === option.props.value }], class: ['check', { checked: this.value === option.props.value }],

View File

@ -1,9 +1,9 @@
<template> <template>
<span class="eiwwqkts _noSelect" :class="{ cat }" :title="acct(user)" v-if="disableLink" v-user-preview="disablePreview ? undefined : user.id" @click="onClick"> <span class="eiwwqkts _noSelect" :class="{ cat, square: $store.state.squareAvatars }" :title="acct(user)" v-if="disableLink" v-user-preview="disablePreview ? undefined : user.id" @click="onClick">
<img class="inner" :src="url" decoding="async"/> <img class="inner" :src="url" decoding="async"/>
<MkUserOnlineIndicator v-if="showIndicator" class="indicator" :user="user"/> <MkUserOnlineIndicator v-if="showIndicator" class="indicator" :user="user"/>
</span> </span>
<MkA class="eiwwqkts _noSelect" :class="{ cat }" :to="userPage(user)" :title="acct(user)" :target="target" v-else v-user-preview="disablePreview ? undefined : user.id"> <MkA class="eiwwqkts _noSelect" :class="{ cat, square: $store.state.squareAvatars }" :to="userPage(user)" :title="acct(user)" :target="target" v-else v-user-preview="disablePreview ? undefined : user.id">
<img class="inner" :src="url" decoding="async"/> <img class="inner" :src="url" decoding="async"/>
<MkUserOnlineIndicator v-if="showIndicator" class="indicator" :user="user"/> <MkUserOnlineIndicator v-if="showIndicator" class="indicator" :user="user"/>
</MkA> </MkA>
@ -81,28 +81,6 @@ export default defineComponent({
border-radius: 100%; border-radius: 100%;
line-height: 16px; line-height: 16px;
&.cat {
&:before, &:after {
background: #df548f;
border: solid 4px currentColor;
box-sizing: border-box;
content: '';
display: inline-block;
height: 50%;
width: 50%;
}
&:before {
border-radius: 0 75% 75%;
transform: rotate(37.5deg) skew(30deg);
}
&:after {
border-radius: 75% 0 75% 75%;
transform: rotate(-37.5deg) skew(-30deg);
}
}
> .inner { > .inner {
position: absolute; position: absolute;
bottom: 0; bottom: 0;
@ -125,5 +103,35 @@ export default defineComponent({
width: 20%; width: 20%;
height: 20%; height: 20%;
} }
&.square {
border-radius: 20%;
> .inner {
border-radius: 20%;
}
}
&.cat {
&:before, &:after {
background: #df548f;
border: solid 4px currentColor;
box-sizing: border-box;
content: '';
display: inline-block;
height: 50%;
width: 50%;
}
&:before {
border-radius: 0 75% 75%;
transform: rotate(37.5deg) skew(30deg);
}
&:after {
border-radius: 75% 0 75% 75%;
transform: rotate(-37.5deg) skew(-30deg);
}
}
} }
</style> </style>

View File

@ -117,6 +117,11 @@ export default defineComponent({
75% { transform: scale3d(1.05, 0.95, 1); } 75% { transform: scale3d(1.05, 0.95, 1); }
to { transform: scale3d(1, 1, 1); } to { transform: scale3d(1, 1, 1); }
} }
@keyframes mfm-rainbow {
0% { filter: hue-rotate(0deg) contrast(150%) saturate(150%); }
100% { filter: hue-rotate(360deg) contrast(150%) saturate(150%); }
}
</style> </style>
<style lang="scss" scoped> <style lang="scss" scoped>

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="zbcjwnqg" style="margin-top: -8px;"> <div class="zbcjwnqg" style="margin-top: -8px;">
<div class="selects" style="display: flex;"> <div class="selects" style="display: flex;">
<MkSelect v-model:value="chartSrc" style="margin: 0; flex: 1;"> <MkSelect v-model="chartSrc" style="margin: 0; flex: 1;">
<optgroup :label="$ts.federation"> <optgroup :label="$ts.federation">
<option value="federation-instances">{{ $ts._charts.federationInstancesIncDec }}</option> <option value="federation-instances">{{ $ts._charts.federationInstancesIncDec }}</option>
<option value="federation-instances-total">{{ $ts._charts.federationInstancesTotal }}</option> <option value="federation-instances-total">{{ $ts._charts.federationInstancesTotal }}</option>
@ -24,7 +24,7 @@
<option value="drive-total">{{ $ts._charts.storageUsageTotal }}</option> <option value="drive-total">{{ $ts._charts.storageUsageTotal }}</option>
</optgroup> </optgroup>
</MkSelect> </MkSelect>
<MkSelect v-model:value="chartSpan" style="margin: 0;"> <MkSelect v-model="chartSpan" style="margin: 0;">
<option value="hour">{{ $ts.perHour }}</option> <option value="hour">{{ $ts.perHour }}</option>
<option value="day">{{ $ts.perDay }}</option> <option value="day">{{ $ts.perDay }}</option>
</MkSelect> </MkSelect>

View File

@ -36,7 +36,7 @@
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent } from 'vue';
import MkModal from '@client/components/ui/modal.vue'; import MkModal from '@client/components/ui/modal.vue';
import { sidebarDef } from '@client/sidebar'; import { menuDef } from '@client/menu';
import { instanceName } from '@client/config'; import { instanceName } from '@client/config';
export default defineComponent({ export default defineComponent({
@ -48,7 +48,7 @@ export default defineComponent({
data() { data() {
return { return {
menuDef: sidebarDef, menuDef: menuDef,
items: [], items: [],
instanceName, instanceName,
}; };

View File

@ -87,8 +87,6 @@ export default defineComponent({
> .icon { > .icon {
padding-left: 2px; padding-left: 2px;
font-size: .9em; font-size: .9em;
font-weight: 400;
font-style: normal;
} }
} }
</style> </style>

View File

@ -9,7 +9,6 @@
<video <video
:poster="video.thumbnailUrl" :poster="video.thumbnailUrl"
:title="video.name" :title="video.name"
crossorigin="anonymous"
preload="none" preload="none"
controls controls
> >

View File

@ -165,6 +165,10 @@ export default defineComponent({
class: '_mfm_blur_', class: '_mfm_blur_',
}, genEl(token.children)); }, genEl(token.children));
} }
case 'rainbow': {
style = this.$store.state.animatedMfm ? 'animation: mfm-rainbow 1s linear infinite;' : '';
break;
}
} }
if (style == null) { if (style == null) {
return h('span', {}, ['[', token.props.name, ...genEl(token.children), ']']); return h('span', {}, ['[', token.props.name, ...genEl(token.children), ']']);

View File

@ -1,13 +1,10 @@
<template> <template>
<MkModal ref="modal" @click="$emit('click')" @closed="$emit('closed')"> <MkModal ref="modal" @click="$emit('click')" @closed="$emit('closed')">
<div class="hrmcaedk _popup _narrow_" :style="{ width: `${width}px`, height: (height ? `min(${height}px, 100%)` : '100%') }"> <div class="hrmcaedk _window _narrow_" :style="{ width: `${width}px`, height: (height ? `min(${height}px, 100%)` : '100%') }">
<div class="header" @contextmenu="onContextmenu"> <div class="header" @contextmenu="onContextmenu">
<button class="_button" @click="back()" v-if="history.length > 0"><i class="fas fa-chevron-left"></i></button>
<button class="_button" style="pointer-events: none;" v-else><!-- マージンのバランスを取るためのダミー --></button>
<span class="title"> <span class="title">
<XHeader :info="pageInfo" :with-back="false"/> <XHeader :info="pageInfo" :back-button="history.length > 0" @back="back()" :close-button="true" @close="$refs.modal.close()"/>
</span> </span>
<button class="_button" @click="$refs.modal.close()"><i class="fas fa-times"></i></button>
</div> </div>
<div class="body _flat_"> <div class="body _flat_">
<keep-alive> <keep-alive>
@ -177,35 +174,19 @@ export default defineComponent({
flex-shrink: 0; flex-shrink: 0;
box-shadow: 0px 1px var(--divider); box-shadow: 0px 1px var(--divider);
> button {
height: $height;
width: $height;
@media (max-width: 500px) {
height: $height-narrow;
width: $height-narrow;
}
}
> .title { > .title {
flex: 1; flex: 1;
line-height: $height; height: $height;
padding-left: 32px;
font-weight: bold; font-weight: bold;
white-space: nowrap; white-space: nowrap;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
pointer-events: none;
@media (max-width: 500px) { @media (max-width: 500px) {
line-height: $height-narrow; height: $height-narrow;
padding-left: 16px; padding-left: 16px;
} }
} }
> button + .title {
padding-left: 0;
}
} }
> .body { > .body {

View File

@ -454,7 +454,7 @@ export default defineComponent({
renote(viaKeyboard = false) { renote(viaKeyboard = false) {
pleaseLogin(); pleaseLogin();
this.blur(); this.blur();
os.modalMenu([{ os.popupMenu([{
text: this.$ts.renote, text: this.$ts.renote,
icon: 'fas fa-retweet', icon: 'fas fa-retweet',
action: () => { action: () => {
@ -743,14 +743,14 @@ export default defineComponent({
}, },
menu(viaKeyboard = false) { menu(viaKeyboard = false) {
os.modalMenu(this.getMenu(), this.$refs.menuButton, { os.popupMenu(this.getMenu(), this.$refs.menuButton, {
viaKeyboard viaKeyboard
}).then(this.focus); }).then(this.focus);
}, },
showRenoteMenu(viaKeyboard = false) { showRenoteMenu(viaKeyboard = false) {
if (!this.isMyRenote) return; if (!this.isMyRenote) return;
os.modalMenu([{ os.popupMenu([{
text: this.$ts.unrenote, text: this.$ts.unrenote,
icon: 'fas fa-trash-alt', icon: 'fas fa-trash-alt',
danger: true, danger: true,
@ -794,7 +794,7 @@ export default defineComponent({
async clip() { async clip() {
const clips = await os.api('clips/list'); const clips = await os.api('clips/list');
os.modalMenu([{ os.popupMenu([{
icon: 'fas fa-plus', icon: 'fas fa-plus',
text: this.$ts.createNew, text: this.$ts.createNew,
action: async () => { action: async () => {

View File

@ -24,8 +24,8 @@
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent } from 'vue';
import notePage from '../filters/note'; import notePage from '@client/filters/note';
import { userPage } from '../filters/user'; import { userPage } from '@client/filters/user';
import * as os from '@client/os'; import * as os from '@client/os';
export default defineComponent({ export default defineComponent({

View File

@ -429,7 +429,7 @@ export default defineComponent({
renote(viaKeyboard = false) { renote(viaKeyboard = false) {
pleaseLogin(); pleaseLogin();
this.blur(); this.blur();
os.modalMenu([{ os.popupMenu([{
text: this.$ts.renote, text: this.$ts.renote,
icon: 'fas fa-retweet', icon: 'fas fa-retweet',
action: () => { action: () => {
@ -718,14 +718,14 @@ export default defineComponent({
}, },
menu(viaKeyboard = false) { menu(viaKeyboard = false) {
os.modalMenu(this.getMenu(), this.$refs.menuButton, { os.popupMenu(this.getMenu(), this.$refs.menuButton, {
viaKeyboard viaKeyboard
}).then(this.focus); }).then(this.focus);
}, },
showRenoteMenu(viaKeyboard = false) { showRenoteMenu(viaKeyboard = false) {
if (!this.isMyRenote) return; if (!this.isMyRenote) return;
os.modalMenu([{ os.popupMenu([{
text: this.$ts.unrenote, text: this.$ts.unrenote,
icon: 'fas fa-trash-alt', icon: 'fas fa-trash-alt',
danger: true, danger: true,
@ -769,7 +769,7 @@ export default defineComponent({
async clip() { async clip() {
const clips = await os.api('clips/list'); const clips = await os.api('clips/list');
os.modalMenu([{ os.popupMenu([{
icon: 'fas fa-plus', icon: 'fas fa-plus',
text: this.$ts.createNew, text: this.$ts.createNew,
action: async () => { action: async () => {

View File

@ -11,16 +11,16 @@
<template #header>{{ $ts.notificationSetting }}</template> <template #header>{{ $ts.notificationSetting }}</template>
<div class="_monolithic_"> <div class="_monolithic_">
<div v-if="showGlobalToggle" class="_section"> <div v-if="showGlobalToggle" class="_section">
<MkSwitch v-model:value="useGlobalSetting"> <MkSwitch v-model="useGlobalSetting">
{{ $ts.useGlobalSetting }} {{ $ts.useGlobalSetting }}
<template #desc>{{ $ts.useGlobalSettingDesc }}</template> <template #caption>{{ $ts.useGlobalSettingDesc }}</template>
</MkSwitch> </MkSwitch>
</div> </div>
<div v-if="!useGlobalSetting" class="_section"> <div v-if="!useGlobalSetting" class="_section">
<MkInfo>{{ $ts.notificationSettingDesc }}</MkInfo> <MkInfo>{{ $ts.notificationSettingDesc }}</MkInfo>
<MkButton inline @click="disableAll">{{ $ts.disableAll }}</MkButton> <MkButton inline @click="disableAll">{{ $ts.disableAll }}</MkButton>
<MkButton inline @click="enableAll">{{ $ts.enableAll }}</MkButton> <MkButton inline @click="enableAll">{{ $ts.enableAll }}</MkButton>
<MkSwitch v-for="type in notificationTypes" :key="type" v-model:value="typesMap[type]">{{ $t(`_notification._types.${type}`) }}</MkSwitch> <MkSwitch v-for="type in notificationTypes" :key="type" v-model="typesMap[type]">{{ $t(`_notification._types.${type}`) }}</MkSwitch>
</div> </div>
</div> </div>
</XModalWindow> </XModalWindow>

View File

@ -58,12 +58,12 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent, markRaw } from 'vue';
import { getNoteSummary } from '@/misc/get-note-summary'; import { getNoteSummary } from '@/misc/get-note-summary';
import XReactionIcon from './reaction-icon.vue'; import XReactionIcon from './reaction-icon.vue';
import MkFollowButton from './follow-button.vue'; import MkFollowButton from './follow-button.vue';
import notePage from '../filters/note'; import notePage from '@client/filters/note';
import { userPage } from '../filters/user'; import { userPage } from '@client/filters/user';
import { i18n } from '@client/i18n'; import { i18n } from '@client/i18n';
import * as os from '@client/os'; import * as os from '@client/os';
@ -109,7 +109,7 @@ export default defineComponent({
this.readObserver.observe(this.$el); this.readObserver.observe(this.$el);
this.connection = os.stream.useChannel('main'); this.connection = markRaw(os.stream.useChannel('main'));
this.connection.on('readAllNotifications', () => this.readObserver.unobserve(this.$el)); this.connection.on('readAllNotifications', () => this.readObserver.unobserve(this.$el));
} }
}, },

View File

@ -21,7 +21,7 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent, PropType } from 'vue'; import { defineComponent, PropType, markRaw } from 'vue';
import paging from '@client/scripts/paging'; import paging from '@client/scripts/paging';
import XNotification from './notification.vue'; import XNotification from './notification.vue';
import XList from './date-separated-list.vue'; import XList from './date-separated-list.vue';
@ -89,7 +89,7 @@ export default defineComponent({
}, },
mounted() { mounted() {
this.connection = os.stream.useChannel('main'); this.connection = markRaw(os.stream.useChannel('main'));
this.connection.on('notification', this.onNotification); this.connection.on('notification', this.onNotification);
}, },

View File

@ -16,7 +16,7 @@
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent } from 'vue';
import { userName } from '../filters/user'; import { userName } from '@client/filters/user';
import * as os from '@client/os'; import * as os from '@client/os';
export default defineComponent({ export default defineComponent({

View File

@ -3,16 +3,12 @@
:initial-width="500" :initial-width="500"
:initial-height="500" :initial-height="500"
:can-resize="true" :can-resize="true"
:close-right="true" :close-button="false"
:contextmenu="contextmenu" :contextmenu="contextmenu"
@closed="$emit('closed')" @closed="$emit('closed')"
> >
<template #header> <template #header>
<XHeader :info="pageInfo" :with-back="false"/> <XHeader :info="pageInfo" :back-button="history.length > 0" @back="back()" :close-button="true" @close="close()"/>
</template>
<template #buttons>
<button class="_button" @click="back()" v-if="history.length > 0"><i class="fas fa-chevron-left"></i></button>
<button class="_button" style="pointer-events: none;" v-else><!-- マージンのバランスを取るためのダミー --></button>
</template> </template>
<div class="yrolvcoq _flat_"> <div class="yrolvcoq _flat_">
<component :is="component" v-bind="props" :ref="changePage"/> <component :is="component" v-bind="props" :ref="changePage"/>
@ -139,6 +135,10 @@ export default defineComponent({
this.navigate(this.history.pop(), false); this.navigate(this.history.pop(), false);
}, },
close() {
this.$refs.window.close();
},
expand() { expand() {
this.$router.push(this.path); this.$router.push(this.path);
this.$refs.window.close(); this.$refs.window.close();
@ -155,6 +155,5 @@ export default defineComponent({
<style lang="scss" scoped> <style lang="scss" scoped>
.yrolvcoq { .yrolvcoq {
min-height: 100%; min-height: 100%;
background: var(--bg);
} }
</style> </style>

View File

@ -1,6 +1,8 @@
<template> <template>
<div> <div>
<MkInput class="kudkigyw" :value="value" @update:value="updateValue($event)" type="number">{{ hpml.interpolate(block.text) }}</MkInput> <MkInput class="kudkigyw" :model-value="value" @update:modelValue="updateValue($event)" type="number">
<template #label>{{ hpml.interpolate(block.text) }}</template>
</MkInput>
</div> </div>
</template> </template>

View File

@ -1,6 +1,6 @@
<template> <template>
<div class="ngbfujlo"> <div class="ngbfujlo">
<MkTextarea :value="text" readonly style="margin: 0;"></MkTextarea> <MkTextarea :model-value="text" readonly style="margin: 0;"></MkTextarea>
<MkButton class="button" primary @click="post()" :disabled="posting || posted"> <MkButton class="button" primary @click="post()" :disabled="posting || posted">
<i v-if="posted" class="fas fa-check"></i> <i v-if="posted" class="fas fa-check"></i>
<i v-else class="fas fa-paper-plane"></i> <i v-else class="fas fa-paper-plane"></i>

View File

@ -1,6 +1,6 @@
<template> <template>
<div class="hkcxmtwj"> <div class="hkcxmtwj">
<MkSwitch :value="value" @update:value="updateValue($event)">{{ hpml.interpolate(block.text) }}</MkSwitch> <MkSwitch :model-value="value" @update:modelValue="updateValue($event)">{{ hpml.interpolate(block.text) }}</MkSwitch>
</div> </div>
</template> </template>

View File

@ -1,6 +1,8 @@
<template> <template>
<div> <div>
<MkInput class="kudkigyw" :value="value" @update:value="updateValue($event)" type="text">{{ hpml.interpolate(block.text) }}</MkInput> <MkInput class="kudkigyw" :model-value="value" @update:modelValue="updateValue($event)" type="text">
<template #label>{{ hpml.interpolate(block.text) }}</template>
</MkInput>
</div> </div>
</template> </template>

View File

@ -1,6 +1,8 @@
<template> <template>
<div> <div>
<MkTextarea :value="value" @update:value="updateValue($event)">{{ hpml.interpolate(block.text) }}</MkTextarea> <MkTextarea :model-value="value" @update:modelValue="updateValue($event)">
<template #label>{{ hpml.interpolate(block.text) }}</template>
</MkTextarea>
</div> </div>
</template> </template>

View File

@ -1,5 +1,5 @@
<template> <template>
<MkTextarea :value="text" readonly></MkTextarea> <MkTextarea :model-value="text" readonly></MkTextarea>
</template> </template>
<script lang="ts"> <script lang="ts">

View File

@ -5,8 +5,7 @@
</p> </p>
<ul ref="choices"> <ul ref="choices">
<li v-for="(choice, i) in choices" :key="i"> <li v-for="(choice, i) in choices" :key="i">
<MkInput class="input" :value="choice" @update:value="onInput(i, $event)"> <MkInput class="input" :model-value="choice" @update:modelValue="onInput(i, $event)" :placeholder="$t('_poll.choiceN', { n: i + 1 })">
<span>{{ $t('_poll.choiceN', { n: i + 1 }) }}</span>
</MkInput> </MkInput>
<button @click="remove(i)" class="_button"> <button @click="remove(i)" class="_button">
<i class="fas fa-times"></i> <i class="fas fa-times"></i>
@ -16,27 +15,27 @@
<MkButton class="add" v-if="choices.length < 10" @click="add">{{ $ts.add }}</MkButton> <MkButton class="add" v-if="choices.length < 10" @click="add">{{ $ts.add }}</MkButton>
<MkButton class="add" v-else disabled>{{ $ts._poll.noMore }}</MkButton> <MkButton class="add" v-else disabled>{{ $ts._poll.noMore }}</MkButton>
<section> <section>
<MkSwitch v-model:value="multiple">{{ $ts._poll.canMultipleVote }}</MkSwitch> <MkSwitch v-model="multiple">{{ $ts._poll.canMultipleVote }}</MkSwitch>
<div> <div>
<MkSelect v-model:value="expiration"> <MkSelect v-model="expiration">
<template #label>{{ $ts._poll.expiration }}</template> <template #label>{{ $ts._poll.expiration }}</template>
<option value="infinite">{{ $ts._poll.infinite }}</option> <option value="infinite">{{ $ts._poll.infinite }}</option>
<option value="at">{{ $ts._poll.at }}</option> <option value="at">{{ $ts._poll.at }}</option>
<option value="after">{{ $ts._poll.after }}</option> <option value="after">{{ $ts._poll.after }}</option>
</MkSelect> </MkSelect>
<section v-if="expiration === 'at'"> <section v-if="expiration === 'at'">
<MkInput v-model:value="atDate" type="date" class="input"> <MkInput v-model="atDate" type="date" class="input">
<span>{{ $ts._poll.deadlineDate }}</span> <template #label>{{ $ts._poll.deadlineDate }}</template>
</MkInput> </MkInput>
<MkInput v-model:value="atTime" type="time" class="input"> <MkInput v-model="atTime" type="time" class="input">
<span>{{ $ts._poll.deadlineTime }}</span> <template #label>{{ $ts._poll.deadlineTime }}</template>
</MkInput> </MkInput>
</section> </section>
<section v-if="expiration === 'after'"> <section v-if="expiration === 'after'">
<MkInput v-model:value="after" type="number" class="input"> <MkInput v-model="after" type="number" class="input">
<span>{{ $ts._poll.duration }}</span> <template #label>{{ $ts._poll.duration }}</template>
</MkInput> </MkInput>
<MkSelect v-model:value="unit"> <MkSelect v-model="unit">
<option value="second">{{ $ts._time.second }}</option> <option value="second">{{ $ts._time.second }}</option>
<option value="minute">{{ $ts._time.minute }}</option> <option value="minute">{{ $ts._time.minute }}</option>
<option value="hour">{{ $ts._time.hour }}</option> <option value="hour">{{ $ts._time.hour }}</option>

View File

@ -10,7 +10,7 @@
</span> </span>
</li> </li>
</ul> </ul>
<p> <p v-if="!readOnly">
<span>{{ $t('_poll.totalVotes', { n: total }) }}</span> <span>{{ $t('_poll.totalVotes', { n: total }) }}</span>
<span> · </span> <span> · </span>
<a v-if="!closed && !isVoted" @click="toggleShowResult">{{ showResult ? $ts._poll.vote : $ts._poll.showResult }}</a> <a v-if="!closed && !isVoted" @click="toggleShowResult">{{ showResult ? $ts._poll.vote : $ts._poll.showResult }}</a>
@ -31,6 +31,11 @@ export default defineComponent({
note: { note: {
type: Object, type: Object,
required: true required: true
},
readOnly: {
type: Boolean,
required: false,
default: false,
} }
}, },
data() { data() {
@ -65,7 +70,7 @@ export default defineComponent({
} }
}, },
created() { created() {
this.showResult = this.isVoted; this.showResult = this.readOnly || this.isVoted;
if (this.note.poll.expiresAt) { if (this.note.poll.expiresAt) {
const update = () => { const update = () => {
@ -83,7 +88,7 @@ export default defineComponent({
this.showResult = !this.showResult; this.showResult = !this.showResult;
}, },
vote(id) { vote(id) {
if (this.closed || !this.poll.multiple && this.poll.choices.some(c => c.isVoted)) return; if (this.readOnly || this.closed || !this.poll.multiple && this.poll.choices.some(c => c.isVoted)) return;
os.api('notes/polls/vote', { os.api('notes/polls/vote', {
noteId: this.note.id, noteId: this.note.id,
choice: id choice: id

View File

@ -112,7 +112,7 @@ export default defineComponent({
showFileMenu(file, ev: MouseEvent) { showFileMenu(file, ev: MouseEvent) {
if (this.menu) return; if (this.menu) return;
this.menu = os.modalMenu([{ this.menu = os.popupMenu([{
text: this.$ts.renameFile, text: this.$ts.renameFile,
icon: 'fas fa-i-cursor', icon: 'fas fa-i-cursor',
action: () => { this.rename(file) } action: () => { this.rename(file) }

View File

@ -37,6 +37,7 @@
<MkInfo warn v-if="hasNotSpecifiedMentions" class="hasNotSpecifiedMentions">{{ $ts.notSpecifiedMentionWarning }} - <button class="_textButton" @click="addMissingMention()">{{ $ts.add }}</button></MkInfo> <MkInfo warn v-if="hasNotSpecifiedMentions" class="hasNotSpecifiedMentions">{{ $ts.notSpecifiedMentionWarning }} - <button class="_textButton" @click="addMissingMention()">{{ $ts.add }}</button></MkInfo>
<input v-show="useCw" ref="cw" class="cw" v-model="cw" :placeholder="$ts.annotation" @keydown="onKeydown"> <input v-show="useCw" ref="cw" class="cw" v-model="cw" :placeholder="$ts.annotation" @keydown="onKeydown">
<textarea v-model="text" class="text" :class="{ withCw: useCw }" ref="text" :disabled="posting" :placeholder="placeholder" @keydown="onKeydown" @paste="onPaste" @compositionupdate="onCompositionUpdate" @compositionend="onCompositionEnd" /> <textarea v-model="text" class="text" :class="{ withCw: useCw }" ref="text" :disabled="posting" :placeholder="placeholder" @keydown="onKeydown" @paste="onPaste" @compositionupdate="onCompositionUpdate" @compositionend="onCompositionEnd" />
<input v-show="withHashtags" ref="hashtags" class="hashtags" v-model="hashtags" :placeholder="$ts.hashtags" list="hashtags">
<XPostFormAttaches class="attaches" :files="files" @updated="updateFiles" @detach="detachFile" @changeSensitive="updateFileSensitive" @changeName="updateFileName"/> <XPostFormAttaches class="attaches" :files="files" @updated="updateFiles" @detach="detachFile" @changeSensitive="updateFileSensitive" @changeName="updateFileName"/>
<XPollEditor v-if="poll" :poll="poll" @destroyed="poll = null" @updated="onPollUpdate"/> <XPollEditor v-if="poll" :poll="poll" @destroyed="poll = null" @updated="onPollUpdate"/>
<footer> <footer>
@ -44,9 +45,13 @@
<button class="_button" @click="togglePoll" :class="{ active: poll }" v-tooltip="$ts.poll"><i class="fas fa-poll-h"></i></button> <button class="_button" @click="togglePoll" :class="{ active: poll }" v-tooltip="$ts.poll"><i class="fas fa-poll-h"></i></button>
<button class="_button" @click="useCw = !useCw" :class="{ active: useCw }" v-tooltip="$ts.useCw"><i class="fas fa-eye-slash"></i></button> <button class="_button" @click="useCw = !useCw" :class="{ active: useCw }" v-tooltip="$ts.useCw"><i class="fas fa-eye-slash"></i></button>
<button class="_button" @click="insertMention" v-tooltip="$ts.mention"><i class="fas fa-at"></i></button> <button class="_button" @click="insertMention" v-tooltip="$ts.mention"><i class="fas fa-at"></i></button>
<button class="_button" @click="withHashtags = !withHashtags" v-tooltip="$ts.hashtags"><i class="fas fa-hashtag"></i></button>
<button class="_button" @click="insertEmoji" v-tooltip="$ts.emoji"><i class="fas fa-laugh-squint"></i></button> <button class="_button" @click="insertEmoji" v-tooltip="$ts.emoji"><i class="fas fa-laugh-squint"></i></button>
<button class="_button" @click="showActions" v-tooltip="$ts.plugin" v-if="postFormActions.length > 0"><i class="fas fa-plug"></i></button> <button class="_button" @click="showActions" v-tooltip="$ts.plugin" v-if="postFormActions.length > 0"><i class="fas fa-plug"></i></button>
</footer> </footer>
<datalist id="hashtags">
<option v-for="hashtag in recentHashtags" :value="hashtag" :key="hashtag"/>
</datalist>
</div> </div>
</div> </div>
</template> </template>
@ -61,16 +66,17 @@ import * as mfm from 'mfm-js';
import { host, url } from '@client/config'; import { host, url } from '@client/config';
import { erase, unique } from '../../prelude/array'; import { erase, unique } from '../../prelude/array';
import { extractMentions } from '@/misc/extract-mentions'; import { extractMentions } from '@/misc/extract-mentions';
import getAcct from '@/misc/acct/render'; import { getAcct } from '@/misc/acct';
import { formatTimeString } from '@/misc/format-time-string'; import { formatTimeString } from '@/misc/format-time-string';
import { Autocomplete } from '@client/scripts/autocomplete'; import { Autocomplete } from '@client/scripts/autocomplete';
import { noteVisibilities } from '../../types'; import { noteVisibilities } from '../../types';
import * as os from '@client/os'; import * as os from '@client/os';
import { selectFile } from '@client/scripts/select-file'; import { selectFile } from '@client/scripts/select-file';
import { notePostInterruptors, postFormActions } from '@client/store'; import { defaultStore, notePostInterruptors, postFormActions } from '@client/store';
import { isMobile } from '@client/scripts/is-mobile'; import { isMobile } from '@client/scripts/is-mobile';
import { throttle } from 'throttle-debounce'; import { throttle } from 'throttle-debounce';
import MkInfo from '@client/components/ui/info.vue'; import MkInfo from '@client/components/ui/info.vue';
import { defaultStore } from '@client/store';
export default defineComponent({ export default defineComponent({
components: { components: {
@ -212,7 +218,10 @@ export default defineComponent({
max(): number { max(): number {
return this.$instance ? this.$instance.maxNoteTextLength : 1000; return this.$instance ? this.$instance.maxNoteTextLength : 1000;
} },
withHashtags: defaultStore.makeGetterSetter('postFormWithHashtags'),
hashtags: defaultStore.makeGetterSetter('postFormHashtags'),
}, },
watch: { watch: {
@ -303,6 +312,7 @@ export default defineComponent({
// TODO: detach when unmount // TODO: detach when unmount
new Autocomplete(this.$refs.text, this, { model: 'text' }); new Autocomplete(this.$refs.text, this, { model: 'text' });
new Autocomplete(this.$refs.cw, this, { model: 'cw' }); new Autocomplete(this.$refs.cw, this, { model: 'cw' });
new Autocomplete(this.$refs.hashtags, this, { model: 'hashtags' });
this.$nextTick(() => { this.$nextTick(() => {
// 書きかけの投稿を復元 // 書きかけの投稿を復元
@ -605,6 +615,11 @@ export default defineComponent({
viaMobile: isMobile viaMobile: isMobile
}; };
if (this.withHashtags) {
const hashtags = this.hashtags.trim().split(' ').map(x => x.startsWith('#') ? x : '#' + x).join(' ');
data.text = data.text ? `${data.text} ${hashtags}` : hashtags;
}
// plugin // plugin
if (notePostInterruptors.length > 0) { if (notePostInterruptors.length > 0) {
for (const interruptor of notePostInterruptors) { for (const interruptor of notePostInterruptors) {
@ -618,8 +633,8 @@ export default defineComponent({
this.$nextTick(() => { this.$nextTick(() => {
this.deleteDraft(); this.deleteDraft();
this.$emit('posted'); this.$emit('posted');
if (this.text && this.text != '') { if (data.text && data.text != '') {
const hashtags = mfm.parse(this.text).filter(x => x.type === 'hashtag').map(x => x.props.hashtag); const hashtags = mfm.parse(data.text).filter(x => x.type === 'hashtag').map(x => x.props.hashtag);
const history = JSON.parse(localStorage.getItem('hashtags') || '[]') as string[]; const history = JSON.parse(localStorage.getItem('hashtags') || '[]') as string[];
localStorage.setItem('hashtags', JSON.stringify(unique(hashtags.concat(history)))); localStorage.setItem('hashtags', JSON.stringify(unique(hashtags.concat(history))));
} }
@ -649,7 +664,7 @@ export default defineComponent({
}, },
showActions(ev) { showActions(ev) {
os.modalMenu(postFormActions.map(action => ({ os.popupMenu(postFormActions.map(action => ({
text: action.title, text: action.title,
action: () => { action: () => {
action.handler({ action.handler({
@ -785,6 +800,7 @@ export default defineComponent({
} }
> .cw, > .cw,
> .hashtags,
> .text { > .text {
display: block; display: block;
box-sizing: border-box; box-sizing: border-box;
@ -813,6 +829,13 @@ export default defineComponent({
border-bottom: solid 0.5px var(--divider); border-bottom: solid 0.5px var(--divider);
} }
> .hashtags {
z-index: 1;
padding-top: 8px;
padding-bottom: 8px;
border-top: solid 0.5px var(--divider);
}
> .text { > .text {
max-width: 100%; max-width: 100%;
min-width: 100%; min-width: 100%;
@ -872,6 +895,7 @@ export default defineComponent({
} }
> .cw, > .cw,
> .hashtags,
> .text { > .text {
padding: 0 16px; padding: 0 16px;
} }

View File

@ -170,7 +170,7 @@ export default defineComponent({
} }
> span { > span {
color: #fff; color: var(--fgOnAccent);
} }
} }

View File

@ -1,10 +1,10 @@
<template> <template>
<div class="_card"> <div class="_card">
<div class="_content"> <div class="_content">
<MkInput v-model:value="text"> <MkInput v-model="text">
<span>Text</span> <template #label>Text</template>
</MkInput> </MkInput>
<MkSwitch v-model:value="flag"> <MkSwitch v-model="flag">
<span>Switch is now {{ flag ? 'on' : 'off' }}</span> <span>Switch is now {{ flag ? 'on' : 'off' }}</span>
</MkSwitch> </MkSwitch>
<div style="margin: 32px 0;"> <div style="margin: 32px 0;">
@ -93,7 +93,7 @@ export default defineComponent({
}, },
async openMenu(ev) { async openMenu(ev) {
os.modalMenu([{ os.popupMenu([{
type: 'label', type: 'label',
text: 'Fruits' text: 'Fruits'
}, { }, {

View File

@ -3,15 +3,13 @@
<div class="auth _section"> <div class="auth _section">
<div class="avatar" :style="{ backgroundImage: user ? `url('${ user.avatarUrl }')` : null }" v-show="withAvatar"></div> <div class="avatar" :style="{ backgroundImage: user ? `url('${ user.avatarUrl }')` : null }" v-show="withAvatar"></div>
<div class="normal-signin" v-if="!totpLogin"> <div class="normal-signin" v-if="!totpLogin">
<MkInput v-model:value="username" type="text" pattern="^[a-zA-Z0-9_]+$" spellcheck="false" autofocus required @update:value="onUsernameChange"> <MkInput v-model="username" :placeholder="$ts.username" type="text" pattern="^[a-zA-Z0-9_]+$" spellcheck="false" autofocus required @update:modelValue="onUsernameChange">
<span>{{ $ts.username }}</span>
<template #prefix>@</template> <template #prefix>@</template>
<template #suffix>@{{ host }}</template> <template #suffix>@{{ host }}</template>
</MkInput> </MkInput>
<MkInput v-model:value="password" type="password" :with-password-toggle="true" v-if="!user || user && !user.usePasswordLessLogin" required> <MkInput v-model="password" :placeholder="$ts.password" type="password" :with-password-toggle="true" v-if="!user || user && !user.usePasswordLessLogin" required>
<span>{{ $ts.password }}</span>
<template #prefix><i class="fas fa-lock"></i></template> <template #prefix><i class="fas fa-lock"></i></template>
<template #desc><button class="_textButton" @click="resetPassword">{{ $ts.forgotPassword }}</button></template> <template #caption><button class="_textButton" @click="resetPassword" type="button">{{ $ts.forgotPassword }}</button></template>
</MkInput> </MkInput>
<MkButton type="submit" primary :disabled="signing" style="margin: 0 auto;">{{ signing ? $ts.loggingIn : $ts.login }}</MkButton> <MkButton type="submit" primary :disabled="signing" style="margin: 0 auto;">{{ signing ? $ts.loggingIn : $ts.login }}</MkButton>
</div> </div>
@ -27,12 +25,12 @@
</div> </div>
<div class="twofa-group totp-group"> <div class="twofa-group totp-group">
<p style="margin-bottom:0;">{{ $ts.twoStepAuthentication }}</p> <p style="margin-bottom:0;">{{ $ts.twoStepAuthentication }}</p>
<MkInput v-model:value="password" type="password" :with-password-toggle="true" v-if="user && user.usePasswordLessLogin" required> <MkInput v-model="password" type="password" :with-password-toggle="true" v-if="user && user.usePasswordLessLogin" required>
<span>{{ $ts.password }}</span> <template #label>{{ $ts.password }}</template>
<template #prefix><i class="fas fa-lock"></i></template> <template #prefix><i class="fas fa-lock"></i></template>
</MkInput> </MkInput>
<MkInput v-model:value="token" type="text" pattern="^[0-9]{6}$" autocomplete="off" spellcheck="false" required> <MkInput v-model="token" type="text" pattern="^[0-9]{6}$" autocomplete="off" spellcheck="false" required>
<span>{{ $ts.token }}</span> <template #label>{{ $ts.token }}</template>
<template #prefix><i class="fas fa-gavel"></i></template> <template #prefix><i class="fas fa-gavel"></i></template>
</MkInput> </MkInput>
<MkButton type="submit" :disabled="signing" primary style="margin: 0 auto;">{{ signing ? $ts.loggingIn : $ts.login }}</MkButton> <MkButton type="submit" :disabled="signing" primary style="margin: 0 auto;">{{ signing ? $ts.loggingIn : $ts.login }}</MkButton>

View File

@ -1,39 +1,39 @@
<template> <template>
<form class="mk-signup" @submit.prevent="onSubmit" :autocomplete="Math.random()"> <form class="mk-signup" @submit.prevent="onSubmit" :autocomplete="Math.random()">
<template v-if="meta"> <template v-if="meta">
<MkInput v-if="meta.disableRegistration" v-model:value="invitationCode" type="text" :autocomplete="Math.random()" spellcheck="false" required> <MkInput v-if="meta.disableRegistration" v-model="invitationCode" type="text" :autocomplete="Math.random()" spellcheck="false" required>
<span>{{ $ts.invitationCode }}</span> <template #label>{{ $ts.invitationCode }}</template>
<template #prefix><i class="fas fa-key"></i></template> <template #prefix><i class="fas fa-key"></i></template>
</MkInput> </MkInput>
<MkInput v-model:value="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" :autocomplete="Math.random()" spellcheck="false" required @update:value="onChangeUsername"> <MkInput v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" :autocomplete="Math.random()" spellcheck="false" required @update:modelValue="onChangeUsername">
<span>{{ $ts.username }}</span> <template #label>{{ $ts.username }}</template>
<template #prefix>@</template> <template #prefix>@</template>
<template #suffix>@{{ host }}</template> <template #suffix>@{{ host }}</template>
<template #desc> <template #caption>
<span v-if="usernameState == 'wait'" style="color:#999"><i class="fas fa-spinner fa-pulse fa-fw"></i> {{ $ts.checking }}</span> <span v-if="usernameState == 'wait'" style="color:#999"><i class="fas fa-spinner fa-pulse fa-fw"></i> {{ $ts.checking }}</span>
<span v-if="usernameState == 'ok'" style="color:#3CB7B5"><i class="fas fa-check fa-fw"></i> {{ $ts.available }}</span> <span v-if="usernameState == 'ok'" style="color: var(--success)"><i class="fas fa-check fa-fw"></i> {{ $ts.available }}</span>
<span v-if="usernameState == 'unavailable'" style="color:#FF1161"><i class="fas fa-exclamation-triangle fa-fw"></i> {{ $ts.unavailable }}</span> <span v-if="usernameState == 'unavailable'" style="color: var(--error)"><i class="fas fa-exclamation-triangle fa-fw"></i> {{ $ts.unavailable }}</span>
<span v-if="usernameState == 'error'" style="color:#FF1161"><i class="fas fa-exclamation-triangle fa-fw"></i> {{ $ts.error }}</span> <span v-if="usernameState == 'error'" style="color: var(--error)"><i class="fas fa-exclamation-triangle fa-fw"></i> {{ $ts.error }}</span>
<span v-if="usernameState == 'invalid-format'" style="color:#FF1161"><i class="fas fa-exclamation-triangle fa-fw"></i> {{ $ts.usernameInvalidFormat }}</span> <span v-if="usernameState == 'invalid-format'" style="color: var(--error)"><i class="fas fa-exclamation-triangle fa-fw"></i> {{ $ts.usernameInvalidFormat }}</span>
<span v-if="usernameState == 'min-range'" style="color:#FF1161"><i class="fas fa-exclamation-triangle fa-fw"></i> {{ $ts.tooShort }}</span> <span v-if="usernameState == 'min-range'" style="color: var(--error)"><i class="fas fa-exclamation-triangle fa-fw"></i> {{ $ts.tooShort }}</span>
<span v-if="usernameState == 'max-range'" style="color:#FF1161"><i class="fas fa-exclamation-triangle fa-fw"></i> {{ $ts.tooLong }}</span> <span v-if="usernameState == 'max-range'" style="color: var(--error)"><i class="fas fa-exclamation-triangle fa-fw"></i> {{ $ts.tooLong }}</span>
</template> </template>
</MkInput> </MkInput>
<MkInput v-model:value="password" type="password" :autocomplete="Math.random()" required @update:value="onChangePassword"> <MkInput v-model="password" type="password" :autocomplete="Math.random()" required @update:modelValue="onChangePassword">
<span>{{ $ts.password }}</span> <template #label>{{ $ts.password }}</template>
<template #prefix><i class="fas fa-lock"></i></template> <template #prefix><i class="fas fa-lock"></i></template>
<template #desc> <template #caption>
<p v-if="passwordStrength == 'low'" style="color:#FF1161"><i class="fas fa-exclamation-triangle fa-fw"></i> {{ $ts.weakPassword }}</p> <span v-if="passwordStrength == 'low'" style="color: var(--error)"><i class="fas fa-exclamation-triangle fa-fw"></i> {{ $ts.weakPassword }}</span>
<p v-if="passwordStrength == 'medium'" style="color:#3CB7B5"><i class="fas fa-check fa-fw"></i> {{ $ts.normalPassword }}</p> <span v-if="passwordStrength == 'medium'" style="color: var(--warn)"><i class="fas fa-check fa-fw"></i> {{ $ts.normalPassword }}</span>
<p v-if="passwordStrength == 'high'" style="color:#3CB7B5"><i class="fas fa-check fa-fw"></i> {{ $ts.strongPassword }}</p> <span v-if="passwordStrength == 'high'" style="color: var(--success)"><i class="fas fa-check fa-fw"></i> {{ $ts.strongPassword }}</span>
</template> </template>
</MkInput> </MkInput>
<MkInput v-model:value="retypedPassword" type="password" :autocomplete="Math.random()" required @update:value="onChangePasswordRetype"> <MkInput v-model="retypedPassword" type="password" :autocomplete="Math.random()" required @update:modelValue="onChangePasswordRetype">
<span>{{ $ts.password }} ({{ $ts.retype }})</span> <template #label>{{ $ts.password }} ({{ $ts.retype }})</template>
<template #prefix><i class="fas fa-lock"></i></template> <template #prefix><i class="fas fa-lock"></i></template>
<template #desc> <template #caption>
<p v-if="passwordRetypeState == 'match'" style="color:#3CB7B5"><i class="fas fa-check fa-fw"></i> {{ $ts.passwordMatched }}</p> <span v-if="passwordRetypeState == 'match'" style="color: var(--success)"><i class="fas fa-check fa-fw"></i> {{ $ts.passwordMatched }}</span>
<p v-if="passwordRetypeState == 'not-match'" style="color:#FF1161"><i class="fas fa-exclamation-triangle fa-fw"></i> {{ $ts.passwordNotMatched }}</p> <span v-if="passwordRetypeState == 'not-match'" style="color: var(--error)"><i class="fas fa-exclamation-triangle fa-fw"></i> {{ $ts.passwordNotMatched }}</span>
</template> </template>
</MkInput> </MkInput>
<label v-if="meta.tosUrl" class="tou"> <label v-if="meta.tosUrl" class="tou">

View File

@ -14,7 +14,7 @@ export default defineComponent({
class: 'pxhvhrfw', class: 'pxhvhrfw',
}, options.map(option => withDirectives(h('button', { }, options.map(option => withDirectives(h('button', {
class: ['_button', { active: this.value === option.props.value }], class: ['_button', { active: this.value === option.props.value }],
key: option.props.value, key: option.key,
disabled: this.value === option.props.value, disabled: this.value === option.props.value,
onClick: () => { onClick: () => {
this.$emit('update:value', option.props.value); this.$emit('update:value', option.props.value);

View File

@ -3,7 +3,7 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent, markRaw } from 'vue';
import XNotes from './notes.vue'; import XNotes from './notes.vue';
import * as os from '@client/os'; import * as os from '@client/os';
import * as sound from '@client/scripts/sound'; import * as sound from '@client/scripts/sound';
@ -92,33 +92,33 @@ export default defineComponent({
this.query = { this.query = {
antennaId: this.antenna antennaId: this.antenna
}; };
this.connection = os.stream.useChannel('antenna', { this.connection = markRaw(os.stream.useChannel('antenna', {
antennaId: this.antenna antennaId: this.antenna
}); }));
this.connection.on('note', prepend); this.connection.on('note', prepend);
} else if (this.src == 'home') { } else if (this.src == 'home') {
endpoint = 'notes/timeline'; endpoint = 'notes/timeline';
this.connection = os.stream.useChannel('homeTimeline'); this.connection = markRaw(os.stream.useChannel('homeTimeline'));
this.connection.on('note', prepend); this.connection.on('note', prepend);
this.connection2 = os.stream.useChannel('main'); this.connection2 = markRaw(os.stream.useChannel('main'));
this.connection2.on('follow', onChangeFollowing); this.connection2.on('follow', onChangeFollowing);
this.connection2.on('unfollow', onChangeFollowing); this.connection2.on('unfollow', onChangeFollowing);
} else if (this.src == 'local') { } else if (this.src == 'local') {
endpoint = 'notes/local-timeline'; endpoint = 'notes/local-timeline';
this.connection = os.stream.useChannel('localTimeline'); this.connection = markRaw(os.stream.useChannel('localTimeline'));
this.connection.on('note', prepend); this.connection.on('note', prepend);
} else if (this.src == 'social') { } else if (this.src == 'social') {
endpoint = 'notes/hybrid-timeline'; endpoint = 'notes/hybrid-timeline';
this.connection = os.stream.useChannel('hybridTimeline'); this.connection = markRaw(os.stream.useChannel('hybridTimeline'));
this.connection.on('note', prepend); this.connection.on('note', prepend);
} else if (this.src == 'global') { } else if (this.src == 'global') {
endpoint = 'notes/global-timeline'; endpoint = 'notes/global-timeline';
this.connection = os.stream.useChannel('globalTimeline'); this.connection = markRaw(os.stream.useChannel('globalTimeline'));
this.connection.on('note', prepend); this.connection.on('note', prepend);
} else if (this.src == 'mentions') { } else if (this.src == 'mentions') {
endpoint = 'notes/mentions'; endpoint = 'notes/mentions';
this.connection = os.stream.useChannel('main'); this.connection = markRaw(os.stream.useChannel('main'));
this.connection.on('mention', prepend); this.connection.on('mention', prepend);
} else if (this.src == 'directs') { } else if (this.src == 'directs') {
endpoint = 'notes/mentions'; endpoint = 'notes/mentions';
@ -130,16 +130,16 @@ export default defineComponent({
prepend(note); prepend(note);
} }
}; };
this.connection = os.stream.useChannel('main'); this.connection = markRaw(os.stream.useChannel('main'));
this.connection.on('mention', onNote); this.connection.on('mention', onNote);
} else if (this.src == 'list') { } else if (this.src == 'list') {
endpoint = 'notes/user-list-timeline'; endpoint = 'notes/user-list-timeline';
this.query = { this.query = {
listId: this.list listId: this.list
}; };
this.connection = os.stream.useChannel('userList', { this.connection = markRaw(os.stream.useChannel('userList', {
listId: this.list listId: this.list
}); }));
this.connection.on('note', prepend); this.connection.on('note', prepend);
this.connection.on('userAdded', onUserAdded); this.connection.on('userAdded', onUserAdded);
this.connection.on('userRemoved', onUserRemoved); this.connection.on('userRemoved', onUserRemoved);
@ -148,9 +148,9 @@ export default defineComponent({
this.query = { this.query = {
channelId: this.channel channelId: this.channel
}; };
this.connection = os.stream.useChannel('channel', { this.connection = markRaw(os.stream.useChannel('channel', {
channelId: this.channel channelId: this.channel
}); }));
this.connection.on('note', prepend); this.connection.on('note', prepend);
} }

View File

@ -14,13 +14,15 @@
<MkInfo warn>{{ information }}</MkInfo> <MkInfo warn>{{ information }}</MkInfo>
</div> </div>
<div class="_section"> <div class="_section">
<MkInput v-model:value="name">{{ $ts.name }}</MkInput> <MkInput v-model="name">
<template #label>{{ $ts.name }}</template>
</MkInput>
</div> </div>
<div class="_section"> <div class="_section">
<div style="margin-bottom: 16px;"><b>{{ $ts.permission }}</b></div> <div style="margin-bottom: 16px;"><b>{{ $ts.permission }}</b></div>
<MkButton inline @click="disableAll">{{ $ts.disableAll }}</MkButton> <MkButton inline @click="disableAll">{{ $ts.disableAll }}</MkButton>
<MkButton inline @click="enableAll">{{ $ts.enableAll }}</MkButton> <MkButton inline @click="enableAll">{{ $ts.enableAll }}</MkButton>
<MkSwitch v-for="kind in (initialPermissions || kinds)" :key="kind" v-model:value="permissions[kind]">{{ $t(`_permissions.${kind}`) }}</MkSwitch> <MkSwitch v-for="kind in (initialPermissions || kinds)" :key="kind" v-model="permissions[kind]">{{ $t(`_permissions.${kind}`) }}</MkSwitch>
</div> </div>
</XModalWindow> </XModalWindow>
</template> </template>

View File

@ -1,6 +1,6 @@
<template> <template>
<component class="bghgjjyj _button" <component class="bghgjjyj _button"
:is="link ? 'a' : 'button'" :is="link ? 'MkA' : 'button'"
:class="{ inline, primary, danger, full }" :class="{ inline, primary, danger, full }"
:type="type" :type="type"
@click="$emit('click', $event)" @click="$emit('click', $event)"
@ -115,6 +115,7 @@ export default defineComponent({
z-index: 1; // 他コンポーネントのbox-shadowに隠されないようにするため z-index: 1; // 他コンポーネントのbox-shadowに隠されないようにするため
display: block; display: block;
min-width: 100px; min-width: 100px;
width: max-content;
padding: 8px 14px; padding: 8px 14px;
text-align: center; text-align: center;
font-weight: normal; font-weight: normal;
@ -125,6 +126,8 @@ export default defineComponent({
background: var(--buttonBg); background: var(--buttonBg);
border-radius: 999px; border-radius: 999px;
overflow: hidden; overflow: hidden;
box-sizing: border-box;
transition: background 0.1s ease;
&:not(:disabled):hover { &:not(:disabled):hover {
background: var(--buttonHoverBg); background: var(--buttonHoverBg);
@ -140,7 +143,7 @@ export default defineComponent({
&.primary { &.primary {
font-weight: bold; font-weight: bold;
color: #fff !important; color: var(--fgOnAccent) !important;
background: var(--accent); background: var(--accent);
&:not(:disabled):hover { &:not(:disabled):hover {

View File

@ -191,6 +191,8 @@ export default defineComponent({
} }
> .content { > .content {
--stickyTop: 0px;
&.omitted { &.omitted {
position: relative; position: relative;
max-height: var(--maxHeight); max-height: var(--maxHeight);

View File

@ -99,9 +99,12 @@ export default defineComponent({
z-index: 10; z-index: 10;
position: sticky; position: sticky;
top: var(--stickyTop, 0px); top: var(--stickyTop, 0px);
background: var(--panel);
/* TODO panelの半透明バージョンをプログラマティックに作りたい
background: var(--X17); background: var(--X17);
-webkit-backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px);
backdrop-filter: blur(20px); backdrop-filter: blur(20px);
*/
> .title { > .title {
margin: 0; margin: 0;

View File

@ -1,32 +1,9 @@
<template> <template>
<div class="juejbjww" :class="{ focused, filled, inline, disabled }"> <div class="matxzzsk">
<div class="icon" ref="icon"><slot name="icon"></slot></div> <div class="label" @click="focus"><slot name="label"></slot></div>
<div class="input"> <div class="input" :class="{ inline, disabled, focused }">
<span class="label" ref="labelEl"><slot></slot></span>
<span class="title" ref="title">
<slot name="title"></slot>
<span class="warning" v-if="invalid"><i class="fas fa-exclamation-circle"></i>{{ $refs.input.validationMessage }}</span>
</span>
<div class="prefix" ref="prefixEl"><slot name="prefix"></slot></div> <div class="prefix" ref="prefixEl"><slot name="prefix"></slot></div>
<input v-if="debounce" ref="inputEl" <input ref="inputEl"
v-debounce="500"
:type="type"
v-model.lazy="v"
:disabled="disabled"
:required="required"
:readonly="readonly"
:placeholder="placeholder"
:pattern="pattern"
:autocomplete="autocomplete"
:spellcheck="spellcheck"
:step="step"
@focus="focused = true"
@blur="focused = false"
@keydown="onKeydown($event)"
@input="onInput"
:list="id"
>
<input v-else ref="inputEl"
:type="type" :type="type"
v-model="v" v-model="v"
:disabled="disabled" :disabled="disabled"
@ -48,23 +25,25 @@
</datalist> </datalist>
<div class="suffix" ref="suffixEl"><slot name="suffix"></slot></div> <div class="suffix" ref="suffixEl"><slot name="suffix"></slot></div>
</div> </div>
<button class="save _textButton" v-if="save && changed" @click="() => { changed = false; save(); }">{{ $ts.save }}</button> <div class="caption"><slot name="caption"></slot></div>
<div class="desc _caption"><slot name="desc"></slot></div>
<MkButton v-if="manualSave && changed" @click="updated" primary><i class="fas fa-save"></i> {{ $ts.save }}</MkButton>
</div> </div>
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent, onMounted, onUnmounted, nextTick, ref, watch, computed, toRefs } from 'vue'; import { defineComponent, onMounted, onUnmounted, nextTick, ref, watch, computed, toRefs } from 'vue';
import debounce from 'v-debounce'; import MkButton from './button.vue';
import * as os from '@client/os'; import { debounce } from 'throttle-debounce';
export default defineComponent({ export default defineComponent({
directives: { components: {
debounce MkButton,
}, },
props: { props: {
value: { modelValue: {
required: false required: true
}, },
type: { type: {
type: String, type: String,
@ -104,9 +83,6 @@ export default defineComponent({
step: { step: {
required: false required: false
}, },
debounce: {
required: false
},
datalist: { datalist: {
type: Array, type: Array,
required: false, required: false,
@ -116,15 +92,23 @@ export default defineComponent({
required: false, required: false,
default: false default: false
}, },
save: { debounce: {
type: Function, type: Boolean,
required: false, required: false,
default: false
},
manualSave: {
type: Boolean,
required: false,
default: false
}, },
}, },
emits: ['change', 'keydown', 'enter'],
emits: ['change', 'keydown', 'enter', 'update:modelValue'],
setup(props, context) { setup(props, context) {
const { value, type, autofocus } = toRefs(props); const { modelValue, type, autofocus } = toRefs(props);
const v = ref(value.value); const v = ref(modelValue.value);
const id = Math.random().toString(); // TODO: uuid? const id = Math.random().toString(); // TODO: uuid?
const focused = ref(false); const focused = ref(false);
const changed = ref(false); const changed = ref(false);
@ -133,7 +117,6 @@ export default defineComponent({
const inputEl = ref(null); const inputEl = ref(null);
const prefixEl = ref(null); const prefixEl = ref(null);
const suffixEl = ref(null); const suffixEl = ref(null);
const labelEl = ref(null);
const focus = () => inputEl.value.focus(); const focus = () => inputEl.value.focus();
const onInput = (ev) => { const onInput = (ev) => {
@ -148,15 +131,28 @@ export default defineComponent({
} }
}; };
watch(value, newValue => { const updated = () => {
changed.value = false;
if (type?.value === 'number') {
context.emit('update:modelValue', parseFloat(v.value));
} else {
context.emit('update:modelValue', v.value);
}
};
const debouncedUpdated = debounce(1000, updated);
watch(modelValue, newValue => {
v.value = newValue; v.value = newValue;
}); });
watch(v, newValue => { watch(v, newValue => {
if (type?.value === 'number') { if (!props.manualSave) {
context.emit('update:value', parseFloat(newValue)); if (props.debounce) {
} else { debouncedUpdated();
context.emit('update:value', newValue); } else {
updated();
}
} }
invalid.value = inputEl.value.validity.badInput; invalid.value = inputEl.value.validity.badInput;
@ -172,7 +168,6 @@ export default defineComponent({
// 非表示状態だと要素の幅などは0になってしまうので、定期的に計算する // 非表示状態だと要素の幅などは0になってしまうので、定期的に計算する
const clock = setInterval(() => { const clock = setInterval(() => {
if (prefixEl.value) { if (prefixEl.value) {
labelEl.value.style.left = (prefixEl.value.offsetLeft + prefixEl.value.offsetWidth) + 'px';
if (prefixEl.value.offsetWidth) { if (prefixEl.value.offsetWidth) {
inputEl.value.style.paddingLeft = prefixEl.value.offsetWidth + 'px'; inputEl.value.style.paddingLeft = prefixEl.value.offsetWidth + 'px';
} }
@ -200,148 +195,78 @@ export default defineComponent({
inputEl, inputEl,
prefixEl, prefixEl,
suffixEl, suffixEl,
labelEl,
focus, focus,
onInput, onInput,
onKeydown, onKeydown,
updated,
}; };
}, },
}); });
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.juejbjww { .matxzzsk {
position: relative; margin: 1.5em 0;
margin: 32px 0;
&:not(.inline):first-child { > .label {
margin-top: 8px; font-size: 0.85em;
padding: 0 0 8px 12px;
user-select: none;
&:empty {
display: none;
}
} }
&:not(.inline):last-child { > .caption {
margin-bottom: 8px; font-size: 0.8em;
} padding: 8px 0 0 12px;
color: var(--fgTransparentWeak);
> .icon { &:empty {
position: absolute; display: none;
top: 0;
left: 0;
width: 24px;
text-align: center;
line-height: 32px;
&:not(:empty) + .input {
margin-left: 28px;
} }
} }
> .input { > .input {
$height: 42px;
position: relative; position: relative;
&:before {
content: '';
display: block;
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 1px;
background: var(--inputBorder);
}
&:after {
content: '';
display: block;
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 2px;
background: var(--accent);
opacity: 0;
transform: scaleX(0.12);
transition: border 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.3s cubic-bezier(0.4, 0, 0.2, 1), transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
will-change: border opacity transform;
}
> .label {
position: absolute;
z-index: 1;
top: 0;
left: 0;
pointer-events: none;
transition: 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);
transition-duration: 0.3s;
font-size: 1em;
line-height: 32px;
color: var(--inputLabel);
pointer-events: none;
//will-change transform
transform-origin: top left;
transform: scale(1);
}
> .title {
position: absolute;
z-index: 1;
top: -17px;
left: 0 !important;
pointer-events: none;
font-size: 1em;
line-height: 32px;
color: var(--inputLabel);
pointer-events: none;
//will-change transform
transform-origin: top left;
transform: scale(.75);
white-space: nowrap;
width: 133%;
overflow: hidden;
text-overflow: ellipsis;
> .warning {
margin-left: 0.5em;
color: var(--infoWarnFg);
> svg {
margin-right: 0.1em;
}
}
}
> input { > input {
$height: 32px; appearance: none;
-webkit-appearance: none;
display: block; display: block;
height: $height; height: $height;
width: 100%; width: 100%;
margin: 0; margin: 0;
padding: 0; padding: 0 12px;
font: inherit; font: inherit;
font-weight: normal; font-weight: normal;
font-size: 1em; font-size: 1em;
line-height: $height; color: var(--fg);
color: var(--inputText); background: var(--panel);
background: transparent; border: solid 1px var(--inputBorder);
border: none; border-radius: 6px;
border-radius: 0;
outline: none; outline: none;
box-shadow: none; box-shadow: none;
box-sizing: border-box; box-sizing: border-box;
transition: border-color 0.1s ease-out;
&[type='file'] { &:hover {
display: none; border-color: var(--inputBorderHover);
} }
} }
> .prefix, > .prefix,
> .suffix { > .suffix {
display: block; display: flex;
align-items: center;
position: absolute; position: absolute;
z-index: 1; z-index: 1;
top: 0; top: 0;
padding: 0 12px;
font-size: 1em; font-size: 1em;
line-height: 32px; height: $height;
color: var(--inputLabel);
pointer-events: none; pointer-events: none;
&:empty { &:empty {
@ -360,67 +285,33 @@ export default defineComponent({
> .prefix { > .prefix {
left: 0; left: 0;
padding-right: 4px; padding-right: 6px;
} }
> .suffix { > .suffix {
right: 0; right: 0;
padding-left: 4px; padding-left: 6px;
}
}
> .save {
margin: 6px 0 0 0;
font-size: 0.8em;
}
> .desc {
margin: 6px 0 0 0;
&:empty {
display: none;
} }
* { &.inline {
display: inline-block;
margin: 0; margin: 0;
} }
}
&.focused { &.focused {
> .input { > input {
&:after { border-color: var(--accent);
opacity: 1; //box-shadow: 0 0 0 4px var(--focus);
transform: scaleX(1);
}
> .label {
color: var(--accent);
} }
} }
}
&.focused, &.disabled {
&.filled { opacity: 0.7;
> .input {
> .label { &, * {
top: -17px; cursor: not-allowed !important;
left: 0 !important;
transform: scale(0.75);
} }
} }
} }
&.inline {
display: inline-block;
margin: 0;
}
&.disabled {
opacity: 0.7;
&, * {
cursor: not-allowed !important;
}
}
} }
</style> </style>

View File

@ -1,5 +1,5 @@
<template> <template>
<div class="rrevdjwt" :class="{ left: align === 'left' }" <div class="rrevdjwt" :class="{ left: align === 'left', pointer: point === 'top' }"
ref="items" ref="items"
@contextmenu.self="e => e.preventDefault()" @contextmenu.self="e => e.preventDefault()"
v-hotkey="keymap" v-hotkey="keymap"
@ -58,7 +58,11 @@ export default defineComponent({
align: { align: {
type: String, type: String,
requried: false requried: false
} },
point: {
type: String,
requried: false
},
}, },
emits: ['close'], emits: ['close'],
data() { data() {
@ -137,6 +141,22 @@ export default defineComponent({
.rrevdjwt { .rrevdjwt {
padding: 8px 0; padding: 8px 0;
&.pointer {
&:before {
--size: 8px;
content: '';
display: block;
position: absolute;
top: calc(0px - (var(--size) * 2));
left: 0;
right: 0;
width: 0;
margin: auto;
border: solid var(--size) transparent;
border-bottom-color: var(--popup);
}
}
&.left { &.left {
> .item { > .item {
text-align: left; text-align: left;
@ -171,13 +191,13 @@ export default defineComponent({
} }
&:hover { &:hover {
color: #fff; color: var(--fgOnAccent);
background: var(--accent); background: var(--accent);
text-decoration: none; text-decoration: none;
} }
&:active { &:active {
color: #fff; color: var(--fgOnAccent);
background: var(--accentDarken); background: var(--accentDarken);
} }

View File

@ -1,6 +1,6 @@
<template> <template>
<MkModal ref="modal" @click="$emit('click')" @closed="$emit('closed')"> <MkModal ref="modal" @click="$emit('click')" @closed="$emit('closed')">
<div class="ebkgoccj _popup _narrow_" @keydown="onKeydown" :style="{ width: `${width}px`, height: scroll ? (height ? `${height}px` : null) : (height ? `min(${height}px, 100%)` : '100%') }"> <div class="ebkgoccj _window _narrow_" @keydown="onKeydown" :style="{ width: `${width}px`, height: scroll ? (height ? `${height}px` : null) : (height ? `min(${height}px, 100%)` : '100%') }">
<div class="header"> <div class="header">
<button class="_button" v-if="withOkButton" @click="$emit('close')"><i class="fas fa-times"></i></button> <button class="_button" v-if="withOkButton" @click="$emit('close')"><i class="fas fa-times"></i></button>
<span class="title"> <span class="title">

View File

@ -1,19 +1,20 @@
<template> <template>
<MkModal ref="modal" :src="src" @click="$refs.modal.close()" @closed="$emit('closed')"> <MkPopup ref="popup" :src="src" @closed="$emit('closed')" #default="{point}">
<MkMenu :items="items" :align="align" @close="$refs.modal.close()" class="_popup"/> <MkMenu :items="items" :align="align" :point="point" @close="$refs.popup.close()" class="_popup _shadow"/>
</MkModal> </MkPopup>
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent } from 'vue';
import MkModal from './modal.vue'; import MkPopup from './popup.vue';
import MkMenu from './menu.vue'; import MkMenu from './menu.vue';
export default defineComponent({ export default defineComponent({
components: { components: {
MkModal, MkPopup,
MkMenu, MkMenu,
}, },
props: { props: {
items: { items: {
type: Array, type: Array,
@ -31,17 +32,7 @@ export default defineComponent({
required: false required: false
}, },
}, },
emits: ['closed'],
computed: { emits: ['close', 'closed'],
keymap(): any {
return {
'esc': () => this.$refs.modal.close(),
};
},
},
}); });
</script> </script>
<style lang="scss" scoped>
</style>

View File

@ -0,0 +1,216 @@
<template>
<transition :name="$store.state.animation ? 'popup-menu' : ''" :duration="$store.state.animation ? 300 : 0" appear @after-leave="onClosed" @enter="$emit('opening')" @after-enter="childRendered">
<div v-show="manualShowing != null ? manualShowing : showing" class="ccczpooj" :class="{ front, fixed, top: position === 'top' }" ref="content" :style="{ pointerEvents: (manualShowing != null ? manualShowing : showing) ? 'auto' : 'none', '--transformOrigin': transformOrigin }">
<slot :point="point"></slot>
</div>
</transition>
</template>
<script lang="ts">
import { defineComponent, PropType } from 'vue';
function getFixedContainer(el: Element | null): Element | null {
if (el == null || el.tagName === 'BODY') return null;
const position = window.getComputedStyle(el).getPropertyValue('position');
if (position === 'fixed') {
return el;
} else {
return getFixedContainer(el.parentElement);
}
}
export default defineComponent({
props: {
manualShowing: {
type: Boolean,
required: false,
default: null,
},
srcCenter: {
type: Boolean,
required: false
},
src: {
type: Object as PropType<HTMLElement>,
required: false,
},
position: {
required: false
},
front: {
type: Boolean,
required: false,
default: false,
}
},
emits: ['opening', 'click', 'esc', 'close', 'closed'],
data() {
return {
showing: true,
fixed: false,
transformOrigin: 'center',
contentClicking: false,
point: null,
};
},
mounted() {
this.$watch('src', () => {
if (this.src) {
this.src.style.pointerEvents = 'none';
}
this.fixed = getFixedContainer(this.src) != null;
this.$nextTick(() => {
this.align();
});
}, { immediate: true });
this.$nextTick(() => {
const popover = this.$refs.content as any;
new ResizeObserver((entries, observer) => {
this.align();
}).observe(popover);
});
document.addEventListener('mousedown', this.onDocumentClick, { passive: true });
},
beforeUnmount() {
document.removeEventListener('mousedown', this.onDocumentClick);
},
methods: {
align() {
if (this.src == null) return;
const popover = this.$refs.content as any;
if (popover == null) return;
const rect = this.src.getBoundingClientRect();
const width = popover.offsetWidth;
const height = popover.offsetHeight;
let left;
let top;
if (this.srcCenter) {
const x = rect.left + (this.fixed ? 0 : window.pageXOffset) + (this.src.offsetWidth / 2);
const y = rect.top + (this.fixed ? 0 : window.pageYOffset) + (this.src.offsetHeight / 2);
left = (x - (width / 2));
top = (y - (height / 2));
} else {
const x = rect.left + (this.fixed ? 0 : window.pageXOffset) + (this.src.offsetWidth / 2);
const y = rect.top + (this.fixed ? 0 : window.pageYOffset) + this.src.offsetHeight;
left = (x - (width / 2));
top = y;
}
if (this.fixed) {
if (left + width > window.innerWidth) {
left = window.innerWidth - width;
}
if (top + height > window.innerHeight) {
top = window.innerHeight - height;
}
} else {
if (left + width - window.pageXOffset > window.innerWidth) {
left = window.innerWidth - width + window.pageXOffset - 1;
}
if (top + height - window.pageYOffset > window.innerHeight) {
top = window.innerHeight - height + window.pageYOffset - 1;
}
}
if (top < 0) {
top = 0;
}
if (left < 0) {
left = 0;
}
if (top > rect.top + (this.fixed ? 0 : window.pageYOffset)) {
this.point = 'top';
this.transformOrigin = 'center top';
} else {
this.point = null;
this.transformOrigin = 'center';
}
popover.style.left = left + 'px';
popover.style.top = top + 'px';
},
childRendered() {
// モーダルコンテンツにマウスボタンが押され、コンテンツ外でマウスボタンが離されたときにモーダルバックグラウンドクリックと判定させないためにマウスイベントを監視しフラグ管理する
const content = this.$refs.content.children[0];
content.addEventListener('mousedown', e => {
this.contentClicking = true;
window.addEventListener('mouseup', e => {
// click イベントより先に mouseup イベントが発生するかもしれないのでちょっと待つ
setTimeout(() => {
this.contentClicking = false;
}, 100);
}, { passive: true, once: true });
}, { passive: true });
},
close() {
if (this.src) this.src.style.pointerEvents = 'auto';
this.showing = false;
this.$emit('close');
},
onClosed() {
this.$emit('closed');
},
onDocumentClick(ev) {
const flyoutElement = this.$refs.content;
let targetElement = ev.target;
do {
if (targetElement === flyoutElement) {
return;
}
targetElement = targetElement.parentNode;
} while (targetElement);
this.close();
}
}
});
</script>
<style lang="scss" scoped>
.popup-menu-enter-active {
transform-origin: var(--transformOrigin);
transition: opacity 0.2s cubic-bezier(0, 0, 0.2, 1), transform 0.2s cubic-bezier(0, 0, 0.2, 1) !important;
}
.popup-menu-leave-active {
transform-origin: var(--transformOrigin);
transition: opacity 0.2s cubic-bezier(0.4, 0, 1, 1), transform 0.2s cubic-bezier(0.4, 0, 1, 1) !important;
}
.popup-menu-enter-from, .popup-menu-leave-to {
pointer-events: none;
opacity: 0;
transform: scale(0.9);
}
.ccczpooj {
position: absolute;
z-index: 10000;
&.fixed {
position: fixed;
}
&.front {
z-index: 20000;
}
}
</style>

View File

@ -23,14 +23,17 @@ export default defineComponent({
}, },
render() { render() {
const label = this.$slots.desc(); const label = this.$slots.desc();
const options = this.$slots.default(); let options = this.$slots.default();
// なぜかFragmentになることがあるため
if (options.length === 1 && options[0].props == null) options = options[0].children;
return h('div', { return h('div', {
class: 'novjtcto' class: 'novjtcto'
}, [ }, [
h('div', label), h('div', label),
...options.map(option => h(MkRadio, { ...options.map(option => h(MkRadio, {
key: option.props.value, key: option.key,
value: option.props.value, value: option.props.value,
modelValue: this.value, modelValue: this.value,
'onUpdate:modelValue': value => this.value = value, 'onUpdate:modelValue': value => this.value = value,

View File

@ -1,185 +1,218 @@
<template> <template>
<div class="eiipwacr" :class="{ focused, disabled, filled, inline }"> <div class="vblkjoeq">
<div class="icon" ref="icon"><slot name="icon"></slot></div> <div class="label" @click="focus"><slot name="label"></slot></div>
<div class="input" @click="focus"> <div class="input" :class="{ inline, disabled, focused }">
<span class="label" ref="label"><slot name="label"></slot></span> <div class="prefix" ref="prefixEl"><slot name="prefix"></slot></div>
<div class="prefix" ref="prefix"><slot name="prefix"></slot></div> <select ref="inputEl"
<select ref="input"
v-model="v" v-model="v"
:required="required"
:disabled="disabled" :disabled="disabled"
:required="required"
:readonly="readonly"
:placeholder="placeholder"
@focus="focused = true" @focus="focused = true"
@blur="focused = false" @blur="focused = false"
@input="onInput"
> >
<slot></slot> <slot></slot>
</select> </select>
<div class="suffix"> <div class="suffix" ref="suffixEl"><i class="fas fa-chevron-down"></i></div>
<slot name="suffix">
<i class="fas fa-chevron-down"></i>
</slot>
</div>
</div> </div>
<div class="text"><slot name="text"></slot></div> <div class="caption"><slot name="caption"></slot></div>
<MkButton v-if="manualSave && changed" @click="updated" primary><i class="fas fa-save"></i> {{ $ts.save }}</MkButton>
</div> </div>
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent, onMounted, onUnmounted, nextTick, ref, watch, computed, toRefs } from 'vue';
import MkButton from './button.vue';
export default defineComponent({ export default defineComponent({
components: {
MkButton,
},
props: { props: {
value: { modelValue: {
required: false required: true
}, },
required: { required: {
type: Boolean, type: Boolean,
required: false required: false
}, },
readonly: {
type: Boolean,
required: false
},
disabled: { disabled: {
type: Boolean, type: Boolean,
required: false required: false
}, },
placeholder: {
type: String,
required: false
},
autofocus: {
type: Boolean,
required: false,
default: false
},
inline: { inline: {
type: Boolean, type: Boolean,
required: false, required: false,
default: false default: false
}, },
manualSave: {
type: Boolean,
required: false,
default: false
},
}, },
data() {
emits: ['change', 'update:modelValue'],
setup(props, context) {
const { modelValue, autofocus } = toRefs(props);
const v = ref(modelValue.value);
const focused = ref(false);
const changed = ref(false);
const invalid = ref(false);
const filled = computed(() => v.value !== '' && v.value != null);
const inputEl = ref(null);
const prefixEl = ref(null);
const suffixEl = ref(null);
const focus = () => inputEl.value.focus();
const onInput = (ev) => {
changed.value = true;
context.emit('change', ev);
};
const updated = () => {
changed.value = false;
context.emit('update:modelValue', v.value);
};
watch(modelValue, newValue => {
v.value = newValue;
});
watch(v, newValue => {
if (!props.manualSave) {
updated();
}
invalid.value = inputEl.value.validity.badInput;
});
onMounted(() => {
nextTick(() => {
if (autofocus.value) {
focus();
}
// このコンポーネントが作成された時、非表示状態である場合がある
// 非表示状態だと要素の幅などは0になってしまうので、定期的に計算する
const clock = setInterval(() => {
if (prefixEl.value) {
if (prefixEl.value.offsetWidth) {
inputEl.value.style.paddingLeft = prefixEl.value.offsetWidth + 'px';
}
}
if (suffixEl.value) {
if (suffixEl.value.offsetWidth) {
inputEl.value.style.paddingRight = suffixEl.value.offsetWidth + 'px';
}
}
}, 100);
onUnmounted(() => {
clearInterval(clock);
});
});
});
return { return {
focused: false, v,
focused,
invalid,
changed,
filled,
inputEl,
prefixEl,
suffixEl,
focus,
onInput,
updated,
}; };
}, },
computed: {
v: {
get() {
return this.value;
},
set(v) {
this.$emit('update:value', v);
}
},
filled(): boolean {
return true;
}
},
mounted() {
if (this.$refs.prefix) {
this.$refs.label.style.left = (this.$refs.prefix.offsetLeft + this.$refs.prefix.offsetWidth) + 'px';
}
},
methods: {
focus() {
this.$refs.input.focus();
}
}
}); });
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.eiipwacr { .vblkjoeq {
position: relative; margin: 1.5em 0;
margin: 32px 0;
&:not(.inline):first-child { > .label {
margin-top: 8px; font-size: 0.85em;
padding: 0 0 8px 12px;
user-select: none;
&:empty {
display: none;
}
} }
&:not(.inline):last-child { > .caption {
margin-bottom: 8px; font-size: 0.8em;
} padding: 8px 0 0 12px;
color: var(--fgTransparentWeak);
> .icon { &:empty {
position: absolute; display: none;
top: 0;
left: 0;
width: 24px;
text-align: center;
line-height: 32px;
&:not(:empty) + .input {
margin-left: 28px;
} }
} }
> .input { > .input {
display: flex; $height: 42px;
position: relative; position: relative;
&:before {
content: '';
display: block;
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 1px;
background: var(--inputBorder);
}
&:after {
content: '';
display: block;
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 2px;
background: var(--accent);
opacity: 0;
transform: scaleX(0.12);
transition: border 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.3s cubic-bezier(0.4, 0, 0.2, 1), transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
will-change: border opacity transform;
}
> .label {
position: absolute;
top: 0;
left: 0;
pointer-events: none;
transition: 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);
transition-duration: 0.3s;
font-size: 1em;
line-height: 32px;
pointer-events: none;
//will-change transform
transform-origin: top left;
transform: scale(1);
}
> select { > select {
appearance: none;
-webkit-appearance: none;
display: block; display: block;
flex: 1; height: $height;
width: 100%; width: 100%;
padding: 0; margin: 0;
padding: 0 12px;
font: inherit; font: inherit;
font-weight: normal; font-weight: normal;
font-size: 1em; font-size: 1em;
height: 32px; color: var(--fg);
background: none; background: var(--panel);
border: none; border: solid 1px var(--inputBorder);
border-radius: 0; border-radius: 6px;
outline: none; outline: none;
box-shadow: none; box-shadow: none;
appearance: none; box-sizing: border-box;
-webkit-appearance: none; cursor: pointer;
color: var(--fg); transition: border-color 0.1s ease-out;
option, &:hover {
optgroup { border-color: var(--inputBorderHover);
color: var(--fg);
background: var(--bg);
} }
} }
> .prefix, > .prefix,
> .suffix { > .suffix {
display: block; display: flex;
align-self: center; align-items: center;
justify-self: center; position: absolute;
z-index: 1;
top: 0;
padding: 0 12px;
font-size: 1em; font-size: 1em;
line-height: 32px; height: $height;
color: var(--inputLabel);
pointer-events: none; pointer-events: none;
&:empty { &:empty {
@ -187,53 +220,41 @@ export default defineComponent({
} }
> * { > * {
display: block; display: inline-block;
min-width: 16px; min-width: 16px;
max-width: 150px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
} }
} }
> .prefix { > .prefix {
padding-right: 4px; left: 0;
padding-right: 6px;
} }
> .suffix { > .suffix {
padding-left: 4px; right: 0;
} padding-left: 6px;
}
> .text {
margin: 6px 0;
font-size: 0.8em;
&:empty {
display: none;
} }
* { &.inline {
display: inline-block;
margin: 0; margin: 0;
} }
}
&.focused { &.focused {
> .input { > select {
&:after { border-color: var(--accent);
opacity: 1;
transform: scaleX(1);
}
> .label {
color: var(--accent);
} }
} }
}
&.focused, &.disabled {
&.filled { opacity: 0.7;
> .input {
> .label { &, * {
top: -17px; cursor: not-allowed !important;
left: 0 !important;
transform: scale(0.75);
} }
} }
} }

View File

@ -18,7 +18,7 @@
</span> </span>
<span class="label"> <span class="label">
<span><slot></slot></span> <span><slot></slot></span>
<p><slot name="desc"></slot></p> <p><slot name="caption"></slot></p>
</span> </span>
</div> </div>
</template> </template>
@ -28,7 +28,7 @@ import { defineComponent } from 'vue';
export default defineComponent({ export default defineComponent({
props: { props: {
value: { modelValue: {
type: Boolean, type: Boolean,
default: false default: false
}, },
@ -39,13 +39,13 @@ export default defineComponent({
}, },
computed: { computed: {
checked(): boolean { checked(): boolean {
return this.value; return this.modelValue;
} }
}, },
methods: { methods: {
toggle() { toggle() {
if (this.disabled) return; if (this.disabled) return;
this.$emit('update:value', !this.checked); this.$emit('update:modelValue', !this.checked);
} }
} }
}); });
@ -136,7 +136,7 @@ export default defineComponent({
> p { > p {
margin: 0; margin: 0;
opacity: 0.7; color: var(--fgTransparentWeak);
font-size: 90%; font-size: 90%;
} }
} }

View File

@ -1,30 +1,45 @@
<template> <template>
<div class="adhpbeos" :class="{ focused, filled, tall, pre }"> <div class="adhpbeos">
<div class="input"> <div class="label" @click="focus"><slot name="label"></slot></div>
<span class="label" ref="label"><slot></slot></span> <div class="input" :class="{ disabled, focused, tall, pre }">
<textarea ref="input" :class="{ code, _monospace: code }" <textarea ref="inputEl"
:value="value" :class="{ code, _monospace: code }"
v-model="v"
:disabled="disabled"
:required="required" :required="required"
:readonly="readonly" :readonly="readonly"
:placeholder="placeholder"
:pattern="pattern" :pattern="pattern"
:autocomplete="autocomplete" :autocomplete="autocomplete"
:spellcheck="!code" :spellcheck="spellcheck"
@input="onInput"
@focus="focused = true" @focus="focused = true"
@blur="focused = false" @blur="focused = false"
@keydown="onKeydown($event)"
@input="onInput"
></textarea> ></textarea>
</div> </div>
<button class="save _textButton" v-if="save && changed" @click="() => { changed = false; save(); }">{{ $ts.save }}</button> <div class="caption"><slot name="caption"></slot></div>
<div class="desc _caption"><slot name="desc"></slot></div>
<MkButton v-if="manualSave && changed" @click="updated" primary><i class="fas fa-save"></i> {{ $ts.save }}</MkButton>
</div> </div>
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent, onMounted, onUnmounted, nextTick, ref, watch, computed, toRefs } from 'vue';
import MkButton from './button.vue';
import { debounce } from 'throttle-debounce';
export default defineComponent({ export default defineComponent({
components: {
MkButton,
},
props: { props: {
value: { modelValue: {
required: true
},
type: {
type: String,
required: false required: false
}, },
required: { required: {
@ -35,14 +50,29 @@ export default defineComponent({
type: Boolean, type: Boolean,
required: false required: false
}, },
disabled: {
type: Boolean,
required: false
},
pattern: { pattern: {
type: String, type: String,
required: false required: false
}, },
autocomplete: { placeholder: {
type: String, type: String,
required: false required: false
}, },
autofocus: {
type: Boolean,
required: false,
default: false
},
autocomplete: {
required: false
},
spellcheck: {
required: false
},
code: { code: {
type: Boolean, type: Boolean,
required: false required: false
@ -57,169 +87,164 @@ export default defineComponent({
required: false, required: false,
default: false default: false
}, },
save: { debounce: {
type: Function, type: Boolean,
required: false, required: false,
default: false
},
manualSave: {
type: Boolean,
required: false,
default: false
}, },
}, },
data() {
emits: ['change', 'keydown', 'enter', 'update:modelValue'],
setup(props, context) {
const { modelValue, autofocus } = toRefs(props);
const v = ref(modelValue.value);
const focused = ref(false);
const changed = ref(false);
const invalid = ref(false);
const filled = computed(() => v.value !== '' && v.value != null);
const inputEl = ref(null);
const focus = () => inputEl.value.focus();
const onInput = (ev) => {
changed.value = true;
context.emit('change', ev);
};
const onKeydown = (ev: KeyboardEvent) => {
context.emit('keydown', ev);
if (ev.code === 'Enter') {
context.emit('enter');
}
};
const updated = () => {
changed.value = false;
context.emit('update:modelValue', v.value);
};
const debouncedUpdated = debounce(1000, updated);
watch(modelValue, newValue => {
v.value = newValue;
});
watch(v, newValue => {
if (!props.manualSave) {
if (props.debounce) {
debouncedUpdated();
} else {
updated();
}
}
invalid.value = inputEl.value.validity.badInput;
});
onMounted(() => {
nextTick(() => {
if (autofocus.value) {
focus();
}
});
});
return { return {
focused: false, v,
changed: false, focused,
} invalid,
changed,
filled,
inputEl,
focus,
onInput,
onKeydown,
updated,
};
}, },
computed: {
filled(): boolean {
return this.value != '' && this.value != null;
}
},
methods: {
focus() {
this.$refs.input.focus();
},
onInput(ev) {
this.changed = true;
this.$emit('update:value', ev.target.value);
}
}
}); });
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.adhpbeos { .adhpbeos {
margin: 42px 0 32px 0; margin: 1.5em 0;
position: relative;
&:first-child { > .label {
margin-top: 16px; font-size: 0.85em;
padding: 0 0 8px 12px;
user-select: none;
&:empty {
display: none;
}
} }
&:last-child { > .caption {
margin-bottom: 0; font-size: 0.8em;
padding: 8px 0 0 12px;
color: var(--fgTransparentWeak);
&:empty {
display: none;
}
} }
> .input { > .input {
position: relative; position: relative;
&:before {
content: '';
display: block;
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
background: none;
border: solid 1px var(--inputBorder);
border-radius: 3px;
pointer-events: none;
}
&:after {
content: '';
display: block;
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
background: none;
border: solid 2px var(--accent);
border-radius: 3px;
opacity: 0;
transition: opacity 0.3s cubic-bezier(0.4, 0, 0.2, 1);
pointer-events: none;
}
> .label {
position: absolute;
top: 6px;
left: 12px;
pointer-events: none;
transition: 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);
transition-duration: 0.3s;
font-size: 1em;
line-height: 32px;
pointer-events: none;
//will-change transform
transform-origin: top left;
transform: scale(1);
}
> textarea { > textarea {
appearance: none;
-webkit-appearance: none;
display: block; display: block;
width: 100%; width: 100%;
min-width: 100%; min-width: 100%;
max-width: 100%; max-width: 100%;
min-height: 130px; min-height: 130px;
margin: 0;
padding: 12px; padding: 12px;
box-sizing: border-box;
font: inherit; font: inherit;
font-weight: normal; font-weight: normal;
font-size: 1em; font-size: 1em;
background: transparent; color: var(--fg);
border: none; background: var(--panel);
border-radius: 0; border: solid 1px var(--inputBorder);
border-radius: 6px;
outline: none; outline: none;
box-shadow: none; box-shadow: none;
color: var(--fg); box-sizing: border-box;
transition: border-color 0.1s ease-out;
&.code { &:hover {
tab-size: 2; border-color: var(--inputBorderHover);
} }
} }
}
> .save { &.focused {
margin: 6px 0 0 0; > textarea {
font-size: 0.8em; border-color: var(--accent);
}
> .desc {
margin: 6px 0 0 0;
&:empty {
display: none;
}
* {
margin: 0;
}
}
&.focused {
> .input {
&:after {
opacity: 1;
}
> .label {
color: var(--accent);
} }
} }
}
&.focused, &.disabled {
&.filled { opacity: 0.7;
> .input {
> .label { &, * {
top: -24px; cursor: not-allowed !important;
left: 0 !important;
transform: scale(0.75);
} }
} }
}
&.tall { &.tall {
> .input {
> textarea { > textarea {
min-height: 200px; min-height: 200px;
} }
} }
}
&.pre { &.pre {
> .input {
> textarea { > textarea {
white-space: pre; white-space: pre;
} }

View File

@ -1,17 +1,13 @@
<template> <template>
<transition :name="$store.state.animation ? 'window' : ''" appear @after-leave="$emit('closed')"> <transition :name="$store.state.animation ? 'window' : ''" appear @after-leave="$emit('closed')">
<div class="ebkgocck" :class="{ front }" v-if="showing"> <div class="ebkgocck" :class="{ front }" v-if="showing">
<div class="body _popup _shadow _narrow_" @mousedown="onBodyMousedown" @keydown="onKeydown"> <div class="body _window _shadow _narrow_" @mousedown="onBodyMousedown" @keydown="onKeydown">
<div class="header" :class="{ mini }" @contextmenu.prevent.stop="onContextmenu"> <div class="header" :class="{ mini }" @contextmenu.prevent.stop="onContextmenu">
<slot v-if="closeRight" name="buttons"><button class="_button" style="pointer-events: none;"></button></slot> <button v-if="closeButton" class="_button" @click="close()"><i class="fas fa-times"></i></button>
<button v-else class="_button" @click="close()"><i class="fas fa-times"></i></button>
<span class="title" @mousedown.prevent="onHeaderMousedown" @touchstart.prevent="onHeaderMousedown"> <span class="title" @mousedown.prevent="onHeaderMousedown" @touchstart.prevent="onHeaderMousedown">
<slot name="header"></slot> <slot name="header"></slot>
</span> </span>
<button v-if="closeRight" class="_button" @click="close()"><i class="fas fa-times"></i></button>
<slot v-else name="buttons"><button class="_button" style="pointer-events: none;"></button></slot>
</div> </div>
<div class="body" v-if="padding"> <div class="body" v-if="padding">
<div class="_section"> <div class="_section">
@ -86,10 +82,10 @@ export default defineComponent({
required: false, required: false,
default: false, default: false,
}, },
closeRight: { closeButton: {
type: Boolean, type: Boolean,
required: false, required: false,
default: false, default: true,
}, },
mini: { mini: {
type: Boolean, type: Boolean,
@ -420,6 +416,7 @@ export default defineComponent({
flex-shrink: 0; flex-shrink: 0;
user-select: none; user-select: none;
height: var(--height); height: var(--height);
border-bottom: solid 1px var(--divider);
> ::v-deep(button) { > ::v-deep(button) {
height: var(--height); height: var(--height);

View File

@ -29,9 +29,9 @@
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent } from 'vue';
import parseAcct from '@/misc/acct/parse'; import { parseAcct } from '@/misc/acct';
import MkFollowButton from './follow-button.vue'; import MkFollowButton from './follow-button.vue';
import { userPage } from '../filters/user'; import { userPage } from '@client/filters/user';
export default defineComponent({ export default defineComponent({
components: { components: {

View File

@ -18,7 +18,7 @@
import { defineComponent } from 'vue'; import { defineComponent } from 'vue';
import paging from '@client/scripts/paging'; import paging from '@client/scripts/paging';
import MkUserInfo from './user-info.vue'; import MkUserInfo from './user-info.vue';
import { userPage } from '../filters/user'; import { userPage } from '@client/filters/user';
export default defineComponent({ export default defineComponent({
components: { components: {

View File

@ -33,9 +33,9 @@
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent } from 'vue';
import parseAcct from '@/misc/acct/parse'; import { parseAcct } from '@/misc/acct';
import MkFollowButton from './follow-button.vue'; import MkFollowButton from './follow-button.vue';
import { userPage } from '../filters/user'; import { userPage } from '@client/filters/user';
import * as os from '@client/os'; import * as os from '@client/os';
export default defineComponent({ export default defineComponent({

View File

@ -10,9 +10,15 @@
<template #header>{{ $ts.selectUser }}</template> <template #header>{{ $ts.selectUser }}</template>
<div class="tbhwbxda _monolithic_"> <div class="tbhwbxda _monolithic_">
<div class="_section"> <div class="_section">
<div class="inputs"> <div class="_inputSplit _inputNoTopMargin _inputNoBottomMargin">
<MkInput v-model:value="username" class="input" @update:value="search" ref="username"><span>{{ $ts.username }}</span><template #prefix>@</template></MkInput> <MkInput v-model="username" class="input" @update:modelValue="search" ref="username">
<MkInput v-model:value="host" class="input" @update:value="search"><span>{{ $ts.host }}</span><template #prefix>@</template></MkInput> <template #label>{{ $ts.username }}</template>
<template #prefix>@</template>
</MkInput>
<MkInput v-model="host" class="input" @update:modelValue="search">
<template #label>{{ $ts.host }}</template>
<template #prefix>@</template>
</MkInput>
</div> </div>
</div> </div>
<div class="_section result" v-if="username != '' || host != ''" :class="{ hit: users.length > 0 }"> <div class="_section result" v-if="username != '' || host != ''" :class="{ hit: users.length > 0 }">
@ -138,14 +144,6 @@ export default defineComponent({
padding: 0; padding: 0;
} }
> .inputs {
> .input {
display: inline-block;
width: 50%;
margin: 0;
}
}
> .users { > .users {
flex: 1; flex: 1;
overflow: auto; overflow: auto;

View File

@ -28,7 +28,7 @@
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent } from 'vue';
import paging from '@client/scripts/paging'; import paging from '@client/scripts/paging';
import { userPage } from '../filters/user'; import { userPage } from '@client/filters/user';
export default defineComponent({ export default defineComponent({
mixins: [ mixins: [

View File

@ -2,7 +2,7 @@
<div class="vjoppmmu"> <div class="vjoppmmu">
<template v-if="edit"> <template v-if="edit">
<header> <header>
<MkSelect v-model:value="widgetAdderSelected" style="margin-bottom: var(--margin)"> <MkSelect v-model="widgetAdderSelected" style="margin-bottom: var(--margin)">
<template #label>{{ $ts.selectWidget }}</template> <template #label>{{ $ts.selectWidget }}</template>
<option v-for="widget in widgetDefs" :value="widget" :key="widget">{{ $t(`_widgets.${widget}`) }}</option> <option v-for="widget in widgetDefs" :value="widget" :key="widget">{{ $t(`_widgets.${widget}`) }}</option>
</MkSelect> </MkSelect>
@ -43,6 +43,7 @@ export default defineComponent({
props: { props: {
widgets: { widgets: {
type: Array,
required: true, required: true,
}, },
edit: { edit: {

View File

@ -6,7 +6,7 @@ export default {
const header = src.children[0]; const header = src.children[0];
const currentStickyTop = getComputedStyle(src).getPropertyValue('--stickyTop') || '0px'; const currentStickyTop = getComputedStyle(src).getPropertyValue('--stickyTop') || '0px';
src.style.setProperty('--stickyTop', `${parseInt(currentStickyTop) + header.offsetHeight}px`); src.style.setProperty('--stickyTop', `calc(${currentStickyTop} + ${header.offsetHeight}px)`);
header.style.setProperty('--stickyTop', currentStickyTop); header.style.setProperty('--stickyTop', currentStickyTop);
header.style.position = 'sticky'; header.style.position = 'sticky';
header.style.top = 'var(--stickyTop)'; header.style.top = 'var(--stickyTop)';

View File

@ -1,4 +1,4 @@
import getAcct from '@/misc/acct/render'; import { getAcct } from '@/misc/acct';
import getUserName from '@/misc/get-user-name'; import getUserName from '@/misc/get-user-name';
import { url } from '@client/config'; import { url } from '@client/config';

View File

@ -6,7 +6,7 @@ import '@client/style.scss';
import * as Sentry from '@sentry/browser'; import * as Sentry from '@sentry/browser';
import { Integrations } from '@sentry/tracing'; import { Integrations } from '@sentry/tracing';
import { computed, createApp, watch } from 'vue'; import { computed, createApp, watch, markRaw } from 'vue';
import widgets from '@client/widgets'; import widgets from '@client/widgets';
import directives from '@client/directives'; import directives from '@client/directives';
@ -34,18 +34,6 @@ console.info(`Misskey v${version}`);
window.onerror = null; window.onerror = null;
window.onunhandledrejection = null; window.onunhandledrejection = null;
// 後方互換性のため。
// TODO: そのうち消す
if ((typeof ColdDeviceStorage.get('lightTheme') === 'string') || (typeof ColdDeviceStorage.get('darkTheme') === 'string')) {
ColdDeviceStorage.set('lightTheme', require('@client/themes/l-light.json5'));
ColdDeviceStorage.set('darkTheme', require('@client/themes/d-dark.json5'));
}
const link = document.createElement('link');
link.rel = 'stylesheet';
link.href = 'https://use.fontawesome.com/releases/v5.15.3/css/all.css';
document.head.appendChild(link);
// TODOここまで
if (_DEV_) { if (_DEV_) {
console.warn('Development mode!!!'); console.warn('Development mode!!!');
@ -294,7 +282,7 @@ if ($i) {
} }
} }
const main = stream.useChannel('main', null, 'System'); const main = markRaw(stream.useChannel('main', null, 'System'));
// 自分の情報が更新されたとき // 自分の情報が更新されたとき
main.on('meUpdated', i => { main.on('meUpdated', i => {

View File

@ -5,7 +5,7 @@ import { i18n } from '@client/i18n';
import { $i } from './account'; import { $i } from './account';
import { unisonReload } from '@client/scripts/unison-reload'; import { unisonReload } from '@client/scripts/unison-reload';
export const sidebarDef = { export const menuDef = {
notifications: { notifications: {
title: 'notifications', title: 'notifications',
icon: 'fas fa-bell', icon: 'fas fa-bell',
@ -113,6 +113,16 @@ export const sidebarDef = {
icon: 'fas fa-satellite-dish', icon: 'fas fa-satellite-dish',
to: '/channels', to: '/channels',
}, },
federation: {
title: 'federation',
icon: 'fas fa-globe',
to: '/federation',
},
emojis: {
title: 'emojis',
icon: 'fas fa-laugh',
to: '/emojis',
},
games: { games: {
title: 'games', title: 'games',
icon: 'fas fa-gamepad', icon: 'fas fa-gamepad',
@ -133,7 +143,7 @@ export const sidebarDef = {
title: 'switchUi', title: 'switchUi',
icon: 'fas fa-columns', icon: 'fas fa-columns',
action: (ev) => { action: (ev) => {
os.modalMenu([{ os.popupMenu([{
text: i18n.locale.default, text: i18n.locale.default,
action: () => { action: () => {
localStorage.setItem('ui', 'default'); localStorage.setItem('ui', 'default');

View File

@ -368,10 +368,10 @@ export async function openEmojiPicker(src?: HTMLElement, opts, initialTextarea:
}); });
} }
export function modalMenu(items: any[], src?: HTMLElement, options?: { align?: string; viaKeyboard?: boolean }) { export function popupMenu(items: any[], src?: HTMLElement, options?: { align?: string; viaKeyboard?: boolean }) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
let dispose; let dispose;
popup(import('@client/components/ui/modal-menu.vue'), { popup(import('@client/components/ui/popup-menu.vue'), {
items, items,
src, src,
align: options?.align, align: options?.align,

View File

@ -1,11 +1,11 @@
<template> <template>
<transition :name="$store.state.animation ? 'zoom' : ''" appear> <transition :name="$store.state.animation ? 'zoom' : ''" appear>
<div class="_section"> <div class="mjndxjch">
<div class="mjndxjch _content"> <img src="https://xn--931a.moe/assets/error.jpg" class="_ghost"/>
<img src="https://xn--931a.moe/assets/error.jpg" class="_ghost"/> <p><b><i class="fas fa-exclamation-triangle"></i> {{ $ts.pageLoadError }}</b></p>
<p><i class="fas fa-exclamation-triangle"></i> {{ $ts.pageLoadError }}</p> <p>{{ $ts.pageLoadErrorDescription }}</p>
<p>{{ $ts.pageLoadErrorDescription }}</p> <p><MkA to="/docs/general/troubleshooting" class="_link">{{ $ts.troubleshooting }}</MkA></p>
</div> <p v-if="error" class="error">ERROR: {{ error }}</p>
</div> </div>
</transition> </transition>
</template> </template>
@ -19,6 +19,11 @@ export default defineComponent({
components: { components: {
MkButton, MkButton,
}, },
props: {
error: {
required: false,
}
},
data() { data() {
return { return {
[symbols.PAGE_INFO]: { [symbols.PAGE_INFO]: {
@ -32,10 +37,11 @@ export default defineComponent({
<style lang="scss" scoped> <style lang="scss" scoped>
.mjndxjch { .mjndxjch {
padding: 32px;
text-align: center; text-align: center;
> p { > p {
margin: 0 0 8px 0; margin: 0 0 12px 0;
} }
> .button { > .button {
@ -45,8 +51,12 @@ export default defineComponent({
> img { > img {
vertical-align: bottom; vertical-align: bottom;
height: 128px; height: 128px;
margin-bottom: 16px; margin-bottom: 24px;
border-radius: 16px; border-radius: 16px;
} }
> .error {
opacity: 0.7;
}
} }
</style> </style>

View File

@ -272,7 +272,7 @@ export default defineComponent({
showTypeMenu(e: MouseEvent) { showTypeMenu(e: MouseEvent) {
return new Promise<ThemeValue>((resolve) => { return new Promise<ThemeValue>((resolve) => {
os.modalMenu([{ os.popupMenu([{
text: this.$ts._theme.defaultValue, text: this.$ts._theme.defaultValue,
action: () => resolve(null), action: () => resolve(null),
}, { }, {

View File

@ -1,13 +1,13 @@
<template> <template>
<div class="_root"> <div class="_root">
<div class="_block" style="padding: 24px;"> <div class="_block" style="padding: 24px;">
<MkInput v-model:value="endpoint" :datalist="endpoints" @update:value="onEndpointChange()"> <MkInput v-model="endpoint" :datalist="endpoints" @update:modelValue="onEndpointChange()">
<span>Endpoint</span> <template #label>Endpoint</template>
</MkInput> </MkInput>
<MkTextarea v-model:value="body" code> <MkTextarea v-model="body" code>
<span>Params (JSON or JSON5)</span> <template #label>Params (JSON or JSON5)</template>
</MkTextarea> </MkTextarea>
<MkSwitch v-model:value="withCredential"> <MkSwitch v-model="withCredential">
With credential With credential
</MkSwitch> </MkSwitch>
<MkButton primary full @click="send" :disabled="sending"> <MkButton primary full @click="send" :disabled="sending">
@ -16,8 +16,8 @@
</MkButton> </MkButton>
</div> </div>
<div v-if="res" class="_block" style="padding: 24px;"> <div v-if="res" class="_block" style="padding: 24px;">
<MkTextarea v-model:value="res" code readonly tall> <MkTextarea v-model="res" code readonly tall>
<span>Response</span> <template #label>Response</template>
</MkTextarea> </MkTextarea>
</div> </div>
</div> </div>

Some files were not shown because too many files have changed in this diff Show More