Compare commits
	
		
			993 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					c815d11ed2 | ||
| 
						 | 
					350151ca5b | ||
| 
						 | 
					4339f9af29 | ||
| 
						 | 
					b44227948d | ||
| 
						 | 
					5dc8c8846d | ||
| 
						 | 
					e1bee8adf3 | ||
| 
						 | 
					b9ef750321 | ||
| 
						 | 
					e05c0e7d37 | ||
| 
						 | 
					a3eb0ddc4f | ||
| 
						 | 
					da6e71f2e0 | ||
| 
						 | 
					09e08e829d | ||
| 
						 | 
					1b78ae6290 | ||
| 
						 | 
					97f5ba0bc5 | ||
| 
						 | 
					8e29ccdc7f | ||
| 
						 | 
					4e48214068 | ||
| 
						 | 
					1bd128d507 | ||
| 
						 | 
					bfc1f8a25d | ||
| 
						 | 
					6369d79aaf | ||
| 
						 | 
					2df2cf0983 | ||
| 
						 | 
					c93fe423ea | ||
| 
						 | 
					ecac2990eb | ||
| 
						 | 
					a483af1b08 | ||
| 
						 | 
					01584a6bf9 | ||
| 
						 | 
					443f967611 | ||
| 
						 | 
					bf931f2c82 | ||
| 
						 | 
					5b32b900e4 | ||
| 
						 | 
					0bdcb15b3b | ||
| 
						 | 
					1b316ab98b | ||
| 
						 | 
					4cd79dd530 | ||
| 
						 | 
					c204e0518f | ||
| 
						 | 
					129d74b463 | ||
| 
						 | 
					533540031b | ||
| 
						 | 
					5ea0ccea22 | ||
| 
						 | 
					d2c12af085 | ||
| 
						 | 
					55368c2c38 | ||
| 
						 | 
					aa020eedc3 | ||
| 
						 | 
					e0874069bd | ||
| 
						 | 
					90c8568a3f | ||
| 
						 | 
					d7cd3a05dd | ||
| 
						 | 
					882c60ef10 | ||
| 
						 | 
					59c4c9a0b8 | ||
| 
						 | 
					4a57482216 | ||
| 
						 | 
					6bbccedb2d | ||
| 
						 | 
					fee629849e | ||
| 
						 | 
					e9ebc5151d | ||
| 
						 | 
					8a5c8e8e2e | ||
| 
						 | 
					4000da6be8 | ||
| 
						 | 
					977a4373c5 | ||
| 
						 | 
					e559417cab | ||
| 
						 | 
					f793478709 | ||
| 
						 | 
					15c9d15b8d | ||
| 
						 | 
					3c194142a8 | ||
| 
						 | 
					81dbf64eb7 | ||
| 
						 | 
					7e646f109c | ||
| 
						 | 
					d94c060998 | ||
| 
						 | 
					3d29b052ea | ||
| 
						 | 
					875d793512 | ||
| 
						 | 
					5cdd6521a2 | ||
| 
						 | 
					1df9c1005f | ||
| 
						 | 
					53481accf1 | ||
| 
						 | 
					8fcf75f77c | ||
| 
						 | 
					b1385de758 | ||
| 
						 | 
					f8ba73bebf | ||
| 
						 | 
					ff4cb3555b | ||
| 
						 | 
					361af34956 | ||
| 
						 | 
					11689e6d18 | ||
| 
						 | 
					6ea0028e0e | ||
| 
						 | 
					b39d12f01a | ||
| 
						 | 
					f97c1276fe | ||
| 
						 | 
					73375a2f43 | ||
| 
						 | 
					b87a35b71c | ||
| 
						 | 
					9db9067647 | ||
| 
						 | 
					7053c3125e | ||
| 
						 | 
					e89a63e88c | ||
| 
						 | 
					1b13700ae2 | ||
| 
						 | 
					b7c2fa0c0c | ||
| 
						 | 
					df847ebd86 | ||
| 
						 | 
					fa72856272 | ||
| 
						 | 
					20921e91bf | ||
| 
						 | 
					f597e7c4ae | ||
| 
						 | 
					380651ba62 | ||
| 
						 | 
					45f852b832 | ||
| 
						 | 
					80bf1d4b38 | ||
| 
						 | 
					6909add1ec | ||
| 
						 | 
					d53d059480 | ||
| 
						 | 
					22830965e3 | ||
| 
						 | 
					fa07b3023c | ||
| 
						 | 
					02568df664 | ||
| 
						 | 
					57acfae786 | ||
| 
						 | 
					949c113c7f | ||
| 
						 | 
					6656c87024 | ||
| 
						 | 
					16d7f4ff92 | ||
| 
						 | 
					2145d928df | ||
| 
						 | 
					463aa3f56b | ||
| 
						 | 
					38b4265bce | ||
| 
						 | 
					85c4fdfdb1 | ||
| 
						 | 
					4edb2d9587 | ||
| 
						 | 
					58be3393c3 | ||
| 
						 | 
					c64d8aa90a | ||
| 
						 | 
					0457cd0afc | ||
| 
						 | 
					ee8abb3abb | ||
| 
						 | 
					48516c2eb4 | ||
| 
						 | 
					8a88c896da | ||
| 
						 | 
					048b9c295e | ||
| 
						 | 
					6b3e3eb129 | ||
| 
						 | 
					46ecabc7cb | ||
| 
						 | 
					cc7af0b331 | ||
| 
						 | 
					af654ee92b | ||
| 
						 | 
					5c8adb3935 | ||
| 
						 | 
					794821a847 | ||
| 
						 | 
					4afbdaa3ce | ||
| 
						 | 
					4d98f4d022 | ||
| 
						 | 
					bec63f1454 | ||
| 
						 | 
					4e7b1537d7 | ||
| 
						 | 
					8010ad53ba | ||
| 
						 | 
					6acbde05c2 | ||
| 
						 | 
					beaecd54ee | ||
| 
						 | 
					f0af941cef | ||
| 
						 | 
					ac5d798cde | ||
| 
						 | 
					d2a7c56149 | ||
| 
						 | 
					fc0d339c9d | ||
| 
						 | 
					11303b5bec | ||
| 
						 | 
					b5bcc23d5f | ||
| 
						 | 
					7c92eb2a14 | ||
| 
						 | 
					466cae524e | ||
| 
						 | 
					620722cb55 | ||
| 
						 | 
					160f424466 | ||
| 
						 | 
					fa051df381 | ||
| 
						 | 
					5bd0695b0e | ||
| 
						 | 
					831adfd22e | ||
| 
						 | 
					9b5031dc4f | ||
| 
						 | 
					150c1340a7 | ||
| 
						 | 
					82190d18c8 | ||
| 
						 | 
					0887580132 | ||
| 
						 | 
					48f50bb811 | ||
| 
						 | 
					5d4c63edb3 | ||
| 
						 | 
					df6456c80a | ||
| 
						 | 
					81d5e8c301 | ||
| 
						 | 
					c221bf585c | ||
| 
						 | 
					cdac704836 | ||
| 
						 | 
					c0e0efa050 | ||
| 
						 | 
					2711f86a95 | ||
| 
						 | 
					c21119bb09 | ||
| 
						 | 
					7b172d0b33 | ||
| 
						 | 
					b102b1b0e8 | ||
| 
						 | 
					df4afb32e7 | ||
| 
						 | 
					ed21254497 | ||
| 
						 | 
					5505b2e7af | ||
| 
						 | 
					5d93748ff5 | ||
| 
						 | 
					abddea0443 | ||
| 
						 | 
					9fc1cc5255 | ||
| 
						 | 
					1aa274e10d | ||
| 
						 | 
					deeb536613 | ||
| 
						 | 
					66b64320f1 | ||
| 
						 | 
					9df620a520 | ||
| 
						 | 
					9851612acf | ||
| 
						 | 
					075934eac2 | ||
| 
						 | 
					7fe0fa22c3 | ||
| 
						 | 
					41dc729d95 | ||
| 
						 | 
					e2cb34f109 | ||
| 
						 | 
					ed7b619634 | ||
| 
						 | 
					d09050f13f | ||
| 
						 | 
					dcc76ab4f2 | ||
| 
						 | 
					e035d942b3 | ||
| 
						 | 
					9eada028b8 | ||
| 
						 | 
					1cac95ce8a | ||
| 
						 | 
					b707a574d1 | ||
| 
						 | 
					df40121e4c | ||
| 
						 | 
					0f2c3dfd79 | ||
| 
						 | 
					2c187460a0 | ||
| 
						 | 
					a32a78b5ef | ||
| 
						 | 
					80d7c9bdef | ||
| 
						 | 
					bc6439a339 | ||
| 
						 | 
					d93e60d4dd | ||
| 
						 | 
					4ba43b69b6 | ||
| 
						 | 
					02b9032587 | ||
| 
						 | 
					8b6649b41f | ||
| 
						 | 
					a5a25813d8 | ||
| 
						 | 
					27ceae7406 | ||
| 
						 | 
					5d75746681 | ||
| 
						 | 
					51a6bc4fe1 | ||
| 
						 | 
					94f866b7c8 | ||
| 
						 | 
					95be55135e | ||
| 
						 | 
					7c50d9f1e9 | ||
| 
						 | 
					5d9bb44f1b | ||
| 
						 | 
					b832323508 | ||
| 
						 | 
					48ce86d633 | ||
| 
						 | 
					b1e377dab0 | ||
| 
						 | 
					4c17d488d3 | ||
| 
						 | 
					73c585b9a2 | ||
| 
						 | 
					a3377ff0ba | ||
| 
						 | 
					0a17033551 | ||
| 
						 | 
					12c13660ca | ||
| 
						 | 
					3f1b85452b | ||
| 
						 | 
					5776c52205 | ||
| 
						 | 
					e7a36d6176 | ||
| 
						 | 
					8d42e94e57 | ||
| 
						 | 
					20386acf4e | ||
| 
						 | 
					c92e25ce16 | ||
| 
						 | 
					08599c887e | ||
| 
						 | 
					90ccbd3834 | ||
| 
						 | 
					0931681e8f | ||
| 
						 | 
					0a0da355b9 | ||
| 
						 | 
					b2ec82fba5 | ||
| 
						 | 
					d62597c265 | ||
| 
						 | 
					23d311b6ef | ||
| 
						 | 
					7efdee9145 | ||
| 
						 | 
					45429c9d6b | ||
| 
						 | 
					45adea23b4 | ||
| 
						 | 
					aaa8331733 | ||
| 
						 | 
					501922ed9c | ||
| 
						 | 
					652bb03087 | ||
| 
						 | 
					f1e769e74d | ||
| 
						 | 
					b2e4957bb8 | ||
| 
						 | 
					cb6a4037f2 | ||
| 
						 | 
					9740db8685 | ||
| 
						 | 
					41784de9be | ||
| 
						 | 
					208493ba13 | ||
| 
						 | 
					9798a9bf15 | ||
| 
						 | 
					1df8487d20 | ||
| 
						 | 
					dbfbdfa3f3 | ||
| 
						 | 
					27853e9d51 | ||
| 
						 | 
					03b4fe18f3 | ||
| 
						 | 
					1f32531e07 | ||
| 
						 | 
					a1397bfdbc | ||
| 
						 | 
					bcdb70f407 | ||
| 
						 | 
					ef81a66cf0 | ||
| 
						 | 
					186b0ea560 | ||
| 
						 | 
					ff53b04f4c | ||
| 
						 | 
					1ac9730c7d | ||
| 
						 | 
					d66e2947de | ||
| 
						 | 
					92ca9b1444 | ||
| 
						 | 
					f34ae64ff5 | ||
| 
						 | 
					9ca8383f39 | ||
| 
						 | 
					9fdc884e51 | ||
| 
						 | 
					eeb4772a3c | ||
| 
						 | 
					769e1ed45b | ||
| 
						 | 
					78207c8a4d | ||
| 
						 | 
					7837949b1a | ||
| 
						 | 
					14b16b4733 | ||
| 
						 | 
					256c216dfb | ||
| 
						 | 
					13cee2b4f5 | ||
| 
						 | 
					eb45eeb1ae | ||
| 
						 | 
					3154350b64 | ||
| 
						 | 
					519c9c4499 | ||
| 
						 | 
					c2f6b09969 | ||
| 
						 | 
					c8e2b22942 | ||
| 
						 | 
					f433182c4c | ||
| 
						 | 
					957392aaae | ||
| 
						 | 
					bd8d06e133 | ||
| 
						 | 
					dce347a117 | ||
| 
						 | 
					ef37e20555 | ||
| 
						 | 
					c617b60f70 | ||
| 
						 | 
					fe6243b7a0 | ||
| 
						 | 
					f5e31de81d | ||
| 
						 | 
					5c495ebf7c | ||
| 
						 | 
					9dd64c67a3 | ||
| 
						 | 
					018837db0b | ||
| 
						 | 
					00d5fdfc13 | ||
| 
						 | 
					2debb0c2ca | ||
| 
						 | 
					148d6737cc | ||
| 
						 | 
					c15cb8d28c | ||
| 
						 | 
					1d5471db70 | ||
| 
						 | 
					086b83c1fe | ||
| 
						 | 
					c509e0b86c | ||
| 
						 | 
					e8a1ad9823 | ||
| 
						 | 
					6446b1cfb1 | ||
| 
						 | 
					2b9216c441 | ||
| 
						 | 
					28656a701f | ||
| 
						 | 
					cd628eaf54 | ||
| 
						 | 
					3d62bd8007 | ||
| 
						 | 
					7ad9560f53 | ||
| 
						 | 
					c135d02895 | ||
| 
						 | 
					0757f67bde | ||
| 
						 | 
					c5dc25cb9e | ||
| 
						 | 
					0fcf422dec | ||
| 
						 | 
					21e801a325 | ||
| 
						 | 
					183faf3b2a | ||
| 
						 | 
					9fc66a2d1e | ||
| 
						 | 
					12cf598e6b | ||
| 
						 | 
					dd6cd6332c | ||
| 
						 | 
					5b9918538a | ||
| 
						 | 
					b05ba5bd68 | ||
| 
						 | 
					0afc7483f6 | ||
| 
						 | 
					c069d01e4b | ||
| 
						 | 
					070e5a3314 | ||
| 
						 | 
					43b5a1e469 | ||
| 
						 | 
					81bbf887e4 | ||
| 
						 | 
					e0aa2ab2b6 | ||
| 
						 | 
					f5000a0364 | ||
| 
						 | 
					694ea9b5a0 | ||
| 
						 | 
					d70bd44db7 | ||
| 
						 | 
					c3cd499e8e | ||
| 
						 | 
					20ee2118ee | ||
| 
						 | 
					64c89a6d52 | ||
| 
						 | 
					0a4a7bf64c | ||
| 
						 | 
					1546160f6a | ||
| 
						 | 
					dd77a6194e | ||
| 
						 | 
					203fba0216 | ||
| 
						 | 
					826a2466b7 | ||
| 
						 | 
					273bc6507a | ||
| 
						 | 
					2b13969b26 | ||
| 
						 | 
					f879ea760a | ||
| 
						 | 
					08d6269f90 | ||
| 
						 | 
					f454473d6c | ||
| 
						 | 
					2c347d7213 | ||
| 
						 | 
					e6158838e0 | ||
| 
						 | 
					974fe80245 | ||
| 
						 | 
					2f10ff1a2e | ||
| 
						 | 
					1f52aea193 | ||
| 
						 | 
					9676723c85 | ||
| 
						 | 
					9115629424 | ||
| 
						 | 
					8f02716774 | ||
| 
						 | 
					8feb5bd9a4 | ||
| 
						 | 
					826542201e | ||
| 
						 | 
					7ab1315008 | ||
| 
						 | 
					662407f1ba | ||
| 
						 | 
					679de41d8d | ||
| 
						 | 
					89a97142c2 | ||
| 
						 | 
					0a175fddba | ||
| 
						 | 
					64d40b7e49 | ||
| 
						 | 
					ac7e0d5973 | ||
| 
						 | 
					f095951193 | ||
| 
						 | 
					b93eab9cf7 | ||
| 
						 | 
					0a0e76679e | ||
| 
						 | 
					845f3436cc | ||
| 
						 | 
					f6a8c8cf76 | ||
| 
						 | 
					53298933e4 | ||
| 
						 | 
					af61a7a17f | ||
| 
						 | 
					667ad8fe96 | ||
| 
						 | 
					e1cc2394fa | ||
| 
						 | 
					e7cfae3ccb | ||
| 
						 | 
					ebb03113ab | ||
| 
						 | 
					04e1e48f17 | ||
| 
						 | 
					b3a0fe823e | ||
| 
						 | 
					c417e2f4a1 | ||
| 
						 | 
					02a27a8b12 | ||
| 
						 | 
					bd8897bcc8 | ||
| 
						 | 
					d775e19059 | ||
| 
						 | 
					35e7dca2bb | ||
| 
						 | 
					e3896122df | ||
| 
						 | 
					6c4ea5e087 | ||
| 
						 | 
					54a1e500e2 | ||
| 
						 | 
					450ed2c471 | ||
| 
						 | 
					bf97fcb2fd | ||
| 
						 | 
					4edeae07a0 | ||
| 
						 | 
					8e19e4d33b | ||
| 
						 | 
					2a774c9414 | ||
| 
						 | 
					6f50ed327d | ||
| 
						 | 
					a51d384f19 | ||
| 
						 | 
					e2b2e4633a | ||
| 
						 | 
					46ec773128 | ||
| 
						 | 
					1827a65874 | ||
| 
						 | 
					1b4dd64cbe | ||
| 
						 | 
					95b7d84025 | ||
| 
						 | 
					137b081b8a | ||
| 
						 | 
					76af9bbda7 | ||
| 
						 | 
					17ab07ae9c | ||
| 
						 | 
					4c4d06e49b | ||
| 
						 | 
					5d9ef68f14 | ||
| 
						 | 
					4689cf5591 | ||
| 
						 | 
					58e7edf08a | ||
| 
						 | 
					9c6c281ac3 | ||
| 
						 | 
					2326d6208b | ||
| 
						 | 
					cd4be4116b | ||
| 
						 | 
					6697ca243c | ||
| 
						 | 
					15ce89a88d | ||
| 
						 | 
					4b13278a41 | ||
| 
						 | 
					e01167fcab | ||
| 
						 | 
					719ff26e79 | ||
| 
						 | 
					2657328ac1 | ||
| 
						 | 
					4b7cef239e | ||
| 
						 | 
					49d9e51f72 | ||
| 
						 | 
					40a5f79d76 | ||
| 
						 | 
					9cfd0b7351 | ||
| 
						 | 
					2223ecf890 | ||
| 
						 | 
					06bad9c501 | ||
| 
						 | 
					a479e65f3e | ||
| 
						 | 
					a2e99e46b9 | ||
| 
						 | 
					07a27cfb9a | ||
| 
						 | 
					77f3a0d3a9 | ||
| 
						 | 
					f9065943c5 | ||
| 
						 | 
					d0aff4409d | ||
| 
						 | 
					84ea1fbd4d | ||
| 
						 | 
					d1d92be09a | ||
| 
						 | 
					52b23af97e | ||
| 
						 | 
					b76cd18dea | ||
| 
						 | 
					cd3b30bf5c | ||
| 
						 | 
					b87ebc6f9d | ||
| 
						 | 
					4d7d119524 | ||
| 
						 | 
					b4b6e9548d | ||
| 
						 | 
					ebf9cd18c8 | ||
| 
						 | 
					b1ccbb2deb | ||
| 
						 | 
					562cd6ad0b | ||
| 
						 | 
					a832672b59 | ||
| 
						 | 
					309058f209 | ||
| 
						 | 
					2a344dfbd8 | ||
| 
						 | 
					866d4cd59a | ||
| 
						 | 
					165350cca6 | ||
| 
						 | 
					8c21b8a9a6 | ||
| 
						 | 
					41e3a9a004 | ||
| 
						 | 
					4dc6ec5387 | ||
| 
						 | 
					96515c4544 | ||
| 
						 | 
					b3637b5e8a | ||
| 
						 | 
					43bcdf397e | ||
| 
						 | 
					22c5db7121 | ||
| 
						 | 
					1c6a8f8691 | ||
| 
						 | 
					31b5175bb0 | ||
| 
						 | 
					9add59aca9 | ||
| 
						 | 
					16c65173c1 | ||
| 
						 | 
					4f6ae4633f | ||
| 
						 | 
					8aa1577713 | ||
| 
						 | 
					5bd41704ae | ||
| 
						 | 
					4d0b335748 | ||
| 
						 | 
					5692ae59a1 | ||
| 
						 | 
					84f1ce866b | ||
| 
						 | 
					e68c6175ce | ||
| 
						 | 
					0de11c3636 | ||
| 
						 | 
					1f70657d4a | ||
| 
						 | 
					73646aac9b | ||
| 
						 | 
					e72c590c6b | ||
| 
						 | 
					06e026b346 | ||
| 
						 | 
					5621d5725c | ||
| 
						 | 
					14d0a07b29 | ||
| 
						 | 
					105fefd114 | ||
| 
						 | 
					f81c10fe62 | ||
| 
						 | 
					86a2aa42a4 | ||
| 
						 | 
					42f5c3fe22 | ||
| 
						 | 
					975740464c | ||
| 
						 | 
					c57bffb142 | ||
| 
						 | 
					d92a2cdb55 | ||
| 
						 | 
					5b91463233 | ||
| 
						 | 
					39eed3378f | ||
| 
						 | 
					cf98d40a44 | ||
| 
						 | 
					7d6436c90e | ||
| 
						 | 
					0acf3a8f6d | ||
| 
						 | 
					8b7324c8d3 | ||
| 
						 | 
					a0b0d5dff7 | ||
| 
						 | 
					bef0e36665 | ||
| 
						 | 
					766e721ff3 | ||
| 
						 | 
					93ad4b359e | ||
| 
						 | 
					b3032ad84d | ||
| 
						 | 
					4f76acd249 | ||
| 
						 | 
					fcc4b2c704 | ||
| 
						 | 
					12286f4915 | ||
| 
						 | 
					193abfdbac | ||
| 
						 | 
					0e13481eb4 | ||
| 
						 | 
					b713cac4f1 | ||
| 
						 | 
					2137c894ef | ||
| 
						 | 
					f0d2ce4f19 | ||
| 
						 | 
					e3a89d302f | ||
| 
						 | 
					d01d2ef65e | ||
| 
						 | 
					23c550acba | ||
| 
						 | 
					b9db88f616 | ||
| 
						 | 
					dee4a18d48 | ||
| 
						 | 
					fa5073b042 | ||
| 
						 | 
					9dda698dc8 | ||
| 
						 | 
					99d0930fba | ||
| 
						 | 
					a599524b5f | ||
| 
						 | 
					5f34758e87 | ||
| 
						 | 
					cdb8e41176 | ||
| 
						 | 
					d8f3e9d4a3 | ||
| 
						 | 
					da900439a3 | ||
| 
						 | 
					ad0273ab99 | ||
| 
						 | 
					8bbff90aca | ||
| 
						 | 
					fcb3ba9947 | ||
| 
						 | 
					23b3e33df6 | ||
| 
						 | 
					9edac2cd74 | ||
| 
						 | 
					fbe0d70661 | ||
| 
						 | 
					8782a64b18 | ||
| 
						 | 
					d3b81c3e00 | ||
| 
						 | 
					fd816afcd0 | ||
| 
						 | 
					ac423f1ef4 | ||
| 
						 | 
					f11ebafe47 | ||
| 
						 | 
					7947036af9 | ||
| 
						 | 
					b722431720 | ||
| 
						 | 
					295563caad | ||
| 
						 | 
					26735815f1 | ||
| 
						 | 
					c06a52c237 | ||
| 
						 | 
					5678adf3b5 | ||
| 
						 | 
					ac772dd389 | ||
| 
						 | 
					2c4de8475f | ||
| 
						 | 
					46facaf176 | ||
| 
						 | 
					eea1b7fc63 | ||
| 
						 | 
					f0e9386cd0 | ||
| 
						 | 
					e4a4238b57 | ||
| 
						 | 
					55e126998a | ||
| 
						 | 
					608a30d37b | ||
| 
						 | 
					7d22d6255d | ||
| 
						 | 
					4e55436339 | ||
| 
						 | 
					3adadc8a52 | ||
| 
						 | 
					b525af822c | ||
| 
						 | 
					bee8a5b065 | ||
| 
						 | 
					f4d80122b3 | ||
| 
						 | 
					2e8ea34413 | ||
| 
						 | 
					7341d97a00 | ||
| 
						 | 
					964b34bd3b | ||
| 
						 | 
					38e8d4bbea | ||
| 
						 | 
					cb106e6fe4 | ||
| 
						 | 
					61411605b8 | ||
| 
						 | 
					0ac7682188 | ||
| 
						 | 
					d7af18efbd | ||
| 
						 | 
					64bb6daa43 | ||
| 
						 | 
					0a1951f24c | ||
| 
						 | 
					8bb388f62a | ||
| 
						 | 
					ee36956451 | ||
| 
						 | 
					f1a0e95489 | ||
| 
						 | 
					de5d9470af | ||
| 
						 | 
					a9838495ce | ||
| 
						 | 
					d34c080822 | ||
| 
						 | 
					59f55a8291 | ||
| 
						 | 
					79ace6238a | ||
| 
						 | 
					89e88802b9 | ||
| 
						 | 
					c7f969a002 | ||
| 
						 | 
					18b186068d | ||
| 
						 | 
					037c67cbfb | ||
| 
						 | 
					c3ccee9097 | ||
| 
						 | 
					2449183f44 | ||
| 
						 | 
					1c98226621 | ||
| 
						 | 
					b405669672 | ||
| 
						 | 
					53fbe675a7 | ||
| 
						 | 
					6bcc174456 | ||
| 
						 | 
					a3493c4f07 | ||
| 
						 | 
					545ced7826 | ||
| 
						 | 
					a9a476a0d5 | ||
| 
						 | 
					8dfd35303c | ||
| 
						 | 
					498ca306e4 | ||
| 
						 | 
					5a46e08165 | ||
| 
						 | 
					c0c57044cc | ||
| 
						 | 
					42d00b96c6 | ||
| 
						 | 
					072360947b | ||
| 
						 | 
					d60ba8e37d | ||
| 
						 | 
					c10cf60059 | ||
| 
						 | 
					880689e28a | ||
| 
						 | 
					ade7050996 | ||
| 
						 | 
					71b5fae4d9 | ||
| 
						 | 
					d398e87ea1 | ||
| 
						 | 
					6256d021e6 | ||
| 
						 | 
					405f242ff9 | ||
| 
						 | 
					8823a6c1a1 | ||
| 
						 | 
					65a82f32be | ||
| 
						 | 
					fd593458a6 | ||
| 
						 | 
					3985fe6b09 | ||
| 
						 | 
					db71a5da62 | ||
| 
						 | 
					d76e3e4853 | ||
| 
						 | 
					eead9fad03 | ||
| 
						 | 
					b498072f9d | ||
| 
						 | 
					f56a961db2 | ||
| 
						 | 
					5d224f4eac | ||
| 
						 | 
					5b5edae11c | ||
| 
						 | 
					bd51154c46 | ||
| 
						 | 
					749a1ff8b6 | ||
| 
						 | 
					b06d46f46f | ||
| 
						 | 
					7146a534df | ||
| 
						 | 
					ef51e591ee | ||
| 
						 | 
					9d2f4d3ffb | ||
| 
						 | 
					f7e0b196eb | ||
| 
						 | 
					feb7e58912 | ||
| 
						 | 
					fbf04392c9 | ||
| 
						 | 
					e650818952 | ||
| 
						 | 
					76fcb1af87 | ||
| 
						 | 
					cce3e52642 | ||
| 
						 | 
					8c762e7b8e | ||
| 
						 | 
					f0dafa04a5 | ||
| 
						 | 
					81f39b3b36 | ||
| 
						 | 
					b162471d3e | ||
| 
						 | 
					2736e8d6fa | ||
| 
						 | 
					182f6f8faa | ||
| 
						 | 
					ff34655221 | ||
| 
						 | 
					f6ce6109f9 | ||
| 
						 | 
					899ac15d88 | ||
| 
						 | 
					7132f2062c | ||
| 
						 | 
					96b354c7f2 | ||
| 
						 | 
					715664a523 | ||
| 
						 | 
					e8ddfb4bfe | ||
| 
						 | 
					2a1229978e | ||
| 
						 | 
					b8af3515cd | ||
| 
						 | 
					f99e3f3d42 | ||
| 
						 | 
					d6057bd830 | ||
| 
						 | 
					975e57ec48 | ||
| 
						 | 
					bd35965c99 | ||
| 
						 | 
					1029bff5ff | ||
| 
						 | 
					6c1893f869 | ||
| 
						 | 
					0a89ba60bd | ||
| 
						 | 
					c6e418a242 | ||
| 
						 | 
					d9a6666ba8 | ||
| 
						 | 
					ab849fbbef | ||
| 
						 | 
					9d6b6053a6 | ||
| 
						 | 
					ddfd64944d | ||
| 
						 | 
					51153ed287 | ||
| 
						 | 
					0e7bbd1b32 | ||
| 
						 | 
					5049791d7f | ||
| 
						 | 
					1ebcf8d915 | ||
| 
						 | 
					e01873811a | ||
| 
						 | 
					d078b871e1 | ||
| 
						 | 
					c6375ae864 | ||
| 
						 | 
					483467e32f | ||
| 
						 | 
					c84d43bc5f | ||
| 
						 | 
					fdd42fc2d7 | ||
| 
						 | 
					8573e258f8 | ||
| 
						 | 
					6943c7d2d8 | ||
| 
						 | 
					4a42bf7b19 | ||
| 
						 | 
					b982f97c05 | ||
| 
						 | 
					d9207788d3 | ||
| 
						 | 
					0ad48cc896 | ||
| 
						 | 
					5e191a1f5b | ||
| 
						 | 
					8069e44d0a | ||
| 
						 | 
					0a83f0fd67 | ||
| 
						 | 
					83c54fb6b9 | ||
| 
						 | 
					5f6b0f689f | ||
| 
						 | 
					1b0b96526b | ||
| 
						 | 
					edb0469787 | ||
| 
						 | 
					3256a0914e | ||
| 
						 | 
					3c15182f24 | ||
| 
						 | 
					f7bc5e3c0b | ||
| 
						 | 
					19f327701d | ||
| 
						 | 
					6b30e371a2 | ||
| 
						 | 
					98fd6de5a1 | ||
| 
						 | 
					6635f25abe | ||
| 
						 | 
					5f93106eab | ||
| 
						 | 
					84f2994d47 | ||
| 
						 | 
					96f5c6d616 | ||
| 
						 | 
					b67923abb9 | ||
| 
						 | 
					310f7b3359 | ||
| 
						 | 
					c743c45989 | ||
| 
						 | 
					0322c51913 | ||
| 
						 | 
					b85e27c7e5 | ||
| 
						 | 
					aa351d1f7f | ||
| 
						 | 
					6b48b79758 | ||
| 
						 | 
					104ea7e277 | ||
| 
						 | 
					97de1ed3a8 | ||
| 
						 | 
					d69e9741da | ||
| 
						 | 
					0f5c737c1a | ||
| 
						 | 
					cb9960b0ac | ||
| 
						 | 
					1404539895 | ||
| 
						 | 
					2f901da58c | ||
| 
						 | 
					3637c1bfbc | ||
| 
						 | 
					28c3edc844 | ||
| 
						 | 
					9271a8c066 | ||
| 
						 | 
					7b16bfc736 | ||
| 
						 | 
					54450033e4 | ||
| 
						 | 
					fbf676d518 | ||
| 
						 | 
					47df0bbec1 | ||
| 
						 | 
					708f8b3cc3 | ||
| 
						 | 
					9de163ab09 | ||
| 
						 | 
					e21be29131 | ||
| 
						 | 
					1aabb725d0 | ||
| 
						 | 
					3e17c34187 | ||
| 
						 | 
					d57de01d37 | ||
| 
						 | 
					71918fdbf0 | ||
| 
						 | 
					cb8663873d | ||
| 
						 | 
					0f204eebe1 | ||
| 
						 | 
					dec572a6b7 | ||
| 
						 | 
					28848ba969 | ||
| 
						 | 
					4cfcd37a2b | ||
| 
						 | 
					2b0d5516d1 | ||
| 
						 | 
					3e3c3c10ab | ||
| 
						 | 
					3cc282db14 | ||
| 
						 | 
					4c1c865ba9 | ||
| 
						 | 
					9423c99427 | ||
| 
						 | 
					d1512c90f1 | ||
| 
						 | 
					85c9993106 | ||
| 
						 | 
					1d580009e4 | ||
| 
						 | 
					22ad21597a | ||
| 
						 | 
					76d8f66eff | ||
| 
						 | 
					febdf0cbee | ||
| 
						 | 
					ba05606074 | ||
| 
						 | 
					030fe8bec7 | ||
| 
						 | 
					4587c5a512 | ||
| 
						 | 
					96646e584b | ||
| 
						 | 
					fb2879df9c | ||
| 
						 | 
					26ea338e8e | ||
| 
						 | 
					1fad5ed6f3 | ||
| 
						 | 
					20db10516c | ||
| 
						 | 
					00631f58ec | ||
| 
						 | 
					35273e53bc | ||
| 
						 | 
					bfc458e935 | ||
| 
						 | 
					bb819d42f1 | ||
| 
						 | 
					5d76439224 | ||
| 
						 | 
					3d0b704af8 | ||
| 
						 | 
					05539ffc7b | ||
| 
						 | 
					c86deab69c | ||
| 
						 | 
					21f8dbf2de | ||
| 
						 | 
					6731f904f2 | ||
| 
						 | 
					f6e74f529e | ||
| 
						 | 
					c860a2f7f3 | ||
| 
						 | 
					7b141722ae | ||
| 
						 | 
					fc516ffb7f | ||
| 
						 | 
					11604593a6 | ||
| 
						 | 
					6f3468ccd2 | ||
| 
						 | 
					e3be90503c | ||
| 
						 | 
					22d38e0d24 | ||
| 
						 | 
					8b654fb40a | ||
| 
						 | 
					91cd9831bc | ||
| 
						 | 
					805d72d42f | ||
| 
						 | 
					0d4a1719a6 | ||
| 
						 | 
					32ab57e11b | ||
| 
						 | 
					5174e16f7b | ||
| 
						 | 
					9b746f3eb5 | ||
| 
						 | 
					becd038660 | ||
| 
						 | 
					2a6cfec0e6 | ||
| 
						 | 
					dfc6ef4be6 | ||
| 
						 | 
					c8b45f4f42 | ||
| 
						 | 
					09c57e6d03 | ||
| 
						 | 
					5edb1da097 | ||
| 
						 | 
					b3ad3a6535 | ||
| 
						 | 
					3709bb23bc | ||
| 
						 | 
					28be5c0b81 | ||
| 
						 | 
					60ef74047a | ||
| 
						 | 
					f81596c8d5 | ||
| 
						 | 
					075b7e3060 | ||
| 
						 | 
					cc7d6198ec | ||
| 
						 | 
					5766c2ce1b | ||
| 
						 | 
					03fed08c03 | ||
| 
						 | 
					4662641feb | ||
| 
						 | 
					00e2ce9489 | ||
| 
						 | 
					c2ec81f93a | ||
| 
						 | 
					47561a6f8b | ||
| 
						 | 
					c81eb49f9e | ||
| 
						 | 
					205c0d44d5 | ||
| 
						 | 
					dc1bdbaaa5 | ||
| 
						 | 
					d619a92a37 | ||
| 
						 | 
					59ad529162 | ||
| 
						 | 
					c4c44e04fd | ||
| 
						 | 
					fae58a9ab0 | ||
| 
						 | 
					fa03c172f2 | ||
| 
						 | 
					89ac15b4de | ||
| 
						 | 
					10d3b81251 | ||
| 
						 | 
					71dceca225 | ||
| 
						 | 
					40de631d95 | ||
| 
						 | 
					6985c39874 | ||
| 
						 | 
					0938ea3964 | ||
| 
						 | 
					4b4c19b242 | ||
| 
						 | 
					d8620187ec | ||
| 
						 | 
					520849d070 | ||
| 
						 | 
					b6a028a8ed | ||
| 
						 | 
					7db799a0ac | ||
| 
						 | 
					1ab776c867 | ||
| 
						 | 
					f4c9f63548 | ||
| 
						 | 
					08da9d70cd | ||
| 
						 | 
					96173e5c0b | ||
| 
						 | 
					b37cc70742 | ||
| 
						 | 
					96ee4299c7 | ||
| 
						 | 
					6072b02f12 | ||
| 
						 | 
					6ccbca0741 | ||
| 
						 | 
					360394fd5c | ||
| 
						 | 
					dcb45aa953 | ||
| 
						 | 
					a8fcc1aad9 | ||
| 
						 | 
					4d69cd86f1 | ||
| 
						 | 
					6e14e58b89 | ||
| 
						 | 
					af5839bb59 | ||
| 
						 | 
					a53e0d9f73 | ||
| 
						 | 
					49921f2dcf | ||
| 
						 | 
					70d2d61b9a | ||
| 
						 | 
					9abaf80f6b | ||
| 
						 | 
					25948fc3c9 | ||
| 
						 | 
					6b947c2139 | ||
| 
						 | 
					98acf919f1 | ||
| 
						 | 
					c9c2853150 | ||
| 
						 | 
					2bc708f8e6 | ||
| 
						 | 
					874b8fc3c2 | ||
| 
						 | 
					7d6aac3431 | ||
| 
						 | 
					e2fc7decad | ||
| 
						 | 
					21bed71f5e | ||
| 
						 | 
					747a5694f8 | ||
| 
						 | 
					479a0a2deb | ||
| 
						 | 
					14aef6ec89 | ||
| 
						 | 
					f0d2b3f449 | ||
| 
						 | 
					3b974428fc | ||
| 
						 | 
					580191fb17 | ||
| 
						 | 
					be0cb88b6c | ||
| 
						 | 
					95c4e4497e | ||
| 
						 | 
					2ec445f83e | ||
| 
						 | 
					51b915428e | ||
| 
						 | 
					1395cf89ce | ||
| 
						 | 
					2a8f984db7 | ||
| 
						 | 
					decf2d396f | ||
| 
						 | 
					f7964da899 | ||
| 
						 | 
					c8607ff7b6 | ||
| 
						 | 
					e9f8897fe2 | ||
| 
						 | 
					e0b107a3a0 | ||
| 
						 | 
					abf2c89931 | ||
| 
						 | 
					1d3e6a7197 | ||
| 
						 | 
					288bf195e9 | ||
| 
						 | 
					7e3cc11cc4 | ||
| 
						 | 
					4e07e94af0 | ||
| 
						 | 
					9cb49c9204 | ||
| 
						 | 
					580dd729e5 | ||
| 
						 | 
					49ab77c86e | ||
| 
						 | 
					f98914b9f1 | ||
| 
						 | 
					f3f3599b28 | ||
| 
						 | 
					f67b1beee4 | ||
| 
						 | 
					8395d0f1ba | ||
| 
						 | 
					af203bee93 | ||
| 
						 | 
					760fb79dad | ||
| 
						 | 
					ee9d4119c2 | ||
| 
						 | 
					90027efcbf | ||
| 
						 | 
					1848de1dc4 | ||
| 
						 | 
					1c93fcb1c4 | ||
| 
						 | 
					e3389e7899 | ||
| 
						 | 
					454632d785 | ||
| 
						 | 
					c9bca7dc85 | ||
| 
						 | 
					710ba526fa | ||
| 
						 | 
					aa47b6732d | ||
| 
						 | 
					20f83420ca | ||
| 
						 | 
					d09a68ef11 | ||
| 
						 | 
					b545be5799 | ||
| 
						 | 
					4fc377584f | ||
| 
						 | 
					a5f09c90dd | ||
| 
						 | 
					ba407c3eb0 | ||
| 
						 | 
					d059d7f972 | ||
| 
						 | 
					c03e2dfbc0 | ||
| 
						 | 
					45c5e7b967 | ||
| 
						 | 
					c81a94ff75 | ||
| 
						 | 
					acc6f54557 | ||
| 
						 | 
					8025b121af | ||
| 
						 | 
					78ec06bda3 | ||
| 
						 | 
					6ef83d9c59 | ||
| 
						 | 
					fca4ceef21 | ||
| 
						 | 
					00f979f0e6 | ||
| 
						 | 
					556677be7a | ||
| 
						 | 
					624fd093f2 | ||
| 
						 | 
					2ee438dece | ||
| 
						 | 
					534de24406 | ||
| 
						 | 
					014edce1b9 | ||
| 
						 | 
					ac1f3de4c6 | ||
| 
						 | 
					dced228cb0 | ||
| 
						 | 
					a92244cc12 | ||
| 
						 | 
					0717688933 | ||
| 
						 | 
					87d54b7d40 | ||
| 
						 | 
					ed51f5c7de | ||
| 
						 | 
					66e2db0d52 | ||
| 
						 | 
					03be4826df | ||
| 
						 | 
					c9d5aef04f | ||
| 
						 | 
					106cb3fe3e | ||
| 
						 | 
					48320f8536 | ||
| 
						 | 
					1a0845dc0a | ||
| 
						 | 
					185d09f3ed | ||
| 
						 | 
					8e25fb6cb7 | ||
| 
						 | 
					e88ce1746d | ||
| 
						 | 
					b8aad35009 | ||
| 
						 | 
					47bd485a39 | ||
| 
						 | 
					ad869d7469 | ||
| 
						 | 
					d15cce5337 | ||
| 
						 | 
					37daff6d61 | ||
| 
						 | 
					5417e40f59 | ||
| 
						 | 
					0fed33bfdb | ||
| 
						 | 
					5dddc75d09 | ||
| 
						 | 
					081578c604 | ||
| 
						 | 
					6c47bf5b76 | ||
| 
						 | 
					936bb1bcd0 | ||
| 
						 | 
					d5241d9a3e | ||
| 
						 | 
					05b4430c92 | ||
| 
						 | 
					292e911de2 | ||
| 
						 | 
					1c4ba2c037 | ||
| 
						 | 
					452db13d0c | ||
| 
						 | 
					c3f64b395b | ||
| 
						 | 
					3fa6bf93a4 | ||
| 
						 | 
					a13d76bec5 | ||
| 
						 | 
					05cee078d0 | ||
| 
						 | 
					706d3f3f95 | ||
| 
						 | 
					c5cf034b5d | ||
| 
						 | 
					3a04aa93f9 | ||
| 
						 | 
					838cdbedbd | ||
| 
						 | 
					9e85291cd3 | ||
| 
						 | 
					7f77517fc8 | ||
| 
						 | 
					b2f288dcac | ||
| 
						 | 
					52b59e9d7b | ||
| 
						 | 
					80c74b1fa7 | ||
| 
						 | 
					91811ea500 | ||
| 
						 | 
					57150fd910 | ||
| 
						 | 
					cddbbdf5d0 | ||
| 
						 | 
					423dc2349b | ||
| 
						 | 
					5229bbd55d | ||
| 
						 | 
					28311b9a2b | ||
| 
						 | 
					663d17a485 | ||
| 
						 | 
					08d005dfd9 | ||
| 
						 | 
					02edbc131b | ||
| 
						 | 
					0556a2a2da | ||
| 
						 | 
					65d943e42a | ||
| 
						 | 
					3bcb344ecb | ||
| 
						 | 
					82d721d60b | ||
| 
						 | 
					48dc56e834 | ||
| 
						 | 
					2c33bd6e31 | ||
| 
						 | 
					b6524616bc | ||
| 
						 | 
					7e2b70f912 | ||
| 
						 | 
					4f071a66b6 | ||
| 
						 | 
					39f2303429 | ||
| 
						 | 
					cacf072027 | ||
| 
						 | 
					6ab1fdfe1a | ||
| 
						 | 
					6e5c93f926 | ||
| 
						 | 
					1670737075 | ||
| 
						 | 
					fee235c4e4 | ||
| 
						 | 
					7a39d489f2 | ||
| 
						 | 
					7c634218d1 | ||
| 
						 | 
					2704c5be73 | ||
| 
						 | 
					489b51ba9f | ||
| 
						 | 
					21807c29f1 | ||
| 
						 | 
					3bc62fe3eb | ||
| 
						 | 
					ba0e3c4a5f | ||
| 
						 | 
					9ec1fb5e37 | ||
| 
						 | 
					d708409462 | ||
| 
						 | 
					07d05d4f86 | ||
| 
						 | 
					bbdb2ebb40 | ||
| 
						 | 
					f7908ba098 | ||
| 
						 | 
					f2fda3075e | ||
| 
						 | 
					1338a68979 | ||
| 
						 | 
					e7da505fb3 | ||
| 
						 | 
					5a9228372f | ||
| 
						 | 
					c4a6ba9097 | ||
| 
						 | 
					d5871b408b | ||
| 
						 | 
					7b3338e373 | ||
| 
						 | 
					d18ee12d2f | ||
| 
						 | 
					ca9cc97940 | ||
| 
						 | 
					a70070ac7d | ||
| 
						 | 
					069d99b320 | ||
| 
						 | 
					37d350dcad | ||
| 
						 | 
					8653e09b59 | ||
| 
						 | 
					7cd2d59576 | ||
| 
						 | 
					a0839de38f | ||
| 
						 | 
					b7c5c71c6f | ||
| 
						 | 
					adab0adbdd | ||
| 
						 | 
					2faa58928f | ||
| 
						 | 
					ffb80efe21 | ||
| 
						 | 
					6f959218ef | ||
| 
						 | 
					be1125dcb9 | ||
| 
						 | 
					9ab34c2301 | ||
| 
						 | 
					0166d81d9e | ||
| 
						 | 
					0b26efbd2f | ||
| 
						 | 
					2cbaedf946 | ||
| 
						 | 
					b66924fbe8 | ||
| 
						 | 
					8c91148954 | ||
| 
						 | 
					be0eff3dda | ||
| 
						 | 
					85903ac9c6 | ||
| 
						 | 
					dbdd778dc7 | ||
| 
						 | 
					fc50dfd8d5 | ||
| 
						 | 
					f444e132ee | ||
| 
						 | 
					68f562c323 | ||
| 
						 | 
					820ea69613 | ||
| 
						 | 
					6f4b3853a1 | ||
| 
						 | 
					a706ad0e80 | ||
| 
						 | 
					820116affc | ||
| 
						 | 
					52650342be | ||
| 
						 | 
					85ddabdc65 | ||
| 
						 | 
					0730cc4fa4 | ||
| 
						 | 
					17b6ab0ef0 | ||
| 
						 | 
					4e208b85bb | ||
| 
						 | 
					00f8b29f6d | ||
| 
						 | 
					9cf0fcadb1 | ||
| 
						 | 
					c595efeead | ||
| 
						 | 
					b56c6793a1 | ||
| 
						 | 
					ebceffba1e | ||
| 
						 | 
					3ae42d9b85 | ||
| 
						 | 
					796237b3c6 | ||
| 
						 | 
					cb7a97ee4c | ||
| 
						 | 
					0cf758b6d1 | ||
| 
						 | 
					d28fca320e | ||
| 
						 | 
					8bd17703c3 | ||
| 
						 | 
					a78eebc43f | ||
| 
						 | 
					79fb5246df | ||
| 
						 | 
					458b8c78dc | ||
| 
						 | 
					64e0cbd6fc | ||
| 
						 | 
					7fe937026b | ||
| 
						 | 
					656cec65b9 | ||
| 
						 | 
					8045bbff1c | ||
| 
						 | 
					c1a7a21746 | ||
| 
						 | 
					f3ee63fcbe | ||
| 
						 | 
					7645c212a3 | ||
| 
						 | 
					8b38e2ea58 | ||
| 
						 | 
					c9eb6a8919 | ||
| 
						 | 
					9a41fd4734 | ||
| 
						 | 
					70d96ee076 | ||
| 
						 | 
					3b6fb3959b | ||
| 
						 | 
					484d705320 | ||
| 
						 | 
					786031be66 | ||
| 
						 | 
					bc0027ce43 | ||
| 
						 | 
					3e7c6d9bdc | ||
| 
						 | 
					5463e3e55e | ||
| 
						 | 
					84a880086e | ||
| 
						 | 
					89419b7136 | ||
| 
						 | 
					9106ec74f7 | ||
| 
						 | 
					ebf9a0921d | ||
| 
						 | 
					c237f49016 | ||
| 
						 | 
					709290d2da | ||
| 
						 | 
					eb3180f3b6 | ||
| 
						 | 
					681997509c | ||
| 
						 | 
					79ff5888fd | ||
| 
						 | 
					9ee9cf8d81 | ||
| 
						 | 
					ee3c0f6f18 | ||
| 
						 | 
					9dd463bff4 | ||
| 
						 | 
					df297d0031 | ||
| 
						 | 
					d18d1cb958 | ||
| 
						 | 
					5bc0570888 | 
@@ -35,7 +35,7 @@ while :
 | 
			
		||||
  cat patreon.cache | \
 | 
			
		||||
  awk -F'\t' '{print $2,$1}' | \
 | 
			
		||||
  sed -e 's/ /\\" alt=\\"/' | \
 | 
			
		||||
  xargs -I% echo '<td><img src="%"></td>' >> patreon.md.cache && \
 | 
			
		||||
  xargs -I% echo '<td><img src="%" width="100"></td>' >> patreon.md.cache && \
 | 
			
		||||
  echo '</tr><tr>' >> patreon.md.cache && \
 | 
			
		||||
  cat patreon.cache | \
 | 
			
		||||
  awk -F'\t' '{print $3,$1}' | \
 | 
			
		||||
 
 | 
			
		||||
@@ -54,6 +54,8 @@ jobs:
 | 
			
		||||
      - run:
 | 
			
		||||
          name: Build
 | 
			
		||||
          command: |
 | 
			
		||||
            node-gyp configure
 | 
			
		||||
            node-gyp build
 | 
			
		||||
            npm run build || (echo -e '\033[0;34mRebuild modules\033[0;39m' && ls -1A node_modules | grep '^[^@]' | xargs npm rebuild && ls -1A node_modules | grep '^@' | xargs -I%1 sh -c 'ls -1A node_modules/'%1' | xargs -P0 -I%2 npm rebuild node_modules/'%1'/%2' && npm run build)
 | 
			
		||||
            ls -1ARl node_modules > ls
 | 
			
		||||
      - save_cache:
 | 
			
		||||
@@ -88,7 +90,7 @@ jobs:
 | 
			
		||||
      - run:
 | 
			
		||||
          name: Test
 | 
			
		||||
          command: |
 | 
			
		||||
            npm run test || (npm rebuild && npm run test) || ((node-gyp configure && node-gyp build && npm run build || (echo -e '\033[0;34mRebuild modules\033[0;39m' && ls -1A node_modules | grep '^[^@]' | xargs npm rebuild && ls -1A node_modules | grep '^@' | xargs -I%1 sh -c 'ls -1A node_modules/'%1' | xargs -P0 -I%2 npm rebuild node_modules/'%1'/%2' && npm run build)) && npm run test)
 | 
			
		||||
            npm run test
 | 
			
		||||
            ls -1ARl node_modules > ls
 | 
			
		||||
      - save_cache:
 | 
			
		||||
          name: Cache npm packages
 | 
			
		||||
 
 | 
			
		||||
@@ -108,13 +108,5 @@ autoAdmin: true
 | 
			
		||||
#  port: 9200
 | 
			
		||||
#  pass: null
 | 
			
		||||
 | 
			
		||||
# ServiceWorker
 | 
			
		||||
#sw:
 | 
			
		||||
#  # Public key of VAPID
 | 
			
		||||
#  public_key: example-sw-public-key
 | 
			
		||||
#
 | 
			
		||||
#  # Private key of VAPID
 | 
			
		||||
#  private_key: example-sw-private-key
 | 
			
		||||
 | 
			
		||||
# Clustering
 | 
			
		||||
#clusterLimit: 1
 | 
			
		||||
 
 | 
			
		||||
@@ -15,6 +15,9 @@
 | 
			
		||||
		"vue/attributes-order": false,
 | 
			
		||||
		"vue/require-prop-types": false,
 | 
			
		||||
		"vue/require-default-prop": false,
 | 
			
		||||
		"vue/html-closing-bracket-spacing": false,
 | 
			
		||||
		"vue/singleline-html-element-content-newline": false,
 | 
			
		||||
		"vue/no-v-html": false,
 | 
			
		||||
		"no-console": 0,
 | 
			
		||||
		"no-unused-vars": 0,
 | 
			
		||||
		"no-empty": 0
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										13
									
								
								.github/PULL_REQUEST_TEMPLATE.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								.github/PULL_REQUEST_TEMPLATE.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
			
		||||
# Summary
 | 
			
		||||
 | 
			
		||||
<!--
 | 
			
		||||
  -
 | 
			
		||||
  - * Please describe your changes here *
 | 
			
		||||
  -
 | 
			
		||||
  - If you are going to resolve some issue, please add this context.
 | 
			
		||||
  - Resolve #ISSUE_NUMBER
 | 
			
		||||
  -
 | 
			
		||||
  - If you are going to fix some bug issue, please add this context.
 | 
			
		||||
  - Fix #ISSUE_NUMBER
 | 
			
		||||
  -
 | 
			
		||||
  -->
 | 
			
		||||
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -18,3 +18,4 @@ api-docs.json
 | 
			
		||||
/elasticsearch
 | 
			
		||||
*.code-workspace
 | 
			
		||||
yarn.lock
 | 
			
		||||
.DS_Store
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								.node-version
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.node-version
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
v11.7.0
 | 
			
		||||
							
								
								
									
										216
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										216
									
								
								CHANGELOG.md
									
									
									
									
									
								
							@@ -1,6 +1,222 @@
 | 
			
		||||
ChangeLog
 | 
			
		||||
=========
 | 
			
		||||
 | 
			
		||||
10.78.4
 | 
			
		||||
----------
 | 
			
		||||
* フォロワー限定投稿がユーザータイムラインに含まれていない問題を修正
 | 
			
		||||
* データベースのインデックス設定を修正
 | 
			
		||||
* UIの修正
 | 
			
		||||
* など
 | 
			
		||||
 | 
			
		||||
10.78.3
 | 
			
		||||
----------
 | 
			
		||||
* 投票未対応インスタンス向けメッセージをわかりやすく
 | 
			
		||||
* リバーシが404になる問題を修正
 | 
			
		||||
* デザインの修正
 | 
			
		||||
 | 
			
		||||
10.78.2
 | 
			
		||||
----------
 | 
			
		||||
* リバーシが404になる問題を修正
 | 
			
		||||
* ストリームで流れてくる投稿とAPIでタイムラインを取得したときとの不一致を修正
 | 
			
		||||
 | 
			
		||||
10.78.1
 | 
			
		||||
----------
 | 
			
		||||
* 「関係のない返信がタイムラインに流れる問題を修正」を取り消し
 | 
			
		||||
* デザインの修正
 | 
			
		||||
 | 
			
		||||
10.78.0
 | 
			
		||||
----------
 | 
			
		||||
* 他のインスタンスからアンケートに投票できるように
 | 
			
		||||
* スパムアカウントを報告できるように
 | 
			
		||||
* アクティブユーザー数のチャートを追加
 | 
			
		||||
* 管理画面でドライブのファイルをURLやIDから操作できるように
 | 
			
		||||
* リアクション解除を他のサーバーと送受信するように
 | 
			
		||||
* ログイン時に二段階認証が分かりにくいのを改善
 | 
			
		||||
* 投稿のツールチップを出すのは時間の上だけに変更
 | 
			
		||||
* `*`や`_`でもイタリック構文を使えるように(アルファベットのみ)
 | 
			
		||||
* `__`でも太字構文を使えるように(アルファベットのみ)
 | 
			
		||||
* ハッシュタグ判定の強化
 | 
			
		||||
* ストーク機能の廃止
 | 
			
		||||
* ソーシャルタイムラインにフォロワー限定投稿が含まれていない問題を修正
 | 
			
		||||
* リストタイムラインでフォロワー限定投稿が含まれていない問題を修正
 | 
			
		||||
* リストタイムラインに自分宛てでないダイレクト投稿が非公開扱いで表示される問題を修正
 | 
			
		||||
* 自分宛てのダイレクト投稿がホーム/ソーシャルタイムラインにストリームで流れない問題を修正
 | 
			
		||||
* ストリームで投稿が流れてきたとき、返信先が「この投稿は非公開です」となる問題を修正
 | 
			
		||||
* 関係のない返信がタイムラインに流れる問題を修正
 | 
			
		||||
* 常にメディアを閲覧注意として投稿するオプションが機能していなかった問題を修正
 | 
			
		||||
* リモートユーザーのアイコンが消えることがある問題を修正
 | 
			
		||||
* ドライブのファイルメニューからアバターやバナーに設定することができない問題を修正
 | 
			
		||||
* クライアントのAPIリクエストをストリーム経由で行うオプションを廃止
 | 
			
		||||
* 一部箇所でカスタム絵文字が適用されていないのを修正
 | 
			
		||||
 | 
			
		||||
10.77.0
 | 
			
		||||
----------
 | 
			
		||||
* ローカルタイムライン無効オプションをグローバルタイムライン無効オプションと分離
 | 
			
		||||
* モデレータはLTL無効時でもUIからLTLを消さない
 | 
			
		||||
* インスタンス情報ページに各種タイムラインの有効/無効を表示
 | 
			
		||||
 | 
			
		||||
10.76.0
 | 
			
		||||
----------
 | 
			
		||||
* disableLocalTimeline機能を強化
 | 
			
		||||
* インスタンス情報ページの強化
 | 
			
		||||
* ハッシュタグ判定の強化
 | 
			
		||||
* SVGサムネイルを表示するように
 | 
			
		||||
* CWの引き継ぎ機能を無効化
 | 
			
		||||
 | 
			
		||||
10.75.0
 | 
			
		||||
----------
 | 
			
		||||
* ダイレクトを非公開のように使えるように
 | 
			
		||||
* モデレーターを凍結できないように
 | 
			
		||||
* モデレーター登録を解除できるように
 | 
			
		||||
* NSFWなメディアをユーザーページなどで表示しないように
 | 
			
		||||
* 管理画面でユーザーを状態でフィルタできるように
 | 
			
		||||
* 管理者がサインイン履歴を参照できるツール
 | 
			
		||||
* Renote数を再度表示するように
 | 
			
		||||
* インスタンス情報ページの追加
 | 
			
		||||
* テーマの調整
 | 
			
		||||
* UIの改善
 | 
			
		||||
 | 
			
		||||
10.74.0
 | 
			
		||||
----------
 | 
			
		||||
* Pleromaとのフェデレーションを修正
 | 
			
		||||
* インスタンスのキャラクター画像を設定できるように
 | 
			
		||||
* Catモードの朝鮮語対応
 | 
			
		||||
* CWが付いた投稿に返信する際、そのCWを引き継ぐように
 | 
			
		||||
* 投稿のソースをクリップボードにコピーできるように
 | 
			
		||||
* i/notifications API で取得する通知の種別を配列で指定できるように
 | 
			
		||||
* パフォーマンスの改善
 | 
			
		||||
* バグ修正
 | 
			
		||||
 | 
			
		||||
10.73.0
 | 
			
		||||
-------
 | 
			
		||||
* テーマの強化
 | 
			
		||||
* line thiknessの設定はデバイスに保存するように
 | 
			
		||||
 | 
			
		||||
10.72.0
 | 
			
		||||
-------
 | 
			
		||||
* いくつかのテーマの追加
 | 
			
		||||
* デザインの調整
 | 
			
		||||
* バグ修正
 | 
			
		||||
* など
 | 
			
		||||
 | 
			
		||||
10.71.0
 | 
			
		||||
-------
 | 
			
		||||
* いくつかのテーマの追加
 | 
			
		||||
 | 
			
		||||
10.70.1
 | 
			
		||||
-------
 | 
			
		||||
* notes/mentions にミュートを適用するように
 | 
			
		||||
* Add id to return of users/relation
 | 
			
		||||
* デザインの調整
 | 
			
		||||
 | 
			
		||||
10.70.0
 | 
			
		||||
-------
 | 
			
		||||
* フォローしているユーザーからのフォローを自動承認するオプション
 | 
			
		||||
* 「非公開」の公開範囲を廃止
 | 
			
		||||
* Renote数の表示を廃止
 | 
			
		||||
* 投稿のフィルタリングを強化
 | 
			
		||||
* デザインの調整
 | 
			
		||||
 | 
			
		||||
10.69.0
 | 
			
		||||
-------
 | 
			
		||||
* 通知の管理を強化
 | 
			
		||||
* ユーザビリティの強化
 | 
			
		||||
* デザインの調整
 | 
			
		||||
 | 
			
		||||
10.68.0
 | 
			
		||||
-------
 | 
			
		||||
* 特定ユーザーにメンション付きで新規投稿ができるボタンを追加
 | 
			
		||||
* 自分の投稿にリアクションできないように
 | 
			
		||||
* 数式に文法エラーがあるとき、数式のソースをそのまま表示するように
 | 
			
		||||
* CWボタンにアンケートの有無を表記するように
 | 
			
		||||
* デスクトップ版で設定を新しいタブで開くように
 | 
			
		||||
* モバイル版で検索ができない問題を修正
 | 
			
		||||
* i18nの修正
 | 
			
		||||
 | 
			
		||||
10.67.0
 | 
			
		||||
-------
 | 
			
		||||
* トークのメッセージを削除できるように
 | 
			
		||||
* リアクションを取り消せるように
 | 
			
		||||
* Misskey以外のソフトウェアからの「Like」アクティビティをプリンではなく「いいね」として扱うように
 | 
			
		||||
* i18nの修正
 | 
			
		||||
* バグ修正
 | 
			
		||||
* など
 | 
			
		||||
 | 
			
		||||
10.66.2
 | 
			
		||||
-------
 | 
			
		||||
* i18nの修正
 | 
			
		||||
* ドライブのファイル一覧取得APIでファイルサイズによるソートが機能していなかった問題を修正
 | 
			
		||||
* リモートユーザーの更新時に、各ピン留め投稿の取得失敗は無視するように
 | 
			
		||||
* リモートMisskeyユーザーの情報が登録/更新出来なくなっていたのを修正
 | 
			
		||||
* メンションのリンク先URLに余計な@がプリフィクスされていたのを修正
 | 
			
		||||
* ダイレクトでリプライする際、リプライ先のユーザーは自動的に公開先として追加するように
 | 
			
		||||
* ダイレクトでメンションでもユーザーを指定できるように
 | 
			
		||||
 | 
			
		||||
10.66.1
 | 
			
		||||
-------
 | 
			
		||||
* ActivityPubのsharedInboxに関して修正
 | 
			
		||||
* MFMでのカッコの判定を改善
 | 
			
		||||
* バグ修正
 | 
			
		||||
 | 
			
		||||
10.66.0
 | 
			
		||||
-------
 | 
			
		||||
* ユーザーごとのRSSフィードを提供するように
 | 
			
		||||
* リストのユーザーがすべて表示できない問題を修正
 | 
			
		||||
* デザインの調整
 | 
			
		||||
* パフォーマンスの改善
 | 
			
		||||
 | 
			
		||||
10.65.0
 | 
			
		||||
-------
 | 
			
		||||
* 検索で投稿やユーザーのURLを入力した際にそれをフェッチして表示するように
 | 
			
		||||
* リストのリネームと削除をできるように
 | 
			
		||||
* リストからユーザーを削除できるように
 | 
			
		||||
* リモートの絵文字を更新するように
 | 
			
		||||
* ActivityPubのための絵文字エンドポイントを実装
 | 
			
		||||
* 管理者がドライブのファイルのNSFWを設定できるように
 | 
			
		||||
* ServiceWorkerの設定を管理者ページで行えるように
 | 
			
		||||
* メンションの判定を改善
 | 
			
		||||
* リモートの投稿を引用した際にオリジナルのURLを挿入するように
 | 
			
		||||
* クライアントのパフォーマンス改善
 | 
			
		||||
* CWの内容がタブタイトルに表示されるのを修正
 | 
			
		||||
* アカウントを作成したときにログイン状態にならない問題を修正
 | 
			
		||||
* 時計の針にテーマカラーが適用されていなかったのを修正
 | 
			
		||||
* 一部の日時の表示が日本語で表示されていたのを修正
 | 
			
		||||
* プロフィールの写真欄に画像以外のファイルが含まれる問題を修正
 | 
			
		||||
* メンションが含まれる投稿に返信する際、フォームに予めそれらのメンションがセットされた状態にならない問題を修正
 | 
			
		||||
* デッキのTLにUIの動きを減らすオプションが適用されていなかったのを修正
 | 
			
		||||
* ログイン画面のタイムラインに隠した投稿が表示される問題を修正
 | 
			
		||||
* サジェストが複数開いてしまう問題を修正
 | 
			
		||||
* APから来たタグに登録時の長さ制限が適用されていなかったのを修正
 | 
			
		||||
 | 
			
		||||
10.64.2
 | 
			
		||||
-------
 | 
			
		||||
* UIの動きを減らすオプションが一部のアニメーションに適用されなかったのを修正
 | 
			
		||||
 | 
			
		||||
10.64.1
 | 
			
		||||
-------
 | 
			
		||||
* レートリミットの調整
 | 
			
		||||
* アニメーションの調整
 | 
			
		||||
 | 
			
		||||
10.64.0
 | 
			
		||||
-------
 | 
			
		||||
* いくつかのアニメーションを追加
 | 
			
		||||
* OGP向けにインスタンスのバナー画像を提供するように
 | 
			
		||||
* 管理者ページでドライブのファイルを表示できるように
 | 
			
		||||
* ユーザビリティの強化
 | 
			
		||||
* バグ修正
 | 
			
		||||
 | 
			
		||||
10.63.1
 | 
			
		||||
-------
 | 
			
		||||
* メンションの表示を改善
 | 
			
		||||
* バグ修正
 | 
			
		||||
 | 
			
		||||
10.63.0
 | 
			
		||||
-------
 | 
			
		||||
* ActivityPubのユーザーフィールドをユーザーページに表示
 | 
			
		||||
* 404ページの実装
 | 
			
		||||
* パフォーマンスの向上
 | 
			
		||||
* バグ修正
 | 
			
		||||
 | 
			
		||||
10.62.2
 | 
			
		||||
-------
 | 
			
		||||
* バグ修正
 | 
			
		||||
 
 | 
			
		||||
@@ -25,3 +25,16 @@ Misskey uses [vue-i18n](https://github.com/kazupon/vue-i18n).
 | 
			
		||||
## Continuous integration
 | 
			
		||||
Misskey uses CircleCI for automated test.
 | 
			
		||||
Configuration files are located in `/.circleci`.
 | 
			
		||||
 | 
			
		||||
## Glossary
 | 
			
		||||
### AP
 | 
			
		||||
Stands for _**A**ctivity**P**ub_.
 | 
			
		||||
 | 
			
		||||
### MFM
 | 
			
		||||
Stands for _**M**isskey **F**lavored **M**arkdown_.
 | 
			
		||||
 | 
			
		||||
### Mk
 | 
			
		||||
Stands for _**M**iss**k**ey_.
 | 
			
		||||
 | 
			
		||||
### SW
 | 
			
		||||
Stands for _**S**ervice**W**orker_.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										98
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										98
									
								
								README.md
									
									
									
									
									
								
							@@ -3,11 +3,11 @@
 | 
			
		||||
[](https://misskey.xyz/)
 | 
			
		||||
================================================================
 | 
			
		||||
 | 
			
		||||
[](https://circleci.com/gh/syuilo/misskey)
 | 
			
		||||
[![][dependencies-badge]][dependencies-link]
 | 
			
		||||
[](http://makeapullrequest.com)
 | 
			
		||||
[](https://circleci.com/gh/syuilo/misskey)
 | 
			
		||||
[](https://david-dm.org/syuilo/misskey)
 | 
			
		||||
[](http://makeapullrequest.com)
 | 
			
		||||
 | 
			
		||||
**Sophisticated microblogging platform, evolving forever.**
 | 
			
		||||
**A forever evolving, sophisticated microblogging platform.**
 | 
			
		||||
 | 
			
		||||
<p align="justify">
 | 
			
		||||
<a href="https://misskey.xyz">Misskey</a> is a decentralized microblogging platform born on Earth.
 | 
			
		||||
@@ -27,7 +27,7 @@ Why don't you take a short break from the hustle and bustle of the city, and div
 | 
			
		||||
 | 
			
		||||
<h3 align="left">Posting</h3>
 | 
			
		||||
<p align="justify">
 | 
			
		||||
Just post your idea, hot topics and anything you want to share. You may decorate your words, attach your favorite pictures or movies, and create a poll - those are all supported in Misskey!
 | 
			
		||||
Post your ideas, discussion topics, fun moments, or anything else you want to share! Misskey supports text, emoji, pictures, videos, and polls!
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
@@ -36,7 +36,7 @@ Just post your idea, hot topics and anything you want to share. You may decorate
 | 
			
		||||
 | 
			
		||||
<h3 align="right">Reactions</h3>
 | 
			
		||||
<p align="justify">
 | 
			
		||||
The simplest way to tell your emotions to the posts. You can choose the best reaction from various reactions. Reactions on Misskey has much more expressive than other social media which only allows pushing “likes”.
 | 
			
		||||
Reactions are the simplest way to respond to others' posts. Simply pick a reaction emote from the list! Reactions on Misskey are much more expressive than other social media services which only allow “liking”.
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
@@ -45,7 +45,7 @@ The simplest way to tell your emotions to the posts. You can choose the best rea
 | 
			
		||||
 | 
			
		||||
<h3 align="left">Interface</h3>
 | 
			
		||||
<p align="justify">
 | 
			
		||||
Highly customizable UI for your taste. We understand no UI fits for everyone. Make your graceful home by editing, adjusting layouts of timeline, and placing widgets.
 | 
			
		||||
Customize the UI to your own tastes! No UI will work for everyone, so Misskey is completely customizable. Make Misskey *yours* by editing the style, adjusting timeline layouts, and placing widgets.
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
@@ -54,85 +54,103 @@ Highly customizable UI for your taste. We understand no UI fits for everyone. Ma
 | 
			
		||||
 | 
			
		||||
<h3 align="right">Misskey Drive</h3>
 | 
			
		||||
<p align="justify">
 | 
			
		||||
Organized uploaded files. Wanna post a picture you have already uploaded? Wish to create a folder for your files? Misskey Drive is the best solution for you.
 | 
			
		||||
Organize and store your files! Want to post a picture you have already uploaded? Wish you could organize your files into folders? Misskey Drive is a solution!
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
and more! Now it's time to experience the world with your own eyes at [misskey.xyz](https://misskey.xyz) or [other instances](https://joinmisskey.github.io/).
 | 
			
		||||
...and more! Experience Misskey with your own eyes at [misskey.xyz](https://misskey.xyz) or join one of the [other instances](https://joinmisskey.github.io/) that are available.
 | 
			
		||||
 | 
			
		||||
:package: Create your own instance
 | 
			
		||||
:package: Create Your Own Instance
 | 
			
		||||
----------------------------------------------------------------
 | 
			
		||||
Please see [Setup and installation guide](./docs/setup.en.md).
 | 
			
		||||
Please see the [Setup and Installation Guide](./docs/setup.en.md).
 | 
			
		||||
 | 
			
		||||
:wrench: Contribution
 | 
			
		||||
----------------------------------------------------------------
 | 
			
		||||
Please see [Contribution guide](./CONTRIBUTING.md).
 | 
			
		||||
Please see the [Contribution Guide](./CONTRIBUTING.md).
 | 
			
		||||
 | 
			
		||||
### Collaborators
 | 
			
		||||
<table>
 | 
			
		||||
	<tr>
 | 
			
		||||
		<td><img src="https://avatars3.githubusercontent.com/u/4439005?s=460&v=4" alt="syuilo" width="100"></td>
 | 
			
		||||
		<td><img src="https://avatars0.githubusercontent.com/u/10798641?s=460&v=4" alt="AyaMorisawa" width="100"></td>
 | 
			
		||||
		<td><img src="https://avatars1.githubusercontent.com/u/30769358?s=460&v=4" alt="mei23" width="100"></td>
 | 
			
		||||
		<td><img src="https://avatars2.githubusercontent.com/u/20679825?s=460&v=4" alt="acid-chicken" width="100"></td>
 | 
			
		||||
	</tr>
 | 
			
		||||
	<tr>
 | 
			
		||||
		<td align="center"><a href="https://github.com/syuilo">@syuilo</a></td>
 | 
			
		||||
		<td align="center"><a href="https://github.com/AyaMorisawa">@AyaMorisawa</a></td>
 | 
			
		||||
		<td align="center"><a href="https://github.com/mei23">@mei23</a></td>
 | 
			
		||||
		<td align="center"><a href="https://github.com/acid-chicken">@acid-chicken</a></td>
 | 
			
		||||
	</tr>
 | 
			
		||||
</table>
 | 
			
		||||
 | 
			
		||||
:heart: Backers & Sponsors
 | 
			
		||||
----------------------------------------------------------------
 | 
			
		||||
<!-- PATREON_START -->
 | 
			
		||||
<table><tr>
 | 
			
		||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12190916/fb7fa7983c14425f890369535b1506a4/1?token-time=2145916800&token-hash=Zeh1u6l_Vmgoy8A1eT1Sltea-_SZSq8t8uOWDRZRh94%3D" alt="weep"></td>
 | 
			
		||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13376668/71f3cf87ec6c4393a44b1b9df5ee3d12/1?token-time=2145916800&token-hash=7pSmWqgMfMSJHVIEcNsuuQoKeU3TRluew5p0EGTzWA4%3D" alt="Arctic"></td>
 | 
			
		||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12731202/0995c46cdcb54153ab5f073f5869b70a/1?token-time=2145916800&token-hash=Yd60FK_SWfQO56SeiJpy1tDHOnCV4xdEywQe8gn5_Wo%3D" alt="negao"></td>
 | 
			
		||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12913507/f7181eacafe8469a93033d85f5969c29/2?token-time=2145916800&token-hash=mgPdX9TqZxEg4TTPuc477dxhIgYk9246qafjWZEqZ7g%3D" alt="Melilot"></td>
 | 
			
		||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12999811/5f349fafcce44dd1824a8b1ebbec4564/2?token-time=2145916800&token-hash=rwZ8qvbm_kpA4ib3kc07tVKupXeySpY5ATQFGxfL9v0%3D" alt="Xeltica"></td>
 | 
			
		||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/3384329/8b713330cb27404ea6e9fac50ff96efe/1?token-time=2145916800&token-hash=0eu4-m1gTWA9PhptVZt6rdKcusqcD7RB87rJT23VVFI%3D" alt="べすれい"></td>
 | 
			
		||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12021162/963128bb8d14476dbd8407943db8f31a/1?token-time=2145916800&token-hash=GgJ_NmUB6_nnRNLVGUWjV-WX91On7BOu59LKncYV9fE%3D" alt="gutfuckllc"></td>
 | 
			
		||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/11357794/923ce94cd8c44ba788ee931907881839/1?token-time=2145916800&token-hash=I8lJVM8LeW6TSo5W6uIIRZ42cw83zp1wK_FsbzY0mcQ%3D" alt="mydarkstar"></td>
 | 
			
		||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12190916/fb7fa7983c14425f890369535b1506a4/1?token-time=2145916800&token-hash=WeuDzzz24cRXJogyIkU-mxARqkdyms-rcZKbO-GpGjw%3D" alt="weep" width="100"></td>
 | 
			
		||||
<td><img src="https://c8.patreon.com/2/200/12059069" alt="naga_rus" width="100"></td>
 | 
			
		||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12731202/0995c46cdcb54153ab5f073f5869b70a/1?token-time=2145916800&token-hash=prtYqPOiSHBulhM7NU0VzMaWx39-9ntdq25b6kafDNA%3D" alt="negao" width="100"></td>
 | 
			
		||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12913507/f7181eacafe8469a93033d85f5969c29/3?token-time=2145916800&token-hash=c8HeVqLtmdgH-gSBJg8i10gmOcwllM87MDHeznl3el0%3D" alt="Melilot" width="100"></td>
 | 
			
		||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12999811/5f349fafcce44dd1824a8b1ebbec4564/3?token-time=2145916800&token-hash=LtV2lRi3L2jOWMLwccr9qWYfPrFlzIo2jYZHKzHEb6k%3D" alt="Xeltica" width="100"></td>
 | 
			
		||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/3384329/8b713330cb27404ea6e9fac50ff96efe/1?token-time=2145916800&token-hash=Ch3iF81ZGP0LMo894Y9ajpLisgtE91SnxtZE7fxsgrM%3D" alt="べすれい" width="100"></td>
 | 
			
		||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12021162/963128bb8d14476dbd8407943db8f31a/1?token-time=2145916800&token-hash=1FlxS9MEgmNGH_RHUVHbO5hIXB5I1z0lvA33CTvYvjA%3D" alt="gutfuckllc" width="100"></td>
 | 
			
		||||
</tr><tr>
 | 
			
		||||
<td><a href="https://www.patreon.com/weepjp">weep</a></td>
 | 
			
		||||
<td><a href="https://www.patreon.com/user?u=13376668">Arctic</a></td>
 | 
			
		||||
<td><a href="https://www.patreon.com/user?u=12059069">naga_rus</a></td>
 | 
			
		||||
<td><a href="https://www.patreon.com/negao">negao</a></td>
 | 
			
		||||
<td><a href="https://www.patreon.com/user?u=12913507">Melilot</a></td>
 | 
			
		||||
<td><a href="https://www.patreon.com/AxellaMC">Xeltica</a></td>
 | 
			
		||||
<td><a href="https://www.patreon.com/Xeltica">Xeltica</a></td>
 | 
			
		||||
<td><a href="https://www.patreon.com/user?u=3384329">べすれい</a></td>
 | 
			
		||||
<td><a href="https://www.patreon.com/gutfuckllc">gutfuckllc</a></td>
 | 
			
		||||
<td><a href="https://www.patreon.com/mydarkstar">mydarkstar</a></td>
 | 
			
		||||
</tr></table>
 | 
			
		||||
<table><tr>
 | 
			
		||||
<td><img src="https://c8.patreon.com/2/100/12718187" alt="Peter G."></td>
 | 
			
		||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13039004/509d0c412eb14ae08d6a812a3054f7d6/1?token-time=2145916800&token-hash=zwSu01tOtn5xTUucDZHuPsCxF2HBEMVs9ROJKTlEV_o%3D" alt="nemu"></td>
 | 
			
		||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/3?token-time=2145916800&token-hash=qsdn0-e6yLaLI6hUX9JAkyTR6a5UdnSp7T1foniBvGQ%3D" alt="YUKIMOCHI"></td>
 | 
			
		||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/8241184/39e18850e87a449e9c9a71acb3310ebd/2?token-time=2145916800&token-hash=iUXOQzRyJDv3PJxwS7Mjwg1459dzh2trOq6NFtXu_OM%3D" alt="Acid Chicken"></td>
 | 
			
		||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13034746/c711c7f58e204ecfbc2fd646bc8a4eee/1?token-time=2145916800&token-hash=UERBN4OyP7Nh5XwwdDg0N0IE5cD6_qUQMO81Z5Wizso%3D" alt="Hiratake"></td>
 | 
			
		||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/10789744/97175095d8f04c0f86225ff47cb98d40/1?token-time=2145916800&token-hash=P4BIzCX2I1CkEP66ottfhsC8Wr6BUSamjA-vq3pLqFI%3D" alt="Naoki Hirayama"></td>
 | 
			
		||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1?token-time=2145916800&token-hash=S1zP0QyLU52Dqq6dtc9qNYyWfW86XrYHiR4NMbeOrnA%3D" alt="dansup"></td>
 | 
			
		||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/11357794/923ce94cd8c44ba788ee931907881839/1?token-time=2145916800&token-hash=0xgcpqvFDqRcV_YIEhcPNVH7gs9sLg_BBnTJXCkN4ao%3D" alt="mydarkstar" width="100"></td>
 | 
			
		||||
<td><img src="https://c8.patreon.com/2/200/12718187" alt="Peter G." width="100"></td>
 | 
			
		||||
<td><img src="https://c8.patreon.com/2/200/16542964" alt="Takumi Sugita" width="100"></td>
 | 
			
		||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13039004/509d0c412eb14ae08d6a812a3054f7d6/1?token-time=2145916800&token-hash=2PsbFNw0tnubZzgSXD01R6hIgncfiElG7H7HX2Y3dyo%3D" alt="nemu" width="100"></td>
 | 
			
		||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/3?token-time=2145916800&token-hash=9JtETp0X8gI280Ne1E8bxn6j4Lw5o2k4mJkICx97V_k%3D" alt="YUKIMOCHI" width="100"></td>
 | 
			
		||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/8241184/39e18850e87a449e9c9a71acb3310ebd/3?token-time=2145916800&token-hash=gMq30aylxu5v3G8pRhWR5jeRBbYWEoRKjGbNeiCQz5g%3D" alt="Acid Chicken" width="100"></td>
 | 
			
		||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4389829/9f709180ac714651a70f74a82f3ffdb9/2?token-time=2145916800&token-hash=zcwFxb2zopzWwksKVU1YpfAEjsl4yKT02aQ6yiAFRiQ%3D" alt="natalie" width="100"></td>
 | 
			
		||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13034746/c711c7f58e204ecfbc2fd646bc8a4eee/1?token-time=2145916800&token-hash=5T8XcaAf9Zyzfg3QubR06s_kJZkArVEM2dwObrBVAU4%3D" alt="Hiratake" width="100"></td>
 | 
			
		||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/10789744/97175095d8f04c0f86225ff47cb98d40/1?token-time=2145916800&token-hash=ubVARikVOg3v7NW6LDhtG-ClE1LTU3I2TJ3js2-5xDs%3D" alt="Naoki Hirayama" width="100"></td>
 | 
			
		||||
</tr><tr>
 | 
			
		||||
<td><a href="https://www.patreon.com/mydarkstar">mydarkstar</a></td>
 | 
			
		||||
<td><a href="https://www.patreon.com/user?u=12718187">Peter G.</a></td>
 | 
			
		||||
<td><a href="https://www.patreon.com/user?u=16542964">Takumi Sugita</a></td>
 | 
			
		||||
<td><a href="https://www.patreon.com/user?u=13039004">nemu</a></td>
 | 
			
		||||
<td><a href="https://www.patreon.com/yukimochi">YUKIMOCHI</a></td>
 | 
			
		||||
<td><a href="https://www.patreon.com/acid_chicken">Acid Chicken</a></td>
 | 
			
		||||
<td><a href="https://www.patreon.com/user?u=4389829">natalie</a></td>
 | 
			
		||||
<td><a href="https://www.patreon.com/hiratake">Hiratake</a></td>
 | 
			
		||||
<td><a href="https://www.patreon.com/spinlock">Naoki Hirayama</a></td>
 | 
			
		||||
<td><a href="https://www.patreon.com/dansup">dansup</a></td>
 | 
			
		||||
</tr></table>
 | 
			
		||||
<table><tr>
 | 
			
		||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/619786/32cf01444db24e578cd1982c197f6fc6/1?token-time=2145916800&token-hash=tB1e_r8RlZ5sFL0KV_e8dugapxatNBRK1Z3h67TO1g8%3D" alt="Gargron"></td>
 | 
			
		||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/5731881/4b6038e6cda34c04b83a5fcce3806a93/1?token-time=2145916800&token-hash=VZUtwrjQa8Jml4twCjHYQQZ64wHEY4oIlGl7Kc-VYUQ%3D" alt="Nokotaro Takeda"></td>
 | 
			
		||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12531784/93a45137841849329ba692da92ac7c60/1?token-time=2145916800&token-hash=tMosUojzUYJCH_3t--tvYA-SMCyrS__hzSndyaRSnbo%3D" alt="Takashi Shibuya"></td>
 | 
			
		||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1?token-time=2145916800&token-hash=Ksk_2l3gjPDbnzMUOCSW1E-hdPJsNs2tSR4_RAakRK8%3D" alt="dansup" width="100"></td>
 | 
			
		||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/619786/32cf01444db24e578cd1982c197f6fc6/1?token-time=2145916800&token-hash=CXe9AqlZy9AsYfiWd3OBYVOzvODoN47Litz0Tu4BFpU%3D" alt="Gargron" width="100"></td>
 | 
			
		||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5731881/4b6038e6cda34c04b83a5fcce3806a93/1?token-time=2145916800&token-hash=xhR1n6NAAyEb-IUXLD6_dshkFa3mefU5ZZuk1L8qKTs%3D" alt="Nokotaro Takeda" width="100"></td>
 | 
			
		||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12531784/93a45137841849329ba692da92ac7c60/1?token-time=2145916800&token-hash=uR-48MQ0A4j0irQSrCAQZJ-sJUSs_Fkihlg3-l59b7c%3D" alt="Takashi Shibuya" width="100"></td>
 | 
			
		||||
</tr><tr>
 | 
			
		||||
<td><a href="https://www.patreon.com/dansup">dansup</a></td>
 | 
			
		||||
<td><a href="https://www.patreon.com/mastodon">Gargron</a></td>
 | 
			
		||||
<td><a href="https://www.patreon.com/takenoko">Nokotaro Takeda</a></td>
 | 
			
		||||
<td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td>
 | 
			
		||||
</tr></table>
 | 
			
		||||
 | 
			
		||||
**Last updated:** Thu, 06 Dec 2018 14:22:05 UTC
 | 
			
		||||
**Last updated:** Mon, 21 Jan 2019 06:45:06 UTC
 | 
			
		||||
<!-- PATREON_END -->
 | 
			
		||||
 | 
			
		||||
:four_leaf_clover: Copyright
 | 
			
		||||
----------------------------------------------------------------
 | 
			
		||||
> Copyright (c) 2014-2018 syuilo
 | 
			
		||||
> Copyright (c) 2014-2019 syuilo
 | 
			
		||||
 | 
			
		||||
Misskey is an open-source software licensed under the [GNU AGPLv3](LICENSE).
 | 
			
		||||
Misskey is open-source software licensed under the [GNU AGPLv3](LICENSE).
 | 
			
		||||
 | 
			
		||||
[![][agpl-3.0-badge]][AGPL-3.0]
 | 
			
		||||
 | 
			
		||||
[agpl-3.0]:           https://www.gnu.org/licenses/agpl-3.0.en.html
 | 
			
		||||
[agpl-3.0-badge]:     https://img.shields.io/badge/license-AGPL--3.0-444444.svg?style=flat-square
 | 
			
		||||
[dependencies-link]:  https://david-dm.org/syuilo/misskey
 | 
			
		||||
[dependencies-badge]: https://img.shields.io/david/syuilo/misskey.svg?style=flat-square
 | 
			
		||||
[agpl-3.0-badge]:     https://img.shields.io/badge/license-AGPL--3.0-444444.svg?style=for-the-badge
 | 
			
		||||
 | 
			
		||||
[backer-url]: #backers
 | 
			
		||||
[backer-badge]: https://opencollective.com/misskey/backers/badge.svg
 | 
			
		||||
 
 | 
			
		||||
@@ -17,7 +17,7 @@ This guide describes how to install and setup Misskey with Docker.
 | 
			
		||||
----------------------------------------------------------------
 | 
			
		||||
1. `cp .config/example.yml .config/default.yml` Copy the `.config/example.yml` and rename it to `default.yml`.
 | 
			
		||||
2. `cp .config/mongo_initdb_example.js .config/mongo_initdb.js` Copy the `.config/mongo_initdb_example.js` and rename it to `mongo_initdb.js`.
 | 
			
		||||
2. Edit `default.yml` and `mongo_initdb.js`.
 | 
			
		||||
3. Edit `default.yml` and `mongo_initdb.js`.
 | 
			
		||||
 | 
			
		||||
*3.* Configure Docker
 | 
			
		||||
----------------------------------------------------------------
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										67
									
								
								docs/docker.fr.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								docs/docker.fr.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,67 @@
 | 
			
		||||
Guide Docker
 | 
			
		||||
================================================================
 | 
			
		||||
 | 
			
		||||
Ce guide explique comment installer et configurer Misskey avec Docker.
 | 
			
		||||
 | 
			
		||||
[Version japonaise également disponible - Japanese version also available - 日本語版もあります](./docker.ja.md)  
 | 
			
		||||
[Version anglaise également disponible - English version also available - 英語版もあります](./docker.en.md)
 | 
			
		||||
 | 
			
		||||
----------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
*1.* Télécharger Misskey
 | 
			
		||||
----------------------------------------------------------------
 | 
			
		||||
1. `git clone -b master git://github.com/syuilo/misskey.git` Clone le dépôt de Misskey sur la branche master.
 | 
			
		||||
2. `cd misskey` Naviguez dans le dossier du dépôt.
 | 
			
		||||
3. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` Checkout sur le tag de la [dernière version](https://github.com/syuilo/misskey/releases/latest).
 | 
			
		||||
 | 
			
		||||
*2.* Configuration de Misskey
 | 
			
		||||
----------------------------------------------------------------
 | 
			
		||||
1. `cp .config/example.yml .config/default.yml` Copiez le fichier `.config/example.yml` et renommez-le `default.yml`.
 | 
			
		||||
2. `cp .config/mongo_initdb_example.js .config/mongo_initdb.js` Copie le fichier `.config/mongo_initdb_example.js` et le renomme en `mongo_initdb.js`.
 | 
			
		||||
3. Editez `default.yml` et `mongo_initdb.js`.
 | 
			
		||||
 | 
			
		||||
*3.* Configurer Docker
 | 
			
		||||
----------------------------------------------------------------
 | 
			
		||||
Editez `docker-compose.yml`.
 | 
			
		||||
 | 
			
		||||
*4.* Contruire Misskey
 | 
			
		||||
----------------------------------------------------------------
 | 
			
		||||
Contruire l'image Docker avec:
 | 
			
		||||
 | 
			
		||||
`docker-compose build`
 | 
			
		||||
 | 
			
		||||
*5.* C'est tout !
 | 
			
		||||
----------------------------------------------------------------
 | 
			
		||||
Parfait, Vous avez un environnement prêt pour démarrer Misskey.
 | 
			
		||||
 | 
			
		||||
### Lancer normalement
 | 
			
		||||
Utilisez la commande `docker-compose up -d`. GLHF!
 | 
			
		||||
 | 
			
		||||
### How to update your Misskey server to the latest version
 | 
			
		||||
1. `git fetch`
 | 
			
		||||
2. `git stash`
 | 
			
		||||
3. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)`
 | 
			
		||||
4. `git stash pop`
 | 
			
		||||
5. `docker-compose build`
 | 
			
		||||
6. Consultez le [ChangeLog](../CHANGELOG.md) pour avoir les éventuelles informations de migration
 | 
			
		||||
7. `docker-compose stop && docker-compose up -d`
 | 
			
		||||
 | 
			
		||||
### Comment exécuter des [commandes](manage.fr.md)
 | 
			
		||||
`docker-compose run --rm web node cli/mark-admin @example`
 | 
			
		||||
 | 
			
		||||
### Configuration d'ElasticSearch (pour la fonction de recherche)
 | 
			
		||||
*1.* Préparation de l'environnement
 | 
			
		||||
----------------------------------------------------------------
 | 
			
		||||
1. `mkdir elasticsearch && chown 1000:1000 elasticsearch` Permet de créer le dossier d'accueil de la base ElasticSearch aves les bons droits
 | 
			
		||||
2. `sysctl -w vm.max_map_count=262144` Augmente la valeur max du paramètre map_count du système (valeur minimum pour pouvoir lancer ES)
 | 
			
		||||
 | 
			
		||||
*2.* Après lancement du docker-compose, initialisation de la base ElasticSearch
 | 
			
		||||
----------------------------------------------------------------
 | 
			
		||||
1. `docker-compose -it web /bin/sh` Connexion dans le conteneur web
 | 
			
		||||
2. `apk add curl` Ajout du paquet curl
 | 
			
		||||
3. `curl -X PUT "es:9200/misskey" -H 'Content-Type: application/json' -d'{ "settings" : { "index" : { } }}'` Création de la base ES
 | 
			
		||||
4. `exit`
 | 
			
		||||
 | 
			
		||||
----------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
Si vous avez des questions ou des problèmes, n'hésitez pas à nous contacter !
 | 
			
		||||
							
								
								
									
										70
									
								
								docs/examples/misskey.nginx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								docs/examples/misskey.nginx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,70 @@
 | 
			
		||||
# Sample nginx configuration for Misskey
 | 
			
		||||
#
 | 
			
		||||
# 1. Replace example.tld to your domain
 | 
			
		||||
# 2. Copy to /etc/nginx/sites-available/ and then symlink from /etc/nginx/sites-ebabled/
 | 
			
		||||
#    or copy to /etc/nginx/conf.d/
 | 
			
		||||
 | 
			
		||||
# For WebSocket
 | 
			
		||||
map $http_upgrade $connection_upgrade {
 | 
			
		||||
    default upgrade;
 | 
			
		||||
    ''      close;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
proxy_cache_path /tmp/nginx_cache levels=1:2 keys_zone=cache1:16m max_size=1g inactive=720m use_temp_path=off;
 | 
			
		||||
 | 
			
		||||
server {
 | 
			
		||||
    listen 80;
 | 
			
		||||
    listen [::]:80;
 | 
			
		||||
    server_name example.tld;
 | 
			
		||||
 | 
			
		||||
    # For SSL domain validation
 | 
			
		||||
    root /var/www/html;
 | 
			
		||||
    location /.well-known/acme-challenge/ { allow all; }
 | 
			
		||||
    location /.well-known/pki-validation/ { allow all; }
 | 
			
		||||
    location / { return 301 https://$server_name$request_uri; }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
server {
 | 
			
		||||
    listen 443 http2;
 | 
			
		||||
    listen [::]:443 http2;
 | 
			
		||||
    server_name example.tld;
 | 
			
		||||
    ssl on;
 | 
			
		||||
		ssl_session_cache shared:ssl_session_cache:10m;
 | 
			
		||||
 | 
			
		||||
    # To use Let's Encrypt certificate
 | 
			
		||||
    ssl_certificate     /etc/letsencrypt/live/example.tld/fullchain.pem;
 | 
			
		||||
    ssl_certificate_key /etc/letsencrypt/live/example.tld/privkey.pem;
 | 
			
		||||
 | 
			
		||||
    # To use Debian/Ubuntu's self-signed certificate (For testing or before issuing a certificate)
 | 
			
		||||
    #ssl_certificate     /etc/ssl/certs/ssl-cert-snakeoil.pem;
 | 
			
		||||
    #ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;
 | 
			
		||||
 | 
			
		||||
    # SSL protocol settings
 | 
			
		||||
    ssl_protocols TLSv1 TLSv1.2;
 | 
			
		||||
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:AES128-SHA;
 | 
			
		||||
    ssl_prefer_server_ciphers on;
 | 
			
		||||
 | 
			
		||||
    # Change to your upload limit
 | 
			
		||||
    client_max_body_size 80m;
 | 
			
		||||
 | 
			
		||||
    # Proxy to Node
 | 
			
		||||
    location / {
 | 
			
		||||
        proxy_pass http://127.0.0.1:3000;
 | 
			
		||||
        proxy_set_header Host $host;
 | 
			
		||||
        proxy_set_header X-Real-IP $remote_addr;
 | 
			
		||||
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 | 
			
		||||
        proxy_set_header X-Forwarded-Proto https;
 | 
			
		||||
        proxy_http_version 1.1;
 | 
			
		||||
        proxy_redirect off;
 | 
			
		||||
 | 
			
		||||
        # For WebSocket
 | 
			
		||||
        proxy_set_header Upgrade $http_upgrade;
 | 
			
		||||
        proxy_set_header Connection $connection_upgrade;
 | 
			
		||||
 | 
			
		||||
        # Cache settings
 | 
			
		||||
        proxy_cache cache1;
 | 
			
		||||
        proxy_cache_lock on;
 | 
			
		||||
        proxy_cache_use_stale updating;
 | 
			
		||||
        add_header X-Cache $upstream_cache_status;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										18
									
								
								docs/manage.fr.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								docs/manage.fr.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
			
		||||
# Guide d'administration
 | 
			
		||||
 | 
			
		||||
## Vérifier le status de la file d'attente des taches
 | 
			
		||||
coming soon
 | 
			
		||||
 | 
			
		||||
## Marquer un utilisateur en tant que 'admin'
 | 
			
		||||
``` shell
 | 
			
		||||
node cli/mark-admin (ID utilisateur ou nom d'utilisateur)
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Exemple :
 | 
			
		||||
``` shell
 | 
			
		||||
# Par id
 | 
			
		||||
node cli/mark-admin 57d01a501fdf2d07be417afe
 | 
			
		||||
 | 
			
		||||
# Par nom d'utilisateur
 | 
			
		||||
node cli/suspend @syuilo
 | 
			
		||||
```
 | 
			
		||||
@@ -47,16 +47,6 @@ As root:
 | 
			
		||||
4. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` Checkout to the [latest release](https://github.com/syuilo/misskey/releases/latest)
 | 
			
		||||
5. `npm install` Install misskey dependencies.
 | 
			
		||||
 | 
			
		||||
*(optional)* Generate VAPID keys
 | 
			
		||||
----------------------------------------------------------------
 | 
			
		||||
If you want to enable ServiceWorker, you need to generate VAPID keys:
 | 
			
		||||
Unless you have set your global node_modules location elsewhere, you need to run this as root.
 | 
			
		||||
 | 
			
		||||
``` shell
 | 
			
		||||
npm install web-push -g
 | 
			
		||||
web-push generate-vapid-keys
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
*5.* Configure Misskey
 | 
			
		||||
----------------------------------------------------------------
 | 
			
		||||
1. `cp .config/example.yml .config/default.yml` Copy the `.config/example.yml` and rename it to `default.yml`.
 | 
			
		||||
@@ -120,6 +110,8 @@ You can check if the service is running with `systemctl status misskey`.
 | 
			
		||||
3. `npm install`
 | 
			
		||||
4. `npm run build`
 | 
			
		||||
5. Check [ChangeLog](../CHANGELOG.md) for migration information
 | 
			
		||||
6. Restart your Misskey process to apply changes
 | 
			
		||||
7. Enjoy
 | 
			
		||||
 | 
			
		||||
----------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -10,8 +10,8 @@ Ce guide décrit les étapes à suivre afin d'installer et de configurer une ins
 | 
			
		||||
 | 
			
		||||
*1.* Création de l'utilisateur Misskey
 | 
			
		||||
----------------------------------------------------------------
 | 
			
		||||
Lancer misskey en tant qu'utilisateur est une mauvaise idée, nous avons besoin de créer un utilisateur dédié.
 | 
			
		||||
Sur Debian, à titre d'exemple :
 | 
			
		||||
Executer misskey en tant que super-utilisateur étant une mauvaise idée, nous allons créer un utilisateur dédié.
 | 
			
		||||
Sous Debian, par exemple :
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
adduser --disabled-password --disabled-login misskey
 | 
			
		||||
@@ -32,10 +32,10 @@ Installez les paquets suivants :
 | 
			
		||||
 | 
			
		||||
*3.* Paramètrage de MongoDB
 | 
			
		||||
----------------------------------------------------------------
 | 
			
		||||
En mode root :
 | 
			
		||||
1. `mongo` Accédez au shell de mango
 | 
			
		||||
En root :
 | 
			
		||||
1. `mongo` Ouvrez le shell mongo
 | 
			
		||||
2. `use misskey` Utilisez la base de données misskey
 | 
			
		||||
3. `db.users.save( {dummy:"dummy"} )` Write dummy data to initialize the db.
 | 
			
		||||
3. `db.users.save( {dummy:"dummy"} )` Écrivez une donnée factice pour initialiser la base de données.
 | 
			
		||||
4. `db.createUser( { user: "misskey", pwd: "<password>", roles: [ { role: "readWrite", db: "misskey" } ] } )` Créez l'utilisateur misskey.
 | 
			
		||||
5. `exit` Vous avez terminé !
 | 
			
		||||
 | 
			
		||||
@@ -44,22 +44,12 @@ En mode root :
 | 
			
		||||
1. `su - misskey` Basculez vers l'utilisateur misskey.
 | 
			
		||||
2. `git clone -b master git://github.com/syuilo/misskey.git` Clonez la branche master du dépôt misskey.
 | 
			
		||||
3. `cd misskey` Accédez au dossier misskey.
 | 
			
		||||
4. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` Télécharge la [version la plus récente](https://github.com/syuilo/misskey/releases/latest)
 | 
			
		||||
4. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` Checkout sur le tag de la [version la plus récente](https://github.com/syuilo/misskey/releases/latest)
 | 
			
		||||
5. `npm install` Installez les dépendances de misskey.
 | 
			
		||||
 | 
			
		||||
*(optionnel)* Génération des clés VAPID
 | 
			
		||||
----------------------------------------------------------------
 | 
			
		||||
Si vous désirez activer ServiceWorker, vous devez générer les clés VAPID :
 | 
			
		||||
Unless you have set your global node_modules location elsewhere, vous devez lancer ceci en mode root.
 | 
			
		||||
 | 
			
		||||
``` shell
 | 
			
		||||
npm install web-push -g
 | 
			
		||||
web-push generate-vapid-keys
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
*5.* Création du fichier de configuration
 | 
			
		||||
----------------------------------------------------------------
 | 
			
		||||
1. `cp .config/example.yml .config/default.yml` Copiez le fichier `.config/example.yml` et renommez-le `default.yml`.
 | 
			
		||||
1. `cp .config/example.yml .config/default.yml` Copiez le fichier `.config/example.yml` et renommez-le`default.yml`.
 | 
			
		||||
2. Editez le fichier `default.yml`
 | 
			
		||||
 | 
			
		||||
*6.* Construction de Misskey
 | 
			
		||||
@@ -69,7 +59,7 @@ Construisez Misskey comme ceci :
 | 
			
		||||
 | 
			
		||||
`npm run build`
 | 
			
		||||
 | 
			
		||||
Si vous êtes sous Debian, vous serez amené à installer les paquets `build-essential`, `python`.
 | 
			
		||||
Si vous êtes sous Debian, vous serez amené à installer les paquets `build-essential` et `python`.
 | 
			
		||||
 | 
			
		||||
Si vous rencontrez des erreurs concernant certains modules, utilisez node-gyp:
 | 
			
		||||
 | 
			
		||||
@@ -87,7 +77,7 @@ Lancez tout simplement `npm start`. Bonne chance et amusez-vous bien !
 | 
			
		||||
 | 
			
		||||
### Démarrage avec systemd
 | 
			
		||||
 | 
			
		||||
1. Créez une service systemd sur : `/etc/systemd/system/misskey.service`
 | 
			
		||||
1. Créez un service systemd sur : `/etc/systemd/system/misskey.service`
 | 
			
		||||
2. Editez-le puis copiez et coller ceci dans le fichier :
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
 
 | 
			
		||||
@@ -53,15 +53,6 @@ adduser --disabled-password --disabled-login misskey
 | 
			
		||||
4. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` [最新のリリース](https://github.com/syuilo/misskey/releases/latest)を確認
 | 
			
		||||
5. `npm install` Misskeyの依存パッケージをインストール
 | 
			
		||||
 | 
			
		||||
*(オプション)* VAPIDキーペアの生成
 | 
			
		||||
----------------------------------------------------------------
 | 
			
		||||
ServiceWorkerを有効にする場合、VAPIDキーペアを生成する必要があります:
 | 
			
		||||
 | 
			
		||||
``` shell
 | 
			
		||||
npm install web-push -g
 | 
			
		||||
web-push generate-vapid-keys
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
*5.* 設定ファイルを作成する
 | 
			
		||||
----------------------------------------------------------------
 | 
			
		||||
1. `cp .config/example.yml .config/default.yml` `.config/example.yml`をコピーし名前を`default.yml`にする。
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										52
									
								
								gulpfile.ts
									
									
									
									
									
								
							
							
						
						
									
										52
									
								
								gulpfile.ts
									
									
									
									
									
								
							@@ -11,14 +11,12 @@ import tslint from 'gulp-tslint';
 | 
			
		||||
const cssnano = require('gulp-cssnano');
 | 
			
		||||
const stylus = require('gulp-stylus');
 | 
			
		||||
import * as uglifyComposer from 'gulp-uglify/composer';
 | 
			
		||||
import pug = require('gulp-pug');
 | 
			
		||||
import * as rimraf from 'rimraf';
 | 
			
		||||
import chalk from 'chalk';
 | 
			
		||||
const imagemin = require('gulp-imagemin');
 | 
			
		||||
import * as rename from 'gulp-rename';
 | 
			
		||||
import * as mocha from 'gulp-mocha';
 | 
			
		||||
import * as replace from 'gulp-replace';
 | 
			
		||||
import * as htmlmin from 'gulp-htmlmin';
 | 
			
		||||
const uglifyes = require('uglify-es');
 | 
			
		||||
 | 
			
		||||
const locales = require('./locales');
 | 
			
		||||
@@ -34,8 +32,6 @@ if (isDebug) {
 | 
			
		||||
	console.warn(chalk.yellow.bold('         built script will not be compressed.'));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const constants = require('./src/const.json');
 | 
			
		||||
 | 
			
		||||
gulp.task('build', [
 | 
			
		||||
	'build:ts',
 | 
			
		||||
	'build:copy',
 | 
			
		||||
@@ -109,7 +105,7 @@ gulp.task('default', ['build']);
 | 
			
		||||
gulp.task('build:client', [
 | 
			
		||||
	'build:ts',
 | 
			
		||||
	'build:client:script',
 | 
			
		||||
	'build:client:pug',
 | 
			
		||||
	'build:client:styles',
 | 
			
		||||
	'copy:client'
 | 
			
		||||
]);
 | 
			
		||||
 | 
			
		||||
@@ -148,52 +144,6 @@ gulp.task('copy:client', [
 | 
			
		||||
			.pipe(gulp.dest('./built/client/assets/'))
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
gulp.task('build:client:pug', [
 | 
			
		||||
	'copy:client',
 | 
			
		||||
	'build:client:script',
 | 
			
		||||
	'build:client:styles'
 | 
			
		||||
], () =>
 | 
			
		||||
		gulp.src('./src/client/app/base.pug')
 | 
			
		||||
			.pipe(pug({
 | 
			
		||||
				locals: {
 | 
			
		||||
					themeColor: constants.themeColor
 | 
			
		||||
				}
 | 
			
		||||
			}))
 | 
			
		||||
			.pipe(htmlmin({
 | 
			
		||||
				// 真理値属性の簡略化 e.g.
 | 
			
		||||
				// <input value="foo" readonly="readonly"> to
 | 
			
		||||
				// <input value="foo" readonly>
 | 
			
		||||
				collapseBooleanAttributes: true,
 | 
			
		||||
 | 
			
		||||
				// テキストの一部かもしれない空白も削除する e.g.
 | 
			
		||||
				// <div> <p>    foo </p>    </div> to
 | 
			
		||||
				// <div><p>foo</p></div>
 | 
			
		||||
				collapseWhitespace: true,
 | 
			
		||||
 | 
			
		||||
				// タグ間の改行を保持する
 | 
			
		||||
				preserveLineBreaks: true,
 | 
			
		||||
 | 
			
		||||
				// (できる場合は)属性のクォーテーション削除する e.g.
 | 
			
		||||
				// <p class="foo-bar" id="moo" title="blah blah">foo</p> to
 | 
			
		||||
				// <p class=foo-bar id=moo title="blah blah">foo</p>
 | 
			
		||||
				removeAttributeQuotes: true,
 | 
			
		||||
 | 
			
		||||
				// 省略可能なタグを省略する e.g.
 | 
			
		||||
				// <html><p>yo</p></html> ro
 | 
			
		||||
				// <p>yo</p>
 | 
			
		||||
				removeOptionalTags: true,
 | 
			
		||||
 | 
			
		||||
				// 属性の値がデフォルトと同じなら省略する e.g.
 | 
			
		||||
				// <input type="text"> to
 | 
			
		||||
				// <input>
 | 
			
		||||
				removeRedundantAttributes: true,
 | 
			
		||||
 | 
			
		||||
				// CSSも圧縮する
 | 
			
		||||
				minifyCSS: true
 | 
			
		||||
			}))
 | 
			
		||||
			.pipe(gulp.dest('./built/client/app/'))
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
gulp.task('locales', () =>
 | 
			
		||||
	gulp.src('./locales/*.yml')
 | 
			
		||||
		.pipe(yaml({ schema: 'DEFAULT_SAFE_SCHEMA' }))
 | 
			
		||||
 
 | 
			
		||||
@@ -27,6 +27,7 @@ common:
 | 
			
		||||
  do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
 | 
			
		||||
  load-more: "もっと読み込む"
 | 
			
		||||
  enter-password: "パスワードを入力してください"
 | 
			
		||||
  2fa: "二段階認証"
 | 
			
		||||
  got-it: "わかった"
 | 
			
		||||
  customization-tips:
 | 
			
		||||
    title: "カスタマイズのヒント"
 | 
			
		||||
@@ -90,7 +91,6 @@ common:
 | 
			
		||||
    followers-desc: "自分のフォロワーにのみ公開"
 | 
			
		||||
    specified: "ダイレクト"
 | 
			
		||||
    specified-desc: "指定したユーザーにのみ公開"
 | 
			
		||||
    private: "非公開"
 | 
			
		||||
    local-public: "公開 (ローカルのみ)"
 | 
			
		||||
    local-home: "ホーム (ローカルのみ)"
 | 
			
		||||
    local-followers: "フォロワー (ローカルのみ)"
 | 
			
		||||
@@ -110,8 +110,7 @@ common:
 | 
			
		||||
  my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
 | 
			
		||||
  i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
 | 
			
		||||
  show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
 | 
			
		||||
  use-white-black-reversi-stones: "リバーシに白黒の石を使う"
 | 
			
		||||
  use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
 | 
			
		||||
  use-avatar-reversi-stones: "リバーシの石にアバターを使う"
 | 
			
		||||
  verified-user: "公式アカウント"
 | 
			
		||||
  disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
 | 
			
		||||
  suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
 | 
			
		||||
@@ -122,14 +121,21 @@ common:
 | 
			
		||||
  reduce-motion: "UIの動きを減らす"
 | 
			
		||||
  this-setting-is-this-device-only: "このデバイスのみ"
 | 
			
		||||
  use-os-default-emojis: "OS標準の絵文字を使用"
 | 
			
		||||
  do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
 | 
			
		||||
  line-width: "線の太さ"
 | 
			
		||||
  line-width-thin: "細い"
 | 
			
		||||
  line-width-normal: "普通"
 | 
			
		||||
  line-width-thick: "太い"
 | 
			
		||||
  hide-password: "パスワードを隠す"
 | 
			
		||||
  show-password: "パスワードを表示する"
 | 
			
		||||
  do-not-use-in-production: "これは開発ビルドです。本番環境で使用しないでください。"
 | 
			
		||||
  user-suspended: "このユーザーは凍結されています。"
 | 
			
		||||
  is-remote-user: "このユーザー情報はコピーです。"
 | 
			
		||||
  is-remote-post: "この投稿情報はコピーです。"
 | 
			
		||||
  view-on-remote: "正確な情報を見る"
 | 
			
		||||
  renoted-by: "{user}がRenote"
 | 
			
		||||
  error:
 | 
			
		||||
    title: '問題が発生しました'
 | 
			
		||||
    retry: 'やり直す'
 | 
			
		||||
    title: "問題が発生しました"
 | 
			
		||||
    retry: "やり直す"
 | 
			
		||||
  reversi:
 | 
			
		||||
    drawn: "引き分け"
 | 
			
		||||
    my-turn: "あなたのターンです"
 | 
			
		||||
@@ -165,6 +171,7 @@ common:
 | 
			
		||||
    hashtags: "ハッシュタグ"
 | 
			
		||||
  dev: "アプリの作成に失敗しました。再度お試しください。"
 | 
			
		||||
  ai-chan-kawaii: "藍ちゃかわいい"
 | 
			
		||||
  you: "あなた"
 | 
			
		||||
auth/views/form.vue:
 | 
			
		||||
  share-access: "<i>{name}</i>があなたのアカウントにアクセスすることを許可しますか?"
 | 
			
		||||
  permission-ask: "このアプリは次の権限を要求しています:"
 | 
			
		||||
@@ -260,6 +267,7 @@ common/views/components/media-banner.vue:
 | 
			
		||||
  sensitive: "閲覧注意"
 | 
			
		||||
  click-to-show: "クリックして表示"
 | 
			
		||||
common/views/components/theme.vue:
 | 
			
		||||
  theme: "テーマ"
 | 
			
		||||
  light-theme: "非ダークモード時に使用するテーマ"
 | 
			
		||||
  dark-theme: "ダークモード時に使用するテーマ"
 | 
			
		||||
  light-themes: "明るいテーマ"
 | 
			
		||||
@@ -276,6 +284,7 @@ common/views/components/theme.vue:
 | 
			
		||||
  base-theme: "ベーステーマ"
 | 
			
		||||
  base-theme-light: "Light"
 | 
			
		||||
  base-theme-dark: "Dark"
 | 
			
		||||
  find-more-theme: "その他のテーマを入手"
 | 
			
		||||
  theme-name: "テーマ名"
 | 
			
		||||
  preview-created-theme: "プレビュー"
 | 
			
		||||
  invalid-theme: "テーマが正しくありません。"
 | 
			
		||||
@@ -299,6 +308,7 @@ common/views/components/cw-button.vue:
 | 
			
		||||
  show: "もっと見る"
 | 
			
		||||
  chars: "{count}文字"
 | 
			
		||||
  files: "{count}ファイル"
 | 
			
		||||
  poll: "アンケート"
 | 
			
		||||
common/views/components/messaging.vue:
 | 
			
		||||
  search-user: "ユーザーを探す"
 | 
			
		||||
  you: "あなた"
 | 
			
		||||
@@ -328,7 +338,9 @@ common/views/components/nav.vue:
 | 
			
		||||
  develop: "開発者"
 | 
			
		||||
  feedback: "フィードバック"
 | 
			
		||||
common/views/components/note-menu.vue:
 | 
			
		||||
  mention: "メンション"
 | 
			
		||||
  detail: "詳細"
 | 
			
		||||
  copy-content: "内容をコピー"
 | 
			
		||||
  copy-link: "リンクをコピー"
 | 
			
		||||
  favorite: "お気に入り"
 | 
			
		||||
  unfavorite: "お気に入り解除"
 | 
			
		||||
@@ -337,6 +349,17 @@ common/views/components/note-menu.vue:
 | 
			
		||||
  delete: "削除"
 | 
			
		||||
  delete-confirm: "この投稿を削除しますか?"
 | 
			
		||||
  remote: "投稿元で見る"
 | 
			
		||||
common/views/components/user-menu.vue:
 | 
			
		||||
  mention: "メンション"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  push-to-list: "リストに追加"
 | 
			
		||||
  select-list: "リストを選択してください"
 | 
			
		||||
  report-abuse: "スパムを報告"
 | 
			
		||||
  report-abuse-detail: "どのような迷惑行為を行っていますか?"
 | 
			
		||||
  report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
 | 
			
		||||
common/views/components/poll.vue:
 | 
			
		||||
  vote-to: "「{}」に投票する"
 | 
			
		||||
  vote-count: "{}票"
 | 
			
		||||
@@ -403,6 +426,13 @@ common/views/components/stream-indicator.vue:
 | 
			
		||||
  connecting: "接続中"
 | 
			
		||||
  reconnecting: "再接続中"
 | 
			
		||||
  connected: "接続完了"
 | 
			
		||||
common/views/components/notification-settings.vue:
 | 
			
		||||
  title: "通知"
 | 
			
		||||
  mark-as-read-all-notifications: "すべての通知を既読にする"
 | 
			
		||||
  mark-as-read-all-unread-notes: "すべての投稿を既読にする"
 | 
			
		||||
  mark-as-read-all-talk-messages: "すべてのトークを既読にする"
 | 
			
		||||
  auto-watch: "投稿の自動ウォッチ"
 | 
			
		||||
  auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。"
 | 
			
		||||
common/views/components/integration-settings.vue:
 | 
			
		||||
  title: "サービス連携"
 | 
			
		||||
  connect: "接続する"
 | 
			
		||||
@@ -432,7 +462,6 @@ common/views/components/visibility-chooser.vue:
 | 
			
		||||
  followers-desc: "自分のフォロワーにのみ公開"
 | 
			
		||||
  specified: "ダイレクト"
 | 
			
		||||
  specified-desc: "指定したユーザーにのみ公開"
 | 
			
		||||
  private: "非公開"
 | 
			
		||||
  local-public: "公開 (ローカルのみ)"
 | 
			
		||||
  local-public-desc: "リモートへは公開しない"
 | 
			
		||||
  local-home: "ホーム (ローカルのみ)"
 | 
			
		||||
@@ -461,6 +490,7 @@ common/views/components/profile-editor.vue:
 | 
			
		||||
  is-bot: "このアカウントはBotです"
 | 
			
		||||
  is-locked: "フォローを承認制にする"
 | 
			
		||||
  careful-bot: "Botからのフォローだけ承認制にする"
 | 
			
		||||
  auto-accept-followed: "フォローしているユーザーからのフォローを自動承認する"
 | 
			
		||||
  advanced: "その他"
 | 
			
		||||
  privacy: "プライバシー"
 | 
			
		||||
  save: "保存"
 | 
			
		||||
@@ -471,6 +501,13 @@ common/views/components/profile-editor.vue:
 | 
			
		||||
  email-address: "メールアドレス"
 | 
			
		||||
  email-verified: "メールアドレスが確認されました"
 | 
			
		||||
  email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
 | 
			
		||||
common/views/components/user-list-editor.vue:
 | 
			
		||||
  users: "ユーザー"
 | 
			
		||||
  rename: "リスト名を変更"
 | 
			
		||||
  delete: "リストを削除"
 | 
			
		||||
  remove-user: "このリストから削除"
 | 
			
		||||
  delete-are-you-sure: "リスト「$1」を削除しますか?"
 | 
			
		||||
  deleted: "削除しました"
 | 
			
		||||
common/views/widgets/broadcast.vue:
 | 
			
		||||
  fetching: "確認中"
 | 
			
		||||
  no-broadcasts: "お知らせはありません"
 | 
			
		||||
@@ -520,10 +557,10 @@ common/views/widgets/tips.vue:
 | 
			
		||||
  tips-line19: "いくつかのウィンドウはブラウザの外に切り離すことができます"
 | 
			
		||||
  tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示しています"
 | 
			
		||||
  tips-line21: "APIを利用してbotの開発なども行えます"
 | 
			
		||||
  tips-line23: "まゆかわいいよまゆ"
 | 
			
		||||
  tips-line23: "藍かわいいよ藍"
 | 
			
		||||
  tips-line24: "Misskeyは2014年にサービスを開始しました"
 | 
			
		||||
  tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
 | 
			
		||||
common/views/pages/404.vue:
 | 
			
		||||
common/views/pages/not-found.vue:
 | 
			
		||||
  page-not-found: "ページが見つかりませんでした"
 | 
			
		||||
common/views/pages/follow.vue:
 | 
			
		||||
  signed-in-as: "{}としてサインイン中"
 | 
			
		||||
@@ -660,10 +697,12 @@ desktop/views/components/note-detail.vue:
 | 
			
		||||
  location: "位置情報"
 | 
			
		||||
  renote: "Renote"
 | 
			
		||||
  add-reaction: "リアクション"
 | 
			
		||||
  undo-reaction: "リアクション解除"
 | 
			
		||||
desktop/views/components/note.vue:
 | 
			
		||||
  reply: "返信"
 | 
			
		||||
  renote: "Renote"
 | 
			
		||||
  add-reaction: "リアクション"
 | 
			
		||||
  undo-reaction: "リアクション解除"
 | 
			
		||||
  detail: "詳細"
 | 
			
		||||
  private: "この投稿は非公開です"
 | 
			
		||||
  deleted: "この投稿は削除されました"
 | 
			
		||||
@@ -734,7 +773,6 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  security: "セキュリティ"
 | 
			
		||||
  signin: "サインイン履歴"
 | 
			
		||||
  password: "パスワード"
 | 
			
		||||
  2fa: "二段階認証"
 | 
			
		||||
  other: "その他"
 | 
			
		||||
  license: "ライセンス"
 | 
			
		||||
  theme: "テーマ"
 | 
			
		||||
@@ -748,9 +786,6 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
 | 
			
		||||
  auto-popout: "ウィンドウの自動ポップアウト"
 | 
			
		||||
  auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
 | 
			
		||||
  advanced: "詳細設定"
 | 
			
		||||
  api-via-stream: "ストリームを経由したAPIリクエスト"
 | 
			
		||||
  api-via-stream-desc: "この設定をオンにすると、websocket接続を経由してAPIリクエストが行われます(パフォーマンス向上が期待できます)。オフにすると、ネイティブの fetch APIが利用されます。この設定はこのデバイスのみ有効です。"
 | 
			
		||||
  deck-nav: "デッキ内ナビゲーション"
 | 
			
		||||
  deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
 | 
			
		||||
  deck-default: "デッキをデフォルトのUIにする"
 | 
			
		||||
@@ -793,8 +828,6 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  cache-warn: "クリーンアップを行うと、ブラウザに記憶されたアカウント情報のキャッシュ、書きかけの投稿・返信・メッセージ、およびその他のデータ(設定情報含む)が削除されます。クリーンアップを行った後はページを再度読み込みする必要があります。"
 | 
			
		||||
  cache-cleared: "キャッシュを削除しました"
 | 
			
		||||
  cache-cleared-desc: "ページを再度読み込みしてください。"
 | 
			
		||||
  auto-watch: "投稿の自動ウォッチ"
 | 
			
		||||
  auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。"
 | 
			
		||||
  about: "Misskeyについて"
 | 
			
		||||
  operator: "このサーバーの運営者"
 | 
			
		||||
  update: "Misskey Update"
 | 
			
		||||
@@ -833,6 +866,7 @@ desktop/views/components/settings.2fa.vue:
 | 
			
		||||
  enter-password: "パスワードを入力してください"
 | 
			
		||||
  authenticator: "まず、Google Authenticatorをお使いのデバイスにインストールします:"
 | 
			
		||||
  howtoinstall: "インストール方法はこちら"
 | 
			
		||||
  token: "トークン"
 | 
			
		||||
  scan: "次に、表示されているQRコードをスキャンします:"
 | 
			
		||||
  done: "お使いのデバイスに表示されているトークンを入力して完了します:"
 | 
			
		||||
  submit: "完了"
 | 
			
		||||
@@ -847,13 +881,13 @@ common/views/components/api-settings.vue:
 | 
			
		||||
  token: "Token:"
 | 
			
		||||
  enter-password: "パスワードを入力してください"
 | 
			
		||||
  console:
 | 
			
		||||
    title: 'APIコンソール'
 | 
			
		||||
    endpoint: 'エンドポイント'
 | 
			
		||||
    parameter: 'パラメータ'
 | 
			
		||||
    title: "APIコンソール"
 | 
			
		||||
    endpoint: "エンドポイント"
 | 
			
		||||
    parameter: "パラメータ"
 | 
			
		||||
    credential-info: "「i」パラメータは自動で付与されます。"
 | 
			
		||||
    send: '送信'
 | 
			
		||||
    sending: '応答待ち'
 | 
			
		||||
    response: '結果'
 | 
			
		||||
    send: "送信"
 | 
			
		||||
    sending: "応答待ち"
 | 
			
		||||
    response: "結果"
 | 
			
		||||
desktop/views/components/settings.apps.vue:
 | 
			
		||||
  no-apps: "連携しているアプリケーションはありません"
 | 
			
		||||
common/views/components/drive-settings.vue:
 | 
			
		||||
@@ -955,6 +989,7 @@ admin/views/index.vue:
 | 
			
		||||
  federation: "連合"
 | 
			
		||||
  announcements: "お知らせ"
 | 
			
		||||
  hashtags: "ハッシュタグ"
 | 
			
		||||
  abuse: "スパム報告"
 | 
			
		||||
  back-to-misskey: "Misskeyに戻る"
 | 
			
		||||
admin/views/dashboard.vue:
 | 
			
		||||
  dashboard: "ダッシュボード"
 | 
			
		||||
@@ -964,6 +999,12 @@ admin/views/dashboard.vue:
 | 
			
		||||
  instances: "インスタンス"
 | 
			
		||||
  this-instance: "このインスタンス"
 | 
			
		||||
  federated: "連合"
 | 
			
		||||
admin/views/abuse.vue:
 | 
			
		||||
  title: "スパム報告"
 | 
			
		||||
  target: "対象"
 | 
			
		||||
  reporter: "報告者"
 | 
			
		||||
  details: "詳細"
 | 
			
		||||
  remove-report: "削除"
 | 
			
		||||
admin/views/instance.vue:
 | 
			
		||||
  instance: "インスタンス"
 | 
			
		||||
  instance-name: "インスタンス名"
 | 
			
		||||
@@ -1010,6 +1051,8 @@ admin/views/instance.vue:
 | 
			
		||||
  max-note-text-length: "投稿の最大文字数"
 | 
			
		||||
  disable-registration: "ユーザー登録の受付を停止する"
 | 
			
		||||
  disable-local-timeline: "ローカルタイムラインを無効にする"
 | 
			
		||||
  disable-global-timeline: "グローバルタイムラインを無効にする"
 | 
			
		||||
  disabling-timelines-info: "これらのタイムラインを無効にしても、管理者およびモデレーターは引き続き利用できます。"
 | 
			
		||||
  invite: "招待"
 | 
			
		||||
  save: "保存"
 | 
			
		||||
  saved: "保存しました"
 | 
			
		||||
@@ -1029,6 +1072,12 @@ admin/views/instance.vue:
 | 
			
		||||
  smtp-port: "SMTPポート"
 | 
			
		||||
  smtp-user: "SMTPユーザー"
 | 
			
		||||
  smtp-pass: "SMTPパスワード"
 | 
			
		||||
  serviceworker-config: "ServiceWorker"
 | 
			
		||||
  enable-serviceworker: "ServiceWorkerを有効にする"
 | 
			
		||||
  serviceworker-info: "プッシュ通知を行うには有効する必要があります。"
 | 
			
		||||
  vapid-publickey: "VAPID公開鍵"
 | 
			
		||||
  vapid-privatekey: "VAPID秘密鍵"
 | 
			
		||||
  vapid-info: "ServiceWorkerを有効にする場合、VAPIDキーペアを生成する必要があります。シェルで次のようにします:"
 | 
			
		||||
admin/views/charts.vue:
 | 
			
		||||
  title: "チャート"
 | 
			
		||||
  per-day: "1日ごと"
 | 
			
		||||
@@ -1047,6 +1096,7 @@ admin/views/charts.vue:
 | 
			
		||||
    notes-total: "投稿の積算"
 | 
			
		||||
    users: "ユーザーの増減"
 | 
			
		||||
    users-total: "ユーザーの積算"
 | 
			
		||||
    active-users: "アクティブユーザー数"
 | 
			
		||||
    drive: "ドライブ使用量の増減"
 | 
			
		||||
    drive-total: "ドライブ使用量の積算"
 | 
			
		||||
    drive-files: "ドライブのファイル数の増減"
 | 
			
		||||
@@ -1054,6 +1104,28 @@ admin/views/charts.vue:
 | 
			
		||||
    network-requests: "リクエスト"
 | 
			
		||||
    network-time: "応答時間"
 | 
			
		||||
    network-usage: "通信量"
 | 
			
		||||
admin/views/drive.vue:
 | 
			
		||||
  operation: "操作"
 | 
			
		||||
  fileid-or-url: "ファイルIDまたはファイルURL"
 | 
			
		||||
  file-not-found: "ファイルが見つかりません"
 | 
			
		||||
  lookup: "照会"
 | 
			
		||||
  sort:
 | 
			
		||||
    title: "ソート"
 | 
			
		||||
    createdAtAsc: "アップロード日時が古い順"
 | 
			
		||||
    createdAtDesc: "アップロード日時が新しい順"
 | 
			
		||||
    sizeAsc: "サイズが小さい順"
 | 
			
		||||
    sizeDesc: "サイズが大きい順"
 | 
			
		||||
  origin:
 | 
			
		||||
    title: "オリジン"
 | 
			
		||||
    combined: "ローカル+リモート"
 | 
			
		||||
    local: "ローカル"
 | 
			
		||||
    remote: "リモート"
 | 
			
		||||
  delete: "削除"
 | 
			
		||||
  deleted: "削除しました"
 | 
			
		||||
  mark-as-sensitive: "閲覧注意に設定"
 | 
			
		||||
  unmark-as-sensitive: "閲覧注意を解除"
 | 
			
		||||
  marked-as-sensitive: "閲覧注意に設定しました"
 | 
			
		||||
  unmarked-as-sensitive: "閲覧注意を解除しました"
 | 
			
		||||
admin/views/users.vue:
 | 
			
		||||
  operation: "操作"
 | 
			
		||||
  username-or-userid: "ユーザー名またはユーザーID"
 | 
			
		||||
@@ -1077,6 +1149,14 @@ admin/views/users.vue:
 | 
			
		||||
      createdAtDesc: "登録日時が新しい順"
 | 
			
		||||
      updatedAtAsc: "更新日時が古い順"
 | 
			
		||||
      updatedAtDesc: "更新日時が新しい順"
 | 
			
		||||
    state:
 | 
			
		||||
      title: "状態"
 | 
			
		||||
      all: "すべて"
 | 
			
		||||
      admin: "管理者"
 | 
			
		||||
      moderator: "モデレーター"
 | 
			
		||||
      adminOrModerator: "管理者+モデレーター"
 | 
			
		||||
      verified: "公式アカウント"
 | 
			
		||||
      suspended: "凍結済み"
 | 
			
		||||
    origin:
 | 
			
		||||
      title: "オリジン"
 | 
			
		||||
      combined: "ローカル+リモート"
 | 
			
		||||
@@ -1089,6 +1169,8 @@ admin/views/moderators.vue:
 | 
			
		||||
    title: "モデレーターの登録"
 | 
			
		||||
    add: "登録"
 | 
			
		||||
    added: "モデレーターを登録しました"
 | 
			
		||||
    remove: "解除"
 | 
			
		||||
    removed: "モデレーター登録を解除しました"
 | 
			
		||||
admin/views/emoji.vue:
 | 
			
		||||
  add-emoji:
 | 
			
		||||
    title: "絵文字の登録"
 | 
			
		||||
@@ -1170,17 +1252,7 @@ desktop/views/pages/user/user.photos.vue:
 | 
			
		||||
  no-photos: "写真はありません"
 | 
			
		||||
desktop/views/pages/user/user.profile.vue:
 | 
			
		||||
  follows-you: "フォローされています"
 | 
			
		||||
  stalk: "ストークする"
 | 
			
		||||
  stalking: "ストーキングしています"
 | 
			
		||||
  unstalk: "ストーク解除"
 | 
			
		||||
  mute: "ミュートする"
 | 
			
		||||
  muted: "ミュートしています"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロックする"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  block-confirm: "このユーザーをブロックしますか?"
 | 
			
		||||
  push-to-a-list: "リストに追加"
 | 
			
		||||
  list-pushed: "{user}を{list}に追加しました。"
 | 
			
		||||
  menu: "メニュー"
 | 
			
		||||
desktop/views/pages/user/user.header.vue:
 | 
			
		||||
  posts: "投稿"
 | 
			
		||||
  following: "フォロー"
 | 
			
		||||
@@ -1194,6 +1266,7 @@ desktop/views/pages/user/user.timeline.vue:
 | 
			
		||||
  default: "投稿"
 | 
			
		||||
  with-replies: "投稿と返信"
 | 
			
		||||
  with-media: "メディア"
 | 
			
		||||
  my-posts: "私の投稿"
 | 
			
		||||
  empty: "このユーザーはまだ何も投稿していないようです。"
 | 
			
		||||
desktop/views/widgets/messaging.vue:
 | 
			
		||||
  title: "メッセージ"
 | 
			
		||||
@@ -1392,7 +1465,6 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  notification-position: "通知の表示"
 | 
			
		||||
  notification-position-bottom: "下"
 | 
			
		||||
  notification-position-top: "上"
 | 
			
		||||
  theme: "テーマ"
 | 
			
		||||
  behavior: "動作"
 | 
			
		||||
  fetch-on-scroll: "スクロールで自動読み込み"
 | 
			
		||||
  note-visibility: "投稿の公開範囲"
 | 
			
		||||
@@ -1416,7 +1488,6 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  signout: "サインアウト"
 | 
			
		||||
  sound: "サウンド"
 | 
			
		||||
  enable-sounds: "サウンドを有効にする"
 | 
			
		||||
  mark-as-read-all-unread-notes: "すべての投稿を既読にする"
 | 
			
		||||
  password: "パスワード"
 | 
			
		||||
mobile/views/pages/user.vue:
 | 
			
		||||
  follows-you: "フォローされています"
 | 
			
		||||
@@ -1426,15 +1497,7 @@ mobile/views/pages/user.vue:
 | 
			
		||||
  overview: "概要"
 | 
			
		||||
  timeline: "タイムライン"
 | 
			
		||||
  media: "メディア"
 | 
			
		||||
  is-suspended: "このユーザーは凍結されています。"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  years-old: "{age}歳"
 | 
			
		||||
  push-to-list: "リストに追加"
 | 
			
		||||
  select-list: "リストを選択してください"
 | 
			
		||||
  list-pushed: "{user}を{list}に追加しました"
 | 
			
		||||
mobile/views/pages/user/home.vue:
 | 
			
		||||
  recent-notes: "最近の投稿"
 | 
			
		||||
  images: "画像"
 | 
			
		||||
@@ -1484,7 +1547,6 @@ deck/deck.user-column.vue:
 | 
			
		||||
  activity: "アクティビティ"
 | 
			
		||||
  timeline: "タイムライン"
 | 
			
		||||
  pinned-notes: "ピン留めされた投稿"
 | 
			
		||||
  push-to-a-list: "リストに追加"
 | 
			
		||||
docs:
 | 
			
		||||
  edit-this-page-on-github: "間違いや改善点を見つけましたか?"
 | 
			
		||||
  edit-this-page-on-github-link: "このページをGitHubで編集"
 | 
			
		||||
 
 | 
			
		||||
@@ -27,6 +27,7 @@ common:
 | 
			
		||||
  do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
 | 
			
		||||
  load-more: "もっと読み込む"
 | 
			
		||||
  enter-password: "パスワードを入力してください"
 | 
			
		||||
  2fa: "二段階認証"
 | 
			
		||||
  got-it: "Verstanden!"
 | 
			
		||||
  customization-tips:
 | 
			
		||||
    title: "Anpassung-Tipps"
 | 
			
		||||
@@ -90,7 +91,6 @@ common:
 | 
			
		||||
    followers-desc: "Nur für diejenigen sichtbar, die dir folgen"
 | 
			
		||||
    specified: "Direkt"
 | 
			
		||||
    specified-desc: "Nur für bestimmte Benutzer posten"
 | 
			
		||||
    private: "Privat"
 | 
			
		||||
    local-public: "公開 (ローカルのみ)"
 | 
			
		||||
    local-home: "ホーム (ローカルのみ)"
 | 
			
		||||
    local-followers: "フォロワー (ローカルのみ)"
 | 
			
		||||
@@ -110,8 +110,7 @@ common:
 | 
			
		||||
  my-token-regenerated: "Dein Token wurde generiert. Du wirst jetzt abgemeldet."
 | 
			
		||||
  i-like-sushi: "Ich bevorzuge Sushi anstelle von Pudding"
 | 
			
		||||
  show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
 | 
			
		||||
  use-white-black-reversi-stones: "リバーシに白黒の石を使う"
 | 
			
		||||
  use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
 | 
			
		||||
  use-avatar-reversi-stones: "リバーシの石にアバターを使う"
 | 
			
		||||
  verified-user: "Verifizierter Benutzer"
 | 
			
		||||
  disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
 | 
			
		||||
  suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
 | 
			
		||||
@@ -122,14 +121,21 @@ common:
 | 
			
		||||
  reduce-motion: "Animationen der Benutzeroberfläche reduzieren"
 | 
			
		||||
  this-setting-is-this-device-only: "Nur auf diesem Gerät"
 | 
			
		||||
  use-os-default-emojis: "OS標準の絵文字を使用"
 | 
			
		||||
  do-not-use-in-production: 'Dies ist eine Entwicklungsversion. Nicht in einer Produktionsumgebung verwenden.'
 | 
			
		||||
  line-width: "線の太さ"
 | 
			
		||||
  line-width-thin: "細い"
 | 
			
		||||
  line-width-normal: "普通"
 | 
			
		||||
  line-width-thick: "太い"
 | 
			
		||||
  hide-password: "パスワードを隠す"
 | 
			
		||||
  show-password: "パスワードを表示する"
 | 
			
		||||
  do-not-use-in-production: "Dies ist eine Entwicklungsversion. Nicht in einer Produktionsumgebung verwenden."
 | 
			
		||||
  user-suspended: "このユーザーは凍結されています。"
 | 
			
		||||
  is-remote-user: "このユーザー情報はコピーです。"
 | 
			
		||||
  is-remote-post: "この投稿情報はコピーです。"
 | 
			
		||||
  view-on-remote: "正確な情報を見る"
 | 
			
		||||
  renoted-by: "{user}がRenote"
 | 
			
		||||
  error:
 | 
			
		||||
    title: '問題が発生しました'
 | 
			
		||||
    retry: 'Erneut versuchen'
 | 
			
		||||
    title: "問題が発生しました"
 | 
			
		||||
    retry: "Erneut versuchen"
 | 
			
		||||
  reversi:
 | 
			
		||||
    drawn: "Unentschieden"
 | 
			
		||||
    my-turn: "Du bist am Zug"
 | 
			
		||||
@@ -165,6 +171,7 @@ common:
 | 
			
		||||
    hashtags: "Hashtags"
 | 
			
		||||
  dev: "Fehler beim Erstellen der Applikation. Bitte versuche es erneut."
 | 
			
		||||
  ai-chan-kawaii: "藍ちゃかわいい"
 | 
			
		||||
  you: "あなた"
 | 
			
		||||
auth/views/form.vue:
 | 
			
		||||
  share-access: "<i>{name}</i>があなたのアカウントにアクセスすることを許可しますか?"
 | 
			
		||||
  permission-ask: "このアプリは次の権限を要求しています:"
 | 
			
		||||
@@ -260,6 +267,7 @@ common/views/components/media-banner.vue:
 | 
			
		||||
  sensitive: "Dieser Inhalt ist NSFW"
 | 
			
		||||
  click-to-show: "Klicke zum den Inhalt anzusehen"
 | 
			
		||||
common/views/components/theme.vue:
 | 
			
		||||
  theme: "テーマ"
 | 
			
		||||
  light-theme: "Thema"
 | 
			
		||||
  dark-theme: "Thema während des Nachtmodus"
 | 
			
		||||
  light-themes: "Helles Thema"
 | 
			
		||||
@@ -276,6 +284,7 @@ common/views/components/theme.vue:
 | 
			
		||||
  base-theme: "Basisthema"
 | 
			
		||||
  base-theme-light: "Hell"
 | 
			
		||||
  base-theme-dark: "Dunkel"
 | 
			
		||||
  find-more-theme: "その他のテーマを入手"
 | 
			
		||||
  theme-name: "Name des Themas"
 | 
			
		||||
  preview-created-theme: "Vorschau"
 | 
			
		||||
  invalid-theme: "Thema ist ungültig"
 | 
			
		||||
@@ -299,6 +308,7 @@ common/views/components/cw-button.vue:
 | 
			
		||||
  show: "もっと見る"
 | 
			
		||||
  chars: "{count}文字"
 | 
			
		||||
  files: "{count}ファイル"
 | 
			
		||||
  poll: "アンケート"
 | 
			
		||||
common/views/components/messaging.vue:
 | 
			
		||||
  search-user: "Einen Nutzer suchen"
 | 
			
		||||
  you: "Du"
 | 
			
		||||
@@ -328,7 +338,9 @@ common/views/components/nav.vue:
 | 
			
		||||
  develop: "Entwickler"
 | 
			
		||||
  feedback: "Feedback"
 | 
			
		||||
common/views/components/note-menu.vue:
 | 
			
		||||
  mention: "メンション"
 | 
			
		||||
  detail: "詳細"
 | 
			
		||||
  copy-content: "内容をコピー"
 | 
			
		||||
  copy-link: "リンクをコピー"
 | 
			
		||||
  favorite: "Diese Notiz favorisieren"
 | 
			
		||||
  unfavorite: "Aus Favoriten entfernen"
 | 
			
		||||
@@ -337,6 +349,17 @@ common/views/components/note-menu.vue:
 | 
			
		||||
  delete: "Löschen"
 | 
			
		||||
  delete-confirm: "Diesen Post löschen?"
 | 
			
		||||
  remote: "Auf Quelle anzeigen"
 | 
			
		||||
common/views/components/user-menu.vue:
 | 
			
		||||
  mention: "メンション"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  push-to-list: "リストに追加"
 | 
			
		||||
  select-list: "リストを選択してください"
 | 
			
		||||
  report-abuse: "スパムを報告"
 | 
			
		||||
  report-abuse-detail: "どのような迷惑行為を行っていますか?"
 | 
			
		||||
  report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
 | 
			
		||||
common/views/components/poll.vue:
 | 
			
		||||
  vote-to: "Stimme für '{}'"
 | 
			
		||||
  vote-count: "{} Stimmen"
 | 
			
		||||
@@ -403,6 +426,13 @@ common/views/components/stream-indicator.vue:
 | 
			
		||||
  connecting: "Verbindung wird hergestellt"
 | 
			
		||||
  reconnecting: "Erneut verbinden"
 | 
			
		||||
  connected: "Verbindung hergestellt"
 | 
			
		||||
common/views/components/notification-settings.vue:
 | 
			
		||||
  title: "通知"
 | 
			
		||||
  mark-as-read-all-notifications: "すべての通知を既読にする"
 | 
			
		||||
  mark-as-read-all-unread-notes: "すべての投稿を既読にする"
 | 
			
		||||
  mark-as-read-all-talk-messages: "すべてのトークを既読にする"
 | 
			
		||||
  auto-watch: "投稿の自動ウォッチ"
 | 
			
		||||
  auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。"
 | 
			
		||||
common/views/components/integration-settings.vue:
 | 
			
		||||
  title: "サービス連携"
 | 
			
		||||
  connect: "接続する"
 | 
			
		||||
@@ -432,7 +462,6 @@ common/views/components/visibility-chooser.vue:
 | 
			
		||||
  followers-desc: "Nur für diejenigen sichtbar, die dir folgen"
 | 
			
		||||
  specified: "Direkt"
 | 
			
		||||
  specified-desc: "Poste nur für bestimmte Benutzer"
 | 
			
		||||
  private: "Privat"
 | 
			
		||||
  local-public: "公開 (ローカルのみ)"
 | 
			
		||||
  local-public-desc: "リモートへは公開しない"
 | 
			
		||||
  local-home: "ホーム (ローカルのみ)"
 | 
			
		||||
@@ -461,6 +490,7 @@ common/views/components/profile-editor.vue:
 | 
			
		||||
  is-bot: "このアカウントはBotです"
 | 
			
		||||
  is-locked: "フォローを承認制にする"
 | 
			
		||||
  careful-bot: "Botからのフォローだけ承認制にする"
 | 
			
		||||
  auto-accept-followed: "フォローしているユーザーからのフォローを自動承認する"
 | 
			
		||||
  advanced: "その他"
 | 
			
		||||
  privacy: "プライバシー"
 | 
			
		||||
  save: "保存"
 | 
			
		||||
@@ -471,6 +501,13 @@ common/views/components/profile-editor.vue:
 | 
			
		||||
  email-address: "メールアドレス"
 | 
			
		||||
  email-verified: "メールアドレスが確認されました"
 | 
			
		||||
  email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
 | 
			
		||||
common/views/components/user-list-editor.vue:
 | 
			
		||||
  users: "ユーザー"
 | 
			
		||||
  rename: "リスト名を変更"
 | 
			
		||||
  delete: "リストを削除"
 | 
			
		||||
  remove-user: "このリストから削除"
 | 
			
		||||
  delete-are-you-sure: "リスト「$1」を削除しますか?"
 | 
			
		||||
  deleted: "削除しました"
 | 
			
		||||
common/views/widgets/broadcast.vue:
 | 
			
		||||
  fetching: "Laden"
 | 
			
		||||
  no-broadcasts: "Keine Broadcasts"
 | 
			
		||||
@@ -520,10 +557,10 @@ common/views/widgets/tips.vue:
 | 
			
		||||
  tips-line19: "いくつかのウィンドウはブラウザの外に切り離すことができます"
 | 
			
		||||
  tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示しています"
 | 
			
		||||
  tips-line21: "APIを利用してbotの開発なども行えます"
 | 
			
		||||
  tips-line23: "まゆかわいいよまゆ"
 | 
			
		||||
  tips-line23: "藍かわいいよ藍"
 | 
			
		||||
  tips-line24: "Misskeyは2014年にサービスを開始しました"
 | 
			
		||||
  tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
 | 
			
		||||
common/views/pages/404.vue:
 | 
			
		||||
common/views/pages/not-found.vue:
 | 
			
		||||
  page-not-found: "ページが見つかりませんでした"
 | 
			
		||||
common/views/pages/follow.vue:
 | 
			
		||||
  signed-in-as: "{}としてサインイン中"
 | 
			
		||||
@@ -660,10 +697,12 @@ desktop/views/components/note-detail.vue:
 | 
			
		||||
  location: "Ort"
 | 
			
		||||
  renote: "Anmerkung"
 | 
			
		||||
  add-reaction: "Reaktion hinzufügen"
 | 
			
		||||
  undo-reaction: "リアクション解除"
 | 
			
		||||
desktop/views/components/note.vue:
 | 
			
		||||
  reply: "返信"
 | 
			
		||||
  renote: "Renote"
 | 
			
		||||
  add-reaction: "リアクション"
 | 
			
		||||
  undo-reaction: "リアクション解除"
 | 
			
		||||
  detail: "詳細"
 | 
			
		||||
  private: "この投稿は非公開です"
 | 
			
		||||
  deleted: "この投稿は削除されました"
 | 
			
		||||
@@ -734,7 +773,6 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  security: "Sicherheit"
 | 
			
		||||
  signin: "サインイン履歴"
 | 
			
		||||
  password: "Passwort"
 | 
			
		||||
  2fa: "Zwei-Faktor-Authentifizierung"
 | 
			
		||||
  other: "Anderes"
 | 
			
		||||
  license: "Lizenz"
 | 
			
		||||
  theme: "テーマ"
 | 
			
		||||
@@ -748,9 +786,6 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
 | 
			
		||||
  auto-popout: "Automatische Pop-out Fenster"
 | 
			
		||||
  auto-popout-desc: "Pop-out ein offenes Fenster wenn möglich. Diese Einstellung wird im Browser gespeichert."
 | 
			
		||||
  advanced: "Erweiterte Einstellungen"
 | 
			
		||||
  api-via-stream: "API-Anfrage via stream"
 | 
			
		||||
  api-via-stream-desc: "API-Anfrage über WebSocket statt native Aktualisierungs-API (für bessere Leistung). Diese Einstellung wird im Browser gespeichert."
 | 
			
		||||
  deck-nav: "デッキ内ナビゲーション"
 | 
			
		||||
  deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
 | 
			
		||||
  deck-default: "デッキをデフォルトのUIにする"
 | 
			
		||||
@@ -793,8 +828,6 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  cache-warn: "Der Cache deines Benutzerkontos (Info, Beiträge, Antworten, Direktnachrichten, Einstellungen), die lokal im Browser gespeichert sind werden gelöscht.\nDu musst die Seite aktualisieren nachdem du aufgeräumt hast."
 | 
			
		||||
  cache-cleared: "キャッシュを削除しました"
 | 
			
		||||
  cache-cleared-desc: "ページを再度読み込みしてください。"
 | 
			
		||||
  auto-watch: "投稿の自動ウォッチ"
 | 
			
		||||
  auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。"
 | 
			
		||||
  about: "Misskeyについて"
 | 
			
		||||
  operator: "このサーバーの運営者"
 | 
			
		||||
  update: "Misskey Update"
 | 
			
		||||
@@ -833,6 +866,7 @@ desktop/views/components/settings.2fa.vue:
 | 
			
		||||
  enter-password: "Bitte Passwort eingeben"
 | 
			
		||||
  authenticator: "まず、Google Authenticatorをお使いのデバイスにインストールします:"
 | 
			
		||||
  howtoinstall: "インストール方法はこちら"
 | 
			
		||||
  token: "トークン"
 | 
			
		||||
  scan: "次に、表示されているQRコードをスキャンします:"
 | 
			
		||||
  done: "お使いのデバイスに表示されているトークンを入力して完了します:"
 | 
			
		||||
  submit: "完了"
 | 
			
		||||
@@ -847,13 +881,13 @@ common/views/components/api-settings.vue:
 | 
			
		||||
  token: "Token:"
 | 
			
		||||
  enter-password: "パスワードを入力してください"
 | 
			
		||||
  console:
 | 
			
		||||
    title: 'APIコンソール'
 | 
			
		||||
    endpoint: 'エンドポイント'
 | 
			
		||||
    parameter: 'パラメータ'
 | 
			
		||||
    title: "APIコンソール"
 | 
			
		||||
    endpoint: "エンドポイント"
 | 
			
		||||
    parameter: "パラメータ"
 | 
			
		||||
    credential-info: "「i」パラメータは自動で付与されます。"
 | 
			
		||||
    send: '送信'
 | 
			
		||||
    sending: '応答待ち'
 | 
			
		||||
    response: '結果'
 | 
			
		||||
    send: "送信"
 | 
			
		||||
    sending: "応答待ち"
 | 
			
		||||
    response: "結果"
 | 
			
		||||
desktop/views/components/settings.apps.vue:
 | 
			
		||||
  no-apps: "連携しているアプリケーションはありません"
 | 
			
		||||
common/views/components/drive-settings.vue:
 | 
			
		||||
@@ -955,6 +989,7 @@ admin/views/index.vue:
 | 
			
		||||
  federation: "連合"
 | 
			
		||||
  announcements: "お知らせ"
 | 
			
		||||
  hashtags: "ハッシュタグ"
 | 
			
		||||
  abuse: "スパム報告"
 | 
			
		||||
  back-to-misskey: "Misskeyに戻る"
 | 
			
		||||
admin/views/dashboard.vue:
 | 
			
		||||
  dashboard: "ダッシュボード"
 | 
			
		||||
@@ -964,6 +999,12 @@ admin/views/dashboard.vue:
 | 
			
		||||
  instances: "インスタンス"
 | 
			
		||||
  this-instance: "このインスタンス"
 | 
			
		||||
  federated: "連合"
 | 
			
		||||
admin/views/abuse.vue:
 | 
			
		||||
  title: "スパム報告"
 | 
			
		||||
  target: "対象"
 | 
			
		||||
  reporter: "報告者"
 | 
			
		||||
  details: "詳細"
 | 
			
		||||
  remove-report: "削除"
 | 
			
		||||
admin/views/instance.vue:
 | 
			
		||||
  instance: "インスタンス"
 | 
			
		||||
  instance-name: "インスタンス名"
 | 
			
		||||
@@ -1010,6 +1051,8 @@ admin/views/instance.vue:
 | 
			
		||||
  max-note-text-length: "投稿の最大文字数"
 | 
			
		||||
  disable-registration: "ユーザー登録の受付を停止する"
 | 
			
		||||
  disable-local-timeline: "ローカルタイムラインを無効にする"
 | 
			
		||||
  disable-global-timeline: "グローバルタイムラインを無効にする"
 | 
			
		||||
  disabling-timelines-info: "これらのタイムラインを無効にしても、管理者およびモデレーターは引き続き利用できます。"
 | 
			
		||||
  invite: "招待"
 | 
			
		||||
  save: "保存"
 | 
			
		||||
  saved: "保存しました"
 | 
			
		||||
@@ -1029,6 +1072,12 @@ admin/views/instance.vue:
 | 
			
		||||
  smtp-port: "SMTPポート"
 | 
			
		||||
  smtp-user: "SMTPユーザー"
 | 
			
		||||
  smtp-pass: "SMTPパスワード"
 | 
			
		||||
  serviceworker-config: "ServiceWorker"
 | 
			
		||||
  enable-serviceworker: "ServiceWorkerを有効にする"
 | 
			
		||||
  serviceworker-info: "プッシュ通知を行うには有効する必要があります。"
 | 
			
		||||
  vapid-publickey: "VAPID公開鍵"
 | 
			
		||||
  vapid-privatekey: "VAPID秘密鍵"
 | 
			
		||||
  vapid-info: "ServiceWorkerを有効にする場合、VAPIDキーペアを生成する必要があります。シェルで次のようにします:"
 | 
			
		||||
admin/views/charts.vue:
 | 
			
		||||
  title: "チャート"
 | 
			
		||||
  per-day: "1日ごと"
 | 
			
		||||
@@ -1047,6 +1096,7 @@ admin/views/charts.vue:
 | 
			
		||||
    notes-total: "投稿の積算"
 | 
			
		||||
    users: "ユーザーの増減"
 | 
			
		||||
    users-total: "ユーザーの積算"
 | 
			
		||||
    active-users: "アクティブユーザー数"
 | 
			
		||||
    drive: "ドライブ使用量の増減"
 | 
			
		||||
    drive-total: "ドライブ使用量の積算"
 | 
			
		||||
    drive-files: "ドライブのファイル数の増減"
 | 
			
		||||
@@ -1054,6 +1104,28 @@ admin/views/charts.vue:
 | 
			
		||||
    network-requests: "リクエスト"
 | 
			
		||||
    network-time: "応答時間"
 | 
			
		||||
    network-usage: "通信量"
 | 
			
		||||
admin/views/drive.vue:
 | 
			
		||||
  operation: "操作"
 | 
			
		||||
  fileid-or-url: "ファイルIDまたはファイルURL"
 | 
			
		||||
  file-not-found: "ファイルが見つかりません"
 | 
			
		||||
  lookup: "照会"
 | 
			
		||||
  sort:
 | 
			
		||||
    title: "ソート"
 | 
			
		||||
    createdAtAsc: "アップロード日時が古い順"
 | 
			
		||||
    createdAtDesc: "アップロード日時が新しい順"
 | 
			
		||||
    sizeAsc: "サイズが小さい順"
 | 
			
		||||
    sizeDesc: "サイズが大きい順"
 | 
			
		||||
  origin:
 | 
			
		||||
    title: "オリジン"
 | 
			
		||||
    combined: "ローカル+リモート"
 | 
			
		||||
    local: "ローカル"
 | 
			
		||||
    remote: "リモート"
 | 
			
		||||
  delete: "削除"
 | 
			
		||||
  deleted: "削除しました"
 | 
			
		||||
  mark-as-sensitive: "閲覧注意に設定"
 | 
			
		||||
  unmark-as-sensitive: "閲覧注意を解除"
 | 
			
		||||
  marked-as-sensitive: "閲覧注意に設定しました"
 | 
			
		||||
  unmarked-as-sensitive: "閲覧注意を解除しました"
 | 
			
		||||
admin/views/users.vue:
 | 
			
		||||
  operation: "操作"
 | 
			
		||||
  username-or-userid: "ユーザー名またはユーザーID"
 | 
			
		||||
@@ -1077,6 +1149,14 @@ admin/views/users.vue:
 | 
			
		||||
      createdAtDesc: "登録日時が新しい順"
 | 
			
		||||
      updatedAtAsc: "更新日時が古い順"
 | 
			
		||||
      updatedAtDesc: "更新日時が新しい順"
 | 
			
		||||
    state:
 | 
			
		||||
      title: "状態"
 | 
			
		||||
      all: "すべて"
 | 
			
		||||
      admin: "管理者"
 | 
			
		||||
      moderator: "モデレーター"
 | 
			
		||||
      adminOrModerator: "管理者+モデレーター"
 | 
			
		||||
      verified: "公式アカウント"
 | 
			
		||||
      suspended: "凍結済み"
 | 
			
		||||
    origin:
 | 
			
		||||
      title: "オリジン"
 | 
			
		||||
      combined: "ローカル+リモート"
 | 
			
		||||
@@ -1089,6 +1169,8 @@ admin/views/moderators.vue:
 | 
			
		||||
    title: "モデレーターの登録"
 | 
			
		||||
    add: "登録"
 | 
			
		||||
    added: "モデレーターを登録しました"
 | 
			
		||||
    remove: "解除"
 | 
			
		||||
    removed: "モデレーター登録を解除しました"
 | 
			
		||||
admin/views/emoji.vue:
 | 
			
		||||
  add-emoji:
 | 
			
		||||
    title: "絵文字の登録"
 | 
			
		||||
@@ -1170,17 +1252,7 @@ desktop/views/pages/user/user.photos.vue:
 | 
			
		||||
  no-photos: "写真はありません"
 | 
			
		||||
desktop/views/pages/user/user.profile.vue:
 | 
			
		||||
  follows-you: "フォローされています"
 | 
			
		||||
  stalk: "ストークする"
 | 
			
		||||
  stalking: "ストーキングしています"
 | 
			
		||||
  unstalk: "ストーク解除"
 | 
			
		||||
  mute: "ミュートする"
 | 
			
		||||
  muted: "ミュートしています"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロックする"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  block-confirm: "このユーザーをブロックしますか?"
 | 
			
		||||
  push-to-a-list: "リストに追加"
 | 
			
		||||
  list-pushed: "{user}を{list}に追加しました。"
 | 
			
		||||
  menu: "メニュー"
 | 
			
		||||
desktop/views/pages/user/user.header.vue:
 | 
			
		||||
  posts: "投稿"
 | 
			
		||||
  following: "フォロー"
 | 
			
		||||
@@ -1194,6 +1266,7 @@ desktop/views/pages/user/user.timeline.vue:
 | 
			
		||||
  default: "投稿"
 | 
			
		||||
  with-replies: "投稿と返信"
 | 
			
		||||
  with-media: "メディア"
 | 
			
		||||
  my-posts: "私の投稿"
 | 
			
		||||
  empty: "このユーザーはまだ何も投稿していないようです。"
 | 
			
		||||
desktop/views/widgets/messaging.vue:
 | 
			
		||||
  title: "メッセージ"
 | 
			
		||||
@@ -1392,7 +1465,6 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  notification-position: "通知の表示"
 | 
			
		||||
  notification-position-bottom: "下"
 | 
			
		||||
  notification-position-top: "上"
 | 
			
		||||
  theme: "テーマ"
 | 
			
		||||
  behavior: "動作"
 | 
			
		||||
  fetch-on-scroll: "スクロールで自動読み込み"
 | 
			
		||||
  note-visibility: "投稿の公開範囲"
 | 
			
		||||
@@ -1416,7 +1488,6 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  signout: "サインアウト"
 | 
			
		||||
  sound: "サウンド"
 | 
			
		||||
  enable-sounds: "サウンドを有効にする"
 | 
			
		||||
  mark-as-read-all-unread-notes: "すべての投稿を既読にする"
 | 
			
		||||
  password: "パスワード"
 | 
			
		||||
mobile/views/pages/user.vue:
 | 
			
		||||
  follows-you: "フォローされています"
 | 
			
		||||
@@ -1426,15 +1497,7 @@ mobile/views/pages/user.vue:
 | 
			
		||||
  overview: "概要"
 | 
			
		||||
  timeline: "タイムライン"
 | 
			
		||||
  media: "メディア"
 | 
			
		||||
  is-suspended: "このユーザーは凍結されています。"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  years-old: "{age}歳"
 | 
			
		||||
  push-to-list: "リストに追加"
 | 
			
		||||
  select-list: "リストを選択してください"
 | 
			
		||||
  list-pushed: "{user}を{list}に追加しました"
 | 
			
		||||
mobile/views/pages/user/home.vue:
 | 
			
		||||
  recent-notes: "最近の投稿"
 | 
			
		||||
  images: "画像"
 | 
			
		||||
@@ -1484,7 +1547,6 @@ deck/deck.user-column.vue:
 | 
			
		||||
  activity: "アクティビティ"
 | 
			
		||||
  timeline: "タイムライン"
 | 
			
		||||
  pinned-notes: "ピン留めされた投稿"
 | 
			
		||||
  push-to-a-list: "リストに追加"
 | 
			
		||||
docs:
 | 
			
		||||
  edit-this-page-on-github: "間違いや改善点を見つけましたか?"
 | 
			
		||||
  edit-this-page-on-github-link: "このページをGitHubで編集"
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@ common:
 | 
			
		||||
  about: "Thank you for finding Misskey. Misskey is a <b>decentralized microblogging platform</b> born on Earth. Since it exists within the Fediverse (a universe where various social media platforms are organized), it is mutually linked with other social media platforms. Why don't you take a short break from the hustle and bustle of the city, and dive into a new Internet?"
 | 
			
		||||
  intro:
 | 
			
		||||
    title: "What is Misskey?"
 | 
			
		||||
    about: "Misskey is a open-source <b>decentralized microblogging service</b>. Sophisticated fully customizable Ui, varieties of reaction for posts, free file storage providing integrated management system and other advancing functions are available. Also, network system called “Fediverse” enables us to communicate with users on other SNSs. Like, if you post something, then your posts will sent not only to Misskey but also mastodon. Just imagine that the planet is sending a microwave to other planet to communication."
 | 
			
		||||
    about: "Misskey is an open-source <b>decentralized microblogging service</b>. Sophisticated fully customizable UI, varieties of reactions for posts, free file storage providing an integrated management system and other advanced functions are available. In addition, Misskey connects to a network system called the “Fediverse” enables us to communicate with users on other SNSs. For example, when you post something it will be sent not only to Misskey but also Mastodon and Pleroma. Just imagine that the planet is sending a radio transmission to other planet to communicate."
 | 
			
		||||
    features: "Features"
 | 
			
		||||
    rich-contents: "Post"
 | 
			
		||||
    rich-contents-desc: "Just post your idea, hot topics and anything you want to share. You may want to decorate your words, attach your favorite pictures, send files including movies and create a poll - those are the things you can do on Misskey!"
 | 
			
		||||
@@ -18,7 +18,7 @@ common:
 | 
			
		||||
    ui-desc: "No UI fits for everyone. Therefore, Misskey has a highly customizable UI for your taste. Make your original home by editing, adjusting layouts of timeline and placing selectable widgets you can easily customize."
 | 
			
		||||
    drive: "Drive"
 | 
			
		||||
    drive-desc: "Wanna post a picture you have already uploaded? Wish to organize, name and create a folder for your uploaded files? Misskey Drive is the best solution for you. Very easy to share your files online."
 | 
			
		||||
    outro: "Check further Misskey-unique features on your eyes! Feeling like this is not for you, try other instances as Misskey is a decentralized SNS so that you can easily find your mates. Then, GLHF!"
 | 
			
		||||
    outro: "Check Misskey-unique features by seeing them with your own eyes! If you feel like this instance is not for you, try other instances, as Misskey is a decentralized SNS, so that you can easily find your mates. Then, GLHF!"
 | 
			
		||||
  adblock:
 | 
			
		||||
    detected: "Please disable ad blocker."
 | 
			
		||||
    warning: "Some features may be unavailable or cause malfunctions if ad blocking features are enabled. <strong>Misskey is not running ads</strong>."
 | 
			
		||||
@@ -27,6 +27,7 @@ common:
 | 
			
		||||
  do-not-copy-paste: "Please do not enter or paste the code here. Account may be compromised."
 | 
			
		||||
  load-more: "Load more"
 | 
			
		||||
  enter-password: "Please enter the Password"
 | 
			
		||||
  2fa: "Two-factor authentication"
 | 
			
		||||
  got-it: "Got it!"
 | 
			
		||||
  customization-tips:
 | 
			
		||||
    title: "Customization tips"
 | 
			
		||||
@@ -90,7 +91,6 @@ common:
 | 
			
		||||
    followers-desc: "Post to followers only"
 | 
			
		||||
    specified: "Direct"
 | 
			
		||||
    specified-desc: "Post to specified users only"
 | 
			
		||||
    private: "Private"
 | 
			
		||||
    local-public: "Public (Only local)"
 | 
			
		||||
    local-home: "Home (Only local)"
 | 
			
		||||
    local-followers: "Followers (Only local)"
 | 
			
		||||
@@ -110,8 +110,7 @@ common:
 | 
			
		||||
  my-token-regenerated: "Your token has been regenerated, so you will be signed out."
 | 
			
		||||
  i-like-sushi: "I prefer sushi rather than pudding"
 | 
			
		||||
  show-reversi-board-labels: "Show row and column labels in Reversi"
 | 
			
		||||
  use-white-black-reversi-stones: "Use white-black stone in reversi"
 | 
			
		||||
  use-contrast-reversi-stones: "Make the stone color clear in reversi"
 | 
			
		||||
  use-avatar-reversi-stones: "Use avatar as a stone in reversi"
 | 
			
		||||
  verified-user: "Verified account"
 | 
			
		||||
  disable-animated-mfm: "Disable animated texts in a post"
 | 
			
		||||
  suggest-recent-hashtags: "Suggest recently used hashtags within the post composition area"
 | 
			
		||||
@@ -122,14 +121,21 @@ common:
 | 
			
		||||
  reduce-motion: "Reduce motion in UI"
 | 
			
		||||
  this-setting-is-this-device-only: "Only for this device"
 | 
			
		||||
  use-os-default-emojis: "Use the OS default Emojis"
 | 
			
		||||
  do-not-use-in-production: 'This is a development build. Do not use in production.'
 | 
			
		||||
  is-remote-user: "This user information is copied."
 | 
			
		||||
  is-remote-post: "This post information is a copy."
 | 
			
		||||
  view-on-remote: "View it on remote"
 | 
			
		||||
  line-width: "Line thickness"
 | 
			
		||||
  line-width-thin: "Thin"
 | 
			
		||||
  line-width-normal: "Regular"
 | 
			
		||||
  line-width-thick: "Thick"
 | 
			
		||||
  hide-password: "Hide Password"
 | 
			
		||||
  show-password: "Show Password"
 | 
			
		||||
  do-not-use-in-production: "This is a development build. Do not use in production."
 | 
			
		||||
  user-suspended: "This user has been suspended."
 | 
			
		||||
  is-remote-user: "This user's information is mirrored."
 | 
			
		||||
  is-remote-post: "These post contents are mirrored."
 | 
			
		||||
  view-on-remote: "For completion, view it remotely."
 | 
			
		||||
  renoted-by: "Renoted by {user}"
 | 
			
		||||
  error:
 | 
			
		||||
    title: 'Something happened :('
 | 
			
		||||
    retry: 'Retry'
 | 
			
		||||
    title: "Something happened :("
 | 
			
		||||
    retry: "Retry"
 | 
			
		||||
  reversi:
 | 
			
		||||
    drawn: "Draw"
 | 
			
		||||
    my-turn: "Your turn"
 | 
			
		||||
@@ -165,6 +171,7 @@ common:
 | 
			
		||||
    hashtags: "Hashtags"
 | 
			
		||||
  dev: "Failed to create the application. Please try again."
 | 
			
		||||
  ai-chan-kawaii: "Ai-chan kawaii!"
 | 
			
		||||
  you: "You"
 | 
			
		||||
auth/views/form.vue:
 | 
			
		||||
  share-access: "Would you allow <i>{name}</i> to access your account?"
 | 
			
		||||
  permission-ask: "This application requires the following permissions:"
 | 
			
		||||
@@ -260,6 +267,7 @@ common/views/components/media-banner.vue:
 | 
			
		||||
  sensitive: "NSFW"
 | 
			
		||||
  click-to-show: "Click to show"
 | 
			
		||||
common/views/components/theme.vue:
 | 
			
		||||
  theme: "Theme"
 | 
			
		||||
  light-theme: "Theme"
 | 
			
		||||
  dark-theme: "Theme during dark mode"
 | 
			
		||||
  light-themes: "Light theme"
 | 
			
		||||
@@ -276,6 +284,7 @@ common/views/components/theme.vue:
 | 
			
		||||
  base-theme: "Base theme"
 | 
			
		||||
  base-theme-light: "Light"
 | 
			
		||||
  base-theme-dark: "Dark"
 | 
			
		||||
  find-more-theme: "Find more themes"
 | 
			
		||||
  theme-name: "Theme name"
 | 
			
		||||
  preview-created-theme: "Preview"
 | 
			
		||||
  invalid-theme: "Not valid theme"
 | 
			
		||||
@@ -299,6 +308,7 @@ common/views/components/cw-button.vue:
 | 
			
		||||
  show: "See more"
 | 
			
		||||
  chars: "{count} chars"
 | 
			
		||||
  files: "{count} files"
 | 
			
		||||
  poll: "Poll"
 | 
			
		||||
common/views/components/messaging.vue:
 | 
			
		||||
  search-user: "Find a user"
 | 
			
		||||
  you: "You"
 | 
			
		||||
@@ -328,15 +338,28 @@ common/views/components/nav.vue:
 | 
			
		||||
  develop: "Developers"
 | 
			
		||||
  feedback: "Feedback"
 | 
			
		||||
common/views/components/note-menu.vue:
 | 
			
		||||
  mention: "Mention"
 | 
			
		||||
  detail: "Details"
 | 
			
		||||
  copy-content: "Copy the contents"
 | 
			
		||||
  copy-link: "Copy link"
 | 
			
		||||
  favorite: "Favorite this note"
 | 
			
		||||
  unfavorite: "Unfavorite"
 | 
			
		||||
  pin: "Pin to your profile"
 | 
			
		||||
  unpin: "Unpin"
 | 
			
		||||
  delete: "Delete"
 | 
			
		||||
  delete-confirm: "Delete this post?"
 | 
			
		||||
  delete-confirm: "Are you sure you want to delete this post?"
 | 
			
		||||
  remote: "Show original note"
 | 
			
		||||
common/views/components/user-menu.vue:
 | 
			
		||||
  mention: "Mention"
 | 
			
		||||
  mute: "Mute"
 | 
			
		||||
  unmute: "Unmute"
 | 
			
		||||
  block: "Block"
 | 
			
		||||
  unblock: "Unblock"
 | 
			
		||||
  push-to-list: "Add to list"
 | 
			
		||||
  select-list: "Select a list"
 | 
			
		||||
  report-abuse: "Report abuse"
 | 
			
		||||
  report-abuse-detail: "どのような迷惑行為を行っていますか?"
 | 
			
		||||
  report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
 | 
			
		||||
common/views/components/poll.vue:
 | 
			
		||||
  vote-to: "Vote for '{}'"
 | 
			
		||||
  vote-count: "{} votes"
 | 
			
		||||
@@ -403,6 +426,13 @@ common/views/components/stream-indicator.vue:
 | 
			
		||||
  connecting: "Connecting"
 | 
			
		||||
  reconnecting: "Reconnecting"
 | 
			
		||||
  connected: "Connected"
 | 
			
		||||
common/views/components/notification-settings.vue:
 | 
			
		||||
  title: "Notifications"
 | 
			
		||||
  mark-as-read-all-notifications: "Mark all notifications as read"
 | 
			
		||||
  mark-as-read-all-unread-notes: "Mark all posts as read"
 | 
			
		||||
  mark-as-read-all-talk-messages: "Mark all conversations as read"
 | 
			
		||||
  auto-watch: "Automatically watch out for posts"
 | 
			
		||||
  auto-watch-desc: "Automatically receive notifications about posts you react to, or respond to."
 | 
			
		||||
common/views/components/integration-settings.vue:
 | 
			
		||||
  title: "Service cooperation"
 | 
			
		||||
  connect: "Connect"
 | 
			
		||||
@@ -416,7 +446,7 @@ common/views/components/github-setting.vue:
 | 
			
		||||
  connect: "Link your GitHub account"
 | 
			
		||||
  disconnect: "Disconnect"
 | 
			
		||||
common/views/components/discord-setting.vue:
 | 
			
		||||
  description: "Once you connect your Discord account to your Misskey account, you will be able to see information about your Discord account on your profile, and you will be able to sign-in using Discord."
 | 
			
		||||
  description: "Once you connect your Discord account to your Misskey account, you will be able to see information from your Discord account on your profile, and you will be able to sign-in using Discord."
 | 
			
		||||
  connected-to: "You are connected to this Discord account"
 | 
			
		||||
  detail: "Details…"
 | 
			
		||||
  reconnect: "Reconnect"
 | 
			
		||||
@@ -432,7 +462,6 @@ common/views/components/visibility-chooser.vue:
 | 
			
		||||
  followers-desc: "Post to Followers only"
 | 
			
		||||
  specified: "Direct"
 | 
			
		||||
  specified-desc: "Post to specified users only"
 | 
			
		||||
  private: "Private"
 | 
			
		||||
  local-public: "Local (Public)"
 | 
			
		||||
  local-public-desc: "Do not publish to remote"
 | 
			
		||||
  local-home: "Home (Only local)"
 | 
			
		||||
@@ -461,6 +490,7 @@ common/views/components/profile-editor.vue:
 | 
			
		||||
  is-bot: "This account is a Bot"
 | 
			
		||||
  is-locked: "Follower requests require approval"
 | 
			
		||||
  careful-bot: "Follower requests from bots require approval"
 | 
			
		||||
  auto-accept-followed: "Automatically approve follows from the people you follow"
 | 
			
		||||
  advanced: "Other"
 | 
			
		||||
  privacy: "Privacy"
 | 
			
		||||
  save: "Save"
 | 
			
		||||
@@ -471,6 +501,13 @@ common/views/components/profile-editor.vue:
 | 
			
		||||
  email-address: "Email Address"
 | 
			
		||||
  email-verified: "Your email has been verified."
 | 
			
		||||
  email-not-verified: "Email address is not confirmed. Please check your inbox."
 | 
			
		||||
common/views/components/user-list-editor.vue:
 | 
			
		||||
  users: "User"
 | 
			
		||||
  rename: "Rename list"
 | 
			
		||||
  delete: "Delete list"
 | 
			
		||||
  remove-user: "Remove from this list"
 | 
			
		||||
  delete-are-you-sure: "Delete list \"$1\"?"
 | 
			
		||||
  deleted: "Deleted successfully"
 | 
			
		||||
common/views/widgets/broadcast.vue:
 | 
			
		||||
  fetching: "Checking"
 | 
			
		||||
  no-broadcasts: "No announcements"
 | 
			
		||||
@@ -481,8 +518,8 @@ common/views/widgets/calendar.vue:
 | 
			
		||||
  month: "{},"
 | 
			
		||||
  day: "{}"
 | 
			
		||||
  today: "Today: "
 | 
			
		||||
  this-month: "This month: "
 | 
			
		||||
  this-year: "This year: "
 | 
			
		||||
  this-month: "Month:"
 | 
			
		||||
  this-year: "Year:"
 | 
			
		||||
common/views/widgets/photo-stream.vue:
 | 
			
		||||
  title: "Photo stream"
 | 
			
		||||
  no-photos: "No photos"
 | 
			
		||||
@@ -520,11 +557,11 @@ common/views/widgets/tips.vue:
 | 
			
		||||
  tips-line19: "Several windows can be detached outside the browser."
 | 
			
		||||
  tips-line20: "The percentage of the calendar widget shows the percentage of time elapsed."
 | 
			
		||||
  tips-line21: "You can also use the API to develop bots."
 | 
			
		||||
  tips-line23: "Mayu is so cute with its eyebrows."
 | 
			
		||||
  tips-line23: "Ai-chan kawaii!"
 | 
			
		||||
  tips-line24: "Misskey has been running since 2014."
 | 
			
		||||
  tips-line25: "In a browser compatible with notification features, you can receive notifications in case Misskey is not open"
 | 
			
		||||
common/views/pages/404.vue:
 | 
			
		||||
  page-not-found: "Page not found"
 | 
			
		||||
common/views/pages/not-found.vue:
 | 
			
		||||
  page-not-found: "The page has not been found"
 | 
			
		||||
common/views/pages/follow.vue:
 | 
			
		||||
  signed-in-as: "Signed in as {}"
 | 
			
		||||
  following: "Following"
 | 
			
		||||
@@ -584,8 +621,8 @@ desktop/views/components/drive.file.vue:
 | 
			
		||||
    copy-url: "Copy URL"
 | 
			
		||||
    download: "Download"
 | 
			
		||||
    else-files: "Others"
 | 
			
		||||
    set-as-avatar: "Set as avatar"
 | 
			
		||||
    set-as-banner: "Set as banner"
 | 
			
		||||
    set-as-avatar: "Set as an avatar"
 | 
			
		||||
    set-as-banner: "Set as a banner"
 | 
			
		||||
    open-in-app: "Open in app"
 | 
			
		||||
    add-app: "Add app"
 | 
			
		||||
    rename-file: "Rename file"
 | 
			
		||||
@@ -660,10 +697,12 @@ desktop/views/components/note-detail.vue:
 | 
			
		||||
  location: "Location"
 | 
			
		||||
  renote: "Repost"
 | 
			
		||||
  add-reaction: "Add a reaction"
 | 
			
		||||
  undo-reaction: "Reverse reaction"
 | 
			
		||||
desktop/views/components/note.vue:
 | 
			
		||||
  reply: "Reply"
 | 
			
		||||
  renote: "Renote"
 | 
			
		||||
  add-reaction: "Add a reaction"
 | 
			
		||||
  undo-reaction: "Reverse reaction"
 | 
			
		||||
  detail: "Details"
 | 
			
		||||
  private: "This post is private"
 | 
			
		||||
  deleted: "This post has been deleted"
 | 
			
		||||
@@ -734,7 +773,6 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  security: "Security"
 | 
			
		||||
  signin: "Sign in history"
 | 
			
		||||
  password: "Password"
 | 
			
		||||
  2fa: "Two-factor authentication"
 | 
			
		||||
  other: "Other"
 | 
			
		||||
  license: "License"
 | 
			
		||||
  theme: "Theme"
 | 
			
		||||
@@ -748,9 +786,6 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  web-search-engine-desc: "Example: https://www.google.com/?#q={{query}}"
 | 
			
		||||
  auto-popout: "Auto pop-out window"
 | 
			
		||||
  auto-popout-desc: "If it's possible, pop-out display will be used instead of opening a new window. This setting is stored in your browser."
 | 
			
		||||
  advanced: "Advanced settings"
 | 
			
		||||
  api-via-stream: "API request via stream"
 | 
			
		||||
  api-via-stream-desc: "API request is performed via the WebSocket connection instead of native fetch API (for better performance). This setting is stored in the browser."
 | 
			
		||||
  deck-nav: "Transitionless deck navigation"
 | 
			
		||||
  deck-nav-desc: "You get a temporary column without page transitions during navigation when using the deck."
 | 
			
		||||
  deck-default: "Use Deck as default UI"
 | 
			
		||||
@@ -793,8 +828,6 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  cache-warn: "The cache of account info/posts/replies/messages/settings stored in the browser will be deleted. You need to reload the page after cleaning up."
 | 
			
		||||
  cache-cleared: "Cache cleared"
 | 
			
		||||
  cache-cleared-desc: "Please reload the page."
 | 
			
		||||
  auto-watch: "Automatic watch"
 | 
			
		||||
  auto-watch-desc: "Receive notifications about the post/reply/reaction automatically."
 | 
			
		||||
  about: "About Misskey"
 | 
			
		||||
  operator: "The admin of this instance"
 | 
			
		||||
  update: "Misskey Update"
 | 
			
		||||
@@ -833,6 +866,7 @@ desktop/views/components/settings.2fa.vue:
 | 
			
		||||
  enter-password: "Enter the password"
 | 
			
		||||
  authenticator: "First, you need to install Google Authenticator on your device:"
 | 
			
		||||
  howtoinstall: "How to install"
 | 
			
		||||
  token: "Token"
 | 
			
		||||
  scan: "And then, scan the QR code:"
 | 
			
		||||
  done: "Please enter the token displayed on your device:"
 | 
			
		||||
  submit: "Submit"
 | 
			
		||||
@@ -847,13 +881,13 @@ common/views/components/api-settings.vue:
 | 
			
		||||
  token: "Token:"
 | 
			
		||||
  enter-password: "Enter the password"
 | 
			
		||||
  console:
 | 
			
		||||
    title: 'API console'
 | 
			
		||||
    endpoint: 'Endpoint'
 | 
			
		||||
    parameter: 'Parameters'
 | 
			
		||||
    title: "API console"
 | 
			
		||||
    endpoint: "Endpoint"
 | 
			
		||||
    parameter: "Parameters"
 | 
			
		||||
    credential-info: "Parameter \"i\" is not required at this console."
 | 
			
		||||
    send: 'Send'
 | 
			
		||||
    sending: 'Sending'
 | 
			
		||||
    response: 'Result'
 | 
			
		||||
    send: "Send"
 | 
			
		||||
    sending: "Sending"
 | 
			
		||||
    response: "Result"
 | 
			
		||||
desktop/views/components/settings.apps.vue:
 | 
			
		||||
  no-apps: "No linked applications"
 | 
			
		||||
common/views/components/drive-settings.vue:
 | 
			
		||||
@@ -955,6 +989,7 @@ admin/views/index.vue:
 | 
			
		||||
  federation: "Federation"
 | 
			
		||||
  announcements: "Announcements"
 | 
			
		||||
  hashtags: "Hashtags"
 | 
			
		||||
  abuse: "Abuse"
 | 
			
		||||
  back-to-misskey: "Back to Misskey"
 | 
			
		||||
admin/views/dashboard.vue:
 | 
			
		||||
  dashboard: "Dashboard"
 | 
			
		||||
@@ -964,11 +999,18 @@ admin/views/dashboard.vue:
 | 
			
		||||
  instances: "Instances"
 | 
			
		||||
  this-instance: "This instance"
 | 
			
		||||
  federated: "Federated"
 | 
			
		||||
admin/views/abuse.vue:
 | 
			
		||||
  title: "Abuse"
 | 
			
		||||
  target: "Target"
 | 
			
		||||
  reporter: "Reporter"
 | 
			
		||||
  details: "Details"
 | 
			
		||||
  remove-report: "Remove"
 | 
			
		||||
admin/views/instance.vue:
 | 
			
		||||
  instance: "Instance"
 | 
			
		||||
  instance-name: "Instance name"
 | 
			
		||||
  instance-description: "Instance description"
 | 
			
		||||
  host: "Host"
 | 
			
		||||
  logo-url: "Logo image URL"
 | 
			
		||||
  banner-url: "Banner image URL"
 | 
			
		||||
  error-image-url: "Error image URL"
 | 
			
		||||
  languages: "Language of this instance"
 | 
			
		||||
@@ -997,8 +1039,8 @@ admin/views/instance.vue:
 | 
			
		||||
  enable-github-integration: "Enable connection to GitHub"
 | 
			
		||||
  github-integration-client-id: "Client ID"
 | 
			
		||||
  github-integration-client-secret: "Client Secret"
 | 
			
		||||
  discord-integration-config: "Setting of Discord Integration"
 | 
			
		||||
  discord-integration-info: "The callback URL is set on {url}."
 | 
			
		||||
  discord-integration-config: "Discord Integration settings"
 | 
			
		||||
  discord-integration-info: "The callback URL is set to {url}."
 | 
			
		||||
  enable-discord-integration: "Enable Discord connection"
 | 
			
		||||
  discord-integration-client-id: "Client ID"
 | 
			
		||||
  discord-integration-client-secret: "Client Secret"
 | 
			
		||||
@@ -1010,11 +1052,13 @@ admin/views/instance.vue:
 | 
			
		||||
  max-note-text-length: "Maximum numbers of post characters"
 | 
			
		||||
  disable-registration: "Disable new user registration"
 | 
			
		||||
  disable-local-timeline: "Disable the Local Timeline"
 | 
			
		||||
  disable-global-timeline: "Disable global timeline"
 | 
			
		||||
  disabling-timelines-info: "これらのタイムラインを無効にしても、管理者およびモデレーターは引き続き利用できます。"
 | 
			
		||||
  invite: "Invite"
 | 
			
		||||
  save: "Save"
 | 
			
		||||
  saved: "Saved"
 | 
			
		||||
  user-recommendation-config: "Recommended users"
 | 
			
		||||
  enable-external-user-recommendation: "Enable to external user recommendation"
 | 
			
		||||
  enable-external-user-recommendation: "Enable external user recommendations"
 | 
			
		||||
  external-user-recommendation-engine: "Engine"
 | 
			
		||||
  external-user-recommendation-engine-desc: "Example : https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}"
 | 
			
		||||
  external-user-recommendation-timeout: "Timeout"
 | 
			
		||||
@@ -1029,6 +1073,12 @@ admin/views/instance.vue:
 | 
			
		||||
  smtp-port: "SMTP Port"
 | 
			
		||||
  smtp-user: "SMTP User"
 | 
			
		||||
  smtp-pass: "SMTP Password"
 | 
			
		||||
  serviceworker-config: "ServiceWorker"
 | 
			
		||||
  enable-serviceworker: "Enable ServiceWorker"
 | 
			
		||||
  serviceworker-info: "Must be enabled for push notifications."
 | 
			
		||||
  vapid-publickey: "VAPID public key"
 | 
			
		||||
  vapid-privatekey: "VAPID private key"
 | 
			
		||||
  vapid-info: "If you want to enable ServiceWorker, you need to generate VAPID keys. Unless you have set your global node_modules location elsewhere, you need to run this as root:"
 | 
			
		||||
admin/views/charts.vue:
 | 
			
		||||
  title: "Chart"
 | 
			
		||||
  per-day: "per Day"
 | 
			
		||||
@@ -1036,7 +1086,7 @@ admin/views/charts.vue:
 | 
			
		||||
  federation: "Federation"
 | 
			
		||||
  notes: "Posts"
 | 
			
		||||
  users: "Users"
 | 
			
		||||
  drive: "Drive"
 | 
			
		||||
  drive: "Media storage"
 | 
			
		||||
  network: "Network"
 | 
			
		||||
  charts:
 | 
			
		||||
    federation-instances: "The number of instances: increase/decrease"
 | 
			
		||||
@@ -1047,6 +1097,7 @@ admin/views/charts.vue:
 | 
			
		||||
    notes-total: "Total posts"
 | 
			
		||||
    users: "The number of users: increase/decrease"
 | 
			
		||||
    users-total: "Total users"
 | 
			
		||||
    active-users: "Active users"
 | 
			
		||||
    drive: "Capacity used as the storage: increase/decrease"
 | 
			
		||||
    drive-total: "Total usage of Drive"
 | 
			
		||||
    drive-files: "The number of files on the storage: increase/decrease"
 | 
			
		||||
@@ -1054,6 +1105,28 @@ admin/views/charts.vue:
 | 
			
		||||
    network-requests: "Requests"
 | 
			
		||||
    network-time: "Response time"
 | 
			
		||||
    network-usage: "Traffic"
 | 
			
		||||
admin/views/drive.vue:
 | 
			
		||||
  operation: "Operations"
 | 
			
		||||
  fileid-or-url: "File ID or URL"
 | 
			
		||||
  file-not-found: "File not found"
 | 
			
		||||
  lookup: "Look up"
 | 
			
		||||
  sort:
 | 
			
		||||
    title: "Sort"
 | 
			
		||||
    createdAtAsc: "Age - Oldest First"
 | 
			
		||||
    createdAtDesc: "Age - Newest First"
 | 
			
		||||
    sizeAsc: "Size - Smallest First"
 | 
			
		||||
    sizeDesc: "Size - Largest First"
 | 
			
		||||
  origin:
 | 
			
		||||
    title: "Origin"
 | 
			
		||||
    combined: "Local + Remote"
 | 
			
		||||
    local: "Local"
 | 
			
		||||
    remote: "Remote"
 | 
			
		||||
  delete: "Delete"
 | 
			
		||||
  deleted: "Deleted successfully"
 | 
			
		||||
  mark-as-sensitive: "Mark as 'sensitive'"
 | 
			
		||||
  unmark-as-sensitive: "Unmark as 'sensitive'"
 | 
			
		||||
  marked-as-sensitive: "閲覧注意に設定しました"
 | 
			
		||||
  unmarked-as-sensitive: "閲覧注意を解除しました"
 | 
			
		||||
admin/views/users.vue:
 | 
			
		||||
  operation: "Operations"
 | 
			
		||||
  username-or-userid: "Username or user ID"
 | 
			
		||||
@@ -1077,6 +1150,14 @@ admin/views/users.vue:
 | 
			
		||||
      createdAtDesc: "Date Registered (Descending)"
 | 
			
		||||
      updatedAtAsc: "Last Updated (Ascending)"
 | 
			
		||||
      updatedAtDesc: "Last Updated (Descending)"
 | 
			
		||||
    state:
 | 
			
		||||
      title: "Status"
 | 
			
		||||
      all: "All"
 | 
			
		||||
      admin: "Administrator"
 | 
			
		||||
      moderator: "Moderator"
 | 
			
		||||
      adminOrModerator: "Admin/Moderator"
 | 
			
		||||
      verified: "Verified account"
 | 
			
		||||
      suspended: "Suspended"
 | 
			
		||||
    origin:
 | 
			
		||||
      title: "Origin"
 | 
			
		||||
      combined: "Local + Remote"
 | 
			
		||||
@@ -1089,6 +1170,8 @@ admin/views/moderators.vue:
 | 
			
		||||
    title: "Register Moderator"
 | 
			
		||||
    add: "Register"
 | 
			
		||||
    added: "Registered a Moderator."
 | 
			
		||||
    remove: "Discharge"
 | 
			
		||||
    removed: "The moderator has been discharged"
 | 
			
		||||
admin/views/emoji.vue:
 | 
			
		||||
  add-emoji:
 | 
			
		||||
    title: "Add emoji"
 | 
			
		||||
@@ -1170,17 +1253,7 @@ desktop/views/pages/user/user.photos.vue:
 | 
			
		||||
  no-photos: "No photos"
 | 
			
		||||
desktop/views/pages/user/user.profile.vue:
 | 
			
		||||
  follows-you: "Follows you"
 | 
			
		||||
  stalk: "Stalk"
 | 
			
		||||
  stalking: "Stalking"
 | 
			
		||||
  unstalk: "Unstalk"
 | 
			
		||||
  mute: "Mute"
 | 
			
		||||
  muted: "Muting"
 | 
			
		||||
  unmute: "Unmute"
 | 
			
		||||
  block: "Block"
 | 
			
		||||
  unblock: "Unblock"
 | 
			
		||||
  block-confirm: "Are you sure block this user?"
 | 
			
		||||
  push-to-a-list: "Add to list"
 | 
			
		||||
  list-pushed: "Successfully added {user} to {list}."
 | 
			
		||||
  menu: "Menu"
 | 
			
		||||
desktop/views/pages/user/user.header.vue:
 | 
			
		||||
  posts: "Notes"
 | 
			
		||||
  following: "Following"
 | 
			
		||||
@@ -1194,6 +1267,7 @@ desktop/views/pages/user/user.timeline.vue:
 | 
			
		||||
  default: "Posts"
 | 
			
		||||
  with-replies: "Posts and replies"
 | 
			
		||||
  with-media: "Media"
 | 
			
		||||
  my-posts: "My posts"
 | 
			
		||||
  empty: "This user doesn't seem to have posted anything yet."
 | 
			
		||||
desktop/views/widgets/messaging.vue:
 | 
			
		||||
  title: "Message"
 | 
			
		||||
@@ -1392,7 +1466,6 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  notification-position: "Notification style"
 | 
			
		||||
  notification-position-bottom: "Bottom"
 | 
			
		||||
  notification-position-top: "Top"
 | 
			
		||||
  theme: "Theme"
 | 
			
		||||
  behavior: "Behavior"
 | 
			
		||||
  fetch-on-scroll: "Endless loading on scroll"
 | 
			
		||||
  note-visibility: "Post visibility"
 | 
			
		||||
@@ -1416,7 +1489,6 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  signout: "Sign out"
 | 
			
		||||
  sound: "Sounds"
 | 
			
		||||
  enable-sounds: "Enable sounds"
 | 
			
		||||
  mark-as-read-all-unread-notes: "Mark all posts as read"
 | 
			
		||||
  password: "Password"
 | 
			
		||||
mobile/views/pages/user.vue:
 | 
			
		||||
  follows-you: "Follows you"
 | 
			
		||||
@@ -1426,15 +1498,7 @@ mobile/views/pages/user.vue:
 | 
			
		||||
  overview: "Overview"
 | 
			
		||||
  timeline: "Timeline"
 | 
			
		||||
  media: "Media"
 | 
			
		||||
  is-suspended: "This account has been suspended."
 | 
			
		||||
  mute: "Mute"
 | 
			
		||||
  unmute: "Unmute"
 | 
			
		||||
  block: "Block"
 | 
			
		||||
  unblock: "Unblock"
 | 
			
		||||
  years-old: "{age} years old"
 | 
			
		||||
  push-to-list: "Add to list"
 | 
			
		||||
  select-list: "Select a list"
 | 
			
		||||
  list-pushed: "Successfully added {user} to {list}."
 | 
			
		||||
mobile/views/pages/user/home.vue:
 | 
			
		||||
  recent-notes: "Recent notes"
 | 
			
		||||
  images: "Images"
 | 
			
		||||
@@ -1484,9 +1548,8 @@ deck/deck.user-column.vue:
 | 
			
		||||
  activity: "Activity"
 | 
			
		||||
  timeline: "Timeline"
 | 
			
		||||
  pinned-notes: "Pinned posts"
 | 
			
		||||
  push-to-a-list: "Add to list"
 | 
			
		||||
docs:
 | 
			
		||||
  edit-this-page-on-github: "Found a mistake or want to contribute for the documentation?"
 | 
			
		||||
  edit-this-page-on-github: "Found an error, or do you want to contribute to the documentation?"
 | 
			
		||||
  edit-this-page-on-github-link: "Edit this page at GitHub!"
 | 
			
		||||
  api:
 | 
			
		||||
    entities:
 | 
			
		||||
 
 | 
			
		||||
@@ -27,6 +27,7 @@ common:
 | 
			
		||||
  do-not-copy-paste: "Por favor no copies código aquí. Tu cuenta puede resultar comprometida."
 | 
			
		||||
  load-more: "もっと読み込む"
 | 
			
		||||
  enter-password: "パスワードを入力してください"
 | 
			
		||||
  2fa: "二段階認証"
 | 
			
		||||
  got-it: "¡Listo!"
 | 
			
		||||
  customization-tips:
 | 
			
		||||
    title: "Consejos de personalización"
 | 
			
		||||
@@ -90,7 +91,6 @@ common:
 | 
			
		||||
    followers-desc: "自分のフォロワーにのみ公開"
 | 
			
		||||
    specified: "ダイレクト"
 | 
			
		||||
    specified-desc: "指定したユーザーにのみ公開"
 | 
			
		||||
    private: "非公開"
 | 
			
		||||
    local-public: "公開 (ローカルのみ)"
 | 
			
		||||
    local-home: "ホーム (ローカルのみ)"
 | 
			
		||||
    local-followers: "フォロワー (ローカルのみ)"
 | 
			
		||||
@@ -110,8 +110,7 @@ common:
 | 
			
		||||
  my-token-regenerated: "Tu token se ha regenerado vas a ser desconectado."
 | 
			
		||||
  i-like-sushi: "Prefiero sushi a pudín"
 | 
			
		||||
  show-reversi-board-labels: "Mostrar etiquetas de filas y columnas en Reversi"
 | 
			
		||||
  use-white-black-reversi-stones: "リバーシに白黒の石を使う"
 | 
			
		||||
  use-contrast-reversi-stones: "Hacer el color de la piedra claro en Reversi"
 | 
			
		||||
  use-avatar-reversi-stones: "リバーシの石にアバターを使う"
 | 
			
		||||
  verified-user: "Cuenta verificada"
 | 
			
		||||
  disable-animated-mfm: "Desactivar texto animado en una publicación"
 | 
			
		||||
  suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
 | 
			
		||||
@@ -122,14 +121,21 @@ common:
 | 
			
		||||
  reduce-motion: "UIの動きを減らす"
 | 
			
		||||
  this-setting-is-this-device-only: "このデバイスのみ"
 | 
			
		||||
  use-os-default-emojis: "OS標準の絵文字を使用"
 | 
			
		||||
  do-not-use-in-production: 'Esto está en desarrollo, no usarlo para producción.'
 | 
			
		||||
  line-width: "線の太さ"
 | 
			
		||||
  line-width-thin: "細い"
 | 
			
		||||
  line-width-normal: "普通"
 | 
			
		||||
  line-width-thick: "太い"
 | 
			
		||||
  hide-password: "パスワードを隠す"
 | 
			
		||||
  show-password: "パスワードを表示する"
 | 
			
		||||
  do-not-use-in-production: "Esto está en desarrollo, no usarlo para producción."
 | 
			
		||||
  user-suspended: "このユーザーは凍結されています。"
 | 
			
		||||
  is-remote-user: "このユーザー情報はコピーです。"
 | 
			
		||||
  is-remote-post: "この投稿情報はコピーです。"
 | 
			
		||||
  view-on-remote: "正確な情報を見る"
 | 
			
		||||
  renoted-by: "{user}がRenote"
 | 
			
		||||
  error:
 | 
			
		||||
    title: '問題が発生しました'
 | 
			
		||||
    retry: 'やり直す'
 | 
			
		||||
    title: "問題が発生しました"
 | 
			
		||||
    retry: "やり直す"
 | 
			
		||||
  reversi:
 | 
			
		||||
    drawn: "Empatado"
 | 
			
		||||
    my-turn: "Mi turno"
 | 
			
		||||
@@ -165,6 +171,7 @@ common:
 | 
			
		||||
    hashtags: "Etiquetas"
 | 
			
		||||
  dev: "アプリの作成に失敗しました。再度お試しください。"
 | 
			
		||||
  ai-chan-kawaii: "藍ちゃかわいい"
 | 
			
		||||
  you: "あなた"
 | 
			
		||||
auth/views/form.vue:
 | 
			
		||||
  share-access: "<i>{name}</i>があなたのアカウントにアクセスすることを許可しますか?"
 | 
			
		||||
  permission-ask: "La aplicación requiere los siguientes permisos:"
 | 
			
		||||
@@ -260,6 +267,7 @@ common/views/components/media-banner.vue:
 | 
			
		||||
  sensitive: "閲覧注意"
 | 
			
		||||
  click-to-show: "クリックして表示"
 | 
			
		||||
common/views/components/theme.vue:
 | 
			
		||||
  theme: "テーマ"
 | 
			
		||||
  light-theme: "非ダークモード時に使用するテーマ"
 | 
			
		||||
  dark-theme: "ダークモード時に使用するテーマ"
 | 
			
		||||
  light-themes: "明るいテーマ"
 | 
			
		||||
@@ -276,6 +284,7 @@ common/views/components/theme.vue:
 | 
			
		||||
  base-theme: "ベーステーマ"
 | 
			
		||||
  base-theme-light: "Light"
 | 
			
		||||
  base-theme-dark: "Dark"
 | 
			
		||||
  find-more-theme: "その他のテーマを入手"
 | 
			
		||||
  theme-name: "テーマ名"
 | 
			
		||||
  preview-created-theme: "プレビュー"
 | 
			
		||||
  invalid-theme: "テーマが正しくありません。"
 | 
			
		||||
@@ -299,6 +308,7 @@ common/views/components/cw-button.vue:
 | 
			
		||||
  show: "もっと見る"
 | 
			
		||||
  chars: "{count}文字"
 | 
			
		||||
  files: "{count}ファイル"
 | 
			
		||||
  poll: "アンケート"
 | 
			
		||||
common/views/components/messaging.vue:
 | 
			
		||||
  search-user: "Encuentra un usuario"
 | 
			
		||||
  you: "Tu"
 | 
			
		||||
@@ -328,7 +338,9 @@ common/views/components/nav.vue:
 | 
			
		||||
  develop: "Desarrolladores"
 | 
			
		||||
  feedback: "Opiniones"
 | 
			
		||||
common/views/components/note-menu.vue:
 | 
			
		||||
  mention: "メンション"
 | 
			
		||||
  detail: "Detalles"
 | 
			
		||||
  copy-content: "内容をコピー"
 | 
			
		||||
  copy-link: "Copiar enlace"
 | 
			
		||||
  favorite: "Me gusta esta nota"
 | 
			
		||||
  unfavorite: "お気に入り解除"
 | 
			
		||||
@@ -337,6 +349,17 @@ common/views/components/note-menu.vue:
 | 
			
		||||
  delete: "Borrar"
 | 
			
		||||
  delete-confirm: "¿Seguro que quieres borrar la publicación?"
 | 
			
		||||
  remote: "Ver el original"
 | 
			
		||||
common/views/components/user-menu.vue:
 | 
			
		||||
  mention: "メンション"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  push-to-list: "リストに追加"
 | 
			
		||||
  select-list: "リストを選択してください"
 | 
			
		||||
  report-abuse: "スパムを報告"
 | 
			
		||||
  report-abuse-detail: "どのような迷惑行為を行っていますか?"
 | 
			
		||||
  report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
 | 
			
		||||
common/views/components/poll.vue:
 | 
			
		||||
  vote-to: "'{}' para votar"
 | 
			
		||||
  vote-count: "{} votos"
 | 
			
		||||
@@ -403,6 +426,13 @@ common/views/components/stream-indicator.vue:
 | 
			
		||||
  connecting: "Conectando"
 | 
			
		||||
  reconnecting: "Reconectando"
 | 
			
		||||
  connected: "Conectado"
 | 
			
		||||
common/views/components/notification-settings.vue:
 | 
			
		||||
  title: "通知"
 | 
			
		||||
  mark-as-read-all-notifications: "すべての通知を既読にする"
 | 
			
		||||
  mark-as-read-all-unread-notes: "すべての投稿を既読にする"
 | 
			
		||||
  mark-as-read-all-talk-messages: "すべてのトークを既読にする"
 | 
			
		||||
  auto-watch: "投稿の自動ウォッチ"
 | 
			
		||||
  auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。"
 | 
			
		||||
common/views/components/integration-settings.vue:
 | 
			
		||||
  title: "サービス連携"
 | 
			
		||||
  connect: "接続する"
 | 
			
		||||
@@ -432,7 +462,6 @@ common/views/components/visibility-chooser.vue:
 | 
			
		||||
  followers-desc: "Piblica solo para tus seguidores"
 | 
			
		||||
  specified: "Directo"
 | 
			
		||||
  specified-desc: "Publica solo para los seguidores que quieras"
 | 
			
		||||
  private: "Privada"
 | 
			
		||||
  local-public: "公開 (ローカルのみ)"
 | 
			
		||||
  local-public-desc: "リモートへは公開しない"
 | 
			
		||||
  local-home: "ホーム (ローカルのみ)"
 | 
			
		||||
@@ -461,6 +490,7 @@ common/views/components/profile-editor.vue:
 | 
			
		||||
  is-bot: "このアカウントはBotです"
 | 
			
		||||
  is-locked: "フォローを承認制にする"
 | 
			
		||||
  careful-bot: "Botからのフォローだけ承認制にする"
 | 
			
		||||
  auto-accept-followed: "フォローしているユーザーからのフォローを自動承認する"
 | 
			
		||||
  advanced: "その他"
 | 
			
		||||
  privacy: "プライバシー"
 | 
			
		||||
  save: "保存"
 | 
			
		||||
@@ -471,6 +501,13 @@ common/views/components/profile-editor.vue:
 | 
			
		||||
  email-address: "メールアドレス"
 | 
			
		||||
  email-verified: "メールアドレスが確認されました"
 | 
			
		||||
  email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
 | 
			
		||||
common/views/components/user-list-editor.vue:
 | 
			
		||||
  users: "ユーザー"
 | 
			
		||||
  rename: "リスト名を変更"
 | 
			
		||||
  delete: "リストを削除"
 | 
			
		||||
  remove-user: "このリストから削除"
 | 
			
		||||
  delete-are-you-sure: "リスト「$1」を削除しますか?"
 | 
			
		||||
  deleted: "削除しました"
 | 
			
		||||
common/views/widgets/broadcast.vue:
 | 
			
		||||
  fetching: "Recuperando"
 | 
			
		||||
  no-broadcasts: "Sin emisión"
 | 
			
		||||
@@ -520,10 +557,10 @@ common/views/widgets/tips.vue:
 | 
			
		||||
  tips-line19: "Algunas ventanas pueden ser separadas fuera del navegador"
 | 
			
		||||
  tips-line20: "El porcentaje mostrando en el accesorio de calendario indica el porcentaje de tiempo transcurrido."
 | 
			
		||||
  tips-line21: "También puedes usar la API para desarrollar tus propios bots."
 | 
			
		||||
  tips-line23: "Mayu is tan bonito con sus cejas."
 | 
			
		||||
  tips-line23: "藍かわいいよ藍"
 | 
			
		||||
  tips-line24: "Misskey inició en 2014."
 | 
			
		||||
  tips-line25: "Puedes recibir notificaciones incluso si Misskey no está abierto en un navegador compatible."
 | 
			
		||||
common/views/pages/404.vue:
 | 
			
		||||
common/views/pages/not-found.vue:
 | 
			
		||||
  page-not-found: "ページが見つかりませんでした"
 | 
			
		||||
common/views/pages/follow.vue:
 | 
			
		||||
  signed-in-as: "Autenticado como {}"
 | 
			
		||||
@@ -660,10 +697,12 @@ desktop/views/components/note-detail.vue:
 | 
			
		||||
  location: "Localización"
 | 
			
		||||
  renote: "Republicar"
 | 
			
		||||
  add-reaction: "Agregar una reacción"
 | 
			
		||||
  undo-reaction: "リアクション解除"
 | 
			
		||||
desktop/views/components/note.vue:
 | 
			
		||||
  reply: "返信"
 | 
			
		||||
  renote: "Renote"
 | 
			
		||||
  add-reaction: "リアクション"
 | 
			
		||||
  undo-reaction: "リアクション解除"
 | 
			
		||||
  detail: "詳細"
 | 
			
		||||
  private: "この投稿は非公開です"
 | 
			
		||||
  deleted: "この投稿は削除されました"
 | 
			
		||||
@@ -734,7 +773,6 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  security: "Seguridad"
 | 
			
		||||
  signin: "Historial de inicios de sesión"
 | 
			
		||||
  password: "Contraseña"
 | 
			
		||||
  2fa: "Autenticación de Doble-Factor"
 | 
			
		||||
  other: "Otros"
 | 
			
		||||
  license: "Licencia"
 | 
			
		||||
  theme: "テーマ"
 | 
			
		||||
@@ -748,9 +786,6 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
 | 
			
		||||
  auto-popout: "Ventana emergente automática"
 | 
			
		||||
  auto-popout-desc: "Muestra una ventana emergente si es posible. Esta configuración depende del navegador."
 | 
			
		||||
  advanced: "Configuración avanzada"
 | 
			
		||||
  api-via-stream: "Solicitar API por medio de un stream"
 | 
			
		||||
  api-via-stream-desc: "Las peticiones de las API se realizan por conexiones WebSocket en lugar de las tradicionales (para una mejora en el rendimiento). Esta función depende del navegador."
 | 
			
		||||
  deck-nav: "デッキ内ナビゲーション"
 | 
			
		||||
  deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
 | 
			
		||||
  deck-default: "デッキをデフォルトのUIにする"
 | 
			
		||||
@@ -793,8 +828,6 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  cache-warn: "クリーンアップを行うと、ブラウザに記憶されたアカウント情報のキャッシュ、書きかけの投稿・返信・メッセージ、およびその他のデータ(設定情報含む)が削除されます。クリーンアップを行った後はページを再度読み込みする必要があります。"
 | 
			
		||||
  cache-cleared: "キャッシュを削除しました"
 | 
			
		||||
  cache-cleared-desc: "ページを再度読み込みしてください。"
 | 
			
		||||
  auto-watch: "投稿の自動ウォッチ"
 | 
			
		||||
  auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。"
 | 
			
		||||
  about: "Misskeyについて"
 | 
			
		||||
  operator: "このサーバーの運営者"
 | 
			
		||||
  update: "Misskey Update"
 | 
			
		||||
@@ -833,6 +866,7 @@ desktop/views/components/settings.2fa.vue:
 | 
			
		||||
  enter-password: "Escribe una contraseña"
 | 
			
		||||
  authenticator: "Primero, necesitas instalar Google Authenticator en tu dispositivo:"
 | 
			
		||||
  howtoinstall: "Cómo instalar"
 | 
			
		||||
  token: "トークン"
 | 
			
		||||
  scan: "Luego, escanea el código QR:"
 | 
			
		||||
  done: "Por favor ingresa el token mostrado en tu dispositivo:"
 | 
			
		||||
  submit: "Enviar"
 | 
			
		||||
@@ -847,13 +881,13 @@ common/views/components/api-settings.vue:
 | 
			
		||||
  token: "Token:"
 | 
			
		||||
  enter-password: "パスワードを入力してください"
 | 
			
		||||
  console:
 | 
			
		||||
    title: 'APIコンソール'
 | 
			
		||||
    endpoint: 'エンドポイント'
 | 
			
		||||
    parameter: 'パラメータ'
 | 
			
		||||
    title: "APIコンソール"
 | 
			
		||||
    endpoint: "エンドポイント"
 | 
			
		||||
    parameter: "パラメータ"
 | 
			
		||||
    credential-info: "「i」パラメータは自動で付与されます。"
 | 
			
		||||
    send: '送信'
 | 
			
		||||
    sending: '応答待ち'
 | 
			
		||||
    response: '結果'
 | 
			
		||||
    send: "送信"
 | 
			
		||||
    sending: "応答待ち"
 | 
			
		||||
    response: "結果"
 | 
			
		||||
desktop/views/components/settings.apps.vue:
 | 
			
		||||
  no-apps: "No hay aplicaciones asociadas"
 | 
			
		||||
common/views/components/drive-settings.vue:
 | 
			
		||||
@@ -955,6 +989,7 @@ admin/views/index.vue:
 | 
			
		||||
  federation: "連合"
 | 
			
		||||
  announcements: "お知らせ"
 | 
			
		||||
  hashtags: "ハッシュタグ"
 | 
			
		||||
  abuse: "スパム報告"
 | 
			
		||||
  back-to-misskey: "Misskeyに戻る"
 | 
			
		||||
admin/views/dashboard.vue:
 | 
			
		||||
  dashboard: "ダッシュボード"
 | 
			
		||||
@@ -964,6 +999,12 @@ admin/views/dashboard.vue:
 | 
			
		||||
  instances: "インスタンス"
 | 
			
		||||
  this-instance: "このインスタンス"
 | 
			
		||||
  federated: "連合"
 | 
			
		||||
admin/views/abuse.vue:
 | 
			
		||||
  title: "スパム報告"
 | 
			
		||||
  target: "対象"
 | 
			
		||||
  reporter: "報告者"
 | 
			
		||||
  details: "詳細"
 | 
			
		||||
  remove-report: "削除"
 | 
			
		||||
admin/views/instance.vue:
 | 
			
		||||
  instance: "インスタンス"
 | 
			
		||||
  instance-name: "インスタンス名"
 | 
			
		||||
@@ -1010,6 +1051,8 @@ admin/views/instance.vue:
 | 
			
		||||
  max-note-text-length: "投稿の最大文字数"
 | 
			
		||||
  disable-registration: "ユーザー登録の受付を停止する"
 | 
			
		||||
  disable-local-timeline: "ローカルタイムラインを無効にする"
 | 
			
		||||
  disable-global-timeline: "グローバルタイムラインを無効にする"
 | 
			
		||||
  disabling-timelines-info: "これらのタイムラインを無効にしても、管理者およびモデレーターは引き続き利用できます。"
 | 
			
		||||
  invite: "招待"
 | 
			
		||||
  save: "保存"
 | 
			
		||||
  saved: "保存しました"
 | 
			
		||||
@@ -1029,6 +1072,12 @@ admin/views/instance.vue:
 | 
			
		||||
  smtp-port: "SMTPポート"
 | 
			
		||||
  smtp-user: "SMTPユーザー"
 | 
			
		||||
  smtp-pass: "SMTPパスワード"
 | 
			
		||||
  serviceworker-config: "ServiceWorker"
 | 
			
		||||
  enable-serviceworker: "ServiceWorkerを有効にする"
 | 
			
		||||
  serviceworker-info: "プッシュ通知を行うには有効する必要があります。"
 | 
			
		||||
  vapid-publickey: "VAPID公開鍵"
 | 
			
		||||
  vapid-privatekey: "VAPID秘密鍵"
 | 
			
		||||
  vapid-info: "ServiceWorkerを有効にする場合、VAPIDキーペアを生成する必要があります。シェルで次のようにします:"
 | 
			
		||||
admin/views/charts.vue:
 | 
			
		||||
  title: "チャート"
 | 
			
		||||
  per-day: "1日ごと"
 | 
			
		||||
@@ -1047,6 +1096,7 @@ admin/views/charts.vue:
 | 
			
		||||
    notes-total: "投稿の積算"
 | 
			
		||||
    users: "ユーザーの増減"
 | 
			
		||||
    users-total: "ユーザーの積算"
 | 
			
		||||
    active-users: "アクティブユーザー数"
 | 
			
		||||
    drive: "ドライブ使用量の増減"
 | 
			
		||||
    drive-total: "ドライブ使用量の積算"
 | 
			
		||||
    drive-files: "ドライブのファイル数の増減"
 | 
			
		||||
@@ -1054,6 +1104,28 @@ admin/views/charts.vue:
 | 
			
		||||
    network-requests: "リクエスト"
 | 
			
		||||
    network-time: "応答時間"
 | 
			
		||||
    network-usage: "通信量"
 | 
			
		||||
admin/views/drive.vue:
 | 
			
		||||
  operation: "操作"
 | 
			
		||||
  fileid-or-url: "ファイルIDまたはファイルURL"
 | 
			
		||||
  file-not-found: "ファイルが見つかりません"
 | 
			
		||||
  lookup: "照会"
 | 
			
		||||
  sort:
 | 
			
		||||
    title: "ソート"
 | 
			
		||||
    createdAtAsc: "アップロード日時が古い順"
 | 
			
		||||
    createdAtDesc: "アップロード日時が新しい順"
 | 
			
		||||
    sizeAsc: "サイズが小さい順"
 | 
			
		||||
    sizeDesc: "サイズが大きい順"
 | 
			
		||||
  origin:
 | 
			
		||||
    title: "オリジン"
 | 
			
		||||
    combined: "ローカル+リモート"
 | 
			
		||||
    local: "ローカル"
 | 
			
		||||
    remote: "リモート"
 | 
			
		||||
  delete: "削除"
 | 
			
		||||
  deleted: "削除しました"
 | 
			
		||||
  mark-as-sensitive: "閲覧注意に設定"
 | 
			
		||||
  unmark-as-sensitive: "閲覧注意を解除"
 | 
			
		||||
  marked-as-sensitive: "閲覧注意に設定しました"
 | 
			
		||||
  unmarked-as-sensitive: "閲覧注意を解除しました"
 | 
			
		||||
admin/views/users.vue:
 | 
			
		||||
  operation: "操作"
 | 
			
		||||
  username-or-userid: "ユーザー名またはユーザーID"
 | 
			
		||||
@@ -1077,6 +1149,14 @@ admin/views/users.vue:
 | 
			
		||||
      createdAtDesc: "登録日時が新しい順"
 | 
			
		||||
      updatedAtAsc: "更新日時が古い順"
 | 
			
		||||
      updatedAtDesc: "更新日時が新しい順"
 | 
			
		||||
    state:
 | 
			
		||||
      title: "状態"
 | 
			
		||||
      all: "すべて"
 | 
			
		||||
      admin: "管理者"
 | 
			
		||||
      moderator: "モデレーター"
 | 
			
		||||
      adminOrModerator: "管理者+モデレーター"
 | 
			
		||||
      verified: "公式アカウント"
 | 
			
		||||
      suspended: "凍結済み"
 | 
			
		||||
    origin:
 | 
			
		||||
      title: "オリジン"
 | 
			
		||||
      combined: "ローカル+リモート"
 | 
			
		||||
@@ -1089,6 +1169,8 @@ admin/views/moderators.vue:
 | 
			
		||||
    title: "モデレーターの登録"
 | 
			
		||||
    add: "登録"
 | 
			
		||||
    added: "モデレーターを登録しました"
 | 
			
		||||
    remove: "解除"
 | 
			
		||||
    removed: "モデレーター登録を解除しました"
 | 
			
		||||
admin/views/emoji.vue:
 | 
			
		||||
  add-emoji:
 | 
			
		||||
    title: "絵文字の登録"
 | 
			
		||||
@@ -1170,17 +1252,7 @@ desktop/views/pages/user/user.photos.vue:
 | 
			
		||||
  no-photos: "写真はありません"
 | 
			
		||||
desktop/views/pages/user/user.profile.vue:
 | 
			
		||||
  follows-you: "フォローされています"
 | 
			
		||||
  stalk: "ストークする"
 | 
			
		||||
  stalking: "ストーキングしています"
 | 
			
		||||
  unstalk: "ストーク解除"
 | 
			
		||||
  mute: "ミュートする"
 | 
			
		||||
  muted: "ミュートしています"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロックする"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  block-confirm: "このユーザーをブロックしますか?"
 | 
			
		||||
  push-to-a-list: "リストに追加"
 | 
			
		||||
  list-pushed: "{user}を{list}に追加しました。"
 | 
			
		||||
  menu: "メニュー"
 | 
			
		||||
desktop/views/pages/user/user.header.vue:
 | 
			
		||||
  posts: "投稿"
 | 
			
		||||
  following: "フォロー"
 | 
			
		||||
@@ -1194,6 +1266,7 @@ desktop/views/pages/user/user.timeline.vue:
 | 
			
		||||
  default: "投稿"
 | 
			
		||||
  with-replies: "投稿と返信"
 | 
			
		||||
  with-media: "メディア"
 | 
			
		||||
  my-posts: "私の投稿"
 | 
			
		||||
  empty: "このユーザーはまだ何も投稿していないようです。"
 | 
			
		||||
desktop/views/widgets/messaging.vue:
 | 
			
		||||
  title: "メッセージ"
 | 
			
		||||
@@ -1392,7 +1465,6 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  notification-position: "通知の表示"
 | 
			
		||||
  notification-position-bottom: "下"
 | 
			
		||||
  notification-position-top: "上"
 | 
			
		||||
  theme: "テーマ"
 | 
			
		||||
  behavior: "動作"
 | 
			
		||||
  fetch-on-scroll: "スクロールで自動読み込み"
 | 
			
		||||
  note-visibility: "投稿の公開範囲"
 | 
			
		||||
@@ -1416,7 +1488,6 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  signout: "サインアウト"
 | 
			
		||||
  sound: "サウンド"
 | 
			
		||||
  enable-sounds: "サウンドを有効にする"
 | 
			
		||||
  mark-as-read-all-unread-notes: "すべての投稿を既読にする"
 | 
			
		||||
  password: "パスワード"
 | 
			
		||||
mobile/views/pages/user.vue:
 | 
			
		||||
  follows-you: "フォローされています"
 | 
			
		||||
@@ -1426,15 +1497,7 @@ mobile/views/pages/user.vue:
 | 
			
		||||
  overview: "概要"
 | 
			
		||||
  timeline: "タイムライン"
 | 
			
		||||
  media: "メディア"
 | 
			
		||||
  is-suspended: "このユーザーは凍結されています。"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  years-old: "{age}歳"
 | 
			
		||||
  push-to-list: "リストに追加"
 | 
			
		||||
  select-list: "リストを選択してください"
 | 
			
		||||
  list-pushed: "{user}を{list}に追加しました"
 | 
			
		||||
mobile/views/pages/user/home.vue:
 | 
			
		||||
  recent-notes: "最近の投稿"
 | 
			
		||||
  images: "画像"
 | 
			
		||||
@@ -1484,7 +1547,6 @@ deck/deck.user-column.vue:
 | 
			
		||||
  activity: "アクティビティ"
 | 
			
		||||
  timeline: "タイムライン"
 | 
			
		||||
  pinned-notes: "ピン留めされた投稿"
 | 
			
		||||
  push-to-a-list: "リストに追加"
 | 
			
		||||
docs:
 | 
			
		||||
  edit-this-page-on-github: "間違いや改善点を見つけましたか?"
 | 
			
		||||
  edit-this-page-on-github-link: "このページをGitHubで編集"
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -27,6 +27,7 @@ common:
 | 
			
		||||
  do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
 | 
			
		||||
  load-more: "もっと読み込む"
 | 
			
		||||
  enter-password: "パスワードを入力してください"
 | 
			
		||||
  2fa: "二段階認証"
 | 
			
		||||
  got-it: "わかった"
 | 
			
		||||
  customization-tips:
 | 
			
		||||
    title: "カスタマイズのヒント"
 | 
			
		||||
@@ -90,7 +91,6 @@ common:
 | 
			
		||||
    followers-desc: "自分のフォロワーにのみ公開"
 | 
			
		||||
    specified: "ダイレクト"
 | 
			
		||||
    specified-desc: "指定したユーザーにのみ公開"
 | 
			
		||||
    private: "非公開"
 | 
			
		||||
    local-public: "公開 (ローカルのみ)"
 | 
			
		||||
    local-home: "ホーム (ローカルのみ)"
 | 
			
		||||
    local-followers: "フォロワー (ローカルのみ)"
 | 
			
		||||
@@ -110,8 +110,7 @@ common:
 | 
			
		||||
  my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
 | 
			
		||||
  i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
 | 
			
		||||
  show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
 | 
			
		||||
  use-white-black-reversi-stones: "リバーシに白黒の石を使う"
 | 
			
		||||
  use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
 | 
			
		||||
  use-avatar-reversi-stones: "リバーシの石にアバターを使う"
 | 
			
		||||
  verified-user: "公式アカウント"
 | 
			
		||||
  disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
 | 
			
		||||
  suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
 | 
			
		||||
@@ -122,14 +121,21 @@ common:
 | 
			
		||||
  reduce-motion: "UIの動きを減らす"
 | 
			
		||||
  this-setting-is-this-device-only: "このデバイスのみ"
 | 
			
		||||
  use-os-default-emojis: "OS標準の絵文字を使用"
 | 
			
		||||
  do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
 | 
			
		||||
  line-width: "線の太さ"
 | 
			
		||||
  line-width-thin: "細い"
 | 
			
		||||
  line-width-normal: "普通"
 | 
			
		||||
  line-width-thick: "太い"
 | 
			
		||||
  hide-password: "パスワードを隠す"
 | 
			
		||||
  show-password: "パスワードを表示する"
 | 
			
		||||
  do-not-use-in-production: "これは開発ビルドです。本番環境で使用しないでください。"
 | 
			
		||||
  user-suspended: "このユーザーは凍結されています。"
 | 
			
		||||
  is-remote-user: "このユーザー情報はコピーです。"
 | 
			
		||||
  is-remote-post: "この投稿情報はコピーです。"
 | 
			
		||||
  view-on-remote: "正確な情報を見る"
 | 
			
		||||
  renoted-by: "{user}がRenote"
 | 
			
		||||
  error:
 | 
			
		||||
    title: '問題が発生しました'
 | 
			
		||||
    retry: 'やり直す'
 | 
			
		||||
    title: "問題が発生しました"
 | 
			
		||||
    retry: "やり直す"
 | 
			
		||||
  reversi:
 | 
			
		||||
    drawn: "引き分け"
 | 
			
		||||
    my-turn: "あなたのターンです"
 | 
			
		||||
@@ -165,6 +171,7 @@ common:
 | 
			
		||||
    hashtags: "ハッシュタグ"
 | 
			
		||||
  dev: "アプリの作成に失敗しました。再度お試しください。"
 | 
			
		||||
  ai-chan-kawaii: "藍ちゃかわいい"
 | 
			
		||||
  you: "あなた"
 | 
			
		||||
auth/views/form.vue:
 | 
			
		||||
  share-access: "<i>{name}</i>があなたのアカウントにアクセスすることを許可しますか?"
 | 
			
		||||
  permission-ask: "このアプリは次の権限を要求しています:"
 | 
			
		||||
@@ -260,6 +267,7 @@ common/views/components/media-banner.vue:
 | 
			
		||||
  sensitive: "閲覧注意"
 | 
			
		||||
  click-to-show: "クリックして表示"
 | 
			
		||||
common/views/components/theme.vue:
 | 
			
		||||
  theme: "テーマ"
 | 
			
		||||
  light-theme: "非ダークモード時に使用するテーマ"
 | 
			
		||||
  dark-theme: "ダークモード時に使用するテーマ"
 | 
			
		||||
  light-themes: "明るいテーマ"
 | 
			
		||||
@@ -276,6 +284,7 @@ common/views/components/theme.vue:
 | 
			
		||||
  base-theme: "ベーステーマ"
 | 
			
		||||
  base-theme-light: "Light"
 | 
			
		||||
  base-theme-dark: "Dark"
 | 
			
		||||
  find-more-theme: "その他のテーマを入手"
 | 
			
		||||
  theme-name: "テーマ名"
 | 
			
		||||
  preview-created-theme: "プレビュー"
 | 
			
		||||
  invalid-theme: "テーマが正しくありません。"
 | 
			
		||||
@@ -299,6 +308,7 @@ common/views/components/cw-button.vue:
 | 
			
		||||
  show: "もっと見る"
 | 
			
		||||
  chars: "{count}文字"
 | 
			
		||||
  files: "{count}ファイル"
 | 
			
		||||
  poll: "アンケート"
 | 
			
		||||
common/views/components/messaging.vue:
 | 
			
		||||
  search-user: "ユーザーを探す"
 | 
			
		||||
  you: "あなた"
 | 
			
		||||
@@ -328,7 +338,9 @@ common/views/components/nav.vue:
 | 
			
		||||
  develop: "開発者"
 | 
			
		||||
  feedback: "フィードバック"
 | 
			
		||||
common/views/components/note-menu.vue:
 | 
			
		||||
  mention: "メンション"
 | 
			
		||||
  detail: "詳細"
 | 
			
		||||
  copy-content: "内容をコピー"
 | 
			
		||||
  copy-link: "リンクをコピー"
 | 
			
		||||
  favorite: "お気に入り"
 | 
			
		||||
  unfavorite: "お気に入り解除"
 | 
			
		||||
@@ -337,6 +349,17 @@ common/views/components/note-menu.vue:
 | 
			
		||||
  delete: "削除"
 | 
			
		||||
  delete-confirm: "この投稿を削除しますか?"
 | 
			
		||||
  remote: "投稿元で見る"
 | 
			
		||||
common/views/components/user-menu.vue:
 | 
			
		||||
  mention: "メンション"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  push-to-list: "リストに追加"
 | 
			
		||||
  select-list: "リストを選択してください"
 | 
			
		||||
  report-abuse: "スパムを報告"
 | 
			
		||||
  report-abuse-detail: "どのような迷惑行為を行っていますか?"
 | 
			
		||||
  report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
 | 
			
		||||
common/views/components/poll.vue:
 | 
			
		||||
  vote-to: "「{}」に投票する"
 | 
			
		||||
  vote-count: "{}票"
 | 
			
		||||
@@ -403,6 +426,13 @@ common/views/components/stream-indicator.vue:
 | 
			
		||||
  connecting: "接続中"
 | 
			
		||||
  reconnecting: "再接続中"
 | 
			
		||||
  connected: "接続完了"
 | 
			
		||||
common/views/components/notification-settings.vue:
 | 
			
		||||
  title: "通知"
 | 
			
		||||
  mark-as-read-all-notifications: "すべての通知を既読にする"
 | 
			
		||||
  mark-as-read-all-unread-notes: "すべての投稿を既読にする"
 | 
			
		||||
  mark-as-read-all-talk-messages: "すべてのトークを既読にする"
 | 
			
		||||
  auto-watch: "投稿の自動ウォッチ"
 | 
			
		||||
  auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。"
 | 
			
		||||
common/views/components/integration-settings.vue:
 | 
			
		||||
  title: "サービス連携"
 | 
			
		||||
  connect: "接続する"
 | 
			
		||||
@@ -432,7 +462,6 @@ common/views/components/visibility-chooser.vue:
 | 
			
		||||
  followers-desc: "自分のフォロワーにのみ公開"
 | 
			
		||||
  specified: "ダイレクト"
 | 
			
		||||
  specified-desc: "指定したユーザーにのみ公開"
 | 
			
		||||
  private: "非公開"
 | 
			
		||||
  local-public: "公開 (ローカルのみ)"
 | 
			
		||||
  local-public-desc: "リモートへは公開しない"
 | 
			
		||||
  local-home: "ホーム (ローカルのみ)"
 | 
			
		||||
@@ -461,6 +490,7 @@ common/views/components/profile-editor.vue:
 | 
			
		||||
  is-bot: "このアカウントはBotです"
 | 
			
		||||
  is-locked: "フォローを承認制にする"
 | 
			
		||||
  careful-bot: "Botからのフォローだけ承認制にする"
 | 
			
		||||
  auto-accept-followed: "フォローしているユーザーからのフォローを自動承認する"
 | 
			
		||||
  advanced: "その他"
 | 
			
		||||
  privacy: "プライバシー"
 | 
			
		||||
  save: "保存"
 | 
			
		||||
@@ -471,6 +501,13 @@ common/views/components/profile-editor.vue:
 | 
			
		||||
  email-address: "メールアドレス"
 | 
			
		||||
  email-verified: "メールアドレスが確認されました"
 | 
			
		||||
  email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
 | 
			
		||||
common/views/components/user-list-editor.vue:
 | 
			
		||||
  users: "ユーザー"
 | 
			
		||||
  rename: "リスト名を変更"
 | 
			
		||||
  delete: "リストを削除"
 | 
			
		||||
  remove-user: "このリストから削除"
 | 
			
		||||
  delete-are-you-sure: "リスト「$1」を削除しますか?"
 | 
			
		||||
  deleted: "削除しました"
 | 
			
		||||
common/views/widgets/broadcast.vue:
 | 
			
		||||
  fetching: "確認中"
 | 
			
		||||
  no-broadcasts: "お知らせはありません"
 | 
			
		||||
@@ -520,10 +557,10 @@ common/views/widgets/tips.vue:
 | 
			
		||||
  tips-line19: "いくつかのウィンドウはブラウザの外に切り離すことができます"
 | 
			
		||||
  tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示しています"
 | 
			
		||||
  tips-line21: "APIを利用してbotの開発なども行えます"
 | 
			
		||||
  tips-line23: "まゆかわいいよまゆ"
 | 
			
		||||
  tips-line23: "藍かわいいよ藍"
 | 
			
		||||
  tips-line24: "Misskeyは2014年にサービスを開始しました"
 | 
			
		||||
  tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
 | 
			
		||||
common/views/pages/404.vue:
 | 
			
		||||
common/views/pages/not-found.vue:
 | 
			
		||||
  page-not-found: "ページが見つかりませんでした"
 | 
			
		||||
common/views/pages/follow.vue:
 | 
			
		||||
  signed-in-as: "{}としてサインイン中"
 | 
			
		||||
@@ -660,10 +697,12 @@ desktop/views/components/note-detail.vue:
 | 
			
		||||
  location: "位置情報"
 | 
			
		||||
  renote: "Renote"
 | 
			
		||||
  add-reaction: "リアクション"
 | 
			
		||||
  undo-reaction: "リアクション解除"
 | 
			
		||||
desktop/views/components/note.vue:
 | 
			
		||||
  reply: "返信"
 | 
			
		||||
  renote: "Renote"
 | 
			
		||||
  add-reaction: "リアクション"
 | 
			
		||||
  undo-reaction: "リアクション解除"
 | 
			
		||||
  detail: "詳細"
 | 
			
		||||
  private: "この投稿は非公開です"
 | 
			
		||||
  deleted: "この投稿は削除されました"
 | 
			
		||||
@@ -734,7 +773,6 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  security: "セキュリティ"
 | 
			
		||||
  signin: "サインイン履歴"
 | 
			
		||||
  password: "パスワード"
 | 
			
		||||
  2fa: "二段階認証"
 | 
			
		||||
  other: "その他"
 | 
			
		||||
  license: "ライセンス"
 | 
			
		||||
  theme: "テーマ"
 | 
			
		||||
@@ -748,9 +786,6 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
 | 
			
		||||
  auto-popout: "ウィンドウの自動ポップアウト"
 | 
			
		||||
  auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
 | 
			
		||||
  advanced: "詳細設定"
 | 
			
		||||
  api-via-stream: "ストリームを経由したAPIリクエスト"
 | 
			
		||||
  api-via-stream-desc: "この設定をオンにすると、websocket接続を経由してAPIリクエストが行われます(パフォーマンス向上が期待できます)。オフにすると、ネイティブの fetch APIが利用されます。この設定はこのデバイスのみ有効です。"
 | 
			
		||||
  deck-nav: "デッキ内ナビゲーション"
 | 
			
		||||
  deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
 | 
			
		||||
  deck-default: "デッキをデフォルトのUIにする"
 | 
			
		||||
@@ -793,8 +828,6 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  cache-warn: "クリーンアップを行うと、ブラウザに記憶されたアカウント情報のキャッシュ、書きかけの投稿・返信・メッセージ、およびその他のデータ(設定情報含む)が削除されます。クリーンアップを行った後はページを再度読み込みする必要があります。"
 | 
			
		||||
  cache-cleared: "キャッシュを削除しました"
 | 
			
		||||
  cache-cleared-desc: "ページを再度読み込みしてください。"
 | 
			
		||||
  auto-watch: "投稿の自動ウォッチ"
 | 
			
		||||
  auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。"
 | 
			
		||||
  about: "Misskeyについて"
 | 
			
		||||
  operator: "このサーバーの運営者"
 | 
			
		||||
  update: "Misskey Update"
 | 
			
		||||
@@ -833,6 +866,7 @@ desktop/views/components/settings.2fa.vue:
 | 
			
		||||
  enter-password: "パスワードを入力してください"
 | 
			
		||||
  authenticator: "まず、Google Authenticatorをお使いのデバイスにインストールします:"
 | 
			
		||||
  howtoinstall: "インストール方法はこちら"
 | 
			
		||||
  token: "トークン"
 | 
			
		||||
  scan: "次に、表示されているQRコードをスキャンします:"
 | 
			
		||||
  done: "お使いのデバイスに表示されているトークンを入力して完了します:"
 | 
			
		||||
  submit: "完了"
 | 
			
		||||
@@ -847,13 +881,13 @@ common/views/components/api-settings.vue:
 | 
			
		||||
  token: "Token:"
 | 
			
		||||
  enter-password: "パスワードを入力してください"
 | 
			
		||||
  console:
 | 
			
		||||
    title: 'APIコンソール'
 | 
			
		||||
    endpoint: 'エンドポイント'
 | 
			
		||||
    parameter: 'パラメータ'
 | 
			
		||||
    title: "APIコンソール"
 | 
			
		||||
    endpoint: "エンドポイント"
 | 
			
		||||
    parameter: "パラメータ"
 | 
			
		||||
    credential-info: "「i」パラメータは自動で付与されます。"
 | 
			
		||||
    send: '送信'
 | 
			
		||||
    sending: '応答待ち'
 | 
			
		||||
    response: '結果'
 | 
			
		||||
    send: "送信"
 | 
			
		||||
    sending: "応答待ち"
 | 
			
		||||
    response: "結果"
 | 
			
		||||
desktop/views/components/settings.apps.vue:
 | 
			
		||||
  no-apps: "連携しているアプリケーションはありません"
 | 
			
		||||
common/views/components/drive-settings.vue:
 | 
			
		||||
@@ -955,6 +989,7 @@ admin/views/index.vue:
 | 
			
		||||
  federation: "連合"
 | 
			
		||||
  announcements: "お知らせ"
 | 
			
		||||
  hashtags: "ハッシュタグ"
 | 
			
		||||
  abuse: "スパム報告"
 | 
			
		||||
  back-to-misskey: "Misskeyに戻る"
 | 
			
		||||
admin/views/dashboard.vue:
 | 
			
		||||
  dashboard: "ダッシュボード"
 | 
			
		||||
@@ -964,6 +999,12 @@ admin/views/dashboard.vue:
 | 
			
		||||
  instances: "インスタンス"
 | 
			
		||||
  this-instance: "このインスタンス"
 | 
			
		||||
  federated: "連合"
 | 
			
		||||
admin/views/abuse.vue:
 | 
			
		||||
  title: "スパム報告"
 | 
			
		||||
  target: "対象"
 | 
			
		||||
  reporter: "報告者"
 | 
			
		||||
  details: "詳細"
 | 
			
		||||
  remove-report: "削除"
 | 
			
		||||
admin/views/instance.vue:
 | 
			
		||||
  instance: "インスタンス"
 | 
			
		||||
  instance-name: "インスタンス名"
 | 
			
		||||
@@ -1010,6 +1051,8 @@ admin/views/instance.vue:
 | 
			
		||||
  max-note-text-length: "投稿の最大文字数"
 | 
			
		||||
  disable-registration: "ユーザー登録の受付を停止する"
 | 
			
		||||
  disable-local-timeline: "ローカルタイムラインを無効にする"
 | 
			
		||||
  disable-global-timeline: "グローバルタイムラインを無効にする"
 | 
			
		||||
  disabling-timelines-info: "これらのタイムラインを無効にしても、管理者およびモデレーターは引き続き利用できます。"
 | 
			
		||||
  invite: "招待"
 | 
			
		||||
  save: "保存"
 | 
			
		||||
  saved: "保存しました"
 | 
			
		||||
@@ -1029,6 +1072,12 @@ admin/views/instance.vue:
 | 
			
		||||
  smtp-port: "SMTPポート"
 | 
			
		||||
  smtp-user: "SMTPユーザー"
 | 
			
		||||
  smtp-pass: "SMTPパスワード"
 | 
			
		||||
  serviceworker-config: "ServiceWorker"
 | 
			
		||||
  enable-serviceworker: "ServiceWorkerを有効にする"
 | 
			
		||||
  serviceworker-info: "プッシュ通知を行うには有効する必要があります。"
 | 
			
		||||
  vapid-publickey: "VAPID公開鍵"
 | 
			
		||||
  vapid-privatekey: "VAPID秘密鍵"
 | 
			
		||||
  vapid-info: "ServiceWorkerを有効にする場合、VAPIDキーペアを生成する必要があります。シェルで次のようにします:"
 | 
			
		||||
admin/views/charts.vue:
 | 
			
		||||
  title: "チャート"
 | 
			
		||||
  per-day: "1日ごと"
 | 
			
		||||
@@ -1047,6 +1096,7 @@ admin/views/charts.vue:
 | 
			
		||||
    notes-total: "投稿の積算"
 | 
			
		||||
    users: "ユーザーの増減"
 | 
			
		||||
    users-total: "ユーザーの積算"
 | 
			
		||||
    active-users: "アクティブユーザー数"
 | 
			
		||||
    drive: "ドライブ使用量の増減"
 | 
			
		||||
    drive-total: "ドライブ使用量の積算"
 | 
			
		||||
    drive-files: "ドライブのファイル数の増減"
 | 
			
		||||
@@ -1054,6 +1104,28 @@ admin/views/charts.vue:
 | 
			
		||||
    network-requests: "リクエスト"
 | 
			
		||||
    network-time: "応答時間"
 | 
			
		||||
    network-usage: "通信量"
 | 
			
		||||
admin/views/drive.vue:
 | 
			
		||||
  operation: "操作"
 | 
			
		||||
  fileid-or-url: "ファイルIDまたはファイルURL"
 | 
			
		||||
  file-not-found: "ファイルが見つかりません"
 | 
			
		||||
  lookup: "照会"
 | 
			
		||||
  sort:
 | 
			
		||||
    title: "ソート"
 | 
			
		||||
    createdAtAsc: "アップロード日時が古い順"
 | 
			
		||||
    createdAtDesc: "アップロード日時が新しい順"
 | 
			
		||||
    sizeAsc: "サイズが小さい順"
 | 
			
		||||
    sizeDesc: "サイズが大きい順"
 | 
			
		||||
  origin:
 | 
			
		||||
    title: "オリジン"
 | 
			
		||||
    combined: "ローカル+リモート"
 | 
			
		||||
    local: "ローカル"
 | 
			
		||||
    remote: "リモート"
 | 
			
		||||
  delete: "削除"
 | 
			
		||||
  deleted: "削除しました"
 | 
			
		||||
  mark-as-sensitive: "閲覧注意に設定"
 | 
			
		||||
  unmark-as-sensitive: "閲覧注意を解除"
 | 
			
		||||
  marked-as-sensitive: "閲覧注意に設定しました"
 | 
			
		||||
  unmarked-as-sensitive: "閲覧注意を解除しました"
 | 
			
		||||
admin/views/users.vue:
 | 
			
		||||
  operation: "操作"
 | 
			
		||||
  username-or-userid: "ユーザー名またはユーザーID"
 | 
			
		||||
@@ -1077,6 +1149,14 @@ admin/views/users.vue:
 | 
			
		||||
      createdAtDesc: "登録日時が新しい順"
 | 
			
		||||
      updatedAtAsc: "更新日時が古い順"
 | 
			
		||||
      updatedAtDesc: "更新日時が新しい順"
 | 
			
		||||
    state:
 | 
			
		||||
      title: "状態"
 | 
			
		||||
      all: "すべて"
 | 
			
		||||
      admin: "管理者"
 | 
			
		||||
      moderator: "モデレーター"
 | 
			
		||||
      adminOrModerator: "管理者+モデレーター"
 | 
			
		||||
      verified: "公式アカウント"
 | 
			
		||||
      suspended: "凍結済み"
 | 
			
		||||
    origin:
 | 
			
		||||
      title: "オリジン"
 | 
			
		||||
      combined: "ローカル+リモート"
 | 
			
		||||
@@ -1089,6 +1169,8 @@ admin/views/moderators.vue:
 | 
			
		||||
    title: "モデレーターの登録"
 | 
			
		||||
    add: "登録"
 | 
			
		||||
    added: "モデレーターを登録しました"
 | 
			
		||||
    remove: "解除"
 | 
			
		||||
    removed: "モデレーター登録を解除しました"
 | 
			
		||||
admin/views/emoji.vue:
 | 
			
		||||
  add-emoji:
 | 
			
		||||
    title: "絵文字の登録"
 | 
			
		||||
@@ -1170,17 +1252,7 @@ desktop/views/pages/user/user.photos.vue:
 | 
			
		||||
  no-photos: "写真はありません"
 | 
			
		||||
desktop/views/pages/user/user.profile.vue:
 | 
			
		||||
  follows-you: "フォローされています"
 | 
			
		||||
  stalk: "ストークする"
 | 
			
		||||
  stalking: "ストーキングしています"
 | 
			
		||||
  unstalk: "ストーク解除"
 | 
			
		||||
  mute: "ミュートする"
 | 
			
		||||
  muted: "ミュートしています"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロックする"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  block-confirm: "このユーザーをブロックしますか?"
 | 
			
		||||
  push-to-a-list: "リストに追加"
 | 
			
		||||
  list-pushed: "{user}を{list}に追加しました。"
 | 
			
		||||
  menu: "メニュー"
 | 
			
		||||
desktop/views/pages/user/user.header.vue:
 | 
			
		||||
  posts: "投稿"
 | 
			
		||||
  following: "フォロー"
 | 
			
		||||
@@ -1194,6 +1266,7 @@ desktop/views/pages/user/user.timeline.vue:
 | 
			
		||||
  default: "投稿"
 | 
			
		||||
  with-replies: "投稿と返信"
 | 
			
		||||
  with-media: "メディア"
 | 
			
		||||
  my-posts: "私の投稿"
 | 
			
		||||
  empty: "このユーザーはまだ何も投稿していないようです。"
 | 
			
		||||
desktop/views/widgets/messaging.vue:
 | 
			
		||||
  title: "メッセージ"
 | 
			
		||||
@@ -1392,7 +1465,6 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  notification-position: "通知の表示"
 | 
			
		||||
  notification-position-bottom: "下"
 | 
			
		||||
  notification-position-top: "上"
 | 
			
		||||
  theme: "テーマ"
 | 
			
		||||
  behavior: "動作"
 | 
			
		||||
  fetch-on-scroll: "スクロールで自動読み込み"
 | 
			
		||||
  note-visibility: "投稿の公開範囲"
 | 
			
		||||
@@ -1416,7 +1488,6 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  signout: "サインアウト"
 | 
			
		||||
  sound: "サウンド"
 | 
			
		||||
  enable-sounds: "サウンドを有効にする"
 | 
			
		||||
  mark-as-read-all-unread-notes: "すべての投稿を既読にする"
 | 
			
		||||
  password: "パスワード"
 | 
			
		||||
mobile/views/pages/user.vue:
 | 
			
		||||
  follows-you: "フォローされています"
 | 
			
		||||
@@ -1426,15 +1497,7 @@ mobile/views/pages/user.vue:
 | 
			
		||||
  overview: "概要"
 | 
			
		||||
  timeline: "タイムライン"
 | 
			
		||||
  media: "メディア"
 | 
			
		||||
  is-suspended: "このユーザーは凍結されています。"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  years-old: "{age}歳"
 | 
			
		||||
  push-to-list: "リストに追加"
 | 
			
		||||
  select-list: "リストを選択してください"
 | 
			
		||||
  list-pushed: "{user}を{list}に追加しました"
 | 
			
		||||
mobile/views/pages/user/home.vue:
 | 
			
		||||
  recent-notes: "最近の投稿"
 | 
			
		||||
  images: "画像"
 | 
			
		||||
@@ -1484,7 +1547,6 @@ deck/deck.user-column.vue:
 | 
			
		||||
  activity: "アクティビティ"
 | 
			
		||||
  timeline: "タイムライン"
 | 
			
		||||
  pinned-notes: "ピン留めされた投稿"
 | 
			
		||||
  push-to-a-list: "リストに追加"
 | 
			
		||||
docs:
 | 
			
		||||
  edit-this-page-on-github: "間違いや改善点を見つけましたか?"
 | 
			
		||||
  edit-this-page-on-github-link: "このページをGitHubで編集"
 | 
			
		||||
 
 | 
			
		||||
@@ -27,6 +27,7 @@ common:
 | 
			
		||||
  do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
 | 
			
		||||
  load-more: "もっと読み込む"
 | 
			
		||||
  enter-password: "パスワードを入力してください"
 | 
			
		||||
  2fa: "二段階認証"
 | 
			
		||||
 | 
			
		||||
  got-it: "わかった"
 | 
			
		||||
  customization-tips:
 | 
			
		||||
@@ -96,7 +97,6 @@ common:
 | 
			
		||||
    followers-desc: "自分のフォロワーにのみ公開"
 | 
			
		||||
    specified: "ダイレクト"
 | 
			
		||||
    specified-desc: "指定したユーザーにのみ公開"
 | 
			
		||||
    private: "非公開"
 | 
			
		||||
    local-public: "公開 (ローカルのみ)"
 | 
			
		||||
    local-home: "ホーム (ローカルのみ)"
 | 
			
		||||
    local-followers: "フォロワー (ローカルのみ)"
 | 
			
		||||
@@ -118,8 +118,7 @@ common:
 | 
			
		||||
  my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
 | 
			
		||||
  i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
 | 
			
		||||
  show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
 | 
			
		||||
  use-white-black-reversi-stones: "リバーシに白黒の石を使う"
 | 
			
		||||
  use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
 | 
			
		||||
  use-avatar-reversi-stones: "リバーシの石にアバターを使う"
 | 
			
		||||
  verified-user: "公式アカウント"
 | 
			
		||||
  disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
 | 
			
		||||
  suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
 | 
			
		||||
@@ -130,17 +129,23 @@ common:
 | 
			
		||||
  reduce-motion: "UIの動きを減らす"
 | 
			
		||||
  this-setting-is-this-device-only: "このデバイスのみ"
 | 
			
		||||
  use-os-default-emojis: "OS標準の絵文字を使用"
 | 
			
		||||
  line-width: "線の太さ"
 | 
			
		||||
  line-width-thin: "細い"
 | 
			
		||||
  line-width-normal: "普通"
 | 
			
		||||
  line-width-thick: "太い"
 | 
			
		||||
  hide-password: "パスワードを隠す"
 | 
			
		||||
  show-password: "パスワードを表示する"
 | 
			
		||||
 | 
			
		||||
  do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
 | 
			
		||||
 | 
			
		||||
  do-not-use-in-production: "これは開発ビルドです。本番環境で使用しないでください。"
 | 
			
		||||
  user-suspended: "このユーザーは凍結されています。"
 | 
			
		||||
  is-remote-user: "このユーザー情報はコピーです。"
 | 
			
		||||
  is-remote-post: "この投稿情報はコピーです。"
 | 
			
		||||
  view-on-remote: "正確な情報を見る"
 | 
			
		||||
  renoted-by: "{user}がRenote"
 | 
			
		||||
 | 
			
		||||
  error:
 | 
			
		||||
    title: '問題が発生しました'
 | 
			
		||||
    retry: 'やり直す'
 | 
			
		||||
    title: "問題が発生しました"
 | 
			
		||||
    retry: "やり直す"
 | 
			
		||||
 | 
			
		||||
  reversi:
 | 
			
		||||
    drawn: "引き分け"
 | 
			
		||||
@@ -179,6 +184,7 @@ common:
 | 
			
		||||
 | 
			
		||||
  dev: "アプリの作成に失敗しました。再度お試しください。"
 | 
			
		||||
  ai-chan-kawaii: "藍ちゃかわいい"
 | 
			
		||||
  you: "あなた"
 | 
			
		||||
 | 
			
		||||
auth/views/form.vue:
 | 
			
		||||
  share-access: "<i>{name}</i>があなたのアカウントにアクセスすることを許可しますか?"
 | 
			
		||||
@@ -284,6 +290,7 @@ common/views/components/media-banner.vue:
 | 
			
		||||
  click-to-show: "クリックして表示"
 | 
			
		||||
 | 
			
		||||
common/views/components/theme.vue:
 | 
			
		||||
  theme: "テーマ"
 | 
			
		||||
  light-theme: "非ダークモード時に使用するテーマ"
 | 
			
		||||
  dark-theme: "ダークモード時に使用するテーマ"
 | 
			
		||||
  light-themes: "明るいテーマ"
 | 
			
		||||
@@ -300,6 +307,7 @@ common/views/components/theme.vue:
 | 
			
		||||
  base-theme: "ベーステーマ"
 | 
			
		||||
  base-theme-light: "Light"
 | 
			
		||||
  base-theme-dark: "Dark"
 | 
			
		||||
  find-more-theme: "その他のテーマを入手"
 | 
			
		||||
  theme-name: "テーマ名"
 | 
			
		||||
  preview-created-theme: "プレビュー"
 | 
			
		||||
  invalid-theme: "テーマが正しくありません。"
 | 
			
		||||
@@ -324,6 +332,7 @@ common/views/components/cw-button.vue:
 | 
			
		||||
  show: "もっと見る"
 | 
			
		||||
  chars: "{count}文字"
 | 
			
		||||
  files: "{count}ファイル"
 | 
			
		||||
  poll: "アンケート"
 | 
			
		||||
 | 
			
		||||
common/views/components/messaging.vue:
 | 
			
		||||
  search-user: "ユーザーを探す"
 | 
			
		||||
@@ -359,7 +368,9 @@ common/views/components/nav.vue:
 | 
			
		||||
  feedback: "フィードバック"
 | 
			
		||||
 | 
			
		||||
common/views/components/note-menu.vue:
 | 
			
		||||
  mention: "メンション"
 | 
			
		||||
  detail: "詳細"
 | 
			
		||||
  copy-content: "内容をコピー"
 | 
			
		||||
  copy-link: "リンクをコピー"
 | 
			
		||||
  favorite: "お気に入り"
 | 
			
		||||
  unfavorite: "お気に入り解除"
 | 
			
		||||
@@ -369,6 +380,18 @@ common/views/components/note-menu.vue:
 | 
			
		||||
  delete-confirm: "この投稿を削除しますか?"
 | 
			
		||||
  remote: "投稿元で見る"
 | 
			
		||||
 | 
			
		||||
common/views/components/user-menu.vue:
 | 
			
		||||
  mention: "メンション"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  push-to-list: "リストに追加"
 | 
			
		||||
  select-list: "リストを選択してください"
 | 
			
		||||
  report-abuse: "スパムを報告"
 | 
			
		||||
  report-abuse-detail: "どのような迷惑行為を行っていますか?"
 | 
			
		||||
  report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
 | 
			
		||||
 | 
			
		||||
common/views/components/poll.vue:
 | 
			
		||||
  vote-to: "「{}」に投票する"
 | 
			
		||||
  vote-count: "{}票"
 | 
			
		||||
@@ -443,6 +466,14 @@ common/views/components/stream-indicator.vue:
 | 
			
		||||
  reconnecting: "再接続中"
 | 
			
		||||
  connected: "接続完了"
 | 
			
		||||
 | 
			
		||||
common/views/components/notification-settings.vue:
 | 
			
		||||
  title: "通知"
 | 
			
		||||
  mark-as-read-all-notifications: "すべての通知を既読にする"
 | 
			
		||||
  mark-as-read-all-unread-notes: "すべての投稿を既読にする"
 | 
			
		||||
  mark-as-read-all-talk-messages: "すべてのトークを既読にする"
 | 
			
		||||
  auto-watch: "投稿の自動ウォッチ"
 | 
			
		||||
  auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。"
 | 
			
		||||
 | 
			
		||||
common/views/components/integration-settings.vue:
 | 
			
		||||
  title: "サービス連携"
 | 
			
		||||
  connect: "接続する"
 | 
			
		||||
@@ -476,7 +507,6 @@ common/views/components/visibility-chooser.vue:
 | 
			
		||||
  followers-desc: "自分のフォロワーにのみ公開"
 | 
			
		||||
  specified: "ダイレクト"
 | 
			
		||||
  specified-desc: "指定したユーザーにのみ公開"
 | 
			
		||||
  private: "非公開"
 | 
			
		||||
  local-public: "公開 (ローカルのみ)"
 | 
			
		||||
  local-public-desc: "リモートへは公開しない"
 | 
			
		||||
  local-home: "ホーム (ローカルのみ)"
 | 
			
		||||
@@ -508,6 +538,7 @@ common/views/components/profile-editor.vue:
 | 
			
		||||
  is-bot: "このアカウントはBotです"
 | 
			
		||||
  is-locked: "フォローを承認制にする"
 | 
			
		||||
  careful-bot: "Botからのフォローだけ承認制にする"
 | 
			
		||||
  auto-accept-followed: "フォローしているユーザーからのフォローを自動承認する"
 | 
			
		||||
  advanced: "その他"
 | 
			
		||||
  privacy: "プライバシー"
 | 
			
		||||
  save: "保存"
 | 
			
		||||
@@ -519,6 +550,14 @@ common/views/components/profile-editor.vue:
 | 
			
		||||
  email-verified: "メールアドレスが確認されました"
 | 
			
		||||
  email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
 | 
			
		||||
 | 
			
		||||
common/views/components/user-list-editor.vue:
 | 
			
		||||
  users: "ユーザー"
 | 
			
		||||
  rename: "リスト名を変更"
 | 
			
		||||
  delete: "リストを削除"
 | 
			
		||||
  remove-user: "このリストから削除"
 | 
			
		||||
  delete-are-you-sure: "リスト「$1」を削除しますか?"
 | 
			
		||||
  deleted: "削除しました"
 | 
			
		||||
 | 
			
		||||
common/views/widgets/broadcast.vue:
 | 
			
		||||
  fetching: "確認中"
 | 
			
		||||
  no-broadcasts: "お知らせはありません"
 | 
			
		||||
@@ -576,11 +615,11 @@ common/views/widgets/tips.vue:
 | 
			
		||||
  tips-line19: "いくつかのウィンドウはブラウザの外に切り離すことができます"
 | 
			
		||||
  tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示しています"
 | 
			
		||||
  tips-line21: "APIを利用してbotの開発なども行えます"
 | 
			
		||||
  tips-line23: "まゆかわいいよまゆ"
 | 
			
		||||
  tips-line23: "藍かわいいよ藍"
 | 
			
		||||
  tips-line24: "Misskeyは2014年にサービスを開始しました"
 | 
			
		||||
  tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
 | 
			
		||||
 | 
			
		||||
common/views/pages/404.vue:
 | 
			
		||||
common/views/pages/not-found.vue:
 | 
			
		||||
  page-not-found: "ページが見つかりませんでした"
 | 
			
		||||
 | 
			
		||||
common/views/pages/follow.vue:
 | 
			
		||||
@@ -742,11 +781,13 @@ desktop/views/components/note-detail.vue:
 | 
			
		||||
  location: "位置情報"
 | 
			
		||||
  renote: "Renote"
 | 
			
		||||
  add-reaction: "リアクション"
 | 
			
		||||
  undo-reaction: "リアクション解除"
 | 
			
		||||
 | 
			
		||||
desktop/views/components/note.vue:
 | 
			
		||||
  reply: "返信"
 | 
			
		||||
  renote: "Renote"
 | 
			
		||||
  add-reaction: "リアクション"
 | 
			
		||||
  undo-reaction: "リアクション解除"
 | 
			
		||||
  detail: "詳細"
 | 
			
		||||
  private: "この投稿は非公開です"
 | 
			
		||||
  deleted: "この投稿は削除されました"
 | 
			
		||||
@@ -827,7 +868,6 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  security: "セキュリティ"
 | 
			
		||||
  signin: "サインイン履歴"
 | 
			
		||||
  password: "パスワード"
 | 
			
		||||
  2fa: "二段階認証"
 | 
			
		||||
  other: "その他"
 | 
			
		||||
  license: "ライセンス"
 | 
			
		||||
  theme: "テーマ"
 | 
			
		||||
@@ -842,9 +882,6 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
 | 
			
		||||
  auto-popout: "ウィンドウの自動ポップアウト"
 | 
			
		||||
  auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
 | 
			
		||||
  advanced: "詳細設定"
 | 
			
		||||
  api-via-stream: "ストリームを経由したAPIリクエスト"
 | 
			
		||||
  api-via-stream-desc: "この設定をオンにすると、websocket接続を経由してAPIリクエストが行われます(パフォーマンス向上が期待できます)。オフにすると、ネイティブの fetch APIが利用されます。この設定はこのデバイスのみ有効です。"
 | 
			
		||||
  deck-nav: "デッキ内ナビゲーション"
 | 
			
		||||
  deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
 | 
			
		||||
  deck-default: "デッキをデフォルトのUIにする"
 | 
			
		||||
@@ -891,9 +928,6 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  cache-cleared: "キャッシュを削除しました"
 | 
			
		||||
  cache-cleared-desc: "ページを再度読み込みしてください。"
 | 
			
		||||
 | 
			
		||||
  auto-watch: "投稿の自動ウォッチ"
 | 
			
		||||
  auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。"
 | 
			
		||||
 | 
			
		||||
  about: "Misskeyについて"
 | 
			
		||||
  operator: "このサーバーの運営者"
 | 
			
		||||
 | 
			
		||||
@@ -936,6 +970,7 @@ desktop/views/components/settings.2fa.vue:
 | 
			
		||||
  enter-password: "パスワードを入力してください"
 | 
			
		||||
  authenticator: "まず、Google Authenticatorをお使いのデバイスにインストールします:"
 | 
			
		||||
  howtoinstall: "インストール方法はこちら"
 | 
			
		||||
  token: "トークン"
 | 
			
		||||
  scan: "次に、表示されているQRコードをスキャンします:"
 | 
			
		||||
  done: "お使いのデバイスに表示されているトークンを入力して完了します:"
 | 
			
		||||
  submit: "完了"
 | 
			
		||||
@@ -951,13 +986,13 @@ common/views/components/api-settings.vue:
 | 
			
		||||
  token: "Token:"
 | 
			
		||||
  enter-password: "パスワードを入力してください"
 | 
			
		||||
  console:
 | 
			
		||||
    title: 'APIコンソール'
 | 
			
		||||
    endpoint: 'エンドポイント'
 | 
			
		||||
    parameter: 'パラメータ'
 | 
			
		||||
    title: "APIコンソール"
 | 
			
		||||
    endpoint: "エンドポイント"
 | 
			
		||||
    parameter: "パラメータ"
 | 
			
		||||
    credential-info: "「i」パラメータは自動で付与されます。"
 | 
			
		||||
    send: '送信'
 | 
			
		||||
    sending: '応答待ち'
 | 
			
		||||
    response: '結果'
 | 
			
		||||
    send: "送信"
 | 
			
		||||
    sending: "応答待ち"
 | 
			
		||||
    response: "結果"
 | 
			
		||||
 | 
			
		||||
desktop/views/components/settings.apps.vue:
 | 
			
		||||
  no-apps: "連携しているアプリケーションはありません"
 | 
			
		||||
@@ -1080,6 +1115,7 @@ admin/views/index.vue:
 | 
			
		||||
  federation: "連合"
 | 
			
		||||
  announcements: "お知らせ"
 | 
			
		||||
  hashtags: "ハッシュタグ"
 | 
			
		||||
  abuse: "スパム報告"
 | 
			
		||||
  back-to-misskey: "Misskeyに戻る"
 | 
			
		||||
 | 
			
		||||
admin/views/dashboard.vue:
 | 
			
		||||
@@ -1091,6 +1127,13 @@ admin/views/dashboard.vue:
 | 
			
		||||
  this-instance: "このインスタンス"
 | 
			
		||||
  federated: "連合"
 | 
			
		||||
 | 
			
		||||
admin/views/abuse.vue:
 | 
			
		||||
  title: "スパム報告"
 | 
			
		||||
  target: "対象"
 | 
			
		||||
  reporter: "報告者"
 | 
			
		||||
  details: "詳細"
 | 
			
		||||
  remove-report: "削除"
 | 
			
		||||
 | 
			
		||||
admin/views/instance.vue:
 | 
			
		||||
  instance: "インスタンス"
 | 
			
		||||
  instance-name: "インスタンス名"
 | 
			
		||||
@@ -1137,6 +1180,8 @@ admin/views/instance.vue:
 | 
			
		||||
  max-note-text-length: "投稿の最大文字数"
 | 
			
		||||
  disable-registration: "ユーザー登録の受付を停止する"
 | 
			
		||||
  disable-local-timeline: "ローカルタイムラインを無効にする"
 | 
			
		||||
  disable-global-timeline: "グローバルタイムラインを無効にする"
 | 
			
		||||
  disabling-timelines-info: "これらのタイムラインを無効にしても、管理者およびモデレーターは引き続き利用できます。"
 | 
			
		||||
  invite: "招待"
 | 
			
		||||
  save: "保存"
 | 
			
		||||
  saved: "保存しました"
 | 
			
		||||
@@ -1156,6 +1201,12 @@ admin/views/instance.vue:
 | 
			
		||||
  smtp-port: "SMTPポート"
 | 
			
		||||
  smtp-user: "SMTPユーザー"
 | 
			
		||||
  smtp-pass: "SMTPパスワード"
 | 
			
		||||
  serviceworker-config: "ServiceWorker"
 | 
			
		||||
  enable-serviceworker: "ServiceWorkerを有効にする"
 | 
			
		||||
  serviceworker-info: "プッシュ通知を行うには有効する必要があります。"
 | 
			
		||||
  vapid-publickey: "VAPID公開鍵"
 | 
			
		||||
  vapid-privatekey: "VAPID秘密鍵"
 | 
			
		||||
  vapid-info: "ServiceWorkerを有効にする場合、VAPIDキーペアを生成する必要があります。シェルで次のようにします:"
 | 
			
		||||
 | 
			
		||||
admin/views/charts.vue:
 | 
			
		||||
  title: "チャート"
 | 
			
		||||
@@ -1175,6 +1226,7 @@ admin/views/charts.vue:
 | 
			
		||||
    notes-total: "投稿の積算"
 | 
			
		||||
    users: "ユーザーの増減"
 | 
			
		||||
    users-total: "ユーザーの積算"
 | 
			
		||||
    active-users: "アクティブユーザー数"
 | 
			
		||||
    drive: "ドライブ使用量の増減"
 | 
			
		||||
    drive-total: "ドライブ使用量の積算"
 | 
			
		||||
    drive-files: "ドライブのファイル数の増減"
 | 
			
		||||
@@ -1183,6 +1235,29 @@ admin/views/charts.vue:
 | 
			
		||||
    network-time: "応答時間"
 | 
			
		||||
    network-usage: "通信量"
 | 
			
		||||
 | 
			
		||||
admin/views/drive.vue:
 | 
			
		||||
  operation: "操作"
 | 
			
		||||
  fileid-or-url: "ファイルIDまたはファイルURL"
 | 
			
		||||
  file-not-found: "ファイルが見つかりません"
 | 
			
		||||
  lookup: "照会"
 | 
			
		||||
  sort:
 | 
			
		||||
    title: "ソート"
 | 
			
		||||
    createdAtAsc: "アップロード日時が古い順"
 | 
			
		||||
    createdAtDesc: "アップロード日時が新しい順"
 | 
			
		||||
    sizeAsc: "サイズが小さい順"
 | 
			
		||||
    sizeDesc: "サイズが大きい順"
 | 
			
		||||
  origin:
 | 
			
		||||
    title: "オリジン"
 | 
			
		||||
    combined: "ローカル+リモート"
 | 
			
		||||
    local: "ローカル"
 | 
			
		||||
    remote: "リモート"
 | 
			
		||||
  delete: "削除"
 | 
			
		||||
  deleted: "削除しました"
 | 
			
		||||
  mark-as-sensitive: "閲覧注意に設定"
 | 
			
		||||
  unmark-as-sensitive: "閲覧注意を解除"
 | 
			
		||||
  marked-as-sensitive: "閲覧注意に設定しました"
 | 
			
		||||
  unmarked-as-sensitive: "閲覧注意を解除しました"
 | 
			
		||||
 | 
			
		||||
admin/views/users.vue:
 | 
			
		||||
  operation: "操作"
 | 
			
		||||
  username-or-userid: "ユーザー名またはユーザーID"
 | 
			
		||||
@@ -1206,6 +1281,14 @@ admin/views/users.vue:
 | 
			
		||||
      createdAtDesc: "登録日時が新しい順"
 | 
			
		||||
      updatedAtAsc: "更新日時が古い順"
 | 
			
		||||
      updatedAtDesc: "更新日時が新しい順"
 | 
			
		||||
    state:
 | 
			
		||||
      title: "状態"
 | 
			
		||||
      all: "すべて"
 | 
			
		||||
      admin: "管理者"
 | 
			
		||||
      moderator: "モデレーター"
 | 
			
		||||
      adminOrModerator: "管理者+モデレーター"
 | 
			
		||||
      verified: "公式アカウント"
 | 
			
		||||
      suspended: "凍結済み"
 | 
			
		||||
    origin:
 | 
			
		||||
      title: "オリジン"
 | 
			
		||||
      combined: "ローカル+リモート"
 | 
			
		||||
@@ -1219,6 +1302,8 @@ admin/views/moderators.vue:
 | 
			
		||||
    title: "モデレーターの登録"
 | 
			
		||||
    add: "登録"
 | 
			
		||||
    added: "モデレーターを登録しました"
 | 
			
		||||
    remove: "解除"
 | 
			
		||||
    removed: "モデレーター登録を解除しました"
 | 
			
		||||
 | 
			
		||||
admin/views/emoji.vue:
 | 
			
		||||
  add-emoji:
 | 
			
		||||
@@ -1316,17 +1401,7 @@ desktop/views/pages/user/user.photos.vue:
 | 
			
		||||
 | 
			
		||||
desktop/views/pages/user/user.profile.vue:
 | 
			
		||||
  follows-you: "フォローされています"
 | 
			
		||||
  stalk: "ストークする"
 | 
			
		||||
  stalking: "ストーキングしています"
 | 
			
		||||
  unstalk: "ストーク解除"
 | 
			
		||||
  mute: "ミュートする"
 | 
			
		||||
  muted: "ミュートしています"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロックする"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  block-confirm: "このユーザーをブロックしますか?"
 | 
			
		||||
  push-to-a-list: "リストに追加"
 | 
			
		||||
  list-pushed: "{user}を{list}に追加しました。"
 | 
			
		||||
  menu: "メニュー"
 | 
			
		||||
 | 
			
		||||
desktop/views/pages/user/user.header.vue:
 | 
			
		||||
  posts: "投稿"
 | 
			
		||||
@@ -1342,6 +1417,7 @@ desktop/views/pages/user/user.timeline.vue:
 | 
			
		||||
  default: "投稿"
 | 
			
		||||
  with-replies: "投稿と返信"
 | 
			
		||||
  with-media: "メディア"
 | 
			
		||||
  my-posts: "私の投稿"
 | 
			
		||||
  empty: "このユーザーはまだ何も投稿していないようです。"
 | 
			
		||||
 | 
			
		||||
desktop/views/widgets/messaging.vue:
 | 
			
		||||
@@ -1586,7 +1662,6 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  notification-position: "通知の表示"
 | 
			
		||||
  notification-position-bottom: "下"
 | 
			
		||||
  notification-position-top: "上"
 | 
			
		||||
  theme: "テーマ"
 | 
			
		||||
  behavior: "動作"
 | 
			
		||||
  fetch-on-scroll: "スクロールで自動読み込み"
 | 
			
		||||
  note-visibility: "投稿の公開範囲"
 | 
			
		||||
@@ -1610,7 +1685,6 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  signout: "サインアウト"
 | 
			
		||||
  sound: "サウンド"
 | 
			
		||||
  enable-sounds: "サウンドを有効にする"
 | 
			
		||||
  mark-as-read-all-unread-notes: "すべての投稿を既読にする"
 | 
			
		||||
  password: "パスワード"
 | 
			
		||||
 | 
			
		||||
mobile/views/pages/user.vue:
 | 
			
		||||
@@ -1621,15 +1695,7 @@ mobile/views/pages/user.vue:
 | 
			
		||||
  overview: "概要"
 | 
			
		||||
  timeline: "タイムライン"
 | 
			
		||||
  media: "メディア"
 | 
			
		||||
  is-suspended: "このユーザーは凍結されています。"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  years-old: "{age}歳"
 | 
			
		||||
  push-to-list: "リストに追加"
 | 
			
		||||
  select-list: "リストを選択してください"
 | 
			
		||||
  list-pushed: "{user}を{list}に追加しました"
 | 
			
		||||
 | 
			
		||||
mobile/views/pages/user/home.vue:
 | 
			
		||||
  recent-notes: "最近の投稿"
 | 
			
		||||
@@ -1687,7 +1753,6 @@ deck/deck.user-column.vue:
 | 
			
		||||
  activity: "アクティビティ"
 | 
			
		||||
  timeline: "タイムライン"
 | 
			
		||||
  pinned-notes: "ピン留めされた投稿"
 | 
			
		||||
  push-to-a-list: "リストに追加"
 | 
			
		||||
 | 
			
		||||
docs:
 | 
			
		||||
  edit-this-page-on-github: "間違いや改善点を見つけましたか?"
 | 
			
		||||
 
 | 
			
		||||
@@ -27,6 +27,7 @@ common:
 | 
			
		||||
  do-not-copy-paste: "ここにコードを入力したり張り付けたりせんといてください。アカウントが不正利用されるかも分からん。知らんけど。"
 | 
			
		||||
  load-more: "もっとあらへんのか!"
 | 
			
		||||
  enter-password: "パスワードを入れてや"
 | 
			
		||||
  2fa: "二段階認証"
 | 
			
		||||
  got-it: "ほい"
 | 
			
		||||
  customization-tips:
 | 
			
		||||
    title: "カスタマイズのヒント"
 | 
			
		||||
@@ -90,7 +91,6 @@ common:
 | 
			
		||||
    followers-desc: "自分のフォロワー以外に見せんとって"
 | 
			
		||||
    specified: "ダイレクト"
 | 
			
		||||
    specified-desc: "今から言うユーザー以外に見せんとってや"
 | 
			
		||||
    private: "非公開"
 | 
			
		||||
    local-public: "公開 (ローカルだけ)"
 | 
			
		||||
    local-home: "ホーム (ローカルだけ)"
 | 
			
		||||
    local-followers: "フォロワー (ローカルだけ)"
 | 
			
		||||
@@ -110,8 +110,7 @@ common:
 | 
			
		||||
  my-token-regenerated: "あんさんのトークンが更新されたらしいわ。すまんがとりあえずサインアウトすんで。"
 | 
			
		||||
  i-like-sushi: "寿司(のほうがプリンよりむしろ)ウマい、タコ焼きはあらへんけど。"
 | 
			
		||||
  show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示や!"
 | 
			
		||||
  use-white-black-reversi-stones: "リバーシに白黒の石を使う"
 | 
			
		||||
  use-contrast-reversi-stones: "リバーシのアイコンにコントラストをつけんで!"
 | 
			
		||||
  use-avatar-reversi-stones: "リバーシの石にアバターを使う"
 | 
			
		||||
  verified-user: "アメちゃん付きアカウント"
 | 
			
		||||
  disable-animated-mfm: "投稿内のちょろちょろ動いてんのを止める"
 | 
			
		||||
  suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
 | 
			
		||||
@@ -122,14 +121,21 @@ common:
 | 
			
		||||
  reduce-motion: "UI、動き過ぎや、静かにしてや"
 | 
			
		||||
  this-setting-is-this-device-only: "このデバイスのみ"
 | 
			
		||||
  use-os-default-emojis: "OSにもとから入っとる絵文字使う"
 | 
			
		||||
  do-not-use-in-production: '開発ビルドや。本番環境で使わんといて!知らんで!'
 | 
			
		||||
  line-width: "線の太さ"
 | 
			
		||||
  line-width-thin: "細い"
 | 
			
		||||
  line-width-normal: "普通"
 | 
			
		||||
  line-width-thick: "太い"
 | 
			
		||||
  hide-password: "パスワードを隠す"
 | 
			
		||||
  show-password: "パスワードを表示する"
 | 
			
		||||
  do-not-use-in-production: "開発ビルドや。本番環境で使わんといて!知らんで!"
 | 
			
		||||
  user-suspended: "このユーザーは凍結されています。"
 | 
			
		||||
  is-remote-user: "このユーザー情報はコピーです。"
 | 
			
		||||
  is-remote-post: "この投稿情報はコピーです。"
 | 
			
		||||
  view-on-remote: "ちゃんとした情報見せてや!"
 | 
			
		||||
  renoted-by: "{user}がRenote"
 | 
			
		||||
  error:
 | 
			
		||||
    title: '問題が起こったわ'
 | 
			
		||||
    retry: 'もっぺん'
 | 
			
		||||
    title: "問題が起こったわ"
 | 
			
		||||
    retry: "もっぺん"
 | 
			
		||||
  reversi:
 | 
			
		||||
    drawn: "おあいこ"
 | 
			
		||||
    my-turn: "あんさんのターンや"
 | 
			
		||||
@@ -165,6 +171,7 @@ common:
 | 
			
		||||
    hashtags: "ハッシュタグ"
 | 
			
		||||
  dev: "アプリの作成あかんかったわ。もっぺんやってみて。"
 | 
			
		||||
  ai-chan-kawaii: "藍ちゃめっさべっぴんさんや"
 | 
			
		||||
  you: "あなた"
 | 
			
		||||
auth/views/form.vue:
 | 
			
		||||
  share-access: "あんたのアカウントに<i>{name}</i>がアクセスしようとしてるで?ええか?"
 | 
			
		||||
  permission-ask: "このアプリは次の権限を要求してんで:"
 | 
			
		||||
@@ -260,6 +267,7 @@ common/views/components/media-banner.vue:
 | 
			
		||||
  sensitive: "見せたらあかん"
 | 
			
		||||
  click-to-show: "押してみ、見せたるわ"
 | 
			
		||||
common/views/components/theme.vue:
 | 
			
		||||
  theme: "テーマ"
 | 
			
		||||
  light-theme: "ナイトゲームちゃう時のテーマどないする?"
 | 
			
		||||
  dark-theme: "ナイトゲームの時のテーマどないする?"
 | 
			
		||||
  light-themes: "デイゲーム"
 | 
			
		||||
@@ -276,6 +284,7 @@ common/views/components/theme.vue:
 | 
			
		||||
  base-theme: "この色が背景や!"
 | 
			
		||||
  base-theme-light: "Light"
 | 
			
		||||
  base-theme-dark: "Dark"
 | 
			
		||||
  find-more-theme: "その他のテーマを入手"
 | 
			
		||||
  theme-name: "テーマ名"
 | 
			
		||||
  preview-created-theme: "試してみる"
 | 
			
		||||
  invalid-theme: "このテーマあかんわ、なんか間違うとる"
 | 
			
		||||
@@ -299,6 +308,7 @@ common/views/components/cw-button.vue:
 | 
			
		||||
  show: "見たいやろ?"
 | 
			
		||||
  chars: "{count}文字"
 | 
			
		||||
  files: "{count}ファイル"
 | 
			
		||||
  poll: "アンケート"
 | 
			
		||||
common/views/components/messaging.vue:
 | 
			
		||||
  search-user: "ユーザーを探す"
 | 
			
		||||
  you: "あんさん"
 | 
			
		||||
@@ -328,7 +338,9 @@ common/views/components/nav.vue:
 | 
			
		||||
  develop: "開発者"
 | 
			
		||||
  feedback: "フィードバック"
 | 
			
		||||
common/views/components/note-menu.vue:
 | 
			
		||||
  mention: "メンション"
 | 
			
		||||
  detail: "もっと"
 | 
			
		||||
  copy-content: "内容をコピー"
 | 
			
		||||
  copy-link: "リンクをコピー"
 | 
			
		||||
  favorite: "お気に入り"
 | 
			
		||||
  unfavorite: "お気に入りやめる"
 | 
			
		||||
@@ -337,6 +349,17 @@ common/views/components/note-menu.vue:
 | 
			
		||||
  delete: "ほかす"
 | 
			
		||||
  delete-confirm: "この投稿を削除してもええか?"
 | 
			
		||||
  remote: "投稿元に行ってみよか"
 | 
			
		||||
common/views/components/user-menu.vue:
 | 
			
		||||
  mention: "メンション"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  push-to-list: "リストに追加"
 | 
			
		||||
  select-list: "リストを選択してください"
 | 
			
		||||
  report-abuse: "スパムを報告"
 | 
			
		||||
  report-abuse-detail: "どのような迷惑行為を行っていますか?"
 | 
			
		||||
  report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
 | 
			
		||||
common/views/components/poll.vue:
 | 
			
		||||
  vote-to: "「{}」に投票や!"
 | 
			
		||||
  vote-count: "{}票"
 | 
			
		||||
@@ -403,6 +426,13 @@ common/views/components/stream-indicator.vue:
 | 
			
		||||
  connecting: "つないどるで"
 | 
			
		||||
  reconnecting: "つなぎ直すで"
 | 
			
		||||
  connected: "つないだわ"
 | 
			
		||||
common/views/components/notification-settings.vue:
 | 
			
		||||
  title: "通知"
 | 
			
		||||
  mark-as-read-all-notifications: "すべての通知を既読にする"
 | 
			
		||||
  mark-as-read-all-unread-notes: "すべての投稿を既読にする"
 | 
			
		||||
  mark-as-read-all-talk-messages: "すべてのトークを既読にする"
 | 
			
		||||
  auto-watch: "投稿の自動ウォッチ"
 | 
			
		||||
  auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。"
 | 
			
		||||
common/views/components/integration-settings.vue:
 | 
			
		||||
  title: "サービス連携"
 | 
			
		||||
  connect: "つなげる"
 | 
			
		||||
@@ -432,7 +462,6 @@ common/views/components/visibility-chooser.vue:
 | 
			
		||||
  followers-desc: "自分のフォロワー以外に見せんとって"
 | 
			
		||||
  specified: "ダイレクト"
 | 
			
		||||
  specified-desc: "今から言うユーザー以外に見せんとってや"
 | 
			
		||||
  private: "非公開"
 | 
			
		||||
  local-public: "公開 (ローカルだけ)"
 | 
			
		||||
  local-public-desc: "リモートには見せへん"
 | 
			
		||||
  local-home: "ホーム (ローカルだけ)"
 | 
			
		||||
@@ -461,6 +490,7 @@ common/views/components/profile-editor.vue:
 | 
			
		||||
  is-bot: "このアカウントはBotやで"
 | 
			
		||||
  is-locked: "他人のフォローは許可してからや!"
 | 
			
		||||
  careful-bot: "Botからのフォローだけは許可制や"
 | 
			
		||||
  auto-accept-followed: "フォローしているユーザーからのフォローを自動承認する"
 | 
			
		||||
  advanced: "その他"
 | 
			
		||||
  privacy: "プライバシーってなんや?オカンの年齢か?"
 | 
			
		||||
  save: "保存"
 | 
			
		||||
@@ -471,6 +501,13 @@ common/views/components/profile-editor.vue:
 | 
			
		||||
  email-address: "メールアドレス"
 | 
			
		||||
  email-verified: "このメールアドレスOKや!"
 | 
			
		||||
  email-not-verified: "メールアドレスが確認されとらん。メールボックスもっぺん見てくれへん?"
 | 
			
		||||
common/views/components/user-list-editor.vue:
 | 
			
		||||
  users: "ユーザー"
 | 
			
		||||
  rename: "リスト名を変更"
 | 
			
		||||
  delete: "リストを削除"
 | 
			
		||||
  remove-user: "このリストから削除"
 | 
			
		||||
  delete-are-you-sure: "リスト「$1」を削除しますか?"
 | 
			
		||||
  deleted: "削除しました"
 | 
			
		||||
common/views/widgets/broadcast.vue:
 | 
			
		||||
  fetching: "見てみるわ…"
 | 
			
		||||
  no-broadcasts: "お知らせはあらへんで"
 | 
			
		||||
@@ -520,10 +557,10 @@ common/views/widgets/tips.vue:
 | 
			
		||||
  tips-line19: "いくつかのウィンドウはブラウザの外に切り離すことができんで"
 | 
			
		||||
  tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示してんねん"
 | 
			
		||||
  tips-line21: "APIをつこてbotの開発なども行えるで"
 | 
			
		||||
  tips-line23: "ウチのタコちゃんかわええやろ…今の突っ込むところや!"
 | 
			
		||||
  tips-line23: "藍かわいいよ藍"
 | 
			
		||||
  tips-line24: "Misskeyは2014年にサービスを開始したんよ"
 | 
			
		||||
  tips-line25: "対応ブラウザやったらMisskeyを開いとらんでも通知を受け取れんで"
 | 
			
		||||
common/views/pages/404.vue:
 | 
			
		||||
common/views/pages/not-found.vue:
 | 
			
		||||
  page-not-found: "ページが見つかりませんでした"
 | 
			
		||||
common/views/pages/follow.vue:
 | 
			
		||||
  signed-in-as: "{}としてサインイン中"
 | 
			
		||||
@@ -660,10 +697,12 @@ desktop/views/components/note-detail.vue:
 | 
			
		||||
  location: "ここおるで:"
 | 
			
		||||
  renote: "Renote"
 | 
			
		||||
  add-reaction: "リアクション"
 | 
			
		||||
  undo-reaction: "リアクション解除"
 | 
			
		||||
desktop/views/components/note.vue:
 | 
			
		||||
  reply: "返す"
 | 
			
		||||
  renote: "Renote"
 | 
			
		||||
  add-reaction: "リアクション"
 | 
			
		||||
  undo-reaction: "リアクション解除"
 | 
			
		||||
  detail: "もっと"
 | 
			
		||||
  private: "この投稿は見せられへんわ"
 | 
			
		||||
  deleted: "この投稿なんか無くなってもうたわ"
 | 
			
		||||
@@ -734,7 +773,6 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  security: "セキュリティ"
 | 
			
		||||
  signin: "こんな感じでサインインしたらしいで"
 | 
			
		||||
  password: "パスワード"
 | 
			
		||||
  2fa: "二段階認証"
 | 
			
		||||
  other: "その他"
 | 
			
		||||
  license: "ライセンス"
 | 
			
		||||
  theme: "テーマ"
 | 
			
		||||
@@ -748,9 +786,6 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  web-search-engine-desc: "例: https://www.google.com/?#q?{{query}}"
 | 
			
		||||
  auto-popout: "ウィンドウの自動ポップアウト"
 | 
			
		||||
  auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトすんで。この設定はブラウザに記憶されんで。"
 | 
			
		||||
  advanced: "もっと設定"
 | 
			
		||||
  api-via-stream: "ストリームを経由したAPIリクエスト"
 | 
			
		||||
  api-via-stream-desc: "この設定をオンにすると、WebSocket接続を経由してAPIリクエストが行われんで(パフォーマンス向上するかも、知らんけど)。オフにすると、ネイティブの fetch API が利用されるで。この設定はこのデバイスのみ有効やで。"
 | 
			
		||||
  deck-nav: "デッキ内ナビゲーション"
 | 
			
		||||
  deck-nav-desc: "デッキを使うとるとき、ナビゲーションが発生するときにページ移動せんで、一時的なカラムで受けれるようにするで"
 | 
			
		||||
  deck-default: "デッキをデフォルトのUIにする"
 | 
			
		||||
@@ -793,8 +828,6 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  cache-warn: "お掃除するとな、ブラウザが覚えてくれとるアカウントのあれこれや書きかけの投稿・返信・メッセージや設定情報なんかのデータが全部飛んでいくんや。これやったらページ再読込しといてな。"
 | 
			
		||||
  cache-cleared: "キャッシュお掃除したで"
 | 
			
		||||
  cache-cleared-desc: "もっぺんページ読みこみ直してくれや"
 | 
			
		||||
  auto-watch: "投稿勝手にウォッチしといてや"
 | 
			
		||||
  auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を勝手に受け取るようにすんで。"
 | 
			
		||||
  about: "Misskeyってなんや?"
 | 
			
		||||
  operator: "このサーバー誰のや"
 | 
			
		||||
  update: "Misskey Update"
 | 
			
		||||
@@ -833,6 +866,7 @@ desktop/views/components/settings.2fa.vue:
 | 
			
		||||
  enter-password: "パスワードを入れてや"
 | 
			
		||||
  authenticator: "まず、Google Authenticatorとかのをつこてるデバイスにインストールしてや:"
 | 
			
		||||
  howtoinstall: "インストール方法はここやで"
 | 
			
		||||
  token: "トークン"
 | 
			
		||||
  scan: "んで、ここに出とるQRコードをスキャンしてな:"
 | 
			
		||||
  done: "最後にデバイスに表示されとるトークンを入力してな:"
 | 
			
		||||
  submit: "送信"
 | 
			
		||||
@@ -847,13 +881,13 @@ common/views/components/api-settings.vue:
 | 
			
		||||
  token: "Token:"
 | 
			
		||||
  enter-password: "パスワードを入れてや"
 | 
			
		||||
  console:
 | 
			
		||||
    title: 'APIコンソール'
 | 
			
		||||
    endpoint: 'エンドポイント'
 | 
			
		||||
    parameter: 'パラメータ'
 | 
			
		||||
    title: "APIコンソール"
 | 
			
		||||
    endpoint: "エンドポイント"
 | 
			
		||||
    parameter: "パラメータ"
 | 
			
		||||
    credential-info: "「i」パラメータは勝手に付くで。"
 | 
			
		||||
    send: '送る'
 | 
			
		||||
    sending: '応答待っとる'
 | 
			
		||||
    response: 'こんなん返ってきたわ'
 | 
			
		||||
    send: "送る"
 | 
			
		||||
    sending: "応答待っとる"
 | 
			
		||||
    response: "こんなん返ってきたわ"
 | 
			
		||||
desktop/views/components/settings.apps.vue:
 | 
			
		||||
  no-apps: "連携しているアプリケーションはあらへんで"
 | 
			
		||||
common/views/components/drive-settings.vue:
 | 
			
		||||
@@ -955,6 +989,7 @@ admin/views/index.vue:
 | 
			
		||||
  federation: "連合"
 | 
			
		||||
  announcements: "知っといてや"
 | 
			
		||||
  hashtags: "ハッシュタグ"
 | 
			
		||||
  abuse: "スパム報告"
 | 
			
		||||
  back-to-misskey: "Misskeyに戻る"
 | 
			
		||||
admin/views/dashboard.vue:
 | 
			
		||||
  dashboard: "ダッシュボード"
 | 
			
		||||
@@ -964,6 +999,12 @@ admin/views/dashboard.vue:
 | 
			
		||||
  instances: "インスタンス"
 | 
			
		||||
  this-instance: "ワイのインスタンス"
 | 
			
		||||
  federated: "連合"
 | 
			
		||||
admin/views/abuse.vue:
 | 
			
		||||
  title: "スパム報告"
 | 
			
		||||
  target: "対象"
 | 
			
		||||
  reporter: "報告者"
 | 
			
		||||
  details: "詳細"
 | 
			
		||||
  remove-report: "削除"
 | 
			
		||||
admin/views/instance.vue:
 | 
			
		||||
  instance: "インスタンス"
 | 
			
		||||
  instance-name: "インスタンス名"
 | 
			
		||||
@@ -1010,6 +1051,8 @@ admin/views/instance.vue:
 | 
			
		||||
  max-note-text-length: "投稿の最大文字数"
 | 
			
		||||
  disable-registration: "ユーザー登録の受付を止める"
 | 
			
		||||
  disable-local-timeline: "ローカルタイムラインを使えんようにする"
 | 
			
		||||
  disable-global-timeline: "グローバルタイムラインを無効にする"
 | 
			
		||||
  disabling-timelines-info: "これらのタイムラインを無効にしても、管理者およびモデレーターは引き続き利用できます。"
 | 
			
		||||
  invite: "来てや"
 | 
			
		||||
  save: "保存"
 | 
			
		||||
  saved: "保存したで!"
 | 
			
		||||
@@ -1029,6 +1072,12 @@ admin/views/instance.vue:
 | 
			
		||||
  smtp-port: "SMTPポート"
 | 
			
		||||
  smtp-user: "SMTPユーザー"
 | 
			
		||||
  smtp-pass: "SMTPパスワード"
 | 
			
		||||
  serviceworker-config: "ServiceWorker"
 | 
			
		||||
  enable-serviceworker: "ServiceWorkerを有効にする"
 | 
			
		||||
  serviceworker-info: "プッシュ通知を行うには有効する必要があります。"
 | 
			
		||||
  vapid-publickey: "VAPID公開鍵"
 | 
			
		||||
  vapid-privatekey: "VAPID秘密鍵"
 | 
			
		||||
  vapid-info: "ServiceWorkerを有効にする場合、VAPIDキーペアを生成する必要があります。シェルで次のようにします:"
 | 
			
		||||
admin/views/charts.vue:
 | 
			
		||||
  title: "チャート"
 | 
			
		||||
  per-day: "1日ごと"
 | 
			
		||||
@@ -1047,6 +1096,7 @@ admin/views/charts.vue:
 | 
			
		||||
    notes-total: "投稿の積算"
 | 
			
		||||
    users: "ユーザーの増減"
 | 
			
		||||
    users-total: "ユーザーの積算"
 | 
			
		||||
    active-users: "アクティブユーザー数"
 | 
			
		||||
    drive: "ドライブ使用量の増減"
 | 
			
		||||
    drive-total: "ドライブ使用量の積算"
 | 
			
		||||
    drive-files: "ドライブのファイル数の増減"
 | 
			
		||||
@@ -1054,6 +1104,28 @@ admin/views/charts.vue:
 | 
			
		||||
    network-requests: "リクエスト"
 | 
			
		||||
    network-time: "応答時間"
 | 
			
		||||
    network-usage: "通信量"
 | 
			
		||||
admin/views/drive.vue:
 | 
			
		||||
  operation: "操作"
 | 
			
		||||
  fileid-or-url: "ファイルIDまたはファイルURL"
 | 
			
		||||
  file-not-found: "ファイルが見つかりません"
 | 
			
		||||
  lookup: "照会"
 | 
			
		||||
  sort:
 | 
			
		||||
    title: "ソート"
 | 
			
		||||
    createdAtAsc: "アップロード日時が古い順"
 | 
			
		||||
    createdAtDesc: "アップロード日時が新しい順"
 | 
			
		||||
    sizeAsc: "サイズが小さい順"
 | 
			
		||||
    sizeDesc: "サイズが大きい順"
 | 
			
		||||
  origin:
 | 
			
		||||
    title: "オリジン"
 | 
			
		||||
    combined: "ローカル+リモート"
 | 
			
		||||
    local: "ローカル"
 | 
			
		||||
    remote: "リモート"
 | 
			
		||||
  delete: "削除"
 | 
			
		||||
  deleted: "削除しました"
 | 
			
		||||
  mark-as-sensitive: "閲覧注意に設定"
 | 
			
		||||
  unmark-as-sensitive: "閲覧注意を解除"
 | 
			
		||||
  marked-as-sensitive: "閲覧注意に設定しました"
 | 
			
		||||
  unmarked-as-sensitive: "閲覧注意を解除しました"
 | 
			
		||||
admin/views/users.vue:
 | 
			
		||||
  operation: "操作"
 | 
			
		||||
  username-or-userid: "ユーザー名またはユーザーID"
 | 
			
		||||
@@ -1077,6 +1149,14 @@ admin/views/users.vue:
 | 
			
		||||
      createdAtDesc: "登録日時が新しい順"
 | 
			
		||||
      updatedAtAsc: "更新日時が古い順"
 | 
			
		||||
      updatedAtDesc: "更新日時が新しい順"
 | 
			
		||||
    state:
 | 
			
		||||
      title: "状態"
 | 
			
		||||
      all: "すべて"
 | 
			
		||||
      admin: "管理者"
 | 
			
		||||
      moderator: "モデレーター"
 | 
			
		||||
      adminOrModerator: "管理者+モデレーター"
 | 
			
		||||
      verified: "公式アカウント"
 | 
			
		||||
      suspended: "凍結済み"
 | 
			
		||||
    origin:
 | 
			
		||||
      title: "オリジン"
 | 
			
		||||
      combined: "ローカル+リモート"
 | 
			
		||||
@@ -1089,6 +1169,8 @@ admin/views/moderators.vue:
 | 
			
		||||
    title: "モデレーターの登録"
 | 
			
		||||
    add: "登録"
 | 
			
		||||
    added: "モデレーターを登録しました"
 | 
			
		||||
    remove: "解除"
 | 
			
		||||
    removed: "モデレーター登録を解除しました"
 | 
			
		||||
admin/views/emoji.vue:
 | 
			
		||||
  add-emoji:
 | 
			
		||||
    title: "絵文字の登録"
 | 
			
		||||
@@ -1170,17 +1252,7 @@ desktop/views/pages/user/user.photos.vue:
 | 
			
		||||
  no-photos: "写真はあらへんで"
 | 
			
		||||
desktop/views/pages/user/user.profile.vue:
 | 
			
		||||
  follows-you: "フォローされとるで"
 | 
			
		||||
  stalk: "ストークする"
 | 
			
		||||
  stalking: "ストーキングしとるで"
 | 
			
		||||
  unstalk: "ストーク解除"
 | 
			
		||||
  mute: "ミュートする"
 | 
			
		||||
  muted: "ミュートしとるで"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロックする"
 | 
			
		||||
  unblock: "ブロックやめたる"
 | 
			
		||||
  block-confirm: "このユーザーをブロックしてええか?"
 | 
			
		||||
  push-to-a-list: "リストに追加"
 | 
			
		||||
  list-pushed: "{user}を{list}に追加したで。"
 | 
			
		||||
  menu: "メニュー"
 | 
			
		||||
desktop/views/pages/user/user.header.vue:
 | 
			
		||||
  posts: "投稿"
 | 
			
		||||
  following: "フォロー"
 | 
			
		||||
@@ -1194,6 +1266,7 @@ desktop/views/pages/user/user.timeline.vue:
 | 
			
		||||
  default: "投稿"
 | 
			
		||||
  with-replies: "投稿と返信"
 | 
			
		||||
  with-media: "メディア"
 | 
			
		||||
  my-posts: "私の投稿"
 | 
			
		||||
  empty: "このユーザーはまだ何も投稿しとらんようや。"
 | 
			
		||||
desktop/views/widgets/messaging.vue:
 | 
			
		||||
  title: "メッセージ"
 | 
			
		||||
@@ -1392,7 +1465,6 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  notification-position: "通知どこ見せる?"
 | 
			
		||||
  notification-position-bottom: "ミナミの方"
 | 
			
		||||
  notification-position-top: "キタの方"
 | 
			
		||||
  theme: "テーマ"
 | 
			
		||||
  behavior: "動き"
 | 
			
		||||
  fetch-on-scroll: "スクロールしたらもっと見せてや"
 | 
			
		||||
  note-visibility: "投稿の公開範囲"
 | 
			
		||||
@@ -1416,7 +1488,6 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  signout: "さいなら"
 | 
			
		||||
  sound: "サウンド"
 | 
			
		||||
  enable-sounds: "サウンド鳴らす"
 | 
			
		||||
  mark-as-read-all-unread-notes: "全部もう読んだわ"
 | 
			
		||||
  password: "パスワード"
 | 
			
		||||
mobile/views/pages/user.vue:
 | 
			
		||||
  follows-you: "フォローされとるで"
 | 
			
		||||
@@ -1426,15 +1497,7 @@ mobile/views/pages/user.vue:
 | 
			
		||||
  overview: "こんなやつ"
 | 
			
		||||
  timeline: "タイムライン"
 | 
			
		||||
  media: "メディア"
 | 
			
		||||
  is-suspended: "このユーザーはあかんわ。凍結されとる。"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  unmute: "ミュートやめたる"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  unblock: "ブロックやめたる"
 | 
			
		||||
  years-old: "{age}歳"
 | 
			
		||||
  push-to-list: "リストに入れたる"
 | 
			
		||||
  select-list: "リスト選んでや"
 | 
			
		||||
  list-pushed: "{user}を{list}に追加したで"
 | 
			
		||||
mobile/views/pages/user/home.vue:
 | 
			
		||||
  recent-notes: "最近儲かりまっか?"
 | 
			
		||||
  images: "画像"
 | 
			
		||||
@@ -1484,7 +1547,6 @@ deck/deck.user-column.vue:
 | 
			
		||||
  activity: "アクティビティ"
 | 
			
		||||
  timeline: "タイムライン"
 | 
			
		||||
  pinned-notes: "ピン留めしはった投稿"
 | 
			
		||||
  push-to-a-list: "リストに入れたる"
 | 
			
		||||
docs:
 | 
			
		||||
  edit-this-page-on-github: "間違いや改善点を見つけましたか?"
 | 
			
		||||
  edit-this-page-on-github-link: "このページをGitHubで編集"
 | 
			
		||||
 
 | 
			
		||||
@@ -27,6 +27,7 @@ common:
 | 
			
		||||
  do-not-copy-paste: "여기에 코드를 입력하거나 붙여넣지 마십시오. 계정이 무단으로 사용될 수 있습니다."
 | 
			
		||||
  load-more: "더보기"
 | 
			
		||||
  enter-password: "비밀번호를 입력하여 주십시오"
 | 
			
		||||
  2fa: "二段階認証"
 | 
			
		||||
  got-it: "알겠습니다"
 | 
			
		||||
  customization-tips:
 | 
			
		||||
    title: "커스터마이징 도움말"
 | 
			
		||||
@@ -90,7 +91,6 @@ common:
 | 
			
		||||
    followers-desc: "자신의 팔로워에게만 공개"
 | 
			
		||||
    specified: "다이렉트"
 | 
			
		||||
    specified-desc: "지정한 사용자에게만 공개"
 | 
			
		||||
    private: "비공개"
 | 
			
		||||
    local-public: "공개 (로컬 한정)"
 | 
			
		||||
    local-home: "홈 (로컬 한정)"
 | 
			
		||||
    local-followers: "팔로워 (로컬 한정)"
 | 
			
		||||
@@ -110,8 +110,7 @@ common:
 | 
			
		||||
  my-token-regenerated: "당신의 토큰이 업데이트되었으므로 로그아웃합니다."
 | 
			
		||||
  i-like-sushi: "저는 (푸딩보다 차라리) 초밥이 좋아요"
 | 
			
		||||
  show-reversi-board-labels: "리버시 보드의 행과 열 레이블을 표시"
 | 
			
		||||
  use-white-black-reversi-stones: "리버시에 흑백 돌을 사용"
 | 
			
		||||
  use-contrast-reversi-stones: "리버시 아이콘의 대비를 높이기"
 | 
			
		||||
  use-avatar-reversi-stones: "리버시의 돌로 아바타를 사용"
 | 
			
		||||
  verified-user: "공식 계정"
 | 
			
		||||
  disable-animated-mfm: "글의 문자 애니메이션을 비활성화"
 | 
			
		||||
  suggest-recent-hashtags: "최근 해시태그를 글 작성란에 표시"
 | 
			
		||||
@@ -122,14 +121,21 @@ common:
 | 
			
		||||
  reduce-motion: "UI의 애니메이션 줄이기"
 | 
			
		||||
  this-setting-is-this-device-only: "이 장치만"
 | 
			
		||||
  use-os-default-emojis: "운영체제의 기본 이모지 사용"
 | 
			
		||||
  do-not-use-in-production: '이것은 개발 빌드입니다. 프로덕션 환경에서 사용하지 마십시오.'
 | 
			
		||||
  line-width: "선 두께"
 | 
			
		||||
  line-width-thin: "얇음"
 | 
			
		||||
  line-width-normal: "보통"
 | 
			
		||||
  line-width-thick: "두꺼움"
 | 
			
		||||
  hide-password: "비밀번호 숨기기"
 | 
			
		||||
  show-password: "비밀번호 표시"
 | 
			
		||||
  do-not-use-in-production: "이것은 개발 빌드입니다. 프로덕션 환경에서 사용하지 마십시오."
 | 
			
		||||
  user-suspended: "이 사용자는 정지된 상태입니다."
 | 
			
		||||
  is-remote-user: "이 유저 정보는 복사본입니다."
 | 
			
		||||
  is-remote-post: "이 글 정보는 복사본입니다."
 | 
			
		||||
  view-on-remote: "정확한 정보 보기"
 | 
			
		||||
  renoted-by: "{user}이(가) 리노트"
 | 
			
		||||
  error:
 | 
			
		||||
    title: '오류가 발생했습니다'
 | 
			
		||||
    retry: '다시 시도'
 | 
			
		||||
    title: "오류가 발생했습니다"
 | 
			
		||||
    retry: "다시 시도"
 | 
			
		||||
  reversi:
 | 
			
		||||
    drawn: "무승부"
 | 
			
		||||
    my-turn: "당신의 차례입니다"
 | 
			
		||||
@@ -165,6 +171,7 @@ common:
 | 
			
		||||
    hashtags: "해시태그"
 | 
			
		||||
  dev: "앱을 만드는 데 실패했습니다. 다시 시도하시기 바랍니다."
 | 
			
		||||
  ai-chan-kawaii: "아이쨩 귀여워"
 | 
			
		||||
  you: "당신"
 | 
			
		||||
auth/views/form.vue:
 | 
			
		||||
  share-access: "<i>{name}</i>가 당신의 계정에 엑세스하도록 허용하시겠습니까?"
 | 
			
		||||
  permission-ask: "이 앱은 다음의 권한을 요청합니다:"
 | 
			
		||||
@@ -260,6 +267,7 @@ common/views/components/media-banner.vue:
 | 
			
		||||
  sensitive: "열람주의"
 | 
			
		||||
  click-to-show: "클릭하여 표시"
 | 
			
		||||
common/views/components/theme.vue:
 | 
			
		||||
  theme: "테마"
 | 
			
		||||
  light-theme: "다크 모드가 아닐 때 사용하는 테마"
 | 
			
		||||
  dark-theme: "다크 모드일 때 사용하는 테마"
 | 
			
		||||
  light-themes: "밝은 테마"
 | 
			
		||||
@@ -276,6 +284,7 @@ common/views/components/theme.vue:
 | 
			
		||||
  base-theme: "기본 테마"
 | 
			
		||||
  base-theme-light: "밝음"
 | 
			
		||||
  base-theme-dark: "어두움"
 | 
			
		||||
  find-more-theme: "그 외 테마 찾아보기"
 | 
			
		||||
  theme-name: "테마명"
 | 
			
		||||
  preview-created-theme: "미리보기"
 | 
			
		||||
  invalid-theme: "테마가 올바르지 않습니다."
 | 
			
		||||
@@ -299,6 +308,7 @@ common/views/components/cw-button.vue:
 | 
			
		||||
  show: "더 보기"
 | 
			
		||||
  chars: "{count}문자"
 | 
			
		||||
  files: "{count}파일"
 | 
			
		||||
  poll: "투표"
 | 
			
		||||
common/views/components/messaging.vue:
 | 
			
		||||
  search-user: "사용자 찾기"
 | 
			
		||||
  you: "당신"
 | 
			
		||||
@@ -328,7 +338,9 @@ common/views/components/nav.vue:
 | 
			
		||||
  develop: "개발자"
 | 
			
		||||
  feedback: "피드백"
 | 
			
		||||
common/views/components/note-menu.vue:
 | 
			
		||||
  mention: "멘션"
 | 
			
		||||
  detail: "상세"
 | 
			
		||||
  copy-content: "내용 복사"
 | 
			
		||||
  copy-link: "링크 복사"
 | 
			
		||||
  favorite: "이 노트 즐겨찾기"
 | 
			
		||||
  unfavorite: "즐겨찾기에서 제거"
 | 
			
		||||
@@ -337,6 +349,17 @@ common/views/components/note-menu.vue:
 | 
			
		||||
  delete: "삭제"
 | 
			
		||||
  delete-confirm: "이 글을 삭제하시겠습니까?"
 | 
			
		||||
  remote: "글 원본 보기"
 | 
			
		||||
common/views/components/user-menu.vue:
 | 
			
		||||
  mention: "メンション"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  push-to-list: "リストに追加"
 | 
			
		||||
  select-list: "リストを選択してください"
 | 
			
		||||
  report-abuse: "スパムを報告"
 | 
			
		||||
  report-abuse-detail: "どのような迷惑行為を行っていますか?"
 | 
			
		||||
  report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
 | 
			
		||||
common/views/components/poll.vue:
 | 
			
		||||
  vote-to: "\"{}\"에 투표하기"
 | 
			
		||||
  vote-count: "{}표"
 | 
			
		||||
@@ -354,7 +377,7 @@ common/views/components/reaction-picker.vue:
 | 
			
		||||
  choose-reaction: "반응 선택"
 | 
			
		||||
common/views/components/emoji-picker.vue:
 | 
			
		||||
  custom-emoji: "커스텀 이모지"
 | 
			
		||||
  people: "명"
 | 
			
		||||
  people: "사람들"
 | 
			
		||||
  animals-and-nature: "동물 & 자연"
 | 
			
		||||
  food-and-drink: "음식 & 음료"
 | 
			
		||||
  activity: "활동"
 | 
			
		||||
@@ -403,6 +426,13 @@ common/views/components/stream-indicator.vue:
 | 
			
		||||
  connecting: "연결중"
 | 
			
		||||
  reconnecting: "다시 연결 중"
 | 
			
		||||
  connected: "연결 완료"
 | 
			
		||||
common/views/components/notification-settings.vue:
 | 
			
		||||
  title: "알림"
 | 
			
		||||
  mark-as-read-all-notifications: "모든 알림을 읽은 상태로 표시"
 | 
			
		||||
  mark-as-read-all-unread-notes: "모든 글을 읽은 상태로 표시"
 | 
			
		||||
  mark-as-read-all-talk-messages: "모든 대화를 읽은 상태로 표시"
 | 
			
		||||
  auto-watch: "글 자동 감시"
 | 
			
		||||
  auto-watch-desc: "리액션, 답글, 게시물에 대한 알림을 자동으로 받을 수 있도록 합니다."
 | 
			
		||||
common/views/components/integration-settings.vue:
 | 
			
		||||
  title: "서비스 연계"
 | 
			
		||||
  connect: "접속"
 | 
			
		||||
@@ -432,7 +462,6 @@ common/views/components/visibility-chooser.vue:
 | 
			
		||||
  followers-desc: "자신의 팔로워에게만 공개"
 | 
			
		||||
  specified: "다이렉트"
 | 
			
		||||
  specified-desc: "지정한 사용자에게만 공개"
 | 
			
		||||
  private: "비공개"
 | 
			
		||||
  local-public: "공개 (로컬 한정)"
 | 
			
		||||
  local-public-desc: "원격에는 공개하지 않음"
 | 
			
		||||
  local-home: "홈 (로컬 한정)"
 | 
			
		||||
@@ -461,6 +490,7 @@ common/views/components/profile-editor.vue:
 | 
			
		||||
  is-bot: "이 계정은 Bot입니다"
 | 
			
		||||
  is-locked: "팔로우를 수동으로 승인"
 | 
			
		||||
  careful-bot: "Bot의 팔로우만 수동으로 승인"
 | 
			
		||||
  auto-accept-followed: "팔로우중인 사용자로부터의 팔로우를 자동으로 승인"
 | 
			
		||||
  advanced: "기타"
 | 
			
		||||
  privacy: "프라이버시"
 | 
			
		||||
  save: "저장"
 | 
			
		||||
@@ -471,6 +501,13 @@ common/views/components/profile-editor.vue:
 | 
			
		||||
  email-address: "메일 주소"
 | 
			
		||||
  email-verified: "매일 주소가 확인되었습니다"
 | 
			
		||||
  email-not-verified: "메일 주소가 확인되지 않았습니다. 받은 편지함을 확인하여 주시기 바랍니다."
 | 
			
		||||
common/views/components/user-list-editor.vue:
 | 
			
		||||
  users: "사용자"
 | 
			
		||||
  rename: "리스트 이름 바꾸기"
 | 
			
		||||
  delete: "리스트 삭제"
 | 
			
		||||
  remove-user: "이 리스트에서 제거"
 | 
			
		||||
  delete-are-you-sure: "리스트 \"$1\"을 삭제하시겠습니까?"
 | 
			
		||||
  deleted: "삭제하였습니다"
 | 
			
		||||
common/views/widgets/broadcast.vue:
 | 
			
		||||
  fetching: "확인중"
 | 
			
		||||
  no-broadcasts: "공지사항이 없습니다"
 | 
			
		||||
@@ -520,11 +557,11 @@ common/views/widgets/tips.vue:
 | 
			
		||||
  tips-line19: "몇몇 창은 브라우저 밖으로 분리할 수 있습니다"
 | 
			
		||||
  tips-line20: "달력 위젯의 퍼센트는 경과된 비율을 나타냅니다"
 | 
			
		||||
  tips-line21: "API를 사용하여 bot의 개발 등을 할 수 있습니다"
 | 
			
		||||
  tips-line23: "마유 귀여워요 마유"
 | 
			
		||||
  tips-line23: "아이 귀여워요 아이"
 | 
			
		||||
  tips-line24: "Misskey는 2014년에 서비스를 시작했습니다"
 | 
			
		||||
  tips-line25: "대응하는 브라우저인 경우 Misskey를 열어놓지 않아도 알림을 받을 수 있습니다"
 | 
			
		||||
common/views/pages/404.vue:
 | 
			
		||||
  page-not-found: "ページが見つかりませんでした"
 | 
			
		||||
common/views/pages/not-found.vue:
 | 
			
		||||
  page-not-found: "페이지를 찾을 수 없습니다"
 | 
			
		||||
common/views/pages/follow.vue:
 | 
			
		||||
  signed-in-as: "{}으로 로그인"
 | 
			
		||||
  following: "팔로우 중"
 | 
			
		||||
@@ -660,10 +697,12 @@ desktop/views/components/note-detail.vue:
 | 
			
		||||
  location: "위치 정보"
 | 
			
		||||
  renote: "리노트"
 | 
			
		||||
  add-reaction: "리액션 추가"
 | 
			
		||||
  undo-reaction: "리액션 취소"
 | 
			
		||||
desktop/views/components/note.vue:
 | 
			
		||||
  reply: "답글 달기"
 | 
			
		||||
  renote: "리노트"
 | 
			
		||||
  add-reaction: "리액션 추가"
 | 
			
		||||
  undo-reaction: "리액션 취소"
 | 
			
		||||
  detail: "상세"
 | 
			
		||||
  private: "이 글은 비공개입니다"
 | 
			
		||||
  deleted: "이 글은 삭제되었습니다"
 | 
			
		||||
@@ -734,7 +773,6 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  security: "보안"
 | 
			
		||||
  signin: "로그인 기록"
 | 
			
		||||
  password: "비밀번호"
 | 
			
		||||
  2fa: "2단계 인증"
 | 
			
		||||
  other: "기타"
 | 
			
		||||
  license: "라이선스"
 | 
			
		||||
  theme: "테마"
 | 
			
		||||
@@ -748,9 +786,6 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  web-search-engine-desc: "예: https://www.google.com/?#q={{query}}"
 | 
			
		||||
  auto-popout: "창 자동 팝아웃"
 | 
			
		||||
  auto-popout-desc: "창이 열릴 때 팝아웃 (브라우저 밖으로 분리) 이 가능한 경우 자동으로 팝아웃합니다. 이 설정은 브라우저에 저장됩니다."
 | 
			
		||||
  advanced: "고급 설정"
 | 
			
		||||
  api-via-stream: "스트리밍을 사용한 API 요청"
 | 
			
		||||
  api-via-stream-desc: "이 설정을 ON으로 하면 websocket 연결을 통하여 API 요청을 합니다 (성능 향상을 기대할 수 있습니다). OFF로 두는 경우 네이티브 fetch API가 사용됩니다. 이 설정은 이 장치에만 유효합니다."
 | 
			
		||||
  deck-nav: "덱 내 탐색"
 | 
			
		||||
  deck-nav-desc: "덱을 사용중일 때, 내비게이션이 발생하였을 경우 페이지를 이동하지 않고 일시적으로 임시 칼럼을 생성하도록 합니다."
 | 
			
		||||
  deck-default: "덱을 기본 UI로 설정"
 | 
			
		||||
@@ -793,8 +828,6 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  cache-warn: "지우기를 실행하면 브라우저에 저장된 계정 정보 캐시, 글이나 답글 및 메시지의 임시 저장, 그 외 데이터 (설정 정보 포함) 가 삭제 됩니다. 지우기 작업을 수행한 후 페이지를 다시 로드해야 합니다."
 | 
			
		||||
  cache-cleared: "캐시를 삭제하였습니다"
 | 
			
		||||
  cache-cleared-desc: "페이지를 새로고침해 주십시오."
 | 
			
		||||
  auto-watch: "글 자동 감시"
 | 
			
		||||
  auto-watch-desc: "리액션, 답글, 게시물에 대한 알림을 자동으로 받을 수 있도록 합니다."
 | 
			
		||||
  about: "Misskey에 대하여"
 | 
			
		||||
  operator: "이 서버의 운영자"
 | 
			
		||||
  update: "Misskey Update"
 | 
			
		||||
@@ -833,6 +866,7 @@ desktop/views/components/settings.2fa.vue:
 | 
			
		||||
  enter-password: "비밀번호를 입력하여 주십시오"
 | 
			
		||||
  authenticator: "먼저, 가지고 계신 장치에 Google Authenticator를 설치해야 합니다:"
 | 
			
		||||
  howtoinstall: "설치 방법은 여기에 있습니다"
 | 
			
		||||
  token: "토큰"
 | 
			
		||||
  scan: "다음으로 표시되어 있는 QR 코드를 스캔합니다:"
 | 
			
		||||
  done: "사용중이신 장치에 표시된 토큰을 입력해주시면 마무리됩니다:"
 | 
			
		||||
  submit: "완료"
 | 
			
		||||
@@ -847,13 +881,13 @@ common/views/components/api-settings.vue:
 | 
			
		||||
  token: "Token:"
 | 
			
		||||
  enter-password: "비밀번호를 입력하여 주십시오"
 | 
			
		||||
  console:
 | 
			
		||||
    title: 'API 콘솔'
 | 
			
		||||
    endpoint: '엔드포인트'
 | 
			
		||||
    parameter: '매개변수'
 | 
			
		||||
    title: "API 콘솔"
 | 
			
		||||
    endpoint: "엔드포인트"
 | 
			
		||||
    parameter: "매개변수"
 | 
			
		||||
    credential-info: "\"i\" 패러미터는 자동으로 추가됩니다."
 | 
			
		||||
    send: '전송'
 | 
			
		||||
    sending: '응답을 기다리는 중'
 | 
			
		||||
    response: '결과'
 | 
			
		||||
    send: "전송"
 | 
			
		||||
    sending: "응답을 기다리는 중"
 | 
			
		||||
    response: "결과"
 | 
			
		||||
desktop/views/components/settings.apps.vue:
 | 
			
		||||
  no-apps: "연결된 어플리케이션이 없습니다"
 | 
			
		||||
common/views/components/drive-settings.vue:
 | 
			
		||||
@@ -955,6 +989,7 @@ admin/views/index.vue:
 | 
			
		||||
  federation: "연합"
 | 
			
		||||
  announcements: "공지사항"
 | 
			
		||||
  hashtags: "해시태그"
 | 
			
		||||
  abuse: "スパム報告"
 | 
			
		||||
  back-to-misskey: "Misskey로 돌아가기"
 | 
			
		||||
admin/views/dashboard.vue:
 | 
			
		||||
  dashboard: "대시보드"
 | 
			
		||||
@@ -964,13 +999,19 @@ admin/views/dashboard.vue:
 | 
			
		||||
  instances: "인스턴스"
 | 
			
		||||
  this-instance: "이 인스턴스"
 | 
			
		||||
  federated: "연합"
 | 
			
		||||
admin/views/abuse.vue:
 | 
			
		||||
  title: "スパム報告"
 | 
			
		||||
  target: "対象"
 | 
			
		||||
  reporter: "報告者"
 | 
			
		||||
  details: "詳細"
 | 
			
		||||
  remove-report: "削除"
 | 
			
		||||
admin/views/instance.vue:
 | 
			
		||||
  instance: "인스턴스"
 | 
			
		||||
  instance-name: "인스턴스 이름"
 | 
			
		||||
  instance-description: "인스턴스의 소개"
 | 
			
		||||
  host: "관리자"
 | 
			
		||||
  banner-url: "배너 이미지 URL"
 | 
			
		||||
  error-image-url: "エラー画像URL"
 | 
			
		||||
  error-image-url: "오류 이미지 URL"
 | 
			
		||||
  languages: "인스턴스의 대상 언어"
 | 
			
		||||
  languages-desc: "공백으로 구분하여 여러 개 설정할 수 있습니다."
 | 
			
		||||
  maintainer-config: "관리자 정보"
 | 
			
		||||
@@ -1010,6 +1051,8 @@ admin/views/instance.vue:
 | 
			
		||||
  max-note-text-length: "글의 최대 문자수"
 | 
			
		||||
  disable-registration: "사용자 등록 비활성화"
 | 
			
		||||
  disable-local-timeline: "로컬 타임라인 비활성화"
 | 
			
		||||
  disable-global-timeline: "글로벌 타임라인 비활성화"
 | 
			
		||||
  disabling-timelines-info: "これらのタイムラインを無効にしても、管理者およびモデレーターは引き続き利用できます。"
 | 
			
		||||
  invite: "초대"
 | 
			
		||||
  save: "저장"
 | 
			
		||||
  saved: "저장하였습니다"
 | 
			
		||||
@@ -1029,6 +1072,12 @@ admin/views/instance.vue:
 | 
			
		||||
  smtp-port: "SMTP 포트"
 | 
			
		||||
  smtp-user: "SMTP 사용자"
 | 
			
		||||
  smtp-pass: "SMTP 비밀번호"
 | 
			
		||||
  serviceworker-config: "ServiceWorker"
 | 
			
		||||
  enable-serviceworker: "ServiceWorker 사용"
 | 
			
		||||
  serviceworker-info: "푸시알림을 수행하려면 사용해야 합니다."
 | 
			
		||||
  vapid-publickey: "VAPID 공개키"
 | 
			
		||||
  vapid-privatekey: "VAPID 개인키"
 | 
			
		||||
  vapid-info: "ServiceWorker를 사용하는 경우 VAPID 키 쌍을 생성해야 합니다. 셸에서 다음과 같이 합니다:"
 | 
			
		||||
admin/views/charts.vue:
 | 
			
		||||
  title: "차트"
 | 
			
		||||
  per-day: "1일마다"
 | 
			
		||||
@@ -1047,6 +1096,7 @@ admin/views/charts.vue:
 | 
			
		||||
    notes-total: "글 누적 수"
 | 
			
		||||
    users: "사용자 증감"
 | 
			
		||||
    users-total: "사용자 누적"
 | 
			
		||||
    active-users: "アクティブユーザー数"
 | 
			
		||||
    drive: "드라이브 사용량 증감"
 | 
			
		||||
    drive-total: "드라이브 사용량 누적"
 | 
			
		||||
    drive-files: "드라이브 파일 수 증감"
 | 
			
		||||
@@ -1054,6 +1104,28 @@ admin/views/charts.vue:
 | 
			
		||||
    network-requests: "요청"
 | 
			
		||||
    network-time: "응답시간"
 | 
			
		||||
    network-usage: "통신량"
 | 
			
		||||
admin/views/drive.vue:
 | 
			
		||||
  operation: "操作"
 | 
			
		||||
  fileid-or-url: "ファイルIDまたはファイルURL"
 | 
			
		||||
  file-not-found: "ファイルが見つかりません"
 | 
			
		||||
  lookup: "照会"
 | 
			
		||||
  sort:
 | 
			
		||||
    title: "정렬"
 | 
			
		||||
    createdAtAsc: "업로드 날짜 오랜 순"
 | 
			
		||||
    createdAtDesc: "업로드 날짜 최신순"
 | 
			
		||||
    sizeAsc: "크기가 작은 순"
 | 
			
		||||
    sizeDesc: "크기가 큰 순"
 | 
			
		||||
  origin:
 | 
			
		||||
    title: "출처"
 | 
			
		||||
    combined: "로컬 + 리모트"
 | 
			
		||||
    local: "로컬"
 | 
			
		||||
    remote: "리모트"
 | 
			
		||||
  delete: "삭제"
 | 
			
		||||
  deleted: "삭제하였습니다"
 | 
			
		||||
  mark-as-sensitive: "열람주의로 설정"
 | 
			
		||||
  unmark-as-sensitive: "열람주의 해제"
 | 
			
		||||
  marked-as-sensitive: "閲覧注意に設定しました"
 | 
			
		||||
  unmarked-as-sensitive: "閲覧注意を解除しました"
 | 
			
		||||
admin/views/users.vue:
 | 
			
		||||
  operation: "작업"
 | 
			
		||||
  username-or-userid: "사용자명 혹은 사용자 ID"
 | 
			
		||||
@@ -1077,6 +1149,14 @@ admin/views/users.vue:
 | 
			
		||||
      createdAtDesc: "등록일이 최신인 순"
 | 
			
		||||
      updatedAtAsc: "수정일이 오래된 순"
 | 
			
		||||
      updatedAtDesc: "수정일이 최신인 순"
 | 
			
		||||
    state:
 | 
			
		||||
      title: "상태"
 | 
			
		||||
      all: "모두"
 | 
			
		||||
      admin: "관리자"
 | 
			
		||||
      moderator: "모더레이터"
 | 
			
		||||
      adminOrModerator: "관리자+모더레이터"
 | 
			
		||||
      verified: "공식 계정"
 | 
			
		||||
      suspended: "정지됨"
 | 
			
		||||
    origin:
 | 
			
		||||
      title: "위치 (오리진)"
 | 
			
		||||
      combined: "로컬 + 원격"
 | 
			
		||||
@@ -1089,6 +1169,8 @@ admin/views/moderators.vue:
 | 
			
		||||
    title: "모더레이터 등록"
 | 
			
		||||
    add: "등록"
 | 
			
		||||
    added: "모더레이터를 등록하였습니다"
 | 
			
		||||
    remove: "해제"
 | 
			
		||||
    removed: "모더레이터 등록을 해제했습니다"
 | 
			
		||||
admin/views/emoji.vue:
 | 
			
		||||
  add-emoji:
 | 
			
		||||
    title: "이모지 등록"
 | 
			
		||||
@@ -1170,17 +1252,7 @@ desktop/views/pages/user/user.photos.vue:
 | 
			
		||||
  no-photos: "사진이 없습니다"
 | 
			
		||||
desktop/views/pages/user/user.profile.vue:
 | 
			
		||||
  follows-you: "당신을 팔로우합니다"
 | 
			
		||||
  stalk: "스토킹"
 | 
			
		||||
  stalking: "스토킹하고 있습니다"
 | 
			
		||||
  unstalk: "스토킹 중단"
 | 
			
		||||
  mute: "뮤트"
 | 
			
		||||
  muted: "뮤트하였습니다"
 | 
			
		||||
  unmute: "뮤트 해제"
 | 
			
		||||
  block: "차단"
 | 
			
		||||
  unblock: "차단 해제"
 | 
			
		||||
  block-confirm: "이 사용자를 차단하시겠습니까?"
 | 
			
		||||
  push-to-a-list: "리스트에 추가"
 | 
			
		||||
  list-pushed: "{user}을(를) {list}에 추가하였습니다."
 | 
			
		||||
  menu: "メニュー"
 | 
			
		||||
desktop/views/pages/user/user.header.vue:
 | 
			
		||||
  posts: "글"
 | 
			
		||||
  following: "팔로잉"
 | 
			
		||||
@@ -1194,6 +1266,7 @@ desktop/views/pages/user/user.timeline.vue:
 | 
			
		||||
  default: "글"
 | 
			
		||||
  with-replies: "글과 답글"
 | 
			
		||||
  with-media: "미디어"
 | 
			
		||||
  my-posts: "내 글"
 | 
			
		||||
  empty: "이 사용자는 아직 아무것도 게시하지 않은 것 같습니다."
 | 
			
		||||
desktop/views/widgets/messaging.vue:
 | 
			
		||||
  title: "메시지"
 | 
			
		||||
@@ -1392,7 +1465,6 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  notification-position: "알림 표시"
 | 
			
		||||
  notification-position-bottom: "아래"
 | 
			
		||||
  notification-position-top: "위"
 | 
			
		||||
  theme: "테마"
 | 
			
		||||
  behavior: "동작"
 | 
			
		||||
  fetch-on-scroll: "스크롤하여 자동으로 불러오기"
 | 
			
		||||
  note-visibility: "게시물의 공개 범위"
 | 
			
		||||
@@ -1416,7 +1488,6 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  signout: "로그아웃"
 | 
			
		||||
  sound: "소리"
 | 
			
		||||
  enable-sounds: "소리 사용"
 | 
			
		||||
  mark-as-read-all-unread-notes: "모든 글을 읽은 상태로 표시"
 | 
			
		||||
  password: "비밀번호"
 | 
			
		||||
mobile/views/pages/user.vue:
 | 
			
		||||
  follows-you: "당신을 팔로우합니다"
 | 
			
		||||
@@ -1426,15 +1497,7 @@ mobile/views/pages/user.vue:
 | 
			
		||||
  overview: "요약"
 | 
			
		||||
  timeline: "타임라인"
 | 
			
		||||
  media: "미디어"
 | 
			
		||||
  is-suspended: "이 사용자는 정지된 상태입니다."
 | 
			
		||||
  mute: "뮤트"
 | 
			
		||||
  unmute: "뮤트 해제"
 | 
			
		||||
  block: "차단"
 | 
			
		||||
  unblock: "차단 해제"
 | 
			
		||||
  years-old: "{age}세"
 | 
			
		||||
  push-to-list: "리스트에 추가"
 | 
			
		||||
  select-list: "목록을 선택하여 주십시오"
 | 
			
		||||
  list-pushed: "{user}을(를) {list}에 추가하였습니다"
 | 
			
		||||
mobile/views/pages/user/home.vue:
 | 
			
		||||
  recent-notes: "최근 글"
 | 
			
		||||
  images: "이미지"
 | 
			
		||||
@@ -1484,7 +1547,6 @@ deck/deck.user-column.vue:
 | 
			
		||||
  activity: "활동"
 | 
			
		||||
  timeline: "타임라인"
 | 
			
		||||
  pinned-notes: "고정해놓은 글"
 | 
			
		||||
  push-to-a-list: "리스트에 추가"
 | 
			
		||||
docs:
 | 
			
		||||
  edit-this-page-on-github: "틀린 점이나 개선할 점을 찾으셨나요?"
 | 
			
		||||
  edit-this-page-on-github-link: "이 페이지를 GitHub에서 편집"
 | 
			
		||||
 
 | 
			
		||||
@@ -27,6 +27,7 @@ common:
 | 
			
		||||
  do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
 | 
			
		||||
  load-more: "もっと読み込む"
 | 
			
		||||
  enter-password: "パスワードを入力してください"
 | 
			
		||||
  2fa: "二段階認証"
 | 
			
		||||
  got-it: "わかった"
 | 
			
		||||
  customization-tips:
 | 
			
		||||
    title: "カスタマイズのヒント"
 | 
			
		||||
@@ -90,7 +91,6 @@ common:
 | 
			
		||||
    followers-desc: "自分のフォロワーにのみ公開"
 | 
			
		||||
    specified: "ダイレクト"
 | 
			
		||||
    specified-desc: "指定したユーザーにのみ公開"
 | 
			
		||||
    private: "非公開"
 | 
			
		||||
    local-public: "公開 (ローカルのみ)"
 | 
			
		||||
    local-home: "ホーム (ローカルのみ)"
 | 
			
		||||
    local-followers: "フォロワー (ローカルのみ)"
 | 
			
		||||
@@ -110,8 +110,7 @@ common:
 | 
			
		||||
  my-token-regenerated: "Je sleutel is gegenereerd; je wordt nu uitgelogd."
 | 
			
		||||
  i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
 | 
			
		||||
  show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
 | 
			
		||||
  use-white-black-reversi-stones: "リバーシに白黒の石を使う"
 | 
			
		||||
  use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
 | 
			
		||||
  use-avatar-reversi-stones: "リバーシの石にアバターを使う"
 | 
			
		||||
  verified-user: "公式アカウント"
 | 
			
		||||
  disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
 | 
			
		||||
  suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
 | 
			
		||||
@@ -122,14 +121,21 @@ common:
 | 
			
		||||
  reduce-motion: "UIの動きを減らす"
 | 
			
		||||
  this-setting-is-this-device-only: "このデバイスのみ"
 | 
			
		||||
  use-os-default-emojis: "OS標準の絵文字を使用"
 | 
			
		||||
  do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
 | 
			
		||||
  line-width: "線の太さ"
 | 
			
		||||
  line-width-thin: "細い"
 | 
			
		||||
  line-width-normal: "普通"
 | 
			
		||||
  line-width-thick: "太い"
 | 
			
		||||
  hide-password: "パスワードを隠す"
 | 
			
		||||
  show-password: "パスワードを表示する"
 | 
			
		||||
  do-not-use-in-production: "これは開発ビルドです。本番環境で使用しないでください。"
 | 
			
		||||
  user-suspended: "このユーザーは凍結されています。"
 | 
			
		||||
  is-remote-user: "このユーザー情報はコピーです。"
 | 
			
		||||
  is-remote-post: "この投稿情報はコピーです。"
 | 
			
		||||
  view-on-remote: "正確な情報を見る"
 | 
			
		||||
  renoted-by: "{user}がRenote"
 | 
			
		||||
  error:
 | 
			
		||||
    title: '問題が発生しました'
 | 
			
		||||
    retry: 'やり直す'
 | 
			
		||||
    title: "問題が発生しました"
 | 
			
		||||
    retry: "やり直す"
 | 
			
		||||
  reversi:
 | 
			
		||||
    drawn: "引き分け"
 | 
			
		||||
    my-turn: "あなたのターンです"
 | 
			
		||||
@@ -165,6 +171,7 @@ common:
 | 
			
		||||
    hashtags: "ハッシュタグ"
 | 
			
		||||
  dev: "アプリの作成に失敗しました。再度お試しください。"
 | 
			
		||||
  ai-chan-kawaii: "藍ちゃかわいい"
 | 
			
		||||
  you: "あなた"
 | 
			
		||||
auth/views/form.vue:
 | 
			
		||||
  share-access: "<i>{name}</i>があなたのアカウントにアクセスすることを許可しますか?"
 | 
			
		||||
  permission-ask: "このアプリは次の権限を要求しています:"
 | 
			
		||||
@@ -260,6 +267,7 @@ common/views/components/media-banner.vue:
 | 
			
		||||
  sensitive: "閲覧注意"
 | 
			
		||||
  click-to-show: "クリックして表示"
 | 
			
		||||
common/views/components/theme.vue:
 | 
			
		||||
  theme: "テーマ"
 | 
			
		||||
  light-theme: "非ダークモード時に使用するテーマ"
 | 
			
		||||
  dark-theme: "ダークモード時に使用するテーマ"
 | 
			
		||||
  light-themes: "明るいテーマ"
 | 
			
		||||
@@ -276,6 +284,7 @@ common/views/components/theme.vue:
 | 
			
		||||
  base-theme: "ベーステーマ"
 | 
			
		||||
  base-theme-light: "Light"
 | 
			
		||||
  base-theme-dark: "Dark"
 | 
			
		||||
  find-more-theme: "その他のテーマを入手"
 | 
			
		||||
  theme-name: "テーマ名"
 | 
			
		||||
  preview-created-theme: "プレビュー"
 | 
			
		||||
  invalid-theme: "テーマが正しくありません。"
 | 
			
		||||
@@ -299,6 +308,7 @@ common/views/components/cw-button.vue:
 | 
			
		||||
  show: "もっと見る"
 | 
			
		||||
  chars: "{count}文字"
 | 
			
		||||
  files: "{count}ファイル"
 | 
			
		||||
  poll: "アンケート"
 | 
			
		||||
common/views/components/messaging.vue:
 | 
			
		||||
  search-user: "Gebruiker zoeken"
 | 
			
		||||
  you: "Jij"
 | 
			
		||||
@@ -328,7 +338,9 @@ common/views/components/nav.vue:
 | 
			
		||||
  develop: "Ontwikkelaars"
 | 
			
		||||
  feedback: "Feedback"
 | 
			
		||||
common/views/components/note-menu.vue:
 | 
			
		||||
  mention: "メンション"
 | 
			
		||||
  detail: "詳細"
 | 
			
		||||
  copy-content: "内容をコピー"
 | 
			
		||||
  copy-link: "リンクをコピー"
 | 
			
		||||
  favorite: "Deze notitie toevoegen aan favorieten"
 | 
			
		||||
  unfavorite: "お気に入り解除"
 | 
			
		||||
@@ -337,6 +349,17 @@ common/views/components/note-menu.vue:
 | 
			
		||||
  delete: "削除"
 | 
			
		||||
  delete-confirm: "この投稿を削除しますか?"
 | 
			
		||||
  remote: "Origineel tonen"
 | 
			
		||||
common/views/components/user-menu.vue:
 | 
			
		||||
  mention: "メンション"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  push-to-list: "リストに追加"
 | 
			
		||||
  select-list: "リストを選択してください"
 | 
			
		||||
  report-abuse: "スパムを報告"
 | 
			
		||||
  report-abuse-detail: "どのような迷惑行為を行っていますか?"
 | 
			
		||||
  report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
 | 
			
		||||
common/views/components/poll.vue:
 | 
			
		||||
  vote-to: "Stemmen op '{}'"
 | 
			
		||||
  vote-count: "{} stemmen"
 | 
			
		||||
@@ -403,6 +426,13 @@ common/views/components/stream-indicator.vue:
 | 
			
		||||
  connecting: "Bezig met verbinden"
 | 
			
		||||
  reconnecting: "Bezig met herverbinden"
 | 
			
		||||
  connected: "Verbonden"
 | 
			
		||||
common/views/components/notification-settings.vue:
 | 
			
		||||
  title: "通知"
 | 
			
		||||
  mark-as-read-all-notifications: "すべての通知を既読にする"
 | 
			
		||||
  mark-as-read-all-unread-notes: "すべての投稿を既読にする"
 | 
			
		||||
  mark-as-read-all-talk-messages: "すべてのトークを既読にする"
 | 
			
		||||
  auto-watch: "投稿の自動ウォッチ"
 | 
			
		||||
  auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。"
 | 
			
		||||
common/views/components/integration-settings.vue:
 | 
			
		||||
  title: "サービス連携"
 | 
			
		||||
  connect: "接続する"
 | 
			
		||||
@@ -432,7 +462,6 @@ common/views/components/visibility-chooser.vue:
 | 
			
		||||
  followers-desc: "自分のフォロワーにのみ公開"
 | 
			
		||||
  specified: "ダイレクト"
 | 
			
		||||
  specified-desc: "指定したユーザーにのみ公開"
 | 
			
		||||
  private: "非公開"
 | 
			
		||||
  local-public: "公開 (ローカルのみ)"
 | 
			
		||||
  local-public-desc: "リモートへは公開しない"
 | 
			
		||||
  local-home: "ホーム (ローカルのみ)"
 | 
			
		||||
@@ -461,6 +490,7 @@ common/views/components/profile-editor.vue:
 | 
			
		||||
  is-bot: "このアカウントはBotです"
 | 
			
		||||
  is-locked: "フォローを承認制にする"
 | 
			
		||||
  careful-bot: "Botからのフォローだけ承認制にする"
 | 
			
		||||
  auto-accept-followed: "フォローしているユーザーからのフォローを自動承認する"
 | 
			
		||||
  advanced: "その他"
 | 
			
		||||
  privacy: "プライバシー"
 | 
			
		||||
  save: "保存"
 | 
			
		||||
@@ -471,6 +501,13 @@ common/views/components/profile-editor.vue:
 | 
			
		||||
  email-address: "メールアドレス"
 | 
			
		||||
  email-verified: "メールアドレスが確認されました"
 | 
			
		||||
  email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
 | 
			
		||||
common/views/components/user-list-editor.vue:
 | 
			
		||||
  users: "ユーザー"
 | 
			
		||||
  rename: "リスト名を変更"
 | 
			
		||||
  delete: "リストを削除"
 | 
			
		||||
  remove-user: "このリストから削除"
 | 
			
		||||
  delete-are-you-sure: "リスト「$1」を削除しますか?"
 | 
			
		||||
  deleted: "削除しました"
 | 
			
		||||
common/views/widgets/broadcast.vue:
 | 
			
		||||
  fetching: "Bezig met ophalen"
 | 
			
		||||
  no-broadcasts: "Geen uitzendingen"
 | 
			
		||||
@@ -520,10 +557,10 @@ common/views/widgets/tips.vue:
 | 
			
		||||
  tips-line19: "いくつかのウィンドウはブラウザの外に切り離すことができます"
 | 
			
		||||
  tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示しています"
 | 
			
		||||
  tips-line21: "APIを利用してbotの開発なども行えます"
 | 
			
		||||
  tips-line23: "まゆかわいいよまゆ"
 | 
			
		||||
  tips-line23: "藍かわいいよ藍"
 | 
			
		||||
  tips-line24: "Misskeyは2014年にサービスを開始しました"
 | 
			
		||||
  tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
 | 
			
		||||
common/views/pages/404.vue:
 | 
			
		||||
common/views/pages/not-found.vue:
 | 
			
		||||
  page-not-found: "ページが見つかりませんでした"
 | 
			
		||||
common/views/pages/follow.vue:
 | 
			
		||||
  signed-in-as: "{}としてサインイン中"
 | 
			
		||||
@@ -660,10 +697,12 @@ desktop/views/components/note-detail.vue:
 | 
			
		||||
  location: "Locatie"
 | 
			
		||||
  renote: "Renote"
 | 
			
		||||
  add-reaction: "リアクション"
 | 
			
		||||
  undo-reaction: "リアクション解除"
 | 
			
		||||
desktop/views/components/note.vue:
 | 
			
		||||
  reply: "返信"
 | 
			
		||||
  renote: "Renote"
 | 
			
		||||
  add-reaction: "リアクション"
 | 
			
		||||
  undo-reaction: "リアクション解除"
 | 
			
		||||
  detail: "詳細"
 | 
			
		||||
  private: "この投稿は非公開です"
 | 
			
		||||
  deleted: "この投稿は削除されました"
 | 
			
		||||
@@ -691,7 +730,7 @@ desktop/views/components/post-form.vue:
 | 
			
		||||
  attach-media-from-local: "Media bijvoegen van je computer"
 | 
			
		||||
  attach-media-from-drive: "Media bijvoegen uit je Drive"
 | 
			
		||||
  attach-cancel: "Bijlage annuleren"
 | 
			
		||||
  insert-a-kao: "v(‘ω’)v"
 | 
			
		||||
  insert-a-kao: "v('ω')v"
 | 
			
		||||
  create-poll: "Peiling creëren"
 | 
			
		||||
  text-remain: "{} resterende tekens"
 | 
			
		||||
  recent-tags: "最近"
 | 
			
		||||
@@ -734,7 +773,6 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  security: "Beveiliging"
 | 
			
		||||
  signin: "Inloggeschiedenis"
 | 
			
		||||
  password: "Wachtwoord"
 | 
			
		||||
  2fa: "Authenticatie in twee stappen"
 | 
			
		||||
  other: "Overig"
 | 
			
		||||
  license: "Licentie"
 | 
			
		||||
  theme: "テーマ"
 | 
			
		||||
@@ -748,9 +786,6 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
 | 
			
		||||
  auto-popout: "Venster automatisch uitvouwen"
 | 
			
		||||
  auto-popout-desc: "Venster uitvouwen, indien mogelijk. Deze instelling wordt opgeslagen in je browser."
 | 
			
		||||
  advanced: "Geavanceerde instellingen"
 | 
			
		||||
  api-via-stream: "API-verzoek via stream"
 | 
			
		||||
  api-via-stream-desc: "API-verzoek wordt uitgevoerd via de WebSocket-verbinding i.p.v. de ingebouwde ophaal-API (voor verbeterde prestaties). Deze instelling wordt opgeslagen in je browser."
 | 
			
		||||
  deck-nav: "デッキ内ナビゲーション"
 | 
			
		||||
  deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
 | 
			
		||||
  deck-default: "デッキをデフォルトのUIにする"
 | 
			
		||||
@@ -793,8 +828,6 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  cache-warn: "De cache van je accountinformatie/berichten/antwoorden/instellingen wordt verwijderd. Je moet de pagina herladen na het opschonen."
 | 
			
		||||
  cache-cleared: "Cache opgeschoond"
 | 
			
		||||
  cache-cleared-desc: "Herlaad de pagina."
 | 
			
		||||
  auto-watch: "Automatisch volgen"
 | 
			
		||||
  auto-watch-desc: "Automatisch meldingen ontvangen over het bericht/antwoord."
 | 
			
		||||
  about: "Over Misskey"
 | 
			
		||||
  operator: "De administrator van deze instantie"
 | 
			
		||||
  update: "Misskey-update"
 | 
			
		||||
@@ -833,6 +866,7 @@ desktop/views/components/settings.2fa.vue:
 | 
			
		||||
  enter-password: "Voer het wachtwoord in"
 | 
			
		||||
  authenticator: "Installeer eerst Google Authenticator op je apparaat:"
 | 
			
		||||
  howtoinstall: "Hoe installeer ik dit?"
 | 
			
		||||
  token: "トークン"
 | 
			
		||||
  scan: "Scan daarna de QR-code:"
 | 
			
		||||
  done: "Voer de op je apparaat getoonde sleutel in:"
 | 
			
		||||
  submit: "Versturen"
 | 
			
		||||
@@ -847,13 +881,13 @@ common/views/components/api-settings.vue:
 | 
			
		||||
  token: "Token:"
 | 
			
		||||
  enter-password: "パスワードを入力してください"
 | 
			
		||||
  console:
 | 
			
		||||
    title: 'APIコンソール'
 | 
			
		||||
    endpoint: 'エンドポイント'
 | 
			
		||||
    parameter: 'パラメータ'
 | 
			
		||||
    title: "APIコンソール"
 | 
			
		||||
    endpoint: "エンドポイント"
 | 
			
		||||
    parameter: "パラメータ"
 | 
			
		||||
    credential-info: "「i」パラメータは自動で付与されます。"
 | 
			
		||||
    send: '送信'
 | 
			
		||||
    sending: '応答待ち'
 | 
			
		||||
    response: '結果'
 | 
			
		||||
    send: "送信"
 | 
			
		||||
    sending: "応答待ち"
 | 
			
		||||
    response: "結果"
 | 
			
		||||
desktop/views/components/settings.apps.vue:
 | 
			
		||||
  no-apps: "連携しているアプリケーションはありません"
 | 
			
		||||
common/views/components/drive-settings.vue:
 | 
			
		||||
@@ -955,6 +989,7 @@ admin/views/index.vue:
 | 
			
		||||
  federation: "連合"
 | 
			
		||||
  announcements: "お知らせ"
 | 
			
		||||
  hashtags: "ハッシュタグ"
 | 
			
		||||
  abuse: "スパム報告"
 | 
			
		||||
  back-to-misskey: "Misskeyに戻る"
 | 
			
		||||
admin/views/dashboard.vue:
 | 
			
		||||
  dashboard: "ダッシュボード"
 | 
			
		||||
@@ -964,6 +999,12 @@ admin/views/dashboard.vue:
 | 
			
		||||
  instances: "インスタンス"
 | 
			
		||||
  this-instance: "このインスタンス"
 | 
			
		||||
  federated: "連合"
 | 
			
		||||
admin/views/abuse.vue:
 | 
			
		||||
  title: "スパム報告"
 | 
			
		||||
  target: "対象"
 | 
			
		||||
  reporter: "報告者"
 | 
			
		||||
  details: "詳細"
 | 
			
		||||
  remove-report: "削除"
 | 
			
		||||
admin/views/instance.vue:
 | 
			
		||||
  instance: "インスタンス"
 | 
			
		||||
  instance-name: "インスタンス名"
 | 
			
		||||
@@ -1010,6 +1051,8 @@ admin/views/instance.vue:
 | 
			
		||||
  max-note-text-length: "投稿の最大文字数"
 | 
			
		||||
  disable-registration: "ユーザー登録の受付を停止する"
 | 
			
		||||
  disable-local-timeline: "ローカルタイムラインを無効にする"
 | 
			
		||||
  disable-global-timeline: "グローバルタイムラインを無効にする"
 | 
			
		||||
  disabling-timelines-info: "これらのタイムラインを無効にしても、管理者およびモデレーターは引き続き利用できます。"
 | 
			
		||||
  invite: "招待"
 | 
			
		||||
  save: "保存"
 | 
			
		||||
  saved: "保存しました"
 | 
			
		||||
@@ -1029,6 +1072,12 @@ admin/views/instance.vue:
 | 
			
		||||
  smtp-port: "SMTPポート"
 | 
			
		||||
  smtp-user: "SMTPユーザー"
 | 
			
		||||
  smtp-pass: "SMTPパスワード"
 | 
			
		||||
  serviceworker-config: "ServiceWorker"
 | 
			
		||||
  enable-serviceworker: "ServiceWorkerを有効にする"
 | 
			
		||||
  serviceworker-info: "プッシュ通知を行うには有効する必要があります。"
 | 
			
		||||
  vapid-publickey: "VAPID公開鍵"
 | 
			
		||||
  vapid-privatekey: "VAPID秘密鍵"
 | 
			
		||||
  vapid-info: "ServiceWorkerを有効にする場合、VAPIDキーペアを生成する必要があります。シェルで次のようにします:"
 | 
			
		||||
admin/views/charts.vue:
 | 
			
		||||
  title: "チャート"
 | 
			
		||||
  per-day: "1日ごと"
 | 
			
		||||
@@ -1047,6 +1096,7 @@ admin/views/charts.vue:
 | 
			
		||||
    notes-total: "投稿の積算"
 | 
			
		||||
    users: "ユーザーの増減"
 | 
			
		||||
    users-total: "ユーザーの積算"
 | 
			
		||||
    active-users: "アクティブユーザー数"
 | 
			
		||||
    drive: "ドライブ使用量の増減"
 | 
			
		||||
    drive-total: "ドライブ使用量の積算"
 | 
			
		||||
    drive-files: "ドライブのファイル数の増減"
 | 
			
		||||
@@ -1054,6 +1104,28 @@ admin/views/charts.vue:
 | 
			
		||||
    network-requests: "リクエスト"
 | 
			
		||||
    network-time: "応答時間"
 | 
			
		||||
    network-usage: "通信量"
 | 
			
		||||
admin/views/drive.vue:
 | 
			
		||||
  operation: "操作"
 | 
			
		||||
  fileid-or-url: "ファイルIDまたはファイルURL"
 | 
			
		||||
  file-not-found: "ファイルが見つかりません"
 | 
			
		||||
  lookup: "照会"
 | 
			
		||||
  sort:
 | 
			
		||||
    title: "ソート"
 | 
			
		||||
    createdAtAsc: "アップロード日時が古い順"
 | 
			
		||||
    createdAtDesc: "アップロード日時が新しい順"
 | 
			
		||||
    sizeAsc: "サイズが小さい順"
 | 
			
		||||
    sizeDesc: "サイズが大きい順"
 | 
			
		||||
  origin:
 | 
			
		||||
    title: "オリジン"
 | 
			
		||||
    combined: "ローカル+リモート"
 | 
			
		||||
    local: "ローカル"
 | 
			
		||||
    remote: "リモート"
 | 
			
		||||
  delete: "削除"
 | 
			
		||||
  deleted: "削除しました"
 | 
			
		||||
  mark-as-sensitive: "閲覧注意に設定"
 | 
			
		||||
  unmark-as-sensitive: "閲覧注意を解除"
 | 
			
		||||
  marked-as-sensitive: "閲覧注意に設定しました"
 | 
			
		||||
  unmarked-as-sensitive: "閲覧注意を解除しました"
 | 
			
		||||
admin/views/users.vue:
 | 
			
		||||
  operation: "操作"
 | 
			
		||||
  username-or-userid: "ユーザー名またはユーザーID"
 | 
			
		||||
@@ -1077,6 +1149,14 @@ admin/views/users.vue:
 | 
			
		||||
      createdAtDesc: "登録日時が新しい順"
 | 
			
		||||
      updatedAtAsc: "更新日時が古い順"
 | 
			
		||||
      updatedAtDesc: "更新日時が新しい順"
 | 
			
		||||
    state:
 | 
			
		||||
      title: "状態"
 | 
			
		||||
      all: "すべて"
 | 
			
		||||
      admin: "管理者"
 | 
			
		||||
      moderator: "モデレーター"
 | 
			
		||||
      adminOrModerator: "管理者+モデレーター"
 | 
			
		||||
      verified: "公式アカウント"
 | 
			
		||||
      suspended: "凍結済み"
 | 
			
		||||
    origin:
 | 
			
		||||
      title: "オリジン"
 | 
			
		||||
      combined: "ローカル+リモート"
 | 
			
		||||
@@ -1089,6 +1169,8 @@ admin/views/moderators.vue:
 | 
			
		||||
    title: "モデレーターの登録"
 | 
			
		||||
    add: "登録"
 | 
			
		||||
    added: "モデレーターを登録しました"
 | 
			
		||||
    remove: "解除"
 | 
			
		||||
    removed: "モデレーター登録を解除しました"
 | 
			
		||||
admin/views/emoji.vue:
 | 
			
		||||
  add-emoji:
 | 
			
		||||
    title: "絵文字の登録"
 | 
			
		||||
@@ -1170,17 +1252,7 @@ desktop/views/pages/user/user.photos.vue:
 | 
			
		||||
  no-photos: "Geen foto's"
 | 
			
		||||
desktop/views/pages/user/user.profile.vue:
 | 
			
		||||
  follows-you: "Volgt jou"
 | 
			
		||||
  stalk: "Stalken"
 | 
			
		||||
  stalking: "Stalkend"
 | 
			
		||||
  unstalk: "Stoppen met stalken"
 | 
			
		||||
  mute: "Dempen"
 | 
			
		||||
  muted: "Dempend"
 | 
			
		||||
  unmute: "Ontdempen"
 | 
			
		||||
  block: "ブロックする"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  block-confirm: "このユーザーをブロックしますか?"
 | 
			
		||||
  push-to-a-list: "リストに追加"
 | 
			
		||||
  list-pushed: "{user}を{list}に追加しました。"
 | 
			
		||||
  menu: "メニュー"
 | 
			
		||||
desktop/views/pages/user/user.header.vue:
 | 
			
		||||
  posts: "投稿"
 | 
			
		||||
  following: "フォロー"
 | 
			
		||||
@@ -1194,6 +1266,7 @@ desktop/views/pages/user/user.timeline.vue:
 | 
			
		||||
  default: "Berichten"
 | 
			
		||||
  with-replies: "Berichten en antwoorden"
 | 
			
		||||
  with-media: "Media"
 | 
			
		||||
  my-posts: "私の投稿"
 | 
			
		||||
  empty: "Deze gebruiker heeft nog niks geplaatst."
 | 
			
		||||
desktop/views/widgets/messaging.vue:
 | 
			
		||||
  title: "Gesprekken"
 | 
			
		||||
@@ -1392,7 +1465,6 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  notification-position: "通知の表示"
 | 
			
		||||
  notification-position-bottom: "下"
 | 
			
		||||
  notification-position-top: "上"
 | 
			
		||||
  theme: "テーマ"
 | 
			
		||||
  behavior: "Gedrag"
 | 
			
		||||
  fetch-on-scroll: "Ophalen bij scrollen"
 | 
			
		||||
  note-visibility: "投稿の公開範囲"
 | 
			
		||||
@@ -1416,7 +1488,6 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  signout: "Uitloggen"
 | 
			
		||||
  sound: "サウンド"
 | 
			
		||||
  enable-sounds: "サウンドを有効にする"
 | 
			
		||||
  mark-as-read-all-unread-notes: "すべての投稿を既読にする"
 | 
			
		||||
  password: "パスワード"
 | 
			
		||||
mobile/views/pages/user.vue:
 | 
			
		||||
  follows-you: "Volgt jou"
 | 
			
		||||
@@ -1426,15 +1497,7 @@ mobile/views/pages/user.vue:
 | 
			
		||||
  overview: "Overzicht"
 | 
			
		||||
  timeline: "Tijdlijn"
 | 
			
		||||
  media: "Media"
 | 
			
		||||
  is-suspended: "Dit account is geschorst."
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  years-old: "{age}歳"
 | 
			
		||||
  push-to-list: "リストに追加"
 | 
			
		||||
  select-list: "リストを選択してください"
 | 
			
		||||
  list-pushed: "{user}を{list}に追加しました"
 | 
			
		||||
mobile/views/pages/user/home.vue:
 | 
			
		||||
  recent-notes: "Recente notities"
 | 
			
		||||
  images: "Afbeeldingen"
 | 
			
		||||
@@ -1484,7 +1547,6 @@ deck/deck.user-column.vue:
 | 
			
		||||
  activity: "アクティビティ"
 | 
			
		||||
  timeline: "タイムライン"
 | 
			
		||||
  pinned-notes: "ピン留めされた投稿"
 | 
			
		||||
  push-to-a-list: "リストに追加"
 | 
			
		||||
docs:
 | 
			
		||||
  edit-this-page-on-github: "Heb je een fout ontdekt of wil je bijdragen aan de documentatie? "
 | 
			
		||||
  edit-this-page-on-github-link: "Bewerk deze pagina op GitHub!"
 | 
			
		||||
 
 | 
			
		||||
@@ -27,6 +27,7 @@ common:
 | 
			
		||||
  do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
 | 
			
		||||
  load-more: "もっと読み込む"
 | 
			
		||||
  enter-password: "パスワードを入力してください"
 | 
			
		||||
  2fa: "二段階認証"
 | 
			
		||||
  got-it: "Skjønner!"
 | 
			
		||||
  customization-tips:
 | 
			
		||||
    title: "カスタマイズのヒント"
 | 
			
		||||
@@ -90,7 +91,6 @@ common:
 | 
			
		||||
    followers-desc: "自分のフォロワーにのみ公開"
 | 
			
		||||
    specified: "ダイレクト"
 | 
			
		||||
    specified-desc: "指定したユーザーにのみ公開"
 | 
			
		||||
    private: "Privat"
 | 
			
		||||
    local-public: "公開 (ローカルのみ)"
 | 
			
		||||
    local-home: "ホーム (ローカルのみ)"
 | 
			
		||||
    local-followers: "フォロワー (ローカルのみ)"
 | 
			
		||||
@@ -110,8 +110,7 @@ common:
 | 
			
		||||
  my-token-regenerated: "Ditt synbol har blitt generert. Du vil nå bli utlogget."
 | 
			
		||||
  i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
 | 
			
		||||
  show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
 | 
			
		||||
  use-white-black-reversi-stones: "リバーシに白黒の石を使う"
 | 
			
		||||
  use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
 | 
			
		||||
  use-avatar-reversi-stones: "リバーシの石にアバターを使う"
 | 
			
		||||
  verified-user: "公式アカウント"
 | 
			
		||||
  disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
 | 
			
		||||
  suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
 | 
			
		||||
@@ -122,14 +121,21 @@ common:
 | 
			
		||||
  reduce-motion: "UIの動きを減らす"
 | 
			
		||||
  this-setting-is-this-device-only: "このデバイスのみ"
 | 
			
		||||
  use-os-default-emojis: "OS標準の絵文字を使用"
 | 
			
		||||
  do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
 | 
			
		||||
  line-width: "線の太さ"
 | 
			
		||||
  line-width-thin: "細い"
 | 
			
		||||
  line-width-normal: "普通"
 | 
			
		||||
  line-width-thick: "太い"
 | 
			
		||||
  hide-password: "パスワードを隠す"
 | 
			
		||||
  show-password: "パスワードを表示する"
 | 
			
		||||
  do-not-use-in-production: "これは開発ビルドです。本番環境で使用しないでください。"
 | 
			
		||||
  user-suspended: "このユーザーは凍結されています。"
 | 
			
		||||
  is-remote-user: "このユーザー情報はコピーです。"
 | 
			
		||||
  is-remote-post: "この投稿情報はコピーです。"
 | 
			
		||||
  view-on-remote: "正確な情報を見る"
 | 
			
		||||
  renoted-by: "{user}がRenote"
 | 
			
		||||
  error:
 | 
			
		||||
    title: '問題が発生しました'
 | 
			
		||||
    retry: 'やり直す'
 | 
			
		||||
    title: "問題が発生しました"
 | 
			
		||||
    retry: "やり直す"
 | 
			
		||||
  reversi:
 | 
			
		||||
    drawn: "引き分け"
 | 
			
		||||
    my-turn: "あなたのターンです"
 | 
			
		||||
@@ -165,6 +171,7 @@ common:
 | 
			
		||||
    hashtags: "ハッシュタグ"
 | 
			
		||||
  dev: "アプリの作成に失敗しました。再度お試しください。"
 | 
			
		||||
  ai-chan-kawaii: "藍ちゃかわいい"
 | 
			
		||||
  you: "あなた"
 | 
			
		||||
auth/views/form.vue:
 | 
			
		||||
  share-access: "<i>{name}</i>があなたのアカウントにアクセスすることを許可しますか?"
 | 
			
		||||
  permission-ask: "このアプリは次の権限を要求しています:"
 | 
			
		||||
@@ -260,6 +267,7 @@ common/views/components/media-banner.vue:
 | 
			
		||||
  sensitive: "Sensitivt innhold"
 | 
			
		||||
  click-to-show: "クリックして表示"
 | 
			
		||||
common/views/components/theme.vue:
 | 
			
		||||
  theme: "テーマ"
 | 
			
		||||
  light-theme: "非ダークモード時に使用するテーマ"
 | 
			
		||||
  dark-theme: "ダークモード時に使用するテーマ"
 | 
			
		||||
  light-themes: "明るいテーマ"
 | 
			
		||||
@@ -276,6 +284,7 @@ common/views/components/theme.vue:
 | 
			
		||||
  base-theme: "ベーステーマ"
 | 
			
		||||
  base-theme-light: "Light"
 | 
			
		||||
  base-theme-dark: "Mørk"
 | 
			
		||||
  find-more-theme: "その他のテーマを入手"
 | 
			
		||||
  theme-name: "Tema navn"
 | 
			
		||||
  preview-created-theme: "プレビュー"
 | 
			
		||||
  invalid-theme: "テーマが正しくありません。"
 | 
			
		||||
@@ -299,6 +308,7 @@ common/views/components/cw-button.vue:
 | 
			
		||||
  show: "もっと見る"
 | 
			
		||||
  chars: "{count}文字"
 | 
			
		||||
  files: "{count}ファイル"
 | 
			
		||||
  poll: "アンケート"
 | 
			
		||||
common/views/components/messaging.vue:
 | 
			
		||||
  search-user: "ユーザーを探す"
 | 
			
		||||
  you: "Du"
 | 
			
		||||
@@ -328,7 +338,9 @@ common/views/components/nav.vue:
 | 
			
		||||
  develop: "Utviklere"
 | 
			
		||||
  feedback: "フィードバック"
 | 
			
		||||
common/views/components/note-menu.vue:
 | 
			
		||||
  mention: "メンション"
 | 
			
		||||
  detail: "Detaljer"
 | 
			
		||||
  copy-content: "内容をコピー"
 | 
			
		||||
  copy-link: "リンクをコピー"
 | 
			
		||||
  favorite: "Merket som favoritt"
 | 
			
		||||
  unfavorite: "お気に入り解除"
 | 
			
		||||
@@ -337,6 +349,17 @@ common/views/components/note-menu.vue:
 | 
			
		||||
  delete: "Slett"
 | 
			
		||||
  delete-confirm: "この投稿を削除しますか?"
 | 
			
		||||
  remote: "投稿元で見る"
 | 
			
		||||
common/views/components/user-menu.vue:
 | 
			
		||||
  mention: "メンション"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  push-to-list: "リストに追加"
 | 
			
		||||
  select-list: "リストを選択してください"
 | 
			
		||||
  report-abuse: "スパムを報告"
 | 
			
		||||
  report-abuse-detail: "どのような迷惑行為を行っていますか?"
 | 
			
		||||
  report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
 | 
			
		||||
common/views/components/poll.vue:
 | 
			
		||||
  vote-to: "「{}」に投票する"
 | 
			
		||||
  vote-count: "{} stemmer"
 | 
			
		||||
@@ -403,6 +426,13 @@ common/views/components/stream-indicator.vue:
 | 
			
		||||
  connecting: "Tilkobler"
 | 
			
		||||
  reconnecting: "Kobler til på nytt"
 | 
			
		||||
  connected: "Tilkoblet"
 | 
			
		||||
common/views/components/notification-settings.vue:
 | 
			
		||||
  title: "通知"
 | 
			
		||||
  mark-as-read-all-notifications: "すべての通知を既読にする"
 | 
			
		||||
  mark-as-read-all-unread-notes: "すべての投稿を既読にする"
 | 
			
		||||
  mark-as-read-all-talk-messages: "すべてのトークを既読にする"
 | 
			
		||||
  auto-watch: "投稿の自動ウォッチ"
 | 
			
		||||
  auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。"
 | 
			
		||||
common/views/components/integration-settings.vue:
 | 
			
		||||
  title: "サービス連携"
 | 
			
		||||
  connect: "接続する"
 | 
			
		||||
@@ -432,7 +462,6 @@ common/views/components/visibility-chooser.vue:
 | 
			
		||||
  followers-desc: "自分のフォロワーにのみ公開"
 | 
			
		||||
  specified: "Direkte"
 | 
			
		||||
  specified-desc: "指定したユーザーにのみ公開"
 | 
			
		||||
  private: "Privat"
 | 
			
		||||
  local-public: "公開 (ローカルのみ)"
 | 
			
		||||
  local-public-desc: "リモートへは公開しない"
 | 
			
		||||
  local-home: "ホーム (ローカルのみ)"
 | 
			
		||||
@@ -461,6 +490,7 @@ common/views/components/profile-editor.vue:
 | 
			
		||||
  is-bot: "このアカウントはBotです"
 | 
			
		||||
  is-locked: "フォローを承認制にする"
 | 
			
		||||
  careful-bot: "Botからのフォローだけ承認制にする"
 | 
			
		||||
  auto-accept-followed: "フォローしているユーザーからのフォローを自動承認する"
 | 
			
		||||
  advanced: "その他"
 | 
			
		||||
  privacy: "プライバシー"
 | 
			
		||||
  save: "保存"
 | 
			
		||||
@@ -471,6 +501,13 @@ common/views/components/profile-editor.vue:
 | 
			
		||||
  email-address: "メールアドレス"
 | 
			
		||||
  email-verified: "メールアドレスが確認されました"
 | 
			
		||||
  email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
 | 
			
		||||
common/views/components/user-list-editor.vue:
 | 
			
		||||
  users: "ユーザー"
 | 
			
		||||
  rename: "リスト名を変更"
 | 
			
		||||
  delete: "リストを削除"
 | 
			
		||||
  remove-user: "このリストから削除"
 | 
			
		||||
  delete-are-you-sure: "リスト「$1」を削除しますか?"
 | 
			
		||||
  deleted: "削除しました"
 | 
			
		||||
common/views/widgets/broadcast.vue:
 | 
			
		||||
  fetching: "Henter"
 | 
			
		||||
  no-broadcasts: "お知らせはありません"
 | 
			
		||||
@@ -520,10 +557,10 @@ common/views/widgets/tips.vue:
 | 
			
		||||
  tips-line19: "いくつかのウィンドウはブラウザの外に切り離すことができます"
 | 
			
		||||
  tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示しています"
 | 
			
		||||
  tips-line21: "APIを利用してbotの開発なども行えます"
 | 
			
		||||
  tips-line23: "まゆかわいいよまゆ"
 | 
			
		||||
  tips-line23: "藍かわいいよ藍"
 | 
			
		||||
  tips-line24: "Misskeyは2014年にサービスを開始しました"
 | 
			
		||||
  tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
 | 
			
		||||
common/views/pages/404.vue:
 | 
			
		||||
common/views/pages/not-found.vue:
 | 
			
		||||
  page-not-found: "ページが見つかりませんでした"
 | 
			
		||||
common/views/pages/follow.vue:
 | 
			
		||||
  signed-in-as: "{}としてサインイン中"
 | 
			
		||||
@@ -660,10 +697,12 @@ desktop/views/components/note-detail.vue:
 | 
			
		||||
  location: "Lokasjon"
 | 
			
		||||
  renote: "Renote"
 | 
			
		||||
  add-reaction: "リアクション"
 | 
			
		||||
  undo-reaction: "リアクション解除"
 | 
			
		||||
desktop/views/components/note.vue:
 | 
			
		||||
  reply: "返信"
 | 
			
		||||
  renote: "Renote"
 | 
			
		||||
  add-reaction: "リアクション"
 | 
			
		||||
  undo-reaction: "リアクション解除"
 | 
			
		||||
  detail: "詳細"
 | 
			
		||||
  private: "この投稿は非公開です"
 | 
			
		||||
  deleted: "この投稿は削除されました"
 | 
			
		||||
@@ -734,7 +773,6 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  security: "セキュリティ"
 | 
			
		||||
  signin: "サインイン履歴"
 | 
			
		||||
  password: "Passord"
 | 
			
		||||
  2fa: "To-faktor autentisering"
 | 
			
		||||
  other: "Annet"
 | 
			
		||||
  license: "Lisens"
 | 
			
		||||
  theme: "Utseende"
 | 
			
		||||
@@ -748,9 +786,6 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
 | 
			
		||||
  auto-popout: "ウィンドウの自動ポップアウト"
 | 
			
		||||
  auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
 | 
			
		||||
  advanced: "Avanserte innstillinger"
 | 
			
		||||
  api-via-stream: "ストリームを経由したAPIリクエスト"
 | 
			
		||||
  api-via-stream-desc: "この設定をオンにすると、websocket接続を経由してAPIリクエストが行われます(パフォーマンス向上が期待できます)。オフにすると、ネイティブの fetch APIが利用されます。この設定はこのデバイスのみ有効です。"
 | 
			
		||||
  deck-nav: "デッキ内ナビゲーション"
 | 
			
		||||
  deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
 | 
			
		||||
  deck-default: "デッキをデフォルトのUIにする"
 | 
			
		||||
@@ -793,8 +828,6 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  cache-warn: "クリーンアップを行うと、ブラウザに記憶されたアカウント情報のキャッシュ、書きかけの投稿・返信・メッセージ、およびその他のデータ(設定情報含む)が削除されます。クリーンアップを行った後はページを再度読み込みする必要があります。"
 | 
			
		||||
  cache-cleared: "キャッシュを削除しました"
 | 
			
		||||
  cache-cleared-desc: "ページを再度読み込みしてください。"
 | 
			
		||||
  auto-watch: "投稿の自動ウォッチ"
 | 
			
		||||
  auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。"
 | 
			
		||||
  about: "Misskeyについて"
 | 
			
		||||
  operator: "このサーバーの運営者"
 | 
			
		||||
  update: "Misskey Update"
 | 
			
		||||
@@ -833,6 +866,7 @@ desktop/views/components/settings.2fa.vue:
 | 
			
		||||
  enter-password: "パスワードを入力してください"
 | 
			
		||||
  authenticator: "まず、Google Authenticatorをお使いのデバイスにインストールします:"
 | 
			
		||||
  howtoinstall: "インストール方法はこちら"
 | 
			
		||||
  token: "トークン"
 | 
			
		||||
  scan: "次に、表示されているQRコードをスキャンします:"
 | 
			
		||||
  done: "お使いのデバイスに表示されているトークンを入力して完了します:"
 | 
			
		||||
  submit: "Send"
 | 
			
		||||
@@ -847,13 +881,13 @@ common/views/components/api-settings.vue:
 | 
			
		||||
  token: "Token:"
 | 
			
		||||
  enter-password: "パスワードを入力してください"
 | 
			
		||||
  console:
 | 
			
		||||
    title: 'APIコンソール'
 | 
			
		||||
    endpoint: 'エンドポイント'
 | 
			
		||||
    parameter: 'パラメータ'
 | 
			
		||||
    title: "APIコンソール"
 | 
			
		||||
    endpoint: "エンドポイント"
 | 
			
		||||
    parameter: "パラメータ"
 | 
			
		||||
    credential-info: "「i」パラメータは自動で付与されます。"
 | 
			
		||||
    send: '送信'
 | 
			
		||||
    sending: '応答待ち'
 | 
			
		||||
    response: '結果'
 | 
			
		||||
    send: "送信"
 | 
			
		||||
    sending: "応答待ち"
 | 
			
		||||
    response: "結果"
 | 
			
		||||
desktop/views/components/settings.apps.vue:
 | 
			
		||||
  no-apps: "連携しているアプリケーションはありません"
 | 
			
		||||
common/views/components/drive-settings.vue:
 | 
			
		||||
@@ -955,6 +989,7 @@ admin/views/index.vue:
 | 
			
		||||
  federation: "連合"
 | 
			
		||||
  announcements: "お知らせ"
 | 
			
		||||
  hashtags: "ハッシュタグ"
 | 
			
		||||
  abuse: "スパム報告"
 | 
			
		||||
  back-to-misskey: "Misskeyに戻る"
 | 
			
		||||
admin/views/dashboard.vue:
 | 
			
		||||
  dashboard: "ダッシュボード"
 | 
			
		||||
@@ -964,6 +999,12 @@ admin/views/dashboard.vue:
 | 
			
		||||
  instances: "インスタンス"
 | 
			
		||||
  this-instance: "このインスタンス"
 | 
			
		||||
  federated: "連合"
 | 
			
		||||
admin/views/abuse.vue:
 | 
			
		||||
  title: "スパム報告"
 | 
			
		||||
  target: "対象"
 | 
			
		||||
  reporter: "報告者"
 | 
			
		||||
  details: "詳細"
 | 
			
		||||
  remove-report: "削除"
 | 
			
		||||
admin/views/instance.vue:
 | 
			
		||||
  instance: "インスタンス"
 | 
			
		||||
  instance-name: "インスタンス名"
 | 
			
		||||
@@ -1010,6 +1051,8 @@ admin/views/instance.vue:
 | 
			
		||||
  max-note-text-length: "投稿の最大文字数"
 | 
			
		||||
  disable-registration: "ユーザー登録の受付を停止する"
 | 
			
		||||
  disable-local-timeline: "ローカルタイムラインを無効にする"
 | 
			
		||||
  disable-global-timeline: "グローバルタイムラインを無効にする"
 | 
			
		||||
  disabling-timelines-info: "これらのタイムラインを無効にしても、管理者およびモデレーターは引き続き利用できます。"
 | 
			
		||||
  invite: "招待"
 | 
			
		||||
  save: "保存"
 | 
			
		||||
  saved: "保存しました"
 | 
			
		||||
@@ -1029,6 +1072,12 @@ admin/views/instance.vue:
 | 
			
		||||
  smtp-port: "SMTPポート"
 | 
			
		||||
  smtp-user: "SMTPユーザー"
 | 
			
		||||
  smtp-pass: "SMTPパスワード"
 | 
			
		||||
  serviceworker-config: "ServiceWorker"
 | 
			
		||||
  enable-serviceworker: "ServiceWorkerを有効にする"
 | 
			
		||||
  serviceworker-info: "プッシュ通知を行うには有効する必要があります。"
 | 
			
		||||
  vapid-publickey: "VAPID公開鍵"
 | 
			
		||||
  vapid-privatekey: "VAPID秘密鍵"
 | 
			
		||||
  vapid-info: "ServiceWorkerを有効にする場合、VAPIDキーペアを生成する必要があります。シェルで次のようにします:"
 | 
			
		||||
admin/views/charts.vue:
 | 
			
		||||
  title: "チャート"
 | 
			
		||||
  per-day: "1日ごと"
 | 
			
		||||
@@ -1047,6 +1096,7 @@ admin/views/charts.vue:
 | 
			
		||||
    notes-total: "投稿の積算"
 | 
			
		||||
    users: "ユーザーの増減"
 | 
			
		||||
    users-total: "ユーザーの積算"
 | 
			
		||||
    active-users: "アクティブユーザー数"
 | 
			
		||||
    drive: "ドライブ使用量の増減"
 | 
			
		||||
    drive-total: "ドライブ使用量の積算"
 | 
			
		||||
    drive-files: "ドライブのファイル数の増減"
 | 
			
		||||
@@ -1054,6 +1104,28 @@ admin/views/charts.vue:
 | 
			
		||||
    network-requests: "リクエスト"
 | 
			
		||||
    network-time: "応答時間"
 | 
			
		||||
    network-usage: "通信量"
 | 
			
		||||
admin/views/drive.vue:
 | 
			
		||||
  operation: "操作"
 | 
			
		||||
  fileid-or-url: "ファイルIDまたはファイルURL"
 | 
			
		||||
  file-not-found: "ファイルが見つかりません"
 | 
			
		||||
  lookup: "照会"
 | 
			
		||||
  sort:
 | 
			
		||||
    title: "ソート"
 | 
			
		||||
    createdAtAsc: "アップロード日時が古い順"
 | 
			
		||||
    createdAtDesc: "アップロード日時が新しい順"
 | 
			
		||||
    sizeAsc: "サイズが小さい順"
 | 
			
		||||
    sizeDesc: "サイズが大きい順"
 | 
			
		||||
  origin:
 | 
			
		||||
    title: "オリジン"
 | 
			
		||||
    combined: "ローカル+リモート"
 | 
			
		||||
    local: "ローカル"
 | 
			
		||||
    remote: "リモート"
 | 
			
		||||
  delete: "削除"
 | 
			
		||||
  deleted: "削除しました"
 | 
			
		||||
  mark-as-sensitive: "閲覧注意に設定"
 | 
			
		||||
  unmark-as-sensitive: "閲覧注意を解除"
 | 
			
		||||
  marked-as-sensitive: "閲覧注意に設定しました"
 | 
			
		||||
  unmarked-as-sensitive: "閲覧注意を解除しました"
 | 
			
		||||
admin/views/users.vue:
 | 
			
		||||
  operation: "操作"
 | 
			
		||||
  username-or-userid: "ユーザー名またはユーザーID"
 | 
			
		||||
@@ -1077,6 +1149,14 @@ admin/views/users.vue:
 | 
			
		||||
      createdAtDesc: "登録日時が新しい順"
 | 
			
		||||
      updatedAtAsc: "更新日時が古い順"
 | 
			
		||||
      updatedAtDesc: "更新日時が新しい順"
 | 
			
		||||
    state:
 | 
			
		||||
      title: "状態"
 | 
			
		||||
      all: "すべて"
 | 
			
		||||
      admin: "管理者"
 | 
			
		||||
      moderator: "モデレーター"
 | 
			
		||||
      adminOrModerator: "管理者+モデレーター"
 | 
			
		||||
      verified: "公式アカウント"
 | 
			
		||||
      suspended: "凍結済み"
 | 
			
		||||
    origin:
 | 
			
		||||
      title: "オリジン"
 | 
			
		||||
      combined: "ローカル+リモート"
 | 
			
		||||
@@ -1089,6 +1169,8 @@ admin/views/moderators.vue:
 | 
			
		||||
    title: "モデレーターの登録"
 | 
			
		||||
    add: "登録"
 | 
			
		||||
    added: "モデレーターを登録しました"
 | 
			
		||||
    remove: "解除"
 | 
			
		||||
    removed: "モデレーター登録を解除しました"
 | 
			
		||||
admin/views/emoji.vue:
 | 
			
		||||
  add-emoji:
 | 
			
		||||
    title: "絵文字の登録"
 | 
			
		||||
@@ -1170,17 +1252,7 @@ desktop/views/pages/user/user.photos.vue:
 | 
			
		||||
  no-photos: "写真はありません"
 | 
			
		||||
desktop/views/pages/user/user.profile.vue:
 | 
			
		||||
  follows-you: "フォローされています"
 | 
			
		||||
  stalk: "ストークする"
 | 
			
		||||
  stalking: "ストーキングしています"
 | 
			
		||||
  unstalk: "ストーク解除"
 | 
			
		||||
  mute: "ミュートする"
 | 
			
		||||
  muted: "ミュートしています"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロックする"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  block-confirm: "このユーザーをブロックしますか?"
 | 
			
		||||
  push-to-a-list: "リストに追加"
 | 
			
		||||
  list-pushed: "{user}を{list}に追加しました。"
 | 
			
		||||
  menu: "メニュー"
 | 
			
		||||
desktop/views/pages/user/user.header.vue:
 | 
			
		||||
  posts: "Innlegg"
 | 
			
		||||
  following: "Følger"
 | 
			
		||||
@@ -1194,6 +1266,7 @@ desktop/views/pages/user/user.timeline.vue:
 | 
			
		||||
  default: "Innlegg"
 | 
			
		||||
  with-replies: "Innlegg og svar"
 | 
			
		||||
  with-media: "Media"
 | 
			
		||||
  my-posts: "私の投稿"
 | 
			
		||||
  empty: "このユーザーはまだ何も投稿していないようです。"
 | 
			
		||||
desktop/views/widgets/messaging.vue:
 | 
			
		||||
  title: "Melding"
 | 
			
		||||
@@ -1392,7 +1465,6 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  notification-position: "通知の表示"
 | 
			
		||||
  notification-position-bottom: "Bunn"
 | 
			
		||||
  notification-position-top: "Topp"
 | 
			
		||||
  theme: "Utseende"
 | 
			
		||||
  behavior: "Oppførsel"
 | 
			
		||||
  fetch-on-scroll: "スクロールで自動読み込み"
 | 
			
		||||
  note-visibility: "投稿の公開範囲"
 | 
			
		||||
@@ -1416,7 +1488,6 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  signout: "サインアウト"
 | 
			
		||||
  sound: "Lyder"
 | 
			
		||||
  enable-sounds: "サウンドを有効にする"
 | 
			
		||||
  mark-as-read-all-unread-notes: "すべての投稿を既読にする"
 | 
			
		||||
  password: "パスワード"
 | 
			
		||||
mobile/views/pages/user.vue:
 | 
			
		||||
  follows-you: "フォローされています"
 | 
			
		||||
@@ -1426,15 +1497,7 @@ mobile/views/pages/user.vue:
 | 
			
		||||
  overview: "Oversikt"
 | 
			
		||||
  timeline: "タイムライン"
 | 
			
		||||
  media: "Media"
 | 
			
		||||
  is-suspended: "このユーザーは凍結されています。"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  years-old: "{age}歳"
 | 
			
		||||
  push-to-list: "リストに追加"
 | 
			
		||||
  select-list: "リストを選択してください"
 | 
			
		||||
  list-pushed: "{user}を{list}に追加しました"
 | 
			
		||||
mobile/views/pages/user/home.vue:
 | 
			
		||||
  recent-notes: "Nylige innlegg"
 | 
			
		||||
  images: "Bilder"
 | 
			
		||||
@@ -1484,7 +1547,6 @@ deck/deck.user-column.vue:
 | 
			
		||||
  activity: "アクティビティ"
 | 
			
		||||
  timeline: "タイムライン"
 | 
			
		||||
  pinned-notes: "ピン留めされた投稿"
 | 
			
		||||
  push-to-a-list: "リストに追加"
 | 
			
		||||
docs:
 | 
			
		||||
  edit-this-page-on-github: "間違いや改善点を見つけましたか?"
 | 
			
		||||
  edit-this-page-on-github-link: "このページをGitHubで編集"
 | 
			
		||||
 
 | 
			
		||||
@@ -27,6 +27,7 @@ common:
 | 
			
		||||
  do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
 | 
			
		||||
  load-more: "Załaduj więcej"
 | 
			
		||||
  enter-password: "Wprowadź Hasło"
 | 
			
		||||
  2fa: "二段階認証"
 | 
			
		||||
  got-it: "Rozumiem!"
 | 
			
		||||
  customization-tips:
 | 
			
		||||
    title: "Wskazówki o dostosowywaniu"
 | 
			
		||||
@@ -90,7 +91,6 @@ common:
 | 
			
		||||
    followers-desc: "Widoczny tylko dla osób, które Cię śledzą"
 | 
			
		||||
    specified: "Bezpośredni"
 | 
			
		||||
    specified-desc: "Tylko dla określonych użytkowników"
 | 
			
		||||
    private: "Prywatny"
 | 
			
		||||
    local-public: "Publiczny (tylko lokalnie)"
 | 
			
		||||
    local-home: "ホーム (ローカルのみ)"
 | 
			
		||||
    local-followers: "Dla śledzących (tylko lokalnie)"
 | 
			
		||||
@@ -110,26 +110,32 @@ common:
 | 
			
		||||
  my-token-regenerated: "Twój token został wygenerowany. Zostaniesz wylogowany."
 | 
			
		||||
  i-like-sushi: "Wolę sushi od puddingu"
 | 
			
		||||
  show-reversi-board-labels: "Pokazuj podpisy wierszy i kolumn w Reversi"
 | 
			
		||||
  use-white-black-reversi-stones: "リバーシに白黒の石を使う"
 | 
			
		||||
  use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
 | 
			
		||||
  verified-user: "公式アカウント"
 | 
			
		||||
  use-avatar-reversi-stones: "リバーシの石にアバターを使う"
 | 
			
		||||
  verified-user: "Zweryfikowane konto"
 | 
			
		||||
  disable-animated-mfm: "Wyłącz animowany tekst we wpisach"
 | 
			
		||||
  suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
 | 
			
		||||
  always-show-nsfw: "常に閲覧注意のメディアを表示する"
 | 
			
		||||
  always-show-nsfw: "Zawszę pokazuj zawartość NSFW"
 | 
			
		||||
  always-mark-nsfw: "Zawsze oznaczaj posty z multimediami jako NSFW"
 | 
			
		||||
  show-full-acct: "ユーザー名のホストを省略しない"
 | 
			
		||||
  show-via: "viaを表示する"
 | 
			
		||||
  reduce-motion: "UIの動きを減らす"
 | 
			
		||||
  reduce-motion: "Zredukuj ruch w UI"
 | 
			
		||||
  this-setting-is-this-device-only: "このデバイスのみ"
 | 
			
		||||
  use-os-default-emojis: "Użyj domyślnych Emoji systemowych"
 | 
			
		||||
  do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
 | 
			
		||||
  line-width: "Szerokości linii"
 | 
			
		||||
  line-width-thin: "Chuda"
 | 
			
		||||
  line-width-normal: "Normalna"
 | 
			
		||||
  line-width-thick: "Gruba"
 | 
			
		||||
  hide-password: "Ukryj hasło"
 | 
			
		||||
  show-password: "Pokaż hasło"
 | 
			
		||||
  do-not-use-in-production: "これは開発ビルドです。本番環境で使用しないでください。"
 | 
			
		||||
  user-suspended: "このユーザーは凍結されています。"
 | 
			
		||||
  is-remote-user: "Informacje o użytkowniku są kopiowane."
 | 
			
		||||
  is-remote-post: "この投稿情報はコピーです。"
 | 
			
		||||
  view-on-remote: "正確な情報を見る"
 | 
			
		||||
  view-on-remote: "Dla dopełnienia, zobacz to zdalnie."
 | 
			
		||||
  renoted-by: "{user} udostępnił(a)"
 | 
			
		||||
  error:
 | 
			
		||||
    title: 'Coś poszło nie tak'
 | 
			
		||||
    retry: 'Ponów próbę'
 | 
			
		||||
    title: "Coś poszło nie tak"
 | 
			
		||||
    retry: "Ponów próbę"
 | 
			
		||||
  reversi:
 | 
			
		||||
    drawn: "Remis"
 | 
			
		||||
    my-turn: "Twoja kolej"
 | 
			
		||||
@@ -165,6 +171,7 @@ common:
 | 
			
		||||
    hashtags: "Hashtagi"
 | 
			
		||||
  dev: "アプリの作成に失敗しました。再度お試しください。"
 | 
			
		||||
  ai-chan-kawaii: "藍ちゃかわいい"
 | 
			
		||||
  you: "Ty"
 | 
			
		||||
auth/views/form.vue:
 | 
			
		||||
  share-access: "<i>{name}</i>があなたのアカウントにアクセスすることを許可しますか?"
 | 
			
		||||
  permission-ask: "Ta aplikacja wymaga następujących uprawnień:"
 | 
			
		||||
@@ -257,10 +264,11 @@ common/views/components/connect-failed.troubleshooter.vue:
 | 
			
		||||
  flush: "Wyczyść pamięć podręczną"
 | 
			
		||||
  set-version: "Określ wersję"
 | 
			
		||||
common/views/components/media-banner.vue:
 | 
			
		||||
  sensitive: "閲覧注意"
 | 
			
		||||
  click-to-show: "クリックして表示"
 | 
			
		||||
  sensitive: "NSFW"
 | 
			
		||||
  click-to-show: "Naciśnij aby wyświetlić"
 | 
			
		||||
common/views/components/theme.vue:
 | 
			
		||||
  light-theme: "非ダークモード時に使用するテーマ"
 | 
			
		||||
  theme: "Motyw"
 | 
			
		||||
  light-theme: "Motyw"
 | 
			
		||||
  dark-theme: "ダークモード時に使用するテーマ"
 | 
			
		||||
  light-themes: "Jasny Motyw"
 | 
			
		||||
  dark-themes: "Ciemny motyw"
 | 
			
		||||
@@ -276,21 +284,22 @@ common/views/components/theme.vue:
 | 
			
		||||
  base-theme: "Podstawowy motyw"
 | 
			
		||||
  base-theme-light: "Jasny"
 | 
			
		||||
  base-theme-dark: "Ciemny"
 | 
			
		||||
  find-more-theme: "Odkryj więcej motywów"
 | 
			
		||||
  theme-name: "Nazwa motywu"
 | 
			
		||||
  preview-created-theme: "Pokaż podgląd"
 | 
			
		||||
  invalid-theme: "テーマが正しくありません。"
 | 
			
		||||
  invalid-theme: "Nieprawidłowy motyw"
 | 
			
		||||
  already-installed: "Ten motyw jest już zainstalowany"
 | 
			
		||||
  saved: "Zapisano"
 | 
			
		||||
  manage-themes: "Zarządzanie motywami"
 | 
			
		||||
  builtin-themes: "Standardowe motywy"
 | 
			
		||||
  my-themes: "Moje motywy"
 | 
			
		||||
  installed-themes: "Zainstalowane motywy"
 | 
			
		||||
  select-theme: "テーマを選択してください"
 | 
			
		||||
  select-theme: "Wybierz motyw"
 | 
			
		||||
  uninstall: "Odinstaluj"
 | 
			
		||||
  uninstalled: "\"{}\" został odinstalowany"
 | 
			
		||||
  author: "Author"
 | 
			
		||||
  desc: "Opis"
 | 
			
		||||
  export: "エクスポート"
 | 
			
		||||
  export: "Eksportuj"
 | 
			
		||||
  import: "Importuj"
 | 
			
		||||
  import-by-code: "lub wklej kod"
 | 
			
		||||
  theme-name-required: "Nazwa motywu jest obowiązkowa."
 | 
			
		||||
@@ -298,7 +307,8 @@ common/views/components/cw-button.vue:
 | 
			
		||||
  hide: "Ukryj"
 | 
			
		||||
  show: "Pokaż więcej"
 | 
			
		||||
  chars: "{count} znaków"
 | 
			
		||||
  files: "{count}ファイル"
 | 
			
		||||
  files: "{count} plików"
 | 
			
		||||
  poll: "Ankieta"
 | 
			
		||||
common/views/components/messaging.vue:
 | 
			
		||||
  search-user: "Znajdź użytkownika"
 | 
			
		||||
  you: "Ty"
 | 
			
		||||
@@ -308,13 +318,13 @@ common/views/components/messaging-room.vue:
 | 
			
		||||
  no-history: "Brak dalszej historii"
 | 
			
		||||
  resize-form: "Przeciągnij aby zmienić rozmiar"
 | 
			
		||||
  new-message: "Nowa wiadomość"
 | 
			
		||||
  only-one-file-attached: "メッセージに添付できるのはひとつのファイルのみです"
 | 
			
		||||
  only-one-file-attached: "Tylko JEDEN plik może zostać dołączony do wiadomości"
 | 
			
		||||
common/views/components/messaging-room.form.vue:
 | 
			
		||||
  input-message-here: "Wprowadź wiadomość tutaj"
 | 
			
		||||
  send: "Wyślij"
 | 
			
		||||
  attach-from-local: "Załącz pliki z komputera"
 | 
			
		||||
  attach-from-drive: "Załącz pliki z dysku"
 | 
			
		||||
  only-one-file-attached: "メッセージに添付できるのはひとつのファイルのみです"
 | 
			
		||||
  only-one-file-attached: "Tylko jeden plik może zostać dołączony do wiadomości"
 | 
			
		||||
common/views/components/messaging-room.message.vue:
 | 
			
		||||
  is-read: "Przeczytano"
 | 
			
		||||
  deleted: "Wiadomość została usunięta"
 | 
			
		||||
@@ -328,7 +338,9 @@ common/views/components/nav.vue:
 | 
			
		||||
  develop: "Autorzy"
 | 
			
		||||
  feedback: "Podziel się opinią"
 | 
			
		||||
common/views/components/note-menu.vue:
 | 
			
		||||
  mention: "Wspomnij"
 | 
			
		||||
  detail: "Szczegóły"
 | 
			
		||||
  copy-content: "Skopiuj zawartość"
 | 
			
		||||
  copy-link: "Skopiuj adres"
 | 
			
		||||
  favorite: "Dodaj do ulubionych"
 | 
			
		||||
  unfavorite: "Usuń z ulubionych"
 | 
			
		||||
@@ -337,6 +349,17 @@ common/views/components/note-menu.vue:
 | 
			
		||||
  delete: "Usuń"
 | 
			
		||||
  delete-confirm: "Czy na pewno chcesz usunąć ten wpis?"
 | 
			
		||||
  remote: "Pokaż oryginał"
 | 
			
		||||
common/views/components/user-menu.vue:
 | 
			
		||||
  mention: "メンション"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  push-to-list: "リストに追加"
 | 
			
		||||
  select-list: "リストを選択してください"
 | 
			
		||||
  report-abuse: "スパムを報告"
 | 
			
		||||
  report-abuse-detail: "どのような迷惑行為を行っていますか?"
 | 
			
		||||
  report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
 | 
			
		||||
common/views/components/poll.vue:
 | 
			
		||||
  vote-to: "Zagłosuj na '{}'"
 | 
			
		||||
  vote-count: "{} głosów"
 | 
			
		||||
@@ -374,7 +397,7 @@ common/views/components/signin.vue:
 | 
			
		||||
  signin-with-discord: "Zaloguj się za pomocą Discorda"
 | 
			
		||||
  login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
 | 
			
		||||
common/views/components/signup.vue:
 | 
			
		||||
  invitation-code: "招待コード"
 | 
			
		||||
  invitation-code: "Kod zaproszenia"
 | 
			
		||||
  invitation-info: "招待コードをお持ちでない方は、<a href=\"{}\">管理者</a>までご連絡ください。"
 | 
			
		||||
  username: "Nazwa użytkownika"
 | 
			
		||||
  checking: "Sprawdzanie…"
 | 
			
		||||
@@ -403,25 +426,32 @@ common/views/components/stream-indicator.vue:
 | 
			
		||||
  connecting: "Łączenie"
 | 
			
		||||
  reconnecting: "Ponowne łączenie"
 | 
			
		||||
  connected: "Połączono"
 | 
			
		||||
common/views/components/notification-settings.vue:
 | 
			
		||||
  title: "Powiadomienia"
 | 
			
		||||
  mark-as-read-all-notifications: "Oznacz wszystkie powiadomienia jako przeczytane"
 | 
			
		||||
  mark-as-read-all-unread-notes: "Oznacz wszystkie wpisy jako przeczytane"
 | 
			
		||||
  mark-as-read-all-talk-messages: "Oznacz wszystkie rozmowy jako przeczytane"
 | 
			
		||||
  auto-watch: "Automatycznie nasłuchuj wpisów"
 | 
			
		||||
  auto-watch-desc: "Automatycznie otrzymuj powiadomienia o wpisach, w których zareagowałeś(-aś) lub odpowiedziałeś(-aś)."
 | 
			
		||||
common/views/components/integration-settings.vue:
 | 
			
		||||
  title: "サービス連携"
 | 
			
		||||
  connect: "Połącz"
 | 
			
		||||
  disconnect: "切断する"
 | 
			
		||||
  connected-to: "次のアカウントに接続されています"
 | 
			
		||||
  disconnect: "Rozłącz"
 | 
			
		||||
  connected-to: "Jesteś połączony(-a) z następującym kontem"
 | 
			
		||||
common/views/components/github-setting.vue:
 | 
			
		||||
  description: "お使いのGitHubアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでGitHubアカウント情報が表示されるようになったり、GitHubを用いた便利なサインインを利用できるようになります。"
 | 
			
		||||
  connected-to: "次のGitHubアカウントに接続されています"
 | 
			
		||||
  detail: "Więcej..."
 | 
			
		||||
  reconnect: "Połącz ponownie"
 | 
			
		||||
  connect: "GitHubと接続する"
 | 
			
		||||
  disconnect: "切断する"
 | 
			
		||||
  disconnect: "Rozłącz"
 | 
			
		||||
common/views/components/discord-setting.vue:
 | 
			
		||||
  description: "お使いのDiscordアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでDiscordアカウント情報が表示されるようになったり、Discordを用いた便利なサインインを利用できるようになります。"
 | 
			
		||||
  connected-to: "次のDiscordアカウントに接続されています"
 | 
			
		||||
  detail: "Szczegóły…"
 | 
			
		||||
  reconnect: "Połącz ponownie"
 | 
			
		||||
  connect: "Discordと接続する"
 | 
			
		||||
  disconnect: "切断する"
 | 
			
		||||
  disconnect: "Rozłącz"
 | 
			
		||||
common/views/components/uploader.vue:
 | 
			
		||||
  waiting: "Oczekiwanie"
 | 
			
		||||
common/views/components/visibility-chooser.vue:
 | 
			
		||||
@@ -432,8 +462,7 @@ common/views/components/visibility-chooser.vue:
 | 
			
		||||
  followers-desc: "Widoczny tylko dla osób, które Cię śledzą"
 | 
			
		||||
  specified: "Bezpośredni"
 | 
			
		||||
  specified-desc: "Tylko dla określonych użytkowników"
 | 
			
		||||
  private: "Prywatny"
 | 
			
		||||
  local-public: "公開 (ローカルのみ)"
 | 
			
		||||
  local-public: "Publiczny (tylko lokalnie)"
 | 
			
		||||
  local-public-desc: "リモートへは公開しない"
 | 
			
		||||
  local-home: "ホーム (ローカルのみ)"
 | 
			
		||||
  local-followers: "Dla śledzących (tylko lokalnie)"
 | 
			
		||||
@@ -459,18 +488,26 @@ common/views/components/profile-editor.vue:
 | 
			
		||||
  banner: "Baner"
 | 
			
		||||
  is-cat: "To konto jest prowadzone przez kota"
 | 
			
		||||
  is-bot: "To konto jest prowadzone przez bota"
 | 
			
		||||
  is-locked: "Żądanania śledzenia wymagają zatwierdzenia"
 | 
			
		||||
  careful-bot: "Botからのフォローだけ承認制にする"
 | 
			
		||||
  is-locked: "Prośby śledzenia wymagają zatwierdzenia"
 | 
			
		||||
  careful-bot: "Prośby śledzenia od botów wymagają zatwierdzenia"
 | 
			
		||||
  auto-accept-followed: "Automatyczne zatwierdzaj śledzenia od osób, które śledzisz."
 | 
			
		||||
  advanced: "Inne"
 | 
			
		||||
  privacy: "Prywatność"
 | 
			
		||||
  save: "Zapisz"
 | 
			
		||||
  saved: "Pomyślnie zaktualizowano profil"
 | 
			
		||||
  uploading: "アップロード中"
 | 
			
		||||
  upload-failed: "アップロードに失敗しました"
 | 
			
		||||
  email: "メール設定"
 | 
			
		||||
  uploading: "Wysyłanie"
 | 
			
		||||
  upload-failed: "Wysyłanie nie powiodło się"
 | 
			
		||||
  email: "Ustawienia e-mail"
 | 
			
		||||
  email-address: "Adres e-mail"
 | 
			
		||||
  email-verified: "メールアドレスが確認されました"
 | 
			
		||||
  email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
 | 
			
		||||
common/views/components/user-list-editor.vue:
 | 
			
		||||
  users: "Użytkownicy"
 | 
			
		||||
  rename: "Zmień nazwę listy"
 | 
			
		||||
  delete: "Usuń listę"
 | 
			
		||||
  remove-user: "Usuń z tej listy"
 | 
			
		||||
  delete-are-you-sure: "リスト「$1」を削除しますか?"
 | 
			
		||||
  deleted: "削除しました"
 | 
			
		||||
common/views/widgets/broadcast.vue:
 | 
			
		||||
  fetching: "Sprawdzanie"
 | 
			
		||||
  no-broadcasts: "Brak transmisji"
 | 
			
		||||
@@ -520,17 +557,17 @@ common/views/widgets/tips.vue:
 | 
			
		||||
  tips-line19: "Część okien może zostać odłączona z przeglądarki."
 | 
			
		||||
  tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示しています"
 | 
			
		||||
  tips-line21: "Możesz też używać API, aby tworzyć boty."
 | 
			
		||||
  tips-line23: "まゆかわいいよまゆ"
 | 
			
		||||
  tips-line23: "藍かわいいよ藍"
 | 
			
		||||
  tips-line24: "Misskey zaczął działać w 2014."
 | 
			
		||||
  tips-line25: "Możesz otrzymywać powiadomienia nawet jeżeli Misskey nie jest otwarty w obsługiwanej przeglądarce."
 | 
			
		||||
common/views/pages/404.vue:
 | 
			
		||||
  page-not-found: "ページが見つかりませんでした"
 | 
			
		||||
common/views/pages/not-found.vue:
 | 
			
		||||
  page-not-found: "Strona nie została znaleziona"
 | 
			
		||||
common/views/pages/follow.vue:
 | 
			
		||||
  signed-in-as: "Zalogowany jako {}"
 | 
			
		||||
  following: "Śledzisz"
 | 
			
		||||
  follow: "Śledź"
 | 
			
		||||
  request-pending: "Oczekiwanie na pozwolenie"
 | 
			
		||||
  follow-processing: "フォロー処理中"
 | 
			
		||||
  follow-processing: "Przetwarzanie śledzenia"
 | 
			
		||||
  follow-request: "Poproś o śledzenie"
 | 
			
		||||
desktop:
 | 
			
		||||
  banner-crop-title: "バナーとして表示する部分を選択"
 | 
			
		||||
@@ -576,7 +613,7 @@ desktop/views/components/drive-window.vue:
 | 
			
		||||
desktop/views/components/drive.file.vue:
 | 
			
		||||
  avatar: "Awatar"
 | 
			
		||||
  banner: "Baner"
 | 
			
		||||
  nsfw: "閲覧注意"
 | 
			
		||||
  nsfw: "NSFW"
 | 
			
		||||
  contextmenu:
 | 
			
		||||
    rename: "Zmień nazwę"
 | 
			
		||||
    mark-as-sensitive: "Oznacz jako zawartość wrażliwą"
 | 
			
		||||
@@ -644,7 +681,7 @@ desktop/views/components/friends-maker.vue:
 | 
			
		||||
desktop/views/components/game-window.vue:
 | 
			
		||||
  game: "Reversi"
 | 
			
		||||
desktop/views/components/home.vue:
 | 
			
		||||
  done: "Wyślij"
 | 
			
		||||
  done: "Zakończ"
 | 
			
		||||
  add-widget: "Dodaj widżet:"
 | 
			
		||||
  add: "Dodaj"
 | 
			
		||||
desktop/views/input-dialog.vue:
 | 
			
		||||
@@ -660,10 +697,12 @@ desktop/views/components/note-detail.vue:
 | 
			
		||||
  location: "Informacje o lokalizacji"
 | 
			
		||||
  renote: "Udostępnij"
 | 
			
		||||
  add-reaction: "Dodaj reakcję"
 | 
			
		||||
  undo-reaction: "リアクション解除"
 | 
			
		||||
desktop/views/components/note.vue:
 | 
			
		||||
  reply: "Odpowiedz"
 | 
			
		||||
  renote: "Renote"
 | 
			
		||||
  renote: "Udostępnij"
 | 
			
		||||
  add-reaction: "Dodaj reakcję"
 | 
			
		||||
  undo-reaction: "リアクション解除"
 | 
			
		||||
  detail: "Szczegóły"
 | 
			
		||||
  private: "この投稿は非公開です"
 | 
			
		||||
  deleted: "この投稿は削除されました"
 | 
			
		||||
@@ -729,12 +768,11 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  notification: "Powiadomienia"
 | 
			
		||||
  apps: "Aplikacje"
 | 
			
		||||
  tags: "Hashtagi"
 | 
			
		||||
  mute-and-block: "ミュート/ブロック"
 | 
			
		||||
  mute-and-block: "Wycisz / Zablokuj"
 | 
			
		||||
  blocking: "ブロック"
 | 
			
		||||
  security: "Bezpieczeństwo"
 | 
			
		||||
  signin: "Historia logowań"
 | 
			
		||||
  password: "Hasło"
 | 
			
		||||
  2fa: "Uwierzytelnianie dwuetapowe"
 | 
			
		||||
  other: "Inne"
 | 
			
		||||
  license: "Licencja"
 | 
			
		||||
  theme: "Motyw"
 | 
			
		||||
@@ -748,19 +786,16 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  web-search-engine-desc: "Np: https://www.google.com/?#q={{query}}"
 | 
			
		||||
  auto-popout: "Automatycznie pojawiające się okna"
 | 
			
		||||
  auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
 | 
			
		||||
  advanced: "Ustawienia zaawansowane"
 | 
			
		||||
  api-via-stream: "ストリームを経由したAPIリクエスト"
 | 
			
		||||
  api-via-stream-desc: "この設定をオンにすると、websocket接続を経由してAPIリクエストが行われます(パフォーマンス向上が期待できます)。オフにすると、ネイティブの fetch APIが利用されます。この設定はこのデバイスのみ有効です。"
 | 
			
		||||
  deck-nav: "デッキ内ナビゲーション"
 | 
			
		||||
  deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
 | 
			
		||||
  deck-default: "デッキをデフォルトのUIにする"
 | 
			
		||||
  deck-default: "Użyj Talię jako domyślne UI"
 | 
			
		||||
  display: "Wygląd i wyświetlanie"
 | 
			
		||||
  customize: "Dostosuj stronę główną"
 | 
			
		||||
  wallpaper: "Tapeta"
 | 
			
		||||
  choose-wallpaper: "Wybierz tło"
 | 
			
		||||
  delete-wallpaper: "Usuń tło"
 | 
			
		||||
  dark-mode: "Tryb ciemny"
 | 
			
		||||
  use-shadow: "UIに影を使用"
 | 
			
		||||
  use-shadow: "Użyj cieni w UI"
 | 
			
		||||
  rounded-corners: "Zaokrąglaj rogi w UI"
 | 
			
		||||
  circle-icons: "Używaj okrągłych ikon"
 | 
			
		||||
  contrasted-acct: "ユーザー名にコントラストを付ける"
 | 
			
		||||
@@ -769,20 +804,20 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  show-reply-target: "Pokazuj cel odpowiedzi"
 | 
			
		||||
  timeline: "Oś czasu"
 | 
			
		||||
  show-my-renotes: "Pokazuj moje udostępnienia na osi czasu"
 | 
			
		||||
  show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
 | 
			
		||||
  show-renoted-my-notes: "Pokazuj moje udostępnione wpisy na osi czasu"
 | 
			
		||||
  show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
 | 
			
		||||
  show-maps: "Automatycznie pokazuj mapę"
 | 
			
		||||
  remain-deleted-note: "削除された投稿を表示し続ける"
 | 
			
		||||
  deck-column-align: "デッキのカラムの配置"
 | 
			
		||||
  deck-column-align-center: "中央"
 | 
			
		||||
  deck-column-align-left: "左"
 | 
			
		||||
  deck-column-align-left: "Lewo"
 | 
			
		||||
  deck-column-align-flexible: "Elastyczne"
 | 
			
		||||
  deck-column-width: "Szerokość kolumn w talii"
 | 
			
		||||
  deck-column-width-narrow: "wąskie"
 | 
			
		||||
  deck-column-width-narrower: "やや狭"
 | 
			
		||||
  deck-column-width-normal: "Normalny"
 | 
			
		||||
  deck-column-width-wider: "やや広"
 | 
			
		||||
  deck-column-width-wide: "szeroki"
 | 
			
		||||
  deck-column-width-narrow: "Wąska"
 | 
			
		||||
  deck-column-width-narrower: "Trochę wąska"
 | 
			
		||||
  deck-column-width-normal: "Normalna"
 | 
			
		||||
  deck-column-width-wider: "Trochę szeroka"
 | 
			
		||||
  deck-column-width-wide: "Szeroka"
 | 
			
		||||
  sound: "Dźwięk"
 | 
			
		||||
  enable-sounds: "Włącz dźwięk"
 | 
			
		||||
  enable-sounds-desc: "Odtwarzaj dźwięk przy wstawianiu wpisów, wysyłaniu lub otrzymywaniu wiadomości. Opcja ta jest zapamiętywana przez przeglądarkę."
 | 
			
		||||
@@ -793,8 +828,6 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  cache-warn: "Pamięć podręczna informacji o koncie/wpisów/odpowiedzi/wiadomości/ustawień przechowywanych w przeglądarce zostanie usunięta. Będziesz musiał odświeżyć stronę po wyczyszczeniu."
 | 
			
		||||
  cache-cleared: "Wyczyszczono pamięć podręczną"
 | 
			
		||||
  cache-cleared-desc: "Proszę odświeżyć stronę."
 | 
			
		||||
  auto-watch: "Automatycznie nasłuchuj"
 | 
			
		||||
  auto-watch-desc: "Otrzymuj natychmiastowo informacje o wpisach/odpowiedziach/reakcjach."
 | 
			
		||||
  about: "O Misskey"
 | 
			
		||||
  operator: "Administrator instancji"
 | 
			
		||||
  update: "Aktualizacja Misskey"
 | 
			
		||||
@@ -817,10 +850,10 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  tools: "Narzędzia"
 | 
			
		||||
  task-manager: "Menedżer zadań"
 | 
			
		||||
  third-parties: "Autorzy trzeci"
 | 
			
		||||
  navbar-position: "ナビゲーションバーの位置"
 | 
			
		||||
  navbar-position-top: "上"
 | 
			
		||||
  navbar-position-left: "左"
 | 
			
		||||
  navbar-position-right: "右"
 | 
			
		||||
  navbar-position: "Pozycja paska nawigacji"
 | 
			
		||||
  navbar-position-top: "Góra"
 | 
			
		||||
  navbar-position-left: "Lewo"
 | 
			
		||||
  navbar-position-right: "Prawo"
 | 
			
		||||
desktop/views/components/settings.2fa.vue:
 | 
			
		||||
  intro: "Jeżeli skonfigurujesz uwierzytelnianie dwuetapowe, aby zablokować się będziesz potrzebować (oprócz hasła) kodu ze skonfigurowanego urządzenia (np. smartfonu), co zwiększy bezpieczeństwo."
 | 
			
		||||
  detail: "Zobacz szczegóły…"
 | 
			
		||||
@@ -833,6 +866,7 @@ desktop/views/components/settings.2fa.vue:
 | 
			
		||||
  enter-password: "Wprowadź hasło"
 | 
			
		||||
  authenticator: "Na początek musisz zainstalować Google Authenticator na swoim urządzeniu:"
 | 
			
		||||
  howtoinstall: "Jak zainstalować"
 | 
			
		||||
  token: "トークン"
 | 
			
		||||
  scan: "Później, zeskanuje ten kod QR:"
 | 
			
		||||
  done: "Wprowadź token wyświetlony na Twoim urządzeniu:"
 | 
			
		||||
  submit: "Wyślij"
 | 
			
		||||
@@ -840,20 +874,20 @@ desktop/views/components/settings.2fa.vue:
 | 
			
		||||
  failed: "Nie udało się skonfigurować uwierzytelniania dwuetapowego, upewnij się że wprowadziłeś prawidłowy token."
 | 
			
		||||
  info: "Od teraz, wprowadzaj token wyświetlany na urządzeniu przy każdym logowaniu do Misskey."
 | 
			
		||||
common/views/components/api-settings.vue:
 | 
			
		||||
  intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
 | 
			
		||||
  caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
 | 
			
		||||
  intro: "Aby uzyskać dostęp do API, ustaw ten token jako klucz 'i' parametrów żądań."
 | 
			
		||||
  caution: "Nie pokazuj tego tokenu osobom trzecim (nie wprowadzaj go nigdzie indziej), aby konto nie trafiło w niepowołane ręce."
 | 
			
		||||
  regeneration-of-token: "W przypadku wycieku tokenu, możesz wygenerować nowy."
 | 
			
		||||
  regenerate-token: "Wygeneruj nowy token"
 | 
			
		||||
  token: "Token:"
 | 
			
		||||
  enter-password: "Wprowadź hasło"
 | 
			
		||||
  console:
 | 
			
		||||
    title: 'Konsola API'
 | 
			
		||||
    endpoint: 'エンドポイント'
 | 
			
		||||
    parameter: 'Parametry'
 | 
			
		||||
    title: "Konsola API"
 | 
			
		||||
    endpoint: "エンドポイント"
 | 
			
		||||
    parameter: "Parametry"
 | 
			
		||||
    credential-info: "「i」パラメータは自動で付与されます。"
 | 
			
		||||
    send: 'Wyślij'
 | 
			
		||||
    sending: '応答待ち'
 | 
			
		||||
    response: '結果'
 | 
			
		||||
    send: "Wyślij"
 | 
			
		||||
    sending: "応答待ち"
 | 
			
		||||
    response: "結果"
 | 
			
		||||
desktop/views/components/settings.apps.vue:
 | 
			
		||||
  no-apps: "Brak zautoryzowanych aplikacji"
 | 
			
		||||
common/views/components/drive-settings.vue:
 | 
			
		||||
@@ -863,18 +897,18 @@ common/views/components/drive-settings.vue:
 | 
			
		||||
common/views/components/mute-and-block.vue:
 | 
			
		||||
  mute-and-block: "Wycisz / Zablokuj"
 | 
			
		||||
  mute: "Wycisz"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  block: "Zablokuj"
 | 
			
		||||
  no-muted-users: "Brak wyciszonych użytkowników"
 | 
			
		||||
  no-blocked-users: "Brak zablokowanych użytkowników"
 | 
			
		||||
  word-mute: "Wyciszenie słowa"
 | 
			
		||||
  muted-words: "ミュートされたキーワード"
 | 
			
		||||
  muted-words: "Wyciszone słowa kluczowe"
 | 
			
		||||
  muted-words-description: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります"
 | 
			
		||||
  save: "Zapisz"
 | 
			
		||||
common/views/components/password-settings.vue:
 | 
			
		||||
  reset: "Zmień hasło"
 | 
			
		||||
  enter-current-password: "現在のパスワードを入力してください"
 | 
			
		||||
  enter-new-password: "新しいパスワードを入力してください"
 | 
			
		||||
  enter-new-password-again: "もう一度新しいパスワードを入力してください"
 | 
			
		||||
  enter-current-password: "Wprowadź obecne hasło"
 | 
			
		||||
  enter-new-password: "Wprowadź nowe hasło"
 | 
			
		||||
  enter-new-password-again: "Wprowadź ponownie nowe hasło"
 | 
			
		||||
  not-match: "新しいパスワードが一致しません"
 | 
			
		||||
  changed: "パスワードを変更しました"
 | 
			
		||||
  failed: "パスワード変更に失敗しました"
 | 
			
		||||
@@ -884,8 +918,8 @@ desktop/views/components/sub-note-content.vue:
 | 
			
		||||
  media-count: "{}zawartości multimedialnej"
 | 
			
		||||
  poll: "Ankieta"
 | 
			
		||||
desktop/views/components/settings.tags.vue:
 | 
			
		||||
  title: "タグ"
 | 
			
		||||
  query: "クエリ (省略可)"
 | 
			
		||||
  title: "Tagi"
 | 
			
		||||
  query: "Zapytanie (opcjonalne)"
 | 
			
		||||
  add: "Dodaj"
 | 
			
		||||
  save: "Zapisz"
 | 
			
		||||
desktop/views/components/taskmanager.vue:
 | 
			
		||||
@@ -899,8 +933,8 @@ desktop/views/components/timeline.vue:
 | 
			
		||||
  messages: "Wiadomości"
 | 
			
		||||
  list: "Listy"
 | 
			
		||||
  hashtag: "Hashtag"
 | 
			
		||||
  add-tag-timeline: "ハッシュタグを追加"
 | 
			
		||||
  add-list: "リストを追加"
 | 
			
		||||
  add-tag-timeline: "Dodaj hashtag"
 | 
			
		||||
  add-list: "Dodaj listę"
 | 
			
		||||
  list-name: "リスト名"
 | 
			
		||||
desktop/views/components/ui.header.vue:
 | 
			
		||||
  welcome-back: "Witaj ponownie,"
 | 
			
		||||
@@ -926,7 +960,7 @@ desktop/views/components/ui.header.post.vue:
 | 
			
		||||
desktop/views/components/ui.header.search.vue:
 | 
			
		||||
  placeholder: "Szukaj"
 | 
			
		||||
desktop/views/components/received-follow-requests-window.vue:
 | 
			
		||||
  title: "Poproś o śledzenie"
 | 
			
		||||
  title: "Prośby o śledzenie"
 | 
			
		||||
  accept: "Zatwierdź"
 | 
			
		||||
  reject: "Odmów"
 | 
			
		||||
desktop/views/components/user-lists-window.vue:
 | 
			
		||||
@@ -955,6 +989,7 @@ admin/views/index.vue:
 | 
			
		||||
  federation: "連合"
 | 
			
		||||
  announcements: "Ogłoszenia"
 | 
			
		||||
  hashtags: "Hashtagi"
 | 
			
		||||
  abuse: "スパム報告"
 | 
			
		||||
  back-to-misskey: "Misskeyに戻る"
 | 
			
		||||
admin/views/dashboard.vue:
 | 
			
		||||
  dashboard: "ダッシュボード"
 | 
			
		||||
@@ -964,6 +999,12 @@ admin/views/dashboard.vue:
 | 
			
		||||
  instances: "インスタンス"
 | 
			
		||||
  this-instance: "このインスタンス"
 | 
			
		||||
  federated: "連合"
 | 
			
		||||
admin/views/abuse.vue:
 | 
			
		||||
  title: "スパム報告"
 | 
			
		||||
  target: "対象"
 | 
			
		||||
  reporter: "報告者"
 | 
			
		||||
  details: "詳細"
 | 
			
		||||
  remove-report: "削除"
 | 
			
		||||
admin/views/instance.vue:
 | 
			
		||||
  instance: "インスタンス"
 | 
			
		||||
  instance-name: "インスタンス名"
 | 
			
		||||
@@ -1010,6 +1051,8 @@ admin/views/instance.vue:
 | 
			
		||||
  max-note-text-length: "投稿の最大文字数"
 | 
			
		||||
  disable-registration: "ユーザー登録の受付を停止する"
 | 
			
		||||
  disable-local-timeline: "ローカルタイムラインを無効にする"
 | 
			
		||||
  disable-global-timeline: "グローバルタイムラインを無効にする"
 | 
			
		||||
  disabling-timelines-info: "これらのタイムラインを無効にしても、管理者およびモデレーターは引き続き利用できます。"
 | 
			
		||||
  invite: "Zaproś"
 | 
			
		||||
  save: "Zapisz"
 | 
			
		||||
  saved: "Zapisano"
 | 
			
		||||
@@ -1029,6 +1072,12 @@ admin/views/instance.vue:
 | 
			
		||||
  smtp-port: "SMTPポート"
 | 
			
		||||
  smtp-user: "SMTPユーザー"
 | 
			
		||||
  smtp-pass: "SMTPパスワード"
 | 
			
		||||
  serviceworker-config: "ServiceWorker"
 | 
			
		||||
  enable-serviceworker: "ServiceWorkerを有効にする"
 | 
			
		||||
  serviceworker-info: "プッシュ通知を行うには有効する必要があります。"
 | 
			
		||||
  vapid-publickey: "VAPID公開鍵"
 | 
			
		||||
  vapid-privatekey: "VAPID秘密鍵"
 | 
			
		||||
  vapid-info: "ServiceWorkerを有効にする場合、VAPIDキーペアを生成する必要があります。シェルで次のようにします:"
 | 
			
		||||
admin/views/charts.vue:
 | 
			
		||||
  title: "チャート"
 | 
			
		||||
  per-day: "1日ごと"
 | 
			
		||||
@@ -1047,6 +1096,7 @@ admin/views/charts.vue:
 | 
			
		||||
    notes-total: "投稿の積算"
 | 
			
		||||
    users: "ユーザーの増減"
 | 
			
		||||
    users-total: "ユーザーの積算"
 | 
			
		||||
    active-users: "アクティブユーザー数"
 | 
			
		||||
    drive: "ドライブ使用量の増減"
 | 
			
		||||
    drive-total: "ドライブ使用量の積算"
 | 
			
		||||
    drive-files: "ドライブのファイル数の増減"
 | 
			
		||||
@@ -1054,10 +1104,32 @@ admin/views/charts.vue:
 | 
			
		||||
    network-requests: "Żądania"
 | 
			
		||||
    network-time: "Czas reakcji"
 | 
			
		||||
    network-usage: "通信量"
 | 
			
		||||
admin/views/drive.vue:
 | 
			
		||||
  operation: "操作"
 | 
			
		||||
  fileid-or-url: "ファイルIDまたはファイルURL"
 | 
			
		||||
  file-not-found: "ファイルが見つかりません"
 | 
			
		||||
  lookup: "照会"
 | 
			
		||||
  sort:
 | 
			
		||||
    title: "ソート"
 | 
			
		||||
    createdAtAsc: "アップロード日時が古い順"
 | 
			
		||||
    createdAtDesc: "アップロード日時が新しい順"
 | 
			
		||||
    sizeAsc: "サイズが小さい順"
 | 
			
		||||
    sizeDesc: "サイズが大きい順"
 | 
			
		||||
  origin:
 | 
			
		||||
    title: "Źródło"
 | 
			
		||||
    combined: "ローカル+リモート"
 | 
			
		||||
    local: "ローカル"
 | 
			
		||||
    remote: "リモート"
 | 
			
		||||
  delete: "Usuń"
 | 
			
		||||
  deleted: "削除しました"
 | 
			
		||||
  mark-as-sensitive: "閲覧注意に設定"
 | 
			
		||||
  unmark-as-sensitive: "閲覧注意を解除"
 | 
			
		||||
  marked-as-sensitive: "閲覧注意に設定しました"
 | 
			
		||||
  unmarked-as-sensitive: "閲覧注意を解除しました"
 | 
			
		||||
admin/views/users.vue:
 | 
			
		||||
  operation: "操作"
 | 
			
		||||
  username-or-userid: "ユーザー名またはユーザーID"
 | 
			
		||||
  user-not-found: "ユーザーが見つかりません"
 | 
			
		||||
  user-not-found: "Nie znaleziono użytkownika"
 | 
			
		||||
  lookup: "照会"
 | 
			
		||||
  reset-password: "パスワードをリセット"
 | 
			
		||||
  password-updated: "パスワードは現在「{password}」です"
 | 
			
		||||
@@ -1077,6 +1149,14 @@ admin/views/users.vue:
 | 
			
		||||
      createdAtDesc: "登録日時が新しい順"
 | 
			
		||||
      updatedAtAsc: "更新日時が古い順"
 | 
			
		||||
      updatedAtDesc: "更新日時が新しい順"
 | 
			
		||||
    state:
 | 
			
		||||
      title: "状態"
 | 
			
		||||
      all: "すべて"
 | 
			
		||||
      admin: "管理者"
 | 
			
		||||
      moderator: "モデレーター"
 | 
			
		||||
      adminOrModerator: "管理者+モデレーター"
 | 
			
		||||
      verified: "公式アカウント"
 | 
			
		||||
      suspended: "凍結済み"
 | 
			
		||||
    origin:
 | 
			
		||||
      title: "Źródło"
 | 
			
		||||
      combined: "ローカル+リモート"
 | 
			
		||||
@@ -1089,6 +1169,8 @@ admin/views/moderators.vue:
 | 
			
		||||
    title: "モデレーターの登録"
 | 
			
		||||
    add: "Zarejestruj się"
 | 
			
		||||
    added: "モデレーターを登録しました"
 | 
			
		||||
    remove: "解除"
 | 
			
		||||
    removed: "モデレーター登録を解除しました"
 | 
			
		||||
admin/views/emoji.vue:
 | 
			
		||||
  add-emoji:
 | 
			
		||||
    title: "絵文字の登録"
 | 
			
		||||
@@ -1170,17 +1252,7 @@ desktop/views/pages/user/user.photos.vue:
 | 
			
		||||
  no-photos: "Brak zdjęć"
 | 
			
		||||
desktop/views/pages/user/user.profile.vue:
 | 
			
		||||
  follows-you: "Śledzi Cię"
 | 
			
		||||
  stalk: "Stalkuj"
 | 
			
		||||
  stalking: "Stalkujesz"
 | 
			
		||||
  unstalk: "Przestań stalkować"
 | 
			
		||||
  mute: "Wycisz"
 | 
			
		||||
  muted: "Wyciszyłeś"
 | 
			
		||||
  unmute: "Cofnij wyciszenie"
 | 
			
		||||
  block: "Zablokuj"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  block-confirm: "このユーザーをブロックしますか?"
 | 
			
		||||
  push-to-a-list: "Dodaj do listy"
 | 
			
		||||
  list-pushed: "Dodałeś(-aś) {user} do {list}."
 | 
			
		||||
  menu: "メニュー"
 | 
			
		||||
desktop/views/pages/user/user.header.vue:
 | 
			
		||||
  posts: "Wpisy"
 | 
			
		||||
  following: "Śledzeni"
 | 
			
		||||
@@ -1194,6 +1266,7 @@ desktop/views/pages/user/user.timeline.vue:
 | 
			
		||||
  default: "Wpisy"
 | 
			
		||||
  with-replies: "Wpisy i odpowiedzi"
 | 
			
		||||
  with-media: "Multimedia"
 | 
			
		||||
  my-posts: "Moje wpisy"
 | 
			
		||||
  empty: "Ten użytkownik nie umieścił jeszcze niczego."
 | 
			
		||||
desktop/views/widgets/messaging.vue:
 | 
			
		||||
  title: "Wiadomości"
 | 
			
		||||
@@ -1237,14 +1310,14 @@ mobile/views/components/drive-file-chooser.vue:
 | 
			
		||||
mobile/views/components/drive-folder-chooser.vue:
 | 
			
		||||
  select-folder: "Wybierz katalog"
 | 
			
		||||
mobile/views/components/drive.file.vue:
 | 
			
		||||
  nsfw: "閲覧注意"
 | 
			
		||||
  nsfw: "NSFW"
 | 
			
		||||
mobile/views/components/drive.file-detail.vue:
 | 
			
		||||
  download: "Pobierz"
 | 
			
		||||
  rename: "Zmień nazwę"
 | 
			
		||||
  move: "Przenieś"
 | 
			
		||||
  hash: "Hash (md5)"
 | 
			
		||||
  exif: "EXIF"
 | 
			
		||||
  nsfw: "閲覧注意"
 | 
			
		||||
  nsfw: "NSFW"
 | 
			
		||||
  mark-as-sensitive: "閲覧注意に設定"
 | 
			
		||||
  unmark-as-sensitive: "閲覧注意を解除"
 | 
			
		||||
mobile/views/components/media-image.vue:
 | 
			
		||||
@@ -1257,7 +1330,7 @@ common/views/components/follow-button.vue:
 | 
			
		||||
  following: "フォロー中"
 | 
			
		||||
  follow: "Śledź"
 | 
			
		||||
  request-pending: "フォロー許可待ち"
 | 
			
		||||
  follow-processing: "フォロー処理中"
 | 
			
		||||
  follow-processing: "Przetwarzanie"
 | 
			
		||||
  follow-request: "Poproś o śledzenie"
 | 
			
		||||
mobile/views/components/friends-maker.vue:
 | 
			
		||||
  title: "Zacznij śledzić ludzi takich jak Ty"
 | 
			
		||||
@@ -1384,7 +1457,7 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  timeline: "Oś czasu"
 | 
			
		||||
  show-reply-target: "Pokazuj cel odpowiedzi"
 | 
			
		||||
  show-my-renotes: "Pokazuj moje udostępnienia"
 | 
			
		||||
  show-renoted-my-notes: "自分の投稿のRenoteを表示する"
 | 
			
		||||
  show-renoted-my-notes: "Pokazuj moje udostępnione wpisy"
 | 
			
		||||
  show-local-renotes: "ローカルの投稿のRenoteを表示する"
 | 
			
		||||
  post-style: "Styl wpisów"
 | 
			
		||||
  post-style-standard: "Standardowy"
 | 
			
		||||
@@ -1392,7 +1465,6 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  notification-position: "通知の表示"
 | 
			
		||||
  notification-position-bottom: "Dół"
 | 
			
		||||
  notification-position-top: "Góra"
 | 
			
		||||
  theme: "Motyw"
 | 
			
		||||
  behavior: "Zachowanie"
 | 
			
		||||
  fetch-on-scroll: "Automatycznie ładuj po przeciągnięciu w dół"
 | 
			
		||||
  note-visibility: "Widoczność wpisów"
 | 
			
		||||
@@ -1416,7 +1488,6 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  signout: "Wyloguj"
 | 
			
		||||
  sound: "Dźwięk"
 | 
			
		||||
  enable-sounds: "Włącz dźwięk"
 | 
			
		||||
  mark-as-read-all-unread-notes: "すべての投稿を既読にする"
 | 
			
		||||
  password: "Hasło"
 | 
			
		||||
mobile/views/pages/user.vue:
 | 
			
		||||
  follows-you: "Śledzi Cię"
 | 
			
		||||
@@ -1426,15 +1497,7 @@ mobile/views/pages/user.vue:
 | 
			
		||||
  overview: "Przegląd"
 | 
			
		||||
  timeline: "Oś czasu"
 | 
			
		||||
  media: "Multimedia"
 | 
			
		||||
  is-suspended: "To konto zostało zablokowane"
 | 
			
		||||
  mute: "Wycisz"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "Zablokuj"
 | 
			
		||||
  unblock: "Odblokuj"
 | 
			
		||||
  years-old: "{age} lat"
 | 
			
		||||
  push-to-list: "Dodaj do listy"
 | 
			
		||||
  select-list: "Wybierz listę"
 | 
			
		||||
  list-pushed: "{user}を{list}に追加しました"
 | 
			
		||||
mobile/views/pages/user/home.vue:
 | 
			
		||||
  recent-notes: "Ostatnie wpisy"
 | 
			
		||||
  images: "Zdjęcia"
 | 
			
		||||
@@ -1465,7 +1528,7 @@ deck:
 | 
			
		||||
  list: "Listy"
 | 
			
		||||
  swap-left: "Przesuń w lewo"
 | 
			
		||||
  swap-right: "Przesuń w prawo"
 | 
			
		||||
  swap-up: "上に移動"
 | 
			
		||||
  swap-up: "Przenieś w górę"
 | 
			
		||||
  swap-down: "下に移動"
 | 
			
		||||
  remove: "Usuń"
 | 
			
		||||
  add-column: "Dodaj kolumnę"
 | 
			
		||||
@@ -1484,7 +1547,6 @@ deck/deck.user-column.vue:
 | 
			
		||||
  activity: "Aktywność"
 | 
			
		||||
  timeline: "Oś czasu"
 | 
			
		||||
  pinned-notes: "Przypięte posty"
 | 
			
		||||
  push-to-a-list: "Dodaj do listy"
 | 
			
		||||
docs:
 | 
			
		||||
  edit-this-page-on-github: "Znalazłeś błąd lub chcesz pomóc w tworzeniu dokumentacji?"
 | 
			
		||||
  edit-this-page-on-github-link: "Edytuj stronę na GitHubie!"
 | 
			
		||||
 
 | 
			
		||||
@@ -27,6 +27,7 @@ common:
 | 
			
		||||
  do-not-copy-paste: "Por favor, não digite ou copie o código aqui. A conta pode ser comprometida."
 | 
			
		||||
  load-more: "もっと読み込む"
 | 
			
		||||
  enter-password: "パスワードを入力してください"
 | 
			
		||||
  2fa: "二段階認証"
 | 
			
		||||
  got-it: "Entendi!"
 | 
			
		||||
  customization-tips:
 | 
			
		||||
    title: "Dicas de personalização"
 | 
			
		||||
@@ -90,7 +91,6 @@ common:
 | 
			
		||||
    followers-desc: "自分のフォロワーにのみ公開"
 | 
			
		||||
    specified: "ダイレクト"
 | 
			
		||||
    specified-desc: "指定したユーザーにのみ公開"
 | 
			
		||||
    private: "非公開"
 | 
			
		||||
    local-public: "公開 (ローカルのみ)"
 | 
			
		||||
    local-home: "ホーム (ローカルのみ)"
 | 
			
		||||
    local-followers: "フォロワー (ローカルのみ)"
 | 
			
		||||
@@ -110,8 +110,7 @@ common:
 | 
			
		||||
  my-token-regenerated: "Seu token foi recriado, portanto você foi deslogado."
 | 
			
		||||
  i-like-sushi: "Eu prefiro sushi a pudim"
 | 
			
		||||
  show-reversi-board-labels: "Mostrar etiquetas de colunas e linhas no Reversi"
 | 
			
		||||
  use-white-black-reversi-stones: "リバーシに白黒の石を使う"
 | 
			
		||||
  use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
 | 
			
		||||
  use-avatar-reversi-stones: "リバーシの石にアバターを使う"
 | 
			
		||||
  verified-user: "Conta verificada"
 | 
			
		||||
  disable-animated-mfm: "Desativar texto animado nas publicações"
 | 
			
		||||
  suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
 | 
			
		||||
@@ -122,14 +121,21 @@ common:
 | 
			
		||||
  reduce-motion: "UIの動きを減らす"
 | 
			
		||||
  this-setting-is-this-device-only: "このデバイスのみ"
 | 
			
		||||
  use-os-default-emojis: "OS標準の絵文字を使用"
 | 
			
		||||
  do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
 | 
			
		||||
  line-width: "線の太さ"
 | 
			
		||||
  line-width-thin: "細い"
 | 
			
		||||
  line-width-normal: "普通"
 | 
			
		||||
  line-width-thick: "太い"
 | 
			
		||||
  hide-password: "パスワードを隠す"
 | 
			
		||||
  show-password: "パスワードを表示する"
 | 
			
		||||
  do-not-use-in-production: "これは開発ビルドです。本番環境で使用しないでください。"
 | 
			
		||||
  user-suspended: "このユーザーは凍結されています。"
 | 
			
		||||
  is-remote-user: "このユーザー情報はコピーです。"
 | 
			
		||||
  is-remote-post: "この投稿情報はコピーです。"
 | 
			
		||||
  view-on-remote: "正確な情報を見る"
 | 
			
		||||
  renoted-by: "{user}がRenote"
 | 
			
		||||
  error:
 | 
			
		||||
    title: '問題が発生しました'
 | 
			
		||||
    retry: 'やり直す'
 | 
			
		||||
    title: "問題が発生しました"
 | 
			
		||||
    retry: "やり直す"
 | 
			
		||||
  reversi:
 | 
			
		||||
    drawn: "Empatado"
 | 
			
		||||
    my-turn: "Seu turno"
 | 
			
		||||
@@ -165,6 +171,7 @@ common:
 | 
			
		||||
    hashtags: "Hashtags"
 | 
			
		||||
  dev: "アプリの作成に失敗しました。再度お試しください。"
 | 
			
		||||
  ai-chan-kawaii: "藍ちゃかわいい"
 | 
			
		||||
  you: "あなた"
 | 
			
		||||
auth/views/form.vue:
 | 
			
		||||
  share-access: "<i>{name}</i>があなたのアカウントにアクセスすることを許可しますか?"
 | 
			
		||||
  permission-ask: "Este aplicativo precisa das seguintes permissões:"
 | 
			
		||||
@@ -260,6 +267,7 @@ common/views/components/media-banner.vue:
 | 
			
		||||
  sensitive: "閲覧注意"
 | 
			
		||||
  click-to-show: "クリックして表示"
 | 
			
		||||
common/views/components/theme.vue:
 | 
			
		||||
  theme: "テーマ"
 | 
			
		||||
  light-theme: "非ダークモード時に使用するテーマ"
 | 
			
		||||
  dark-theme: "ダークモード時に使用するテーマ"
 | 
			
		||||
  light-themes: "明るいテーマ"
 | 
			
		||||
@@ -276,6 +284,7 @@ common/views/components/theme.vue:
 | 
			
		||||
  base-theme: "ベーステーマ"
 | 
			
		||||
  base-theme-light: "Light"
 | 
			
		||||
  base-theme-dark: "Dark"
 | 
			
		||||
  find-more-theme: "その他のテーマを入手"
 | 
			
		||||
  theme-name: "テーマ名"
 | 
			
		||||
  preview-created-theme: "プレビュー"
 | 
			
		||||
  invalid-theme: "テーマが正しくありません。"
 | 
			
		||||
@@ -299,6 +308,7 @@ common/views/components/cw-button.vue:
 | 
			
		||||
  show: "もっと見る"
 | 
			
		||||
  chars: "{count}文字"
 | 
			
		||||
  files: "{count}ファイル"
 | 
			
		||||
  poll: "アンケート"
 | 
			
		||||
common/views/components/messaging.vue:
 | 
			
		||||
  search-user: "ユーザーを探す"
 | 
			
		||||
  you: "Você"
 | 
			
		||||
@@ -328,7 +338,9 @@ common/views/components/nav.vue:
 | 
			
		||||
  develop: "開発者"
 | 
			
		||||
  feedback: "フィードバック"
 | 
			
		||||
common/views/components/note-menu.vue:
 | 
			
		||||
  mention: "メンション"
 | 
			
		||||
  detail: "詳細"
 | 
			
		||||
  copy-content: "内容をコピー"
 | 
			
		||||
  copy-link: "リンクをコピー"
 | 
			
		||||
  favorite: "お気に入り"
 | 
			
		||||
  unfavorite: "お気に入り解除"
 | 
			
		||||
@@ -337,6 +349,17 @@ common/views/components/note-menu.vue:
 | 
			
		||||
  delete: "削除"
 | 
			
		||||
  delete-confirm: "この投稿を削除しますか?"
 | 
			
		||||
  remote: "投稿元で見る"
 | 
			
		||||
common/views/components/user-menu.vue:
 | 
			
		||||
  mention: "メンション"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  push-to-list: "リストに追加"
 | 
			
		||||
  select-list: "リストを選択してください"
 | 
			
		||||
  report-abuse: "スパムを報告"
 | 
			
		||||
  report-abuse-detail: "どのような迷惑行為を行っていますか?"
 | 
			
		||||
  report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
 | 
			
		||||
common/views/components/poll.vue:
 | 
			
		||||
  vote-to: "「{}」に投票する"
 | 
			
		||||
  vote-count: "{}票"
 | 
			
		||||
@@ -403,6 +426,13 @@ common/views/components/stream-indicator.vue:
 | 
			
		||||
  connecting: "接続中"
 | 
			
		||||
  reconnecting: "再接続中"
 | 
			
		||||
  connected: "接続完了"
 | 
			
		||||
common/views/components/notification-settings.vue:
 | 
			
		||||
  title: "通知"
 | 
			
		||||
  mark-as-read-all-notifications: "すべての通知を既読にする"
 | 
			
		||||
  mark-as-read-all-unread-notes: "すべての投稿を既読にする"
 | 
			
		||||
  mark-as-read-all-talk-messages: "すべてのトークを既読にする"
 | 
			
		||||
  auto-watch: "投稿の自動ウォッチ"
 | 
			
		||||
  auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。"
 | 
			
		||||
common/views/components/integration-settings.vue:
 | 
			
		||||
  title: "サービス連携"
 | 
			
		||||
  connect: "接続する"
 | 
			
		||||
@@ -432,7 +462,6 @@ common/views/components/visibility-chooser.vue:
 | 
			
		||||
  followers-desc: "自分のフォロワーにのみ公開"
 | 
			
		||||
  specified: "ダイレクト"
 | 
			
		||||
  specified-desc: "指定したユーザーにのみ公開"
 | 
			
		||||
  private: "非公開"
 | 
			
		||||
  local-public: "公開 (ローカルのみ)"
 | 
			
		||||
  local-public-desc: "リモートへは公開しない"
 | 
			
		||||
  local-home: "ホーム (ローカルのみ)"
 | 
			
		||||
@@ -461,6 +490,7 @@ common/views/components/profile-editor.vue:
 | 
			
		||||
  is-bot: "このアカウントはBotです"
 | 
			
		||||
  is-locked: "フォローを承認制にする"
 | 
			
		||||
  careful-bot: "Botからのフォローだけ承認制にする"
 | 
			
		||||
  auto-accept-followed: "フォローしているユーザーからのフォローを自動承認する"
 | 
			
		||||
  advanced: "その他"
 | 
			
		||||
  privacy: "プライバシー"
 | 
			
		||||
  save: "保存"
 | 
			
		||||
@@ -471,6 +501,13 @@ common/views/components/profile-editor.vue:
 | 
			
		||||
  email-address: "メールアドレス"
 | 
			
		||||
  email-verified: "メールアドレスが確認されました"
 | 
			
		||||
  email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
 | 
			
		||||
common/views/components/user-list-editor.vue:
 | 
			
		||||
  users: "ユーザー"
 | 
			
		||||
  rename: "リスト名を変更"
 | 
			
		||||
  delete: "リストを削除"
 | 
			
		||||
  remove-user: "このリストから削除"
 | 
			
		||||
  delete-are-you-sure: "リスト「$1」を削除しますか?"
 | 
			
		||||
  deleted: "削除しました"
 | 
			
		||||
common/views/widgets/broadcast.vue:
 | 
			
		||||
  fetching: "確認中"
 | 
			
		||||
  no-broadcasts: "お知らせはありません"
 | 
			
		||||
@@ -520,10 +557,10 @@ common/views/widgets/tips.vue:
 | 
			
		||||
  tips-line19: "いくつかのウィンドウはブラウザの外に切り離すことができます"
 | 
			
		||||
  tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示しています"
 | 
			
		||||
  tips-line21: "APIを利用してbotの開発なども行えます"
 | 
			
		||||
  tips-line23: "まゆかわいいよまゆ"
 | 
			
		||||
  tips-line23: "藍かわいいよ藍"
 | 
			
		||||
  tips-line24: "Misskeyは2014年にサービスを開始しました"
 | 
			
		||||
  tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
 | 
			
		||||
common/views/pages/404.vue:
 | 
			
		||||
common/views/pages/not-found.vue:
 | 
			
		||||
  page-not-found: "ページが見つかりませんでした"
 | 
			
		||||
common/views/pages/follow.vue:
 | 
			
		||||
  signed-in-as: "{}としてサインイン中"
 | 
			
		||||
@@ -660,10 +697,12 @@ desktop/views/components/note-detail.vue:
 | 
			
		||||
  location: "位置情報"
 | 
			
		||||
  renote: "Renote"
 | 
			
		||||
  add-reaction: "リアクション"
 | 
			
		||||
  undo-reaction: "リアクション解除"
 | 
			
		||||
desktop/views/components/note.vue:
 | 
			
		||||
  reply: "返信"
 | 
			
		||||
  renote: "Renote"
 | 
			
		||||
  add-reaction: "リアクション"
 | 
			
		||||
  undo-reaction: "リアクション解除"
 | 
			
		||||
  detail: "詳細"
 | 
			
		||||
  private: "この投稿は非公開です"
 | 
			
		||||
  deleted: "この投稿は削除されました"
 | 
			
		||||
@@ -734,7 +773,6 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  security: "セキュリティ"
 | 
			
		||||
  signin: "サインイン履歴"
 | 
			
		||||
  password: "パスワード"
 | 
			
		||||
  2fa: "二段階認証"
 | 
			
		||||
  other: "その他"
 | 
			
		||||
  license: "ライセンス"
 | 
			
		||||
  theme: "テーマ"
 | 
			
		||||
@@ -748,9 +786,6 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
 | 
			
		||||
  auto-popout: "ウィンドウの自動ポップアウト"
 | 
			
		||||
  auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
 | 
			
		||||
  advanced: "詳細設定"
 | 
			
		||||
  api-via-stream: "ストリームを経由したAPIリクエスト"
 | 
			
		||||
  api-via-stream-desc: "この設定をオンにすると、websocket接続を経由してAPIリクエストが行われます(パフォーマンス向上が期待できます)。オフにすると、ネイティブの fetch APIが利用されます。この設定はこのデバイスのみ有効です。"
 | 
			
		||||
  deck-nav: "デッキ内ナビゲーション"
 | 
			
		||||
  deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
 | 
			
		||||
  deck-default: "デッキをデフォルトのUIにする"
 | 
			
		||||
@@ -793,8 +828,6 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  cache-warn: "クリーンアップを行うと、ブラウザに記憶されたアカウント情報のキャッシュ、書きかけの投稿・返信・メッセージ、およびその他のデータ(設定情報含む)が削除されます。クリーンアップを行った後はページを再度読み込みする必要があります。"
 | 
			
		||||
  cache-cleared: "キャッシュを削除しました"
 | 
			
		||||
  cache-cleared-desc: "ページを再度読み込みしてください。"
 | 
			
		||||
  auto-watch: "投稿の自動ウォッチ"
 | 
			
		||||
  auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。"
 | 
			
		||||
  about: "Misskeyについて"
 | 
			
		||||
  operator: "このサーバーの運営者"
 | 
			
		||||
  update: "Misskey Update"
 | 
			
		||||
@@ -833,6 +866,7 @@ desktop/views/components/settings.2fa.vue:
 | 
			
		||||
  enter-password: "パスワードを入力してください"
 | 
			
		||||
  authenticator: "まず、Google Authenticatorをお使いのデバイスにインストールします:"
 | 
			
		||||
  howtoinstall: "インストール方法はこちら"
 | 
			
		||||
  token: "トークン"
 | 
			
		||||
  scan: "次に、表示されているQRコードをスキャンします:"
 | 
			
		||||
  done: "お使いのデバイスに表示されているトークンを入力して完了します:"
 | 
			
		||||
  submit: "完了"
 | 
			
		||||
@@ -847,13 +881,13 @@ common/views/components/api-settings.vue:
 | 
			
		||||
  token: "Token:"
 | 
			
		||||
  enter-password: "パスワードを入力してください"
 | 
			
		||||
  console:
 | 
			
		||||
    title: 'APIコンソール'
 | 
			
		||||
    endpoint: 'エンドポイント'
 | 
			
		||||
    parameter: 'パラメータ'
 | 
			
		||||
    title: "APIコンソール"
 | 
			
		||||
    endpoint: "エンドポイント"
 | 
			
		||||
    parameter: "パラメータ"
 | 
			
		||||
    credential-info: "「i」パラメータは自動で付与されます。"
 | 
			
		||||
    send: '送信'
 | 
			
		||||
    sending: '応答待ち'
 | 
			
		||||
    response: '結果'
 | 
			
		||||
    send: "送信"
 | 
			
		||||
    sending: "応答待ち"
 | 
			
		||||
    response: "結果"
 | 
			
		||||
desktop/views/components/settings.apps.vue:
 | 
			
		||||
  no-apps: "連携しているアプリケーションはありません"
 | 
			
		||||
common/views/components/drive-settings.vue:
 | 
			
		||||
@@ -955,6 +989,7 @@ admin/views/index.vue:
 | 
			
		||||
  federation: "連合"
 | 
			
		||||
  announcements: "お知らせ"
 | 
			
		||||
  hashtags: "ハッシュタグ"
 | 
			
		||||
  abuse: "スパム報告"
 | 
			
		||||
  back-to-misskey: "Misskeyに戻る"
 | 
			
		||||
admin/views/dashboard.vue:
 | 
			
		||||
  dashboard: "ダッシュボード"
 | 
			
		||||
@@ -964,6 +999,12 @@ admin/views/dashboard.vue:
 | 
			
		||||
  instances: "インスタンス"
 | 
			
		||||
  this-instance: "このインスタンス"
 | 
			
		||||
  federated: "連合"
 | 
			
		||||
admin/views/abuse.vue:
 | 
			
		||||
  title: "スパム報告"
 | 
			
		||||
  target: "対象"
 | 
			
		||||
  reporter: "報告者"
 | 
			
		||||
  details: "詳細"
 | 
			
		||||
  remove-report: "削除"
 | 
			
		||||
admin/views/instance.vue:
 | 
			
		||||
  instance: "インスタンス"
 | 
			
		||||
  instance-name: "インスタンス名"
 | 
			
		||||
@@ -1010,6 +1051,8 @@ admin/views/instance.vue:
 | 
			
		||||
  max-note-text-length: "投稿の最大文字数"
 | 
			
		||||
  disable-registration: "ユーザー登録の受付を停止する"
 | 
			
		||||
  disable-local-timeline: "ローカルタイムラインを無効にする"
 | 
			
		||||
  disable-global-timeline: "グローバルタイムラインを無効にする"
 | 
			
		||||
  disabling-timelines-info: "これらのタイムラインを無効にしても、管理者およびモデレーターは引き続き利用できます。"
 | 
			
		||||
  invite: "招待"
 | 
			
		||||
  save: "保存"
 | 
			
		||||
  saved: "保存しました"
 | 
			
		||||
@@ -1029,6 +1072,12 @@ admin/views/instance.vue:
 | 
			
		||||
  smtp-port: "SMTPポート"
 | 
			
		||||
  smtp-user: "SMTPユーザー"
 | 
			
		||||
  smtp-pass: "SMTPパスワード"
 | 
			
		||||
  serviceworker-config: "ServiceWorker"
 | 
			
		||||
  enable-serviceworker: "ServiceWorkerを有効にする"
 | 
			
		||||
  serviceworker-info: "プッシュ通知を行うには有効する必要があります。"
 | 
			
		||||
  vapid-publickey: "VAPID公開鍵"
 | 
			
		||||
  vapid-privatekey: "VAPID秘密鍵"
 | 
			
		||||
  vapid-info: "ServiceWorkerを有効にする場合、VAPIDキーペアを生成する必要があります。シェルで次のようにします:"
 | 
			
		||||
admin/views/charts.vue:
 | 
			
		||||
  title: "チャート"
 | 
			
		||||
  per-day: "1日ごと"
 | 
			
		||||
@@ -1047,6 +1096,7 @@ admin/views/charts.vue:
 | 
			
		||||
    notes-total: "投稿の積算"
 | 
			
		||||
    users: "ユーザーの増減"
 | 
			
		||||
    users-total: "ユーザーの積算"
 | 
			
		||||
    active-users: "アクティブユーザー数"
 | 
			
		||||
    drive: "ドライブ使用量の増減"
 | 
			
		||||
    drive-total: "ドライブ使用量の積算"
 | 
			
		||||
    drive-files: "ドライブのファイル数の増減"
 | 
			
		||||
@@ -1054,6 +1104,28 @@ admin/views/charts.vue:
 | 
			
		||||
    network-requests: "リクエスト"
 | 
			
		||||
    network-time: "応答時間"
 | 
			
		||||
    network-usage: "通信量"
 | 
			
		||||
admin/views/drive.vue:
 | 
			
		||||
  operation: "操作"
 | 
			
		||||
  fileid-or-url: "ファイルIDまたはファイルURL"
 | 
			
		||||
  file-not-found: "ファイルが見つかりません"
 | 
			
		||||
  lookup: "照会"
 | 
			
		||||
  sort:
 | 
			
		||||
    title: "ソート"
 | 
			
		||||
    createdAtAsc: "アップロード日時が古い順"
 | 
			
		||||
    createdAtDesc: "アップロード日時が新しい順"
 | 
			
		||||
    sizeAsc: "サイズが小さい順"
 | 
			
		||||
    sizeDesc: "サイズが大きい順"
 | 
			
		||||
  origin:
 | 
			
		||||
    title: "オリジン"
 | 
			
		||||
    combined: "ローカル+リモート"
 | 
			
		||||
    local: "ローカル"
 | 
			
		||||
    remote: "リモート"
 | 
			
		||||
  delete: "削除"
 | 
			
		||||
  deleted: "削除しました"
 | 
			
		||||
  mark-as-sensitive: "閲覧注意に設定"
 | 
			
		||||
  unmark-as-sensitive: "閲覧注意を解除"
 | 
			
		||||
  marked-as-sensitive: "閲覧注意に設定しました"
 | 
			
		||||
  unmarked-as-sensitive: "閲覧注意を解除しました"
 | 
			
		||||
admin/views/users.vue:
 | 
			
		||||
  operation: "操作"
 | 
			
		||||
  username-or-userid: "ユーザー名またはユーザーID"
 | 
			
		||||
@@ -1077,6 +1149,14 @@ admin/views/users.vue:
 | 
			
		||||
      createdAtDesc: "登録日時が新しい順"
 | 
			
		||||
      updatedAtAsc: "更新日時が古い順"
 | 
			
		||||
      updatedAtDesc: "更新日時が新しい順"
 | 
			
		||||
    state:
 | 
			
		||||
      title: "状態"
 | 
			
		||||
      all: "すべて"
 | 
			
		||||
      admin: "管理者"
 | 
			
		||||
      moderator: "モデレーター"
 | 
			
		||||
      adminOrModerator: "管理者+モデレーター"
 | 
			
		||||
      verified: "公式アカウント"
 | 
			
		||||
      suspended: "凍結済み"
 | 
			
		||||
    origin:
 | 
			
		||||
      title: "オリジン"
 | 
			
		||||
      combined: "ローカル+リモート"
 | 
			
		||||
@@ -1089,6 +1169,8 @@ admin/views/moderators.vue:
 | 
			
		||||
    title: "モデレーターの登録"
 | 
			
		||||
    add: "登録"
 | 
			
		||||
    added: "モデレーターを登録しました"
 | 
			
		||||
    remove: "解除"
 | 
			
		||||
    removed: "モデレーター登録を解除しました"
 | 
			
		||||
admin/views/emoji.vue:
 | 
			
		||||
  add-emoji:
 | 
			
		||||
    title: "絵文字の登録"
 | 
			
		||||
@@ -1170,17 +1252,7 @@ desktop/views/pages/user/user.photos.vue:
 | 
			
		||||
  no-photos: "写真はありません"
 | 
			
		||||
desktop/views/pages/user/user.profile.vue:
 | 
			
		||||
  follows-you: "フォローされています"
 | 
			
		||||
  stalk: "ストークする"
 | 
			
		||||
  stalking: "ストーキングしています"
 | 
			
		||||
  unstalk: "ストーク解除"
 | 
			
		||||
  mute: "ミュートする"
 | 
			
		||||
  muted: "ミュートしています"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロックする"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  block-confirm: "このユーザーをブロックしますか?"
 | 
			
		||||
  push-to-a-list: "リストに追加"
 | 
			
		||||
  list-pushed: "{user}を{list}に追加しました。"
 | 
			
		||||
  menu: "メニュー"
 | 
			
		||||
desktop/views/pages/user/user.header.vue:
 | 
			
		||||
  posts: "投稿"
 | 
			
		||||
  following: "フォロー"
 | 
			
		||||
@@ -1194,6 +1266,7 @@ desktop/views/pages/user/user.timeline.vue:
 | 
			
		||||
  default: "投稿"
 | 
			
		||||
  with-replies: "投稿と返信"
 | 
			
		||||
  with-media: "メディア"
 | 
			
		||||
  my-posts: "私の投稿"
 | 
			
		||||
  empty: "このユーザーはまだ何も投稿していないようです。"
 | 
			
		||||
desktop/views/widgets/messaging.vue:
 | 
			
		||||
  title: "メッセージ"
 | 
			
		||||
@@ -1392,7 +1465,6 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  notification-position: "通知の表示"
 | 
			
		||||
  notification-position-bottom: "下"
 | 
			
		||||
  notification-position-top: "上"
 | 
			
		||||
  theme: "テーマ"
 | 
			
		||||
  behavior: "動作"
 | 
			
		||||
  fetch-on-scroll: "スクロールで自動読み込み"
 | 
			
		||||
  note-visibility: "投稿の公開範囲"
 | 
			
		||||
@@ -1416,7 +1488,6 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  signout: "Sair"
 | 
			
		||||
  sound: "Sons"
 | 
			
		||||
  enable-sounds: "Ativar sons"
 | 
			
		||||
  mark-as-read-all-unread-notes: "すべての投稿を既読にする"
 | 
			
		||||
  password: "パスワード"
 | 
			
		||||
mobile/views/pages/user.vue:
 | 
			
		||||
  follows-you: "Te segue"
 | 
			
		||||
@@ -1426,15 +1497,7 @@ mobile/views/pages/user.vue:
 | 
			
		||||
  overview: "概要"
 | 
			
		||||
  timeline: "Linha do tempo"
 | 
			
		||||
  media: "Mídia"
 | 
			
		||||
  is-suspended: "Esta conta foi suspensa"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  years-old: "{age}歳"
 | 
			
		||||
  push-to-list: "リストに追加"
 | 
			
		||||
  select-list: "リストを選択してください"
 | 
			
		||||
  list-pushed: "{user}を{list}に追加しました"
 | 
			
		||||
mobile/views/pages/user/home.vue:
 | 
			
		||||
  recent-notes: "Notas recentes"
 | 
			
		||||
  images: "Imagens"
 | 
			
		||||
@@ -1484,7 +1547,6 @@ deck/deck.user-column.vue:
 | 
			
		||||
  activity: "アクティビティ"
 | 
			
		||||
  timeline: "タイムライン"
 | 
			
		||||
  pinned-notes: "ピン留めされた投稿"
 | 
			
		||||
  push-to-a-list: "リストに追加"
 | 
			
		||||
docs:
 | 
			
		||||
  edit-this-page-on-github: "間違いや改善点を見つけましたか?"
 | 
			
		||||
  edit-this-page-on-github-link: "Edite esta página no GitHub!"
 | 
			
		||||
 
 | 
			
		||||
@@ -26,12 +26,13 @@ common:
 | 
			
		||||
  close: "Закрыть"
 | 
			
		||||
  do-not-copy-paste: "Пожалуйста, не вводите и не вставляйте сюда код. Аккаунту может угрожать опасность."
 | 
			
		||||
  load-more: "Загрузить больше"
 | 
			
		||||
  enter-password: "パスワードを入力してください"
 | 
			
		||||
  enter-password: "Пожалуйста, введите ваш пароль"
 | 
			
		||||
  2fa: "二段階認証"
 | 
			
		||||
  got-it: "わかった"
 | 
			
		||||
  customization-tips:
 | 
			
		||||
    title: "カスタマイズのヒント"
 | 
			
		||||
    title: "Советы по настройке"
 | 
			
		||||
    paragraph: "<p>ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。</p><p>一部のウィジェットは、<strong><strong>右</strong>クリック</strong>することで表示を変更することができます。</p><p>ウィジェットを削除するには、ヘッダーの<strong>「ゴミ箱」</strong>と書かれたエリアにウィジェットをドラッグ&ドロップします。</p><p>カスタマイズを終了するには、右上の「完了」をクリックします。</p>"
 | 
			
		||||
    gotit: "Got it!"
 | 
			
		||||
    gotit: "Понятно!"
 | 
			
		||||
  notification:
 | 
			
		||||
    file-uploaded: "Файл отправлен!"
 | 
			
		||||
    message-from: "Сообщение от {}:"
 | 
			
		||||
@@ -64,17 +65,17 @@ common:
 | 
			
		||||
    friday: "Пт"
 | 
			
		||||
    saturday: "Сб"
 | 
			
		||||
  weekday:
 | 
			
		||||
    sunday: "日曜日"
 | 
			
		||||
    monday: "月曜日"
 | 
			
		||||
    tuesday: "火曜日"
 | 
			
		||||
    wednesday: "水曜日"
 | 
			
		||||
    thursday: "木曜日"
 | 
			
		||||
    friday: "金曜日"
 | 
			
		||||
    saturday: "土曜日"
 | 
			
		||||
    sunday: "Воскресенье"
 | 
			
		||||
    monday: "Понедельник"
 | 
			
		||||
    tuesday: "Вторник"
 | 
			
		||||
    wednesday: "Среда"
 | 
			
		||||
    thursday: "Четверг"
 | 
			
		||||
    friday: "Пятница"
 | 
			
		||||
    saturday: "Суббота"
 | 
			
		||||
  reactions:
 | 
			
		||||
    like: "いいね"
 | 
			
		||||
    like: "Нравится"
 | 
			
		||||
    love: "しゅき"
 | 
			
		||||
    laugh: "笑"
 | 
			
		||||
    laugh: "Ха-Ха"
 | 
			
		||||
    hmm: "ふぅ~む"
 | 
			
		||||
    surprise: "わお"
 | 
			
		||||
    congrats: "おめでとう"
 | 
			
		||||
@@ -90,7 +91,6 @@ common:
 | 
			
		||||
    followers-desc: "自分のフォロワーにのみ公開"
 | 
			
		||||
    specified: "ダイレクト"
 | 
			
		||||
    specified-desc: "指定したユーザーにのみ公開"
 | 
			
		||||
    private: "非公開"
 | 
			
		||||
    local-public: "公開 (ローカルのみ)"
 | 
			
		||||
    local-home: "ホーム (ローカルのみ)"
 | 
			
		||||
    local-followers: "フォロワー (ローカルのみ)"
 | 
			
		||||
@@ -110,8 +110,7 @@ common:
 | 
			
		||||
  my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
 | 
			
		||||
  i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
 | 
			
		||||
  show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
 | 
			
		||||
  use-white-black-reversi-stones: "リバーシに白黒の石を使う"
 | 
			
		||||
  use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
 | 
			
		||||
  use-avatar-reversi-stones: "リバーシの石にアバターを使う"
 | 
			
		||||
  verified-user: "公式アカウント"
 | 
			
		||||
  disable-animated-mfm: "Отключить анимированный текст в постах"
 | 
			
		||||
  suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
 | 
			
		||||
@@ -122,14 +121,21 @@ common:
 | 
			
		||||
  reduce-motion: "Уменьшить движение в интерфейсе"
 | 
			
		||||
  this-setting-is-this-device-only: "Только для этого устройства"
 | 
			
		||||
  use-os-default-emojis: "Использовать стандартные Emoji из ОС"
 | 
			
		||||
  do-not-use-in-production: 'Эта сборка для разработчиков. Не используйте в продакшне.'
 | 
			
		||||
  line-width: "線の太さ"
 | 
			
		||||
  line-width-thin: "細い"
 | 
			
		||||
  line-width-normal: "普通"
 | 
			
		||||
  line-width-thick: "太い"
 | 
			
		||||
  hide-password: "パスワードを隠す"
 | 
			
		||||
  show-password: "パスワードを表示する"
 | 
			
		||||
  do-not-use-in-production: "Эта сборка для разработчиков. Не используйте в продакшне."
 | 
			
		||||
  user-suspended: "このユーザーは凍結されています。"
 | 
			
		||||
  is-remote-user: "このユーザー情報はコピーです。"
 | 
			
		||||
  is-remote-post: "この投稿情報はコピーです。"
 | 
			
		||||
  view-on-remote: "正確な情報を見る"
 | 
			
		||||
  renoted-by: "{user}がRenote"
 | 
			
		||||
  error:
 | 
			
		||||
    title: 'Что-то пошло не так :('
 | 
			
		||||
    retry: 'Повторить'
 | 
			
		||||
    title: "Что-то пошло не так :("
 | 
			
		||||
    retry: "Повторить"
 | 
			
		||||
  reversi:
 | 
			
		||||
    drawn: "Ничья"
 | 
			
		||||
    my-turn: "Ваш ход"
 | 
			
		||||
@@ -165,6 +171,7 @@ common:
 | 
			
		||||
    hashtags: "Хэштеги"
 | 
			
		||||
  dev: "Не удалось создать приложение. Пожалуйста, попробуйте ещё раз."
 | 
			
		||||
  ai-chan-kawaii: "Ai-chan kawaii!"
 | 
			
		||||
  you: "あなた"
 | 
			
		||||
auth/views/form.vue:
 | 
			
		||||
  share-access: "Вы разрешаете <i>{name}</i> получить доступ к вашему аккаунту?"
 | 
			
		||||
  permission-ask: "このアプリは次の権限を要求しています:"
 | 
			
		||||
@@ -260,6 +267,7 @@ common/views/components/media-banner.vue:
 | 
			
		||||
  sensitive: "閲覧注意"
 | 
			
		||||
  click-to-show: "クリックして表示"
 | 
			
		||||
common/views/components/theme.vue:
 | 
			
		||||
  theme: "テーマ"
 | 
			
		||||
  light-theme: "非ダークモード時に使用するテーマ"
 | 
			
		||||
  dark-theme: "ダークモード時に使用するテーマ"
 | 
			
		||||
  light-themes: "明るいテーマ"
 | 
			
		||||
@@ -276,6 +284,7 @@ common/views/components/theme.vue:
 | 
			
		||||
  base-theme: "ベーステーマ"
 | 
			
		||||
  base-theme-light: "Light"
 | 
			
		||||
  base-theme-dark: "Dark"
 | 
			
		||||
  find-more-theme: "その他のテーマを入手"
 | 
			
		||||
  theme-name: "テーマ名"
 | 
			
		||||
  preview-created-theme: "プレビュー"
 | 
			
		||||
  invalid-theme: "テーマが正しくありません。"
 | 
			
		||||
@@ -299,6 +308,7 @@ common/views/components/cw-button.vue:
 | 
			
		||||
  show: "もっと見る"
 | 
			
		||||
  chars: "{count}文字"
 | 
			
		||||
  files: "{count}ファイル"
 | 
			
		||||
  poll: "アンケート"
 | 
			
		||||
common/views/components/messaging.vue:
 | 
			
		||||
  search-user: "ユーザーを探す"
 | 
			
		||||
  you: "あなた"
 | 
			
		||||
@@ -328,7 +338,9 @@ common/views/components/nav.vue:
 | 
			
		||||
  develop: "開発者"
 | 
			
		||||
  feedback: "フィードバック"
 | 
			
		||||
common/views/components/note-menu.vue:
 | 
			
		||||
  mention: "メンション"
 | 
			
		||||
  detail: "詳細"
 | 
			
		||||
  copy-content: "内容をコピー"
 | 
			
		||||
  copy-link: "リンクをコピー"
 | 
			
		||||
  favorite: "お気に入り"
 | 
			
		||||
  unfavorite: "お気に入り解除"
 | 
			
		||||
@@ -337,6 +349,17 @@ common/views/components/note-menu.vue:
 | 
			
		||||
  delete: "削除"
 | 
			
		||||
  delete-confirm: "この投稿を削除しますか?"
 | 
			
		||||
  remote: "投稿元で見る"
 | 
			
		||||
common/views/components/user-menu.vue:
 | 
			
		||||
  mention: "メンション"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  push-to-list: "リストに追加"
 | 
			
		||||
  select-list: "リストを選択してください"
 | 
			
		||||
  report-abuse: "スパムを報告"
 | 
			
		||||
  report-abuse-detail: "どのような迷惑行為を行っていますか?"
 | 
			
		||||
  report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
 | 
			
		||||
common/views/components/poll.vue:
 | 
			
		||||
  vote-to: "「{}」に投票する"
 | 
			
		||||
  vote-count: "{}票"
 | 
			
		||||
@@ -403,6 +426,13 @@ common/views/components/stream-indicator.vue:
 | 
			
		||||
  connecting: "接続中"
 | 
			
		||||
  reconnecting: "再接続中"
 | 
			
		||||
  connected: "接続完了"
 | 
			
		||||
common/views/components/notification-settings.vue:
 | 
			
		||||
  title: "通知"
 | 
			
		||||
  mark-as-read-all-notifications: "すべての通知を既読にする"
 | 
			
		||||
  mark-as-read-all-unread-notes: "すべての投稿を既読にする"
 | 
			
		||||
  mark-as-read-all-talk-messages: "すべてのトークを既読にする"
 | 
			
		||||
  auto-watch: "投稿の自動ウォッチ"
 | 
			
		||||
  auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。"
 | 
			
		||||
common/views/components/integration-settings.vue:
 | 
			
		||||
  title: "サービス連携"
 | 
			
		||||
  connect: "接続する"
 | 
			
		||||
@@ -432,7 +462,6 @@ common/views/components/visibility-chooser.vue:
 | 
			
		||||
  followers-desc: "自分のフォロワーにのみ公開"
 | 
			
		||||
  specified: "ダイレクト"
 | 
			
		||||
  specified-desc: "指定したユーザーにのみ公開"
 | 
			
		||||
  private: "非公開"
 | 
			
		||||
  local-public: "公開 (ローカルのみ)"
 | 
			
		||||
  local-public-desc: "リモートへは公開しない"
 | 
			
		||||
  local-home: "ホーム (ローカルのみ)"
 | 
			
		||||
@@ -461,6 +490,7 @@ common/views/components/profile-editor.vue:
 | 
			
		||||
  is-bot: "このアカウントはBotです"
 | 
			
		||||
  is-locked: "フォローを承認制にする"
 | 
			
		||||
  careful-bot: "Botからのフォローだけ承認制にする"
 | 
			
		||||
  auto-accept-followed: "フォローしているユーザーからのフォローを自動承認する"
 | 
			
		||||
  advanced: "その他"
 | 
			
		||||
  privacy: "プライバシー"
 | 
			
		||||
  save: "保存"
 | 
			
		||||
@@ -471,6 +501,13 @@ common/views/components/profile-editor.vue:
 | 
			
		||||
  email-address: "メールアドレス"
 | 
			
		||||
  email-verified: "メールアドレスが確認されました"
 | 
			
		||||
  email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
 | 
			
		||||
common/views/components/user-list-editor.vue:
 | 
			
		||||
  users: "ユーザー"
 | 
			
		||||
  rename: "リスト名を変更"
 | 
			
		||||
  delete: "リストを削除"
 | 
			
		||||
  remove-user: "このリストから削除"
 | 
			
		||||
  delete-are-you-sure: "リスト「$1」を削除しますか?"
 | 
			
		||||
  deleted: "削除しました"
 | 
			
		||||
common/views/widgets/broadcast.vue:
 | 
			
		||||
  fetching: "確認中"
 | 
			
		||||
  no-broadcasts: "お知らせはありません"
 | 
			
		||||
@@ -520,10 +557,10 @@ common/views/widgets/tips.vue:
 | 
			
		||||
  tips-line19: "いくつかのウィンドウはブラウザの外に切り離すことができます"
 | 
			
		||||
  tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示しています"
 | 
			
		||||
  tips-line21: "APIを利用してbotの開発なども行えます"
 | 
			
		||||
  tips-line23: "まゆかわいいよまゆ"
 | 
			
		||||
  tips-line23: "藍かわいいよ藍"
 | 
			
		||||
  tips-line24: "Misskeyは2014年にサービスを開始しました"
 | 
			
		||||
  tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
 | 
			
		||||
common/views/pages/404.vue:
 | 
			
		||||
common/views/pages/not-found.vue:
 | 
			
		||||
  page-not-found: "ページが見つかりませんでした"
 | 
			
		||||
common/views/pages/follow.vue:
 | 
			
		||||
  signed-in-as: "{}としてサインイン中"
 | 
			
		||||
@@ -660,10 +697,12 @@ desktop/views/components/note-detail.vue:
 | 
			
		||||
  location: "位置情報"
 | 
			
		||||
  renote: "Renote"
 | 
			
		||||
  add-reaction: "リアクション"
 | 
			
		||||
  undo-reaction: "リアクション解除"
 | 
			
		||||
desktop/views/components/note.vue:
 | 
			
		||||
  reply: "返信"
 | 
			
		||||
  renote: "Renote"
 | 
			
		||||
  add-reaction: "リアクション"
 | 
			
		||||
  undo-reaction: "リアクション解除"
 | 
			
		||||
  detail: "詳細"
 | 
			
		||||
  private: "この投稿は非公開です"
 | 
			
		||||
  deleted: "この投稿は削除されました"
 | 
			
		||||
@@ -734,7 +773,6 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  security: "セキュリティ"
 | 
			
		||||
  signin: "サインイン履歴"
 | 
			
		||||
  password: "パスワード"
 | 
			
		||||
  2fa: "二段階認証"
 | 
			
		||||
  other: "その他"
 | 
			
		||||
  license: "ライセンス"
 | 
			
		||||
  theme: "テーマ"
 | 
			
		||||
@@ -748,9 +786,6 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
 | 
			
		||||
  auto-popout: "ウィンドウの自動ポップアウト"
 | 
			
		||||
  auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
 | 
			
		||||
  advanced: "詳細設定"
 | 
			
		||||
  api-via-stream: "ストリームを経由したAPIリクエスト"
 | 
			
		||||
  api-via-stream-desc: "この設定をオンにすると、websocket接続を経由してAPIリクエストが行われます(パフォーマンス向上が期待できます)。オフにすると、ネイティブの fetch APIが利用されます。この設定はこのデバイスのみ有効です。"
 | 
			
		||||
  deck-nav: "デッキ内ナビゲーション"
 | 
			
		||||
  deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
 | 
			
		||||
  deck-default: "デッキをデフォルトのUIにする"
 | 
			
		||||
@@ -793,8 +828,6 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  cache-warn: "クリーンアップを行うと、ブラウザに記憶されたアカウント情報のキャッシュ、書きかけの投稿・返信・メッセージ、およびその他のデータ(設定情報含む)が削除されます。クリーンアップを行った後はページを再度読み込みする必要があります。"
 | 
			
		||||
  cache-cleared: "キャッシュを削除しました"
 | 
			
		||||
  cache-cleared-desc: "ページを再度読み込みしてください。"
 | 
			
		||||
  auto-watch: "投稿の自動ウォッチ"
 | 
			
		||||
  auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。"
 | 
			
		||||
  about: "Misskeyについて"
 | 
			
		||||
  operator: "このサーバーの運営者"
 | 
			
		||||
  update: "Misskey Update"
 | 
			
		||||
@@ -833,6 +866,7 @@ desktop/views/components/settings.2fa.vue:
 | 
			
		||||
  enter-password: "パスワードを入力してください"
 | 
			
		||||
  authenticator: "まず、Google Authenticatorをお使いのデバイスにインストールします:"
 | 
			
		||||
  howtoinstall: "インストール方法はこちら"
 | 
			
		||||
  token: "トークン"
 | 
			
		||||
  scan: "次に、表示されているQRコードをスキャンします:"
 | 
			
		||||
  done: "お使いのデバイスに表示されているトークンを入力して完了します:"
 | 
			
		||||
  submit: "完了"
 | 
			
		||||
@@ -847,13 +881,13 @@ common/views/components/api-settings.vue:
 | 
			
		||||
  token: "Token:"
 | 
			
		||||
  enter-password: "パスワードを入力してください"
 | 
			
		||||
  console:
 | 
			
		||||
    title: 'APIコンソール'
 | 
			
		||||
    endpoint: 'エンドポイント'
 | 
			
		||||
    parameter: 'パラメータ'
 | 
			
		||||
    title: "APIコンソール"
 | 
			
		||||
    endpoint: "エンドポイント"
 | 
			
		||||
    parameter: "パラメータ"
 | 
			
		||||
    credential-info: "「i」パラメータは自動で付与されます。"
 | 
			
		||||
    send: '送信'
 | 
			
		||||
    sending: '応答待ち'
 | 
			
		||||
    response: '結果'
 | 
			
		||||
    send: "送信"
 | 
			
		||||
    sending: "応答待ち"
 | 
			
		||||
    response: "結果"
 | 
			
		||||
desktop/views/components/settings.apps.vue:
 | 
			
		||||
  no-apps: "連携しているアプリケーションはありません"
 | 
			
		||||
common/views/components/drive-settings.vue:
 | 
			
		||||
@@ -955,6 +989,7 @@ admin/views/index.vue:
 | 
			
		||||
  federation: "連合"
 | 
			
		||||
  announcements: "お知らせ"
 | 
			
		||||
  hashtags: "ハッシュタグ"
 | 
			
		||||
  abuse: "スパム報告"
 | 
			
		||||
  back-to-misskey: "Misskeyに戻る"
 | 
			
		||||
admin/views/dashboard.vue:
 | 
			
		||||
  dashboard: "ダッシュボード"
 | 
			
		||||
@@ -964,6 +999,12 @@ admin/views/dashboard.vue:
 | 
			
		||||
  instances: "インスタンス"
 | 
			
		||||
  this-instance: "このインスタンス"
 | 
			
		||||
  federated: "連合"
 | 
			
		||||
admin/views/abuse.vue:
 | 
			
		||||
  title: "スパム報告"
 | 
			
		||||
  target: "対象"
 | 
			
		||||
  reporter: "報告者"
 | 
			
		||||
  details: "詳細"
 | 
			
		||||
  remove-report: "削除"
 | 
			
		||||
admin/views/instance.vue:
 | 
			
		||||
  instance: "インスタンス"
 | 
			
		||||
  instance-name: "インスタンス名"
 | 
			
		||||
@@ -1010,6 +1051,8 @@ admin/views/instance.vue:
 | 
			
		||||
  max-note-text-length: "投稿の最大文字数"
 | 
			
		||||
  disable-registration: "ユーザー登録の受付を停止する"
 | 
			
		||||
  disable-local-timeline: "ローカルタイムラインを無効にする"
 | 
			
		||||
  disable-global-timeline: "グローバルタイムラインを無効にする"
 | 
			
		||||
  disabling-timelines-info: "これらのタイムラインを無効にしても、管理者およびモデレーターは引き続き利用できます。"
 | 
			
		||||
  invite: "招待"
 | 
			
		||||
  save: "保存"
 | 
			
		||||
  saved: "保存しました"
 | 
			
		||||
@@ -1029,6 +1072,12 @@ admin/views/instance.vue:
 | 
			
		||||
  smtp-port: "SMTPポート"
 | 
			
		||||
  smtp-user: "SMTPユーザー"
 | 
			
		||||
  smtp-pass: "SMTPパスワード"
 | 
			
		||||
  serviceworker-config: "ServiceWorker"
 | 
			
		||||
  enable-serviceworker: "ServiceWorkerを有効にする"
 | 
			
		||||
  serviceworker-info: "プッシュ通知を行うには有効する必要があります。"
 | 
			
		||||
  vapid-publickey: "VAPID公開鍵"
 | 
			
		||||
  vapid-privatekey: "VAPID秘密鍵"
 | 
			
		||||
  vapid-info: "ServiceWorkerを有効にする場合、VAPIDキーペアを生成する必要があります。シェルで次のようにします:"
 | 
			
		||||
admin/views/charts.vue:
 | 
			
		||||
  title: "チャート"
 | 
			
		||||
  per-day: "1日ごと"
 | 
			
		||||
@@ -1047,6 +1096,7 @@ admin/views/charts.vue:
 | 
			
		||||
    notes-total: "投稿の積算"
 | 
			
		||||
    users: "ユーザーの増減"
 | 
			
		||||
    users-total: "ユーザーの積算"
 | 
			
		||||
    active-users: "アクティブユーザー数"
 | 
			
		||||
    drive: "ドライブ使用量の増減"
 | 
			
		||||
    drive-total: "ドライブ使用量の積算"
 | 
			
		||||
    drive-files: "ドライブのファイル数の増減"
 | 
			
		||||
@@ -1054,6 +1104,28 @@ admin/views/charts.vue:
 | 
			
		||||
    network-requests: "リクエスト"
 | 
			
		||||
    network-time: "応答時間"
 | 
			
		||||
    network-usage: "通信量"
 | 
			
		||||
admin/views/drive.vue:
 | 
			
		||||
  operation: "操作"
 | 
			
		||||
  fileid-or-url: "ファイルIDまたはファイルURL"
 | 
			
		||||
  file-not-found: "ファイルが見つかりません"
 | 
			
		||||
  lookup: "照会"
 | 
			
		||||
  sort:
 | 
			
		||||
    title: "ソート"
 | 
			
		||||
    createdAtAsc: "アップロード日時が古い順"
 | 
			
		||||
    createdAtDesc: "アップロード日時が新しい順"
 | 
			
		||||
    sizeAsc: "サイズが小さい順"
 | 
			
		||||
    sizeDesc: "サイズが大きい順"
 | 
			
		||||
  origin:
 | 
			
		||||
    title: "オリジン"
 | 
			
		||||
    combined: "ローカル+リモート"
 | 
			
		||||
    local: "ローカル"
 | 
			
		||||
    remote: "リモート"
 | 
			
		||||
  delete: "削除"
 | 
			
		||||
  deleted: "削除しました"
 | 
			
		||||
  mark-as-sensitive: "閲覧注意に設定"
 | 
			
		||||
  unmark-as-sensitive: "閲覧注意を解除"
 | 
			
		||||
  marked-as-sensitive: "閲覧注意に設定しました"
 | 
			
		||||
  unmarked-as-sensitive: "閲覧注意を解除しました"
 | 
			
		||||
admin/views/users.vue:
 | 
			
		||||
  operation: "操作"
 | 
			
		||||
  username-or-userid: "ユーザー名またはユーザーID"
 | 
			
		||||
@@ -1077,6 +1149,14 @@ admin/views/users.vue:
 | 
			
		||||
      createdAtDesc: "登録日時が新しい順"
 | 
			
		||||
      updatedAtAsc: "更新日時が古い順"
 | 
			
		||||
      updatedAtDesc: "更新日時が新しい順"
 | 
			
		||||
    state:
 | 
			
		||||
      title: "状態"
 | 
			
		||||
      all: "すべて"
 | 
			
		||||
      admin: "管理者"
 | 
			
		||||
      moderator: "モデレーター"
 | 
			
		||||
      adminOrModerator: "管理者+モデレーター"
 | 
			
		||||
      verified: "公式アカウント"
 | 
			
		||||
      suspended: "凍結済み"
 | 
			
		||||
    origin:
 | 
			
		||||
      title: "オリジン"
 | 
			
		||||
      combined: "ローカル+リモート"
 | 
			
		||||
@@ -1089,6 +1169,8 @@ admin/views/moderators.vue:
 | 
			
		||||
    title: "モデレーターの登録"
 | 
			
		||||
    add: "登録"
 | 
			
		||||
    added: "モデレーターを登録しました"
 | 
			
		||||
    remove: "解除"
 | 
			
		||||
    removed: "モデレーター登録を解除しました"
 | 
			
		||||
admin/views/emoji.vue:
 | 
			
		||||
  add-emoji:
 | 
			
		||||
    title: "絵文字の登録"
 | 
			
		||||
@@ -1170,17 +1252,7 @@ desktop/views/pages/user/user.photos.vue:
 | 
			
		||||
  no-photos: "写真はありません"
 | 
			
		||||
desktop/views/pages/user/user.profile.vue:
 | 
			
		||||
  follows-you: "フォローされています"
 | 
			
		||||
  stalk: "ストークする"
 | 
			
		||||
  stalking: "ストーキングしています"
 | 
			
		||||
  unstalk: "ストーク解除"
 | 
			
		||||
  mute: "ミュートする"
 | 
			
		||||
  muted: "ミュートしています"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロックする"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  block-confirm: "このユーザーをブロックしますか?"
 | 
			
		||||
  push-to-a-list: "リストに追加"
 | 
			
		||||
  list-pushed: "{user}を{list}に追加しました。"
 | 
			
		||||
  menu: "メニュー"
 | 
			
		||||
desktop/views/pages/user/user.header.vue:
 | 
			
		||||
  posts: "投稿"
 | 
			
		||||
  following: "フォロー"
 | 
			
		||||
@@ -1194,6 +1266,7 @@ desktop/views/pages/user/user.timeline.vue:
 | 
			
		||||
  default: "投稿"
 | 
			
		||||
  with-replies: "投稿と返信"
 | 
			
		||||
  with-media: "メディア"
 | 
			
		||||
  my-posts: "私の投稿"
 | 
			
		||||
  empty: "このユーザーはまだ何も投稿していないようです。"
 | 
			
		||||
desktop/views/widgets/messaging.vue:
 | 
			
		||||
  title: "メッセージ"
 | 
			
		||||
@@ -1392,7 +1465,6 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  notification-position: "通知の表示"
 | 
			
		||||
  notification-position-bottom: "下"
 | 
			
		||||
  notification-position-top: "上"
 | 
			
		||||
  theme: "テーマ"
 | 
			
		||||
  behavior: "動作"
 | 
			
		||||
  fetch-on-scroll: "スクロールで自動読み込み"
 | 
			
		||||
  note-visibility: "投稿の公開範囲"
 | 
			
		||||
@@ -1416,7 +1488,6 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  signout: "サインアウト"
 | 
			
		||||
  sound: "サウンド"
 | 
			
		||||
  enable-sounds: "サウンドを有効にする"
 | 
			
		||||
  mark-as-read-all-unread-notes: "すべての投稿を既読にする"
 | 
			
		||||
  password: "パスワード"
 | 
			
		||||
mobile/views/pages/user.vue:
 | 
			
		||||
  follows-you: "フォローされています"
 | 
			
		||||
@@ -1426,15 +1497,7 @@ mobile/views/pages/user.vue:
 | 
			
		||||
  overview: "概要"
 | 
			
		||||
  timeline: "タイムライン"
 | 
			
		||||
  media: "メディア"
 | 
			
		||||
  is-suspended: "このユーザーは凍結されています。"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  years-old: "{age}歳"
 | 
			
		||||
  push-to-list: "リストに追加"
 | 
			
		||||
  select-list: "リストを選択してください"
 | 
			
		||||
  list-pushed: "{user}を{list}に追加しました"
 | 
			
		||||
mobile/views/pages/user/home.vue:
 | 
			
		||||
  recent-notes: "最近の投稿"
 | 
			
		||||
  images: "画像"
 | 
			
		||||
@@ -1484,7 +1547,6 @@ deck/deck.user-column.vue:
 | 
			
		||||
  activity: "アクティビティ"
 | 
			
		||||
  timeline: "タイムライン"
 | 
			
		||||
  pinned-notes: "ピン留めされた投稿"
 | 
			
		||||
  push-to-a-list: "リストに追加"
 | 
			
		||||
docs:
 | 
			
		||||
  edit-this-page-on-github: "間違いや改善点を見つけましたか?"
 | 
			
		||||
  edit-this-page-on-github-link: "このページをGitHubで編集"
 | 
			
		||||
 
 | 
			
		||||
@@ -27,6 +27,7 @@ common:
 | 
			
		||||
  do-not-copy-paste: "请不要在这里输入或粘贴代码。您帐户可能会受到损害。"
 | 
			
		||||
  load-more: "加载更多"
 | 
			
		||||
  enter-password: "请输入您的密码"
 | 
			
		||||
  2fa: "二段階認証"
 | 
			
		||||
  got-it: "没问题"
 | 
			
		||||
  customization-tips:
 | 
			
		||||
    title: "客制化提示"
 | 
			
		||||
@@ -90,7 +91,6 @@ common:
 | 
			
		||||
    followers-desc: "仅发送至粉丝"
 | 
			
		||||
    specified: "指定用户"
 | 
			
		||||
    specified-desc: "仅发送至指定用户"
 | 
			
		||||
    private: "私密"
 | 
			
		||||
    local-public: "公开(仅限本地)"
 | 
			
		||||
    local-home: "首页(仅限本地)"
 | 
			
		||||
    local-followers: "关注者(仅限本地)"
 | 
			
		||||
@@ -110,11 +110,10 @@ common:
 | 
			
		||||
  my-token-regenerated: "您的 Token 已被重置, 您将自动登出。"
 | 
			
		||||
  i-like-sushi: "相比于布丁来说, 我更喜欢寿司。"
 | 
			
		||||
  show-reversi-board-labels: "在 Reversi 中显示行和列表签"
 | 
			
		||||
  use-white-black-reversi-stones: "リバーシに白黒の石を使う"
 | 
			
		||||
  use-contrast-reversi-stones: "Make the stone color clear in Reversi"
 | 
			
		||||
  use-avatar-reversi-stones: "用头像作为 Reversi 中的 “石头”"
 | 
			
		||||
  verified-user: "认证用户"
 | 
			
		||||
  disable-animated-mfm: "在帖子中禁用动画文本"
 | 
			
		||||
  suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
 | 
			
		||||
  suggest-recent-hashtags: "在帖子表单上显示最近流行的主题标签"
 | 
			
		||||
  always-show-nsfw: "总是显示 NSFW 的内容"
 | 
			
		||||
  always-mark-nsfw: "总是用 NSFW 来标记附件"
 | 
			
		||||
  show-full-acct: "不要从用户名中忽略主机名"
 | 
			
		||||
@@ -122,14 +121,21 @@ common:
 | 
			
		||||
  reduce-motion: "减弱UI中的动画效果"
 | 
			
		||||
  this-setting-is-this-device-only: "设置仅在本设备中生效"
 | 
			
		||||
  use-os-default-emojis: "使用设备系统默认的 emojis"
 | 
			
		||||
  do-not-use-in-production: '这是一个开发者测试版. 请勿在生产环境中使用.'
 | 
			
		||||
  line-width: "线条宽度"
 | 
			
		||||
  line-width-thin: "细"
 | 
			
		||||
  line-width-normal: "正常"
 | 
			
		||||
  line-width-thick: "粗"
 | 
			
		||||
  hide-password: "隐藏密码"
 | 
			
		||||
  show-password: "显示密码"
 | 
			
		||||
  do-not-use-in-production: "这是一个开发者测试版. 请勿在生产环境中使用."
 | 
			
		||||
  user-suspended: "该用户已被冻结。"
 | 
			
		||||
  is-remote-user: "该用户的信息已被复制."
 | 
			
		||||
  is-remote-post: "该投稿已被复制."
 | 
			
		||||
  view-on-remote: "查看准确的信息"
 | 
			
		||||
  renoted-by: "由 {user} Renote"
 | 
			
		||||
  error:
 | 
			
		||||
    title: '哦不, 发生了一些问题! :('
 | 
			
		||||
    retry: '重试'
 | 
			
		||||
    title: "哦不, 发生了一些问题! :("
 | 
			
		||||
    retry: "重试"
 | 
			
		||||
  reversi:
 | 
			
		||||
    drawn: "平局"
 | 
			
		||||
    my-turn: "轮到你了"
 | 
			
		||||
@@ -165,6 +171,7 @@ common:
 | 
			
		||||
    hashtags: "标签"
 | 
			
		||||
  dev: "构建应用程序失败,请再试一次。"
 | 
			
		||||
  ai-chan-kawaii: "Ai-chan kawaii!"
 | 
			
		||||
  you: "您"
 | 
			
		||||
auth/views/form.vue:
 | 
			
		||||
  share-access: "您要允许<i>{name}</i>来访问您的账户吗?"
 | 
			
		||||
  permission-ask: "这个应用程序需要以下权限:"
 | 
			
		||||
@@ -260,6 +267,7 @@ common/views/components/media-banner.vue:
 | 
			
		||||
  sensitive: "阅读注意"
 | 
			
		||||
  click-to-show: "点击以显示"
 | 
			
		||||
common/views/components/theme.vue:
 | 
			
		||||
  theme: "主题"
 | 
			
		||||
  light-theme: "主题"
 | 
			
		||||
  dark-theme: "黑暗模式主题"
 | 
			
		||||
  light-themes: "明亮主题"
 | 
			
		||||
@@ -276,6 +284,7 @@ common/views/components/theme.vue:
 | 
			
		||||
  base-theme: "基础主题"
 | 
			
		||||
  base-theme-light: "亮"
 | 
			
		||||
  base-theme-dark: "暗"
 | 
			
		||||
  find-more-theme: "获取更多主题"
 | 
			
		||||
  theme-name: "主题名称"
 | 
			
		||||
  preview-created-theme: "预览"
 | 
			
		||||
  invalid-theme: "无效主题"
 | 
			
		||||
@@ -297,8 +306,9 @@ common/views/components/theme.vue:
 | 
			
		||||
common/views/components/cw-button.vue:
 | 
			
		||||
  hide: "隐藏"
 | 
			
		||||
  show: "查看更多"
 | 
			
		||||
  chars: "{count}文字"
 | 
			
		||||
  files: "{count}ファイル"
 | 
			
		||||
  chars: "{count} 字"
 | 
			
		||||
  files: "{count} 个文件"
 | 
			
		||||
  poll: "调查问卷"
 | 
			
		||||
common/views/components/messaging.vue:
 | 
			
		||||
  search-user: "查找用户"
 | 
			
		||||
  you: "您"
 | 
			
		||||
@@ -328,7 +338,9 @@ common/views/components/nav.vue:
 | 
			
		||||
  develop: "开发者"
 | 
			
		||||
  feedback: "反馈"
 | 
			
		||||
common/views/components/note-menu.vue:
 | 
			
		||||
  mention: "提到"
 | 
			
		||||
  detail: "详细信息"
 | 
			
		||||
  copy-content: "复制内容"
 | 
			
		||||
  copy-link: "复制链接"
 | 
			
		||||
  favorite: "收藏这个投稿"
 | 
			
		||||
  unfavorite: "取消收藏"
 | 
			
		||||
@@ -337,6 +349,17 @@ common/views/components/note-menu.vue:
 | 
			
		||||
  delete: "删除"
 | 
			
		||||
  delete-confirm: "确定删除这个投稿吗?"
 | 
			
		||||
  remote: "显示原始投稿"
 | 
			
		||||
common/views/components/user-menu.vue:
 | 
			
		||||
  mention: "メンション"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  push-to-list: "リストに追加"
 | 
			
		||||
  select-list: "リストを選択してください"
 | 
			
		||||
  report-abuse: "スパムを報告"
 | 
			
		||||
  report-abuse-detail: "どのような迷惑行為を行っていますか?"
 | 
			
		||||
  report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
 | 
			
		||||
common/views/components/poll.vue:
 | 
			
		||||
  vote-to: "为\"{}\"投票"
 | 
			
		||||
  vote-count: "{}票"
 | 
			
		||||
@@ -403,11 +426,18 @@ common/views/components/stream-indicator.vue:
 | 
			
		||||
  connecting: "连接中"
 | 
			
		||||
  reconnecting: "重新连接中"
 | 
			
		||||
  connected: "已连接"
 | 
			
		||||
common/views/components/notification-settings.vue:
 | 
			
		||||
  title: "通知"
 | 
			
		||||
  mark-as-read-all-notifications: "将所有通知标为已读"
 | 
			
		||||
  mark-as-read-all-unread-notes: "将所有帖子标为已读"
 | 
			
		||||
  mark-as-read-all-talk-messages: "将所有对话标为已读"
 | 
			
		||||
  auto-watch: "自动查看帖子"
 | 
			
		||||
  auto-watch-desc: "自动接收有关您做出反应或回复的帖子的通知。"
 | 
			
		||||
common/views/components/integration-settings.vue:
 | 
			
		||||
  title: "サービス連携"
 | 
			
		||||
  connect: "接続する"
 | 
			
		||||
  disconnect: "切断する"
 | 
			
		||||
  connected-to: "次のアカウントに接続されています"
 | 
			
		||||
  title: "服务合作"
 | 
			
		||||
  connect: "连接"
 | 
			
		||||
  disconnect: "未连接"
 | 
			
		||||
  connected-to: "您的账号已连接一下社交账号"
 | 
			
		||||
common/views/components/github-setting.vue:
 | 
			
		||||
  description: "当您用GitHub连接Misskey账户后,您将能够看到有关您自己的信息,并且您将能够使用GitHub登录。"
 | 
			
		||||
  connected-to: "此账户已连接GitHub"
 | 
			
		||||
@@ -432,7 +462,6 @@ common/views/components/visibility-chooser.vue:
 | 
			
		||||
  followers-desc: "仅发送至关注者"
 | 
			
		||||
  specified: "直接"
 | 
			
		||||
  specified-desc: "仅发送至指定用户"
 | 
			
		||||
  private: "私密"
 | 
			
		||||
  local-public: "公开(仅限本地)"
 | 
			
		||||
  local-public-desc: "不要发布到公开"
 | 
			
		||||
  local-home: "首页(仅限本地)"
 | 
			
		||||
@@ -453,7 +482,7 @@ common/views/components/profile-editor.vue:
 | 
			
		||||
  account: "账户"
 | 
			
		||||
  location: "位置"
 | 
			
		||||
  description: "关于我"
 | 
			
		||||
  language: "言語"
 | 
			
		||||
  language: "语言"
 | 
			
		||||
  birthday: "生日"
 | 
			
		||||
  avatar: "头像"
 | 
			
		||||
  banner: "背景"
 | 
			
		||||
@@ -461,6 +490,7 @@ common/views/components/profile-editor.vue:
 | 
			
		||||
  is-bot: "整个账户是机器人"
 | 
			
		||||
  is-locked: "关注者请求需要批准"
 | 
			
		||||
  careful-bot: "机器人的关注者请求需要批准"
 | 
			
		||||
  auto-accept-followed: "自动同意来自您关注的人的关注申请"
 | 
			
		||||
  advanced: "其他选项"
 | 
			
		||||
  privacy: "隐私"
 | 
			
		||||
  save: "保存"
 | 
			
		||||
@@ -471,6 +501,13 @@ common/views/components/profile-editor.vue:
 | 
			
		||||
  email-address: "电子邮件地址"
 | 
			
		||||
  email-verified: "电子邮件地址已验证"
 | 
			
		||||
  email-not-verified: "电子邮件地址还没有验证哦, 请检查一下收信箱吧~"
 | 
			
		||||
common/views/components/user-list-editor.vue:
 | 
			
		||||
  users: "用户"
 | 
			
		||||
  rename: "重命名列表"
 | 
			
		||||
  delete: "删除列表"
 | 
			
		||||
  remove-user: "从此列表中删除"
 | 
			
		||||
  delete-are-you-sure: "删除列表 \"$1\"?"
 | 
			
		||||
  deleted: "已删除"
 | 
			
		||||
common/views/widgets/broadcast.vue:
 | 
			
		||||
  fetching: "确认中"
 | 
			
		||||
  no-broadcasts: "没有公告"
 | 
			
		||||
@@ -520,11 +557,11 @@ common/views/widgets/tips.vue:
 | 
			
		||||
  tips-line19: "可以在浏览器外部分离多个窗口。"
 | 
			
		||||
  tips-line20: "日历小部件的百分比显示经过的时间百分比。"
 | 
			
		||||
  tips-line21: "您也可以使用API开发机器人。"
 | 
			
		||||
  tips-line23: "Mayu的眉毛非常可爱。"
 | 
			
		||||
  tips-line23: "Ai-chan kawaii!"
 | 
			
		||||
  tips-line24: "Misskey自2014年开始运营。"
 | 
			
		||||
  tips-line25: "在与通知功能兼容的浏览器中,您可以在Misskey未打开的情况下接收通知"
 | 
			
		||||
common/views/pages/404.vue:
 | 
			
		||||
  page-not-found: "ページが見つかりませんでした"
 | 
			
		||||
common/views/pages/not-found.vue:
 | 
			
		||||
  page-not-found: "啊喔, 页面走丢了..."
 | 
			
		||||
common/views/pages/follow.vue:
 | 
			
		||||
  signed-in-as: "用 {}登录"
 | 
			
		||||
  following: "正在关注"
 | 
			
		||||
@@ -660,10 +697,12 @@ desktop/views/components/note-detail.vue:
 | 
			
		||||
  location: "位置信息"
 | 
			
		||||
  renote: "转发"
 | 
			
		||||
  add-reaction: "添加一个反应"
 | 
			
		||||
  undo-reaction: "リアクション解除"
 | 
			
		||||
desktop/views/components/note.vue:
 | 
			
		||||
  reply: "回复"
 | 
			
		||||
  renote: "Renote"
 | 
			
		||||
  add-reaction: "添加一个反应"
 | 
			
		||||
  undo-reaction: "リアクション解除"
 | 
			
		||||
  detail: "详细信息"
 | 
			
		||||
  private: "这个投稿是私密的"
 | 
			
		||||
  deleted: "投稿已删除"
 | 
			
		||||
@@ -734,7 +773,6 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  security: "安全性"
 | 
			
		||||
  signin: "登录历史"
 | 
			
		||||
  password: "密码"
 | 
			
		||||
  2fa: "两步验证"
 | 
			
		||||
  other: "其他"
 | 
			
		||||
  license: "许可证"
 | 
			
		||||
  theme: "主题"
 | 
			
		||||
@@ -748,9 +786,6 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  web-search-engine-desc: "例如: https://www.google.com/?#q={{query}}"
 | 
			
		||||
  auto-popout: "自动弹出窗口"
 | 
			
		||||
  auto-popout-desc: "如果可用,将使用弹出显示而不是打开新窗口。 此设置存储在浏览器中。"
 | 
			
		||||
  advanced: "更多设置"
 | 
			
		||||
  api-via-stream: "通过API请求的Stream"
 | 
			
		||||
  api-via-stream-desc: "API请求通过WebSocket连接而不是本机提取API执行(以获得更好的性能)。 此设置存储在浏览器中。"
 | 
			
		||||
  deck-nav: "Deck 内的导航"
 | 
			
		||||
  deck-nav-desc: "在使用Deck时,您会在导航期间获得一个没有页面过渡的临时列。"
 | 
			
		||||
  deck-default: "将Deck界面设置为默认UI显示界面"
 | 
			
		||||
@@ -780,7 +815,7 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  deck-column-width: "デッキのカラムの幅"
 | 
			
		||||
  deck-column-width-narrow: "狭"
 | 
			
		||||
  deck-column-width-narrower: "やや狭"
 | 
			
		||||
  deck-column-width-normal: "普通"
 | 
			
		||||
  deck-column-width-normal: "正常"
 | 
			
		||||
  deck-column-width-wider: "やや広"
 | 
			
		||||
  deck-column-width-wide: "広"
 | 
			
		||||
  sound: "声音"
 | 
			
		||||
@@ -793,8 +828,6 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  cache-warn: "将删除存储在浏览器中的帐户信息/帖子/回复/消息/设置的缓存。 清理完毕后需要刷新页面。"
 | 
			
		||||
  cache-cleared: "已清除缓存"
 | 
			
		||||
  cache-cleared-desc: "请刷新页面。"
 | 
			
		||||
  auto-watch: "自动查看帖子"
 | 
			
		||||
  auto-watch-desc: "自动接收有关帖子/回复/反应的通知。"
 | 
			
		||||
  about: "关于 Misskey"
 | 
			
		||||
  operator: "网站运营者"
 | 
			
		||||
  update: "更新 Misskey"
 | 
			
		||||
@@ -833,6 +866,7 @@ desktop/views/components/settings.2fa.vue:
 | 
			
		||||
  enter-password: "请输入您的密码"
 | 
			
		||||
  authenticator: "首先,您需要在设备上安装 Google Authenticator:"
 | 
			
		||||
  howtoinstall: "怎样安装"
 | 
			
		||||
  token: "トークン"
 | 
			
		||||
  scan: "然后,扫描二维码:"
 | 
			
		||||
  done: "请输入显示在您设备上的密钥:"
 | 
			
		||||
  submit: "提交"
 | 
			
		||||
@@ -847,13 +881,13 @@ common/views/components/api-settings.vue:
 | 
			
		||||
  token: "令牌:"
 | 
			
		||||
  enter-password: "请输入您的密码"
 | 
			
		||||
  console:
 | 
			
		||||
    title: 'API 控制台'
 | 
			
		||||
    endpoint: '端点'
 | 
			
		||||
    parameter: '参数'
 | 
			
		||||
    title: "API 控制台"
 | 
			
		||||
    endpoint: "端点"
 | 
			
		||||
    parameter: "参数"
 | 
			
		||||
    credential-info: "此控制台不需要参数“i”。"
 | 
			
		||||
    send: '发送'
 | 
			
		||||
    sending: '等待回应'
 | 
			
		||||
    response: '结果'
 | 
			
		||||
    send: "发送"
 | 
			
		||||
    sending: "等待回应"
 | 
			
		||||
    response: "结果"
 | 
			
		||||
desktop/views/components/settings.apps.vue:
 | 
			
		||||
  no-apps: "没有已连接的应用程序"
 | 
			
		||||
common/views/components/drive-settings.vue:
 | 
			
		||||
@@ -877,16 +911,16 @@ common/views/components/password-settings.vue:
 | 
			
		||||
  enter-new-password-again: "请再次输入新密码"
 | 
			
		||||
  not-match: "新密码不匹配"
 | 
			
		||||
  changed: "密码已更改"
 | 
			
		||||
  failed: "パスワード変更に失敗しました"
 | 
			
		||||
  failed: "更改密码失败"
 | 
			
		||||
desktop/views/components/sub-note-content.vue:
 | 
			
		||||
  private: "这个帖子是私密的"
 | 
			
		||||
  deleted: "帖子已删除"
 | 
			
		||||
  media-count: "附加{}媒体"
 | 
			
		||||
  poll: "投票"
 | 
			
		||||
desktop/views/components/settings.tags.vue:
 | 
			
		||||
  title: "タグ"
 | 
			
		||||
  query: "クエリ (省略可)"
 | 
			
		||||
  add: "追加"
 | 
			
		||||
  title: "标签"
 | 
			
		||||
  query: "查询 (可选)"
 | 
			
		||||
  add: "添加"
 | 
			
		||||
  save: "保存"
 | 
			
		||||
desktop/views/components/taskmanager.vue:
 | 
			
		||||
  title: "任务管理器"
 | 
			
		||||
@@ -955,6 +989,7 @@ admin/views/index.vue:
 | 
			
		||||
  federation: "联合"
 | 
			
		||||
  announcements: "公告"
 | 
			
		||||
  hashtags: "标签"
 | 
			
		||||
  abuse: "スパム報告"
 | 
			
		||||
  back-to-misskey: "返回 Misskey"
 | 
			
		||||
admin/views/dashboard.vue:
 | 
			
		||||
  dashboard: "Dashboard"
 | 
			
		||||
@@ -964,13 +999,19 @@ admin/views/dashboard.vue:
 | 
			
		||||
  instances: "例子"
 | 
			
		||||
  this-instance: "此实例"
 | 
			
		||||
  federated: "联合"
 | 
			
		||||
admin/views/abuse.vue:
 | 
			
		||||
  title: "スパム報告"
 | 
			
		||||
  target: "対象"
 | 
			
		||||
  reporter: "報告者"
 | 
			
		||||
  details: "詳細"
 | 
			
		||||
  remove-report: "削除"
 | 
			
		||||
admin/views/instance.vue:
 | 
			
		||||
  instance: "例子"
 | 
			
		||||
  instance-name: "实例名称"
 | 
			
		||||
  instance-description: "实例介绍"
 | 
			
		||||
  host: "主机名"
 | 
			
		||||
  banner-url: "背景图片地址"
 | 
			
		||||
  error-image-url: "エラー画像URL"
 | 
			
		||||
  error-image-url: "无效的图像URL"
 | 
			
		||||
  languages: "实例语言"
 | 
			
		||||
  languages-desc: "您可以添加多个,以空格分隔。"
 | 
			
		||||
  maintainer-config: "管理员信息"
 | 
			
		||||
@@ -1010,6 +1051,8 @@ admin/views/instance.vue:
 | 
			
		||||
  max-note-text-length: "最大帖子字符数"
 | 
			
		||||
  disable-registration: "停用新用户注册功能"
 | 
			
		||||
  disable-local-timeline: "停用本地时间线功能"
 | 
			
		||||
  disable-global-timeline: "グローバルタイムラインを無効にする"
 | 
			
		||||
  disabling-timelines-info: "これらのタイムラインを無効にしても、管理者およびモデレーターは引き続き利用できます。"
 | 
			
		||||
  invite: "邀请"
 | 
			
		||||
  save: "保存"
 | 
			
		||||
  saved: "保存完毕"
 | 
			
		||||
@@ -1029,6 +1072,12 @@ admin/views/instance.vue:
 | 
			
		||||
  smtp-port: "SMTP 端口"
 | 
			
		||||
  smtp-user: "SMTP 用户名"
 | 
			
		||||
  smtp-pass: "SMTP 密码"
 | 
			
		||||
  serviceworker-config: "ServiceWorker"
 | 
			
		||||
  enable-serviceworker: "启用ServiceWorker"
 | 
			
		||||
  serviceworker-info: "プッシュ通知を行うには有効する必要があります。"
 | 
			
		||||
  vapid-publickey: "VAPID公钥"
 | 
			
		||||
  vapid-privatekey: "VAPID私钥"
 | 
			
		||||
  vapid-info: "如果您想要启用ServiceWorker,那么您需要生成VAPID秘钥。除非您已经在其他地方设置了全局node_modules位置,否则您需要将其作为root用户运行:"
 | 
			
		||||
admin/views/charts.vue:
 | 
			
		||||
  title: "历史记录"
 | 
			
		||||
  per-day: "每天"
 | 
			
		||||
@@ -1047,6 +1096,7 @@ admin/views/charts.vue:
 | 
			
		||||
    notes-total: "帖子总数"
 | 
			
		||||
    users: "用户数量:增加/减少"
 | 
			
		||||
    users-total: "用户总数"
 | 
			
		||||
    active-users: "アクティブユーザー数"
 | 
			
		||||
    drive: "存储容量:增加/减少"
 | 
			
		||||
    drive-total: "云盘总容量"
 | 
			
		||||
    drive-files: "云盘上的文件数:增加/减少"
 | 
			
		||||
@@ -1054,6 +1104,28 @@ admin/views/charts.vue:
 | 
			
		||||
    network-requests: "请求"
 | 
			
		||||
    network-time: "响应时间"
 | 
			
		||||
    network-usage: "网络流量"
 | 
			
		||||
admin/views/drive.vue:
 | 
			
		||||
  operation: "操作"
 | 
			
		||||
  fileid-or-url: "ファイルIDまたはファイルURL"
 | 
			
		||||
  file-not-found: "ファイルが見つかりません"
 | 
			
		||||
  lookup: "照会"
 | 
			
		||||
  sort:
 | 
			
		||||
    title: "排序"
 | 
			
		||||
    createdAtAsc: "アップロード日時が古い順"
 | 
			
		||||
    createdAtDesc: "アップロード日時が新しい順"
 | 
			
		||||
    sizeAsc: "サイズが小さい順"
 | 
			
		||||
    sizeDesc: "サイズが大きい順"
 | 
			
		||||
  origin:
 | 
			
		||||
    title: "源自"
 | 
			
		||||
    combined: "本地+远程"
 | 
			
		||||
    local: "本地"
 | 
			
		||||
    remote: "远程"
 | 
			
		||||
  delete: "删除"
 | 
			
		||||
  deleted: "已删除"
 | 
			
		||||
  mark-as-sensitive: "标记为“敏感”"
 | 
			
		||||
  unmark-as-sensitive: "取消标记为“敏感”"
 | 
			
		||||
  marked-as-sensitive: "閲覧注意に設定しました"
 | 
			
		||||
  unmarked-as-sensitive: "閲覧注意を解除しました"
 | 
			
		||||
admin/views/users.vue:
 | 
			
		||||
  operation: "操作"
 | 
			
		||||
  username-or-userid: "用户名或用户ID"
 | 
			
		||||
@@ -1077,6 +1149,14 @@ admin/views/users.vue:
 | 
			
		||||
      createdAtDesc: "注册时间从新到旧"
 | 
			
		||||
      updatedAtAsc: "更新时间从旧到新"
 | 
			
		||||
      updatedAtDesc: "更新时间从新到旧"
 | 
			
		||||
    state:
 | 
			
		||||
      title: "状態"
 | 
			
		||||
      all: "すべて"
 | 
			
		||||
      admin: "管理者"
 | 
			
		||||
      moderator: "モデレーター"
 | 
			
		||||
      adminOrModerator: "管理者+モデレーター"
 | 
			
		||||
      verified: "公式アカウント"
 | 
			
		||||
      suspended: "凍結済み"
 | 
			
		||||
    origin:
 | 
			
		||||
      title: "源自"
 | 
			
		||||
      combined: "本地+远程"
 | 
			
		||||
@@ -1089,6 +1169,8 @@ admin/views/moderators.vue:
 | 
			
		||||
    title: "注册版主"
 | 
			
		||||
    add: "注册"
 | 
			
		||||
    added: "已注册版主。"
 | 
			
		||||
    remove: "解除"
 | 
			
		||||
    removed: "モデレーター登録を解除しました"
 | 
			
		||||
admin/views/emoji.vue:
 | 
			
		||||
  add-emoji:
 | 
			
		||||
    title: "添加emoji"
 | 
			
		||||
@@ -1170,17 +1252,7 @@ desktop/views/pages/user/user.photos.vue:
 | 
			
		||||
  no-photos: "没有图片"
 | 
			
		||||
desktop/views/pages/user/user.profile.vue:
 | 
			
		||||
  follows-you: "关注您"
 | 
			
		||||
  stalk: "跟踪"
 | 
			
		||||
  stalking: "正在跟踪"
 | 
			
		||||
  unstalk: "解除跟踪"
 | 
			
		||||
  mute: "静音"
 | 
			
		||||
  muted: "正在静音"
 | 
			
		||||
  unmute: "取消静音"
 | 
			
		||||
  block: "屏蔽"
 | 
			
		||||
  unblock: "取消屏蔽"
 | 
			
		||||
  block-confirm: "您确定要屏蔽这个用户吗?"
 | 
			
		||||
  push-to-a-list: "添加至列表"
 | 
			
		||||
  list-pushed: "成功添加{user}到{list}"
 | 
			
		||||
  menu: "メニュー"
 | 
			
		||||
desktop/views/pages/user/user.header.vue:
 | 
			
		||||
  posts: "帖子"
 | 
			
		||||
  following: "关注中"
 | 
			
		||||
@@ -1194,6 +1266,7 @@ desktop/views/pages/user/user.timeline.vue:
 | 
			
		||||
  default: "帖子"
 | 
			
		||||
  with-replies: "帖子与回复"
 | 
			
		||||
  with-media: "媒体"
 | 
			
		||||
  my-posts: "私の投稿"
 | 
			
		||||
  empty: "看起来这个用户还没有发布什么呢。"
 | 
			
		||||
desktop/views/widgets/messaging.vue:
 | 
			
		||||
  title: "信息"
 | 
			
		||||
@@ -1392,7 +1465,6 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  notification-position: "通知形式"
 | 
			
		||||
  notification-position-bottom: "底部"
 | 
			
		||||
  notification-position-top: "顶部"
 | 
			
		||||
  theme: "主题"
 | 
			
		||||
  behavior: "动作"
 | 
			
		||||
  fetch-on-scroll: "滚动无限加载"
 | 
			
		||||
  note-visibility: "帖子可见性"
 | 
			
		||||
@@ -1416,7 +1488,6 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  signout: "注销"
 | 
			
		||||
  sound: "声音"
 | 
			
		||||
  enable-sounds: "开启声音"
 | 
			
		||||
  mark-as-read-all-unread-notes: "将所有帖子标记为已读"
 | 
			
		||||
  password: "密码"
 | 
			
		||||
mobile/views/pages/user.vue:
 | 
			
		||||
  follows-you: "关注您"
 | 
			
		||||
@@ -1426,15 +1497,7 @@ mobile/views/pages/user.vue:
 | 
			
		||||
  overview: "概观"
 | 
			
		||||
  timeline: "时间线"
 | 
			
		||||
  media: "媒体"
 | 
			
		||||
  is-suspended: "此账户已被冻结。"
 | 
			
		||||
  mute: "静音"
 | 
			
		||||
  unmute: "取消静音"
 | 
			
		||||
  block: "屏蔽"
 | 
			
		||||
  unblock: "取消屏蔽"
 | 
			
		||||
  years-old: "{age}岁"
 | 
			
		||||
  push-to-list: "添加至列表"
 | 
			
		||||
  select-list: "选择一个列表"
 | 
			
		||||
  list-pushed: "成功添加{user}到{list}"
 | 
			
		||||
mobile/views/pages/user/home.vue:
 | 
			
		||||
  recent-notes: "最近的帖子"
 | 
			
		||||
  images: "图片"
 | 
			
		||||
@@ -1484,7 +1547,6 @@ deck/deck.user-column.vue:
 | 
			
		||||
  activity: "活动"
 | 
			
		||||
  timeline: "时间线"
 | 
			
		||||
  pinned-notes: "标记投稿"
 | 
			
		||||
  push-to-a-list: "添加至列表"
 | 
			
		||||
docs:
 | 
			
		||||
  edit-this-page-on-github: "发现错误或想要为文档做出贡献?"
 | 
			
		||||
  edit-this-page-on-github-link: "在GitHub上编辑这个页面。"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										108
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										108
									
								
								package.json
									
									
									
									
									
								
							@@ -1,8 +1,8 @@
 | 
			
		||||
{
 | 
			
		||||
	"name": "misskey",
 | 
			
		||||
	"author": "syuilo <i@syuilo.com>",
 | 
			
		||||
	"version": "10.63.0",
 | 
			
		||||
	"clientVersion": "2.0.12685",
 | 
			
		||||
	"version": "10.78.4",
 | 
			
		||||
	"clientVersion": "2.0.13678",
 | 
			
		||||
	"codename": "nighthike",
 | 
			
		||||
	"main": "./built/index.js",
 | 
			
		||||
	"private": true,
 | 
			
		||||
@@ -20,34 +20,34 @@
 | 
			
		||||
		"format": "gulp format"
 | 
			
		||||
	},
 | 
			
		||||
	"dependencies": {
 | 
			
		||||
		"@fortawesome/fontawesome-svg-core": "1.2.8",
 | 
			
		||||
		"@fortawesome/free-brands-svg-icons": "5.5.0",
 | 
			
		||||
		"@fortawesome/fontawesome-svg-core": "1.2.12",
 | 
			
		||||
		"@fortawesome/free-brands-svg-icons": "5.6.3",
 | 
			
		||||
		"@fortawesome/free-regular-svg-icons": "5.5.0",
 | 
			
		||||
		"@fortawesome/free-solid-svg-icons": "5.5.0",
 | 
			
		||||
		"@fortawesome/vue-fontawesome": "0.1.2",
 | 
			
		||||
		"@koa/cors": "2.2.2",
 | 
			
		||||
		"@fortawesome/free-solid-svg-icons": "5.6.3",
 | 
			
		||||
		"@fortawesome/vue-fontawesome": "0.1.5",
 | 
			
		||||
		"@koa/cors": "2.2.3",
 | 
			
		||||
		"@prezzemolo/rap": "0.1.2",
 | 
			
		||||
		"@prezzemolo/zip": "0.0.3",
 | 
			
		||||
		"@types/bcryptjs": "2.4.2",
 | 
			
		||||
		"@types/chai-http": "3.0.5",
 | 
			
		||||
		"@types/dateformat": "1.0.1",
 | 
			
		||||
		"@types/dateformat": "3.0.0",
 | 
			
		||||
		"@types/debug": "0.0.31",
 | 
			
		||||
		"@types/deep-equal": "1.0.1",
 | 
			
		||||
		"@types/double-ended-queue": "2.1.0",
 | 
			
		||||
		"@types/elasticsearch": "5.0.29",
 | 
			
		||||
		"@types/file-type": "5.2.2",
 | 
			
		||||
		"@types/elasticsearch": "5.0.30",
 | 
			
		||||
		"@types/file-type": "10.6.0",
 | 
			
		||||
		"@types/gulp": "3.8.36",
 | 
			
		||||
		"@types/gulp-htmlmin": "1.3.32",
 | 
			
		||||
		"@types/gulp-mocha": "0.0.32",
 | 
			
		||||
		"@types/gulp-rename": "0.0.33",
 | 
			
		||||
		"@types/gulp-replace": "0.0.31",
 | 
			
		||||
		"@types/gulp-uglify": "3.0.6",
 | 
			
		||||
		"@types/gulp-util": "3.0.34",
 | 
			
		||||
		"@types/is-root": "1.0.0",
 | 
			
		||||
		"@types/is-svg": "3.0.0",
 | 
			
		||||
		"@types/is-url": "1.2.28",
 | 
			
		||||
		"@types/js-yaml": "3.11.2",
 | 
			
		||||
		"@types/js-yaml": "3.11.4",
 | 
			
		||||
		"@types/katex": "0.5.0",
 | 
			
		||||
		"@types/koa": "2.0.47",
 | 
			
		||||
		"@types/koa": "2.0.48",
 | 
			
		||||
		"@types/koa-bodyparser": "5.0.2",
 | 
			
		||||
		"@types/koa-compress": "2.0.8",
 | 
			
		||||
		"@types/koa-favicon": "2.0.19",
 | 
			
		||||
@@ -61,9 +61,9 @@
 | 
			
		||||
		"@types/minio": "7.0.1",
 | 
			
		||||
		"@types/mkdirp": "0.5.2",
 | 
			
		||||
		"@types/mocha": "5.2.5",
 | 
			
		||||
		"@types/mongodb": "3.1.14",
 | 
			
		||||
		"@types/mongodb": "3.1.18",
 | 
			
		||||
		"@types/ms": "0.7.30",
 | 
			
		||||
		"@types/node": "10.12.10",
 | 
			
		||||
		"@types/node": "10.12.18",
 | 
			
		||||
		"@types/nodemailer": "4.6.5",
 | 
			
		||||
		"@types/oauth": "0.9.1",
 | 
			
		||||
		"@types/parsimmon": "1.10.0",
 | 
			
		||||
@@ -71,24 +71,24 @@
 | 
			
		||||
		"@types/pug": "2.0.4",
 | 
			
		||||
		"@types/qrcode": "1.3.0",
 | 
			
		||||
		"@types/ratelimiter": "2.1.28",
 | 
			
		||||
		"@types/redis": "2.8.8",
 | 
			
		||||
		"@types/redis": "2.8.10",
 | 
			
		||||
		"@types/request": "2.48.1",
 | 
			
		||||
		"@types/request-promise-native": "1.0.15",
 | 
			
		||||
		"@types/rimraf": "2.0.2",
 | 
			
		||||
		"@types/seedrandom": "2.4.27",
 | 
			
		||||
		"@types/sharp": "0.21.0",
 | 
			
		||||
		"@types/showdown": "1.7.5",
 | 
			
		||||
		"@types/showdown": "1.9.2",
 | 
			
		||||
		"@types/speakeasy": "2.0.3",
 | 
			
		||||
		"@types/systeminformation": "3.23.1",
 | 
			
		||||
		"@types/tinycolor2": "1.4.1",
 | 
			
		||||
		"@types/tmp": "0.0.33",
 | 
			
		||||
		"@types/uuid": "3.4.4",
 | 
			
		||||
		"@types/webpack": "4.4.20",
 | 
			
		||||
		"@types/webpack": "4.4.21",
 | 
			
		||||
		"@types/webpack-stream": "3.2.10",
 | 
			
		||||
		"@types/websocket": "0.0.40",
 | 
			
		||||
		"@types/ws": "6.0.1",
 | 
			
		||||
		"animejs": "2.2.0",
 | 
			
		||||
		"apexcharts": "2.2.4",
 | 
			
		||||
		"animejs": "3.0.1",
 | 
			
		||||
		"apexcharts": "2.5.1",
 | 
			
		||||
		"autobind-decorator": "2.4.0",
 | 
			
		||||
		"autosize": "4.0.2",
 | 
			
		||||
		"autwh": "0.1.0",
 | 
			
		||||
@@ -97,50 +97,50 @@
 | 
			
		||||
		"bootstrap-vue": "2.0.0-rc.11",
 | 
			
		||||
		"cafy": "12.0.0",
 | 
			
		||||
		"chai": "4.2.0",
 | 
			
		||||
		"chai-http": "4.2.0",
 | 
			
		||||
		"chalk": "2.4.1",
 | 
			
		||||
		"chalk": "2.4.2",
 | 
			
		||||
		"chai-http": "4.2.1",
 | 
			
		||||
		"commander": "2.19.0",
 | 
			
		||||
		"crc-32": "1.2.0",
 | 
			
		||||
		"css-loader": "1.0.1",
 | 
			
		||||
		"cssnano": "4.1.7",
 | 
			
		||||
		"cssnano": "4.1.8",
 | 
			
		||||
		"dateformat": "3.0.3",
 | 
			
		||||
		"debug": "4.1.0",
 | 
			
		||||
		"deep-equal": "1.0.1",
 | 
			
		||||
		"deepcopy": "0.6.3",
 | 
			
		||||
		"diskusage": "1.0.0",
 | 
			
		||||
		"double-ended-queue": "2.1.0-0",
 | 
			
		||||
		"elasticsearch": "15.2.0",
 | 
			
		||||
		"elasticsearch": "15.3.0",
 | 
			
		||||
		"emojilib": "2.4.0",
 | 
			
		||||
		"escape-regexp": "0.0.1",
 | 
			
		||||
		"eslint": "5.8.0",
 | 
			
		||||
		"eslint-plugin-vue": "4.7.1",
 | 
			
		||||
		"eslint": "5.12.0",
 | 
			
		||||
		"eslint-plugin-vue": "5.1.0",
 | 
			
		||||
		"eventemitter3": "3.1.0",
 | 
			
		||||
		"feed": "2.0.2",
 | 
			
		||||
		"file-loader": "2.0.0",
 | 
			
		||||
		"file-type": "10.6.0",
 | 
			
		||||
		"file-type": "10.7.0",
 | 
			
		||||
		"fuckadblock": "3.2.1",
 | 
			
		||||
		"gulp": "3.9.1",
 | 
			
		||||
		"gulp-cssnano": "2.1.3",
 | 
			
		||||
		"gulp-htmlmin": "5.0.1",
 | 
			
		||||
		"gulp-imagemin": "4.1.0",
 | 
			
		||||
		"gulp-mocha": "6.0.0",
 | 
			
		||||
		"gulp-pug": "4.0.1",
 | 
			
		||||
		"gulp-rename": "1.4.0",
 | 
			
		||||
		"gulp-replace": "1.0.0",
 | 
			
		||||
		"gulp-sourcemaps": "2.6.4",
 | 
			
		||||
		"gulp-stylus": "2.7.0",
 | 
			
		||||
		"gulp-tslint": "8.1.3",
 | 
			
		||||
		"gulp-typescript": "4.0.2",
 | 
			
		||||
		"gulp-typescript": "5.0.0",
 | 
			
		||||
		"gulp-uglify": "3.0.1",
 | 
			
		||||
		"gulp-util": "3.0.8",
 | 
			
		||||
		"gulp-yaml": "2.0.2",
 | 
			
		||||
		"hard-source-webpack-plugin": "0.12.0",
 | 
			
		||||
		"hard-source-webpack-plugin": "0.13.1",
 | 
			
		||||
		"html-minifier": "3.5.21",
 | 
			
		||||
		"http-signature": "1.2.0",
 | 
			
		||||
		"insert-text-at-cursor": "0.1.1",
 | 
			
		||||
		"is-root": "2.0.0",
 | 
			
		||||
		"is-svg": "3.0.0",
 | 
			
		||||
		"is-url": "1.2.4",
 | 
			
		||||
		"js-yaml": "3.12.0",
 | 
			
		||||
		"jsdom": "13.0.0",
 | 
			
		||||
		"js-yaml": "3.12.1",
 | 
			
		||||
		"jsdom": "13.1.0",
 | 
			
		||||
		"json5": "2.1.0",
 | 
			
		||||
		"json5-loader": "1.0.1",
 | 
			
		||||
		"katex": "0.10.0",
 | 
			
		||||
@@ -157,18 +157,19 @@
 | 
			
		||||
		"koa-slow": "2.1.0",
 | 
			
		||||
		"koa-views": "6.1.4",
 | 
			
		||||
		"langmap": "0.0.16",
 | 
			
		||||
		"loader-utils": "1.1.0",
 | 
			
		||||
		"minio": "7.0.1",
 | 
			
		||||
		"loader-utils": "1.2.3",
 | 
			
		||||
		"lookup-dns-cache": "2.1.0",
 | 
			
		||||
		"minio": "7.0.3",
 | 
			
		||||
		"mkdirp": "0.5.1",
 | 
			
		||||
		"mocha": "5.2.0",
 | 
			
		||||
		"moji": "0.5.1",
 | 
			
		||||
		"moment": "2.22.2",
 | 
			
		||||
		"mongodb": "3.1.9",
 | 
			
		||||
		"moment": "2.23.0",
 | 
			
		||||
		"mongodb": "3.1.10",
 | 
			
		||||
		"monk": "6.0.6",
 | 
			
		||||
		"ms": "2.1.1",
 | 
			
		||||
		"nan": "2.11.1",
 | 
			
		||||
		"nan": "2.12.1",
 | 
			
		||||
		"nested-property": "0.0.7",
 | 
			
		||||
		"nodemailer": "4.7.0",
 | 
			
		||||
		"nodemailer": "5.0.0",
 | 
			
		||||
		"nprogress": "0.2.0",
 | 
			
		||||
		"object-assign-deep": "0.4.0",
 | 
			
		||||
		"on-build-webpack": "0.1.0",
 | 
			
		||||
@@ -178,6 +179,7 @@
 | 
			
		||||
		"portscanner": "2.2.0",
 | 
			
		||||
		"postcss-loader": "3.0.0",
 | 
			
		||||
		"progress-bar-webpack-plugin": "1.11.0",
 | 
			
		||||
		"promise-any": "0.2.0",
 | 
			
		||||
		"promise-limit": "2.7.0",
 | 
			
		||||
		"promise-sequential": "1.1.1",
 | 
			
		||||
		"pug": "2.0.3",
 | 
			
		||||
@@ -191,11 +193,11 @@
 | 
			
		||||
		"request": "2.88.0",
 | 
			
		||||
		"request-promise-native": "1.0.5",
 | 
			
		||||
		"request-stats": "3.0.0",
 | 
			
		||||
		"rimraf": "2.6.2",
 | 
			
		||||
		"rimraf": "2.6.3",
 | 
			
		||||
		"rndstr": "1.0.0",
 | 
			
		||||
		"s-age": "1.1.2",
 | 
			
		||||
		"seedrandom": "2.4.4",
 | 
			
		||||
		"sharp": "0.21.0",
 | 
			
		||||
		"sharp": "0.21.1",
 | 
			
		||||
		"showdown": "1.9.0",
 | 
			
		||||
		"showdown-highlightjs-extension": "0.1.2",
 | 
			
		||||
		"speakeasy": "2.0.0",
 | 
			
		||||
@@ -204,15 +206,16 @@
 | 
			
		||||
		"stylus": "0.54.5",
 | 
			
		||||
		"stylus-loader": "3.0.2",
 | 
			
		||||
		"summaly": "2.2.0",
 | 
			
		||||
		"systeminformation": "3.51.3",
 | 
			
		||||
		"systeminformation": "3.52.2",
 | 
			
		||||
		"syuilo-password-strength": "0.0.1",
 | 
			
		||||
		"terser-webpack-plugin": "1.1.0",
 | 
			
		||||
		"terser-webpack-plugin": "1.2.1",
 | 
			
		||||
		"textarea-caret": "3.1.0",
 | 
			
		||||
		"tinycolor2": "1.4.1",
 | 
			
		||||
		"tmp": "0.0.33",
 | 
			
		||||
		"ts-loader": "5.3.1",
 | 
			
		||||
		"ts-loader": "5.3.3",
 | 
			
		||||
		"ts-node": "7.0.1",
 | 
			
		||||
		"tslint": "5.10.0",
 | 
			
		||||
		"tslint": "5.12.0",
 | 
			
		||||
		"tslint-sonarts": "1.8.0",
 | 
			
		||||
		"typescript": "3.2.2",
 | 
			
		||||
		"typescript-eslint-parser": "21.0.2",
 | 
			
		||||
		"uglify-es": "3.3.9",
 | 
			
		||||
@@ -222,14 +225,15 @@
 | 
			
		||||
		"vue": "2.5.17",
 | 
			
		||||
		"vue-color": "2.7.0",
 | 
			
		||||
		"vue-content-loading": "1.5.3",
 | 
			
		||||
		"vue-cropperjs": "2.2.2",
 | 
			
		||||
		"vue-i18n": "8.3.2",
 | 
			
		||||
		"vue-js-modal": "1.3.27",
 | 
			
		||||
		"vue-cropperjs": "3.0.0",
 | 
			
		||||
		"vue-i18n": "8.7.0",
 | 
			
		||||
		"vue-js-modal": "1.3.28",
 | 
			
		||||
		"vue-loader": "15.4.2",
 | 
			
		||||
		"vue-marquee-text-component": "1.1.0",
 | 
			
		||||
		"vue-marquee-text-component": "1.1.1",
 | 
			
		||||
		"vue-router": "3.0.2",
 | 
			
		||||
		"vue-sequential-entrance": "1.1.3",
 | 
			
		||||
		"vue-style-loader": "4.1.2",
 | 
			
		||||
		"vue-svg-inline-loader": "1.2.4",
 | 
			
		||||
		"vue-svg-inline-loader": "1.2.7",
 | 
			
		||||
		"vue-template-compiler": "2.5.17",
 | 
			
		||||
		"vuedraggable": "2.17.0",
 | 
			
		||||
		"vuewordcloud": "18.7.11",
 | 
			
		||||
@@ -237,8 +241,8 @@
 | 
			
		||||
		"vuex-persistedstate": "2.5.4",
 | 
			
		||||
		"web-push": "3.3.3",
 | 
			
		||||
		"webfinger.js": "2.7.0",
 | 
			
		||||
		"webpack": "4.26.1",
 | 
			
		||||
		"webpack-cli": "3.1.2",
 | 
			
		||||
		"webpack": "4.28.4",
 | 
			
		||||
		"webpack-cli": "3.2.1",
 | 
			
		||||
		"websocket": "1.0.28",
 | 
			
		||||
		"ws": "6.1.2",
 | 
			
		||||
		"xev": "2.0.1"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										48
									
								
								src/chart/active-users.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								src/chart/active-users.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,48 @@
 | 
			
		||||
import autobind from 'autobind-decorator';
 | 
			
		||||
import Chart, { Obj } from '.';
 | 
			
		||||
import { IUser, isLocalUser } from '../models/user';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * アクティブユーザーに関するチャート
 | 
			
		||||
 */
 | 
			
		||||
type ActiveUsersLog = {
 | 
			
		||||
	local: {
 | 
			
		||||
		/**
 | 
			
		||||
		 * アクティブユーザー数
 | 
			
		||||
		 */
 | 
			
		||||
		count: number;
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	remote: ActiveUsersLog['local'];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class ActiveUsersChart extends Chart<ActiveUsersLog> {
 | 
			
		||||
	constructor() {
 | 
			
		||||
		super('activeUsers');
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
	protected async getTemplate(init: boolean, latest?: ActiveUsersLog): Promise<ActiveUsersLog> {
 | 
			
		||||
		return {
 | 
			
		||||
			local: {
 | 
			
		||||
				count: 0
 | 
			
		||||
			},
 | 
			
		||||
			remote: {
 | 
			
		||||
				count: 0
 | 
			
		||||
			}
 | 
			
		||||
		};
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
	public async update(user: IUser) {
 | 
			
		||||
		const update: Obj = {
 | 
			
		||||
			count: 1
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
		await this.incIfUnique({
 | 
			
		||||
			[isLocalUser(user) ? 'local' : 'remote']: update
 | 
			
		||||
		}, 'users', user._id.toHexString());
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default new ActiveUsersChart();
 | 
			
		||||
@@ -64,7 +64,7 @@ export default abstract class Chart<T> {
 | 
			
		||||
		const keys = {
 | 
			
		||||
			span: -1,
 | 
			
		||||
			date: -1
 | 
			
		||||
		} as any;
 | 
			
		||||
		} as { [key: string]: 1 | -1; };
 | 
			
		||||
		if (grouped) keys.group = -1;
 | 
			
		||||
		this.collection.createIndex(keys, { unique: true });
 | 
			
		||||
	}
 | 
			
		||||
@@ -316,21 +316,9 @@ export default abstract class Chart<T> {
 | 
			
		||||
		const res: ArrayValue<T> = {} as any;
 | 
			
		||||
 | 
			
		||||
		/**
 | 
			
		||||
		 * [{
 | 
			
		||||
		 * 	xxxxx: 1, yyyyy: 5
 | 
			
		||||
		 * }, {
 | 
			
		||||
		 * 	xxxxx: 2, yyyyy: 6
 | 
			
		||||
		 * }, {
 | 
			
		||||
		 * 	xxxxx: 3, yyyyy: 7
 | 
			
		||||
		 * }]
 | 
			
		||||
		 *
 | 
			
		||||
		 * [{ foo: 1, bar: 5 }, { foo: 2, bar: 6 }, { foo: 3, bar: 7 }]
 | 
			
		||||
		 * を
 | 
			
		||||
		 *
 | 
			
		||||
		 * {
 | 
			
		||||
		 * 	xxxxx: [1, 2, 3],
 | 
			
		||||
		 * 	yyyyy: [5, 6, 7]
 | 
			
		||||
		 * }
 | 
			
		||||
		 *
 | 
			
		||||
		 * { foo: [1, 2, 3], bar: [5, 6, 7] }
 | 
			
		||||
		 * にする
 | 
			
		||||
		 */
 | 
			
		||||
		const dive = (x: Obj, path?: string) => {
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@ import './style.styl';
 | 
			
		||||
 | 
			
		||||
import init from '../init';
 | 
			
		||||
import Index from './views/index.vue';
 | 
			
		||||
import NotFound from '../common/views/pages/404.vue';
 | 
			
		||||
import NotFound from '../common/views/pages/not-found.vue';
 | 
			
		||||
 | 
			
		||||
init(launch => {
 | 
			
		||||
	document.title = 'Admin';
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										83
									
								
								src/client/app/admin/views/abuse.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								src/client/app/admin/views/abuse.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,83 @@
 | 
			
		||||
<template>
 | 
			
		||||
<div>
 | 
			
		||||
	<ui-card>
 | 
			
		||||
		<div slot="title"><fa :icon="faExclamationCircle"/> {{ $t('title') }}</div>
 | 
			
		||||
		<section class="fit-top">
 | 
			
		||||
			<sequential-entrance animation="entranceFromTop" delay="25">
 | 
			
		||||
				<div v-for="report in userReports" :key="report.id" class="haexwsjc">
 | 
			
		||||
					<ui-horizon-group inputs>
 | 
			
		||||
						<ui-input :value="report.user | acct" type="text">
 | 
			
		||||
							<span>{{ $t('target') }}</span>
 | 
			
		||||
						</ui-input>
 | 
			
		||||
						<ui-input :value="report.reporter | acct" type="text">
 | 
			
		||||
							<span>{{ $t('reporter') }}</span>
 | 
			
		||||
						</ui-input>
 | 
			
		||||
					</ui-horizon-group>
 | 
			
		||||
					<ui-textarea :value="report.comment" readonly>
 | 
			
		||||
						<span>{{ $t('details') }}</span>
 | 
			
		||||
					</ui-textarea>
 | 
			
		||||
					<ui-button @click="removeReport(report)">{{ $t('remove-report') }}</ui-button>
 | 
			
		||||
				</div>
 | 
			
		||||
			</sequential-entrance>
 | 
			
		||||
			<ui-button v-if="existMore" @click="fetchUserReports">{{ $t('@.load-more') }}</ui-button>
 | 
			
		||||
		</section>
 | 
			
		||||
	</ui-card>
 | 
			
		||||
</div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
import Vue from 'vue';
 | 
			
		||||
import i18n from '../../i18n';
 | 
			
		||||
import { faExclamationCircle } from '@fortawesome/free-solid-svg-icons';
 | 
			
		||||
 | 
			
		||||
export default Vue.extend({
 | 
			
		||||
	i18n: i18n('admin/views/abuse.vue'),
 | 
			
		||||
 | 
			
		||||
	data() {
 | 
			
		||||
		return {
 | 
			
		||||
			limit: 10,
 | 
			
		||||
			untilId: undefined,
 | 
			
		||||
			userReports: [],
 | 
			
		||||
			existMore: false,
 | 
			
		||||
			faExclamationCircle
 | 
			
		||||
		};
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	mounted() {
 | 
			
		||||
		this.fetchUserReports();
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	methods: {
 | 
			
		||||
		fetchUserReports() {
 | 
			
		||||
			this.$root.api('admin/abuse-user-reports', {
 | 
			
		||||
				untilId: this.untilId,
 | 
			
		||||
				limit: this.limit + 1
 | 
			
		||||
			}).then(reports => {
 | 
			
		||||
				if (reports.length == this.limit + 1) {
 | 
			
		||||
					reports.pop();
 | 
			
		||||
					this.existMore = true;
 | 
			
		||||
				} else {
 | 
			
		||||
					this.existMore = false;
 | 
			
		||||
				}
 | 
			
		||||
				this.userReports = this.userReports.concat(reports);
 | 
			
		||||
				this.untilId = this.userReports[this.userReports.length - 1].id;
 | 
			
		||||
			});
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		removeReport(report) {
 | 
			
		||||
			this.$root.api('admin/remove-abuse-user-report', {
 | 
			
		||||
				reportId: report.id
 | 
			
		||||
			}).then(() => {
 | 
			
		||||
				this.userReports = this.userReports.filter(r => r.id != report.id);
 | 
			
		||||
			});
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="stylus" scoped>
 | 
			
		||||
.haexwsjc
 | 
			
		||||
	padding-bottom 16px
 | 
			
		||||
	border-bottom solid 1px var(--faceDivider)
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
<template>
 | 
			
		||||
<div class="cdeuzmsthagexbkpofbmatmugjuvogfb">
 | 
			
		||||
<div>
 | 
			
		||||
	<ui-card>
 | 
			
		||||
		<div slot="title"><fa icon="broadcast-tower"/> {{ $t('announcements') }}</div>
 | 
			
		||||
		<section v-for="(announcement, i) in announcements" class="fit-top">
 | 
			
		||||
@@ -83,10 +83,3 @@ export default Vue.extend({
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="stylus" scoped>
 | 
			
		||||
.cdeuzmsthagexbkpofbmatmugjuvogfb
 | 
			
		||||
	@media (min-width 500px)
 | 
			
		||||
		padding 16px
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
 
 | 
			
		||||
@@ -69,7 +69,7 @@ export default Vue.extend({
 | 
			
		||||
	display block
 | 
			
		||||
	padding 12px 16px 16px 16px
 | 
			
		||||
	height 250px
 | 
			
		||||
	overflow hidden
 | 
			
		||||
	overflow auto
 | 
			
		||||
	box-shadow 0 2px 4px rgba(0, 0, 0, 0.1)
 | 
			
		||||
	background var(--adminDashboardCardBg)
 | 
			
		||||
	border-radius 8px
 | 
			
		||||
 
 | 
			
		||||
@@ -10,6 +10,7 @@
 | 
			
		||||
			<optgroup :label="$t('users')">
 | 
			
		||||
				<option value="users">{{ $t('charts.users') }}</option>
 | 
			
		||||
				<option value="users-total">{{ $t('charts.users-total') }}</option>
 | 
			
		||||
				<option value="active-users">{{ $t('charts.active-users') }}</option>
 | 
			
		||||
			</optgroup>
 | 
			
		||||
			<optgroup :label="$t('notes')">
 | 
			
		||||
				<option value="notes">{{ $t('charts.notes') }}</option>
 | 
			
		||||
@@ -67,6 +68,7 @@ export default Vue.extend({
 | 
			
		||||
				case 'federation-instances-total': return this.federationInstancesChart(true);
 | 
			
		||||
				case 'users': return this.usersChart(false);
 | 
			
		||||
				case 'users-total': return this.usersChart(true);
 | 
			
		||||
				case 'active-users': return this.activeUsersChart();
 | 
			
		||||
				case 'notes': return this.notesChart('combined');
 | 
			
		||||
				case 'local-notes': return this.notesChart('local');
 | 
			
		||||
				case 'remote-notes': return this.notesChart('remote');
 | 
			
		||||
@@ -107,12 +109,14 @@ export default Vue.extend({
 | 
			
		||||
		const [perHour, perDay] = await Promise.all([Promise.all([
 | 
			
		||||
			this.$root.api('charts/federation', { limit: limit, span: 'hour' }),
 | 
			
		||||
			this.$root.api('charts/users', { limit: limit, span: 'hour' }),
 | 
			
		||||
			this.$root.api('charts/active-users', { limit: limit, span: 'hour' }),
 | 
			
		||||
			this.$root.api('charts/notes', { limit: limit, span: 'hour' }),
 | 
			
		||||
			this.$root.api('charts/drive', { limit: limit, span: 'hour' }),
 | 
			
		||||
			this.$root.api('charts/network', { limit: limit, span: 'hour' })
 | 
			
		||||
		]), Promise.all([
 | 
			
		||||
			this.$root.api('charts/federation', { limit: limit, span: 'day' }),
 | 
			
		||||
			this.$root.api('charts/users', { limit: limit, span: 'day' }),
 | 
			
		||||
			this.$root.api('charts/active-users', { limit: limit, span: 'day' }),
 | 
			
		||||
			this.$root.api('charts/notes', { limit: limit, span: 'day' }),
 | 
			
		||||
			this.$root.api('charts/drive', { limit: limit, span: 'day' }),
 | 
			
		||||
			this.$root.api('charts/network', { limit: limit, span: 'day' })
 | 
			
		||||
@@ -122,16 +126,18 @@ export default Vue.extend({
 | 
			
		||||
			perHour: {
 | 
			
		||||
				federation: perHour[0],
 | 
			
		||||
				users: perHour[1],
 | 
			
		||||
				notes: perHour[2],
 | 
			
		||||
				drive: perHour[3],
 | 
			
		||||
				network: perHour[4]
 | 
			
		||||
				activeUsers: perHour[2],
 | 
			
		||||
				notes: perHour[3],
 | 
			
		||||
				drive: perHour[4],
 | 
			
		||||
				network: perHour[5]
 | 
			
		||||
			},
 | 
			
		||||
			perDay: {
 | 
			
		||||
				federation: perDay[0],
 | 
			
		||||
				users: perDay[1],
 | 
			
		||||
				notes: perDay[2],
 | 
			
		||||
				drive: perDay[3],
 | 
			
		||||
				network: perDay[4]
 | 
			
		||||
				activeUsers: perDay[2],
 | 
			
		||||
				notes: perDay[3],
 | 
			
		||||
				drive: perDay[4],
 | 
			
		||||
				network: perDay[5]
 | 
			
		||||
			}
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
@@ -183,7 +189,7 @@ export default Vue.extend({
 | 
			
		||||
				},
 | 
			
		||||
				legend: {
 | 
			
		||||
					labels: {
 | 
			
		||||
						color: tinycolor(getComputedStyle(document.documentElement).getPropertyValue('--text')).toRgbString()
 | 
			
		||||
						colors: tinycolor(getComputedStyle(document.documentElement).getPropertyValue('--text')).toRgbString()
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				xaxis: {
 | 
			
		||||
@@ -321,6 +327,24 @@ export default Vue.extend({
 | 
			
		||||
			};
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		activeUsersChart(): any {
 | 
			
		||||
			return {
 | 
			
		||||
				series: [{
 | 
			
		||||
					name: 'Combined',
 | 
			
		||||
					type: 'line',
 | 
			
		||||
					data: this.format(sum(this.stats.activeUsers.local.count, this.stats.activeUsers.remote.count))
 | 
			
		||||
				}, {
 | 
			
		||||
					name: 'Local',
 | 
			
		||||
					type: 'area',
 | 
			
		||||
					data: this.format(this.stats.activeUsers.local.count)
 | 
			
		||||
				}, {
 | 
			
		||||
					name: 'Remote',
 | 
			
		||||
					type: 'area',
 | 
			
		||||
					data: this.format(this.stats.activeUsers.remote.count)
 | 
			
		||||
				}]
 | 
			
		||||
			};
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		driveChart(): any {
 | 
			
		||||
			return {
 | 
			
		||||
				bytes: true,
 | 
			
		||||
 
 | 
			
		||||
@@ -148,7 +148,7 @@ export default Vue.extend({
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		updateStats() {
 | 
			
		||||
			this.$root.api('stats', {}, false, true).then(stats => {
 | 
			
		||||
			this.$root.api('stats', {}, true).then(stats => {
 | 
			
		||||
				this.stats = stats;
 | 
			
		||||
			});
 | 
			
		||||
		}
 | 
			
		||||
@@ -161,7 +161,7 @@ export default Vue.extend({
 | 
			
		||||
	padding 16px
 | 
			
		||||
 | 
			
		||||
	@media (min-width 500px)
 | 
			
		||||
		padding 32px
 | 
			
		||||
		padding 16px
 | 
			
		||||
 | 
			
		||||
	> header
 | 
			
		||||
		display flex
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										267
									
								
								src/client/app/admin/views/drive.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										267
									
								
								src/client/app/admin/views/drive.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,267 @@
 | 
			
		||||
<template>
 | 
			
		||||
<div>
 | 
			
		||||
	<ui-card>
 | 
			
		||||
		<div slot="title"><fa :icon="faTerminal"/> {{ $t('operation') }}</div>
 | 
			
		||||
		<section class="fit-top">
 | 
			
		||||
			<ui-input v-model="target" type="text">
 | 
			
		||||
				<span>{{ $t('fileid-or-url') }}</span>
 | 
			
		||||
			</ui-input>
 | 
			
		||||
			<ui-horizon-group>
 | 
			
		||||
				<ui-button @click="findAndToggleSensitive(true)"><fa :icon="faEyeSlash"/> {{ $t('mark-as-sensitive') }}</ui-button>
 | 
			
		||||
				<ui-button @click="findAndToggleSensitive(false)"><fa :icon="faEye"/> {{ $t('unmark-as-sensitive') }}</ui-button>
 | 
			
		||||
			</ui-horizon-group>
 | 
			
		||||
			<ui-button @click="findAndDel()"><fa :icon="faTrashAlt"/> {{ $t('delete') }}</ui-button>
 | 
			
		||||
			<ui-button @click="show()"><fa :icon="faSearch"/> {{ $t('lookup') }}</ui-button>
 | 
			
		||||
			<ui-textarea v-if="file" :value="file | json5" readonly tall style="margin-top:16px;"></ui-textarea>
 | 
			
		||||
		</section>
 | 
			
		||||
	</ui-card>
 | 
			
		||||
 | 
			
		||||
	<ui-card>
 | 
			
		||||
		<div slot="title"><fa :icon="faCloud"/> {{ $t('@.drive') }}</div>
 | 
			
		||||
		<section class="fit-top">
 | 
			
		||||
			<ui-horizon-group inputs>
 | 
			
		||||
				<ui-select v-model="sort">
 | 
			
		||||
					<span slot="label">{{ $t('sort.title') }}</span>
 | 
			
		||||
					<option value="-createdAt">{{ $t('sort.createdAtAsc') }}</option>
 | 
			
		||||
					<option value="+createdAt">{{ $t('sort.createdAtDesc') }}</option>
 | 
			
		||||
					<option value="-size">{{ $t('sort.sizeAsc') }}</option>
 | 
			
		||||
					<option value="+size">{{ $t('sort.sizeDesc') }}</option>
 | 
			
		||||
				</ui-select>
 | 
			
		||||
				<ui-select v-model="origin">
 | 
			
		||||
					<span slot="label">{{ $t('origin.title') }}</span>
 | 
			
		||||
					<option value="combined">{{ $t('origin.combined') }}</option>
 | 
			
		||||
					<option value="local">{{ $t('origin.local') }}</option>
 | 
			
		||||
					<option value="remote">{{ $t('origin.remote') }}</option>
 | 
			
		||||
				</ui-select>
 | 
			
		||||
			</ui-horizon-group>
 | 
			
		||||
			<sequential-entrance animation="entranceFromTop" delay="25">
 | 
			
		||||
				<div class="kidvdlkg" v-for="file in files">
 | 
			
		||||
					<div @click="file._open = !file._open">
 | 
			
		||||
						<div>
 | 
			
		||||
							<div class="thumbnail" :style="thumbnail(file)"></div>
 | 
			
		||||
						</div>
 | 
			
		||||
						<div>
 | 
			
		||||
							<header>
 | 
			
		||||
								<b>{{ file.name }}</b>
 | 
			
		||||
								<span class="username">@{{ file.user | acct }}</span>
 | 
			
		||||
							</header>
 | 
			
		||||
							<div>
 | 
			
		||||
								<div>
 | 
			
		||||
									<span style="margin-right:16px;">{{ file.type }}</span>
 | 
			
		||||
									<span>{{ file.datasize | bytes }}</span>
 | 
			
		||||
								</div>
 | 
			
		||||
								<div><mk-time :time="file.createdAt" mode="detail"/></div>
 | 
			
		||||
							</div>
 | 
			
		||||
						</div>
 | 
			
		||||
					</div>
 | 
			
		||||
					<div v-show="file._open">
 | 
			
		||||
						<ui-input readonly :value="file.url"></ui-input>
 | 
			
		||||
						<ui-horizon-group>
 | 
			
		||||
							<ui-button @click="toggleSensitive(file)" v-if="file.isSensitive"><fa :icon="faEye"/> {{ $t('unmark-as-sensitive') }}</ui-button>
 | 
			
		||||
							<ui-button @click="toggleSensitive(file)" v-else><fa :icon="faEyeSlash"/> {{ $t('mark-as-sensitive') }}</ui-button>
 | 
			
		||||
							<ui-button @click="del(file)"><fa :icon="faTrashAlt"/> {{ $t('delete') }}</ui-button>
 | 
			
		||||
						</ui-horizon-group>
 | 
			
		||||
					</div>
 | 
			
		||||
				</div>
 | 
			
		||||
			</sequential-entrance>
 | 
			
		||||
			<ui-button v-if="existMore" @click="fetch">{{ $t('@.load-more') }}</ui-button>
 | 
			
		||||
		</section>
 | 
			
		||||
	</ui-card>
 | 
			
		||||
</div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
import Vue from 'vue';
 | 
			
		||||
import i18n from '../../i18n';
 | 
			
		||||
import { faCloud, faTerminal, faSearch } from '@fortawesome/free-solid-svg-icons';
 | 
			
		||||
import { faTrashAlt, faEye, faEyeSlash } from '@fortawesome/free-regular-svg-icons';
 | 
			
		||||
 | 
			
		||||
export default Vue.extend({
 | 
			
		||||
	i18n: i18n('admin/views/drive.vue'),
 | 
			
		||||
 | 
			
		||||
	data() {
 | 
			
		||||
		return {
 | 
			
		||||
			file: null,
 | 
			
		||||
			target: null,
 | 
			
		||||
			sort: '+createdAt',
 | 
			
		||||
			origin: 'combined',
 | 
			
		||||
			limit: 10,
 | 
			
		||||
			offset: 0,
 | 
			
		||||
			files: [],
 | 
			
		||||
			existMore: false,
 | 
			
		||||
			faCloud, faTrashAlt, faEye, faEyeSlash, faTerminal, faSearch
 | 
			
		||||
		};
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	watch: {
 | 
			
		||||
		sort() {
 | 
			
		||||
			this.files = [];
 | 
			
		||||
			this.offset = 0;
 | 
			
		||||
			this.fetch();
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		origin() {
 | 
			
		||||
			this.files = [];
 | 
			
		||||
			this.offset = 0;
 | 
			
		||||
			this.fetch();
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	mounted() {
 | 
			
		||||
		this.fetch();
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	methods: {
 | 
			
		||||
		async fetchFile() {
 | 
			
		||||
			try {
 | 
			
		||||
				return await this.$root.api('drive/files/show', this.target.startsWith('http') ? { url: this.target } : { fileId: this.target });
 | 
			
		||||
			} catch (e) {
 | 
			
		||||
				if (e == 'file-not-found') {
 | 
			
		||||
					this.$root.dialog({
 | 
			
		||||
						type: 'error',
 | 
			
		||||
						text: this.$t('file-not-found')
 | 
			
		||||
					});
 | 
			
		||||
				} else {
 | 
			
		||||
					this.$root.dialog({
 | 
			
		||||
						type: 'error',
 | 
			
		||||
						text: e.toString()
 | 
			
		||||
					});
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		fetch() {
 | 
			
		||||
			this.$root.api('admin/drive/files', {
 | 
			
		||||
				origin: this.origin,
 | 
			
		||||
				sort: this.sort,
 | 
			
		||||
				offset: this.offset,
 | 
			
		||||
				limit: this.limit + 1
 | 
			
		||||
			}).then(files => {
 | 
			
		||||
				if (files.length == this.limit + 1) {
 | 
			
		||||
					files.pop();
 | 
			
		||||
					this.existMore = true;
 | 
			
		||||
				} else {
 | 
			
		||||
					this.existMore = false;
 | 
			
		||||
				}
 | 
			
		||||
				for (const x of files) {
 | 
			
		||||
					x._open = false;
 | 
			
		||||
				}
 | 
			
		||||
				this.files = this.files.concat(files);
 | 
			
		||||
				this.offset += this.limit;
 | 
			
		||||
			});
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		thumbnail(file: any): any {
 | 
			
		||||
			return {
 | 
			
		||||
				'background-color': file.properties.avgColor && file.properties.avgColor.length == 3 ? `rgb(${file.properties.avgColor.join(',')})` : 'transparent',
 | 
			
		||||
				'background-image': `url(${file.thumbnailUrl})`
 | 
			
		||||
			};
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		async del(file: any) {
 | 
			
		||||
			const process = async () => {
 | 
			
		||||
				await this.$root.api('drive/files/delete', { fileId: file.id });
 | 
			
		||||
				this.$root.dialog({
 | 
			
		||||
					type: 'success',
 | 
			
		||||
					text: this.$t('deleted')
 | 
			
		||||
				});
 | 
			
		||||
			};
 | 
			
		||||
 | 
			
		||||
			await process().catch(e => {
 | 
			
		||||
				this.$root.dialog({
 | 
			
		||||
					type: 'error',
 | 
			
		||||
					text: e.toString()
 | 
			
		||||
				});
 | 
			
		||||
			});
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		toggleSensitive(file: any) {
 | 
			
		||||
			this.$root.api('drive/files/update', {
 | 
			
		||||
				fileId: file.id,
 | 
			
		||||
				isSensitive: !file.isSensitive
 | 
			
		||||
			});
 | 
			
		||||
 | 
			
		||||
			file.isSensitive = !file.isSensitive;
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		async show() {
 | 
			
		||||
			const file = await this.fetchFile();
 | 
			
		||||
			this.$root.api('admin/drive/show-file', { fileId: file.id }).then(info => {
 | 
			
		||||
				this.file = info;
 | 
			
		||||
			});
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		async findAndToggleSensitive(sensitive) {
 | 
			
		||||
			const process = async () => {
 | 
			
		||||
				const file = await this.fetchFile();
 | 
			
		||||
				await this.$root.api('drive/files/update', {
 | 
			
		||||
					fileId: file.id,
 | 
			
		||||
					isSensitive: sensitive
 | 
			
		||||
				});
 | 
			
		||||
				this.$root.dialog({
 | 
			
		||||
					type: 'success',
 | 
			
		||||
					text: sensitive ? this.$t('marked-as-sensitive') : this.$t('unmarked-as-sensitive')
 | 
			
		||||
				});
 | 
			
		||||
			};
 | 
			
		||||
 | 
			
		||||
			await process().catch(e => {
 | 
			
		||||
				this.$root.dialog({
 | 
			
		||||
					type: 'error',
 | 
			
		||||
					text: e.toString()
 | 
			
		||||
				});
 | 
			
		||||
			});
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		async findAndDel() {
 | 
			
		||||
			const process = async () => {
 | 
			
		||||
				const file = await this.fetchFile();
 | 
			
		||||
				await this.$root.api('drive/files/delete', { fileId: file.id });
 | 
			
		||||
				this.$root.dialog({
 | 
			
		||||
					type: 'success',
 | 
			
		||||
					text: this.$t('deleted')
 | 
			
		||||
				});
 | 
			
		||||
			};
 | 
			
		||||
 | 
			
		||||
			await process().catch(e => {
 | 
			
		||||
				this.$root.dialog({
 | 
			
		||||
					type: 'error',
 | 
			
		||||
					text: e.toString()
 | 
			
		||||
				});
 | 
			
		||||
			});
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="stylus" scoped>
 | 
			
		||||
.kidvdlkg
 | 
			
		||||
	padding 16px 0
 | 
			
		||||
	border-top solid 1px var(--faceDivider)
 | 
			
		||||
 | 
			
		||||
	> div:first-child
 | 
			
		||||
		display flex
 | 
			
		||||
		cursor pointer
 | 
			
		||||
 | 
			
		||||
		> div:nth-child(1)
 | 
			
		||||
			> .thumbnail
 | 
			
		||||
				display block
 | 
			
		||||
				width 64px
 | 
			
		||||
				height 64px
 | 
			
		||||
				background-size cover
 | 
			
		||||
				background-position center center
 | 
			
		||||
 | 
			
		||||
		> div:nth-child(2)
 | 
			
		||||
			flex 1
 | 
			
		||||
			padding-left 16px
 | 
			
		||||
 | 
			
		||||
			@media (max-width 500px)
 | 
			
		||||
				font-size 14px
 | 
			
		||||
 | 
			
		||||
			> header
 | 
			
		||||
				word-break break-word
 | 
			
		||||
 | 
			
		||||
				> .username
 | 
			
		||||
					margin-left 8px
 | 
			
		||||
					opacity 0.7
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
<template>
 | 
			
		||||
<div class="tumhkfkmgtvzljezfvmgkeurkfncshbe">
 | 
			
		||||
<div>
 | 
			
		||||
	<ui-card>
 | 
			
		||||
		<div slot="title"><fa icon="plus"/> {{ $t('add-emoji.title') }}</div>
 | 
			
		||||
		<section class="fit-top">
 | 
			
		||||
@@ -24,24 +24,28 @@
 | 
			
		||||
 | 
			
		||||
	<ui-card>
 | 
			
		||||
		<div slot="title"><fa :icon="faGrin"/> {{ $t('emojis.title') }}</div>
 | 
			
		||||
		<section v-for="emoji in emojis">
 | 
			
		||||
			<img :src="emoji.url" :alt="emoji.name" style="width: 64px;"/>
 | 
			
		||||
			<ui-horizon-group inputs>
 | 
			
		||||
				<ui-input v-model="emoji.name">
 | 
			
		||||
					<span>{{ $t('add-emoji.name') }}</span>
 | 
			
		||||
		<section v-for="emoji in emojis" class="oryfrbft">
 | 
			
		||||
			<div>
 | 
			
		||||
				<img :src="emoji.url" :alt="emoji.name" style="width: 64px;"/>
 | 
			
		||||
			</div>
 | 
			
		||||
			<div>
 | 
			
		||||
				<ui-horizon-group>
 | 
			
		||||
					<ui-input v-model="emoji.name">
 | 
			
		||||
						<span>{{ $t('add-emoji.name') }}</span>
 | 
			
		||||
					</ui-input>
 | 
			
		||||
					<ui-input v-model="emoji.aliases">
 | 
			
		||||
						<span>{{ $t('add-emoji.aliases') }}</span>
 | 
			
		||||
					</ui-input>
 | 
			
		||||
				</ui-horizon-group>
 | 
			
		||||
				<ui-input v-model="emoji.url">
 | 
			
		||||
					<i slot="icon"><fa icon="link"/></i>
 | 
			
		||||
					<span>{{ $t('add-emoji.url') }}</span>
 | 
			
		||||
				</ui-input>
 | 
			
		||||
				<ui-input v-model="emoji.aliases">
 | 
			
		||||
					<span>{{ $t('add-emoji.aliases') }}</span>
 | 
			
		||||
				</ui-input>
 | 
			
		||||
			</ui-horizon-group>
 | 
			
		||||
			<ui-input v-model="emoji.url">
 | 
			
		||||
				<i slot="icon"><fa icon="link"/></i>
 | 
			
		||||
				<span>{{ $t('add-emoji.url') }}</span>
 | 
			
		||||
			</ui-input>
 | 
			
		||||
			<ui-horizon-group class="fit-bottom">
 | 
			
		||||
				<ui-button @click="updateEmoji(emoji)"><fa :icon="['far', 'save']"/> {{ $t('emojis.update') }}</ui-button>
 | 
			
		||||
				<ui-button @click="removeEmoji(emoji)"><fa :icon="['far', 'trash-alt']"/> {{ $t('emojis.remove') }}</ui-button>
 | 
			
		||||
			</ui-horizon-group>
 | 
			
		||||
				<ui-horizon-group class="fit-bottom">
 | 
			
		||||
					<ui-button @click="updateEmoji(emoji)"><fa :icon="['far', 'save']"/> {{ $t('emojis.update') }}</ui-button>
 | 
			
		||||
					<ui-button @click="removeEmoji(emoji)"><fa :icon="['far', 'trash-alt']"/> {{ $t('emojis.remove') }}</ui-button>
 | 
			
		||||
				</ui-horizon-group>
 | 
			
		||||
			</div>
 | 
			
		||||
		</section>
 | 
			
		||||
	</ui-card>
 | 
			
		||||
</div>
 | 
			
		||||
@@ -146,8 +150,21 @@ export default Vue.extend({
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="stylus" scoped>
 | 
			
		||||
.tumhkfkmgtvzljezfvmgkeurkfncshbe
 | 
			
		||||
.oryfrbft
 | 
			
		||||
	@media (min-width 500px)
 | 
			
		||||
		padding 16px
 | 
			
		||||
		display flex
 | 
			
		||||
 | 
			
		||||
	> div:first-child
 | 
			
		||||
		@media (max-width 500px)
 | 
			
		||||
			padding-bottom 16px
 | 
			
		||||
 | 
			
		||||
		> img
 | 
			
		||||
			vertical-align bottom
 | 
			
		||||
 | 
			
		||||
	> div:last-child
 | 
			
		||||
		flex 1
 | 
			
		||||
 | 
			
		||||
		@media (min-width 500px)
 | 
			
		||||
			padding-left 16px
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
 
 | 
			
		||||
@@ -39,10 +39,3 @@ export default Vue.extend({
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="stylus" scoped>
 | 
			
		||||
.jdnqwkzlnxcfftthoybjxrebyolvoucw
 | 
			
		||||
	width 100%
 | 
			
		||||
	min-height 300px
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
 
 | 
			
		||||
@@ -22,12 +22,12 @@
 | 
			
		||||
			<li @click="nav('instance')" :class="{ active: page == 'instance' }"><fa icon="cog" fixed-width/>{{ $t('instance') }}</li>
 | 
			
		||||
			<li @click="nav('moderators')" :class="{ active: page == 'moderators' }"><fa :icon="faHeadset" fixed-width/>{{ $t('moderators') }}</li>
 | 
			
		||||
			<li @click="nav('users')" :class="{ active: page == 'users' }"><fa icon="users" fixed-width/>{{ $t('users') }}</li>
 | 
			
		||||
			<li @click="nav('drive')" :class="{ active: page == 'drive' }"><fa icon="cloud" fixed-width/>{{ $t('@.drive') }}</li>
 | 
			
		||||
			<!-- <li @click="nav('federation')" :class="{ active: page == 'federation' }"><fa :icon="faShareAlt" fixed-width/>{{ $t('federation') }}</li> -->
 | 
			
		||||
			<li @click="nav('emoji')" :class="{ active: page == 'emoji' }"><fa :icon="faGrin" fixed-width/>{{ $t('emoji') }}</li>
 | 
			
		||||
			<li @click="nav('announcements')" :class="{ active: page == 'announcements' }"><fa icon="broadcast-tower" fixed-width/>{{ $t('announcements') }}</li>
 | 
			
		||||
			<li @click="nav('hashtags')" :class="{ active: page == 'hashtags' }"><fa icon="hashtag" fixed-width/>{{ $t('hashtags') }}</li>
 | 
			
		||||
 | 
			
		||||
			<!-- <li @click="nav('drive')" :class="{ active: page == 'drive' }"><fa icon="cloud" fixed-width/>{{ $t('@.drive') }}</li> -->
 | 
			
		||||
			<li @click="nav('abuse')" :class="{ active: page == 'abuse' }"><fa :icon="faExclamationCircle" fixed-width/>{{ $t('abuse') }}</li>
 | 
			
		||||
		</ul>
 | 
			
		||||
		<div class="back-to-misskey">
 | 
			
		||||
			<a href="/"><fa :icon="faArrowLeft"/> {{ $t('back-to-misskey') }}</a>
 | 
			
		||||
@@ -45,8 +45,8 @@
 | 
			
		||||
			<div v-if="page == 'emoji'"><x-emoji/></div>
 | 
			
		||||
			<div v-if="page == 'announcements'"><x-announcements/></div>
 | 
			
		||||
			<div v-if="page == 'hashtags'"><x-hashtags/></div>
 | 
			
		||||
			<div v-if="page == 'drive'"></div>
 | 
			
		||||
			<div v-if="page == 'update'"></div>
 | 
			
		||||
			<div v-if="page == 'drive'"><x-drive/></div>
 | 
			
		||||
			<div v-if="page == 'abuse'"><x-abuse/></div>
 | 
			
		||||
		</div>
 | 
			
		||||
	</main>
 | 
			
		||||
</div>
 | 
			
		||||
@@ -63,7 +63,9 @@ import XEmoji from "./emoji.vue";
 | 
			
		||||
import XAnnouncements from "./announcements.vue";
 | 
			
		||||
import XHashtags from "./hashtags.vue";
 | 
			
		||||
import XUsers from "./users.vue";
 | 
			
		||||
import { faHeadset, faArrowLeft, faShareAlt } from '@fortawesome/free-solid-svg-icons';
 | 
			
		||||
import XDrive from "./drive.vue";
 | 
			
		||||
import XAbuse from "./abuse.vue";
 | 
			
		||||
import { faHeadset, faArrowLeft, faShareAlt, faExclamationCircle } from '@fortawesome/free-solid-svg-icons';
 | 
			
		||||
import { faGrin } from '@fortawesome/free-regular-svg-icons';
 | 
			
		||||
 | 
			
		||||
// Detect the user agent
 | 
			
		||||
@@ -79,7 +81,9 @@ export default Vue.extend({
 | 
			
		||||
		XEmoji,
 | 
			
		||||
		XAnnouncements,
 | 
			
		||||
		XHashtags,
 | 
			
		||||
		XUsers
 | 
			
		||||
		XUsers,
 | 
			
		||||
		XDrive,
 | 
			
		||||
		XAbuse,
 | 
			
		||||
	},
 | 
			
		||||
	provide: {
 | 
			
		||||
		isMobile
 | 
			
		||||
@@ -93,7 +97,8 @@ export default Vue.extend({
 | 
			
		||||
			faGrin,
 | 
			
		||||
			faArrowLeft,
 | 
			
		||||
			faHeadset,
 | 
			
		||||
			faShareAlt
 | 
			
		||||
			faShareAlt,
 | 
			
		||||
			faExclamationCircle
 | 
			
		||||
		};
 | 
			
		||||
	},
 | 
			
		||||
	methods: {
 | 
			
		||||
@@ -269,6 +274,9 @@ export default Vue.extend({
 | 
			
		||||
		> .page
 | 
			
		||||
			max-width 1150px
 | 
			
		||||
 | 
			
		||||
			@media (min-width 500px)
 | 
			
		||||
				padding 16px
 | 
			
		||||
 | 
			
		||||
	&.isMobile
 | 
			
		||||
		> main
 | 
			
		||||
			padding $headerHeight 0 0 0
 | 
			
		||||
 
 | 
			
		||||
@@ -1,11 +1,12 @@
 | 
			
		||||
<template>
 | 
			
		||||
<div class="axbwjelsbymowqjyywpirzhdlszoncqs">
 | 
			
		||||
<div>
 | 
			
		||||
	<ui-card>
 | 
			
		||||
		<div slot="title"><fa icon="cog"/> {{ $t('instance') }}</div>
 | 
			
		||||
		<section class="fit-top fit-bottom">
 | 
			
		||||
			<ui-input :value="host" readonly>{{ $t('host') }}</ui-input>
 | 
			
		||||
			<ui-input v-model="name">{{ $t('instance-name') }}</ui-input>
 | 
			
		||||
			<ui-textarea v-model="description">{{ $t('instance-description') }}</ui-textarea>
 | 
			
		||||
			<ui-input v-model="mascotImageUrl"><i slot="icon"><fa icon="link"/></i>{{ $t('logo-url') }}</ui-input>
 | 
			
		||||
			<ui-input v-model="bannerUrl"><i slot="icon"><fa icon="link"/></i>{{ $t('banner-url') }}</ui-input>
 | 
			
		||||
			<ui-input v-model="errorImageUrl"><i slot="icon"><fa icon="link"/></i>{{ $t('error-image-url') }}</ui-input>
 | 
			
		||||
			<ui-input v-model="languages"><i slot="icon"><fa icon="language"/></i>{{ $t('languages') }}<span slot="desc">{{ $t('languages-desc') }}</span></ui-input>
 | 
			
		||||
@@ -21,6 +22,8 @@
 | 
			
		||||
		<section>
 | 
			
		||||
			<ui-switch v-model="disableRegistration">{{ $t('disable-registration') }}</ui-switch>
 | 
			
		||||
			<ui-switch v-model="disableLocalTimeline">{{ $t('disable-local-timeline') }}</ui-switch>
 | 
			
		||||
			<ui-switch v-model="disableGlobalTimeline">{{ $t('disable-global-timeline') }}</ui-switch>
 | 
			
		||||
			<ui-info>{{ $t('disabling-timelines-info') }}</ui-info>
 | 
			
		||||
		</section>
 | 
			
		||||
		<section class="fit-bottom">
 | 
			
		||||
			<header><fa icon="cloud"/> {{ $t('drive-config') }}</header>
 | 
			
		||||
@@ -32,8 +35,10 @@
 | 
			
		||||
			<header><fa :icon="faShieldAlt"/> {{ $t('recaptcha-config') }}</header>
 | 
			
		||||
			<ui-switch v-model="enableRecaptcha">{{ $t('enable-recaptcha') }}</ui-switch>
 | 
			
		||||
			<ui-info>{{ $t('recaptcha-info') }}</ui-info>
 | 
			
		||||
			<ui-input v-model="recaptchaSiteKey" :disabled="!enableRecaptcha"><i slot="icon"><fa icon="key"/></i>{{ $t('recaptcha-site-key') }}</ui-input>
 | 
			
		||||
			<ui-input v-model="recaptchaSecretKey" :disabled="!enableRecaptcha"><i slot="icon"><fa icon="key"/></i>{{ $t('recaptcha-secret-key') }}</ui-input>
 | 
			
		||||
			<ui-horizon-group inputs>
 | 
			
		||||
				<ui-input v-model="recaptchaSiteKey" :disabled="!enableRecaptcha"><i slot="icon"><fa icon="key"/></i>{{ $t('recaptcha-site-key') }}</ui-input>
 | 
			
		||||
				<ui-input v-model="recaptchaSecretKey" :disabled="!enableRecaptcha"><i slot="icon"><fa icon="key"/></i>{{ $t('recaptcha-secret-key') }}</ui-input>
 | 
			
		||||
			</ui-horizon-group>
 | 
			
		||||
		</section>
 | 
			
		||||
		<section>
 | 
			
		||||
			<header><fa :icon="faGhost"/> {{ $t('proxy-account-config') }}</header>
 | 
			
		||||
@@ -51,10 +56,19 @@
 | 
			
		||||
			</ui-horizon-group>
 | 
			
		||||
			<ui-horizon-group inputs>
 | 
			
		||||
				<ui-input v-model="smtpUser" :disabled="!enableEmail">{{ $t('smtp-user') }}</ui-input>
 | 
			
		||||
				<ui-input v-model="smtpPass" :disabled="!enableEmail">{{ $t('smtp-pass') }}</ui-input>
 | 
			
		||||
				<ui-input v-model="smtpPass" type="password" :withPasswordToggle="true" :disabled="!enableEmail">{{ $t('smtp-pass') }}</ui-input>
 | 
			
		||||
			</ui-horizon-group>
 | 
			
		||||
			<ui-switch v-model="smtpSecure" :disabled="!enableEmail">{{ $t('smtp-secure') }}<span slot="desc">{{ $t('smtp-secure-info') }}</span></ui-switch>
 | 
			
		||||
		</section>
 | 
			
		||||
		<section>
 | 
			
		||||
			<header><fa :icon="faBolt"/> {{ $t('serviceworker-config') }}</header>
 | 
			
		||||
			<ui-switch v-model="enableServiceWorker">{{ $t('enable-serviceworker') }}<span slot="desc">{{ $t('serviceworker-info') }}</span></ui-switch>
 | 
			
		||||
			<ui-info>{{ $t('vapid-info') }}<br><code>npm i web-push -g<br>web-push generate-vapid-keys</code></ui-info>
 | 
			
		||||
			<ui-horizon-group inputs class="fit-bottom">
 | 
			
		||||
				<ui-input v-model="swPublicKey" :disabled="!enableServiceWorker"><i slot="icon"><fa icon="key"/></i>{{ $t('vapid-publickey') }}</ui-input>
 | 
			
		||||
				<ui-input v-model="swPrivateKey" :disabled="!enableServiceWorker"><i slot="icon"><fa icon="key"/></i>{{ $t('vapid-privatekey') }}</ui-input>
 | 
			
		||||
			</ui-horizon-group>
 | 
			
		||||
		</section>
 | 
			
		||||
		<section>
 | 
			
		||||
			<header>summaly Proxy</header>
 | 
			
		||||
			<ui-input v-model="summalyProxy">URL</ui-input>
 | 
			
		||||
@@ -82,9 +96,11 @@
 | 
			
		||||
		<div slot="title"><fa :icon="['fab', 'twitter']"/> {{ $t('twitter-integration-config') }}</div>
 | 
			
		||||
		<section>
 | 
			
		||||
			<ui-switch v-model="enableTwitterIntegration">{{ $t('enable-twitter-integration') }}</ui-switch>
 | 
			
		||||
			<ui-horizon-group>
 | 
			
		||||
				<ui-input v-model="twitterConsumerKey" :disabled="!enableTwitterIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('twitter-integration-consumer-key') }}</ui-input>
 | 
			
		||||
				<ui-input v-model="twitterConsumerSecret" :disabled="!enableTwitterIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('twitter-integration-consumer-secret') }}</ui-input>
 | 
			
		||||
			</ui-horizon-group>
 | 
			
		||||
			<ui-info>{{ $t('twitter-integration-info', { url: `${url}/api/tw/cb` }) }}</ui-info>
 | 
			
		||||
			<ui-input v-model="twitterConsumerKey" :disabled="!enableTwitterIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('twitter-integration-consumer-key') }}</ui-input>
 | 
			
		||||
			<ui-input v-model="twitterConsumerSecret" :disabled="!enableTwitterIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('twitter-integration-consumer-secret') }}</ui-input>
 | 
			
		||||
			<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
 | 
			
		||||
		</section>
 | 
			
		||||
	</ui-card>
 | 
			
		||||
@@ -93,9 +109,11 @@
 | 
			
		||||
		<div slot="title"><fa :icon="['fab', 'github']"/> {{ $t('github-integration-config') }}</div>
 | 
			
		||||
		<section>
 | 
			
		||||
			<ui-switch v-model="enableGithubIntegration">{{ $t('enable-github-integration') }}</ui-switch>
 | 
			
		||||
			<ui-horizon-group>
 | 
			
		||||
				<ui-input v-model="githubClientId" :disabled="!enableGithubIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('github-integration-client-id') }}</ui-input>
 | 
			
		||||
				<ui-input v-model="githubClientSecret" :disabled="!enableGithubIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('github-integration-client-secret') }}</ui-input>
 | 
			
		||||
			</ui-horizon-group>
 | 
			
		||||
			<ui-info>{{ $t('github-integration-info', { url: `${url}/api/gh/cb` }) }}</ui-info>
 | 
			
		||||
			<ui-input v-model="githubClientId" :disabled="!enableGithubIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('github-integration-client-id') }}</ui-input>
 | 
			
		||||
			<ui-input v-model="githubClientSecret" :disabled="!enableGithubIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('github-integration-client-secret') }}</ui-input>
 | 
			
		||||
			<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
 | 
			
		||||
		</section>
 | 
			
		||||
	</ui-card>
 | 
			
		||||
@@ -104,9 +122,11 @@
 | 
			
		||||
		<div slot="title"><fa :icon="['fab', 'discord']"/> {{ $t('discord-integration-config') }}</div>
 | 
			
		||||
		<section>
 | 
			
		||||
			<ui-switch v-model="enableDiscordIntegration">{{ $t('enable-discord-integration') }}</ui-switch>
 | 
			
		||||
			<ui-horizon-group>
 | 
			
		||||
				<ui-input v-model="discordClientId" :disabled="!enableDiscordIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('discord-integration-client-id') }}</ui-input>
 | 
			
		||||
				<ui-input v-model="discordClientSecret" :disabled="!enableDiscordIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('discord-integration-client-secret') }}</ui-input>
 | 
			
		||||
			</ui-horizon-group>
 | 
			
		||||
			<ui-info>{{ $t('discord-integration-info', { url: `${url}/api/dc/cb` }) }}</ui-info>
 | 
			
		||||
			<ui-input v-model="discordClientId" :disabled="!enableDiscordIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('discord-integration-client-id') }}</ui-input>
 | 
			
		||||
			<ui-input v-model="discordClientSecret" :disabled="!enableDiscordIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('discord-integration-client-secret') }}</ui-input>
 | 
			
		||||
			<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
 | 
			
		||||
		</section>
 | 
			
		||||
	</ui-card>
 | 
			
		||||
@@ -118,7 +138,7 @@ import Vue from 'vue';
 | 
			
		||||
import i18n from '../../i18n';
 | 
			
		||||
import { url, host } from '../../config';
 | 
			
		||||
import { toUnicode } from 'punycode';
 | 
			
		||||
import { faHeadset, faShieldAlt, faGhost, faUserPlus } from '@fortawesome/free-solid-svg-icons';
 | 
			
		||||
import { faHeadset, faShieldAlt, faGhost, faUserPlus, faBolt } from '@fortawesome/free-solid-svg-icons';
 | 
			
		||||
import { faEnvelope as farEnvelope } from '@fortawesome/free-regular-svg-icons';
 | 
			
		||||
 | 
			
		||||
export default Vue.extend({
 | 
			
		||||
@@ -132,6 +152,8 @@ export default Vue.extend({
 | 
			
		||||
			maintainerEmail: null,
 | 
			
		||||
			disableRegistration: false,
 | 
			
		||||
			disableLocalTimeline: false,
 | 
			
		||||
			disableGlobalTimeline: false,
 | 
			
		||||
			mascotImageUrl: null,
 | 
			
		||||
			bannerUrl: null,
 | 
			
		||||
			errorImageUrl: null,
 | 
			
		||||
			name: null,
 | 
			
		||||
@@ -166,7 +188,10 @@ export default Vue.extend({
 | 
			
		||||
			smtpPort: null,
 | 
			
		||||
			smtpUser: null,
 | 
			
		||||
			smtpPass: null,
 | 
			
		||||
			faHeadset, faShieldAlt, faGhost, faUserPlus, farEnvelope
 | 
			
		||||
			enableServiceWorker: false,
 | 
			
		||||
			swPublicKey: null,
 | 
			
		||||
			swPrivateKey: null,
 | 
			
		||||
			faHeadset, faShieldAlt, faGhost, faUserPlus, farEnvelope, faBolt
 | 
			
		||||
		};
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
@@ -176,6 +201,8 @@ export default Vue.extend({
 | 
			
		||||
			this.maintainerEmail = meta.maintainer.email;
 | 
			
		||||
			this.disableRegistration = meta.disableRegistration;
 | 
			
		||||
			this.disableLocalTimeline = meta.disableLocalTimeline;
 | 
			
		||||
			this.disableGlobalTimeline = meta.disableGlobalTimeline;
 | 
			
		||||
			this.mascotImageUrl = meta.mascotImageUrl;
 | 
			
		||||
			this.bannerUrl = meta.bannerUrl;
 | 
			
		||||
			this.errorImageUrl = meta.errorImageUrl;
 | 
			
		||||
			this.name = meta.name;
 | 
			
		||||
@@ -209,6 +236,9 @@ export default Vue.extend({
 | 
			
		||||
			this.smtpPort = meta.smtpPort;
 | 
			
		||||
			this.smtpUser = meta.smtpUser;
 | 
			
		||||
			this.smtpPass = meta.smtpPass;
 | 
			
		||||
			this.enableServiceWorker = meta.enableServiceWorker;
 | 
			
		||||
			this.swPublicKey = meta.swPublickey;
 | 
			
		||||
			this.swPrivateKey = meta.swPrivateKey;
 | 
			
		||||
		});
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
@@ -230,6 +260,8 @@ export default Vue.extend({
 | 
			
		||||
				maintainerEmail: this.maintainerEmail,
 | 
			
		||||
				disableRegistration: this.disableRegistration,
 | 
			
		||||
				disableLocalTimeline: this.disableLocalTimeline,
 | 
			
		||||
				disableGlobalTimeline: this.disableGlobalTimeline,
 | 
			
		||||
				mascotImageUrl: this.mascotImageUrl,
 | 
			
		||||
				bannerUrl: this.bannerUrl,
 | 
			
		||||
				errorImageUrl: this.errorImageUrl,
 | 
			
		||||
				name: this.name,
 | 
			
		||||
@@ -262,7 +294,10 @@ export default Vue.extend({
 | 
			
		||||
				smtpHost: this.smtpHost,
 | 
			
		||||
				smtpPort: parseInt(this.smtpPort, 10),
 | 
			
		||||
				smtpUser: this.smtpUser,
 | 
			
		||||
				smtpPass: this.smtpPass
 | 
			
		||||
				smtpPass: this.smtpPass,
 | 
			
		||||
				enableServiceWorker: this.enableServiceWorker,
 | 
			
		||||
				swPublicKey: this.swPublicKey,
 | 
			
		||||
				swPrivateKey: this.swPrivateKey
 | 
			
		||||
			}).then(() => {
 | 
			
		||||
				this.$root.dialog({
 | 
			
		||||
					type: 'success',
 | 
			
		||||
@@ -278,10 +313,3 @@ export default Vue.extend({
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="stylus" scoped>
 | 
			
		||||
.axbwjelsbymowqjyywpirzhdlszoncqs
 | 
			
		||||
	@media (min-width 500px)
 | 
			
		||||
		padding 16px
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,13 @@
 | 
			
		||||
<template>
 | 
			
		||||
<div class="jnhmugbb">
 | 
			
		||||
<div>
 | 
			
		||||
	<ui-card>
 | 
			
		||||
		<div slot="title"><fa icon="plus"/> {{ $t('add-moderator.title') }}</div>
 | 
			
		||||
		<section class="fit-top">
 | 
			
		||||
			<ui-input v-model="username" type="text">
 | 
			
		||||
				<span slot="prefix">@</span>
 | 
			
		||||
			</ui-input>
 | 
			
		||||
			<ui-button @click="add" :disabled="adding">{{ $t('add-moderator.add') }}</ui-button>
 | 
			
		||||
			<ui-button @click="add" :disabled="changing">{{ $t('add-moderator.add') }}</ui-button>
 | 
			
		||||
			<ui-button @click="remove" :disabled="changing">{{ $t('add-moderator.remove') }}</ui-button>
 | 
			
		||||
		</section>
 | 
			
		||||
	</ui-card>
 | 
			
		||||
</div>
 | 
			
		||||
@@ -23,13 +24,13 @@ export default Vue.extend({
 | 
			
		||||
	data() {
 | 
			
		||||
		return {
 | 
			
		||||
			username: '',
 | 
			
		||||
			adding: false
 | 
			
		||||
			changing: false
 | 
			
		||||
		};
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	methods: {
 | 
			
		||||
		async add() {
 | 
			
		||||
			this.adding = true;
 | 
			
		||||
			this.changing = true;
 | 
			
		||||
 | 
			
		||||
			const process = async () => {
 | 
			
		||||
				const user = await this.$root.api('users/show', parseAcct(this.username));
 | 
			
		||||
@@ -47,15 +48,30 @@ export default Vue.extend({
 | 
			
		||||
				});
 | 
			
		||||
			});
 | 
			
		||||
 | 
			
		||||
			this.adding = false;
 | 
			
		||||
			this.changing = false;
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		async remove() {
 | 
			
		||||
			this.changing = true;
 | 
			
		||||
 | 
			
		||||
			const process = async () => {
 | 
			
		||||
				const user = await this.$root.api('users/show', parseAcct(this.username));
 | 
			
		||||
				await this.$root.api('admin/moderators/remove', { userId: user.id });
 | 
			
		||||
				this.$root.dialog({
 | 
			
		||||
					type: 'success',
 | 
			
		||||
					text: this.$t('add-moderator.removed')
 | 
			
		||||
				});
 | 
			
		||||
			};
 | 
			
		||||
 | 
			
		||||
			await process().catch(e => {
 | 
			
		||||
				this.$root.dialog({
 | 
			
		||||
					type: 'error',
 | 
			
		||||
					text: e.toString()
 | 
			
		||||
				});
 | 
			
		||||
			});
 | 
			
		||||
 | 
			
		||||
			this.changing = false;
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="stylus" scoped>
 | 
			
		||||
.jnhmugbb
 | 
			
		||||
	@media (min-width 500px)
 | 
			
		||||
		padding 16px
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
<template>
 | 
			
		||||
<div class="ucnffhbtogqgscfmqcymwmmupoknpfsw">
 | 
			
		||||
<div>
 | 
			
		||||
	<ui-card>
 | 
			
		||||
		<div slot="title"><fa :icon="faTerminal"/> {{ $t('operation') }}</div>
 | 
			
		||||
		<section class="fit-top">
 | 
			
		||||
@@ -31,6 +31,14 @@
 | 
			
		||||
					<option value="-updatedAt">{{ $t('users.sort.updatedAtAsc') }}</option>
 | 
			
		||||
					<option value="+updatedAt">{{ $t('users.sort.updatedAtDesc') }}</option>
 | 
			
		||||
				</ui-select>
 | 
			
		||||
				<ui-select v-model="state">
 | 
			
		||||
					<span slot="label">{{ $t('users.state.title') }}</span>
 | 
			
		||||
					<option value="all">{{ $t('users.state.all') }}</option>
 | 
			
		||||
					<option value="admin">{{ $t('users.state.admin') }}</option>
 | 
			
		||||
					<option value="moderator">{{ $t('users.state.moderator') }}</option>
 | 
			
		||||
					<option value="verified">{{ $t('users.state.verified') }}</option>
 | 
			
		||||
					<option value="suspended">{{ $t('users.state.suspended') }}</option>
 | 
			
		||||
				</ui-select>
 | 
			
		||||
				<ui-select v-model="origin">
 | 
			
		||||
					<span slot="label">{{ $t('users.origin.title') }}</span>
 | 
			
		||||
					<option value="combined">{{ $t('users.origin.combined') }}</option>
 | 
			
		||||
@@ -38,25 +46,31 @@
 | 
			
		||||
					<option value="remote">{{ $t('users.origin.remote') }}</option>
 | 
			
		||||
				</ui-select>
 | 
			
		||||
			</ui-horizon-group>
 | 
			
		||||
			<div class="kofvwchc" v-for="user in users">
 | 
			
		||||
				<div>
 | 
			
		||||
					<a :href="user | userPage(null, true)">
 | 
			
		||||
						<mk-avatar class="avatar" :user="user" :disable-link="true"/>
 | 
			
		||||
					</a>
 | 
			
		||||
				</div>
 | 
			
		||||
				<div>
 | 
			
		||||
					<header>
 | 
			
		||||
						<b><mk-user-name :user="user"/></b>
 | 
			
		||||
						<span class="username">@{{ user | acct }}</span>
 | 
			
		||||
					</header>
 | 
			
		||||
			<sequential-entrance animation="entranceFromTop" delay="25">
 | 
			
		||||
				<div class="kofvwchc" v-for="user in users" :key="user.id">
 | 
			
		||||
					<div>
 | 
			
		||||
						<span>{{ $t('users.updatedAt') }}: <mk-time :time="user.updatedAt" mode="detail"/></span>
 | 
			
		||||
						<a :href="user | userPage(null, true)">
 | 
			
		||||
							<mk-avatar class="avatar" :user="user" :disable-link="true"/>
 | 
			
		||||
						</a>
 | 
			
		||||
					</div>
 | 
			
		||||
					<div>
 | 
			
		||||
						<span>{{ $t('users.createdAt') }}: <mk-time :time="user.createdAt" mode="detail"/></span>
 | 
			
		||||
						<header>
 | 
			
		||||
							<b><mk-user-name :user="user"/></b>
 | 
			
		||||
							<span class="username">@{{ user | acct }}</span>
 | 
			
		||||
							<span class="is-admin" v-if="user.isAdmin">admin</span>
 | 
			
		||||
							<span class="is-moderator" v-if="user.isModerator">moderator</span>
 | 
			
		||||
							<span class="is-verified" v-if="user.isVerified" :title="$t('@.verified-user')"><fa icon="star"/></span>
 | 
			
		||||
							<span class="is-suspended" v-if="user.isSuspended" :title="$t('@.suspended-user')"><fa :icon="faSnowflake"/></span>
 | 
			
		||||
						</header>
 | 
			
		||||
						<div>
 | 
			
		||||
							<span>{{ $t('users.updatedAt') }}: <mk-time :time="user.updatedAt" mode="detail"/></span>
 | 
			
		||||
						</div>
 | 
			
		||||
						<div>
 | 
			
		||||
							<span>{{ $t('users.createdAt') }}: <mk-time :time="user.createdAt" mode="detail"/></span>
 | 
			
		||||
						</div>
 | 
			
		||||
					</div>
 | 
			
		||||
				</div>
 | 
			
		||||
			</div>
 | 
			
		||||
			</sequential-entrance>
 | 
			
		||||
			<ui-button v-if="existMore" @click="fetchUsers">{{ $t('@.load-more') }}</ui-button>
 | 
			
		||||
		</section>
 | 
			
		||||
	</ui-card>
 | 
			
		||||
@@ -82,6 +96,7 @@ export default Vue.extend({
 | 
			
		||||
			suspending: false,
 | 
			
		||||
			unsuspending: false,
 | 
			
		||||
			sort: '+createdAt',
 | 
			
		||||
			state: 'all',
 | 
			
		||||
			origin: 'combined',
 | 
			
		||||
			limit: 10,
 | 
			
		||||
			offset: 0,
 | 
			
		||||
@@ -98,6 +113,12 @@ export default Vue.extend({
 | 
			
		||||
			this.fetchUsers();
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		state() {
 | 
			
		||||
			this.users = [];
 | 
			
		||||
			this.offset = 0;
 | 
			
		||||
			this.fetchUsers();
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		origin() {
 | 
			
		||||
			this.users = [];
 | 
			
		||||
			this.offset = 0;
 | 
			
		||||
@@ -234,7 +255,8 @@ export default Vue.extend({
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		fetchUsers() {
 | 
			
		||||
			this.$root.api('users', {
 | 
			
		||||
			this.$root.api('admin/show-users', {
 | 
			
		||||
				state: this.state,
 | 
			
		||||
				origin: this.origin,
 | 
			
		||||
				sort: this.sort,
 | 
			
		||||
				offset: this.offset,
 | 
			
		||||
@@ -255,28 +277,42 @@ export default Vue.extend({
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="stylus" scoped>
 | 
			
		||||
.ucnffhbtogqgscfmqcymwmmupoknpfsw
 | 
			
		||||
	@media (min-width 500px)
 | 
			
		||||
		padding 16px
 | 
			
		||||
.kofvwchc
 | 
			
		||||
	display flex
 | 
			
		||||
	padding 16px 0
 | 
			
		||||
	border-top solid 1px var(--faceDivider)
 | 
			
		||||
 | 
			
		||||
	.kofvwchc
 | 
			
		||||
		display flex
 | 
			
		||||
		padding 16px 0
 | 
			
		||||
		border-top solid 1px var(--faceDivider)
 | 
			
		||||
	> div:first-child
 | 
			
		||||
		> a
 | 
			
		||||
			> .avatar
 | 
			
		||||
				width 64px
 | 
			
		||||
				height 64px
 | 
			
		||||
 | 
			
		||||
		> div:first-child
 | 
			
		||||
			> a
 | 
			
		||||
				> .avatar
 | 
			
		||||
					width 64px
 | 
			
		||||
					height 64px
 | 
			
		||||
	> div:last-child
 | 
			
		||||
		flex 1
 | 
			
		||||
		padding-left 16px
 | 
			
		||||
 | 
			
		||||
		> div:last-child
 | 
			
		||||
			flex 1
 | 
			
		||||
			padding-left 16px
 | 
			
		||||
		@media (max-width 500px)
 | 
			
		||||
			font-size 14px
 | 
			
		||||
 | 
			
		||||
			> header
 | 
			
		||||
				> .username
 | 
			
		||||
					margin-left 8px
 | 
			
		||||
					opacity 0.7
 | 
			
		||||
		> header
 | 
			
		||||
			> .username
 | 
			
		||||
				margin-left 8px
 | 
			
		||||
				opacity 0.7
 | 
			
		||||
 | 
			
		||||
			> .is-admin
 | 
			
		||||
			> .is-moderator
 | 
			
		||||
				flex-shrink 0
 | 
			
		||||
				align-self center
 | 
			
		||||
				margin 0 0 0 .5em
 | 
			
		||||
				padding 1px 6px
 | 
			
		||||
				font-size 80%
 | 
			
		||||
				border-radius 3px
 | 
			
		||||
				background var(--noteHeaderAdminBg)
 | 
			
		||||
				color var(--noteHeaderAdminFg)
 | 
			
		||||
 | 
			
		||||
			> .is-verified
 | 
			
		||||
			> .is-suspended
 | 
			
		||||
				margin 0 0 0 .5em
 | 
			
		||||
				color #4dabf7
 | 
			
		||||
</style>
 | 
			
		||||
 
 | 
			
		||||
@@ -10,3 +10,19 @@
 | 
			
		||||
	opacity: 0;
 | 
			
		||||
	transform: scaleY(0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.entranceFromTop {
 | 
			
		||||
	animation-duration: 0.5s;
 | 
			
		||||
	animation-name: entranceFromTop;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@keyframes entranceFromTop {
 | 
			
		||||
	from {
 | 
			
		||||
		opacity: 0;
 | 
			
		||||
		transform: translateY(-64px);
 | 
			
		||||
	}
 | 
			
		||||
	to {
 | 
			
		||||
		opacity: 1;
 | 
			
		||||
		transform: translateY(0);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@ import './style.styl';
 | 
			
		||||
 | 
			
		||||
import init from '../init';
 | 
			
		||||
import Index from './views/index.vue';
 | 
			
		||||
import NotFound from '../common/views/pages/404.vue';
 | 
			
		||||
import NotFound from '../common/views/pages/not-found.vue';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * init
 | 
			
		||||
 
 | 
			
		||||
@@ -22,7 +22,7 @@ export default function(type, data): Notification {
 | 
			
		||||
 | 
			
		||||
		case 'unreadMessagingMessage':
 | 
			
		||||
			return {
 | 
			
		||||
				title: '%i18n:common.notification.message-from%'.split("{}")[0] + `${getUserName(data.user)}` + '%i18n:common.notification.message-from%'.split("{}")[1] ,
 | 
			
		||||
				title: '%i18n:common.notification.message-from%'.split('{}')[0] + `${getUserName(data.user)}` + '%i18n:common.notification.message-from%'.split('{}')[1] ,
 | 
			
		||||
				body: data.text, // TODO: getMessagingMessageSummary(data),
 | 
			
		||||
				icon: data.user.avatarUrl
 | 
			
		||||
			};
 | 
			
		||||
@@ -30,7 +30,7 @@ export default function(type, data): Notification {
 | 
			
		||||
		case 'reversiInvited':
 | 
			
		||||
			return {
 | 
			
		||||
				title: '%i18n:common.notification.reversi-invited%',
 | 
			
		||||
				body: '%i18n:common.notification.reversi-invited-by%'.split("{}")[0] + `${getUserName(data.parent)}` + '%i18n:common.notification.reversi-invited-by%'.split("{}")[1],
 | 
			
		||||
				body: '%i18n:common.notification.reversi-invited-by%'.split('{}')[0] + `${getUserName(data.parent)}` + '%i18n:common.notification.reversi-invited-by%'.split('{}')[1],
 | 
			
		||||
				icon: data.parent.avatarUrl
 | 
			
		||||
			};
 | 
			
		||||
 | 
			
		||||
@@ -38,21 +38,21 @@ export default function(type, data): Notification {
 | 
			
		||||
			switch (data.type) {
 | 
			
		||||
				case 'mention':
 | 
			
		||||
					return {
 | 
			
		||||
						title: '%i18n:common.notification.notified-by%'.split("{}")[0] + `${getUserName(data.user)}:` + '%i18n:common.notification.notified-by%'.split("{}")[1],
 | 
			
		||||
						title: '%i18n:common.notification.notified-by%'.split('{}')[0] + `${getUserName(data.user)}:` + '%i18n:common.notification.notified-by%'.split('{}')[1],
 | 
			
		||||
						body: getNoteSummary(data),
 | 
			
		||||
						icon: data.user.avatarUrl
 | 
			
		||||
					};
 | 
			
		||||
 | 
			
		||||
				case 'reply':
 | 
			
		||||
					return {
 | 
			
		||||
						title: '%i18n:common.notification.reply-from%'.split("{}")[0] + `${getUserName(data.user)}` + '%i18n:common.notification.reply-from%'.split("{}")[1],
 | 
			
		||||
						title: '%i18n:common.notification.reply-from%'.split('{}')[0] + `${getUserName(data.user)}` + '%i18n:common.notification.reply-from%'.split('{}')[1],
 | 
			
		||||
						body: getNoteSummary(data),
 | 
			
		||||
						icon: data.user.avatarUrl
 | 
			
		||||
					};
 | 
			
		||||
 | 
			
		||||
				case 'quote':
 | 
			
		||||
					return {
 | 
			
		||||
						title: '%i18n:common.notification.quoted-by%'.split("{}")[0] + `${getUserName(data.user)}` + '%i18n:common.notification.quoted-by%'.split("{}")[1],
 | 
			
		||||
						title: '%i18n:common.notification.quoted-by%'.split('{}')[0] + `${getUserName(data.user)}` + '%i18n:common.notification.quoted-by%'.split('{}')[1],
 | 
			
		||||
						body: getNoteSummary(data),
 | 
			
		||||
						icon: data.user.avatarUrl
 | 
			
		||||
					};
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										25
									
								
								src/client/app/common/scripts/format-uptime.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								src/client/app/common/scripts/format-uptime.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,25 @@
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Format like the uptime command
 | 
			
		||||
 */
 | 
			
		||||
export default function(sec) {
 | 
			
		||||
	if (!sec) return sec;
 | 
			
		||||
 | 
			
		||||
	const day = Math.floor(sec / 86400);
 | 
			
		||||
	const tod = sec % 86400;
 | 
			
		||||
 | 
			
		||||
	// Days part in string: 2 days, 1 day, null
 | 
			
		||||
	const d = day >= 2 ? `${day} days` : day >= 1 ? `${day} day` : null;
 | 
			
		||||
 | 
			
		||||
	// Time part in string: 1 sec, 1 min, 1:01
 | 
			
		||||
	const t
 | 
			
		||||
		= tod < 60 ? `${Math.floor(tod)} sec`
 | 
			
		||||
		: tod < 3600 ? `${Math.floor(tod / 60)} min`
 | 
			
		||||
		: `${Math.floor(tod / 60 / 60)}:${Math.floor((tod / 60) % 60).toString().padStart(2, '0')}`;
 | 
			
		||||
 | 
			
		||||
	let str = '';
 | 
			
		||||
	if (d) str += `${d}, `;
 | 
			
		||||
	str += t;
 | 
			
		||||
 | 
			
		||||
	return str;
 | 
			
		||||
}
 | 
			
		||||
@@ -3,8 +3,8 @@
 | 
			
		||||
 | 
			
		||||
export default (data: ArrayBuffer) => {
 | 
			
		||||
	//const buf = new Buffer(data);
 | 
			
		||||
	//const hash = crypto.createHash("md5");
 | 
			
		||||
	//const hash = crypto.createHash('md5');
 | 
			
		||||
	//hash.update(buf);
 | 
			
		||||
	//return hash.digest("hex");
 | 
			
		||||
	//return hash.digest('hex');
 | 
			
		||||
	return '';
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -1,11 +0,0 @@
 | 
			
		||||
/**
 | 
			
		||||
 * 中央値を求めます
 | 
			
		||||
 * @param samples サンプル
 | 
			
		||||
 */
 | 
			
		||||
export default function(samples) {
 | 
			
		||||
	if (!samples.length) return 0;
 | 
			
		||||
	const numbers = samples.slice(0).sort((a, b) => a - b);
 | 
			
		||||
	const middle = Math.floor(numbers.length / 2);
 | 
			
		||||
	const isEven = numbers.length % 2 === 0;
 | 
			
		||||
	return isEven ? (numbers[middle] + numbers[middle - 1]) / 2 : numbers[middle];
 | 
			
		||||
}
 | 
			
		||||
@@ -65,6 +65,10 @@ export default (opts: Opts = {}) => ({
 | 
			
		||||
			return this.isRenote ? this.note.renote : this.note;
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		isMyNote(): boolean {
 | 
			
		||||
			return this.$store.getters.isSignedIn && (this.$store.state.i.id === this.appearNote.userId);
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		reactionsCount(): number {
 | 
			
		||||
			return this.appearNote.reactionCounts
 | 
			
		||||
				? sum(Object.values(this.appearNote.reactionCounts))
 | 
			
		||||
@@ -72,7 +76,7 @@ export default (opts: Opts = {}) => ({
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		title(): string {
 | 
			
		||||
			return new Date(this.appearNote.createdAt).toLocaleString();
 | 
			
		||||
			return '';
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		urls(): string[] {
 | 
			
		||||
@@ -80,8 +84,8 @@ export default (opts: Opts = {}) => ({
 | 
			
		||||
				const ast = parse(this.appearNote.text);
 | 
			
		||||
				// TODO: 再帰的にURL要素がないか調べる
 | 
			
		||||
				return unique(ast
 | 
			
		||||
					.filter(t => ((t.name == 'url' || t.name == 'link') && t.props.url && !t.props.silent))
 | 
			
		||||
					.map(t => t.props.url));
 | 
			
		||||
					.filter(t => ((t.node.type == 'url' || t.node.type == 'link') && t.node.props.url && !t.node.props.silent))
 | 
			
		||||
					.map(t => t.node.props.url));
 | 
			
		||||
			} else {
 | 
			
		||||
				return null;
 | 
			
		||||
			}
 | 
			
		||||
@@ -125,9 +129,7 @@ export default (opts: Opts = {}) => ({
 | 
			
		||||
				source: this.$refs.reactButton,
 | 
			
		||||
				note: this.appearNote,
 | 
			
		||||
				showFocus: viaKeyboard,
 | 
			
		||||
				animation: !viaKeyboard,
 | 
			
		||||
				compact: opts.mobile,
 | 
			
		||||
				big: opts.mobile
 | 
			
		||||
				animation: !viaKeyboard
 | 
			
		||||
			}).$once('closed', this.focus);
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
@@ -138,6 +140,14 @@ export default (opts: Opts = {}) => ({
 | 
			
		||||
			});
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		undoReact(note) {
 | 
			
		||||
			const oldReaction = note.myReaction;
 | 
			
		||||
			if (!oldReaction) return;
 | 
			
		||||
			this.$root.api('notes/reactions/delete', {
 | 
			
		||||
				noteId: note.id
 | 
			
		||||
			});
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		favorite() {
 | 
			
		||||
			this.$root.api('notes/favorites/create', {
 | 
			
		||||
				noteId: this.appearNote.id
 | 
			
		||||
@@ -159,8 +169,7 @@ export default (opts: Opts = {}) => ({
 | 
			
		||||
			this.$root.new(MkNoteMenu, {
 | 
			
		||||
				source: this.$refs.menuButton,
 | 
			
		||||
				note: this.appearNote,
 | 
			
		||||
				animation: !viaKeyboard,
 | 
			
		||||
				compact: opts.mobile,
 | 
			
		||||
				animation: !viaKeyboard
 | 
			
		||||
			}).$once('closed', this.focus);
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -95,6 +95,7 @@ export default prop => ({
 | 
			
		||||
						Vue.set(this.$_ns_target.reactionCounts, reaction, 0);
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					// Increment the count
 | 
			
		||||
					this.$_ns_target.reactionCounts[reaction]++;
 | 
			
		||||
 | 
			
		||||
					if (body.userId == this.$store.state.i.id) {
 | 
			
		||||
@@ -103,6 +104,26 @@ export default prop => ({
 | 
			
		||||
					break;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				case 'unreacted': {
 | 
			
		||||
					const reaction = body.reaction;
 | 
			
		||||
 | 
			
		||||
					if (this.$_ns_target.reactionCounts == null) {
 | 
			
		||||
						return;
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					if (this.$_ns_target.reactionCounts[reaction] == null) {
 | 
			
		||||
						return;
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					// Decrement the count
 | 
			
		||||
					if (this.$_ns_target.reactionCounts[reaction] > 0) this.$_ns_target.reactionCounts[reaction]--;
 | 
			
		||||
 | 
			
		||||
					if (body.userId == this.$store.state.i.id) {
 | 
			
		||||
						Vue.set(this.$_ns_target, 'myReaction', null);
 | 
			
		||||
					}
 | 
			
		||||
					break;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				case 'pollVoted': {
 | 
			
		||||
					if (body.userId == this.$store.state.i.id) return;
 | 
			
		||||
					const choice = body.choice;
 | 
			
		||||
 
 | 
			
		||||
@@ -2,8 +2,17 @@ export default function(me, settings, note) {
 | 
			
		||||
	const isMyNote = note.userId == me.id;
 | 
			
		||||
	const isPureRenote = note.renoteId != null && note.text == null && note.fileIds.length == 0 && note.poll == null;
 | 
			
		||||
 | 
			
		||||
	return settings.showMyRenotes === false && isMyNote && isPureRenote ||
 | 
			
		||||
		settings.showRenotedMyNotes === false && isPureRenote && note.renote.userId == me.id ||
 | 
			
		||||
		settings.showLocalRenotes === false && isPureRenote && note.renote.user.host == null ||
 | 
			
		||||
		!isMyNote && note.text && settings.mutedWords.some(q => q.length > 0 && !q.some(word => !note.text.includes(word)));
 | 
			
		||||
	const includesMutedWords = (text: string) =>
 | 
			
		||||
		text
 | 
			
		||||
			? settings.mutedWords.some(q => q.length > 0 && !q.some(word => !text.includes(word)))
 | 
			
		||||
			: false;
 | 
			
		||||
 | 
			
		||||
	return (
 | 
			
		||||
		(!isMyNote && note.reply && includesMutedWords(note.reply.text)) ||
 | 
			
		||||
		(!isMyNote && note.renote && includesMutedWords(note.renote.text)) ||
 | 
			
		||||
		(settings.showMyRenotes === false && isMyNote && isPureRenote) ||
 | 
			
		||||
		(settings.showRenotedMyNotes === false && isPureRenote && note.renote.userId == me.id) ||
 | 
			
		||||
		(settings.showLocalRenotes === false && isPureRenote && note.renote.user.host == null) ||
 | 
			
		||||
		(!isMyNote && includesMutedWords(note.text))
 | 
			
		||||
	);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -2,6 +2,7 @@
 | 
			
		||||
<span class="mk-acct">
 | 
			
		||||
	<span class="name">@{{ user.username }}</span>
 | 
			
		||||
	<span class="host" :class="{ fade: $store.state.settings.contrastedAcct }" v-if="user.host || detail || $store.state.settings.showFullAcct">@{{ user.host || host }}</span>
 | 
			
		||||
	<fa v-if="user.isLocked == true" class="locked" icon="lock" fixed-width/>
 | 
			
		||||
</span>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
@@ -23,4 +24,8 @@ export default Vue.extend({
 | 
			
		||||
.mk-acct
 | 
			
		||||
	> .host.fade
 | 
			
		||||
		opacity 0.5
 | 
			
		||||
 | 
			
		||||
	> .locked
 | 
			
		||||
		opacity 0.8
 | 
			
		||||
		margin-left 0.5em
 | 
			
		||||
</style>
 | 
			
		||||
 
 | 
			
		||||
@@ -32,7 +32,7 @@
 | 
			
		||||
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
import Vue from 'vue';
 | 
			
		||||
import { themeColor } from '../../../config';
 | 
			
		||||
import * as tinycolor from 'tinycolor2';
 | 
			
		||||
 | 
			
		||||
export default Vue.extend({
 | 
			
		||||
	props: {
 | 
			
		||||
@@ -75,7 +75,7 @@ export default Vue.extend({
 | 
			
		||||
			return this.dark ? '#fff' : '#777';
 | 
			
		||||
		},
 | 
			
		||||
		hHandColor(): string {
 | 
			
		||||
			return themeColor;
 | 
			
		||||
			return tinycolor(getComputedStyle(document.documentElement).getPropertyValue('--primary')).toHexString();
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		ms(): number {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,11 +1,7 @@
 | 
			
		||||
<template>
 | 
			
		||||
<button class="nrvgflfuaxwgkxoynpnumyookecqrrvh" @click="toggle">
 | 
			
		||||
	<b>{{ value ? this.$t('hide') : this.$t('show') }}</b>
 | 
			
		||||
	<span v-if="!value">
 | 
			
		||||
		<span v-if="note.text">{{ this.$t('chars', { count: length(note.text) }) | number }}</span>
 | 
			
		||||
		<span v-if="note.text && note.files && note.files.length > 0"> / </span>
 | 
			
		||||
		<span v-if="note.files && note.files.length > 0">{{ this.$t('files', { count: note.files.length }) }}</span>
 | 
			
		||||
	</span>
 | 
			
		||||
	<span v-if="!value">{{ this.label }}</span>
 | 
			
		||||
</button>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
@@ -13,6 +9,7 @@
 | 
			
		||||
import Vue from 'vue';
 | 
			
		||||
import i18n from '../../../i18n';
 | 
			
		||||
import { length } from 'stringz';
 | 
			
		||||
import { concat } from '../../../../../prelude/array';
 | 
			
		||||
 | 
			
		||||
export default Vue.extend({
 | 
			
		||||
	i18n: i18n('common/views/components/cw-button.vue'),
 | 
			
		||||
@@ -28,6 +25,16 @@ export default Vue.extend({
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	computed: {
 | 
			
		||||
		label(): string {
 | 
			
		||||
			return concat([
 | 
			
		||||
				this.note.text ? [this.$t('chars', { count: length(this.note.text) })] : [],
 | 
			
		||||
				this.note.files && this.note.files.length !== 0 ? [this.$t('files', { count: this.note.files.length }) ] : [],
 | 
			
		||||
				this.note.poll != null ? [this.$t('poll')] : []
 | 
			
		||||
			] as string[][]).join(' / ');
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	methods: {
 | 
			
		||||
		length,
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -20,7 +20,7 @@
 | 
			
		||||
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
import Vue from 'vue';
 | 
			
		||||
import * as anime from 'animejs';
 | 
			
		||||
import anime from 'animejs';
 | 
			
		||||
import { faTimesCircle, faQuestionCircle } from '@fortawesome/free-regular-svg-icons';
 | 
			
		||||
import parseAcct from "../../../../../misc/acct/parse";
 | 
			
		||||
 | 
			
		||||
@@ -93,7 +93,7 @@ export default Vue.extend({
 | 
			
		||||
				opacity: 1,
 | 
			
		||||
				scale: [1.2, 1],
 | 
			
		||||
				duration: 300,
 | 
			
		||||
				easing: [0, 0.5, 0.5, 1]
 | 
			
		||||
				easing: 'cubicBezier(0, 0.5, 0.5, 1)'
 | 
			
		||||
			});
 | 
			
		||||
 | 
			
		||||
			if (this.splash) {
 | 
			
		||||
@@ -142,7 +142,7 @@ export default Vue.extend({
 | 
			
		||||
				opacity: 0,
 | 
			
		||||
				scale: 0.8,
 | 
			
		||||
				duration: 300,
 | 
			
		||||
				easing: [0, 0.5, 0.5, 1],
 | 
			
		||||
				easing: 'cubicBezier(0, 0.5, 0.5, 1)',
 | 
			
		||||
				complete: () => this.destroyDom()
 | 
			
		||||
			});
 | 
			
		||||
		},
 | 
			
		||||
 
 | 
			
		||||
@@ -93,8 +93,7 @@ export default Vue.extend({
 | 
			
		||||
					},
 | 
			
		||||
					plotOptions: {
 | 
			
		||||
						bar: {
 | 
			
		||||
							columnWidth: '90%',
 | 
			
		||||
							endingShape: 'rounded'
 | 
			
		||||
							columnWidth: '90%'
 | 
			
		||||
						}
 | 
			
		||||
					},
 | 
			
		||||
					grid: {
 | 
			
		||||
 
 | 
			
		||||
@@ -48,7 +48,7 @@ export default Vue.extend({
 | 
			
		||||
		iconAndText(): any[] {
 | 
			
		||||
			return (
 | 
			
		||||
				(this.hasPendingFollowRequestFromYou && this.user.isLocked) ? ['hourglass-half', this.$t('request-pending')] :
 | 
			
		||||
				(this.hasPendingFollowRequestFromYou && !this.user.isLocked) ? ['hourglass-start', this.$t('follow-processing')] :
 | 
			
		||||
				(this.hasPendingFollowRequestFromYou && !this.user.isLocked) ? ['spinner', this.$t('follow-processing')] :
 | 
			
		||||
				(this.isFollowing) ? ['minus', this.$t('following')] :
 | 
			
		||||
				(!this.isFollowing && this.user.isLocked) ? ['plus', this.$t('follow-request')] :
 | 
			
		||||
				(!this.isFollowing && !this.user.isLocked) ? ['plus', this.$t('follow')] :
 | 
			
		||||
 
 | 
			
		||||
@@ -15,7 +15,9 @@ export default Vue.extend({
 | 
			
		||||
	},
 | 
			
		||||
	computed: {
 | 
			
		||||
		compiledFormula(): any {
 | 
			
		||||
			return katex.renderToString(this.formula);
 | 
			
		||||
			return katex.renderToString(this.formula, {
 | 
			
		||||
				throwOnError: false
 | 
			
		||||
			} as any);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
@@ -4,13 +4,18 @@
 | 
			
		||||
	<header><b><router-link :to="blackUser | userPage"><mk-user-name :user="blackUser"/></router-link></b>({{ $t('@.reversi.black') }}) vs <b><router-link :to="whiteUser | userPage"><mk-user-name :user="whiteUser"/></router-link></b>({{ $t('@.reversi.white') }})</header>
 | 
			
		||||
 | 
			
		||||
	<div style="overflow: hidden; line-height: 28px;">
 | 
			
		||||
		<p class="turn" v-if="!iAmPlayer && !game.isEnded">{{ $t('@.reversi.turn-of', { name: $options.filters.userName(turnUser) }) }}<mk-ellipsis/></p>
 | 
			
		||||
		<p class="turn" v-if="logPos != logs.length">{{ $t('@.reversi.past-turn-of', { name: $options.filters.userName(turnUser) }) }}</p>
 | 
			
		||||
		<p class="turn" v-if="!iAmPlayer && !game.isEnded">
 | 
			
		||||
			<mfm :text="$t('@.reversi.turn-of', { name: $options.filters.userName(turnUser) })" :should-break="false" :plain-text="true" :custom-emojis="turnUser.emojis"/>
 | 
			
		||||
			<mk-ellipsis/>
 | 
			
		||||
		</p>
 | 
			
		||||
		<p class="turn" v-if="logPos != logs.length">
 | 
			
		||||
			<mfm :text="$t('@.reversi.past-turn-of', { name: $options.filters.userName(turnUser) })" :should-break="false" :plain-text="true" :custom-emojis="turnUser.emojis"/>
 | 
			
		||||
		</p>
 | 
			
		||||
		<p class="turn1" v-if="iAmPlayer && !game.isEnded && !isMyTurn">{{ $t('@.reversi.opponent-turn') }}<mk-ellipsis/></p>
 | 
			
		||||
		<p class="turn2" v-if="iAmPlayer && !game.isEnded && isMyTurn" v-animate-css="{ classes: 'tada', iteration: 'infinite' }">{{ $t('@.reversi.my-turn') }}</p>
 | 
			
		||||
		<p class="result" v-if="game.isEnded && logPos == logs.length">
 | 
			
		||||
			<template v-if="game.winner">
 | 
			
		||||
				<misskey-flavored-markdown :text="$t('@.reversi.won', { name: $options.filters.userName(game.winner) })" :shouldBreak="false" :plainText="true" :custom-emojis="game.winner.emojis"/>
 | 
			
		||||
				<mfm :text="$t('@.reversi.won', { name: $options.filters.userName(game.winner) })" :should-break="false" :plain-text="true" :custom-emojis="game.winner.emojis"/>
 | 
			
		||||
				<span v-if="game.surrendered != null"> ({{ $t('surrendered') }})</span>
 | 
			
		||||
			</template>
 | 
			
		||||
			<template v-else>{{ $t('@.reversi.drawn') }}</template>
 | 
			
		||||
@@ -30,11 +35,11 @@
 | 
			
		||||
						:class="{ empty: stone == null, none: o.map[i] == 'null', isEnded: game.isEnded, myTurn: !game.isEnded && isMyTurn, can: turnUser ? o.canPut(turnUser.id == blackUser.id, i) : null, prev: o.prevPos == i }"
 | 
			
		||||
						@click="set(i)"
 | 
			
		||||
						:title="`${String.fromCharCode(65 + o.transformPosToXy(i)[0])}${o.transformPosToXy(i)[1] + 1}`">
 | 
			
		||||
					<template v-if="!$store.state.settings.games.reversi.useWhiteBlackStones">
 | 
			
		||||
						<img v-if="stone === true" :src="blackUser.avatarUrl" alt="black" :class="{ contrast: $store.state.settings.games.reversi.useContrastStones }">
 | 
			
		||||
						<img v-if="stone === false" :src="whiteUser.avatarUrl" alt="white" :class="{ contrast: $store.state.settings.games.reversi.useContrastStones }">
 | 
			
		||||
					<template v-if="$store.state.settings.games.reversi.useAvatarStones">
 | 
			
		||||
						<img v-if="stone === true" :src="blackUser.avatarUrl" alt="black">
 | 
			
		||||
						<img v-if="stone === false" :src="whiteUser.avatarUrl" alt="white">
 | 
			
		||||
					</template>
 | 
			
		||||
					<template v-if="$store.state.settings.games.reversi.useWhiteBlackStones">
 | 
			
		||||
					<template v-else>
 | 
			
		||||
						<fa v-if="stone === true" :icon="fasCircle"/>
 | 
			
		||||
						<fa v-if="stone === false" :icon="farCircle"/>
 | 
			
		||||
					</template>
 | 
			
		||||
@@ -430,13 +435,6 @@ export default Vue.extend({
 | 
			
		||||
						width 100%
 | 
			
		||||
						height 100%
 | 
			
		||||
 | 
			
		||||
						&.contrast
 | 
			
		||||
							&[alt="black"]
 | 
			
		||||
								filter brightness(.5)
 | 
			
		||||
 | 
			
		||||
							&[alt="white"]
 | 
			
		||||
								filter brightness(2)
 | 
			
		||||
 | 
			
		||||
	> .graph
 | 
			
		||||
		display grid
 | 
			
		||||
		grid-template-columns repeat(61, 1fr)
 | 
			
		||||
 
 | 
			
		||||
@@ -26,7 +26,7 @@
 | 
			
		||||
	</section>
 | 
			
		||||
	<section v-if="myGames.length > 0">
 | 
			
		||||
		<h2>{{ $t('my-games') }}</h2>
 | 
			
		||||
		<a class="game" v-for="g in myGames" tabindex="-1" @click.prevent="go(g)" :href="`/reversi/${g.id}`">
 | 
			
		||||
		<a class="game" v-for="g in myGames" tabindex="-1" @click.prevent="go(g)" :href="`/games/reversi/${g.id}`">
 | 
			
		||||
			<mk-avatar class="avatar" :user="g.user1"/>
 | 
			
		||||
			<mk-avatar class="avatar" :user="g.user2"/>
 | 
			
		||||
			<span><b><mk-user-name :user="g.user1"/></b> vs <b><mk-user-name :user="g.user2"/></b></span>
 | 
			
		||||
@@ -36,7 +36,7 @@
 | 
			
		||||
	</section>
 | 
			
		||||
	<section v-if="games.length > 0">
 | 
			
		||||
		<h2>{{ $t('all-games') }}</h2>
 | 
			
		||||
		<a class="game" v-for="g in games" tabindex="-1" @click.prevent="go(g)" :href="`/reversi/${g.id}`">
 | 
			
		||||
		<a class="game" v-for="g in games" tabindex="-1" @click.prevent="go(g)" :href="`/games/reversi/${g.id}`">
 | 
			
		||||
			<mk-avatar class="avatar" :user="g.user1"/>
 | 
			
		||||
			<mk-avatar class="avatar" :user="g.user2"/>
 | 
			
		||||
			<span><b><mk-user-name :user="g.user1"/></b> vs <b><mk-user-name :user="g.user2"/></b></span>
 | 
			
		||||
 
 | 
			
		||||
@@ -60,7 +60,7 @@
 | 
			
		||||
 | 
			
		||||
			<div>
 | 
			
		||||
				<template v-for="item in form">
 | 
			
		||||
					<ui-switch v-if="item.type == 'switch'" v-model="item.value" :key="item.id" :text="item.label" @change="onChangeForm(item)">{{ item.desc || '' }}</ui-switch>
 | 
			
		||||
					<ui-switch v-if="item.type == 'switch'" v-model="item.value" :key="item.id" @change="onChangeForm(item)">{{ item.label || item.desc || '' }}</ui-switch>
 | 
			
		||||
 | 
			
		||||
					<div class="card" v-if="item.type == 'radio'" :key="item.id">
 | 
			
		||||
						<header>
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
import Vue from 'vue';
 | 
			
		||||
import * as anime from 'animejs';
 | 
			
		||||
import anime from 'animejs';
 | 
			
		||||
 | 
			
		||||
export default Vue.extend({
 | 
			
		||||
	props: ['image'],
 | 
			
		||||
 
 | 
			
		||||
@@ -45,6 +45,7 @@ import uiInfo from './ui/info.vue';
 | 
			
		||||
import formButton from './ui/form/button.vue';
 | 
			
		||||
import formRadio from './ui/form/radio.vue';
 | 
			
		||||
 | 
			
		||||
Vue.component('mfm', misskeyFlavoredMarkdown);
 | 
			
		||||
Vue.component('mk-user-name', userName);
 | 
			
		||||
Vue.component('mk-follow-button', followButton);
 | 
			
		||||
Vue.component('mk-error', error);
 | 
			
		||||
@@ -63,7 +64,6 @@ Vue.component('mk-forkit', forkit);
 | 
			
		||||
Vue.component('mk-acct', acct);
 | 
			
		||||
Vue.component('mk-avatar', avatar);
 | 
			
		||||
Vue.component('mk-nav', nav);
 | 
			
		||||
Vue.component('misskey-flavored-markdown', misskeyFlavoredMarkdown);
 | 
			
		||||
Vue.component('mk-poll', poll);
 | 
			
		||||
Vue.component('mk-poll-editor', pollEditor);
 | 
			
		||||
Vue.component('mk-reaction-icon', reactionIcon);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,22 +1,22 @@
 | 
			
		||||
<template>
 | 
			
		||||
<ui-card>
 | 
			
		||||
<ui-card v-if="enableTwitterIntegration || enableDiscordIntegration || enableGithubIntegration">
 | 
			
		||||
	<div slot="title"><fa icon="share-alt"/> {{ $t('title') }}</div>
 | 
			
		||||
 | 
			
		||||
	<section>
 | 
			
		||||
	<section v-if="enableTwitterIntegration">
 | 
			
		||||
		<header><fa :icon="['fab', 'twitter']"/> Twitter</header>
 | 
			
		||||
		<p v-if="$store.state.i.twitter">{{ $t('connected-to') }}: <a :href="`https://twitter.com/${$store.state.i.twitter.screenName}`" target="_blank">@{{ $store.state.i.twitter.screenName }}</a></p>
 | 
			
		||||
		<ui-button v-if="$store.state.i.twitter" @click="disconnectTwitter">{{ $t('disconnect') }}</ui-button>
 | 
			
		||||
		<ui-button v-else @click="connectTwitter">{{ $t('connect') }}</ui-button>
 | 
			
		||||
	</section>
 | 
			
		||||
 | 
			
		||||
	<section>
 | 
			
		||||
	<section v-if="enableDiscordIntegration">
 | 
			
		||||
		<header><fa :icon="['fab', 'discord']"/> Discord</header>
 | 
			
		||||
		<p v-if="$store.state.i.discord">{{ $t('connected-to') }}: <a :href="`https://discordapp.com/users/${$store.state.i.discord.id}`" target="_blank">@{{ $store.state.i.discord.username }}#{{ $store.state.i.discord.discriminator }}</a></p>
 | 
			
		||||
		<ui-button v-if="$store.state.i.discord" @click="disconnectDiscord">{{ $t('disconnect') }}</ui-button>
 | 
			
		||||
		<ui-button v-else @click="connectDiscord">{{ $t('connect') }}</ui-button>
 | 
			
		||||
	</section>
 | 
			
		||||
 | 
			
		||||
	<section>
 | 
			
		||||
	<section v-if="enableGithubIntegration">
 | 
			
		||||
		<header><fa :icon="['fab', 'github']"/> GitHub</header>
 | 
			
		||||
		<p v-if="$store.state.i.github">{{ $t('connected-to') }}: <a :href="`https://github.com/${$store.state.i.github.login}`" target="_blank">@{{ $store.state.i.github.login }}</a></p>
 | 
			
		||||
		<ui-button v-if="$store.state.i.github" @click="disconnectGithub">{{ $t('disconnect') }}</ui-button>
 | 
			
		||||
@@ -39,9 +39,20 @@ export default Vue.extend({
 | 
			
		||||
			twitterForm: null,
 | 
			
		||||
			discordForm: null,
 | 
			
		||||
			githubForm: null,
 | 
			
		||||
			enableTwitterIntegration: false,
 | 
			
		||||
			enableDiscordIntegration: false,
 | 
			
		||||
			enableGithubIntegration: false,
 | 
			
		||||
		};
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	created() {
 | 
			
		||||
		this.$root.getMeta().then(meta => {
 | 
			
		||||
			this.enableTwitterIntegration = meta.enableTwitterIntegration;
 | 
			
		||||
			this.enableDiscordIntegration = meta.enableDiscordIntegration;
 | 
			
		||||
			this.enableGithubIntegration = meta.enableGithubIntegration;
 | 
			
		||||
		});
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	mounted() {
 | 
			
		||||
		document.cookie = `i=${this.$store.state.i.token}`;
 | 
			
		||||
		this.$watch('$store.state.i', () => {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										70
									
								
								src/client/app/common/views/components/mention.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								src/client/app/common/views/components/mention.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,70 @@
 | 
			
		||||
<template>
 | 
			
		||||
<router-link class="ldlomzub" :to="`/${ canonical }`" v-user-preview="canonical">
 | 
			
		||||
	<span class="me" v-if="isMe">{{ $t('@.you') }}</span>
 | 
			
		||||
	<span class="main">
 | 
			
		||||
		<span class="username">@{{ username }}</span>
 | 
			
		||||
		<span class="host" :class="{ fade: $store.state.settings.contrastedAcct }" v-if="(host != localHost) || $store.state.settings.showFullAcct">@{{ toUnicode(host) }}</span>
 | 
			
		||||
	</span>
 | 
			
		||||
</router-link>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
import Vue from 'vue';
 | 
			
		||||
import i18n from '../../../i18n';
 | 
			
		||||
import { toUnicode } from 'punycode';
 | 
			
		||||
import { host as localHost } from '../../../config';
 | 
			
		||||
 | 
			
		||||
export default Vue.extend({
 | 
			
		||||
	i18n: i18n(),
 | 
			
		||||
	props: {
 | 
			
		||||
		username: {
 | 
			
		||||
			type: String,
 | 
			
		||||
			required: true
 | 
			
		||||
		},
 | 
			
		||||
		host: {
 | 
			
		||||
			type: String,
 | 
			
		||||
			required: true
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
	data() {
 | 
			
		||||
		return {
 | 
			
		||||
			localHost
 | 
			
		||||
		};
 | 
			
		||||
	},
 | 
			
		||||
	computed: {
 | 
			
		||||
		canonical(): string {
 | 
			
		||||
			return `@${this.username}@${toUnicode(this.host)}`;
 | 
			
		||||
		},
 | 
			
		||||
		isMe(): boolean {
 | 
			
		||||
			return this.$store.getters.isSignedIn && this.canonical.toLowerCase() === `@${this.$store.state.i.username}@${toUnicode(localHost)}`.toLowerCase();
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
	methods: {
 | 
			
		||||
		toUnicode
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="stylus" scoped>
 | 
			
		||||
.ldlomzub
 | 
			
		||||
	color var(--mfmMention)
 | 
			
		||||
 | 
			
		||||
	> .me
 | 
			
		||||
		pointer-events none
 | 
			
		||||
		user-select none
 | 
			
		||||
		padding 0 4px
 | 
			
		||||
		background var(--mfmMention)
 | 
			
		||||
		border solid var(--lineWidth) var(--mfmMention)
 | 
			
		||||
		border-radius 4px 0 0 4px
 | 
			
		||||
		color var(--mfmMentionForeground)
 | 
			
		||||
 | 
			
		||||
		& + .main
 | 
			
		||||
			padding 0 4px
 | 
			
		||||
			border solid var(--lineWidth) var(--mfmMention)
 | 
			
		||||
			border-radius 0 4px 4px 0
 | 
			
		||||
 | 
			
		||||
	> .main
 | 
			
		||||
		> .host.fade
 | 
			
		||||
			opacity 0.5
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
<template>
 | 
			
		||||
<div class="onchrpzrvnoruiaenfcqvccjfuupzzwv" :class="{ big: $root.isMobile }">
 | 
			
		||||
<div class="onchrpzrvnoruiaenfcqvccjfuupzzwv" :class="{ isMobile: $root.isMobile }">
 | 
			
		||||
	<div class="backdrop" ref="backdrop" @click="close"></div>
 | 
			
		||||
	<div class="popover" :class="{ hukidasi }" ref="popover">
 | 
			
		||||
		<template v-for="item, i in items">
 | 
			
		||||
@@ -14,7 +14,7 @@
 | 
			
		||||
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
import Vue from 'vue';
 | 
			
		||||
import * as anime from 'animejs';
 | 
			
		||||
import anime from 'animejs';
 | 
			
		||||
 | 
			
		||||
export default Vue.extend({
 | 
			
		||||
	props: {
 | 
			
		||||
@@ -24,16 +24,11 @@ export default Vue.extend({
 | 
			
		||||
		items: {
 | 
			
		||||
			type: Array,
 | 
			
		||||
			required: true
 | 
			
		||||
		},
 | 
			
		||||
		compact: {
 | 
			
		||||
			type: Boolean,
 | 
			
		||||
			required: false,
 | 
			
		||||
			default: false
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
	data() {
 | 
			
		||||
		return {
 | 
			
		||||
			hukidasi: !this.compact
 | 
			
		||||
			hukidasi: !this.$root.isMobile
 | 
			
		||||
		};
 | 
			
		||||
	},
 | 
			
		||||
	mounted() {
 | 
			
		||||
@@ -47,7 +42,7 @@ export default Vue.extend({
 | 
			
		||||
			let left;
 | 
			
		||||
			let top;
 | 
			
		||||
 | 
			
		||||
			if (this.compact) {
 | 
			
		||||
			if (this.$root.isMobile) {
 | 
			
		||||
				const x = rect.left + window.pageXOffset + (this.source.offsetWidth / 2);
 | 
			
		||||
				const y = rect.top + window.pageYOffset + (this.source.offsetHeight / 2);
 | 
			
		||||
				left = (x - (width / 2));
 | 
			
		||||
@@ -121,11 +116,10 @@ export default Vue.extend({
 | 
			
		||||
<style lang="stylus" scoped>
 | 
			
		||||
.onchrpzrvnoruiaenfcqvccjfuupzzwv
 | 
			
		||||
	$bg-color = var(--popupBg)
 | 
			
		||||
	$border-color = rgba(27, 31, 35, 0.15)
 | 
			
		||||
 | 
			
		||||
	position initial
 | 
			
		||||
 | 
			
		||||
	&.big
 | 
			
		||||
	&.isMobile
 | 
			
		||||
		> .popover
 | 
			
		||||
			> button
 | 
			
		||||
				font-size 15px
 | 
			
		||||
@@ -145,7 +139,6 @@ export default Vue.extend({
 | 
			
		||||
		z-index 10001
 | 
			
		||||
		padding 8px 0
 | 
			
		||||
		background $bg-color
 | 
			
		||||
		border 1px solid $border-color
 | 
			
		||||
		border-radius 4px
 | 
			
		||||
		box-shadow 0 3px 12px rgba(27, 31, 35, 0.15)
 | 
			
		||||
		transform scale(0.5)
 | 
			
		||||
@@ -170,14 +163,6 @@ export default Vue.extend({
 | 
			
		||||
				border-top solid $balloon-size transparent
 | 
			
		||||
				border-left solid $balloon-size transparent
 | 
			
		||||
				border-right solid $balloon-size transparent
 | 
			
		||||
				border-bottom solid $balloon-size $border-color
 | 
			
		||||
 | 
			
		||||
			&:after
 | 
			
		||||
				top -($balloon-size * 2) + 1.5px
 | 
			
		||||
				left s('calc(50% - %s)', $balloon-size)
 | 
			
		||||
				border-top solid $balloon-size transparent
 | 
			
		||||
				border-left solid $balloon-size transparent
 | 
			
		||||
				border-right solid $balloon-size transparent
 | 
			
		||||
				border-bottom solid $balloon-size $bg-color
 | 
			
		||||
 | 
			
		||||
		> button
 | 
			
		||||
@@ -201,7 +186,7 @@ export default Vue.extend({
 | 
			
		||||
 | 
			
		||||
		> div
 | 
			
		||||
			margin 8px 0
 | 
			
		||||
			height 1px
 | 
			
		||||
			height var(--lineWidth)
 | 
			
		||||
			background var(--faceDivider)
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@
 | 
			
		||||
		@keypress="onKeypress"
 | 
			
		||||
		@paste="onPaste"
 | 
			
		||||
		:placeholder="$t('input-message-here')"
 | 
			
		||||
		v-autocomplete="'text'"
 | 
			
		||||
		v-autocomplete="{ model: 'text' }"
 | 
			
		||||
	></textarea>
 | 
			
		||||
	<div class="file" @click="file = null" v-if="file">{{ file.name }}</div>
 | 
			
		||||
	<mk-uploader ref="uploader" @uploaded="onUploaded"/>
 | 
			
		||||
@@ -85,7 +85,7 @@ export default Vue.extend({
 | 
			
		||||
				}
 | 
			
		||||
			} else {
 | 
			
		||||
				if (items[0].kind == 'file') {
 | 
			
		||||
					alert('%i18n:only-one-file-attached%');
 | 
			
		||||
					alert(this.$t('only-one-file-attached'));
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
@@ -107,7 +107,7 @@ export default Vue.extend({
 | 
			
		||||
				return;
 | 
			
		||||
			} else if (e.dataTransfer.files.length > 1) {
 | 
			
		||||
				e.preventDefault();
 | 
			
		||||
				alert('%i18n:only-one-file-attached%');
 | 
			
		||||
				alert(this.$t('only-one-file-attached'));
 | 
			
		||||
				return;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -3,11 +3,11 @@
 | 
			
		||||
	<mk-avatar class="avatar" :user="message.user" target="_blank"/>
 | 
			
		||||
	<div class="content">
 | 
			
		||||
		<div class="balloon" :data-no-text="message.text == null">
 | 
			
		||||
			<!-- <button class="delete-button" v-if="isMe" :title="$t('@.delete')">
 | 
			
		||||
				<img src="/assets/desktop/messaging/delete.png" alt="Delete"/>
 | 
			
		||||
			</button> -->
 | 
			
		||||
			<button class="delete-button" v-if="isMe" :title="$t('@.delete')" @click="del">
 | 
			
		||||
				<img src="/assets/desktop/remove.png" alt="Delete"/>
 | 
			
		||||
			</button>
 | 
			
		||||
			<div class="content" v-if="!message.isDeleted">
 | 
			
		||||
				<misskey-flavored-markdown class="text" v-if="message.text" ref="text" :text="message.text" :i="$store.state.i"/>
 | 
			
		||||
				<mfm class="text" v-if="message.text" ref="text" :text="message.text" :i="$store.state.i"/>
 | 
			
		||||
				<div class="file" v-if="message.file">
 | 
			
		||||
					<a :href="message.file.url" target="_blank" :title="message.file.name">
 | 
			
		||||
						<img v-if="message.file.type.split('/')[0] == 'image'" :src="message.file.url" :alt="message.file.name"
 | 
			
		||||
@@ -16,7 +16,7 @@
 | 
			
		||||
					</a>
 | 
			
		||||
				</div>
 | 
			
		||||
			</div>
 | 
			
		||||
			<div class="content" v-if="message.isDeleted">
 | 
			
		||||
			<div class="content" v-else>
 | 
			
		||||
				<p class="is-deleted">{{ $t('deleted') }}</p>
 | 
			
		||||
			</div>
 | 
			
		||||
		</div>
 | 
			
		||||
@@ -52,12 +52,19 @@ export default Vue.extend({
 | 
			
		||||
			if (this.message.text) {
 | 
			
		||||
				const ast = parse(this.message.text);
 | 
			
		||||
				return unique(ast
 | 
			
		||||
					.filter(t => ((t.name == 'url' || t.name == 'link') && t.props.url && !t.silent))
 | 
			
		||||
					.map(t => t.props.url));
 | 
			
		||||
					.filter(t => ((t.node.type == 'url' || t.node.type == 'link') && t.node.props.url && !t.node.props.silent))
 | 
			
		||||
					.map(t => t.node.props.url));
 | 
			
		||||
			} else {
 | 
			
		||||
				return null;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
	methods: {
 | 
			
		||||
		del() {
 | 
			
		||||
			this.$root.api('messaging/messages/delete', {
 | 
			
		||||
				messageId: this.message.id
 | 
			
		||||
			});
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
 
 | 
			
		||||
@@ -79,6 +79,7 @@ export default Vue.extend({
 | 
			
		||||
 | 
			
		||||
		this.connection.on('message', this.onMessage);
 | 
			
		||||
		this.connection.on('read', this.onRead);
 | 
			
		||||
		this.connection.on('deleted', this.onDeleted);
 | 
			
		||||
 | 
			
		||||
		if (this.isNaked) {
 | 
			
		||||
			window.addEventListener('scroll', this.onScroll, { passive: true });
 | 
			
		||||
@@ -204,6 +205,13 @@ export default Vue.extend({
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		onDeleted(id) {
 | 
			
		||||
			const msg = this.messages.find(m => m.id === id);
 | 
			
		||||
			if (msg) {
 | 
			
		||||
				this.messages = this.messages.filter(m => m.id !== msg.id);
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		isBottom() {
 | 
			
		||||
			const asobi = 64;
 | 
			
		||||
			const current = this.isNaked
 | 
			
		||||
 
 | 
			
		||||
@@ -1,23 +1,19 @@
 | 
			
		||||
import Vue, { VNode } from 'vue';
 | 
			
		||||
import { length } from 'stringz';
 | 
			
		||||
import { Node } from '../../../../../mfm/parser';
 | 
			
		||||
import { MfmForest } from '../../../../../mfm/parser';
 | 
			
		||||
import parse from '../../../../../mfm/parse';
 | 
			
		||||
import MkUrl from './url.vue';
 | 
			
		||||
import MkMention from './mention.vue';
 | 
			
		||||
import { concat, sum } from '../../../../../prelude/array';
 | 
			
		||||
import MkFormula from './formula.vue';
 | 
			
		||||
import MkGoogle from './google.vue';
 | 
			
		||||
import { toUnicode } from 'punycode';
 | 
			
		||||
import syntaxHighlight from '../../../../../mfm/syntax-highlight';
 | 
			
		||||
import { host } from '../../../config';
 | 
			
		||||
import { preorderF, countNodesF } from '../../../../../prelude/tree';
 | 
			
		||||
 | 
			
		||||
function getTextCount(tokens: Node[]): number {
 | 
			
		||||
	const rootCount = sum(tokens.filter(x => x.name === 'text').map(x => length(x.props.text)));
 | 
			
		||||
	const childrenCount = sum(tokens.filter(x => x.children).map(x => getTextCount(x.children)));
 | 
			
		||||
	return rootCount + childrenCount;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function getChildrenCount(tokens: Node[]): number {
 | 
			
		||||
	const countTree = tokens.filter(x => x.children).map(x => getChildrenCount(x.children));
 | 
			
		||||
	return countTree.length + sum(countTree);
 | 
			
		||||
function sumTextsLength(ts: MfmForest): number {
 | 
			
		||||
	const textNodes = preorderF(ts).filter(n => n.type === 'text');
 | 
			
		||||
	return sum(textNodes.map(x => length(x.props.text)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default Vue.component('misskey-flavored-markdown', {
 | 
			
		||||
@@ -26,10 +22,6 @@ export default Vue.component('misskey-flavored-markdown', {
 | 
			
		||||
			type: String,
 | 
			
		||||
			required: true
 | 
			
		||||
		},
 | 
			
		||||
		ast: {
 | 
			
		||||
			type: [],
 | 
			
		||||
			required: false
 | 
			
		||||
		},
 | 
			
		||||
		shouldBreak: {
 | 
			
		||||
			type: Boolean,
 | 
			
		||||
			default: true
 | 
			
		||||
@@ -54,17 +46,15 @@ export default Vue.component('misskey-flavored-markdown', {
 | 
			
		||||
	render(createElement) {
 | 
			
		||||
		if (this.text == null || this.text == '') return;
 | 
			
		||||
 | 
			
		||||
		const ast = this.ast == null ?
 | 
			
		||||
			parse(this.text, this.plainText) : // Parse text to ast
 | 
			
		||||
			this.ast as Node[];
 | 
			
		||||
		const ast = parse(this.text, this.plainText);
 | 
			
		||||
 | 
			
		||||
		let bigCount = 0;
 | 
			
		||||
		let motionCount = 0;
 | 
			
		||||
 | 
			
		||||
		const genEl = (ast: Node[]) => concat(ast.map((token): VNode[] => {
 | 
			
		||||
			switch (token.name) {
 | 
			
		||||
		const genEl = (ast: MfmForest) => concat(ast.map((token): VNode[] => {
 | 
			
		||||
			switch (token.node.type) {
 | 
			
		||||
				case 'text': {
 | 
			
		||||
					const text = token.props.text.replace(/(\r\n|\n|\r)/g, '\n');
 | 
			
		||||
					const text = token.node.props.text.replace(/(\r\n|\n|\r)/g, '\n');
 | 
			
		||||
 | 
			
		||||
					if (this.shouldBreak) {
 | 
			
		||||
						const x = text.split('\n')
 | 
			
		||||
@@ -94,7 +84,7 @@ export default Vue.component('misskey-flavored-markdown', {
 | 
			
		||||
 | 
			
		||||
				case 'big': {
 | 
			
		||||
					bigCount++;
 | 
			
		||||
					const isLong = getTextCount(token.children) > 10 || getChildrenCount(token.children) > 5;
 | 
			
		||||
					const isLong = sumTextsLength(token.children) > 10 || countNodesF(token.children) > 5;
 | 
			
		||||
					const isMany = bigCount > 3;
 | 
			
		||||
					return (createElement as any)('strong', {
 | 
			
		||||
						attrs: {
 | 
			
		||||
@@ -121,7 +111,7 @@ export default Vue.component('misskey-flavored-markdown', {
 | 
			
		||||
 | 
			
		||||
				case 'motion': {
 | 
			
		||||
					motionCount++;
 | 
			
		||||
					const isLong = getTextCount(token.children) > 10 || getChildrenCount(token.children) > 5;
 | 
			
		||||
					const isLong = sumTextsLength(token.children) > 10 || countNodesF(token.children) > 5;
 | 
			
		||||
					const isMany = motionCount > 3;
 | 
			
		||||
					return (createElement as any)('span', {
 | 
			
		||||
						attrs: {
 | 
			
		||||
@@ -138,9 +128,11 @@ export default Vue.component('misskey-flavored-markdown', {
 | 
			
		||||
					return [createElement(MkUrl, {
 | 
			
		||||
						key: Math.random(),
 | 
			
		||||
						props: {
 | 
			
		||||
							url: token.props.url,
 | 
			
		||||
							target: '_blank',
 | 
			
		||||
							style: 'color:var(--mfmLink);'
 | 
			
		||||
							url: token.node.props.url,
 | 
			
		||||
							target: '_blank'
 | 
			
		||||
						},
 | 
			
		||||
						attrs: {
 | 
			
		||||
							style: 'color:var(--mfmUrl);'
 | 
			
		||||
						}
 | 
			
		||||
					})];
 | 
			
		||||
				}
 | 
			
		||||
@@ -149,40 +141,32 @@ export default Vue.component('misskey-flavored-markdown', {
 | 
			
		||||
					return [createElement('a', {
 | 
			
		||||
						attrs: {
 | 
			
		||||
							class: 'link',
 | 
			
		||||
							href: token.props.url,
 | 
			
		||||
							href: token.node.props.url,
 | 
			
		||||
							target: '_blank',
 | 
			
		||||
							title: token.props.url,
 | 
			
		||||
							title: token.node.props.url,
 | 
			
		||||
							style: 'color:var(--mfmLink);'
 | 
			
		||||
						}
 | 
			
		||||
					}, genEl(token.children))];
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				case 'mention': {
 | 
			
		||||
					const host = token.props.host == null && this.author && this.author.host != null ? this.author.host : token.props.host;
 | 
			
		||||
					const canonical = host != null ? `@${token.props.username}@${toUnicode(host)}` : `@${token.props.username}`;
 | 
			
		||||
					return (createElement as any)('router-link', {
 | 
			
		||||
					return [createElement(MkMention, {
 | 
			
		||||
						key: Math.random(),
 | 
			
		||||
						attrs: {
 | 
			
		||||
							to: `/${canonical}`,
 | 
			
		||||
							// TODO
 | 
			
		||||
							//dataIsMe: (this as any).i && getAcct((this as any).i) == getAcct(token),
 | 
			
		||||
							style: 'color:var(--mfmMention);'
 | 
			
		||||
						},
 | 
			
		||||
						directives: [{
 | 
			
		||||
							name: 'user-preview',
 | 
			
		||||
							value: canonical
 | 
			
		||||
						}]
 | 
			
		||||
					}, canonical);
 | 
			
		||||
						props: {
 | 
			
		||||
							host: (token.node.props.host == null && this.author && this.author.host != null ? this.author.host : token.node.props.host) || host,
 | 
			
		||||
							username: token.node.props.username
 | 
			
		||||
						}
 | 
			
		||||
					})];
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				case 'hashtag': {
 | 
			
		||||
					return [createElement('router-link', {
 | 
			
		||||
						key: Math.random(),
 | 
			
		||||
						attrs: {
 | 
			
		||||
							to: `/tags/${encodeURIComponent(token.props.hashtag)}`,
 | 
			
		||||
							to: `/tags/${encodeURIComponent(token.node.props.hashtag)}`,
 | 
			
		||||
							style: 'color:var(--mfmHashtag);'
 | 
			
		||||
						}
 | 
			
		||||
					}, `#${token.props.hashtag}`)];
 | 
			
		||||
					}, `#${token.node.props.hashtag}`)];
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				case 'blockCode': {
 | 
			
		||||
@@ -191,7 +175,7 @@ export default Vue.component('misskey-flavored-markdown', {
 | 
			
		||||
					}, [
 | 
			
		||||
						createElement('code', {
 | 
			
		||||
							domProps: {
 | 
			
		||||
								innerHTML: syntaxHighlight(token.props.code)
 | 
			
		||||
								innerHTML: syntaxHighlight(token.node.props.code)
 | 
			
		||||
							}
 | 
			
		||||
						})
 | 
			
		||||
					])];
 | 
			
		||||
@@ -200,7 +184,7 @@ export default Vue.component('misskey-flavored-markdown', {
 | 
			
		||||
				case 'inlineCode': {
 | 
			
		||||
					return [createElement('code', {
 | 
			
		||||
						domProps: {
 | 
			
		||||
							innerHTML: syntaxHighlight(token.props.code)
 | 
			
		||||
							innerHTML: syntaxHighlight(token.node.props.code)
 | 
			
		||||
						}
 | 
			
		||||
					})];
 | 
			
		||||
				}
 | 
			
		||||
@@ -234,8 +218,8 @@ export default Vue.component('misskey-flavored-markdown', {
 | 
			
		||||
					return [createElement('mk-emoji', {
 | 
			
		||||
						key: Math.random(),
 | 
			
		||||
						attrs: {
 | 
			
		||||
							emoji: token.props.emoji,
 | 
			
		||||
							name: token.props.name
 | 
			
		||||
							emoji: token.node.props.emoji,
 | 
			
		||||
							name: token.node.props.name
 | 
			
		||||
						},
 | 
			
		||||
						props: {
 | 
			
		||||
							customEmojis: this.customEmojis || customEmojis,
 | 
			
		||||
@@ -249,7 +233,7 @@ export default Vue.component('misskey-flavored-markdown', {
 | 
			
		||||
					return [createElement(MkFormula, {
 | 
			
		||||
						key: Math.random(),
 | 
			
		||||
						props: {
 | 
			
		||||
							formula: token.props.formula
 | 
			
		||||
							formula: token.node.props.formula
 | 
			
		||||
						}
 | 
			
		||||
					})];
 | 
			
		||||
				}
 | 
			
		||||
@@ -259,13 +243,13 @@ export default Vue.component('misskey-flavored-markdown', {
 | 
			
		||||
					return [createElement(MkGoogle, {
 | 
			
		||||
						key: Math.random(),
 | 
			
		||||
						props: {
 | 
			
		||||
							q: token.props.query
 | 
			
		||||
							q: token.node.props.query
 | 
			
		||||
						}
 | 
			
		||||
					})];
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				default: {
 | 
			
		||||
					console.log('unknown ast type:', token.name);
 | 
			
		||||
					console.log('unknown ast type:', token.node.type);
 | 
			
		||||
 | 
			
		||||
					return [];
 | 
			
		||||
				}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,14 +1,14 @@
 | 
			
		||||
<template>
 | 
			
		||||
<mfm v-bind="$attrs" class="havbbuyv"/>
 | 
			
		||||
<mfm-core v-bind="$attrs" class="havbbuyv"/>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
import Vue from 'vue';
 | 
			
		||||
import Mfm from './mfm';
 | 
			
		||||
import MfmCore from './mfm';
 | 
			
		||||
 | 
			
		||||
export default Vue.extend({
 | 
			
		||||
	components: {
 | 
			
		||||
		Mfm
 | 
			
		||||
		MfmCore
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
 
 | 
			
		||||
@@ -19,7 +19,6 @@
 | 
			
		||||
			<fa v-if="note.visibility == 'home'" icon="home"/>
 | 
			
		||||
			<fa v-if="note.visibility == 'followers'" icon="unlock"/>
 | 
			
		||||
			<fa v-if="note.visibility == 'specified'" icon="envelope"/>
 | 
			
		||||
			<fa v-if="note.visibility == 'private'" icon="lock"/>
 | 
			
		||||
		</span>
 | 
			
		||||
		<span class="localOnly" v-if="note.localOnly == true"><fa icon="heart"/></span>
 | 
			
		||||
	</div>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
<template>
 | 
			
		||||
<div style="position:initial">
 | 
			
		||||
	<mk-menu :source="source" :compact="compact" :items="items" @closed="closed"/>
 | 
			
		||||
	<mk-menu :source="source" :items="items" @closed="closed"/>
 | 
			
		||||
</div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
@@ -13,15 +13,26 @@ import { concat, intersperse } from '../../../../../prelude/array';
 | 
			
		||||
 | 
			
		||||
export default Vue.extend({
 | 
			
		||||
	i18n: i18n('common/views/components/note-menu.vue'),
 | 
			
		||||
	props: ['note', 'source', 'compact'],
 | 
			
		||||
	props: ['note', 'source'],
 | 
			
		||||
	computed: {
 | 
			
		||||
		items(): any[] {
 | 
			
		||||
			return concat(intersperse([null], [
 | 
			
		||||
				[
 | 
			
		||||
					[{
 | 
			
		||||
						icon: 'at',
 | 
			
		||||
						text: this.$t('mention'),
 | 
			
		||||
						action: this.mention
 | 
			
		||||
					}]
 | 
			
		||||
				],
 | 
			
		||||
				[
 | 
			
		||||
					[{
 | 
			
		||||
						icon: 'info-circle',
 | 
			
		||||
						text: this.$t('detail'),
 | 
			
		||||
						action: this.detail
 | 
			
		||||
					}], [{
 | 
			
		||||
						icon: 'align-left',
 | 
			
		||||
						text: this.$t('copy-content'),
 | 
			
		||||
						action: this.copyContent
 | 
			
		||||
					}], [{
 | 
			
		||||
						icon: 'link',
 | 
			
		||||
						text: this.$t('copy-link'),
 | 
			
		||||
@@ -66,10 +77,18 @@ export default Vue.extend({
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	methods: {
 | 
			
		||||
		mention() {
 | 
			
		||||
			this.$post({ mention: this.note.user });
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		detail() {
 | 
			
		||||
			this.$router.push(`/notes/${this.note.id}`);
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		copyContent() {
 | 
			
		||||
			copyToClipboard(this.note.text);
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		copyLink() {
 | 
			
		||||
			copyToClipboard(`${url}/notes/${this.note.id}`);
 | 
			
		||||
		},
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,44 @@
 | 
			
		||||
<template>
 | 
			
		||||
<ui-card>
 | 
			
		||||
	<div slot="title"><fa :icon="['far', 'bell']"/> {{ $t('title') }}</div>
 | 
			
		||||
	<section>
 | 
			
		||||
		<ui-switch v-model="$store.state.i.settings.autoWatch" @change="onChangeAutoWatch">
 | 
			
		||||
			{{ $t('auto-watch') }}<span slot="desc">{{ $t('auto-watch-desc') }}</span>
 | 
			
		||||
		</ui-switch>
 | 
			
		||||
		<section>
 | 
			
		||||
			<ui-button @click="readAllNotifications">{{ $t('mark-as-read-all-notifications') }}</ui-button>
 | 
			
		||||
			<ui-button @click="readAllUnreadNotes">{{ $t('mark-as-read-all-unread-notes') }}</ui-button>
 | 
			
		||||
			<ui-button @click="readAllMessagingMessages">{{ $t('mark-as-read-all-talk-messages') }}</ui-button>
 | 
			
		||||
		</section>
 | 
			
		||||
	</section>
 | 
			
		||||
</ui-card>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
import Vue from 'vue';
 | 
			
		||||
import i18n from '../../../i18n';
 | 
			
		||||
 | 
			
		||||
export default Vue.extend({
 | 
			
		||||
	i18n: i18n('common/views/components/notification-settings.vue'),
 | 
			
		||||
 | 
			
		||||
	methods: {
 | 
			
		||||
		onChangeAutoWatch(v) {
 | 
			
		||||
			this.$root.api('i/update', {
 | 
			
		||||
				autoWatch: v
 | 
			
		||||
			});
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		readAllUnreadNotes() {
 | 
			
		||||
			this.$root.api('i/read_all_unread_notes');
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		readAllMessagingMessages() {
 | 
			
		||||
			this.$root.api('i/read_all_messaging_messages');
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		readAllNotifications() {
 | 
			
		||||
			this.$root.api('notifications/mark_all_as_read');
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
							
								
								
									
										53
									
								
								src/client/app/common/views/components/particle.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								src/client/app/common/views/components/particle.vue
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							@@ -24,7 +24,7 @@
 | 
			
		||||
			</ui-input>
 | 
			
		||||
 | 
			
		||||
			<ui-input v-model="birthday" type="date">
 | 
			
		||||
				<span>{{ $t('birthday') }}</span>
 | 
			
		||||
				<span slot="title">{{ $t('birthday') }}</span>
 | 
			
		||||
				<span slot="prefix"><fa icon="birthday-cake"/></span>
 | 
			
		||||
			</ui-input>
 | 
			
		||||
 | 
			
		||||
@@ -69,7 +69,8 @@
 | 
			
		||||
 | 
			
		||||
		<div>
 | 
			
		||||
			<ui-switch v-model="isLocked" @change="save(false)">{{ $t('is-locked') }}</ui-switch>
 | 
			
		||||
			<ui-switch v-model="carefulBot" @change="save(false)">{{ $t('careful-bot') }}</ui-switch>
 | 
			
		||||
			<ui-switch v-model="carefulBot" :disabled="isLocked" @change="save(false)">{{ $t('careful-bot') }}</ui-switch>
 | 
			
		||||
			<ui-switch v-model="autoAcceptFollowed" :disabled="!isLocked && !carefulBot" @change="save(false)">{{ $t('auto-accept-followed') }}</ui-switch>
 | 
			
		||||
		</div>
 | 
			
		||||
	</section>
 | 
			
		||||
 | 
			
		||||
@@ -118,6 +119,7 @@ export default Vue.extend({
 | 
			
		||||
			isBot: false,
 | 
			
		||||
			isLocked: false,
 | 
			
		||||
			carefulBot: false,
 | 
			
		||||
			autoAcceptFollowed: false,
 | 
			
		||||
			saving: false,
 | 
			
		||||
			avatarUploading: false,
 | 
			
		||||
			bannerUploading: false
 | 
			
		||||
@@ -156,6 +158,7 @@ export default Vue.extend({
 | 
			
		||||
		this.isBot = this.$store.state.i.isBot;
 | 
			
		||||
		this.isLocked = this.$store.state.i.isLocked;
 | 
			
		||||
		this.carefulBot = this.$store.state.i.carefulBot;
 | 
			
		||||
		this.autoAcceptFollowed = this.$store.state.i.autoAcceptFollowed;
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	methods: {
 | 
			
		||||
@@ -217,7 +220,8 @@ export default Vue.extend({
 | 
			
		||||
				isCat: !!this.isCat,
 | 
			
		||||
				isBot: !!this.isBot,
 | 
			
		||||
				isLocked: !!this.isLocked,
 | 
			
		||||
				carefulBot: !!this.carefulBot
 | 
			
		||||
				carefulBot: !!this.carefulBot,
 | 
			
		||||
				autoAcceptFollowed: !!this.autoAcceptFollowed
 | 
			
		||||
			}).then(i => {
 | 
			
		||||
				this.saving = false;
 | 
			
		||||
				this.$store.state.i.avatarId = i.avatarId;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,19 +1,19 @@
 | 
			
		||||
<template>
 | 
			
		||||
<div class="mk-reaction-picker" v-hotkey.global="keymap">
 | 
			
		||||
<div class="rdfaahpb" v-hotkey.global="keymap">
 | 
			
		||||
	<div class="backdrop" ref="backdrop" @click="close"></div>
 | 
			
		||||
	<div class="popover" :class="{ compact, big }" ref="popover">
 | 
			
		||||
		<p v-if="!compact">{{ title }}</p>
 | 
			
		||||
	<div class="popover" :class="{ isMobile: $root.isMobile }" ref="popover">
 | 
			
		||||
		<p v-if="!$root.isMobile">{{ title }}</p>
 | 
			
		||||
		<div ref="buttons" :class="{ showFocus }">
 | 
			
		||||
			<button @click="react('like')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="1" :title="$t('@.reactions.like')"><mk-reaction-icon reaction='like'/></button>
 | 
			
		||||
			<button @click="react('love')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="2" :title="$t('@.reactions.love')"><mk-reaction-icon reaction='love'/></button>
 | 
			
		||||
			<button @click="react('laugh')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="3" :title="$t('@.reactions.laugh')"><mk-reaction-icon reaction='laugh'/></button>
 | 
			
		||||
			<button @click="react('hmm')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="4" :title="$t('@.reactions.hmm')"><mk-reaction-icon reaction='hmm'/></button>
 | 
			
		||||
			<button @click="react('surprise')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="5" :title="$t('@.reactions.surprise')"><mk-reaction-icon reaction='surprise'/></button>
 | 
			
		||||
			<button @click="react('congrats')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="6" :title="$t('@.reactions.congrats')"><mk-reaction-icon reaction='congrats'/></button>
 | 
			
		||||
			<button @click="react('angry')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="7" :title="$t('@.reactions.angry')"><mk-reaction-icon reaction='angry'/></button>
 | 
			
		||||
			<button @click="react('confused')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="8" :title="$t('@.reactions.confused')"><mk-reaction-icon reaction='confused'/></button>
 | 
			
		||||
			<button @click="react('rip')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="9" :title="$t('@.reactions.rip')"><mk-reaction-icon reaction='rip'/></button>
 | 
			
		||||
			<button @click="react('pudding')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="10" :title="$t('@.reactions.pudding')"><mk-reaction-icon reaction='pudding'/></button>
 | 
			
		||||
			<button @click="react('like')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="1" :title="$t('@.reactions.like')" v-particle><mk-reaction-icon reaction="like"/></button>
 | 
			
		||||
			<button @click="react('love')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="2" :title="$t('@.reactions.love')" v-particle><mk-reaction-icon reaction="love"/></button>
 | 
			
		||||
			<button @click="react('laugh')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="3" :title="$t('@.reactions.laugh')" v-particle><mk-reaction-icon reaction="laugh"/></button>
 | 
			
		||||
			<button @click="react('hmm')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="4" :title="$t('@.reactions.hmm')" v-particle><mk-reaction-icon reaction="hmm"/></button>
 | 
			
		||||
			<button @click="react('surprise')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="5" :title="$t('@.reactions.surprise')" v-particle><mk-reaction-icon reaction="surprise"/></button>
 | 
			
		||||
			<button @click="react('congrats')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="6" :title="$t('@.reactions.congrats')" v-particle><mk-reaction-icon reaction="congrats"/></button>
 | 
			
		||||
			<button @click="react('angry')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="7" :title="$t('@.reactions.angry')" v-particle><mk-reaction-icon reaction="angry"/></button>
 | 
			
		||||
			<button @click="react('confused')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="8" :title="$t('@.reactions.confused')" v-particle><mk-reaction-icon reaction="confused"/></button>
 | 
			
		||||
			<button @click="react('rip')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="9" :title="$t('@.reactions.rip')" v-particle><mk-reaction-icon reaction="rip"/></button>
 | 
			
		||||
			<button @click="react('pudding')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="10" :title="$t('@.reactions.pudding')" v-particle><mk-reaction-icon reaction="pudding"/></button>
 | 
			
		||||
		</div>
 | 
			
		||||
	</div>
 | 
			
		||||
</div>
 | 
			
		||||
@@ -22,7 +22,7 @@
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
import Vue from 'vue';
 | 
			
		||||
import i18n from '../../../i18n';
 | 
			
		||||
import * as anime from 'animejs';
 | 
			
		||||
import anime from 'animejs';
 | 
			
		||||
 | 
			
		||||
export default Vue.extend({
 | 
			
		||||
	i18n: i18n('common/views/components/reaction-picker.vue'),
 | 
			
		||||
@@ -36,22 +36,10 @@ export default Vue.extend({
 | 
			
		||||
			required: true
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		compact: {
 | 
			
		||||
			type: Boolean,
 | 
			
		||||
			required: false,
 | 
			
		||||
			default: false
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		cb: {
 | 
			
		||||
			required: false
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		big: {
 | 
			
		||||
			type: Boolean,
 | 
			
		||||
			required: false,
 | 
			
		||||
			default: false
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		showFocus: {
 | 
			
		||||
			type: Boolean,
 | 
			
		||||
			required: false,
 | 
			
		||||
@@ -115,7 +103,7 @@ export default Vue.extend({
 | 
			
		||||
			const width = popover.offsetWidth;
 | 
			
		||||
			const height = popover.offsetHeight;
 | 
			
		||||
 | 
			
		||||
			if (this.compact) {
 | 
			
		||||
			if (this.$root.isMobile) {
 | 
			
		||||
				const x = rect.left + window.pageXOffset + (this.source.offsetWidth / 2);
 | 
			
		||||
				const y = rect.top + window.pageYOffset + (this.source.offsetHeight / 2);
 | 
			
		||||
				popover.style.left = (x - (width / 2)) + 'px';
 | 
			
		||||
@@ -210,9 +198,7 @@ export default Vue.extend({
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="stylus" scoped>
 | 
			
		||||
$border-color = rgba(27, 31, 35, 0.15)
 | 
			
		||||
 | 
			
		||||
.mk-reaction-picker
 | 
			
		||||
.rdfaahpb
 | 
			
		||||
	position initial
 | 
			
		||||
 | 
			
		||||
	> .backdrop
 | 
			
		||||
@@ -230,41 +216,12 @@ $border-color = rgba(27, 31, 35, 0.15)
 | 
			
		||||
		position absolute
 | 
			
		||||
		z-index 10001
 | 
			
		||||
		background $bgcolor
 | 
			
		||||
		border 1px solid $border-color
 | 
			
		||||
		border-radius 4px
 | 
			
		||||
		box-shadow 0 3px 12px rgba(27, 31, 35, 0.15)
 | 
			
		||||
		transform scale(0.5)
 | 
			
		||||
		opacity 0
 | 
			
		||||
 | 
			
		||||
		$balloon-size = 16px
 | 
			
		||||
 | 
			
		||||
		&:not(.compact)
 | 
			
		||||
			margin-top $balloon-size
 | 
			
		||||
			transform-origin center -($balloon-size)
 | 
			
		||||
 | 
			
		||||
			&:before
 | 
			
		||||
				content ""
 | 
			
		||||
				display block
 | 
			
		||||
				position absolute
 | 
			
		||||
				top -($balloon-size * 2)
 | 
			
		||||
				left s('calc(50% - %s)', $balloon-size)
 | 
			
		||||
				border-top solid $balloon-size transparent
 | 
			
		||||
				border-left solid $balloon-size transparent
 | 
			
		||||
				border-right solid $balloon-size transparent
 | 
			
		||||
				border-bottom solid $balloon-size $border-color
 | 
			
		||||
 | 
			
		||||
			&:after
 | 
			
		||||
				content ""
 | 
			
		||||
				display block
 | 
			
		||||
				position absolute
 | 
			
		||||
				top -($balloon-size * 2) + 1.5px
 | 
			
		||||
				left s('calc(50% - %s)', $balloon-size)
 | 
			
		||||
				border-top solid $balloon-size transparent
 | 
			
		||||
				border-left solid $balloon-size transparent
 | 
			
		||||
				border-right solid $balloon-size transparent
 | 
			
		||||
				border-bottom solid $balloon-size $bgcolor
 | 
			
		||||
 | 
			
		||||
		&.big
 | 
			
		||||
		&.isMobile
 | 
			
		||||
			> div
 | 
			
		||||
				width 280px
 | 
			
		||||
 | 
			
		||||
@@ -274,13 +231,30 @@ $border-color = rgba(27, 31, 35, 0.15)
 | 
			
		||||
					font-size 28px
 | 
			
		||||
					border-radius 4px
 | 
			
		||||
 | 
			
		||||
		&:not(.isMobile)
 | 
			
		||||
			$arrow-size = 16px
 | 
			
		||||
 | 
			
		||||
			margin-top $arrow-size
 | 
			
		||||
			transform-origin center -($arrow-size)
 | 
			
		||||
 | 
			
		||||
			&:before
 | 
			
		||||
				content ""
 | 
			
		||||
				display block
 | 
			
		||||
				position absolute
 | 
			
		||||
				top -($arrow-size * 2)
 | 
			
		||||
				left s('calc(50% - %s)', $arrow-size)
 | 
			
		||||
				border-top solid $arrow-size transparent
 | 
			
		||||
				border-left solid $arrow-size transparent
 | 
			
		||||
				border-right solid $arrow-size transparent
 | 
			
		||||
				border-bottom solid $arrow-size $bgcolor
 | 
			
		||||
 | 
			
		||||
		> p
 | 
			
		||||
			display block
 | 
			
		||||
			margin 0
 | 
			
		||||
			padding 8px 10px
 | 
			
		||||
			font-size 14px
 | 
			
		||||
			color var(--popupFg)
 | 
			
		||||
			border-bottom solid 1px var(--faceDivider)
 | 
			
		||||
			border-bottom solid var(--lineWidth) var(--faceDivider)
 | 
			
		||||
 | 
			
		||||
		> div
 | 
			
		||||
			padding 4px
 | 
			
		||||
 
 | 
			
		||||
@@ -1,35 +1,130 @@
 | 
			
		||||
<template>
 | 
			
		||||
<div class="mk-reactions-viewer">
 | 
			
		||||
<div class="mk-reactions-viewer" :class="{ isMe }">
 | 
			
		||||
	<template v-if="reactions">
 | 
			
		||||
		<span :class="{ reacted: note.myReaction == 'like' }" @click="react('like')" v-if="reactions.like"><mk-reaction-icon reaction="like"/><span>{{ reactions.like }}</span></span>
 | 
			
		||||
		<span :class="{ reacted: note.myReaction == 'love' }" @click="react('love')" v-if="reactions.love"><mk-reaction-icon reaction="love"/><span>{{ reactions.love }}</span></span>
 | 
			
		||||
		<span :class="{ reacted: note.myReaction == 'laugh' }" @click="react('laugh')" v-if="reactions.laugh"><mk-reaction-icon reaction="laugh"/><span>{{ reactions.laugh }}</span></span>
 | 
			
		||||
		<span :class="{ reacted: note.myReaction == 'hmm' }" @click="react('hmm')" v-if="reactions.hmm"><mk-reaction-icon reaction="hmm"/><span>{{ reactions.hmm }}</span></span>
 | 
			
		||||
		<span :class="{ reacted: note.myReaction == 'surprise' }" @click="react('surprise')" v-if="reactions.surprise"><mk-reaction-icon reaction="surprise"/><span>{{ reactions.surprise }}</span></span>
 | 
			
		||||
		<span :class="{ reacted: note.myReaction == 'congrats' }" @click="react('congrats')" v-if="reactions.congrats"><mk-reaction-icon reaction="congrats"/><span>{{ reactions.congrats }}</span></span>
 | 
			
		||||
		<span :class="{ reacted: note.myReaction == 'angry' }" @click="react('angry')" v-if="reactions.angry"><mk-reaction-icon reaction="angry"/><span>{{ reactions.angry }}</span></span>
 | 
			
		||||
		<span :class="{ reacted: note.myReaction == 'confused' }" @click="react('confused')" v-if="reactions.confused"><mk-reaction-icon reaction="confused"/><span>{{ reactions.confused }}</span></span>
 | 
			
		||||
		<span :class="{ reacted: note.myReaction == 'rip' }" @click="react('rip')" v-if="reactions.rip"><mk-reaction-icon reaction="rip"/><span>{{ reactions.rip }}</span></span>
 | 
			
		||||
		<span :class="{ reacted: note.myReaction == 'pudding' }" @click="react('pudding')" v-if="reactions.pudding"><mk-reaction-icon reaction="pudding"/><span>{{ reactions.pudding }}</span></span>
 | 
			
		||||
		<span :class="{ reacted: note.myReaction == 'like' }" @click="toggleReaction('like')" v-if="reactions.like" v-particle="!isMe"><mk-reaction-icon reaction="like" ref="like"/><span>{{ reactions.like }}</span></span>
 | 
			
		||||
		<span :class="{ reacted: note.myReaction == 'love' }" @click="toggleReaction('love')" v-if="reactions.love" v-particle="!isMe"><mk-reaction-icon reaction="love" ref="love"/><span>{{ reactions.love }}</span></span>
 | 
			
		||||
		<span :class="{ reacted: note.myReaction == 'laugh' }" @click="toggleReaction('laugh')" v-if="reactions.laugh" v-particle="!isMe"><mk-reaction-icon reaction="laugh" ref="laugh"/><span>{{ reactions.laugh }}</span></span>
 | 
			
		||||
		<span :class="{ reacted: note.myReaction == 'hmm' }" @click="toggleReaction('hmm')" v-if="reactions.hmm" v-particle="!isMe"><mk-reaction-icon reaction="hmm" ref="hmm"/><span>{{ reactions.hmm }}</span></span>
 | 
			
		||||
		<span :class="{ reacted: note.myReaction == 'surprise' }" @click="toggleReaction('surprise')" v-if="reactions.surprise" v-particle="!isMe"><mk-reaction-icon reaction="surprise" ref="surprise"/><span>{{ reactions.surprise }}</span></span>
 | 
			
		||||
		<span :class="{ reacted: note.myReaction == 'congrats' }" @click="toggleReaction('congrats')" v-if="reactions.congrats" v-particle="!isMe"><mk-reaction-icon reaction="congrats" ref="congrats"/><span>{{ reactions.congrats }}</span></span>
 | 
			
		||||
		<span :class="{ reacted: note.myReaction == 'angry' }" @click="toggleReaction('angry')" v-if="reactions.angry" v-particle="!isMe"><mk-reaction-icon reaction="angry" ref="angry"/><span>{{ reactions.angry }}</span></span>
 | 
			
		||||
		<span :class="{ reacted: note.myReaction == 'confused' }" @click="toggleReaction('confused')" v-if="reactions.confused" v-particle="!isMe"><mk-reaction-icon reaction="confused" ref="confused"/><span>{{ reactions.confused }}</span></span>
 | 
			
		||||
		<span :class="{ reacted: note.myReaction == 'rip' }" @click="toggleReaction('rip')" v-if="reactions.rip" v-particle="!isMe"><mk-reaction-icon reaction="rip" ref="rip"/><span>{{ reactions.rip }}</span></span>
 | 
			
		||||
		<span :class="{ reacted: note.myReaction == 'pudding' }" @click="toggleReaction('pudding')" v-if="reactions.pudding" v-particle="!isMe"><mk-reaction-icon reaction="pudding" ref="pudding"/><span>{{ reactions.pudding }}</span></span>
 | 
			
		||||
	</template>
 | 
			
		||||
</div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
import Vue from 'vue';
 | 
			
		||||
import Icon from './reaction-icon.vue';
 | 
			
		||||
import anime from 'animejs';
 | 
			
		||||
 | 
			
		||||
export default Vue.extend({
 | 
			
		||||
	props: ['note'],
 | 
			
		||||
	props: {
 | 
			
		||||
		note: {
 | 
			
		||||
			type: Object,
 | 
			
		||||
			required: true
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
	computed: {
 | 
			
		||||
		reactions(): number {
 | 
			
		||||
		reactions(): any {
 | 
			
		||||
			return this.note.reactionCounts;
 | 
			
		||||
		},
 | 
			
		||||
		isMe(): boolean {
 | 
			
		||||
			return this.$store.getters.isSignedIn && (this.$store.state.i.id === this.note.userId);
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
	watch: {
 | 
			
		||||
		'reactions.like'() {
 | 
			
		||||
			this.anime('like');
 | 
			
		||||
		},
 | 
			
		||||
		'reactions.love'() {
 | 
			
		||||
			this.anime('love');
 | 
			
		||||
		},
 | 
			
		||||
		'reactions.laugh'() {
 | 
			
		||||
			this.anime('laugh');
 | 
			
		||||
		},
 | 
			
		||||
		'reactions.hmm'() {
 | 
			
		||||
			this.anime('hmm');
 | 
			
		||||
		},
 | 
			
		||||
		'reactions.surprise'() {
 | 
			
		||||
			this.anime('surprise');
 | 
			
		||||
		},
 | 
			
		||||
		'reactions.congrats'() {
 | 
			
		||||
			this.anime('congrats');
 | 
			
		||||
		},
 | 
			
		||||
		'reactions.angry'() {
 | 
			
		||||
			this.anime('angry');
 | 
			
		||||
		},
 | 
			
		||||
		'reactions.confused'() {
 | 
			
		||||
			this.anime('confused');
 | 
			
		||||
		},
 | 
			
		||||
		'reactions.rip'() {
 | 
			
		||||
			this.anime('rip');
 | 
			
		||||
		},
 | 
			
		||||
		'reactions.pudding'() {
 | 
			
		||||
			this.anime('pudding');
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
	methods: {
 | 
			
		||||
		react(reaction: string) {
 | 
			
		||||
			this.$root.api('notes/reactions/create', {
 | 
			
		||||
				noteId: this.note.id,
 | 
			
		||||
				reaction: reaction
 | 
			
		||||
		toggleReaction(reaction: string) {
 | 
			
		||||
			if (this.isMe) return;
 | 
			
		||||
 | 
			
		||||
			const oldReaction = this.note.myReaction;
 | 
			
		||||
			if (oldReaction) {
 | 
			
		||||
				this.$root.api('notes/reactions/delete', {
 | 
			
		||||
					noteId: this.note.id
 | 
			
		||||
				}).then(() => {
 | 
			
		||||
					if (oldReaction !== reaction) {
 | 
			
		||||
						this.$root.api('notes/reactions/create', {
 | 
			
		||||
							noteId: this.note.id,
 | 
			
		||||
							reaction: reaction
 | 
			
		||||
						});
 | 
			
		||||
					}
 | 
			
		||||
				});
 | 
			
		||||
			} else {
 | 
			
		||||
				this.$root.api('notes/reactions/create', {
 | 
			
		||||
					noteId: this.note.id,
 | 
			
		||||
					reaction: reaction
 | 
			
		||||
				});
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
		anime(reaction: string) {
 | 
			
		||||
			if (this.$store.state.device.reduceMotion) return;
 | 
			
		||||
			if (document.hidden) return;
 | 
			
		||||
 | 
			
		||||
			this.$nextTick(() => {
 | 
			
		||||
				const rect = this.$refs[reaction].$el.getBoundingClientRect();
 | 
			
		||||
 | 
			
		||||
				const x = rect.left;
 | 
			
		||||
				const y = rect.top;
 | 
			
		||||
 | 
			
		||||
				const icon = new Icon({
 | 
			
		||||
					parent: this,
 | 
			
		||||
					propsData: {
 | 
			
		||||
						reaction: reaction
 | 
			
		||||
					}
 | 
			
		||||
				}).$mount();
 | 
			
		||||
 | 
			
		||||
				icon.$el.style.position = 'absolute';
 | 
			
		||||
				icon.$el.style.zIndex = 100;
 | 
			
		||||
				icon.$el.style.top = (y + window.scrollY) + 'px';
 | 
			
		||||
				icon.$el.style.left = (x + window.scrollX) + 'px';
 | 
			
		||||
				icon.$el.style.fontSize = window.getComputedStyle(this.$refs[reaction].$el).fontSize;
 | 
			
		||||
 | 
			
		||||
				document.body.appendChild(icon.$el);
 | 
			
		||||
 | 
			
		||||
				anime({
 | 
			
		||||
					targets: icon.$el,
 | 
			
		||||
					opacity: [1, 0],
 | 
			
		||||
					translateY: [0, -64],
 | 
			
		||||
					duration: 1000,
 | 
			
		||||
					easing: 'linear',
 | 
			
		||||
					complete: () => {
 | 
			
		||||
						icon.destroyDom();
 | 
			
		||||
					}
 | 
			
		||||
				});
 | 
			
		||||
			});
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
@@ -43,12 +138,20 @@ export default Vue.extend({
 | 
			
		||||
	&:empty
 | 
			
		||||
		display none
 | 
			
		||||
 | 
			
		||||
	&.isMe
 | 
			
		||||
		> span
 | 
			
		||||
			cursor default !important
 | 
			
		||||
 | 
			
		||||
			&:hover
 | 
			
		||||
				background var(--reactionViewerButtonBg) !important
 | 
			
		||||
 | 
			
		||||
	> span
 | 
			
		||||
		display inline-block
 | 
			
		||||
		height 32px
 | 
			
		||||
		margin-right 6px
 | 
			
		||||
		padding 0 6px
 | 
			
		||||
		border-radius 4px
 | 
			
		||||
		cursor pointer
 | 
			
		||||
 | 
			
		||||
		*
 | 
			
		||||
			user-select none
 | 
			
		||||
@@ -61,7 +164,6 @@ export default Vue.extend({
 | 
			
		||||
				color var(--primaryForeground)
 | 
			
		||||
 | 
			
		||||
		&:not(.reacted)
 | 
			
		||||
			cursor pointer
 | 
			
		||||
			background var(--reactionViewerButtonBg)
 | 
			
		||||
 | 
			
		||||
			&:hover
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,6 @@
 | 
			
		||||
			<fa v-if="note.visibility == 'home'" icon="home"/>
 | 
			
		||||
			<fa v-if="note.visibility == 'followers'" icon="unlock"/>
 | 
			
		||||
			<fa v-if="note.visibility == 'specified'" icon="envelope"/>
 | 
			
		||||
			<fa v-if="note.visibility == 'private'" icon="lock"/>
 | 
			
		||||
		</span>
 | 
			
		||||
		<span class="localOnly" v-if="note.localOnly == true"><fa icon="heart"/></span>
 | 
			
		||||
	</div>
 | 
			
		||||
 
 | 
			
		||||
@@ -6,11 +6,14 @@
 | 
			
		||||
		<span slot="prefix">@</span>
 | 
			
		||||
		<span slot="suffix">@{{ host }}</span>
 | 
			
		||||
	</ui-input>
 | 
			
		||||
	<ui-input v-model="password" type="password" required styl="fill">
 | 
			
		||||
	<ui-input v-model="password" type="password" :with-password-toggle="true" required styl="fill">
 | 
			
		||||
		<span>{{ $t('password') }}</span>
 | 
			
		||||
		<span slot="prefix"><fa icon="lock"/></span>
 | 
			
		||||
	</ui-input>
 | 
			
		||||
	<ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" required styl="fill"/>
 | 
			
		||||
	<ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" required styl="fill">
 | 
			
		||||
		<span>{{ $t('@.2fa') }}</span>
 | 
			
		||||
		<span slot="prefix"><fa icon="gavel"/></span>
 | 
			
		||||
	</ui-input>
 | 
			
		||||
	<ui-button type="submit" :disabled="signing">{{ signing ? $t('signing-in') : $t('signin') }}</ui-button>
 | 
			
		||||
	<p v-if="meta && meta.enableTwitterIntegration" style="margin: 8px 0;"><a :href="`${apiUrl}/signin/twitter`">{{ $t('signin-with-twitter') }}</a></p>
 | 
			
		||||
	<p v-if="meta && meta.enableGithubIntegration"  style="margin: 8px 0;"><a :href="`${apiUrl}/signin/github`">{{ $t('signin-with-github') }}</a></p>
 | 
			
		||||
@@ -26,6 +29,7 @@ import { toUnicode } from 'punycode';
 | 
			
		||||
 | 
			
		||||
export default Vue.extend({
 | 
			
		||||
	i18n: i18n('common/views/components/signin.vue'),
 | 
			
		||||
 | 
			
		||||
	props: {
 | 
			
		||||
		withAvatar: {
 | 
			
		||||
			type: Boolean,
 | 
			
		||||
@@ -33,6 +37,7 @@ export default Vue.extend({
 | 
			
		||||
			default: true
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	data() {
 | 
			
		||||
		return {
 | 
			
		||||
			signing: false,
 | 
			
		||||
@@ -45,11 +50,13 @@ export default Vue.extend({
 | 
			
		||||
			meta: null
 | 
			
		||||
		};
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	created() {
 | 
			
		||||
		this.$root.getMeta().then(meta => {
 | 
			
		||||
			this.meta = meta;
 | 
			
		||||
		});
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	methods: {
 | 
			
		||||
		onUsernameChange() {
 | 
			
		||||
			this.$root.api('users/show', {
 | 
			
		||||
@@ -60,6 +67,7 @@ export default Vue.extend({
 | 
			
		||||
				this.user = null;
 | 
			
		||||
			});
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		onSubmit() {
 | 
			
		||||
			this.signing = true;
 | 
			
		||||
 | 
			
		||||
@@ -67,7 +75,7 @@ export default Vue.extend({
 | 
			
		||||
				username: this.username,
 | 
			
		||||
				password: this.password,
 | 
			
		||||
				token: this.user && this.user.twoFactorEnabled ? this.token : undefined
 | 
			
		||||
			}, true).then(res => {
 | 
			
		||||
			}).then(res => {
 | 
			
		||||
				localStorage.setItem('i', res.i);
 | 
			
		||||
				location.reload();
 | 
			
		||||
			}).catch(() => {
 | 
			
		||||
@@ -80,8 +88,6 @@ export default Vue.extend({
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="stylus" scoped>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.mk-signin
 | 
			
		||||
	color #555
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -50,6 +50,7 @@ import { toUnicode } from 'punycode';
 | 
			
		||||
 | 
			
		||||
export default Vue.extend({
 | 
			
		||||
	i18n: i18n('common/views/components/signup.vue'),
 | 
			
		||||
 | 
			
		||||
	data() {
 | 
			
		||||
		return {
 | 
			
		||||
			host: toUnicode(host),
 | 
			
		||||
@@ -64,6 +65,7 @@ export default Vue.extend({
 | 
			
		||||
			meta: null
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	computed: {
 | 
			
		||||
		shouldShowProfileUrl(): boolean {
 | 
			
		||||
			return (this.username != '' &&
 | 
			
		||||
@@ -72,17 +74,20 @@ export default Vue.extend({
 | 
			
		||||
				this.usernameState != 'max-range');
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	created() {
 | 
			
		||||
		this.$root.getMeta().then(meta => {
 | 
			
		||||
			this.meta = meta;
 | 
			
		||||
		});
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	mounted() {
 | 
			
		||||
		const head = document.getElementsByTagName('head')[0];
 | 
			
		||||
		const script = document.createElement('script');
 | 
			
		||||
		script.setAttribute('src', 'https://www.google.com/recaptcha/api.js');
 | 
			
		||||
		head.appendChild(script);
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	methods: {
 | 
			
		||||
		onChangeUsername() {
 | 
			
		||||
			if (this.username == '') {
 | 
			
		||||
@@ -111,6 +116,7 @@ export default Vue.extend({
 | 
			
		||||
				this.usernameState = 'error';
 | 
			
		||||
			});
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		onChangePassword() {
 | 
			
		||||
			if (this.password == '') {
 | 
			
		||||
				this.passwordStrength = '';
 | 
			
		||||
@@ -120,6 +126,7 @@ export default Vue.extend({
 | 
			
		||||
			const strength = getPasswordStrength(this.password);
 | 
			
		||||
			this.passwordStrength = strength > 0.7 ? 'high' : strength > 0.3 ? 'medium' : 'low';
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		onChangePasswordRetype() {
 | 
			
		||||
			if (this.retypedPassword == '') {
 | 
			
		||||
				this.passwordRetypeState = null;
 | 
			
		||||
@@ -128,18 +135,20 @@ export default Vue.extend({
 | 
			
		||||
 | 
			
		||||
			this.passwordRetypeState = this.password == this.retypedPassword ? 'match' : 'not-match';
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		onSubmit() {
 | 
			
		||||
			this.$root.api('signup', {
 | 
			
		||||
				username: this.username,
 | 
			
		||||
				password: this.password,
 | 
			
		||||
				invitationCode: this.invitationCode,
 | 
			
		||||
				'g-recaptcha-response': this.meta.enableRecaptcha ? (window as any).grecaptcha.getResponse() : null
 | 
			
		||||
			}, true).then(() => {
 | 
			
		||||
			}).then(() => {
 | 
			
		||||
				this.$root.api('signin', {
 | 
			
		||||
					username: this.username,
 | 
			
		||||
					password: this.password
 | 
			
		||||
				}, true).then(() => {
 | 
			
		||||
					location.href = '/';
 | 
			
		||||
				}).then(res => {
 | 
			
		||||
					localStorage.setItem('i', res.i);
 | 
			
		||||
					location.reload();
 | 
			
		||||
				});
 | 
			
		||||
			}).catch(() => {
 | 
			
		||||
				alert(this.$t('some-error'));
 | 
			
		||||
@@ -154,8 +163,6 @@ export default Vue.extend({
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="stylus" scoped>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.mk-signup
 | 
			
		||||
	min-width 302px
 | 
			
		||||
</style>
 | 
			
		||||
 
 | 
			
		||||
@@ -18,7 +18,7 @@
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
import Vue from 'vue';
 | 
			
		||||
import i18n from '../../../i18n';
 | 
			
		||||
import * as anime from 'animejs';
 | 
			
		||||
import anime from 'animejs';
 | 
			
		||||
 | 
			
		||||
export default Vue.extend({
 | 
			
		||||
	i18n: i18n('common/views/components/stream-indicator.vue'),
 | 
			
		||||
 
 | 
			
		||||
@@ -1,99 +1,104 @@
 | 
			
		||||
<template>
 | 
			
		||||
<div class="nicnklzforebnpfgasiypmpdaaglujqm">
 | 
			
		||||
	<label>
 | 
			
		||||
		<span><fa :icon="faSun"/> {{ $t('light-theme') }}</span>
 | 
			
		||||
		<ui-select v-model="light" :placeholder="$t('light-theme')">
 | 
			
		||||
			<optgroup :label="$t('light-themes')">
 | 
			
		||||
				<option v-for="x in lightThemes" :value="x.id" :key="x.id">{{ x.name }}</option>
 | 
			
		||||
			</optgroup>
 | 
			
		||||
			<optgroup :label="$t('dark-themes')">
 | 
			
		||||
				<option v-for="x in darkThemes" :value="x.id" :key="x.id">{{ x.name }}</option>
 | 
			
		||||
			</optgroup>
 | 
			
		||||
		</ui-select>
 | 
			
		||||
	</label>
 | 
			
		||||
<ui-card>
 | 
			
		||||
	<div slot="title"><fa icon="palette"/> {{ $t('theme') }}</div>
 | 
			
		||||
	<section class="nicnklzforebnpfgasiypmpdaaglujqm fit-top">
 | 
			
		||||
		<label>
 | 
			
		||||
			<ui-select v-model="light" :placeholder="$t('light-theme')">
 | 
			
		||||
				<span slot="label"><fa :icon="faSun"/> {{ $t('light-theme') }}</span>
 | 
			
		||||
				<optgroup :label="$t('light-themes')">
 | 
			
		||||
					<option v-for="x in lightThemes" :value="x.id" :key="x.id">{{ x.name }}</option>
 | 
			
		||||
				</optgroup>
 | 
			
		||||
				<optgroup :label="$t('dark-themes')">
 | 
			
		||||
					<option v-for="x in darkThemes" :value="x.id" :key="x.id">{{ x.name }}</option>
 | 
			
		||||
				</optgroup>
 | 
			
		||||
			</ui-select>
 | 
			
		||||
		</label>
 | 
			
		||||
 | 
			
		||||
	<label>
 | 
			
		||||
		<span><fa :icon="faMoon"/> {{ $t('dark-theme') }}</span>
 | 
			
		||||
		<ui-select v-model="dark" :placeholder="$t('dark-theme')">
 | 
			
		||||
			<optgroup :label="$t('dark-themes')">
 | 
			
		||||
				<option v-for="x in darkThemes" :value="x.id" :key="x.id">{{ x.name }}</option>
 | 
			
		||||
			</optgroup>
 | 
			
		||||
			<optgroup :label="$t('light-themes')">
 | 
			
		||||
				<option v-for="x in lightThemes" :value="x.id" :key="x.id">{{ x.name }}</option>
 | 
			
		||||
			</optgroup>
 | 
			
		||||
		</ui-select>
 | 
			
		||||
	</label>
 | 
			
		||||
		<label>
 | 
			
		||||
			<ui-select v-model="dark" :placeholder="$t('dark-theme')">
 | 
			
		||||
				<span slot="label"><fa :icon="faMoon"/> {{ $t('dark-theme') }}</span>
 | 
			
		||||
				<optgroup :label="$t('dark-themes')">
 | 
			
		||||
					<option v-for="x in darkThemes" :value="x.id" :key="x.id">{{ x.name }}</option>
 | 
			
		||||
				</optgroup>
 | 
			
		||||
				<optgroup :label="$t('light-themes')">
 | 
			
		||||
					<option v-for="x in lightThemes" :value="x.id" :key="x.id">{{ x.name }}</option>
 | 
			
		||||
				</optgroup>
 | 
			
		||||
			</ui-select>
 | 
			
		||||
		</label>
 | 
			
		||||
 | 
			
		||||
	<details class="creator">
 | 
			
		||||
		<summary><fa icon="palette"/> {{ $t('create-a-theme') }}</summary>
 | 
			
		||||
		<div>
 | 
			
		||||
			<span>{{ $t('base-theme') }}:</span>
 | 
			
		||||
			<ui-radio v-model="myThemeBase" value="light">{{ $t('base-theme-light') }}</ui-radio>
 | 
			
		||||
			<ui-radio v-model="myThemeBase" value="dark">{{ $t('base-theme-dark') }}</ui-radio>
 | 
			
		||||
		</div>
 | 
			
		||||
		<div>
 | 
			
		||||
			<ui-input v-model="myThemeName">
 | 
			
		||||
				<span>{{ $t('theme-name') }}</span>
 | 
			
		||||
			</ui-input>
 | 
			
		||||
			<ui-textarea v-model="myThemeDesc">
 | 
			
		||||
				<span>{{ $t('desc') }}</span>
 | 
			
		||||
			</ui-textarea>
 | 
			
		||||
		</div>
 | 
			
		||||
		<div>
 | 
			
		||||
			<div style="padding-bottom:8px;">{{ $t('primary-color') }}:</div>
 | 
			
		||||
			<color-picker v-model="myThemePrimary"/>
 | 
			
		||||
		</div>
 | 
			
		||||
		<div>
 | 
			
		||||
			<div style="padding-bottom:8px;">{{ $t('secondary-color') }}:</div>
 | 
			
		||||
			<color-picker v-model="myThemeSecondary"/>
 | 
			
		||||
		</div>
 | 
			
		||||
		<div>
 | 
			
		||||
			<div style="padding-bottom:8px;">{{ $t('text-color') }}:</div>
 | 
			
		||||
			<color-picker v-model="myThemeText"/>
 | 
			
		||||
		</div>
 | 
			
		||||
		<ui-button @click="preview()"><fa icon="eye"/> {{ $t('preview-created-theme') }}</ui-button>
 | 
			
		||||
		<ui-button primary @click="gen()"><fa :icon="['far', 'save']"/> {{ $t('save-created-theme') }}</ui-button>
 | 
			
		||||
	</details>
 | 
			
		||||
		<a href="https://assets.msky.cafe/theme/list" target="_blank">{{ $t('find-more-theme') }}</a>
 | 
			
		||||
 | 
			
		||||
	<details>
 | 
			
		||||
		<summary><fa icon="download"/> {{ $t('install-a-theme') }}</summary>
 | 
			
		||||
		<ui-button @click="import_()"><fa icon="file-import"/> {{ $t('import') }}</ui-button>
 | 
			
		||||
		<input ref="file" type="file" accept=".misskeytheme" style="display:none;" @change="onUpdateImportFile"/>
 | 
			
		||||
		<p>{{ $t('import-by-code') }}:</p>
 | 
			
		||||
		<ui-textarea v-model="installThemeCode">
 | 
			
		||||
			<span>{{ $t('theme-code') }}</span>
 | 
			
		||||
		</ui-textarea>
 | 
			
		||||
		<ui-button @click="() => install(this.installThemeCode)"><fa icon="check"/> {{ $t('install') }}</ui-button>
 | 
			
		||||
	</details>
 | 
			
		||||
		<details class="creator">
 | 
			
		||||
			<summary><fa icon="palette"/> {{ $t('create-a-theme') }}</summary>
 | 
			
		||||
			<div>
 | 
			
		||||
				<span>{{ $t('base-theme') }}:</span>
 | 
			
		||||
				<ui-radio v-model="myThemeBase" value="light">{{ $t('base-theme-light') }}</ui-radio>
 | 
			
		||||
				<ui-radio v-model="myThemeBase" value="dark">{{ $t('base-theme-dark') }}</ui-radio>
 | 
			
		||||
			</div>
 | 
			
		||||
			<div>
 | 
			
		||||
				<ui-input v-model="myThemeName">
 | 
			
		||||
					<span>{{ $t('theme-name') }}</span>
 | 
			
		||||
				</ui-input>
 | 
			
		||||
				<ui-textarea v-model="myThemeDesc">
 | 
			
		||||
					<span>{{ $t('desc') }}</span>
 | 
			
		||||
				</ui-textarea>
 | 
			
		||||
			</div>
 | 
			
		||||
			<div>
 | 
			
		||||
				<div style="padding-bottom:8px;">{{ $t('primary-color') }}:</div>
 | 
			
		||||
				<color-picker v-model="myThemePrimary"/>
 | 
			
		||||
			</div>
 | 
			
		||||
			<div>
 | 
			
		||||
				<div style="padding-bottom:8px;">{{ $t('secondary-color') }}:</div>
 | 
			
		||||
				<color-picker v-model="myThemeSecondary"/>
 | 
			
		||||
			</div>
 | 
			
		||||
			<div>
 | 
			
		||||
				<div style="padding-bottom:8px;">{{ $t('text-color') }}:</div>
 | 
			
		||||
				<color-picker v-model="myThemeText"/>
 | 
			
		||||
			</div>
 | 
			
		||||
			<ui-button @click="preview()"><fa icon="eye"/> {{ $t('preview-created-theme') }}</ui-button>
 | 
			
		||||
			<ui-button primary @click="gen()"><fa :icon="['far', 'save']"/> {{ $t('save-created-theme') }}</ui-button>
 | 
			
		||||
		</details>
 | 
			
		||||
 | 
			
		||||
	<details>
 | 
			
		||||
		<summary><fa icon="folder-open"/> {{ $t('manage-themes') }}</summary>
 | 
			
		||||
		<ui-select v-model="selectedThemeId" :placeholder="$t('select-theme')">
 | 
			
		||||
			<optgroup :label="$t('builtin-themes')">
 | 
			
		||||
				<option v-for="x in builtinThemes" :value="x.id" :key="x.id">{{ x.name }}</option>
 | 
			
		||||
			</optgroup>
 | 
			
		||||
			<optgroup :label="$t('my-themes')">
 | 
			
		||||
				<option v-for="x in installedThemes.filter(t => t.author == this.$store.state.i.username)" :value="x.id" :key="x.id">{{ x.name }}</option>
 | 
			
		||||
			</optgroup>
 | 
			
		||||
			<optgroup :label="$t('installed-themes')">
 | 
			
		||||
				<option v-for="x in installedThemes.filter(t => t.author != this.$store.state.i.username)" :value="x.id" :key="x.id">{{ x.name }}</option>
 | 
			
		||||
			</optgroup>
 | 
			
		||||
		</ui-select>
 | 
			
		||||
		<template v-if="selectedTheme">
 | 
			
		||||
			<ui-input readonly :value="selectedTheme.author">
 | 
			
		||||
				<span>{{ $t('author') }}</span>
 | 
			
		||||
			</ui-input>
 | 
			
		||||
			<ui-textarea v-if="selectedTheme.desc" readonly :value="selectedTheme.desc">
 | 
			
		||||
				<span>{{ $t('desc') }}</span>
 | 
			
		||||
			</ui-textarea>
 | 
			
		||||
			<ui-textarea readonly :value="selectedThemeCode">
 | 
			
		||||
		<details>
 | 
			
		||||
			<summary><fa icon="download"/> {{ $t('install-a-theme') }}</summary>
 | 
			
		||||
			<ui-button @click="import_()"><fa icon="file-import"/> {{ $t('import') }}</ui-button>
 | 
			
		||||
			<input ref="file" type="file" accept=".misskeytheme" style="display:none;" @change="onUpdateImportFile"/>
 | 
			
		||||
			<p>{{ $t('import-by-code') }}:</p>
 | 
			
		||||
			<ui-textarea v-model="installThemeCode">
 | 
			
		||||
				<span>{{ $t('theme-code') }}</span>
 | 
			
		||||
			</ui-textarea>
 | 
			
		||||
			<ui-button @click="export_()" link :download="`${selectedTheme.name}.misskeytheme`" ref="export"><fa icon="box"/> {{ $t('export') }}</ui-button>
 | 
			
		||||
			<ui-button @click="uninstall()" v-if="!builtinThemes.some(t => t.id == selectedTheme.id)"><fa :icon="['far', 'trash-alt']"/> {{ $t('uninstall') }}</ui-button>
 | 
			
		||||
		</template>
 | 
			
		||||
	</details>
 | 
			
		||||
</div>
 | 
			
		||||
			<ui-button @click="() => install(this.installThemeCode)"><fa icon="check"/> {{ $t('install') }}</ui-button>
 | 
			
		||||
		</details>
 | 
			
		||||
 | 
			
		||||
		<details>
 | 
			
		||||
			<summary><fa icon="folder-open"/> {{ $t('manage-themes') }}</summary>
 | 
			
		||||
			<ui-select v-model="selectedThemeId" :placeholder="$t('select-theme')">
 | 
			
		||||
				<optgroup :label="$t('builtin-themes')">
 | 
			
		||||
					<option v-for="x in builtinThemes" :value="x.id" :key="x.id">{{ x.name }}</option>
 | 
			
		||||
				</optgroup>
 | 
			
		||||
				<optgroup :label="$t('my-themes')">
 | 
			
		||||
					<option v-for="x in installedThemes.filter(t => t.author == this.$store.state.i.username)" :value="x.id" :key="x.id">{{ x.name }}</option>
 | 
			
		||||
				</optgroup>
 | 
			
		||||
				<optgroup :label="$t('installed-themes')">
 | 
			
		||||
					<option v-for="x in installedThemes.filter(t => t.author != this.$store.state.i.username)" :value="x.id" :key="x.id">{{ x.name }}</option>
 | 
			
		||||
				</optgroup>
 | 
			
		||||
			</ui-select>
 | 
			
		||||
			<template v-if="selectedTheme">
 | 
			
		||||
				<ui-input readonly :value="selectedTheme.author">
 | 
			
		||||
					<span>{{ $t('author') }}</span>
 | 
			
		||||
				</ui-input>
 | 
			
		||||
				<ui-textarea v-if="selectedTheme.desc" readonly :value="selectedTheme.desc">
 | 
			
		||||
					<span>{{ $t('desc') }}</span>
 | 
			
		||||
				</ui-textarea>
 | 
			
		||||
				<ui-textarea readonly tall :value="selectedThemeCode">
 | 
			
		||||
					<span>{{ $t('theme-code') }}</span>
 | 
			
		||||
				</ui-textarea>
 | 
			
		||||
				<ui-button @click="export_()" link :download="`${selectedTheme.name}.misskeytheme`" ref="export"><fa icon="box"/> {{ $t('export') }}</ui-button>
 | 
			
		||||
				<ui-button @click="uninstall()" v-if="!builtinThemes.some(t => t.id == selectedTheme.id)"><fa :icon="['far', 'trash-alt']"/> {{ $t('uninstall') }}</ui-button>
 | 
			
		||||
			</template>
 | 
			
		||||
		</details>
 | 
			
		||||
	</section>
 | 
			
		||||
</ui-card>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
@@ -331,8 +336,13 @@ export default Vue.extend({
 | 
			
		||||
 | 
			
		||||
<style lang="stylus" scoped>
 | 
			
		||||
.nicnklzforebnpfgasiypmpdaaglujqm
 | 
			
		||||
	> a
 | 
			
		||||
		display block
 | 
			
		||||
		margin-top -16px
 | 
			
		||||
		margin-bottom 16px
 | 
			
		||||
 | 
			
		||||
	> details
 | 
			
		||||
		border-top solid 1px var(--faceDivider)
 | 
			
		||||
		border-top solid var(--lineWidth) var(--faceDivider)
 | 
			
		||||
 | 
			
		||||
		> summary
 | 
			
		||||
			padding 16px 0
 | 
			
		||||
@@ -343,5 +353,5 @@ export default Vue.extend({
 | 
			
		||||
	> .creator
 | 
			
		||||
		> div
 | 
			
		||||
			padding 16px 0
 | 
			
		||||
			border-bottom solid 1px var(--faceDivider)
 | 
			
		||||
			border-bottom solid var(--lineWidth) var(--faceDivider)
 | 
			
		||||
</style>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
<template>
 | 
			
		||||
<time class="mk-time">
 | 
			
		||||
<time class="mk-time" :title="absolute">
 | 
			
		||||
	<span v-if=" mode == 'relative' ">{{ relative }}</span>
 | 
			
		||||
	<span v-if=" mode == 'absolute' ">{{ absolute }}</span>
 | 
			
		||||
	<span v-if=" mode == 'detail' ">{{ absolute }} ({{ relative }})</span>
 | 
			
		||||
@@ -33,14 +33,7 @@ export default Vue.extend({
 | 
			
		||||
			return typeof this.time == 'string' ? new Date(this.time) : this.time;
 | 
			
		||||
		},
 | 
			
		||||
		absolute(): string {
 | 
			
		||||
			const time = this._time;
 | 
			
		||||
			return (
 | 
			
		||||
				time.getFullYear()    + '年' +
 | 
			
		||||
				(time.getMonth() + 1) + '月' +
 | 
			
		||||
				time.getDate()        + '日' +
 | 
			
		||||
				' ' +
 | 
			
		||||
				time.getHours()       + '時' +
 | 
			
		||||
				time.getMinutes()     + '分');
 | 
			
		||||
			return this._time.toLocaleString();
 | 
			
		||||
		},
 | 
			
		||||
		relative(): string {
 | 
			
		||||
			const time = this._time;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
<template>
 | 
			
		||||
<component class="dmtdnykelhudezerjlfpbhgovrgnqqgr"
 | 
			
		||||
	:is="link ? 'a' : 'button'"
 | 
			
		||||
	:class="[styl, { inline, primary }]"
 | 
			
		||||
	:class="{ inline, primary, wait }"
 | 
			
		||||
	:type="type"
 | 
			
		||||
	@click="$emit('click')"
 | 
			
		||||
	@mousedown="onMousedown"
 | 
			
		||||
@@ -48,11 +48,11 @@ export default Vue.extend({
 | 
			
		||||
			required: false,
 | 
			
		||||
			default: false
 | 
			
		||||
		},
 | 
			
		||||
	},
 | 
			
		||||
	data() {
 | 
			
		||||
		return {
 | 
			
		||||
			styl: 'fill'
 | 
			
		||||
		};
 | 
			
		||||
		wait: {
 | 
			
		||||
			type: Boolean,
 | 
			
		||||
			required: false,
 | 
			
		||||
			default: false
 | 
			
		||||
		},
 | 
			
		||||
	},
 | 
			
		||||
	mounted() {
 | 
			
		||||
		if (this.autofocus) {
 | 
			
		||||
@@ -121,6 +121,24 @@ export default Vue.extend({
 | 
			
		||||
	box-shadow none
 | 
			
		||||
	text-decoration none
 | 
			
		||||
	user-select none
 | 
			
		||||
	color var(--text)
 | 
			
		||||
	background var(--buttonBg)
 | 
			
		||||
 | 
			
		||||
	&:not(:disabled):hover
 | 
			
		||||
		background var(--buttonHoverBg)
 | 
			
		||||
 | 
			
		||||
	&:not(:disabled):active
 | 
			
		||||
		background var(--buttonActiveBg)
 | 
			
		||||
 | 
			
		||||
	&.primary
 | 
			
		||||
		color var(--primaryForeground)
 | 
			
		||||
		background var(--primary)
 | 
			
		||||
 | 
			
		||||
		&:not(:disabled):hover
 | 
			
		||||
			background var(--primaryLighten5)
 | 
			
		||||
 | 
			
		||||
		&:not(:disabled):active
 | 
			
		||||
			background var(--primaryDarken5)
 | 
			
		||||
 | 
			
		||||
	*
 | 
			
		||||
		pointer-events none
 | 
			
		||||
@@ -152,35 +170,25 @@ export default Vue.extend({
 | 
			
		||||
	&.primary
 | 
			
		||||
		font-weight bold
 | 
			
		||||
 | 
			
		||||
	&.fill
 | 
			
		||||
		color var(--text)
 | 
			
		||||
		background var(--buttonBg)
 | 
			
		||||
	&.wait
 | 
			
		||||
		background linear-gradient(
 | 
			
		||||
			45deg,
 | 
			
		||||
			var(--primaryDarken10) 25%,
 | 
			
		||||
			var(--primary)              25%,
 | 
			
		||||
			var(--primary)              50%,
 | 
			
		||||
			var(--primaryDarken10) 50%,
 | 
			
		||||
			var(--primaryDarken10) 75%,
 | 
			
		||||
			var(--primary)              75%,
 | 
			
		||||
			var(--primary)
 | 
			
		||||
		)
 | 
			
		||||
		background-size 32px 32px
 | 
			
		||||
		animation stripe-bg 1.5s linear infinite
 | 
			
		||||
		opacity 0.7
 | 
			
		||||
		cursor wait
 | 
			
		||||
 | 
			
		||||
		&:not(:disabled):hover
 | 
			
		||||
			background var(--buttonHoverBg)
 | 
			
		||||
 | 
			
		||||
		&:not(:disabled):active
 | 
			
		||||
			background var(--buttonActiveBg)
 | 
			
		||||
 | 
			
		||||
		&.primary
 | 
			
		||||
			color var(--primaryForeground)
 | 
			
		||||
			background var(--primary)
 | 
			
		||||
 | 
			
		||||
			&:not(:disabled):hover
 | 
			
		||||
				background var(--primaryLighten5)
 | 
			
		||||
 | 
			
		||||
			&:not(:disabled):active
 | 
			
		||||
				background var(--primaryDarken5)
 | 
			
		||||
 | 
			
		||||
	&:not(.fill)
 | 
			
		||||
		color var(--primary)
 | 
			
		||||
		background none
 | 
			
		||||
 | 
			
		||||
		&:not(:disabled):hover
 | 
			
		||||
			color var(--primaryDarken5)
 | 
			
		||||
 | 
			
		||||
		&:not(:disabled):active
 | 
			
		||||
			background var(--primaryAlpha03)
 | 
			
		||||
		@keyframes stripe-bg
 | 
			
		||||
			from {background-position: 0 0;}
 | 
			
		||||
			to   {background-position: -64px 32px;}
 | 
			
		||||
 | 
			
		||||
	> .ripples
 | 
			
		||||
		position absolute
 | 
			
		||||
 
 | 
			
		||||
@@ -41,7 +41,7 @@ export default Vue.extend({
 | 
			
		||||
 | 
			
		||||
	> section
 | 
			
		||||
		padding 20px 16px
 | 
			
		||||
		border-top solid 1px var(--faceDivider)
 | 
			
		||||
		border-top solid var(--lineWidth) var(--faceDivider)
 | 
			
		||||
 | 
			
		||||
		@media (min-width 500px)
 | 
			
		||||
			padding 32px
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
<template>
 | 
			
		||||
<div class="vnxwkwuf" :class="{ inputs, noGrow }">
 | 
			
		||||
<div class="vnxwkwuf" :class="{ inputs, noGrow }" :data-children-count="children">
 | 
			
		||||
	<slot></slot>
 | 
			
		||||
</div>
 | 
			
		||||
</template>
 | 
			
		||||
@@ -21,6 +21,16 @@ export default Vue.extend({
 | 
			
		||||
			required: false,
 | 
			
		||||
			default: false
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
	data() {
 | 
			
		||||
		return {
 | 
			
		||||
			children: 0
 | 
			
		||||
		};
 | 
			
		||||
	},
 | 
			
		||||
	mounted() {
 | 
			
		||||
		this.$nextTick(() => {
 | 
			
		||||
			this.children = this.$slots.default.length;
 | 
			
		||||
		});
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
@@ -48,4 +58,19 @@ export default Vue.extend({
 | 
			
		||||
	> *:not(:last-child)
 | 
			
		||||
		margin-right 16px !important
 | 
			
		||||
 | 
			
		||||
	&[data-children-count="3"]
 | 
			
		||||
		@media (max-width 600px)
 | 
			
		||||
			display block
 | 
			
		||||
 | 
			
		||||
			> *
 | 
			
		||||
				display block
 | 
			
		||||
				width 100% !important
 | 
			
		||||
				margin 16px 0 !important
 | 
			
		||||
 | 
			
		||||
				&:first-child
 | 
			
		||||
					margin-top 0 !important
 | 
			
		||||
 | 
			
		||||
				&:last-child
 | 
			
		||||
					margin-bottom 0 !important
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
 
 | 
			
		||||
@@ -6,6 +6,7 @@
 | 
			
		||||
			<div class="value" ref="passwordMetar"></div>
 | 
			
		||||
		</div>
 | 
			
		||||
		<span class="label" ref="label"><slot></slot></span>
 | 
			
		||||
		<span class="title" ref="title"><slot name="title"></slot></span>
 | 
			
		||||
		<div class="prefix" ref="prefix"><slot name="prefix"></slot></div>
 | 
			
		||||
		<template v-if="type != 'file'">
 | 
			
		||||
			<input ref="input"
 | 
			
		||||
@@ -38,6 +39,12 @@
 | 
			
		||||
		</template>
 | 
			
		||||
		<div class="suffix" ref="suffix"><slot name="suffix"></slot></div>
 | 
			
		||||
	</div>
 | 
			
		||||
	<div class="toggle" v-if="withPasswordToggle">
 | 
			
		||||
		<a @click='togglePassword'>
 | 
			
		||||
			<span v-if="type == 'password'"><fa :icon="['fa', 'eye']"/> {{ $t('@.show-password') }}</span>
 | 
			
		||||
			<span v-if="type != 'password'"><fa :icon="['far', 'eye-slash']"/> {{ $t('@.hide-password') }}</span>
 | 
			
		||||
		</a>
 | 
			
		||||
	</div>
 | 
			
		||||
	<div class="desc"><slot name="desc"></slot></div>
 | 
			
		||||
</div>
 | 
			
		||||
</template>
 | 
			
		||||
@@ -96,6 +103,11 @@ export default Vue.extend({
 | 
			
		||||
			required: false,
 | 
			
		||||
			default: false
 | 
			
		||||
		},
 | 
			
		||||
		withPasswordToggle: {
 | 
			
		||||
			type: Boolean,
 | 
			
		||||
			required: false,
 | 
			
		||||
			default: false
 | 
			
		||||
		},
 | 
			
		||||
		inline: {
 | 
			
		||||
			type: Boolean,
 | 
			
		||||
			required: false,
 | 
			
		||||
@@ -177,6 +189,13 @@ export default Vue.extend({
 | 
			
		||||
		focus() {
 | 
			
		||||
			this.$refs.input.focus();
 | 
			
		||||
		},
 | 
			
		||||
		togglePassword() {
 | 
			
		||||
			if (this.type == 'password') {
 | 
			
		||||
				this.type = 'text'
 | 
			
		||||
			} else {
 | 
			
		||||
				this.type = 'password'
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
		chooseFile() {
 | 
			
		||||
			this.$refs.file.click();
 | 
			
		||||
		},
 | 
			
		||||
@@ -281,6 +300,20 @@ root(fill)
 | 
			
		||||
			transform-origin top left
 | 
			
		||||
			transform scale(1)
 | 
			
		||||
 | 
			
		||||
		> .title
 | 
			
		||||
			position absolute
 | 
			
		||||
			z-index 1
 | 
			
		||||
			top fill ? -24px : -17px
 | 
			
		||||
			left 0 !important
 | 
			
		||||
			pointer-events none
 | 
			
		||||
			font-size 16px
 | 
			
		||||
			line-height 32px
 | 
			
		||||
			color var(--inputLabel)
 | 
			
		||||
			pointer-events none
 | 
			
		||||
			//will-change transform
 | 
			
		||||
			transform-origin top left
 | 
			
		||||
			transform scale(.75)
 | 
			
		||||
 | 
			
		||||
		> input
 | 
			
		||||
			display block
 | 
			
		||||
			width 100%
 | 
			
		||||
@@ -341,6 +374,17 @@ root(fill)
 | 
			
		||||
			if fill
 | 
			
		||||
				padding-right 12px
 | 
			
		||||
 | 
			
		||||
	> .toggle
 | 
			
		||||
		cursor pointer
 | 
			
		||||
		padding-left 0.5em
 | 
			
		||||
		font-size 0.7em
 | 
			
		||||
		opacity 0.7
 | 
			
		||||
		text-align left
 | 
			
		||||
 | 
			
		||||
		> a
 | 
			
		||||
			color var(--inputLabel)
 | 
			
		||||
			text-decoration none
 | 
			
		||||
 | 
			
		||||
	> .desc
 | 
			
		||||
		margin 6px 0
 | 
			
		||||
		font-size 13px
 | 
			
		||||
 
 | 
			
		||||
@@ -25,11 +25,9 @@ export default Vue.extend({
 | 
			
		||||
	},
 | 
			
		||||
	props: {
 | 
			
		||||
		model: {
 | 
			
		||||
			type: String,
 | 
			
		||||
			required: false
 | 
			
		||||
		},
 | 
			
		||||
		value: {
 | 
			
		||||
			type: String,
 | 
			
		||||
			required: false
 | 
			
		||||
		},
 | 
			
		||||
		disabled: {
 | 
			
		||||
@@ -66,10 +64,10 @@ export default Vue.extend({
 | 
			
		||||
 | 
			
		||||
	&.checked
 | 
			
		||||
		> .button
 | 
			
		||||
			border-color var(--primary)
 | 
			
		||||
			border-color var(--radioActive)
 | 
			
		||||
 | 
			
		||||
			&:after
 | 
			
		||||
				background-color var(--primary)
 | 
			
		||||
				background-color var(--radioActive)
 | 
			
		||||
				transform scale(1)
 | 
			
		||||
				opacity 1
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -77,11 +77,11 @@ export default Vue.extend({
 | 
			
		||||
 | 
			
		||||
	&.checked
 | 
			
		||||
		> .button
 | 
			
		||||
			background-color var(--primaryAlpha04)
 | 
			
		||||
			border-color var(--primaryAlpha04)
 | 
			
		||||
			background-color var(--switchActiveTrack)
 | 
			
		||||
			border-color var(--switchActiveTrack)
 | 
			
		||||
 | 
			
		||||
			> *
 | 
			
		||||
				background-color var(--primary)
 | 
			
		||||
				background-color var(--switchActive)
 | 
			
		||||
				transform translateX(14px)
 | 
			
		||||
 | 
			
		||||
	> input
 | 
			
		||||
 
 | 
			
		||||
@@ -8,16 +8,16 @@
 | 
			
		||||
	</blockquote>
 | 
			
		||||
</div>
 | 
			
		||||
<div v-else class="mk-url-preview">
 | 
			
		||||
	<a :class="{ mini }" :href="url" target="_blank" :title="url" v-if="!fetching">
 | 
			
		||||
	<a :class="{ mini, compact }" :href="url" target="_blank" :title="url" v-if="!fetching">
 | 
			
		||||
		<div class="thumbnail" v-if="thumbnail" :style="`background-image: url(${thumbnail})`"></div>
 | 
			
		||||
		<article>
 | 
			
		||||
			<header>
 | 
			
		||||
				<h1>{{ title }}</h1>
 | 
			
		||||
				<h1 :title="title">{{ title }}</h1>
 | 
			
		||||
			</header>
 | 
			
		||||
			<p>{{ description.length > 85 ? description.slice(0, 85) + '…' : description }}</p>
 | 
			
		||||
			<p v-if="description" :title="description">{{ description.length > 85 ? description.slice(0, 85) + '…' : description }}</p>
 | 
			
		||||
			<footer>
 | 
			
		||||
				<img class="icon" v-if="icon" :src="icon"/>
 | 
			
		||||
				<p>{{ sitename }}</p>
 | 
			
		||||
				<p :title="sitename">{{ sitename }}</p>
 | 
			
		||||
			</footer>
 | 
			
		||||
		</article>
 | 
			
		||||
	</a>
 | 
			
		||||
@@ -120,6 +120,12 @@ export default Vue.extend({
 | 
			
		||||
			default: false
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		compact: {
 | 
			
		||||
			type: Boolean,
 | 
			
		||||
			required: false,
 | 
			
		||||
			default: false
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		mini: {
 | 
			
		||||
			type: Boolean,
 | 
			
		||||
			required: false,
 | 
			
		||||
@@ -170,6 +176,9 @@ export default Vue.extend({
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (url.hostname === 'music.youtube.com')
 | 
			
		||||
			url.hostname = 'youtube.com';
 | 
			
		||||
 | 
			
		||||
		fetch(`/url?url=${encodeURIComponent(this.url)}`).then(res => {
 | 
			
		||||
			res.json().then(info => {
 | 
			
		||||
				if (info.url == null) return;
 | 
			
		||||
@@ -204,7 +213,7 @@ export default Vue.extend({
 | 
			
		||||
	> a
 | 
			
		||||
		display block
 | 
			
		||||
		font-size 14px
 | 
			
		||||
		border solid 1px var(--urlPreviewBorder)
 | 
			
		||||
		border solid var(--lineWidth) var(--urlPreviewBorder)
 | 
			
		||||
		border-radius 4px
 | 
			
		||||
		overflow hidden
 | 
			
		||||
 | 
			
		||||
@@ -299,6 +308,23 @@ export default Vue.extend({
 | 
			
		||||
						width 12px
 | 
			
		||||
						height 12px
 | 
			
		||||
 | 
			
		||||
			&.compact
 | 
			
		||||
				> .thumbnail
 | 
			
		||||
					position: absolute
 | 
			
		||||
					width 56px
 | 
			
		||||
					height 100%
 | 
			
		||||
 | 
			
		||||
				> article
 | 
			
		||||
					left 56px
 | 
			
		||||
					width calc(100% - 56px)
 | 
			
		||||
					padding 4px
 | 
			
		||||
 | 
			
		||||
					> header
 | 
			
		||||
						margin-bottom 2px
 | 
			
		||||
 | 
			
		||||
					> footer
 | 
			
		||||
						margin-top 2px
 | 
			
		||||
 | 
			
		||||
		&.mini
 | 
			
		||||
			font-size 10px
 | 
			
		||||
 | 
			
		||||
@@ -322,4 +348,27 @@ export default Vue.extend({
 | 
			
		||||
						width 12px
 | 
			
		||||
						height 12px
 | 
			
		||||
 | 
			
		||||
			&.compact
 | 
			
		||||
				> .thumbnail
 | 
			
		||||
					position: absolute
 | 
			
		||||
					width 56px
 | 
			
		||||
					height 100%
 | 
			
		||||
 | 
			
		||||
				> article
 | 
			
		||||
					left 56px
 | 
			
		||||
					width calc(100% - 56px)
 | 
			
		||||
					padding 4px
 | 
			
		||||
 | 
			
		||||
					> header
 | 
			
		||||
						margin-bottom 2px
 | 
			
		||||
 | 
			
		||||
					> footer
 | 
			
		||||
						margin-top 2px
 | 
			
		||||
 | 
			
		||||
		&.compact
 | 
			
		||||
			> article
 | 
			
		||||
				> header h1, p, footer
 | 
			
		||||
					overflow: hidden;
 | 
			
		||||
					white-space: nowrap;
 | 
			
		||||
					text-overflow: ellipsis;
 | 
			
		||||
</style>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										150
									
								
								src/client/app/common/views/components/user-list-editor.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										150
									
								
								src/client/app/common/views/components/user-list-editor.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,150 @@
 | 
			
		||||
<template>
 | 
			
		||||
<div class="cudqjmnl">
 | 
			
		||||
	<ui-card>
 | 
			
		||||
		<div slot="title"><fa :icon="faList"/> {{ list.title }}</div>
 | 
			
		||||
 | 
			
		||||
		<section>
 | 
			
		||||
			<ui-button @click="rename"><fa :icon="faICursor"/> {{ $t('rename') }}</ui-button>
 | 
			
		||||
			<ui-button @click="del"><fa :icon="faTrashAlt"/> {{ $t('delete') }}</ui-button>
 | 
			
		||||
		</section>
 | 
			
		||||
	</ui-card>
 | 
			
		||||
 | 
			
		||||
	<ui-card>
 | 
			
		||||
		<div slot="title"><fa :icon="faUsers"/> {{ $t('users') }}</div>
 | 
			
		||||
 | 
			
		||||
		<section>
 | 
			
		||||
			<sequential-entrance animation="entranceFromTop" delay="25">
 | 
			
		||||
				<div class="phcqulfl" v-for="user in users">
 | 
			
		||||
					<div>
 | 
			
		||||
						<a :href="user | userPage">
 | 
			
		||||
							<mk-avatar class="avatar" :user="user" :disable-link="true"/>
 | 
			
		||||
						</a>
 | 
			
		||||
					</div>
 | 
			
		||||
					<div>
 | 
			
		||||
						<header>
 | 
			
		||||
							<b><mk-user-name :user="user"/></b>
 | 
			
		||||
							<span class="username">@{{ user | acct }}</span>
 | 
			
		||||
						</header>
 | 
			
		||||
						<div>
 | 
			
		||||
							<a @click="remove(user)">{{ $t('remove-user') }}</a>
 | 
			
		||||
						</div>
 | 
			
		||||
					</div>
 | 
			
		||||
				</div>
 | 
			
		||||
			</sequential-entrance>
 | 
			
		||||
		</section>
 | 
			
		||||
	</ui-card>
 | 
			
		||||
</div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
import Vue from 'vue';
 | 
			
		||||
import i18n from '../../../i18n';
 | 
			
		||||
import { faList, faICursor, faUsers } from '@fortawesome/free-solid-svg-icons';
 | 
			
		||||
import { faTrashAlt } from '@fortawesome/free-regular-svg-icons';
 | 
			
		||||
 | 
			
		||||
export default Vue.extend({
 | 
			
		||||
	i18n: i18n('common/views/components/user-list-editor.vue'),
 | 
			
		||||
 | 
			
		||||
	props: {
 | 
			
		||||
		list: {
 | 
			
		||||
			required: true
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	data() {
 | 
			
		||||
		return {
 | 
			
		||||
			users: [],
 | 
			
		||||
			faList, faICursor, faTrashAlt, faUsers
 | 
			
		||||
		};
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	mounted() {
 | 
			
		||||
		this.fetchUsers();
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	methods: {
 | 
			
		||||
		fetchUsers() {
 | 
			
		||||
			this.$root.api('users/show', {
 | 
			
		||||
				userIds: this.list.userIds
 | 
			
		||||
			}).then(users => {
 | 
			
		||||
				this.users = users;
 | 
			
		||||
			});
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		rename() {
 | 
			
		||||
			this.$root.dialog({
 | 
			
		||||
				title: this.$t('rename'),
 | 
			
		||||
				input: {
 | 
			
		||||
					default: this.list.title
 | 
			
		||||
				}
 | 
			
		||||
			}).then(({ canceled, result: title }) => {
 | 
			
		||||
				if (canceled) return;
 | 
			
		||||
				this.$root.api('users/lists/update', {
 | 
			
		||||
					listId: this.list.id,
 | 
			
		||||
					title: title
 | 
			
		||||
				});
 | 
			
		||||
			});
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		del() {
 | 
			
		||||
			this.$root.dialog({
 | 
			
		||||
				type: 'warning',
 | 
			
		||||
				text: this.$t('delete-are-you-sure').replace('$1', this.list.title),
 | 
			
		||||
				showCancelButton: true
 | 
			
		||||
			}).then(({ canceled }) => {
 | 
			
		||||
				if (canceled) return;
 | 
			
		||||
 | 
			
		||||
				this.$root.api('users/lists/delete', {
 | 
			
		||||
					listId: this.list.id
 | 
			
		||||
				}).then(() => {
 | 
			
		||||
					this.$root.dialog({
 | 
			
		||||
						type: 'success',
 | 
			
		||||
						text: this.$t('deleted')
 | 
			
		||||
					});
 | 
			
		||||
				}).catch(e => {
 | 
			
		||||
					this.$root.dialog({
 | 
			
		||||
						type: 'error',
 | 
			
		||||
						text: e
 | 
			
		||||
					});
 | 
			
		||||
				});
 | 
			
		||||
			});
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		remove(user: any) {
 | 
			
		||||
			this.$root.api('users/lists/pull', {
 | 
			
		||||
				listId: this.list.id,
 | 
			
		||||
				userId: user.id
 | 
			
		||||
			}).then(() => {
 | 
			
		||||
				this.fetchUsers();
 | 
			
		||||
			});
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="stylus" scoped>
 | 
			
		||||
.cudqjmnl
 | 
			
		||||
	.phcqulfl
 | 
			
		||||
		display flex
 | 
			
		||||
		padding 16px 0
 | 
			
		||||
		border-top solid 1px var(--faceDivider)
 | 
			
		||||
 | 
			
		||||
		> div:first-child
 | 
			
		||||
			> a
 | 
			
		||||
				> .avatar
 | 
			
		||||
					width 64px
 | 
			
		||||
					height 64px
 | 
			
		||||
 | 
			
		||||
		> div:last-child
 | 
			
		||||
			flex 1
 | 
			
		||||
			padding-left 16px
 | 
			
		||||
 | 
			
		||||
			@media (max-width 500px)
 | 
			
		||||
				font-size 14px
 | 
			
		||||
 | 
			
		||||
			> header
 | 
			
		||||
				> .username
 | 
			
		||||
					margin-left 8px
 | 
			
		||||
					opacity 0.7
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
							
								
								
									
										154
									
								
								src/client/app/common/views/components/user-menu.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										154
									
								
								src/client/app/common/views/components/user-menu.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,154 @@
 | 
			
		||||
<template>
 | 
			
		||||
<div style="position:initial">
 | 
			
		||||
	<mk-menu :source="source" :items="items" @closed="closed"/>
 | 
			
		||||
</div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
import Vue from 'vue';
 | 
			
		||||
import i18n from '../../../i18n';
 | 
			
		||||
import copyToClipboard from '../../../common/scripts/copy-to-clipboard';
 | 
			
		||||
import { faExclamationCircle } from '@fortawesome/free-solid-svg-icons';
 | 
			
		||||
 | 
			
		||||
export default Vue.extend({
 | 
			
		||||
	i18n: i18n('common/views/components/user-menu.vue'),
 | 
			
		||||
 | 
			
		||||
	props: ['user', 'source'],
 | 
			
		||||
 | 
			
		||||
	data() {
 | 
			
		||||
		let menu = [{
 | 
			
		||||
			icon: ['fas', 'at'],
 | 
			
		||||
			text: this.$t('mention'),
 | 
			
		||||
			action: () => {
 | 
			
		||||
				this.$post({ mention: this.user });
 | 
			
		||||
			}
 | 
			
		||||
		}, null, {
 | 
			
		||||
			icon: ['fas', 'list'],
 | 
			
		||||
			text: this.$t('push-to-list'),
 | 
			
		||||
			action: this.pushList
 | 
			
		||||
		}, null, {
 | 
			
		||||
			icon: this.user.isMuted ? ['fas', 'eye'] : ['far', 'eye-slash'],
 | 
			
		||||
			text: this.user.isMuted ? this.$t('unmute') : this.$t('mute'),
 | 
			
		||||
			action: this.toggleMute
 | 
			
		||||
		}, {
 | 
			
		||||
			icon: 'ban',
 | 
			
		||||
			text: this.user.isBlocking ? this.$t('unblock') : this.$t('block'),
 | 
			
		||||
			action: this.toggleBlock
 | 
			
		||||
		}, null, {
 | 
			
		||||
			icon: faExclamationCircle,
 | 
			
		||||
			text: this.$t('report-abuse'),
 | 
			
		||||
			action: this.reportAbuse
 | 
			
		||||
		}];
 | 
			
		||||
 | 
			
		||||
		return {
 | 
			
		||||
			items: menu
 | 
			
		||||
		};
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	methods: {
 | 
			
		||||
		closed() {
 | 
			
		||||
			this.$nextTick(() => {
 | 
			
		||||
				this.destroyDom();
 | 
			
		||||
			});
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		async pushList() {
 | 
			
		||||
			const lists = await this.$root.api('users/lists/list');
 | 
			
		||||
			const { canceled, result: listId } = await this.$root.dialog({
 | 
			
		||||
				type: null,
 | 
			
		||||
				title: this.$t('select-list'),
 | 
			
		||||
				select: {
 | 
			
		||||
					items: lists.map(list => ({
 | 
			
		||||
						value: list.id, text: list.title
 | 
			
		||||
					}))
 | 
			
		||||
				},
 | 
			
		||||
				showCancelButton: true
 | 
			
		||||
			});
 | 
			
		||||
			if (canceled) return;
 | 
			
		||||
			await this.$root.api('users/lists/push', {
 | 
			
		||||
				listId: listId,
 | 
			
		||||
				userId: this.user.id
 | 
			
		||||
			});
 | 
			
		||||
			this.$root.dialog({
 | 
			
		||||
				type: 'success',
 | 
			
		||||
				splash: true
 | 
			
		||||
			});
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		toggleMute() {
 | 
			
		||||
			if (this.user.isMuted) {
 | 
			
		||||
				this.$root.api('mute/delete', {
 | 
			
		||||
					userId: this.user.id
 | 
			
		||||
				}).then(() => {
 | 
			
		||||
					this.user.isMuted = false;
 | 
			
		||||
				}, () => {
 | 
			
		||||
					this.$root.dialog({
 | 
			
		||||
						type: 'error',
 | 
			
		||||
						text: e
 | 
			
		||||
					});
 | 
			
		||||
				});
 | 
			
		||||
			} else {
 | 
			
		||||
				this.$root.api('mute/create', {
 | 
			
		||||
					userId: this.user.id
 | 
			
		||||
				}).then(() => {
 | 
			
		||||
					this.user.isMuted = true;
 | 
			
		||||
				}, () => {
 | 
			
		||||
					this.$root.dialog({
 | 
			
		||||
						type: 'error',
 | 
			
		||||
						text: e
 | 
			
		||||
					});
 | 
			
		||||
				});
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		toggleBlock() {
 | 
			
		||||
			if (this.user.isBlocking) {
 | 
			
		||||
				this.$root.api('blocking/delete', {
 | 
			
		||||
					userId: this.user.id
 | 
			
		||||
				}).then(() => {
 | 
			
		||||
					this.user.isBlocking = false;
 | 
			
		||||
				}, () => {
 | 
			
		||||
					this.$root.dialog({
 | 
			
		||||
						type: 'error',
 | 
			
		||||
						text: e
 | 
			
		||||
					});
 | 
			
		||||
				});
 | 
			
		||||
			} else {
 | 
			
		||||
				this.$root.api('blocking/create', {
 | 
			
		||||
					userId: this.user.id
 | 
			
		||||
				}).then(() => {
 | 
			
		||||
					this.user.isBlocking = true;
 | 
			
		||||
				}, () => {
 | 
			
		||||
					this.$root.dialog({
 | 
			
		||||
						type: 'error',
 | 
			
		||||
						text: e
 | 
			
		||||
					});
 | 
			
		||||
				});
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		async reportAbuse() {
 | 
			
		||||
			const reported = this.$t('report-abuse-reported'); // なぜか後で参照すると null になるので最初にメモリに確保しておく
 | 
			
		||||
			const { canceled, result: comment } = await this.$root.dialog({
 | 
			
		||||
				title: this.$t('report-abuse-detail'),
 | 
			
		||||
				input: true
 | 
			
		||||
			});
 | 
			
		||||
			if (canceled) return;
 | 
			
		||||
			this.$root.api('users/report-abuse', {
 | 
			
		||||
				userId: this.user.id,
 | 
			
		||||
				comment: comment
 | 
			
		||||
			}).then(() => {
 | 
			
		||||
				this.$root.dialog({
 | 
			
		||||
					type: 'success',
 | 
			
		||||
					text: reported
 | 
			
		||||
				});
 | 
			
		||||
			}, e => {
 | 
			
		||||
				this.$root.dialog({
 | 
			
		||||
					type: 'error',
 | 
			
		||||
					text: e
 | 
			
		||||
				});
 | 
			
		||||
			});
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user