Compare commits
	
		
			517 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					008d950a39 | ||
| 
						 | 
					22d5862afb | ||
| 
						 | 
					de569147a5 | ||
| 
						 | 
					a82c3db750 | ||
| 
						 | 
					80706d10af | ||
| 
						 | 
					93f01ed4df | ||
| 
						 | 
					a3a28e5557 | ||
| 
						 | 
					8948a0d3a4 | ||
| 
						 | 
					d849ea9b41 | ||
| 
						 | 
					0144575f3f | ||
| 
						 | 
					bdbe646ca7 | ||
| 
						 | 
					1a1483a242 | ||
| 
						 | 
					962346785b | ||
| 
						 | 
					a73da3cd70 | ||
| 
						 | 
					9c27d0ae3f | ||
| 
						 | 
					525d5218c1 | ||
| 
						 | 
					e23b13ec7f | ||
| 
						 | 
					29b000e03c | ||
| 
						 | 
					6a7b0df810 | ||
| 
						 | 
					4142de9195 | ||
| 
						 | 
					9195e1be00 | ||
| 
						 | 
					75382d13fd | ||
| 
						 | 
					d444280a28 | ||
| 
						 | 
					52fc0fe04a | ||
| 
						 | 
					216bebadf1 | ||
| 
						 | 
					a5592931cb | ||
| 
						 | 
					a2228417ff | ||
| 
						 | 
					3e1e292c3e | ||
| 
						 | 
					f2f039ae9e | ||
| 
						 | 
					29dde1eda0 | ||
| 
						 | 
					45d3792ce0 | ||
| 
						 | 
					875d0aaebb | ||
| 
						 | 
					26c9d8ff6f | ||
| 
						 | 
					5e3372e932 | ||
| 
						 | 
					f7069dcd18 | ||
| 
						 | 
					560bb65384 | ||
| 
						 | 
					50cd6a036e | ||
| 
						 | 
					441ab2b5f8 | ||
| 
						 | 
					ba5ed188a1 | ||
| 
						 | 
					72e672f08d | ||
| 
						 | 
					120474ec6a | ||
| 
						 | 
					eee57c47f5 | ||
| 
						 | 
					4c160869b8 | ||
| 
						 | 
					3720a7fbe0 | ||
| 
						 | 
					7afa541a53 | ||
| 
						 | 
					6f979c8275 | ||
| 
						 | 
					d399241e65 | ||
| 
						 | 
					e85dec030a | ||
| 
						 | 
					d0220764cc | ||
| 
						 | 
					75c1df9531 | ||
| 
						 | 
					bca7156d6b | ||
| 
						 | 
					64277b7157 | ||
| 
						 | 
					4a72543f65 | ||
| 
						 | 
					5b84d29807 | ||
| 
						 | 
					a11061ec2b | ||
| 
						 | 
					24cfb93b2e | ||
| 
						 | 
					502b42d63a | ||
| 
						 | 
					612672b79c | ||
| 
						 | 
					abc670e1b1 | ||
| 
						 | 
					d589ccdd01 | ||
| 
						 | 
					acb07d9f7d | ||
| 
						 | 
					f4d2186719 | ||
| 
						 | 
					d0ede5c665 | ||
| 
						 | 
					554cbb5e9b | ||
| 
						 | 
					dbd32a56bf | ||
| 
						 | 
					7f500235c6 | ||
| 
						 | 
					39a58084c8 | ||
| 
						 | 
					cde0fde836 | ||
| 
						 | 
					e70cca0fda | ||
| 
						 | 
					919bd7eb82 | ||
| 
						 | 
					312cff3d6f | ||
| 
						 | 
					0d86eef3d7 | ||
| 
						 | 
					13acf570e7 | ||
| 
						 | 
					fa17623fa8 | ||
| 
						 | 
					06fd525950 | ||
| 
						 | 
					4805b5115a | ||
| 
						 | 
					108dcb3e61 | ||
| 
						 | 
					780d272535 | ||
| 
						 | 
					02ea4b81a5 | ||
| 
						 | 
					7c1bdc6d36 | ||
| 
						 | 
					78c7b8b836 | ||
| 
						 | 
					227da30acb | ||
| 
						 | 
					610805026f | ||
| 
						 | 
					c02399c3d2 | ||
| 
						 | 
					e0799d4153 | ||
| 
						 | 
					6df83f1aa9 | ||
| 
						 | 
					efb5ad1d9b | ||
| 
						 | 
					716976f016 | ||
| 
						 | 
					7892f41b84 | ||
| 
						 | 
					d549e03b3f | ||
| 
						 | 
					c511ef21ff | ||
| 
						 | 
					d64dc45899 | ||
| 
						 | 
					bcb0588409 | ||
| 
						 | 
					0975959eb9 | ||
| 
						 | 
					e985a6d9d3 | ||
| 
						 | 
					b893305974 | ||
| 
						 | 
					724fdd44e4 | ||
| 
						 | 
					b480ef669c | ||
| 
						 | 
					4b145da046 | ||
| 
						 | 
					83d168ece3 | ||
| 
						 | 
					ae44fe7818 | ||
| 
						 | 
					f8981b3acb | ||
| 
						 | 
					050b324885 | ||
| 
						 | 
					e74c0df6c6 | ||
| 
						 | 
					22d0d11895 | ||
| 
						 | 
					80d0c0cf74 | ||
| 
						 | 
					518646b925 | ||
| 
						 | 
					479d7e0087 | ||
| 
						 | 
					8ea1a555f4 | ||
| 
						 | 
					04024dc37c | ||
| 
						 | 
					060ff9288f | ||
| 
						 | 
					197116ee78 | ||
| 
						 | 
					a1e0015257 | ||
| 
						 | 
					7e701ef9e0 | ||
| 
						 | 
					3d6fb661bb | ||
| 
						 | 
					fc372496da | ||
| 
						 | 
					ad7258fe9c | ||
| 
						 | 
					bd707cb2a8 | ||
| 
						 | 
					1839b5f205 | ||
| 
						 | 
					02b47f963c | ||
| 
						 | 
					f8a7f9378a | ||
| 
						 | 
					65cb253be4 | ||
| 
						 | 
					a12356b24b | ||
| 
						 | 
					6a67ad7f93 | ||
| 
						 | 
					140a7f0b1c | ||
| 
						 | 
					00159bc6b5 | ||
| 
						 | 
					9542260103 | ||
| 
						 | 
					72074578df | ||
| 
						 | 
					3b4750a988 | ||
| 
						 | 
					aeec5f0163 | ||
| 
						 | 
					9c94d8c8d6 | ||
| 
						 | 
					581712a2c8 | ||
| 
						 | 
					b25b51aaca | ||
| 
						 | 
					fb97e13a61 | ||
| 
						 | 
					36e154fdb2 | ||
| 
						 | 
					ca273a24b4 | ||
| 
						 | 
					d828bf2889 | ||
| 
						 | 
					87efccef18 | ||
| 
						 | 
					e0bf522e7f | ||
| 
						 | 
					5b1cd3bd3c | ||
| 
						 | 
					f00489196d | ||
| 
						 | 
					dd53bf7e51 | ||
| 
						 | 
					35a6da26d2 | ||
| 
						 | 
					c8c8748a0b | ||
| 
						 | 
					46d0065a90 | ||
| 
						 | 
					990b0180a8 | ||
| 
						 | 
					f3bfb72251 | ||
| 
						 | 
					0358a7edc6 | ||
| 
						 | 
					37f99fca04 | ||
| 
						 | 
					50dfc8ab82 | ||
| 
						 | 
					c70c739b0c | ||
| 
						 | 
					5918285326 | ||
| 
						 | 
					b1dead1186 | ||
| 
						 | 
					3e36e132c3 | ||
| 
						 | 
					fa8d1809e7 | ||
| 
						 | 
					e12b668d04 | ||
| 
						 | 
					e5506f7d8c | ||
| 
						 | 
					b1ac7e5cb3 | ||
| 
						 | 
					ffd164a5f3 | ||
| 
						 | 
					cb27414026 | ||
| 
						 | 
					e320912f33 | ||
| 
						 | 
					d23aaae698 | ||
| 
						 | 
					120c0fe848 | ||
| 
						 | 
					34857b9520 | ||
| 
						 | 
					a87dcece4c | ||
| 
						 | 
					01e2479004 | ||
| 
						 | 
					0fd63fe091 | ||
| 
						 | 
					cc98801c67 | ||
| 
						 | 
					2724d74108 | ||
| 
						 | 
					6d0c0d3a5f | ||
| 
						 | 
					15f8f63317 | ||
| 
						 | 
					d970d65968 | ||
| 
						 | 
					04d359691b | ||
| 
						 | 
					bfc519944a | ||
| 
						 | 
					9f69fd14a2 | ||
| 
						 | 
					85058787b2 | ||
| 
						 | 
					ec851623e0 | ||
| 
						 | 
					e05429a3ec | ||
| 
						 | 
					f651c41816 | ||
| 
						 | 
					6b88d99ae2 | ||
| 
						 | 
					814469cdca | ||
| 
						 | 
					536bf8f141 | ||
| 
						 | 
					6a27290815 | ||
| 
						 | 
					7dde3465e2 | ||
| 
						 | 
					0206a4ac83 | ||
| 
						 | 
					380f5a972c | ||
| 
						 | 
					407467a236 | ||
| 
						 | 
					bcfa9e18bf | ||
| 
						 | 
					69b730e91a | ||
| 
						 | 
					6c6c003d68 | ||
| 
						 | 
					fd652b70d6 | ||
| 
						 | 
					804a5ab6a8 | ||
| 
						 | 
					d984a1aa19 | ||
| 
						 | 
					e05b5a6ab8 | ||
| 
						 | 
					3ff84db421 | ||
| 
						 | 
					74ca73ecb4 | ||
| 
						 | 
					37032f68ae | ||
| 
						 | 
					21d3605737 | ||
| 
						 | 
					0a7c1caf43 | ||
| 
						 | 
					24b57335fa | ||
| 
						 | 
					9f981d875a | ||
| 
						 | 
					6dcc3800e0 | ||
| 
						 | 
					44e9be5a1c | ||
| 
						 | 
					6a8c560d21 | ||
| 
						 | 
					0afe8c6b34 | ||
| 
						 | 
					0f5d7f52a0 | ||
| 
						 | 
					aaaefa0ee2 | ||
| 
						 | 
					276929bc7e | ||
| 
						 | 
					32882f1397 | ||
| 
						 | 
					7dc380c485 | ||
| 
						 | 
					49aaa9a5d3 | ||
| 
						 | 
					84462eb3f2 | ||
| 
						 | 
					91709ca979 | ||
| 
						 | 
					9ece71e652 | ||
| 
						 | 
					4e93f6c6ff | ||
| 
						 | 
					ad9f1fb7c7 | ||
| 
						 | 
					abaeea6d8b | ||
| 
						 | 
					8efbcc4c6b | ||
| 
						 | 
					8ef31cab8c | ||
| 
						 | 
					37ae53e55c | ||
| 
						 | 
					d01f06bdf4 | ||
| 
						 | 
					0d4a8d118a | ||
| 
						 | 
					7e6ec83b1f | ||
| 
						 | 
					9eb515cfae | ||
| 
						 | 
					d0da019a21 | ||
| 
						 | 
					57a13c9ad3 | ||
| 
						 | 
					7f39100634 | ||
| 
						 | 
					9ab96ef39a | ||
| 
						 | 
					ed21d797a6 | ||
| 
						 | 
					15960746bb | ||
| 
						 | 
					e0f1e3ca71 | ||
| 
						 | 
					51d0524182 | ||
| 
						 | 
					16801aa5c4 | ||
| 
						 | 
					cd23f66834 | ||
| 
						 | 
					cc5d2b2875 | ||
| 
						 | 
					94ef03db9e | ||
| 
						 | 
					038bd100b2 | ||
| 
						 | 
					3b5c3f086a | ||
| 
						 | 
					a136715111 | ||
| 
						 | 
					daa22d68fa | ||
| 
						 | 
					f24d202024 | ||
| 
						 | 
					d3e0b8574b | ||
| 
						 | 
					f4482cc34a | ||
| 
						 | 
					3ff226cd6b | ||
| 
						 | 
					5c0d37d021 | ||
| 
						 | 
					b958959cca | ||
| 
						 | 
					762418d0fa | ||
| 
						 | 
					6831f0c192 | ||
| 
						 | 
					64635fff2d | ||
| 
						 | 
					e7e861fb5c | ||
| 
						 | 
					08523ce271 | ||
| 
						 | 
					833f63c1a9 | ||
| 
						 | 
					1c05825bc8 | ||
| 
						 | 
					26bb088a3d | ||
| 
						 | 
					5c361cef23 | ||
| 
						 | 
					04bef96aee | ||
| 
						 | 
					a791981da9 | ||
| 
						 | 
					264c47e07a | ||
| 
						 | 
					863c44d15c | ||
| 
						 | 
					cdec6f202e | ||
| 
						 | 
					bdf6c739a9 | ||
| 
						 | 
					843dd5fb58 | ||
| 
						 | 
					c05853289a | ||
| 
						 | 
					11c5d257f2 | ||
| 
						 | 
					cee1a27348 | ||
| 
						 | 
					690dc75e45 | ||
| 
						 | 
					8dc82b7a6e | ||
| 
						 | 
					a396b519bb | ||
| 
						 | 
					d5f9ce0893 | ||
| 
						 | 
					c1d7ae99ab | ||
| 
						 | 
					d8aee7c310 | ||
| 
						 | 
					3e43d847ca | ||
| 
						 | 
					70273931b2 | ||
| 
						 | 
					cc94d2acc5 | ||
| 
						 | 
					327d9702ca | ||
| 
						 | 
					1cdb285fe6 | ||
| 
						 | 
					e9e61e3034 | ||
| 
						 | 
					b613a51035 | ||
| 
						 | 
					63e62ecb02 | ||
| 
						 | 
					d11122af3f | ||
| 
						 | 
					e8ddb7f6ee | ||
| 
						 | 
					5ad0a158bc | ||
| 
						 | 
					e3ea29a8b6 | ||
| 
						 | 
					ead201ac3d | ||
| 
						 | 
					19af2d7a7b | ||
| 
						 | 
					8ba87443ca | ||
| 
						 | 
					162ace2fd6 | ||
| 
						 | 
					f51fdc0dbf | ||
| 
						 | 
					d3d612a89b | ||
| 
						 | 
					7c7f32d9a6 | ||
| 
						 | 
					c8b6b6e44f | ||
| 
						 | 
					12daa80071 | ||
| 
						 | 
					2f8cc36d4b | ||
| 
						 | 
					1af4f94338 | ||
| 
						 | 
					172a0a85aa | ||
| 
						 | 
					d37c06884d | ||
| 
						 | 
					80e52c57e1 | ||
| 
						 | 
					213a7f137e | ||
| 
						 | 
					4848b71ca0 | ||
| 
						 | 
					13bad106cc | ||
| 
						 | 
					3bebf82501 | ||
| 
						 | 
					e9a8090d7e | ||
| 
						 | 
					e2a79abbe0 | ||
| 
						 | 
					d7f57a4415 | ||
| 
						 | 
					9dd5ed7f1a | ||
| 
						 | 
					432e18a0c0 | ||
| 
						 | 
					9a2d435cb1 | ||
| 
						 | 
					b02274c178 | ||
| 
						 | 
					91408bceb1 | ||
| 
						 | 
					e1fd7e3f0c | ||
| 
						 | 
					d18498cb6b | ||
| 
						 | 
					b3986b8963 | ||
| 
						 | 
					75e3d6f7fb | ||
| 
						 | 
					ded78aa294 | ||
| 
						 | 
					58e8938364 | ||
| 
						 | 
					6e8e6c7352 | ||
| 
						 | 
					270de03646 | ||
| 
						 | 
					b6c7ff109b | ||
| 
						 | 
					9b72a5a46d | ||
| 
						 | 
					626e06c5fd | ||
| 
						 | 
					b09d10ac52 | ||
| 
						 | 
					d1568cda19 | ||
| 
						 | 
					3400b4fa0d | ||
| 
						 | 
					4455f110b1 | ||
| 
						 | 
					25fc37449b | ||
| 
						 | 
					e5ffc7c492 | ||
| 
						 | 
					5c118e6d8a | ||
| 
						 | 
					b49c70e67e | ||
| 
						 | 
					3760fdeed0 | ||
| 
						 | 
					3aece449e4 | ||
| 
						 | 
					dcd2d8be77 | ||
| 
						 | 
					b90e6f9abb | ||
| 
						 | 
					d984652aa1 | ||
| 
						 | 
					f176de6d2e | ||
| 
						 | 
					ef31efabb2 | ||
| 
						 | 
					53763acb76 | ||
| 
						 | 
					6f39010133 | ||
| 
						 | 
					04b5fe6af4 | ||
| 
						 | 
					626f43f424 | ||
| 
						 | 
					bebcc72deb | ||
| 
						 | 
					9f285779ec | ||
| 
						 | 
					57d3e9fc32 | ||
| 
						 | 
					84cf09c1d0 | ||
| 
						 | 
					0848bad960 | ||
| 
						 | 
					c1b13c3b5b | ||
| 
						 | 
					8abc4ed65a | ||
| 
						 | 
					0eebe620cb | ||
| 
						 | 
					62a0d87795 | ||
| 
						 | 
					8318633749 | ||
| 
						 | 
					a453f8aa2e | ||
| 
						 | 
					54d2b90c25 | ||
| 
						 | 
					7e1865984d | ||
| 
						 | 
					a2c56cc112 | ||
| 
						 | 
					5c0ee8ca48 | ||
| 
						 | 
					7397b2b82b | ||
| 
						 | 
					ddcbe21ce6 | ||
| 
						 | 
					8fc7d1377d | ||
| 
						 | 
					092403f362 | ||
| 
						 | 
					bb179922b9 | ||
| 
						 | 
					c29f912461 | ||
| 
						 | 
					83d3e1cfe6 | ||
| 
						 | 
					2914f0f65d | ||
| 
						 | 
					99aa588ae7 | ||
| 
						 | 
					0085e1f3ab | ||
| 
						 | 
					53a9eb13f8 | ||
| 
						 | 
					b8c56c4dda | ||
| 
						 | 
					59266b3190 | ||
| 
						 | 
					0dc94547f5 | ||
| 
						 | 
					29fc6de330 | ||
| 
						 | 
					e24d0c40cd | ||
| 
						 | 
					e95845777a | ||
| 
						 | 
					167648f61c | ||
| 
						 | 
					9e6d6ff0dd | ||
| 
						 | 
					e659cc3d58 | ||
| 
						 | 
					ff6d45571a | ||
| 
						 | 
					6cc9a2c945 | ||
| 
						 | 
					a873401bd7 | ||
| 
						 | 
					6b19745241 | ||
| 
						 | 
					982fae80aa | ||
| 
						 | 
					77b15a3535 | ||
| 
						 | 
					72754ede4e | ||
| 
						 | 
					b8ed8336e0 | ||
| 
						 | 
					13f82856f9 | ||
| 
						 | 
					a62013f54d | ||
| 
						 | 
					4c180869c6 | ||
| 
						 | 
					7bbf022978 | ||
| 
						 | 
					6b0d48423d | ||
| 
						 | 
					a617b8dbed | ||
| 
						 | 
					c57f472caf | ||
| 
						 | 
					e1ba19fd7e | ||
| 
						 | 
					1bf8cbeb29 | ||
| 
						 | 
					f13faf2243 | ||
| 
						 | 
					6cccd9d288 | ||
| 
						 | 
					be2cde106b | ||
| 
						 | 
					17263fb459 | ||
| 
						 | 
					fed04ef5ae | ||
| 
						 | 
					969b6dbcad | ||
| 
						 | 
					aa50d0ee11 | ||
| 
						 | 
					f09999ad5a | ||
| 
						 | 
					35814faf8a | ||
| 
						 | 
					8447a7fafa | ||
| 
						 | 
					c6e6c5e3ce | ||
| 
						 | 
					85cbd8dd47 | ||
| 
						 | 
					bebc9003a3 | ||
| 
						 | 
					3c081fbd65 | ||
| 
						 | 
					fdcf874306 | ||
| 
						 | 
					6cbb741fa1 | ||
| 
						 | 
					24129c1cb9 | ||
| 
						 | 
					f0938c36f5 | ||
| 
						 | 
					484a6eda2e | ||
| 
						 | 
					3f2ebffbe7 | ||
| 
						 | 
					ff278a7d8f | ||
| 
						 | 
					844a3c3aff | ||
| 
						 | 
					0db48993e9 | ||
| 
						 | 
					81e21c4314 | ||
| 
						 | 
					ba0e57396d | ||
| 
						 | 
					6a728d160a | ||
| 
						 | 
					180e507bc8 | ||
| 
						 | 
					f3b7611ded | ||
| 
						 | 
					c344de5546 | ||
| 
						 | 
					0bd0aa2bf7 | ||
| 
						 | 
					c786cbb3a1 | ||
| 
						 | 
					cd856f653d | ||
| 
						 | 
					d528c09da6 | ||
| 
						 | 
					76b7ad006d | ||
| 
						 | 
					ff33e405a3 | ||
| 
						 | 
					f74de26d63 | ||
| 
						 | 
					2c823798d8 | ||
| 
						 | 
					381e261bbb | ||
| 
						 | 
					ba9bb5db6c | ||
| 
						 | 
					cd12bb33a5 | ||
| 
						 | 
					e333aee232 | ||
| 
						 | 
					54571f60c3 | ||
| 
						 | 
					dd743aaeac | ||
| 
						 | 
					22c76dc9f8 | ||
| 
						 | 
					7c7e09cf64 | ||
| 
						 | 
					e5e3d69371 | ||
| 
						 | 
					82a700b24e | ||
| 
						 | 
					0579425a4f | ||
| 
						 | 
					218e74569d | ||
| 
						 | 
					448f54cf84 | ||
| 
						 | 
					c139e13049 | ||
| 
						 | 
					65116fef32 | ||
| 
						 | 
					a0a35b7dca | ||
| 
						 | 
					11fb8a24b7 | ||
| 
						 | 
					512336685c | ||
| 
						 | 
					484f281c19 | ||
| 
						 | 
					2169bc5d3e | ||
| 
						 | 
					c653c84ad2 | ||
| 
						 | 
					050f75aa60 | ||
| 
						 | 
					dae3f3552a | ||
| 
						 | 
					8b09b170d6 | ||
| 
						 | 
					ec88f2ed8a | ||
| 
						 | 
					607d8502ff | ||
| 
						 | 
					2f084d7c15 | ||
| 
						 | 
					5bf6e7d8f9 | ||
| 
						 | 
					31cb9fbfaf | ||
| 
						 | 
					c7c48f3bea | ||
| 
						 | 
					6732d22e6c | ||
| 
						 | 
					04c6b7fe31 | ||
| 
						 | 
					2687879dbd | ||
| 
						 | 
					20a660fa89 | ||
| 
						 | 
					ba9781e1a8 | ||
| 
						 | 
					f65ac74914 | ||
| 
						 | 
					6c33d9aeed | ||
| 
						 | 
					68e86ad40d | ||
| 
						 | 
					0aa4aa49a7 | ||
| 
						 | 
					0ff3846e49 | ||
| 
						 | 
					bfb81299c3 | ||
| 
						 | 
					0362a8e73c | ||
| 
						 | 
					f00f5cbed1 | ||
| 
						 | 
					c4e8cabae9 | ||
| 
						 | 
					1729d05e8c | ||
| 
						 | 
					770fb46ca7 | ||
| 
						 | 
					a3c4e54bc0 | ||
| 
						 | 
					b8a77fbada | ||
| 
						 | 
					9182ebfc19 | ||
| 
						 | 
					25c0cf5848 | ||
| 
						 | 
					a160dc0a4d | ||
| 
						 | 
					28f1ca9c17 | ||
| 
						 | 
					6399a0f046 | ||
| 
						 | 
					639413608b | ||
| 
						 | 
					c14e4c7d22 | ||
| 
						 | 
					c74ac64237 | ||
| 
						 | 
					4b3289ed99 | ||
| 
						 | 
					0c432b39dc | ||
| 
						 | 
					c4b9276713 | ||
| 
						 | 
					df300c0663 | ||
| 
						 | 
					518114cbbd | ||
| 
						 | 
					999f0e4d58 | ||
| 
						 | 
					c2663529c1 | ||
| 
						 | 
					9df74a02b6 | ||
| 
						 | 
					71c9964e19 | ||
| 
						 | 
					ae2e47f6a9 | ||
| 
						 | 
					1524d35f66 | ||
| 
						 | 
					845be966a0 | ||
| 
						 | 
					80818d79eb | ||
| 
						 | 
					cb9b3c00dd | ||
| 
						 | 
					b3997fb5df | ||
| 
						 | 
					09dde6b78a | ||
| 
						 | 
					3345d3ab35 | ||
| 
						 | 
					366be7bbdd | ||
| 
						 | 
					7008ea66f8 | ||
| 
						 | 
					70f881e989 | ||
| 
						 | 
					94d2355089 | ||
| 
						 | 
					dfbe48b25b | ||
| 
						 | 
					931cb38b54 | ||
| 
						 | 
					e5fd34f94e | ||
| 
						 | 
					c638d7eb48 | ||
| 
						 | 
					7e96384618 | ||
| 
						 | 
					829cb99f5b | ||
| 
						 | 
					1f93c99304 | ||
| 
						 | 
					dbb7c756cd | ||
| 
						 | 
					13f381710c | ||
| 
						 | 
					70897c0e9a | ||
| 
						 | 
					f51d1c5264 | ||
| 
						 | 
					70d0937aab | 
@@ -13,7 +13,3 @@ redis:
 | 
			
		||||
  host: localhost
 | 
			
		||||
  port: 6379
 | 
			
		||||
  pass: ''
 | 
			
		||||
elasticsearch:
 | 
			
		||||
  host: localhost
 | 
			
		||||
  port: 9200
 | 
			
		||||
  pass: ''
 | 
			
		||||
@@ -13,7 +13,3 @@ redis:
 | 
			
		||||
  host: localhost
 | 
			
		||||
  port: 6379
 | 
			
		||||
  pass: ''
 | 
			
		||||
elasticsearch:
 | 
			
		||||
  host: localhost
 | 
			
		||||
  port: 9200
 | 
			
		||||
  pass: ''
 | 
			
		||||
							
								
								
									
										129
									
								
								.circleci/config.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										129
									
								
								.circleci/config.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,129 @@
 | 
			
		||||
version: 2.1
 | 
			
		||||
 | 
			
		||||
general:
 | 
			
		||||
  branches:
 | 
			
		||||
    ignore:
 | 
			
		||||
      - l10n_develop
 | 
			
		||||
      - imgbot
 | 
			
		||||
 | 
			
		||||
executors:
 | 
			
		||||
  default:
 | 
			
		||||
    working_directory: /tmp/workspace
 | 
			
		||||
    docker:
 | 
			
		||||
      - image: misskey/ci:latest
 | 
			
		||||
      - image: circleci/mongo:latest
 | 
			
		||||
      - image: circleci/redis:latest
 | 
			
		||||
  docker:
 | 
			
		||||
    working_directory: /tmp/workspace
 | 
			
		||||
    docker:
 | 
			
		||||
      - image: docker:latest
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  build:
 | 
			
		||||
    executor: default
 | 
			
		||||
    steps:
 | 
			
		||||
      - checkout
 | 
			
		||||
      - restore_cache:
 | 
			
		||||
          name: Restore npm package caches
 | 
			
		||||
          keys:
 | 
			
		||||
            - npm-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-lock-{{ checksum "package-lock.json" }}-
 | 
			
		||||
            - npm-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-
 | 
			
		||||
            - npm-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-
 | 
			
		||||
            - npm-v1-arch-{{ arch }}-
 | 
			
		||||
            - npm-v1-
 | 
			
		||||
      - run:
 | 
			
		||||
          name: Install Dependencies
 | 
			
		||||
          command: |
 | 
			
		||||
            npm install
 | 
			
		||||
      - run:
 | 
			
		||||
          name: Configure
 | 
			
		||||
          command: |
 | 
			
		||||
            cp .ci/default.yml .config
 | 
			
		||||
            cp .ci/test.yml .config
 | 
			
		||||
      - run:
 | 
			
		||||
          name: Build
 | 
			
		||||
          command: |
 | 
			
		||||
            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:
 | 
			
		||||
          name: Cache npm packages
 | 
			
		||||
          key: npm-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-lock-{{ checksum "package-lock.json" }}-ls-{{ checksum "ls" }}
 | 
			
		||||
          paths:
 | 
			
		||||
            - node_modules
 | 
			
		||||
      - store_artifacts:
 | 
			
		||||
          path: built
 | 
			
		||||
      - persist_to_workspace:
 | 
			
		||||
          root: .
 | 
			
		||||
          paths:
 | 
			
		||||
            - .
 | 
			
		||||
  test:
 | 
			
		||||
    parameters:
 | 
			
		||||
      without_redis:
 | 
			
		||||
        type: string
 | 
			
		||||
        default: ""
 | 
			
		||||
    executor: default
 | 
			
		||||
    steps:
 | 
			
		||||
      - attach_workspace:
 | 
			
		||||
          at: /tmp/workspace
 | 
			
		||||
      - when:
 | 
			
		||||
          condition: <<parameters.without_redis>>
 | 
			
		||||
          steps:
 | 
			
		||||
            - run:
 | 
			
		||||
                name: Configure
 | 
			
		||||
                command: |
 | 
			
		||||
                  mv .config/test.yml .config/test_redis.yml
 | 
			
		||||
                  touch .config/test.yml
 | 
			
		||||
                  cat .config/test_redis.yml | while IFS= read line; do if [[ "$line" = '# __REDIS__' ]]; then break; else echo "$line" >> .config/test.yml; fi; done
 | 
			
		||||
      - 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)
 | 
			
		||||
            ls -1ARl node_modules > ls
 | 
			
		||||
      - save_cache:
 | 
			
		||||
          name: Cache npm packages
 | 
			
		||||
          key: npm-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-lock-{{ checksum "package-lock.json" }}-ls-{{ checksum "ls" }}
 | 
			
		||||
          paths:
 | 
			
		||||
            - node_modules
 | 
			
		||||
 | 
			
		||||
  docker:
 | 
			
		||||
    parameters:
 | 
			
		||||
      with_deploy:
 | 
			
		||||
        type: string
 | 
			
		||||
        default: ""
 | 
			
		||||
    executor: docker
 | 
			
		||||
    steps:
 | 
			
		||||
      - checkout
 | 
			
		||||
      - setup_remote_docker
 | 
			
		||||
      - run:
 | 
			
		||||
          name: Build
 | 
			
		||||
          command: |
 | 
			
		||||
            docker build .
 | 
			
		||||
      - when:
 | 
			
		||||
          condition: <<parameters.with_deploy>>
 | 
			
		||||
          steps:
 | 
			
		||||
            - run:
 | 
			
		||||
                name: Deploy
 | 
			
		||||
                command: |
 | 
			
		||||
                  docker login -u $DOCKERHUB_USERNAME -p $DOCKERHUB_PASSWORD && docker push misskey/misskey
 | 
			
		||||
 | 
			
		||||
workflows:
 | 
			
		||||
  version: 2
 | 
			
		||||
  build-and-test:
 | 
			
		||||
    jobs:
 | 
			
		||||
      - build
 | 
			
		||||
      - test:
 | 
			
		||||
          requires:
 | 
			
		||||
            - build
 | 
			
		||||
      - test:
 | 
			
		||||
          without_redis: "true"
 | 
			
		||||
          requires:
 | 
			
		||||
            - build
 | 
			
		||||
      - docker:
 | 
			
		||||
          filters:
 | 
			
		||||
            branches:
 | 
			
		||||
              ignore: master
 | 
			
		||||
      - docker:
 | 
			
		||||
          with_deploy: "true"
 | 
			
		||||
          filters:
 | 
			
		||||
            branches:
 | 
			
		||||
              only: master
 | 
			
		||||
@@ -164,3 +164,6 @@ drive:
 | 
			
		||||
#  external: true
 | 
			
		||||
#  engine: http://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}
 | 
			
		||||
#  timeout: 300000
 | 
			
		||||
 | 
			
		||||
# Max allowed note text length in charactors
 | 
			
		||||
maxNoteTextLength: 1000
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -16,3 +16,4 @@ api-docs.json
 | 
			
		||||
/redis
 | 
			
		||||
/mongo
 | 
			
		||||
/elasticsearch
 | 
			
		||||
*.code-workspace
 | 
			
		||||
 
 | 
			
		||||
@@ -11,7 +11,7 @@ branches:
 | 
			
		||||
language: node_js
 | 
			
		||||
 | 
			
		||||
node_js:
 | 
			
		||||
  - 10.1.0
 | 
			
		||||
  - 11.0.0
 | 
			
		||||
 | 
			
		||||
env:
 | 
			
		||||
  - CXX=g++-4.8 NODE_ENV=production
 | 
			
		||||
@@ -35,7 +35,7 @@ before_script:
 | 
			
		||||
  - npm install
 | 
			
		||||
 | 
			
		||||
  # 設定ファイルを配置
 | 
			
		||||
  - cp ./.travis/default.yml ./.config
 | 
			
		||||
  - cp ./.travis/test.yml ./.config
 | 
			
		||||
  - cp ./.ci/default.yml ./.config
 | 
			
		||||
  - cp ./.ci/test.yml ./.config
 | 
			
		||||
 | 
			
		||||
  - travis_wait npm run build
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										40
									
								
								Dockerfile
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								Dockerfile
									
									
									
									
									
								
							@@ -1,28 +1,44 @@
 | 
			
		||||
FROM alpine:latest AS base
 | 
			
		||||
FROM alpine:3.8 AS base
 | 
			
		||||
 | 
			
		||||
ENV NODE_ENV=production
 | 
			
		||||
 | 
			
		||||
RUN apk add --no-cache nodejs nodejs-npm
 | 
			
		||||
RUN apk add vips fftw --update-cache --repository https://dl-3.alpinelinux.org/alpine/edge/testing/
 | 
			
		||||
RUN apk add --no-cache nodejs nodejs-npm zlib
 | 
			
		||||
RUN npm i -g npm@latest
 | 
			
		||||
 | 
			
		||||
WORKDIR /misskey
 | 
			
		||||
COPY . ./
 | 
			
		||||
 | 
			
		||||
FROM base AS builder
 | 
			
		||||
 | 
			
		||||
RUN apk add --no-cache	gcc g++ python autoconf automake file make nasm
 | 
			
		||||
RUN apk add vips-dev fftw-dev --update-cache --repository https://dl-3.alpinelinux.org/alpine/edge/testing/
 | 
			
		||||
RUN npm install \
 | 
			
		||||
    && npm install -g node-gyp \
 | 
			
		||||
    && node-gyp configure \
 | 
			
		||||
RUN apk add --no-cache \
 | 
			
		||||
    gcc \
 | 
			
		||||
    g++ \
 | 
			
		||||
    libc-dev \
 | 
			
		||||
    python \
 | 
			
		||||
    autoconf \
 | 
			
		||||
    automake \
 | 
			
		||||
    file \
 | 
			
		||||
    make \
 | 
			
		||||
    nasm \
 | 
			
		||||
    pkgconfig \
 | 
			
		||||
    libtool \
 | 
			
		||||
    zlib-dev
 | 
			
		||||
RUN npm i -g node-gyp
 | 
			
		||||
 | 
			
		||||
COPY ./package.json ./
 | 
			
		||||
RUN npm i
 | 
			
		||||
 | 
			
		||||
COPY . ./
 | 
			
		||||
RUN node-gyp configure \
 | 
			
		||||
 && node-gyp build \
 | 
			
		||||
 && npm run build
 | 
			
		||||
 | 
			
		||||
FROM base AS runner
 | 
			
		||||
 | 
			
		||||
COPY --from=builder /misskey/built ./built
 | 
			
		||||
COPY --from=builder /misskey/node_modules ./node_modules
 | 
			
		||||
 | 
			
		||||
RUN apk add --no-cache tini
 | 
			
		||||
ENTRYPOINT ["/sbin/tini", "--"]
 | 
			
		||||
 | 
			
		||||
COPY --from=builder /misskey/node_modules ./node_modules
 | 
			
		||||
COPY --from=builder /misskey/built ./built
 | 
			
		||||
COPY . ./
 | 
			
		||||
 | 
			
		||||
CMD ["npm", "start"]
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										28
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								README.md
									
									
									
									
									
								
							@@ -3,9 +3,10 @@
 | 
			
		||||
[](https://misskey.xyz/)
 | 
			
		||||
================================================================
 | 
			
		||||
 | 
			
		||||
[](https://circleci.com/gh/syuilo/misskey)
 | 
			
		||||
[![][travis-badge]][travis-link]
 | 
			
		||||
[![][dependencies-badge]][dependencies-link]
 | 
			
		||||
[](http://makeapullrequest.com) [](https://greenkeeper.io/)
 | 
			
		||||
[](http://makeapullrequest.com)
 | 
			
		||||
 | 
			
		||||
**Sophisticated microblogging platform, evolving forever.**
 | 
			
		||||
 | 
			
		||||
@@ -71,39 +72,46 @@ Please see [Contribution guide](./CONTRIBUTING.md).
 | 
			
		||||
----------------------------------------------------------------
 | 
			
		||||
<!-- PATREON_START -->
 | 
			
		||||
<table><tr>
 | 
			
		||||
<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"></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/13099460/43cecdbaa63a40d79bf50a96b9910b9d/1?token-time=2145916800&token-hash=d6P5MWHHsCMxUuBAEPAoVc5wLUR19mIhqAq7Ma9h9rI%3D" alt="ne_moni"></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://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>
 | 
			
		||||
</tr><tr>
 | 
			
		||||
<td><a href="https://www.patreon.com/mastodon">Gargron</a></td>
 | 
			
		||||
<td><a href="https://www.patreon.com/negao">negao</a></td>
 | 
			
		||||
<td><a href="https://www.patreon.com/user?u=13099460">ne_moni</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/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>
 | 
			
		||||
<td><a href="https://www.patreon.com/user?u=12718187">Peter G.</a></td>
 | 
			
		||||
<td><a href="https://www.patreon.com/user?u=13039004">nemu</a></td>
 | 
			
		||||
</tr></table>
 | 
			
		||||
<table><tr>
 | 
			
		||||
<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/2?token-time=2145916800&token-hash=zElv7ZcPL3viGsXbNG_KWiKrbV0vvw1gk0panx8DJoo%3D" alt="Naoki Kosaka"></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/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>
 | 
			
		||||
</tr><tr>
 | 
			
		||||
<td><a href="https://www.patreon.com/user?u=13039004">nemu</a></td>
 | 
			
		||||
<td><a href="https://www.patreon.com/user?u=5881381">Naoki Kosaka</a></td>
 | 
			
		||||
<td><a href="https://www.patreon.com/acid_chicken">Acid Chicken</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>
 | 
			
		||||
<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>
 | 
			
		||||
<table><tr>
 | 
			
		||||
</tr><tr>
 | 
			
		||||
</tr></table>
 | 
			
		||||
 | 
			
		||||
**Last updated:** Tue, 02 Oct 2018 09:25:07 UTC
 | 
			
		||||
**Last updated:** Sat, 27 Oct 2018 04:36:06 UTC
 | 
			
		||||
<!-- PATREON_END -->
 | 
			
		||||
 | 
			
		||||
:four_leaf_clover: Copyright
 | 
			
		||||
 
 | 
			
		||||
@@ -1,13 +0,0 @@
 | 
			
		||||
const deleteUser = require('../built/models/user').deleteUser;
 | 
			
		||||
 | 
			
		||||
const args = process.argv.slice(2);
 | 
			
		||||
 | 
			
		||||
const userId = args[0];
 | 
			
		||||
 | 
			
		||||
console.log(`deleting ${userId}...`);
 | 
			
		||||
 | 
			
		||||
deleteUser(userId).then(() => {
 | 
			
		||||
	console.log('done');
 | 
			
		||||
}, e => {
 | 
			
		||||
	console.error(e);
 | 
			
		||||
});
 | 
			
		||||
@@ -1,23 +0,0 @@
 | 
			
		||||
const mongo = require('mongodb');
 | 
			
		||||
const User = require('../built/models/user').default;
 | 
			
		||||
 | 
			
		||||
const args = process.argv.slice(2);
 | 
			
		||||
 | 
			
		||||
const user = args[0];
 | 
			
		||||
 | 
			
		||||
const q = user.startsWith('@') ? {
 | 
			
		||||
	username: user.split('@')[1],
 | 
			
		||||
	host: user.split('@')[2] || null
 | 
			
		||||
} : { _id: new mongo.ObjectID(user) };
 | 
			
		||||
 | 
			
		||||
console.log(`Mark as verfied ${user}...`);
 | 
			
		||||
 | 
			
		||||
User.update(q, {
 | 
			
		||||
	$set: {
 | 
			
		||||
		isVerified: true
 | 
			
		||||
	}
 | 
			
		||||
}).then(() => {
 | 
			
		||||
	console.log(`Done ${user}`);
 | 
			
		||||
}, e => {
 | 
			
		||||
	console.error(e);
 | 
			
		||||
});
 | 
			
		||||
@@ -1,42 +0,0 @@
 | 
			
		||||
const { default: Note } = require('../built/models/note');
 | 
			
		||||
const { default: Meta } = require('../built/models/meta');
 | 
			
		||||
const { default: User } = require('../built/models/user');
 | 
			
		||||
 | 
			
		||||
async function main() {
 | 
			
		||||
	const meta = await Meta.findOne({});
 | 
			
		||||
 | 
			
		||||
	const notesCount = await Note.count();
 | 
			
		||||
 | 
			
		||||
	const usersCount = await User.count();
 | 
			
		||||
 | 
			
		||||
	const originalNotesCount = await Note.count({
 | 
			
		||||
		'_user.host': null
 | 
			
		||||
	});
 | 
			
		||||
 | 
			
		||||
	const originalUsersCount = await User.count({
 | 
			
		||||
		host: null
 | 
			
		||||
	});
 | 
			
		||||
 | 
			
		||||
	const stats = {
 | 
			
		||||
		notesCount,
 | 
			
		||||
		usersCount,
 | 
			
		||||
		originalNotesCount,
 | 
			
		||||
		originalUsersCount
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	if (meta) {
 | 
			
		||||
		await Meta.update({}, {
 | 
			
		||||
			$set: {
 | 
			
		||||
				stats
 | 
			
		||||
			}
 | 
			
		||||
		});
 | 
			
		||||
	} else {
 | 
			
		||||
		await Meta.insert({
 | 
			
		||||
			stats
 | 
			
		||||
		});
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
main().then(() => {
 | 
			
		||||
	console.log('done');
 | 
			
		||||
}).catch(console.error);
 | 
			
		||||
@@ -6,7 +6,7 @@ services:
 | 
			
		||||
    restart: always
 | 
			
		||||
    links:
 | 
			
		||||
      - mongo
 | 
			
		||||
      - redis
 | 
			
		||||
#      - redis
 | 
			
		||||
#      - es
 | 
			
		||||
    ports:
 | 
			
		||||
      - "127.0.0.1:3000:3000"
 | 
			
		||||
@@ -14,18 +14,18 @@ services:
 | 
			
		||||
      - internal_network
 | 
			
		||||
      - external_network
 | 
			
		||||
 | 
			
		||||
  redis:
 | 
			
		||||
    restart: always
 | 
			
		||||
    image: redis:4.0-alpine
 | 
			
		||||
    networks:
 | 
			
		||||
      - internal_network
 | 
			
		||||
#  redis:
 | 
			
		||||
#    restart: always
 | 
			
		||||
#    image: redis:4.0-alpine
 | 
			
		||||
#    networks:
 | 
			
		||||
#      - internal_network
 | 
			
		||||
### Uncomment to enable Redis persistance
 | 
			
		||||
#    volumes:
 | 
			
		||||
#      - ./redis:/data
 | 
			
		||||
##    volumes:
 | 
			
		||||
##      - ./redis:/data
 | 
			
		||||
 | 
			
		||||
  mongo:
 | 
			
		||||
    restart: always
 | 
			
		||||
    image: mongo:4.1-bionic
 | 
			
		||||
    image: mongo:4.1
 | 
			
		||||
    networks:
 | 
			
		||||
      - internal_network
 | 
			
		||||
    environment:
 | 
			
		||||
 
 | 
			
		||||
@@ -7,23 +7,29 @@ This guide describes how to install and setup Misskey with Docker.
 | 
			
		||||
 | 
			
		||||
----------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
*1.* Make configuration files
 | 
			
		||||
*1.* Download Misskey
 | 
			
		||||
----------------------------------------------------------------
 | 
			
		||||
1. `git clone -b master git://github.com/syuilo/misskey.git` Clone Misskey repository's master branch.
 | 
			
		||||
2. `cd misskey` Move to misskey directory.
 | 
			
		||||
3. `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) tag.
 | 
			
		||||
 | 
			
		||||
*2.* Make configuration files
 | 
			
		||||
----------------------------------------------------------------
 | 
			
		||||
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`.
 | 
			
		||||
 | 
			
		||||
*2.* Configure Docker
 | 
			
		||||
*3.* Configure Docker
 | 
			
		||||
----------------------------------------------------------------
 | 
			
		||||
Edit `docker-compose.yml`.
 | 
			
		||||
 | 
			
		||||
*3.* Build Misskey
 | 
			
		||||
*4.* Build Misskey
 | 
			
		||||
----------------------------------------------------------------
 | 
			
		||||
Build misskey with the following:
 | 
			
		||||
 | 
			
		||||
`docker-compose build`
 | 
			
		||||
 | 
			
		||||
*4.* That is it.
 | 
			
		||||
*5.* That is it.
 | 
			
		||||
----------------------------------------------------------------
 | 
			
		||||
Well done! Now, you have an environment that run to Misskey.
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -7,23 +7,29 @@ Dockerを使ったMisskey構築方法
 | 
			
		||||
 | 
			
		||||
----------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
*1.* 設定ファイルを作成する
 | 
			
		||||
*1.* Misskeyのダウンロード
 | 
			
		||||
----------------------------------------------------------------
 | 
			
		||||
1. `git clone -b master git://github.com/syuilo/misskey.git` masterブランチからMisskeyレポジトリをクローン
 | 
			
		||||
2. `cd misskey` misskeyディレクトリに移動
 | 
			
		||||
3. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` [最新のリリース](https://github.com/syuilo/misskey/releases/latest)を確認
 | 
			
		||||
 | 
			
		||||
*2.* 設定ファイルを作成する
 | 
			
		||||
----------------------------------------------------------------
 | 
			
		||||
1. `cp .config/example.yml .config/default.yml` `.config/example.yml`をコピーし名前を`default.yml`にする
 | 
			
		||||
2. `cp .config/mongo_initdb_example.js .config/mongo_initdb.js` `.config/mongo_initdb_example.js`をコピーし名前を`mongo_initdb.js`にする
 | 
			
		||||
3. `default.yml`と`mongo_initdb.js`を編集する
 | 
			
		||||
 | 
			
		||||
*2.* Dockerの設定
 | 
			
		||||
*3.* Dockerの設定
 | 
			
		||||
----------------------------------------------------------------
 | 
			
		||||
`docker-compose.yml`を編集してください。
 | 
			
		||||
 | 
			
		||||
*3.* Misskeyのビルド
 | 
			
		||||
*4.* Misskeyのビルド
 | 
			
		||||
----------------------------------------------------------------
 | 
			
		||||
次のコマンドでMisskeyをビルドしてください:
 | 
			
		||||
 | 
			
		||||
`docker-compose build`
 | 
			
		||||
 | 
			
		||||
*4.* 以上です!
 | 
			
		||||
*5.* 以上です!
 | 
			
		||||
----------------------------------------------------------------
 | 
			
		||||
お疲れ様でした。これでMisskeyを動かす準備は整いました。
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -18,6 +18,10 @@ If you find an untranslated part on Misskey:
 | 
			
		||||
4. Add the text property using the `foo` keyword below the path that you found or created in step 2. Make sure to type your text in quotation marks. Text should always be inside of quotes.
 | 
			
		||||
	-   For example, in this case we add timeline: `timeline: "タイムライン"` to `locales/ja-JP.yml`.
 | 
			
		||||
 | 
			
		||||
5. And done!
 | 
			
		||||
5. When you add text to the ja-JP file (of syuilo/misskey), it will automatically be applied to all other local language files within 24-48 hours. Translations added in ja-JP file should contain the original Japanese strings (example see step 4). 
 | 
			
		||||
 | 
			
		||||
6. The new strings will automatically appear in the localized language files in the original Japanese text. After that, please go to [CrowdIn](https://crowdin.com/project/misskey) to do the localized translations in your language.
 | 
			
		||||
 | 
			
		||||
7. And done!
 | 
			
		||||
 | 
			
		||||
For more details, please refer to this [commit](https://github.com/syuilo/misskey/commit/10f6d5980fa7692ccb45fbc5f843458b69b7607c).
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,6 @@
 | 
			
		||||
# **DO NOT edit locale files** except `ja-JP.yml`.
 | 
			
		||||
 | 
			
		||||
When you add text to the ja-JP file (of syuilo/misskey), it will automatically be applied to other language files.
 | 
			
		||||
Translations added in ja-JP file should contain the original Japanese strings.
 | 
			
		||||
 | 
			
		||||
Please see [Contribution guide](../CONTRIBUTING.md) for more information.
 | 
			
		||||
 
 | 
			
		||||
@@ -25,6 +25,14 @@ common:
 | 
			
		||||
  application-authorization: "アプリの連携"
 | 
			
		||||
  close: "閉じる"
 | 
			
		||||
  do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
 | 
			
		||||
  BSoD:
 | 
			
		||||
    fatal-error: ":( 致命的な問題が発生しました。"
 | 
			
		||||
    update-browser-os: "お使いのブラウザ(またはOS)のバージョンを更新すると解決する可能性があります。"
 | 
			
		||||
    error-code: "エラーコード"
 | 
			
		||||
    browser-version: "ブラウザ バージョン"
 | 
			
		||||
    client-version: "クライアント バージョン"
 | 
			
		||||
    email-support: "問題が解決しない場合は、上記の情報をお書き添えの上 syuilotan@yahoo.co.jp までご連絡ください。"
 | 
			
		||||
    thanks: "Thank you for using Misskey."
 | 
			
		||||
  got-it: "わかった"
 | 
			
		||||
  customization-tips:
 | 
			
		||||
    title: "カスタマイズのヒント"
 | 
			
		||||
@@ -54,6 +62,7 @@ common:
 | 
			
		||||
    years_ago: "{}年前"
 | 
			
		||||
  month-and-day: "{month}月 {day}日"
 | 
			
		||||
  trash: "ゴミ箱"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  weekday-short:
 | 
			
		||||
    sunday: "日"
 | 
			
		||||
    monday: "月"
 | 
			
		||||
@@ -115,6 +124,12 @@ common:
 | 
			
		||||
  reduce-motion: "UIの動きを減らす"
 | 
			
		||||
  this-setting-is-this-device-only: "このデバイスのみ"
 | 
			
		||||
  do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
 | 
			
		||||
  is-remote-user: "このユーザー情報はコピーです。"
 | 
			
		||||
  is-remote-post: "この投稿情報はコピーです。"
 | 
			
		||||
  view-on-remote: "正確な情報を見る"
 | 
			
		||||
  error:
 | 
			
		||||
    title: '問題が発生しました'
 | 
			
		||||
    retry: 'やり直す'
 | 
			
		||||
  reversi:
 | 
			
		||||
    drawn: "引き分け"
 | 
			
		||||
    my-turn: "あなたのターンです"
 | 
			
		||||
@@ -170,6 +185,7 @@ common:
 | 
			
		||||
    rename: "名前を変更"
 | 
			
		||||
    stack-left: "左に重ねる"
 | 
			
		||||
    pop-right: "右に出す"
 | 
			
		||||
  dev: "アプリの作成に失敗しました。再度お試しください。"
 | 
			
		||||
auth/views/form.vue:
 | 
			
		||||
  share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
 | 
			
		||||
  permission-ask: "このアプリは次の権限を要求しています:"
 | 
			
		||||
@@ -526,11 +542,14 @@ desktop/views/components/charts.vue:
 | 
			
		||||
  title: "チャート"
 | 
			
		||||
  per-day: "1日ごと"
 | 
			
		||||
  per-hour: "1時間ごと"
 | 
			
		||||
  federation: "フェデレーション"
 | 
			
		||||
  notes: "投稿"
 | 
			
		||||
  users: "ユーザー"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  network: "ネットワーク"
 | 
			
		||||
  charts:
 | 
			
		||||
    federation-instances: "インスタンスの増減"
 | 
			
		||||
    federation-instances-total: "インスタンスの積算"
 | 
			
		||||
    notes: "投稿の増減 (統合)"
 | 
			
		||||
    local-notes: "投稿の増減 (ローカル)"
 | 
			
		||||
    remote-notes: "投稿の増減 (リモート)"
 | 
			
		||||
@@ -560,7 +579,6 @@ desktop/views/components/crop-window.vue:
 | 
			
		||||
  ok: "決定"
 | 
			
		||||
desktop/views/components/drive-window.vue:
 | 
			
		||||
  used: "使用中"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
desktop/views/components/drive.file.vue:
 | 
			
		||||
  avatar: "アイコン"
 | 
			
		||||
  banner: "バナー"
 | 
			
		||||
@@ -590,8 +608,6 @@ desktop/views/components/drive.folder.vue:
 | 
			
		||||
    rename: "名前を変更"
 | 
			
		||||
    rename-folder: "フォルダ名の変更"
 | 
			
		||||
    input-new-folder-name: "新しいフォルダ名を入力してください"
 | 
			
		||||
desktop/views/components/drive.nav-folder.vue:
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
desktop/views/components/drive.vue:
 | 
			
		||||
  search: "検索"
 | 
			
		||||
  load-more: "もっと読み込む"
 | 
			
		||||
@@ -725,8 +741,8 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  profile: "プロフィール"
 | 
			
		||||
  notification: "通知"
 | 
			
		||||
  apps: "アプリ"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  mute-and-block: "ミュート/ブロック"
 | 
			
		||||
  blocking: "ブロック"
 | 
			
		||||
  security: "セキュリティ"
 | 
			
		||||
  signin: "サインイン履歴"
 | 
			
		||||
  password: "パスワード"
 | 
			
		||||
@@ -832,20 +848,32 @@ desktop/views/components/settings.2fa.vue:
 | 
			
		||||
  success: "設定が完了しました!"
 | 
			
		||||
  failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
 | 
			
		||||
  info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
 | 
			
		||||
desktop/views/components/settings.api.vue:
 | 
			
		||||
common/views/components/api-settings.vue:
 | 
			
		||||
  intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
 | 
			
		||||
  caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
 | 
			
		||||
  regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
 | 
			
		||||
  regenerate-token: "トークンを再生成"
 | 
			
		||||
  token: "Token:"
 | 
			
		||||
  enter-password: "パスワードを入力してください"
 | 
			
		||||
  console:
 | 
			
		||||
    title: 'APIコンソール'
 | 
			
		||||
    endpoint: 'エンドポイント'
 | 
			
		||||
    parameter: 'パラメータ'
 | 
			
		||||
    send: '送信'
 | 
			
		||||
    sending: '応答待ち'
 | 
			
		||||
    response: '結果'
 | 
			
		||||
desktop/views/components/settings.apps.vue:
 | 
			
		||||
  no-apps: "連携しているアプリケーションはありません"
 | 
			
		||||
desktop/views/components/settings.drive.vue:
 | 
			
		||||
  max: "中"
 | 
			
		||||
common/views/components/drive-settings.vue:
 | 
			
		||||
  max: "容量"
 | 
			
		||||
  in-use: "使用中"
 | 
			
		||||
desktop/views/components/settings.mute.vue:
 | 
			
		||||
  no-users: "ミュートしているユーザーはいません"
 | 
			
		||||
  stats: "統計"
 | 
			
		||||
common/views/components/mute-and-block.vue:
 | 
			
		||||
  mute-and-block: "ミュートとブロック"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  no-muted-users: "ミュートしているユーザーはいません"
 | 
			
		||||
  no-blocked-users: "ブロックしているユーザーはいません"
 | 
			
		||||
desktop/views/components/settings.password.vue:
 | 
			
		||||
  reset: "パスワードを変更する"
 | 
			
		||||
  enter-current-password: "現在のパスワードを入力してください"
 | 
			
		||||
@@ -877,7 +905,6 @@ desktop/views/components/ui.header.vue:
 | 
			
		||||
  adjective: "さん"
 | 
			
		||||
desktop/views/components/ui.header.account.vue:
 | 
			
		||||
  profile: "プロフィール"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  favorites: "お気に入り"
 | 
			
		||||
  lists: "リスト"
 | 
			
		||||
  follow-requests: "フォロー申請"
 | 
			
		||||
@@ -921,9 +948,10 @@ desktop/views/components/window.vue:
 | 
			
		||||
  close: "閉じる"
 | 
			
		||||
desktop/views/pages/admin/admin.vue:
 | 
			
		||||
  dashboard: "ダッシュボード"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  users: "ユーザー"
 | 
			
		||||
  update: "更新"
 | 
			
		||||
  announcements: "お知らせ"
 | 
			
		||||
  hashtags: "ハッシュタグ"
 | 
			
		||||
desktop/views/pages/admin/admin.dashboard.vue:
 | 
			
		||||
  dashboard: "ダッシュボード"
 | 
			
		||||
  all-users: "全てのユーザー"
 | 
			
		||||
@@ -931,6 +959,9 @@ desktop/views/pages/admin/admin.dashboard.vue:
 | 
			
		||||
  all-notes: "全ての投稿"
 | 
			
		||||
  original-notes: "このインスタンスの投稿"
 | 
			
		||||
  invite: "招待"
 | 
			
		||||
  banner-url: "Banner URL"
 | 
			
		||||
  disableRegistration: "Disable new user registration"
 | 
			
		||||
  disableLocalTimeline: "Disable the local timeline"
 | 
			
		||||
desktop/views/pages/admin/admin.suspend-user.vue:
 | 
			
		||||
  suspend-user: "ユーザーの凍結"
 | 
			
		||||
  suspend: "凍結"
 | 
			
		||||
@@ -947,12 +978,23 @@ desktop/views/pages/admin/admin.unverify-user.vue:
 | 
			
		||||
  unverify-user: "ユーザーの公式アカウント解除"
 | 
			
		||||
  unverify: "公式アカウントを解除する"
 | 
			
		||||
  unverified: "公式アカウントを解除しました"
 | 
			
		||||
desktop/views/pages/admin/admin.announcements.vue:
 | 
			
		||||
  announcements: "お知らせ"
 | 
			
		||||
desktop/views/pages/admin/admin.hashtags.vue:
 | 
			
		||||
  hided-tags: "Hidden Tags"
 | 
			
		||||
desktop/views/pages/deck/deck.tl-column.vue:
 | 
			
		||||
  is-media-only: "メディア投稿のみ"
 | 
			
		||||
  is-media-view: "メディアビュー"
 | 
			
		||||
  edit: "オプション"
 | 
			
		||||
desktop/views/pages/deck/deck.user-column.vue:
 | 
			
		||||
  posts: "投稿"
 | 
			
		||||
  following: "フォロー"
 | 
			
		||||
  followers: "フォロワー"
 | 
			
		||||
  images: "画像"
 | 
			
		||||
  activity: "アクティビティ"
 | 
			
		||||
  timeline: "タイムライン"
 | 
			
		||||
  pinned-notes: "ピン留めされた投稿"
 | 
			
		||||
  push-to-a-list: "リストに追加"
 | 
			
		||||
desktop/views/pages/stats/stats.vue:
 | 
			
		||||
  all-users: "全てのユーザー"
 | 
			
		||||
  original-users: "このインスタンスのユーザー"
 | 
			
		||||
@@ -1005,9 +1047,6 @@ desktop/views/pages/user/user.friends.vue:
 | 
			
		||||
  no-users: "よく話すユーザーはいません"
 | 
			
		||||
desktop/views/pages/user/user.vue:
 | 
			
		||||
  is-suspended: "このユーザーは凍結されています。"
 | 
			
		||||
  is-remote: "このユーザーはリモートユーザーです。"
 | 
			
		||||
  view-remote: "正確な情報を見る"
 | 
			
		||||
desktop/views/pages/user/user.home.vue:
 | 
			
		||||
  last-used-at: "最終アクセス"
 | 
			
		||||
desktop/views/pages/user/user.photos.vue:
 | 
			
		||||
  title: "フォト"
 | 
			
		||||
@@ -1021,6 +1060,9 @@ desktop/views/pages/user/user.profile.vue:
 | 
			
		||||
  mute: "ミュートする"
 | 
			
		||||
  muted: "ミュートしています"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロックする"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  block-confirm: "このユーザーをブロックしますか?"
 | 
			
		||||
  push-to-a-list: "リストに追加"
 | 
			
		||||
  list-pushed: "{user}を{list}に追加しました。"
 | 
			
		||||
desktop/views/pages/user/user.header.vue:
 | 
			
		||||
@@ -1028,6 +1070,10 @@ desktop/views/pages/user/user.header.vue:
 | 
			
		||||
  following: "フォロー"
 | 
			
		||||
  followers: "フォロワー"
 | 
			
		||||
  is-bot: "このアカウントはBotです"
 | 
			
		||||
  years-old: "歳"
 | 
			
		||||
  year: "年"
 | 
			
		||||
  month: "月"
 | 
			
		||||
  day: "日"
 | 
			
		||||
desktop/views/pages/user/user.timeline.vue:
 | 
			
		||||
  default: "投稿"
 | 
			
		||||
  with-replies: "投稿と返信"
 | 
			
		||||
@@ -1057,7 +1103,6 @@ desktop/views/widgets/users.vue:
 | 
			
		||||
  refresh: "他を見る"
 | 
			
		||||
  no-one: "いません!"
 | 
			
		||||
mobile/views/components/drive.vue:
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  used: "使用中"
 | 
			
		||||
  folder-count: "フォルダ"
 | 
			
		||||
  count-separator: "、"
 | 
			
		||||
@@ -1161,7 +1206,6 @@ mobile/views/components/ui.nav.vue:
 | 
			
		||||
  messaging: "メッセージ"
 | 
			
		||||
  follow-requests: "フォロー申請"
 | 
			
		||||
  search: "検索"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  favorites: "お気に入り"
 | 
			
		||||
  user-lists: "リスト"
 | 
			
		||||
  widgets: "ウィジェット"
 | 
			
		||||
@@ -1184,7 +1228,6 @@ mobile/views/pages/user-lists.vue:
 | 
			
		||||
  title: "リスト"
 | 
			
		||||
  enter-list-name: "リスト名を入力してください"
 | 
			
		||||
mobile/views/pages/drive.vue:
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  more: "もっと見る"
 | 
			
		||||
mobile/views/pages/signup.vue:
 | 
			
		||||
  lets-start: "📦 始めましょう"
 | 
			
		||||
@@ -1284,6 +1327,7 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  signout: "サインアウト"
 | 
			
		||||
  sound: "サウンド"
 | 
			
		||||
  enable-sounds: "サウンドを有効にする"
 | 
			
		||||
  mark-as-read-all-unread-notes: "すべての投稿を既読にする"
 | 
			
		||||
mobile/views/pages/user.vue:
 | 
			
		||||
  follows-you: "フォローされています"
 | 
			
		||||
  following: "フォロー"
 | 
			
		||||
@@ -1293,8 +1337,10 @@ mobile/views/pages/user.vue:
 | 
			
		||||
  timeline: "タイムライン"
 | 
			
		||||
  media: "メディア"
 | 
			
		||||
  is-suspended: "このユーザーは凍結されています。"
 | 
			
		||||
  is-remote: "このユーザーはリモートユーザーです。"
 | 
			
		||||
  view-remote: "正確な情報を見る"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
mobile/views/pages/user/home.vue:
 | 
			
		||||
  recent-notes: "最近の投稿"
 | 
			
		||||
  images: "画像"
 | 
			
		||||
@@ -1340,3 +1386,29 @@ docs:
 | 
			
		||||
      description: "説明"
 | 
			
		||||
dev/views/index.vue:
 | 
			
		||||
  manage-apps: "アプリの管理"
 | 
			
		||||
dev/views/apps.vue:
 | 
			
		||||
  manage-apps: "アプリを管理"
 | 
			
		||||
  create-app: "アプリ作成"
 | 
			
		||||
  app-missing: "アプリなし"
 | 
			
		||||
dev/views/new-app.vue:
 | 
			
		||||
  create-app: "アプリケーションの作成"
 | 
			
		||||
  app-name: "アプリケーション名"
 | 
			
		||||
  app-name-desc: "あなたのアプリの名称。"
 | 
			
		||||
  app-name-ex: "ex) Misskey for iOS"
 | 
			
		||||
  app-overview: "アプリの概要"
 | 
			
		||||
  app-desc: "あなたのアプリの簡単な説明や紹介。"
 | 
			
		||||
  app-desc-ex: "ex) Misskey iOSクライアント。"
 | 
			
		||||
  callback-url: "コールバックURL (オプション)"
 | 
			
		||||
  callback-url-desc: "ユーザーが認証フォームで認証した際にリダイレクトするURLを設定できます。"
 | 
			
		||||
  authority: "権限"
 | 
			
		||||
  authority-desc: "ここで要求した機能だけがAPIからアクセスできます。"
 | 
			
		||||
  authority-warning: "アプリ作成後も変更できますが、新たな権限を付与する場合、その時点で関連付けられているユーザーキーはすべて無効になります。"
 | 
			
		||||
  account-read: "アカウントの情報を見る。"
 | 
			
		||||
  account-write: "アカウントの情報を操作する。"
 | 
			
		||||
  note-write: "投稿する。"
 | 
			
		||||
  reaction-write: "リアクションしたりリアクションをキャンセルする。"
 | 
			
		||||
  following-write: "フォローしたりフォロー解除する。"
 | 
			
		||||
  drive-read: "ドライブを見る。"
 | 
			
		||||
  drive-write: "ドライブを操作する。"
 | 
			
		||||
  notification-read: "通知を見る。"
 | 
			
		||||
  notification-write: "通知を操作する。"
 | 
			
		||||
 
 | 
			
		||||
@@ -20,11 +20,19 @@ common:
 | 
			
		||||
    drive-desc: "以前投稿したことのある画像をまた投稿したくなったことはありませんか?もしくは、アップロードしたファイルをフォルダ分けして整理したくなったことはありませんか?Misskeyの根幹に組み込まれたドライブ機能によってそれらが解決します。ファイルの共有も簡単です。"
 | 
			
		||||
    outro: "他にもMisskeyにしかない機能はまだまだあるので、ぜひあなた自身の目で確かめてください。Misskeyは分散型SNSなので、このインスタンスが気に入らなければ他のインスタンスを試すこともできます。それでは、GLHF!"
 | 
			
		||||
  adblock:
 | 
			
		||||
    detected: "Bitte deaktivieren Sie den Werbeblocker."
 | 
			
		||||
    detected: "Bitte deaktiviere den Werbeblocker."
 | 
			
		||||
    warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。"
 | 
			
		||||
  application-authorization: "Autorisierte Anwendungen"
 | 
			
		||||
  close: "Schließen"
 | 
			
		||||
  do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
 | 
			
		||||
  BSoD:
 | 
			
		||||
    fatal-error: "Ein schwerwiegender Fehler ist aufgetreten :("
 | 
			
		||||
    update-browser-os: "お使いのブラウザ(またはOS)のバージョンを更新すると解決する可能性があります。"
 | 
			
		||||
    error-code: "Fehlercode"
 | 
			
		||||
    browser-version: "Browserversion"
 | 
			
		||||
    client-version: "Clientversion"
 | 
			
		||||
    email-support: "問題が解決しない場合は、上記の情報をお書き添えの上 syuilotan@yahoo.co.jp までご連絡ください。"
 | 
			
		||||
    thanks: "Vielen Dank dass du Misskey verwendest."
 | 
			
		||||
  got-it: "Verstanden!"
 | 
			
		||||
  customization-tips:
 | 
			
		||||
    title: "Anpassung-Tipps"
 | 
			
		||||
@@ -54,6 +62,7 @@ common:
 | 
			
		||||
    years_ago: "vor {} Jahr{0:en}"
 | 
			
		||||
  month-and-day: "{day}/{month}"
 | 
			
		||||
  trash: "Papierkorb"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  weekday-short:
 | 
			
		||||
    sunday: "So"
 | 
			
		||||
    monday: "Mo"
 | 
			
		||||
@@ -115,6 +124,12 @@ common:
 | 
			
		||||
  reduce-motion: "Animationen der Benutzeroberfläche reduzieren"
 | 
			
		||||
  this-setting-is-this-device-only: "Nur auf diesem Gerät"
 | 
			
		||||
  do-not-use-in-production: 'Dies ist eine Entwicklungsversion. Nicht in einer Produktionsumgebung verwenden.'
 | 
			
		||||
  is-remote-user: "このユーザー情報はコピーです。"
 | 
			
		||||
  is-remote-post: "この投稿情報はコピーです。"
 | 
			
		||||
  view-on-remote: "正確な情報を見る"
 | 
			
		||||
  error:
 | 
			
		||||
    title: '問題が発生しました'
 | 
			
		||||
    retry: 'Erneut versuchen'
 | 
			
		||||
  reversi:
 | 
			
		||||
    drawn: "Unentschieden"
 | 
			
		||||
    my-turn: "Du bist am Zug"
 | 
			
		||||
@@ -154,7 +169,7 @@ common:
 | 
			
		||||
    widgets: "Widget hinzufügen:"
 | 
			
		||||
    home: "Startseite"
 | 
			
		||||
    local: "Lokal"
 | 
			
		||||
    hybrid: "ソーシャル"
 | 
			
		||||
    hybrid: "Sozial"
 | 
			
		||||
    hashtag: "Hashtag"
 | 
			
		||||
    global: "Global"
 | 
			
		||||
    mentions: "Erwähnungen"
 | 
			
		||||
@@ -169,7 +184,8 @@ common:
 | 
			
		||||
    add-column: "Eine Spalte hinzufügen"
 | 
			
		||||
    rename: "Umbenennen"
 | 
			
		||||
    stack-left: "Nach links schichten"
 | 
			
		||||
    pop-right: "右に出す"
 | 
			
		||||
    pop-right: "Rechts andocken"
 | 
			
		||||
  dev: "Fehler beim Erstellen der Applikation. Bitte versuche es erneut."
 | 
			
		||||
auth/views/form.vue:
 | 
			
		||||
  share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
 | 
			
		||||
  permission-ask: "このアプリは次の権限を要求しています:"
 | 
			
		||||
@@ -181,7 +197,7 @@ auth/views/form.vue:
 | 
			
		||||
  drive-read: "ドライブを見る。"
 | 
			
		||||
  drive-write: "ドライブを操作する。"
 | 
			
		||||
  notification-read: "通知を見る。"
 | 
			
		||||
  notification-write: "通知を操作する。"
 | 
			
		||||
  notification-write: "Benachrichtigungen verwalten."
 | 
			
		||||
  cancel: "Abbrechen"
 | 
			
		||||
  accept: "Zugriff erlauben."
 | 
			
		||||
auth/views/index.vue:
 | 
			
		||||
@@ -191,7 +207,7 @@ auth/views/index.vue:
 | 
			
		||||
  already-authorized: "Diese Anwendung ist bereits autorisiert."
 | 
			
		||||
  allowed: "Autorisierung der Anwendung wurde erlaubt."
 | 
			
		||||
  callback-url: "アプリケーションに戻っています"
 | 
			
		||||
  please-go-back: "Bitte gehen Sie zurück zur Anwendung."
 | 
			
		||||
  please-go-back: "Bitte gehe zurück zur Anwendung."
 | 
			
		||||
  error: "Sitzung ist nicht vorhanden."
 | 
			
		||||
  sign-in: "Bitte melde dich an."
 | 
			
		||||
common/views/components/games/reversi/reversi.vue:
 | 
			
		||||
@@ -334,8 +350,8 @@ common/views/components/nav.vue:
 | 
			
		||||
common/views/components/note-menu.vue:
 | 
			
		||||
  detail: "詳細"
 | 
			
		||||
  copy-link: "リンクをコピー"
 | 
			
		||||
  favorite: "Diese Anmerkung favorisieren"
 | 
			
		||||
  unfavorite: "Entfavorisieren"
 | 
			
		||||
  favorite: "Diese Notiz favorisieren"
 | 
			
		||||
  unfavorite: "Aus Favoriten entfernen"
 | 
			
		||||
  pin: "An die Profilseite pinnen"
 | 
			
		||||
  unpin: "ピン留め解除"
 | 
			
		||||
  delete: "Löschen"
 | 
			
		||||
@@ -526,11 +542,14 @@ desktop/views/components/charts.vue:
 | 
			
		||||
  title: "チャート"
 | 
			
		||||
  per-day: "1日ごと"
 | 
			
		||||
  per-hour: "1時間ごと"
 | 
			
		||||
  federation: "フェデレーション"
 | 
			
		||||
  notes: "投稿"
 | 
			
		||||
  users: "ユーザー"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  network: "Netzwerk"
 | 
			
		||||
  charts:
 | 
			
		||||
    federation-instances: "インスタンスの増減"
 | 
			
		||||
    federation-instances-total: "インスタンスの積算"
 | 
			
		||||
    notes: "投稿の増減 (統合)"
 | 
			
		||||
    local-notes: "投稿の増減 (ローカル)"
 | 
			
		||||
    remote-notes: "投稿の増減 (リモート)"
 | 
			
		||||
@@ -560,7 +579,6 @@ desktop/views/components/crop-window.vue:
 | 
			
		||||
  ok: "OK"
 | 
			
		||||
desktop/views/components/drive-window.vue:
 | 
			
		||||
  used: "benutzt"
 | 
			
		||||
  drive: "Speicher"
 | 
			
		||||
desktop/views/components/drive.file.vue:
 | 
			
		||||
  avatar: "Avatar"
 | 
			
		||||
  banner: "Banner"
 | 
			
		||||
@@ -577,7 +595,7 @@ desktop/views/components/drive.file.vue:
 | 
			
		||||
    open-in-app: "In der App öffnen"
 | 
			
		||||
    add-app: "App hinzufügen"
 | 
			
		||||
    rename-file: "Datei umbennen"
 | 
			
		||||
    input-new-file-name: "Geben Sie den neuen Dateinamen an"
 | 
			
		||||
    input-new-file-name: "Gib den neuen Dateinamen an"
 | 
			
		||||
    copied: "Kopieren erfolgreich"
 | 
			
		||||
    copied-url-to-clipboard: "URL wurde in die Zwischenablage kopiert"
 | 
			
		||||
desktop/views/components/drive.folder.vue:
 | 
			
		||||
@@ -590,8 +608,6 @@ desktop/views/components/drive.folder.vue:
 | 
			
		||||
    rename: "Umbenennen"
 | 
			
		||||
    rename-folder: "Ordner umbenennen"
 | 
			
		||||
    input-new-folder-name: "Namen für neuen Ordner eingeben"
 | 
			
		||||
desktop/views/components/drive.nav-folder.vue:
 | 
			
		||||
  drive: "Laufwerk"
 | 
			
		||||
desktop/views/components/drive.vue:
 | 
			
		||||
  search: "Suchen"
 | 
			
		||||
  load-more: "Mehr laden"
 | 
			
		||||
@@ -725,8 +741,8 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  profile: "Profil"
 | 
			
		||||
  notification: "Mitteilungen"
 | 
			
		||||
  apps: "In App öffnen"
 | 
			
		||||
  mute: "Stummschalten"
 | 
			
		||||
  drive: "Dateien vom Drive anfügen"
 | 
			
		||||
  mute-and-block: "ミュート/ブロック"
 | 
			
		||||
  blocking: "ブロック"
 | 
			
		||||
  security: "Sicherheit"
 | 
			
		||||
  signin: "サインイン履歴"
 | 
			
		||||
  password: "Passwort"
 | 
			
		||||
@@ -832,20 +848,32 @@ desktop/views/components/settings.2fa.vue:
 | 
			
		||||
  success: "設定が完了しました!"
 | 
			
		||||
  failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
 | 
			
		||||
  info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
 | 
			
		||||
desktop/views/components/settings.api.vue:
 | 
			
		||||
common/views/components/api-settings.vue:
 | 
			
		||||
  intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
 | 
			
		||||
  caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
 | 
			
		||||
  regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
 | 
			
		||||
  regenerate-token: "トークンを再生成"
 | 
			
		||||
  token: "Token:"
 | 
			
		||||
  enter-password: "Bitte Passwort eingeben"
 | 
			
		||||
  enter-password: "パスワードを入力してください"
 | 
			
		||||
  console:
 | 
			
		||||
    title: 'APIコンソール'
 | 
			
		||||
    endpoint: 'エンドポイント'
 | 
			
		||||
    parameter: 'パラメータ'
 | 
			
		||||
    send: '送信'
 | 
			
		||||
    sending: '応答待ち'
 | 
			
		||||
    response: '結果'
 | 
			
		||||
desktop/views/components/settings.apps.vue:
 | 
			
		||||
  no-apps: "連携しているアプリケーションはありません"
 | 
			
		||||
desktop/views/components/settings.drive.vue:
 | 
			
		||||
  max: "中"
 | 
			
		||||
common/views/components/drive-settings.vue:
 | 
			
		||||
  max: "容量"
 | 
			
		||||
  in-use: "使用中"
 | 
			
		||||
desktop/views/components/settings.mute.vue:
 | 
			
		||||
  no-users: "ミュートしているユーザーはいません"
 | 
			
		||||
  stats: "統計"
 | 
			
		||||
common/views/components/mute-and-block.vue:
 | 
			
		||||
  mute-and-block: "ミュートとブロック"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  no-muted-users: "ミュートしているユーザーはいません"
 | 
			
		||||
  no-blocked-users: "ブロックしているユーザーはいません"
 | 
			
		||||
desktop/views/components/settings.password.vue:
 | 
			
		||||
  reset: "Passwort ändern"
 | 
			
		||||
  enter-current-password: "Derzeitiges Passwort eingeben"
 | 
			
		||||
@@ -877,7 +905,6 @@ desktop/views/components/ui.header.vue:
 | 
			
		||||
  adjective: "さん"
 | 
			
		||||
desktop/views/components/ui.header.account.vue:
 | 
			
		||||
  profile: "Dein Profil"
 | 
			
		||||
  drive: "Speicher"
 | 
			
		||||
  favorites: "Favoriten"
 | 
			
		||||
  lists: "Listen"
 | 
			
		||||
  follow-requests: "フォロー申請"
 | 
			
		||||
@@ -921,9 +948,10 @@ desktop/views/components/window.vue:
 | 
			
		||||
  close: "閉じる"
 | 
			
		||||
desktop/views/pages/admin/admin.vue:
 | 
			
		||||
  dashboard: "ダッシュボード"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  users: "ユーザー"
 | 
			
		||||
  update: "更新"
 | 
			
		||||
  announcements: "お知らせ"
 | 
			
		||||
  hashtags: "ハッシュタグ"
 | 
			
		||||
desktop/views/pages/admin/admin.dashboard.vue:
 | 
			
		||||
  dashboard: "ダッシュボード"
 | 
			
		||||
  all-users: "全てのユーザー"
 | 
			
		||||
@@ -931,6 +959,9 @@ desktop/views/pages/admin/admin.dashboard.vue:
 | 
			
		||||
  all-notes: "全ての投稿"
 | 
			
		||||
  original-notes: "このインスタンスの投稿"
 | 
			
		||||
  invite: "招待"
 | 
			
		||||
  banner-url: "Banner URL"
 | 
			
		||||
  disableRegistration: "Disable new user registration"
 | 
			
		||||
  disableLocalTimeline: "Disable the local timeline"
 | 
			
		||||
desktop/views/pages/admin/admin.suspend-user.vue:
 | 
			
		||||
  suspend-user: "ユーザーの凍結"
 | 
			
		||||
  suspend: "凍結"
 | 
			
		||||
@@ -947,12 +978,23 @@ desktop/views/pages/admin/admin.unverify-user.vue:
 | 
			
		||||
  unverify-user: "ユーザーの公式アカウント解除"
 | 
			
		||||
  unverify: "公式アカウントを解除する"
 | 
			
		||||
  unverified: "公式アカウントを解除しました"
 | 
			
		||||
desktop/views/pages/admin/admin.announcements.vue:
 | 
			
		||||
  announcements: "お知らせ"
 | 
			
		||||
desktop/views/pages/admin/admin.hashtags.vue:
 | 
			
		||||
  hided-tags: "Hidden Tags"
 | 
			
		||||
desktop/views/pages/deck/deck.tl-column.vue:
 | 
			
		||||
  is-media-only: "メディア投稿のみ"
 | 
			
		||||
  is-media-view: "メディアビュー"
 | 
			
		||||
  edit: "オプション"
 | 
			
		||||
desktop/views/pages/deck/deck.user-column.vue:
 | 
			
		||||
  posts: "投稿"
 | 
			
		||||
  following: "フォロー"
 | 
			
		||||
  followers: "フォロワー"
 | 
			
		||||
  images: "画像"
 | 
			
		||||
  activity: "アクティビティ"
 | 
			
		||||
  timeline: "タイムライン"
 | 
			
		||||
  pinned-notes: "ピン留めされた投稿"
 | 
			
		||||
  push-to-a-list: "リストに追加"
 | 
			
		||||
desktop/views/pages/stats/stats.vue:
 | 
			
		||||
  all-users: "全てのユーザー"
 | 
			
		||||
  original-users: "このインスタンスのユーザー"
 | 
			
		||||
@@ -1005,9 +1047,6 @@ desktop/views/pages/user/user.friends.vue:
 | 
			
		||||
  no-users: "よく話すユーザーはいません"
 | 
			
		||||
desktop/views/pages/user/user.vue:
 | 
			
		||||
  is-suspended: "このユーザーは凍結されています。"
 | 
			
		||||
  is-remote: "このユーザーはリモートユーザーです。"
 | 
			
		||||
  view-remote: "正確な情報を見る"
 | 
			
		||||
desktop/views/pages/user/user.home.vue:
 | 
			
		||||
  last-used-at: "最終アクセス"
 | 
			
		||||
desktop/views/pages/user/user.photos.vue:
 | 
			
		||||
  title: "フォト"
 | 
			
		||||
@@ -1021,6 +1060,9 @@ desktop/views/pages/user/user.profile.vue:
 | 
			
		||||
  mute: "ミュートする"
 | 
			
		||||
  muted: "ミュートしています"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロックする"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  block-confirm: "このユーザーをブロックしますか?"
 | 
			
		||||
  push-to-a-list: "リストに追加"
 | 
			
		||||
  list-pushed: "{user}を{list}に追加しました。"
 | 
			
		||||
desktop/views/pages/user/user.header.vue:
 | 
			
		||||
@@ -1028,6 +1070,10 @@ desktop/views/pages/user/user.header.vue:
 | 
			
		||||
  following: "フォロー"
 | 
			
		||||
  followers: "フォロワー"
 | 
			
		||||
  is-bot: "このアカウントはBotです"
 | 
			
		||||
  years-old: "歳"
 | 
			
		||||
  year: "年"
 | 
			
		||||
  month: "月"
 | 
			
		||||
  day: "日"
 | 
			
		||||
desktop/views/pages/user/user.timeline.vue:
 | 
			
		||||
  default: "投稿"
 | 
			
		||||
  with-replies: "投稿と返信"
 | 
			
		||||
@@ -1057,7 +1103,6 @@ desktop/views/widgets/users.vue:
 | 
			
		||||
  refresh: "他を見る"
 | 
			
		||||
  no-one: "いません!"
 | 
			
		||||
mobile/views/components/drive.vue:
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  used: "使用中"
 | 
			
		||||
  folder-count: "フォルダ"
 | 
			
		||||
  count-separator: "、"
 | 
			
		||||
@@ -1161,7 +1206,6 @@ mobile/views/components/ui.nav.vue:
 | 
			
		||||
  messaging: "メッセージ"
 | 
			
		||||
  follow-requests: "フォロー申請"
 | 
			
		||||
  search: "検索"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  favorites: "お気に入り"
 | 
			
		||||
  user-lists: "リスト"
 | 
			
		||||
  widgets: "ウィジェット"
 | 
			
		||||
@@ -1184,7 +1228,6 @@ mobile/views/pages/user-lists.vue:
 | 
			
		||||
  title: "リスト"
 | 
			
		||||
  enter-list-name: "リスト名を入力してください"
 | 
			
		||||
mobile/views/pages/drive.vue:
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  more: "Mehr laden"
 | 
			
		||||
mobile/views/pages/signup.vue:
 | 
			
		||||
  lets-start: "📦 始めましょう"
 | 
			
		||||
@@ -1284,6 +1327,7 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  signout: "サインアウト"
 | 
			
		||||
  sound: "サウンド"
 | 
			
		||||
  enable-sounds: "サウンドを有効にする"
 | 
			
		||||
  mark-as-read-all-unread-notes: "すべての投稿を既読にする"
 | 
			
		||||
mobile/views/pages/user.vue:
 | 
			
		||||
  follows-you: "フォローされています"
 | 
			
		||||
  following: "フォロー"
 | 
			
		||||
@@ -1293,8 +1337,10 @@ mobile/views/pages/user.vue:
 | 
			
		||||
  timeline: "タイムライン"
 | 
			
		||||
  media: "メディア"
 | 
			
		||||
  is-suspended: "このユーザーは凍結されています。"
 | 
			
		||||
  is-remote: "このユーザーはリモートユーザーです。"
 | 
			
		||||
  view-remote: "正確な情報を見る"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
mobile/views/pages/user/home.vue:
 | 
			
		||||
  recent-notes: "最近の投稿"
 | 
			
		||||
  images: "画像"
 | 
			
		||||
@@ -1340,3 +1386,29 @@ docs:
 | 
			
		||||
      description: "説明"
 | 
			
		||||
dev/views/index.vue:
 | 
			
		||||
  manage-apps: "アプリの管理"
 | 
			
		||||
dev/views/apps.vue:
 | 
			
		||||
  manage-apps: "アプリを管理"
 | 
			
		||||
  create-app: "アプリ作成"
 | 
			
		||||
  app-missing: "アプリなし"
 | 
			
		||||
dev/views/new-app.vue:
 | 
			
		||||
  create-app: "アプリケーションの作成"
 | 
			
		||||
  app-name: "アプリケーション名"
 | 
			
		||||
  app-name-desc: "あなたのアプリの名称。"
 | 
			
		||||
  app-name-ex: "ex) Misskey for iOS"
 | 
			
		||||
  app-overview: "アプリの概要"
 | 
			
		||||
  app-desc: "あなたのアプリの簡単な説明や紹介。"
 | 
			
		||||
  app-desc-ex: "ex) Misskey iOSクライアント。"
 | 
			
		||||
  callback-url: "コールバックURL (オプション)"
 | 
			
		||||
  callback-url-desc: "ユーザーが認証フォームで認証した際にリダイレクトするURLを設定できます。"
 | 
			
		||||
  authority: "権限"
 | 
			
		||||
  authority-desc: "ここで要求した機能だけがAPIからアクセスできます。"
 | 
			
		||||
  authority-warning: "アプリ作成後も変更できますが、新たな権限を付与する場合、その時点で関連付けられているユーザーキーはすべて無効になります。"
 | 
			
		||||
  account-read: "アカウントの情報を見る。"
 | 
			
		||||
  account-write: "アカウントの情報を操作する。"
 | 
			
		||||
  note-write: "投稿する。"
 | 
			
		||||
  reaction-write: "リアクションしたりリアクションをキャンセルする。"
 | 
			
		||||
  following-write: "フォローしたりフォロー解除する。"
 | 
			
		||||
  drive-read: "ドライブを見る。"
 | 
			
		||||
  drive-write: "ドライブを操作する。"
 | 
			
		||||
  notification-read: "通知を見る。"
 | 
			
		||||
  notification-write: "通知を操作する。"
 | 
			
		||||
 
 | 
			
		||||
@@ -25,6 +25,14 @@ common:
 | 
			
		||||
  application-authorization: "Application authorizations"
 | 
			
		||||
  close: "Close"
 | 
			
		||||
  do-not-copy-paste: "Please do not enter or paste the code here. Account may be compromised."
 | 
			
		||||
  BSoD:
 | 
			
		||||
    fatal-error: "A fatal error has occurred :("
 | 
			
		||||
    update-browser-os: "You might resolve to update the version of your browser (or OS)."
 | 
			
		||||
    error-code: "Error code"
 | 
			
		||||
    browser-version: "Browser version"
 | 
			
		||||
    client-version: "Client version"
 | 
			
		||||
    email-support: "If the problem persists, contact syuilotan@yahoo.co.jp please on the above information."
 | 
			
		||||
    thanks: "Thank you for using Misskey."
 | 
			
		||||
  got-it: "Got it!"
 | 
			
		||||
  customization-tips:
 | 
			
		||||
    title: "Customization tips"
 | 
			
		||||
@@ -54,6 +62,7 @@ common:
 | 
			
		||||
    years_ago: "{}year(s) ago"
 | 
			
		||||
  month-and-day: "{month}/{day}"
 | 
			
		||||
  trash: "Trash"
 | 
			
		||||
  drive: "Drive"
 | 
			
		||||
  weekday-short:
 | 
			
		||||
    sunday: "S"
 | 
			
		||||
    monday: "M"
 | 
			
		||||
@@ -115,6 +124,12 @@ common:
 | 
			
		||||
  reduce-motion: "Reduce motion in UI"
 | 
			
		||||
  this-setting-is-this-device-only: "Only for this device"
 | 
			
		||||
  do-not-use-in-production: 'As this is for development, do not use this 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"
 | 
			
		||||
  error:
 | 
			
		||||
    title: 'Something happened :('
 | 
			
		||||
    retry: 'Retry'
 | 
			
		||||
  reversi:
 | 
			
		||||
    drawn: "Draw"
 | 
			
		||||
    my-turn: "Your turn"
 | 
			
		||||
@@ -170,6 +185,7 @@ common:
 | 
			
		||||
    rename: "Rename"
 | 
			
		||||
    stack-left: "Stack to the left"
 | 
			
		||||
    pop-right: "Dock on the right"
 | 
			
		||||
  dev: "Failed to create the application. Please try again."
 | 
			
		||||
auth/views/form.vue:
 | 
			
		||||
  share-access: "Would you <b>allow</b> <i>{{ app.name }}</i> to access your account?"
 | 
			
		||||
  permission-ask: "This application requires the following permissions:"
 | 
			
		||||
@@ -526,11 +542,14 @@ desktop/views/components/charts.vue:
 | 
			
		||||
  title: "Charts"
 | 
			
		||||
  per-day: "per Day"
 | 
			
		||||
  per-hour: "per Hour"
 | 
			
		||||
  federation: "Federation"
 | 
			
		||||
  notes: "Posts"
 | 
			
		||||
  users: "Users"
 | 
			
		||||
  drive: "Drive"
 | 
			
		||||
  network: "Network"
 | 
			
		||||
  charts:
 | 
			
		||||
    federation-instances: "The number of instances: increase/decrease"
 | 
			
		||||
    federation-instances-total: "Total number of instances"
 | 
			
		||||
    notes: "The number of posts: increase/decrease (Combined)"
 | 
			
		||||
    local-notes: "The number of posts: increase/decrease (Local)"
 | 
			
		||||
    remote-notes: "The number of posts: increase/decrease (Remote)"
 | 
			
		||||
@@ -560,7 +579,6 @@ desktop/views/components/crop-window.vue:
 | 
			
		||||
  ok: "OK"
 | 
			
		||||
desktop/views/components/drive-window.vue:
 | 
			
		||||
  used: "used"
 | 
			
		||||
  drive: "Media storage"
 | 
			
		||||
desktop/views/components/drive.file.vue:
 | 
			
		||||
  avatar: "Avatar"
 | 
			
		||||
  banner: "Banner"
 | 
			
		||||
@@ -590,8 +608,6 @@ desktop/views/components/drive.folder.vue:
 | 
			
		||||
    rename: "Rename"
 | 
			
		||||
    rename-folder: "Rename folder"
 | 
			
		||||
    input-new-folder-name: "Enter new name"
 | 
			
		||||
desktop/views/components/drive.nav-folder.vue:
 | 
			
		||||
  drive: "Media storage"
 | 
			
		||||
desktop/views/components/drive.vue:
 | 
			
		||||
  search: "Search"
 | 
			
		||||
  load-more: "Load more"
 | 
			
		||||
@@ -725,8 +741,8 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  profile: "Profile"
 | 
			
		||||
  notification: "Notification"
 | 
			
		||||
  apps: "Apps"
 | 
			
		||||
  mute: "Mute"
 | 
			
		||||
  drive: "Drive"
 | 
			
		||||
  mute-and-block: "Mute / Block"
 | 
			
		||||
  blocking: "Blocking"
 | 
			
		||||
  security: "Security"
 | 
			
		||||
  signin: "Sign in history"
 | 
			
		||||
  password: "Password"
 | 
			
		||||
@@ -745,9 +761,9 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  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: "デッキ内ナビゲーション"
 | 
			
		||||
  deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
 | 
			
		||||
  deck-default: "デッキをデフォルトのUIにする"
 | 
			
		||||
  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"
 | 
			
		||||
  display: "Design and display"
 | 
			
		||||
  customize: "Customize home layout"
 | 
			
		||||
  wallpaper: "Wallpaper"
 | 
			
		||||
@@ -764,7 +780,7 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  show-reply-target: "Display reply target"
 | 
			
		||||
  timeline: "Timeline"
 | 
			
		||||
  show-my-renotes: "Show my renotes in the timeline"
 | 
			
		||||
  show-renoted-my-notes: "Show renoted my posts in timelines"
 | 
			
		||||
  show-renoted-my-notes: "Show renoted posts of mine in timelines"
 | 
			
		||||
  show-local-renotes: "Show renoted local posts in timelines"
 | 
			
		||||
  show-maps: "Display a map to show the location"
 | 
			
		||||
  deck-column-align: "Deck column alignment"
 | 
			
		||||
@@ -832,20 +848,32 @@ desktop/views/components/settings.2fa.vue:
 | 
			
		||||
  success: "Settings saved!"
 | 
			
		||||
  failed: "Failed to setup. Please ensure that the token is correct."
 | 
			
		||||
  info: "From the next time you sign in to Misskey, the token displayed on your device will be necessary too, as well as the password."
 | 
			
		||||
desktop/views/components/settings.api.vue:
 | 
			
		||||
common/views/components/api-settings.vue:
 | 
			
		||||
  intro: "To access the API, set this token as the key 'i' of request parameters."
 | 
			
		||||
  caution: "Do not enter this token to any apps nor tell this token to others otherwise your account may get compromised."
 | 
			
		||||
  regeneration-of-token: "If your token gets leaked, you can regenerate it."
 | 
			
		||||
  regenerate-token: "Regenerate the token"
 | 
			
		||||
  token: "Token:"
 | 
			
		||||
  enter-password: "Please enter the password"
 | 
			
		||||
  enter-password: "Enter the password"
 | 
			
		||||
  console:
 | 
			
		||||
    title: 'API console'
 | 
			
		||||
    endpoint: 'Endpoint'
 | 
			
		||||
    parameter: 'Parameters'
 | 
			
		||||
    send: 'Send'
 | 
			
		||||
    sending: 'Sending'
 | 
			
		||||
    response: 'Result'
 | 
			
		||||
desktop/views/components/settings.apps.vue:
 | 
			
		||||
  no-apps: "No linked applications"
 | 
			
		||||
desktop/views/components/settings.drive.vue:
 | 
			
		||||
common/views/components/drive-settings.vue:
 | 
			
		||||
  max: "Max"
 | 
			
		||||
  in-use: "In use"
 | 
			
		||||
desktop/views/components/settings.mute.vue:
 | 
			
		||||
  no-users: "No muted users"
 | 
			
		||||
  stats: "Statistics"
 | 
			
		||||
common/views/components/mute-and-block.vue:
 | 
			
		||||
  mute-and-block: "Mute / Block"
 | 
			
		||||
  mute: "Mute"
 | 
			
		||||
  block: "Blocking"
 | 
			
		||||
  no-muted-users: "No muted users"
 | 
			
		||||
  no-blocked-users: "No blocked users"
 | 
			
		||||
desktop/views/components/settings.password.vue:
 | 
			
		||||
  reset: "Change password"
 | 
			
		||||
  enter-current-password: "Enter the current password"
 | 
			
		||||
@@ -877,7 +905,6 @@ desktop/views/components/ui.header.vue:
 | 
			
		||||
  adjective: "-san"
 | 
			
		||||
desktop/views/components/ui.header.account.vue:
 | 
			
		||||
  profile: "Your profile"
 | 
			
		||||
  drive: "Media storage"
 | 
			
		||||
  favorites: "Favorites"
 | 
			
		||||
  lists: "Lists"
 | 
			
		||||
  follow-requests: "Follow requests"
 | 
			
		||||
@@ -921,9 +948,10 @@ desktop/views/components/window.vue:
 | 
			
		||||
  close: "Close"
 | 
			
		||||
desktop/views/pages/admin/admin.vue:
 | 
			
		||||
  dashboard: "Dashboard"
 | 
			
		||||
  drive: "Drive"
 | 
			
		||||
  users: "Users"
 | 
			
		||||
  update: "Updates"
 | 
			
		||||
  announcements: "Announcements"
 | 
			
		||||
  hashtags: "Hashtags"
 | 
			
		||||
desktop/views/pages/admin/admin.dashboard.vue:
 | 
			
		||||
  dashboard: "Dashboard"
 | 
			
		||||
  all-users: "All Users"
 | 
			
		||||
@@ -931,6 +959,9 @@ desktop/views/pages/admin/admin.dashboard.vue:
 | 
			
		||||
  all-notes: "All the posts"
 | 
			
		||||
  original-notes: "Posts on this instance"
 | 
			
		||||
  invite: "Invite"
 | 
			
		||||
  banner-url: "Banner URL"
 | 
			
		||||
  disableRegistration: "Disable new user registration"
 | 
			
		||||
  disableLocalTimeline: "Disable the local timeline"
 | 
			
		||||
desktop/views/pages/admin/admin.suspend-user.vue:
 | 
			
		||||
  suspend-user: "Suspend a user"
 | 
			
		||||
  suspend: "Suspend"
 | 
			
		||||
@@ -947,12 +978,23 @@ desktop/views/pages/admin/admin.unverify-user.vue:
 | 
			
		||||
  unverify-user: "User account unverification settings"
 | 
			
		||||
  unverify: "Unverify account"
 | 
			
		||||
  unverified: "The account is now being unverified"
 | 
			
		||||
desktop/views/pages/admin/admin.announcements.vue:
 | 
			
		||||
  announcements: "Announcements"
 | 
			
		||||
desktop/views/pages/admin/admin.hashtags.vue:
 | 
			
		||||
  hided-tags: "Hidden Tags"
 | 
			
		||||
desktop/views/pages/deck/deck.tl-column.vue:
 | 
			
		||||
  is-media-only: "Only media posts"
 | 
			
		||||
  is-media-view: "Media view"
 | 
			
		||||
  edit: "Options"
 | 
			
		||||
desktop/views/pages/deck/deck.user-column.vue:
 | 
			
		||||
  posts: "Posts"
 | 
			
		||||
  following: "Following"
 | 
			
		||||
  followers: "Followers"
 | 
			
		||||
  images: "Images"
 | 
			
		||||
  activity: "Activity"
 | 
			
		||||
  timeline: "Timeline"
 | 
			
		||||
  pinned-notes: "Pinned posts"
 | 
			
		||||
  push-to-a-list: "Add to list"
 | 
			
		||||
desktop/views/pages/stats/stats.vue:
 | 
			
		||||
  all-users: "All Users"
 | 
			
		||||
  original-users: "Users on this instance"
 | 
			
		||||
@@ -1005,10 +1047,7 @@ desktop/views/pages/user/user.friends.vue:
 | 
			
		||||
  no-users: "No frequent mentions"
 | 
			
		||||
desktop/views/pages/user/user.vue:
 | 
			
		||||
  is-suspended: "This account has been suspended."
 | 
			
		||||
  is-remote: "This profile belongs to a remote user. The profile that you see here may not be complete. "
 | 
			
		||||
  view-remote: "See their complete profile"
 | 
			
		||||
desktop/views/pages/user/user.home.vue:
 | 
			
		||||
  last-used-at: "Last active:"
 | 
			
		||||
  last-used-at: "Last active"
 | 
			
		||||
desktop/views/pages/user/user.photos.vue:
 | 
			
		||||
  title: "Photos"
 | 
			
		||||
  loading: "Loading"
 | 
			
		||||
@@ -1021,6 +1060,9 @@ desktop/views/pages/user/user.profile.vue:
 | 
			
		||||
  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}."
 | 
			
		||||
desktop/views/pages/user/user.header.vue:
 | 
			
		||||
@@ -1028,6 +1070,10 @@ desktop/views/pages/user/user.header.vue:
 | 
			
		||||
  following: "Following"
 | 
			
		||||
  followers: "Followers"
 | 
			
		||||
  is-bot: "This account is a Bot"
 | 
			
		||||
  years-old: " years old"
 | 
			
		||||
  year: "/"
 | 
			
		||||
  month: "/"
 | 
			
		||||
  day: "-"
 | 
			
		||||
desktop/views/pages/user/user.timeline.vue:
 | 
			
		||||
  default: "Posts"
 | 
			
		||||
  with-replies: "Posts and replies"
 | 
			
		||||
@@ -1057,7 +1103,6 @@ desktop/views/widgets/users.vue:
 | 
			
		||||
  refresh: "refresh"
 | 
			
		||||
  no-one: "Anyone!"
 | 
			
		||||
mobile/views/components/drive.vue:
 | 
			
		||||
  drive: "Media storage"
 | 
			
		||||
  used: "used"
 | 
			
		||||
  folder-count: "Folder(s)"
 | 
			
		||||
  count-separator: ", "
 | 
			
		||||
@@ -1161,7 +1206,6 @@ mobile/views/components/ui.nav.vue:
 | 
			
		||||
  messaging: "Messages"
 | 
			
		||||
  follow-requests: "Follow requests"
 | 
			
		||||
  search: "Search"
 | 
			
		||||
  drive: "Drive"
 | 
			
		||||
  favorites: "Favorites"
 | 
			
		||||
  user-lists: "Lists"
 | 
			
		||||
  widgets: "Widgets"
 | 
			
		||||
@@ -1176,7 +1220,7 @@ mobile/views/components/user-timeline.vue:
 | 
			
		||||
  load-more: "More"
 | 
			
		||||
mobile/views/components/users-list.vue:
 | 
			
		||||
  all: "All"
 | 
			
		||||
  known: "You know"
 | 
			
		||||
  known: "In common"
 | 
			
		||||
  load-more: "More"
 | 
			
		||||
mobile/views/pages/favorites.vue:
 | 
			
		||||
  title: "Favorites"
 | 
			
		||||
@@ -1184,7 +1228,6 @@ mobile/views/pages/user-lists.vue:
 | 
			
		||||
  title: "Lists"
 | 
			
		||||
  enter-list-name: "Enter a name of the list to make"
 | 
			
		||||
mobile/views/pages/drive.vue:
 | 
			
		||||
  drive: "Drive"
 | 
			
		||||
  more: "Load more"
 | 
			
		||||
mobile/views/pages/signup.vue:
 | 
			
		||||
  lets-start: "Your account is now ready! 📦"
 | 
			
		||||
@@ -1250,7 +1293,7 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  timeline: "Timeline"
 | 
			
		||||
  show-reply-target: "Show reply target"
 | 
			
		||||
  show-my-renotes: "Show my reposts"
 | 
			
		||||
  show-renoted-my-notes: "Show renoted my posts"
 | 
			
		||||
  show-renoted-my-notes: "Show renoted posts of mine"
 | 
			
		||||
  show-local-renotes: "Show renoted local posts"
 | 
			
		||||
  post-style: "Post design"
 | 
			
		||||
  post-style-standard: "Standard"
 | 
			
		||||
@@ -1284,6 +1327,7 @@ 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"
 | 
			
		||||
mobile/views/pages/user.vue:
 | 
			
		||||
  follows-you: "Follows you"
 | 
			
		||||
  following: "Following"
 | 
			
		||||
@@ -1293,8 +1337,10 @@ mobile/views/pages/user.vue:
 | 
			
		||||
  timeline: "Timeline"
 | 
			
		||||
  media: "Media"
 | 
			
		||||
  is-suspended: "This account has been suspended."
 | 
			
		||||
  is-remote: "The user is a remote user. The profile that you see here may not complete."
 | 
			
		||||
  view-remote: "See his/her complete profile"
 | 
			
		||||
  mute: "Mute"
 | 
			
		||||
  unmute: "Unmute"
 | 
			
		||||
  block: "Block"
 | 
			
		||||
  unblock: "Unblock"
 | 
			
		||||
mobile/views/pages/user/home.vue:
 | 
			
		||||
  recent-notes: "Recent notes"
 | 
			
		||||
  images: "Images"
 | 
			
		||||
@@ -1340,3 +1386,29 @@ docs:
 | 
			
		||||
      description: "Description"
 | 
			
		||||
dev/views/index.vue:
 | 
			
		||||
  manage-apps: "Manage apps"
 | 
			
		||||
dev/views/apps.vue:
 | 
			
		||||
  manage-apps: "Manage apps"
 | 
			
		||||
  create-app: "Create app"
 | 
			
		||||
  app-missing: "No apps"
 | 
			
		||||
dev/views/new-app.vue:
 | 
			
		||||
  create-app: "Creating application"
 | 
			
		||||
  app-name: "Application name"
 | 
			
		||||
  app-name-desc: "The name of your app"
 | 
			
		||||
  app-name-ex: "ex) Misskey for iOS"
 | 
			
		||||
  app-overview: "Application summary"
 | 
			
		||||
  app-desc: "A brief description or introduction of your app."
 | 
			
		||||
  app-desc-ex: "ex) Misskey iOS client."
 | 
			
		||||
  callback-url: "The callback URL (optional)"
 | 
			
		||||
  callback-url-desc: "The URL to redirect to after the user is authenticated via the authentication form."
 | 
			
		||||
  authority: "Permissions"
 | 
			
		||||
  authority-desc: "Only the functions requested here can be accessed via the API."
 | 
			
		||||
  authority-warning: "You can change it even after creating the application, but if you give different permissions, all user keys associated at that time will be invalidated."
 | 
			
		||||
  account-read: "View account information."
 | 
			
		||||
  account-write: "Modify account information."
 | 
			
		||||
  note-write: "Post."
 | 
			
		||||
  reaction-write: "Add or remove reactions."
 | 
			
		||||
  following-write: "Follow and unfollow."
 | 
			
		||||
  drive-read: "Read the drive."
 | 
			
		||||
  drive-write: "Upload/delete files in the drive."
 | 
			
		||||
  notification-read: "Read your notifications."
 | 
			
		||||
  notification-write: "Manage your notifications."
 | 
			
		||||
 
 | 
			
		||||
@@ -25,6 +25,14 @@ common:
 | 
			
		||||
  application-authorization: "Autorizaciones de la aplicación."
 | 
			
		||||
  close: "Cerrar"
 | 
			
		||||
  do-not-copy-paste: "Por favor no copies código aquí. Tu cuenta puede resultar comprometida."
 | 
			
		||||
  BSoD:
 | 
			
		||||
    fatal-error: ":( 致命的な問題が発生しました。"
 | 
			
		||||
    update-browser-os: "お使いのブラウザ(またはOS)のバージョンを更新すると解決する可能性があります。"
 | 
			
		||||
    error-code: "エラーコード"
 | 
			
		||||
    browser-version: "ブラウザ バージョン"
 | 
			
		||||
    client-version: "クライアント バージョン"
 | 
			
		||||
    email-support: "問題が解決しない場合は、上記の情報をお書き添えの上 syuilotan@yahoo.co.jp までご連絡ください。"
 | 
			
		||||
    thanks: "Thank you for using Misskey."
 | 
			
		||||
  got-it: "¡Listo!"
 | 
			
		||||
  customization-tips:
 | 
			
		||||
    title: "Consejos de personalización"
 | 
			
		||||
@@ -54,6 +62,7 @@ common:
 | 
			
		||||
    years_ago: "Hace {} año(s)"
 | 
			
		||||
  month-and-day: "{day} de {month}"
 | 
			
		||||
  trash: "Papelera"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  weekday-short:
 | 
			
		||||
    sunday: "domingo"
 | 
			
		||||
    monday: "lunes"
 | 
			
		||||
@@ -115,6 +124,12 @@ common:
 | 
			
		||||
  reduce-motion: "UIの動きを減らす"
 | 
			
		||||
  this-setting-is-this-device-only: "このデバイスのみ"
 | 
			
		||||
  do-not-use-in-production: 'Esto está en desarrollo, no usarlo para producción.'
 | 
			
		||||
  is-remote-user: "このユーザー情報はコピーです。"
 | 
			
		||||
  is-remote-post: "この投稿情報はコピーです。"
 | 
			
		||||
  view-on-remote: "正確な情報を見る"
 | 
			
		||||
  error:
 | 
			
		||||
    title: '問題が発生しました'
 | 
			
		||||
    retry: 'やり直す'
 | 
			
		||||
  reversi:
 | 
			
		||||
    drawn: "Empatado"
 | 
			
		||||
    my-turn: "Mi turno"
 | 
			
		||||
@@ -170,6 +185,7 @@ common:
 | 
			
		||||
    rename: "Renombrar"
 | 
			
		||||
    stack-left: "A la izqda."
 | 
			
		||||
    pop-right: "A la dcha."
 | 
			
		||||
  dev: "アプリの作成に失敗しました。再度お試しください。"
 | 
			
		||||
auth/views/form.vue:
 | 
			
		||||
  share-access: "¿Deseas <b>permitir</b> a <i>{{ app.name }}</i> acceder a tu cuenta?"
 | 
			
		||||
  permission-ask: "La aplicación requiere los siguientes permisos:"
 | 
			
		||||
@@ -526,11 +542,14 @@ desktop/views/components/charts.vue:
 | 
			
		||||
  title: "Gráficos"
 | 
			
		||||
  per-day: "por día"
 | 
			
		||||
  per-hour: "por hora"
 | 
			
		||||
  federation: "フェデレーション"
 | 
			
		||||
  notes: "Publicaciones"
 | 
			
		||||
  users: "Usuarios"
 | 
			
		||||
  drive: "Unidad"
 | 
			
		||||
  network: "ネットワーク"
 | 
			
		||||
  charts:
 | 
			
		||||
    federation-instances: "インスタンスの増減"
 | 
			
		||||
    federation-instances-total: "インスタンスの積算"
 | 
			
		||||
    notes: "Número de publicaciones: aumentar/disminuir (Combinado)"
 | 
			
		||||
    local-notes: "Número de publicaciones: aumentar/disminuir (Local)"
 | 
			
		||||
    remote-notes: "Número de publicaciones: aumentar/disminuir (Remoto)"
 | 
			
		||||
@@ -560,7 +579,6 @@ desktop/views/components/crop-window.vue:
 | 
			
		||||
  ok: "OK"
 | 
			
		||||
desktop/views/components/drive-window.vue:
 | 
			
		||||
  used: "usado"
 | 
			
		||||
  drive: "Disco"
 | 
			
		||||
desktop/views/components/drive.file.vue:
 | 
			
		||||
  avatar: "Avatar"
 | 
			
		||||
  banner: "Banner"
 | 
			
		||||
@@ -590,8 +608,6 @@ desktop/views/components/drive.folder.vue:
 | 
			
		||||
    rename: "Renombrar"
 | 
			
		||||
    rename-folder: "Renombrar carpeta"
 | 
			
		||||
    input-new-folder-name: "Escribe el nombre nuevo"
 | 
			
		||||
desktop/views/components/drive.nav-folder.vue:
 | 
			
		||||
  drive: "Disco"
 | 
			
		||||
desktop/views/components/drive.vue:
 | 
			
		||||
  search: "Buscar"
 | 
			
		||||
  load-more: "Cargar más"
 | 
			
		||||
@@ -725,8 +741,8 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  profile: "Perfil"
 | 
			
		||||
  notification: "Notificación"
 | 
			
		||||
  apps: "Aplicaciones"
 | 
			
		||||
  mute: "Silenciar"
 | 
			
		||||
  drive: "Disco"
 | 
			
		||||
  mute-and-block: "ミュート/ブロック"
 | 
			
		||||
  blocking: "ブロック"
 | 
			
		||||
  security: "Seguridad"
 | 
			
		||||
  signin: "Historial de inicios de sesión"
 | 
			
		||||
  password: "Contraseña"
 | 
			
		||||
@@ -832,20 +848,32 @@ desktop/views/components/settings.2fa.vue:
 | 
			
		||||
  success: "¡Configuraciones guardadas!"
 | 
			
		||||
  failed: "Error al configurar. Por favor asegúrate de que el token es correcto."
 | 
			
		||||
  info: "Desde ahora, ingresa el token que se muestra en tu dispositivo adicionalmente a tu contraseña cuando inicies sesión en Misskey"
 | 
			
		||||
desktop/views/components/settings.api.vue:
 | 
			
		||||
  intro: "Para acceder al API, configura este token como la letra \"i\" de los parámetros requeridos."
 | 
			
		||||
  caution: "Por favor no muestres este token a otros (no lo ingreses en otro lugar que no sea aquí). De otra forma, tu cuenta puede llegar a ser comprometida."
 | 
			
		||||
  regeneration-of-token: "En el caso no deseado de que este token lo tenga otra persona, puedes regenerarlo."
 | 
			
		||||
  regenerate-token: "Regenerar el token"
 | 
			
		||||
common/views/components/api-settings.vue:
 | 
			
		||||
  intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
 | 
			
		||||
  caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
 | 
			
		||||
  regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
 | 
			
		||||
  regenerate-token: "トークンを再生成"
 | 
			
		||||
  token: "Token:"
 | 
			
		||||
  enter-password: "Por favor ingresa tu contraseña"
 | 
			
		||||
  enter-password: "パスワードを入力してください"
 | 
			
		||||
  console:
 | 
			
		||||
    title: 'APIコンソール'
 | 
			
		||||
    endpoint: 'エンドポイント'
 | 
			
		||||
    parameter: 'パラメータ'
 | 
			
		||||
    send: '送信'
 | 
			
		||||
    sending: '応答待ち'
 | 
			
		||||
    response: '結果'
 | 
			
		||||
desktop/views/components/settings.apps.vue:
 | 
			
		||||
  no-apps: "No hay aplicaciones asociadas"
 | 
			
		||||
desktop/views/components/settings.drive.vue:
 | 
			
		||||
  max: "Max"
 | 
			
		||||
  in-use: "en uso."
 | 
			
		||||
desktop/views/components/settings.mute.vue:
 | 
			
		||||
  no-users: "No hay usuarios silenciados"
 | 
			
		||||
common/views/components/drive-settings.vue:
 | 
			
		||||
  max: "容量"
 | 
			
		||||
  in-use: "使用中"
 | 
			
		||||
  stats: "統計"
 | 
			
		||||
common/views/components/mute-and-block.vue:
 | 
			
		||||
  mute-and-block: "ミュートとブロック"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  no-muted-users: "ミュートしているユーザーはいません"
 | 
			
		||||
  no-blocked-users: "ブロックしているユーザーはいません"
 | 
			
		||||
desktop/views/components/settings.password.vue:
 | 
			
		||||
  reset: "Cambiar contraseña"
 | 
			
		||||
  enter-current-password: "Ingresar contraseña actual"
 | 
			
		||||
@@ -877,7 +905,6 @@ desktop/views/components/ui.header.vue:
 | 
			
		||||
  adjective: "-san"
 | 
			
		||||
desktop/views/components/ui.header.account.vue:
 | 
			
		||||
  profile: "Tu perfil"
 | 
			
		||||
  drive: "Unidad"
 | 
			
		||||
  favorites: "Favoritos"
 | 
			
		||||
  lists: "Listas"
 | 
			
		||||
  follow-requests: "Solicitudes de seguimiento"
 | 
			
		||||
@@ -921,9 +948,10 @@ desktop/views/components/window.vue:
 | 
			
		||||
  close: "閉じる"
 | 
			
		||||
desktop/views/pages/admin/admin.vue:
 | 
			
		||||
  dashboard: "ダッシュボード"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  users: "ユーザー"
 | 
			
		||||
  update: "更新"
 | 
			
		||||
  announcements: "お知らせ"
 | 
			
		||||
  hashtags: "ハッシュタグ"
 | 
			
		||||
desktop/views/pages/admin/admin.dashboard.vue:
 | 
			
		||||
  dashboard: "ダッシュボード"
 | 
			
		||||
  all-users: "全てのユーザー"
 | 
			
		||||
@@ -931,6 +959,9 @@ desktop/views/pages/admin/admin.dashboard.vue:
 | 
			
		||||
  all-notes: "全ての投稿"
 | 
			
		||||
  original-notes: "このインスタンスの投稿"
 | 
			
		||||
  invite: "招待"
 | 
			
		||||
  banner-url: "Banner URL"
 | 
			
		||||
  disableRegistration: "Disable new user registration"
 | 
			
		||||
  disableLocalTimeline: "Disable the local timeline"
 | 
			
		||||
desktop/views/pages/admin/admin.suspend-user.vue:
 | 
			
		||||
  suspend-user: "ユーザーの凍結"
 | 
			
		||||
  suspend: "凍結"
 | 
			
		||||
@@ -947,12 +978,23 @@ desktop/views/pages/admin/admin.unverify-user.vue:
 | 
			
		||||
  unverify-user: "ユーザーの公式アカウント解除"
 | 
			
		||||
  unverify: "公式アカウントを解除する"
 | 
			
		||||
  unverified: "公式アカウントを解除しました"
 | 
			
		||||
desktop/views/pages/admin/admin.announcements.vue:
 | 
			
		||||
  announcements: "お知らせ"
 | 
			
		||||
desktop/views/pages/admin/admin.hashtags.vue:
 | 
			
		||||
  hided-tags: "Hidden Tags"
 | 
			
		||||
desktop/views/pages/deck/deck.tl-column.vue:
 | 
			
		||||
  is-media-only: "メディア投稿のみ"
 | 
			
		||||
  is-media-view: "メディアビュー"
 | 
			
		||||
  edit: "オプション"
 | 
			
		||||
desktop/views/pages/deck/deck.user-column.vue:
 | 
			
		||||
  posts: "投稿"
 | 
			
		||||
  following: "フォロー"
 | 
			
		||||
  followers: "フォロワー"
 | 
			
		||||
  images: "画像"
 | 
			
		||||
  activity: "アクティビティ"
 | 
			
		||||
  timeline: "タイムライン"
 | 
			
		||||
  pinned-notes: "ピン留めされた投稿"
 | 
			
		||||
  push-to-a-list: "リストに追加"
 | 
			
		||||
desktop/views/pages/stats/stats.vue:
 | 
			
		||||
  all-users: "全てのユーザー"
 | 
			
		||||
  original-users: "このインスタンスのユーザー"
 | 
			
		||||
@@ -1005,9 +1047,6 @@ desktop/views/pages/user/user.friends.vue:
 | 
			
		||||
  no-users: "よく話すユーザーはいません"
 | 
			
		||||
desktop/views/pages/user/user.vue:
 | 
			
		||||
  is-suspended: "このユーザーは凍結されています。"
 | 
			
		||||
  is-remote: "このユーザーはリモートユーザーです。"
 | 
			
		||||
  view-remote: "正確な情報を見る"
 | 
			
		||||
desktop/views/pages/user/user.home.vue:
 | 
			
		||||
  last-used-at: "最終アクセス"
 | 
			
		||||
desktop/views/pages/user/user.photos.vue:
 | 
			
		||||
  title: "フォト"
 | 
			
		||||
@@ -1021,6 +1060,9 @@ desktop/views/pages/user/user.profile.vue:
 | 
			
		||||
  mute: "ミュートする"
 | 
			
		||||
  muted: "ミュートしています"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロックする"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  block-confirm: "このユーザーをブロックしますか?"
 | 
			
		||||
  push-to-a-list: "リストに追加"
 | 
			
		||||
  list-pushed: "{user}を{list}に追加しました。"
 | 
			
		||||
desktop/views/pages/user/user.header.vue:
 | 
			
		||||
@@ -1028,6 +1070,10 @@ desktop/views/pages/user/user.header.vue:
 | 
			
		||||
  following: "フォロー"
 | 
			
		||||
  followers: "フォロワー"
 | 
			
		||||
  is-bot: "このアカウントはBotです"
 | 
			
		||||
  years-old: "歳"
 | 
			
		||||
  year: "年"
 | 
			
		||||
  month: "月"
 | 
			
		||||
  day: "日"
 | 
			
		||||
desktop/views/pages/user/user.timeline.vue:
 | 
			
		||||
  default: "投稿"
 | 
			
		||||
  with-replies: "投稿と返信"
 | 
			
		||||
@@ -1057,7 +1103,6 @@ desktop/views/widgets/users.vue:
 | 
			
		||||
  refresh: "他を見る"
 | 
			
		||||
  no-one: "いません!"
 | 
			
		||||
mobile/views/components/drive.vue:
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  used: "使用中"
 | 
			
		||||
  folder-count: "フォルダ"
 | 
			
		||||
  count-separator: "、"
 | 
			
		||||
@@ -1161,7 +1206,6 @@ mobile/views/components/ui.nav.vue:
 | 
			
		||||
  messaging: "メッセージ"
 | 
			
		||||
  follow-requests: "フォロー申請"
 | 
			
		||||
  search: "検索"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  favorites: "お気に入り"
 | 
			
		||||
  user-lists: "リスト"
 | 
			
		||||
  widgets: "ウィジェット"
 | 
			
		||||
@@ -1184,7 +1228,6 @@ mobile/views/pages/user-lists.vue:
 | 
			
		||||
  title: "リスト"
 | 
			
		||||
  enter-list-name: "リスト名を入力してください"
 | 
			
		||||
mobile/views/pages/drive.vue:
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  more: "もっと見る"
 | 
			
		||||
mobile/views/pages/signup.vue:
 | 
			
		||||
  lets-start: "📦 始めましょう"
 | 
			
		||||
@@ -1284,6 +1327,7 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  signout: "サインアウト"
 | 
			
		||||
  sound: "サウンド"
 | 
			
		||||
  enable-sounds: "サウンドを有効にする"
 | 
			
		||||
  mark-as-read-all-unread-notes: "すべての投稿を既読にする"
 | 
			
		||||
mobile/views/pages/user.vue:
 | 
			
		||||
  follows-you: "フォローされています"
 | 
			
		||||
  following: "フォロー"
 | 
			
		||||
@@ -1293,8 +1337,10 @@ mobile/views/pages/user.vue:
 | 
			
		||||
  timeline: "タイムライン"
 | 
			
		||||
  media: "メディア"
 | 
			
		||||
  is-suspended: "このユーザーは凍結されています。"
 | 
			
		||||
  is-remote: "このユーザーはリモートユーザーです。"
 | 
			
		||||
  view-remote: "正確な情報を見る"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
mobile/views/pages/user/home.vue:
 | 
			
		||||
  recent-notes: "最近の投稿"
 | 
			
		||||
  images: "画像"
 | 
			
		||||
@@ -1340,3 +1386,29 @@ docs:
 | 
			
		||||
      description: "説明"
 | 
			
		||||
dev/views/index.vue:
 | 
			
		||||
  manage-apps: "アプリの管理"
 | 
			
		||||
dev/views/apps.vue:
 | 
			
		||||
  manage-apps: "アプリを管理"
 | 
			
		||||
  create-app: "アプリ作成"
 | 
			
		||||
  app-missing: "アプリなし"
 | 
			
		||||
dev/views/new-app.vue:
 | 
			
		||||
  create-app: "アプリケーションの作成"
 | 
			
		||||
  app-name: "アプリケーション名"
 | 
			
		||||
  app-name-desc: "あなたのアプリの名称。"
 | 
			
		||||
  app-name-ex: "ex) Misskey for iOS"
 | 
			
		||||
  app-overview: "アプリの概要"
 | 
			
		||||
  app-desc: "あなたのアプリの簡単な説明や紹介。"
 | 
			
		||||
  app-desc-ex: "ex) Misskey iOSクライアント。"
 | 
			
		||||
  callback-url: "コールバックURL (オプション)"
 | 
			
		||||
  callback-url-desc: "ユーザーが認証フォームで認証した際にリダイレクトするURLを設定できます。"
 | 
			
		||||
  authority: "権限"
 | 
			
		||||
  authority-desc: "ここで要求した機能だけがAPIからアクセスできます。"
 | 
			
		||||
  authority-warning: "アプリ作成後も変更できますが、新たな権限を付与する場合、その時点で関連付けられているユーザーキーはすべて無効になります。"
 | 
			
		||||
  account-read: "アカウントの情報を見る。"
 | 
			
		||||
  account-write: "アカウントの情報を操作する。"
 | 
			
		||||
  note-write: "投稿する。"
 | 
			
		||||
  reaction-write: "リアクションしたりリアクションをキャンセルする。"
 | 
			
		||||
  following-write: "フォローしたりフォロー解除する。"
 | 
			
		||||
  drive-read: "ドライブを見る。"
 | 
			
		||||
  drive-write: "ドライブを操作する。"
 | 
			
		||||
  notification-read: "通知を見る。"
 | 
			
		||||
  notification-write: "通知を操作する。"
 | 
			
		||||
 
 | 
			
		||||
@@ -25,6 +25,14 @@ common:
 | 
			
		||||
  application-authorization: "Permissions de l'application"
 | 
			
		||||
  close: "Fermer"
 | 
			
		||||
  do-not-copy-paste: "Veuillez ne pas entrer ou coller le code ici. Le compte peut être compromis."
 | 
			
		||||
  BSoD:
 | 
			
		||||
    fatal-error: ":( 致命的な問題が発生しました。"
 | 
			
		||||
    update-browser-os: "お使いのブラウザ(またはOS)のバージョンを更新すると解決する可能性があります。"
 | 
			
		||||
    error-code: "Code d’erreur"
 | 
			
		||||
    browser-version: "Version du navigateur"
 | 
			
		||||
    client-version: "La version du client"
 | 
			
		||||
    email-support: "問題が解決しない場合は、上記の情報をお書き添えの上 syuilotan@yahoo.co.jp までご連絡ください。"
 | 
			
		||||
    thanks: "Merci d’avoir choisi d’utiliser Misskey."
 | 
			
		||||
  got-it: "J'ai compris !"
 | 
			
		||||
  customization-tips:
 | 
			
		||||
    title: "Conseils de personnalisation"
 | 
			
		||||
@@ -54,6 +62,7 @@ common:
 | 
			
		||||
    years_ago: "Il y a {} an·s"
 | 
			
		||||
  month-and-day: "{month} mois/{day} jour"
 | 
			
		||||
  trash: "Corbeille"
 | 
			
		||||
  drive: "Drive"
 | 
			
		||||
  weekday-short:
 | 
			
		||||
    sunday: "D"
 | 
			
		||||
    monday: "L"
 | 
			
		||||
@@ -115,6 +124,12 @@ common:
 | 
			
		||||
  reduce-motion: "Réduire les animations dans l’interface utilisateur"
 | 
			
		||||
  this-setting-is-this-device-only: "Uniquement sur cet appareil"
 | 
			
		||||
  do-not-use-in-production: 'Il s’agit d’une version de développement. Ne pas utiliser dans un environnement de production.'
 | 
			
		||||
  is-remote-user: "Ces informations utilisateur ont été copiées."
 | 
			
		||||
  is-remote-post: "この投稿情報はコピーです。"
 | 
			
		||||
  view-on-remote: "Consulter le profil complet"
 | 
			
		||||
  error:
 | 
			
		||||
    title: 'Une erreur est survenue'
 | 
			
		||||
    retry: 'Réessayer'
 | 
			
		||||
  reversi:
 | 
			
		||||
    drawn: "Partie nulle"
 | 
			
		||||
    my-turn: "C’est votre tour"
 | 
			
		||||
@@ -170,6 +185,7 @@ common:
 | 
			
		||||
    rename: "Renommer"
 | 
			
		||||
    stack-left: "Vers la gauche"
 | 
			
		||||
    pop-right: "Vers la droite"
 | 
			
		||||
  dev: "Échec lors de la création de l’application. Veuillez réessayer."
 | 
			
		||||
auth/views/form.vue:
 | 
			
		||||
  share-access: "Désirez-vous <b>autoriser</b> <i>{{ app.name }}</i> à avoir accès à votre compte ?"
 | 
			
		||||
  permission-ask: "Cette application nécessite les autorisations suivantes :"
 | 
			
		||||
@@ -526,21 +542,24 @@ desktop/views/components/charts.vue:
 | 
			
		||||
  title: "Graphiques"
 | 
			
		||||
  per-day: "par jour"
 | 
			
		||||
  per-hour: "par heure"
 | 
			
		||||
  federation: "Fédération"
 | 
			
		||||
  notes: "Publications"
 | 
			
		||||
  users: "Utilisateurs"
 | 
			
		||||
  drive: "Drive"
 | 
			
		||||
  network: "Réseau"
 | 
			
		||||
  charts:
 | 
			
		||||
    federation-instances: "インスタンスの増減"
 | 
			
		||||
    federation-instances-total: "Nombre total d’instances"
 | 
			
		||||
    notes: "投稿の増減 (統合)"
 | 
			
		||||
    local-notes: "投稿の増減 (ローカル)"
 | 
			
		||||
    remote-notes: "投稿の増減 (リモート)"
 | 
			
		||||
    notes-total: "Total des notes"
 | 
			
		||||
    users: "Nombre d’utilisateurs·trices : augmentation/diminution"
 | 
			
		||||
    users-total: "ユーザーの積算"
 | 
			
		||||
    users-total: "Nombre total des utilisateurs·rices"
 | 
			
		||||
    drive: "ドライブ使用量の増減"
 | 
			
		||||
    drive-total: "ドライブ使用量の積算"
 | 
			
		||||
    drive-total: "Utilisation totale du lecteur"
 | 
			
		||||
    drive-files: "ドライブのファイル数の増減"
 | 
			
		||||
    drive-files-total: "ドライブのファイル数の積算"
 | 
			
		||||
    drive-files-total: "Nombre total de fichiers sur le lecteur"
 | 
			
		||||
    network-requests: "Requêtes"
 | 
			
		||||
    network-time: "Temps de réponse"
 | 
			
		||||
    network-usage: "Traffic"
 | 
			
		||||
@@ -560,7 +579,6 @@ desktop/views/components/crop-window.vue:
 | 
			
		||||
  ok: "OK"
 | 
			
		||||
desktop/views/components/drive-window.vue:
 | 
			
		||||
  used: "utilisé"
 | 
			
		||||
  drive: "Drive"
 | 
			
		||||
desktop/views/components/drive.file.vue:
 | 
			
		||||
  avatar: "Avatar"
 | 
			
		||||
  banner: "Bannière"
 | 
			
		||||
@@ -590,8 +608,6 @@ desktop/views/components/drive.folder.vue:
 | 
			
		||||
    rename: "Renommer"
 | 
			
		||||
    rename-folder: "Renommer le dossier"
 | 
			
		||||
    input-new-folder-name: "Entrer un nouveau nom"
 | 
			
		||||
desktop/views/components/drive.nav-folder.vue:
 | 
			
		||||
  drive: "Drive"
 | 
			
		||||
desktop/views/components/drive.vue:
 | 
			
		||||
  search: "Rechercher"
 | 
			
		||||
  load-more: "Afficher plus"
 | 
			
		||||
@@ -663,10 +679,10 @@ desktop/views/components/note.vue:
 | 
			
		||||
  reposted-by: "Partagé par {}"
 | 
			
		||||
  reply: "Répondre"
 | 
			
		||||
  renote: "Partager"
 | 
			
		||||
  add-reaction: "リアクション"
 | 
			
		||||
  detail: "詳細"
 | 
			
		||||
  private: "この投稿は非公開です"
 | 
			
		||||
  deleted: "この投稿は削除されました"
 | 
			
		||||
  add-reaction: "Ajouter votre réaction"
 | 
			
		||||
  detail: "Détails"
 | 
			
		||||
  private: "Cette publication est privée"
 | 
			
		||||
  deleted: "Cette publication a été supprimée"
 | 
			
		||||
desktop/views/components/notes.vue:
 | 
			
		||||
  error: "Échec du chargement."
 | 
			
		||||
  retry: "Réessayer"
 | 
			
		||||
@@ -725,8 +741,8 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  profile: "Profil"
 | 
			
		||||
  notification: "Notification"
 | 
			
		||||
  apps: "Applications"
 | 
			
		||||
  mute: "Mettre en sourdine"
 | 
			
		||||
  drive: "Drive"
 | 
			
		||||
  mute-and-block: "ミュート/ブロック"
 | 
			
		||||
  blocking: "ブロック"
 | 
			
		||||
  security: "Sécurité"
 | 
			
		||||
  signin: "Historique de connexion"
 | 
			
		||||
  password: "Mot de Passe"
 | 
			
		||||
@@ -750,7 +766,7 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  deck-default: "デッキをデフォルトのUIにする"
 | 
			
		||||
  display: "Affichage et design"
 | 
			
		||||
  customize: "Personnaliser l'Accueil"
 | 
			
		||||
  wallpaper: "壁紙"
 | 
			
		||||
  wallpaper: "Arrière plan"
 | 
			
		||||
  choose-wallpaper: "Sélectionner un fond d'écran"
 | 
			
		||||
  delete-wallpaper: "Supprimer le fond d'écran"
 | 
			
		||||
  dark-mode: "Mode nuit"
 | 
			
		||||
@@ -762,14 +778,14 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  suggest-recent-hashtags: "Afficher les hashtags populaires dans le champs de saisie"
 | 
			
		||||
  show-clock-on-header: "Afficher l'horloge à droite sur le coté supérieur"
 | 
			
		||||
  show-reply-target: "Afficher les réponses"
 | 
			
		||||
  timeline: "タイムライン"
 | 
			
		||||
  timeline: "Chronologie"
 | 
			
		||||
  show-my-renotes: "Afficher mes republications dans le fil"
 | 
			
		||||
  show-renoted-my-notes: "Afficher mes republications dans les fils"
 | 
			
		||||
  show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
 | 
			
		||||
  show-maps: "Afficher la carte"
 | 
			
		||||
  deck-column-align: "デッキのカラムの位置"
 | 
			
		||||
  deck-column-align-center: "中央"
 | 
			
		||||
  deck-column-align-left: "左"
 | 
			
		||||
  deck-column-align-center: "Centrer"
 | 
			
		||||
  deck-column-align-left: "À gauche"
 | 
			
		||||
  sound: "Son"
 | 
			
		||||
  enable-sounds: "Activer le son"
 | 
			
		||||
  enable-sounds-desc: "Jouer un son lorsque vous recevez un message. Ce paramètre est sauvegardé dans le navigateur."
 | 
			
		||||
@@ -810,7 +826,7 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  tools: "Outils"
 | 
			
		||||
  task-manager: "Gestionnaire de tâches"
 | 
			
		||||
  third-parties: "Services tiers"
 | 
			
		||||
  navbar-position: "ナビゲーションバーの位置"
 | 
			
		||||
  navbar-position: "Position de la barre de navigation"
 | 
			
		||||
  navbar-position-top: "En haut"
 | 
			
		||||
  navbar-position-left: "à gauche"
 | 
			
		||||
  navbar-position-right: "à droite"
 | 
			
		||||
@@ -832,20 +848,32 @@ desktop/views/components/settings.2fa.vue:
 | 
			
		||||
  success: "L'operation a été complétée avec succès!"
 | 
			
		||||
  failed: "L'operation a échoué. Veuillez vous assurer que le token a été entrer correctement."
 | 
			
		||||
  info: "À partir de maintenant, à chaque fois que vous vous connecter entrez votre mot de passe ainsi que le token généré sur votre appareil."
 | 
			
		||||
desktop/views/components/settings.api.vue:
 | 
			
		||||
common/views/components/api-settings.vue:
 | 
			
		||||
  intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
 | 
			
		||||
  caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
 | 
			
		||||
  regeneration-of-token: "Si votre jeton est compromis, vous pouvez le régénérer."
 | 
			
		||||
  regenerate-token: "Regenerer le token"
 | 
			
		||||
  regenerate-token: "Régénérer le jeton"
 | 
			
		||||
  token: "Jeton :"
 | 
			
		||||
  enter-password: "Veuillez entrer le mot de passe"
 | 
			
		||||
  enter-password: "Entrez le mot de passe"
 | 
			
		||||
  console:
 | 
			
		||||
    title: 'Console API'
 | 
			
		||||
    endpoint: 'Point de terminaison'
 | 
			
		||||
    parameter: 'Paramètres'
 | 
			
		||||
    send: 'Envoyer'
 | 
			
		||||
    sending: 'Envoi en cours'
 | 
			
		||||
    response: 'Résultat'
 | 
			
		||||
desktop/views/components/settings.apps.vue:
 | 
			
		||||
  no-apps: "Aucune application autorisée"
 | 
			
		||||
desktop/views/components/settings.drive.vue:
 | 
			
		||||
  max: "Maximum"
 | 
			
		||||
  in-use: "en cours d’utilisation"
 | 
			
		||||
desktop/views/components/settings.mute.vue:
 | 
			
		||||
  no-users: "Aucun utilisateurs mis en sourdine"
 | 
			
		||||
common/views/components/drive-settings.vue:
 | 
			
		||||
  max: "容量"
 | 
			
		||||
  in-use: "utilisé"
 | 
			
		||||
  stats: "Statistiques"
 | 
			
		||||
common/views/components/mute-and-block.vue:
 | 
			
		||||
  mute-and-block: "ミュートとブロック"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  no-muted-users: "ミュートしているユーザーはいません"
 | 
			
		||||
  no-blocked-users: "ブロックしているユーザーはいません"
 | 
			
		||||
desktop/views/components/settings.password.vue:
 | 
			
		||||
  reset: "Changer votre mot de passe"
 | 
			
		||||
  enter-current-password: "Entrez votre mot de passe actuel"
 | 
			
		||||
@@ -877,7 +905,6 @@ desktop/views/components/ui.header.vue:
 | 
			
		||||
  adjective: "M."
 | 
			
		||||
desktop/views/components/ui.header.account.vue:
 | 
			
		||||
  profile: "Votre profil"
 | 
			
		||||
  drive: "Drive"
 | 
			
		||||
  favorites: "Favorites"
 | 
			
		||||
  lists: "Listes"
 | 
			
		||||
  follow-requests: "Demandes de suivi"
 | 
			
		||||
@@ -921,9 +948,10 @@ desktop/views/components/window.vue:
 | 
			
		||||
  close: "Fermer"
 | 
			
		||||
desktop/views/pages/admin/admin.vue:
 | 
			
		||||
  dashboard: "Tableau de bord"
 | 
			
		||||
  drive: "Drive"
 | 
			
		||||
  users: "Utilisateur·rice·s"
 | 
			
		||||
  update: "Mises à jour"
 | 
			
		||||
  announcements: "Annonces"
 | 
			
		||||
  hashtags: "Hashtags"
 | 
			
		||||
desktop/views/pages/admin/admin.dashboard.vue:
 | 
			
		||||
  dashboard: "Tableau de bord"
 | 
			
		||||
  all-users: "Toutes les utilisateurrices"
 | 
			
		||||
@@ -931,6 +959,9 @@ desktop/views/pages/admin/admin.dashboard.vue:
 | 
			
		||||
  all-notes: "Toutes les publications"
 | 
			
		||||
  original-notes: "Publications sur cette instance"
 | 
			
		||||
  invite: "Invitation"
 | 
			
		||||
  banner-url: "URL de la bannière"
 | 
			
		||||
  disableRegistration: "Désactiver l’enregistrement de nouveaux utilisateurs·rices"
 | 
			
		||||
  disableLocalTimeline: "Désactiver le fil local"
 | 
			
		||||
desktop/views/pages/admin/admin.suspend-user.vue:
 | 
			
		||||
  suspend-user: "Suspendre un·e utilisateur·rice"
 | 
			
		||||
  suspend: "Suspendre"
 | 
			
		||||
@@ -947,12 +978,23 @@ desktop/views/pages/admin/admin.unverify-user.vue:
 | 
			
		||||
  unverify-user: "ユーザーの公式アカウント解除"
 | 
			
		||||
  unverify: "Ôter la vérification du compte"
 | 
			
		||||
  unverified: "Ce compte n'est pas vérifié"
 | 
			
		||||
desktop/views/pages/admin/admin.announcements.vue:
 | 
			
		||||
  announcements: "Annonces"
 | 
			
		||||
desktop/views/pages/admin/admin.hashtags.vue:
 | 
			
		||||
  hided-tags: "Tags cachés"
 | 
			
		||||
desktop/views/pages/deck/deck.tl-column.vue:
 | 
			
		||||
  is-media-only: "Les publications médias uniquement"
 | 
			
		||||
  is-media-view: "Vue média"
 | 
			
		||||
  edit: "Options"
 | 
			
		||||
desktop/views/pages/deck/deck.user-column.vue:
 | 
			
		||||
  pinned-notes: "ピン留めされた投稿"
 | 
			
		||||
  posts: "Publications"
 | 
			
		||||
  following: "Suit"
 | 
			
		||||
  followers: "Abonné·e·s"
 | 
			
		||||
  images: "Images"
 | 
			
		||||
  activity: "Activité"
 | 
			
		||||
  timeline: "Chronologie"
 | 
			
		||||
  pinned-notes: "Publications épinglées"
 | 
			
		||||
  push-to-a-list: "Ajouter à la liste"
 | 
			
		||||
desktop/views/pages/stats/stats.vue:
 | 
			
		||||
  all-users: "Toutes les utilisateurrices"
 | 
			
		||||
  original-users: "Utilisateur·rice·s sur cette instance"
 | 
			
		||||
@@ -1005,10 +1047,7 @@ desktop/views/pages/user/user.friends.vue:
 | 
			
		||||
  no-users: "Pas d'utilisateurs"
 | 
			
		||||
desktop/views/pages/user/user.vue:
 | 
			
		||||
  is-suspended: "Ce compte a été suspendu."
 | 
			
		||||
  is-remote: "Cet utilisateur n'est pas un utilisateur Misskey. Certaines informations peuvent ne pas refléter ce profil dans sa totalité."
 | 
			
		||||
  view-remote: "Consulter le profil complet"
 | 
			
		||||
desktop/views/pages/user/user.home.vue:
 | 
			
		||||
  last-used-at: "Last used at"
 | 
			
		||||
  last-used-at: "Actif·ive pour la dernière fois"
 | 
			
		||||
desktop/views/pages/user/user.photos.vue:
 | 
			
		||||
  title: "Photos"
 | 
			
		||||
  loading: "Chargement en cours"
 | 
			
		||||
@@ -1021,6 +1060,9 @@ desktop/views/pages/user/user.profile.vue:
 | 
			
		||||
  mute: "Mettre en sourdine"
 | 
			
		||||
  muted: "Muting"
 | 
			
		||||
  unmute: "Enlever la sourdine"
 | 
			
		||||
  block: "Bloquer"
 | 
			
		||||
  unblock: "Débloquer"
 | 
			
		||||
  block-confirm: "Bloquer cet utilisateur ?"
 | 
			
		||||
  push-to-a-list: "Ajouter à la liste"
 | 
			
		||||
  list-pushed: "Vous avez ajouté {user} à la liste {list}."
 | 
			
		||||
desktop/views/pages/user/user.header.vue:
 | 
			
		||||
@@ -1028,6 +1070,10 @@ desktop/views/pages/user/user.header.vue:
 | 
			
		||||
  following: "Suit"
 | 
			
		||||
  followers: "Abonné·e·s"
 | 
			
		||||
  is-bot: "Ce compte est un Bot"
 | 
			
		||||
  years-old: "ans d’âge"
 | 
			
		||||
  year: "Année"
 | 
			
		||||
  month: "Mois"
 | 
			
		||||
  day: "Jour"
 | 
			
		||||
desktop/views/pages/user/user.timeline.vue:
 | 
			
		||||
  default: "Publications"
 | 
			
		||||
  with-replies: "Publications et réponses"
 | 
			
		||||
@@ -1057,7 +1103,6 @@ desktop/views/widgets/users.vue:
 | 
			
		||||
  refresh: "Afficher d'autres"
 | 
			
		||||
  no-one: "Personne"
 | 
			
		||||
mobile/views/components/drive.vue:
 | 
			
		||||
  drive: "Drive"
 | 
			
		||||
  used: "utilisé"
 | 
			
		||||
  folder-count: "Dossier(s)"
 | 
			
		||||
  count-separator: ", "
 | 
			
		||||
@@ -1087,8 +1132,8 @@ mobile/views/components/drive.file-detail.vue:
 | 
			
		||||
  hash: "Hash (md5)"
 | 
			
		||||
  exif: "EXIF"
 | 
			
		||||
  nsfw: "CW"
 | 
			
		||||
  mark-as-sensitive: "閲覧注意に設定"
 | 
			
		||||
  unmark-as-sensitive: "閲覧注意を解除"
 | 
			
		||||
  mark-as-sensitive: "Marquer comme sensible"
 | 
			
		||||
  unmark-as-sensitive: "Ne pas marquer comme sensible"
 | 
			
		||||
mobile/views/components/media-image.vue:
 | 
			
		||||
  sensitive: "Le contenu est NSFW"
 | 
			
		||||
  click-to-show: "Cliquer pour afficher"
 | 
			
		||||
@@ -1161,7 +1206,6 @@ mobile/views/components/ui.nav.vue:
 | 
			
		||||
  messaging: "Messages"
 | 
			
		||||
  follow-requests: "Demandes d'abonnement"
 | 
			
		||||
  search: "Rechercher"
 | 
			
		||||
  drive: "Drive"
 | 
			
		||||
  favorites: "Favoris"
 | 
			
		||||
  user-lists: "Listes"
 | 
			
		||||
  widgets: "Modules"
 | 
			
		||||
@@ -1184,7 +1228,6 @@ mobile/views/pages/user-lists.vue:
 | 
			
		||||
  title: "Listes"
 | 
			
		||||
  enter-list-name: "Nom de la liste"
 | 
			
		||||
mobile/views/pages/drive.vue:
 | 
			
		||||
  drive: "Drive"
 | 
			
		||||
  more: "Afficher plus ..."
 | 
			
		||||
mobile/views/pages/signup.vue:
 | 
			
		||||
  lets-start: "Votre compte est prêt ! 📦"
 | 
			
		||||
@@ -1250,8 +1293,8 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  timeline: "Fil d'actualité"
 | 
			
		||||
  show-reply-target: "Afficher les réponses"
 | 
			
		||||
  show-my-renotes: "Afficher mes republications"
 | 
			
		||||
  show-renoted-my-notes: "自分の投稿のRenoteを表示する"
 | 
			
		||||
  show-local-renotes: "ローカルの投稿のRenoteを表示する"
 | 
			
		||||
  show-renoted-my-notes: "Afficher mes publications partagées"
 | 
			
		||||
  show-local-renotes: "Afficher les publications partagées localement"
 | 
			
		||||
  post-style: "Style de la publication"
 | 
			
		||||
  post-style-standard: "Standard"
 | 
			
		||||
  post-style-smart: "Intelligent"
 | 
			
		||||
@@ -1284,6 +1327,7 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  signout: "Déconnexion"
 | 
			
		||||
  sound: "Sons"
 | 
			
		||||
  enable-sounds: "Activer les sons"
 | 
			
		||||
  mark-as-read-all-unread-notes: "Marquer toutes les publications comme lues"
 | 
			
		||||
mobile/views/pages/user.vue:
 | 
			
		||||
  follows-you: "Vous suit"
 | 
			
		||||
  following: "Abonnements"
 | 
			
		||||
@@ -1293,8 +1337,10 @@ mobile/views/pages/user.vue:
 | 
			
		||||
  timeline: "Fil d'actualité"
 | 
			
		||||
  media: "Media"
 | 
			
		||||
  is-suspended: "This account has been suspended."
 | 
			
		||||
  is-remote: "Ceci est le profil d’un utilisateur·rice distant·e. Certaines informations peuvent ne pas refléter ce profil dans sa totalité."
 | 
			
		||||
  view-remote: "Consulter son profil complet"
 | 
			
		||||
  mute: "Mettre en sourdine"
 | 
			
		||||
  unmute: "Enlever la sourdine"
 | 
			
		||||
  block: "Bloquer"
 | 
			
		||||
  unblock: "Débloquer"
 | 
			
		||||
mobile/views/pages/user/home.vue:
 | 
			
		||||
  recent-notes: "Notes récentes"
 | 
			
		||||
  images: "Images"
 | 
			
		||||
@@ -1340,3 +1386,29 @@ docs:
 | 
			
		||||
      description: "Description"
 | 
			
		||||
dev/views/index.vue:
 | 
			
		||||
  manage-apps: "Gestion des applications"
 | 
			
		||||
dev/views/apps.vue:
 | 
			
		||||
  manage-apps: "Gestion des applications"
 | 
			
		||||
  create-app: "Créer une app"
 | 
			
		||||
  app-missing: "Aucune application"
 | 
			
		||||
dev/views/new-app.vue:
 | 
			
		||||
  create-app: "Création d’une application"
 | 
			
		||||
  app-name: "Nom de l’application"
 | 
			
		||||
  app-name-desc: "Le nom de votre application"
 | 
			
		||||
  app-name-ex: "p. ex. Misskey pour iOS"
 | 
			
		||||
  app-overview: "Description courte de l’application"
 | 
			
		||||
  app-desc: "Brève description introductive à votre application."
 | 
			
		||||
  app-desc-ex: "p. ex) Misskey pour iOS"
 | 
			
		||||
  callback-url: "コールバックURL (オプション)"
 | 
			
		||||
  callback-url-desc: "ユーザーが認証フォームで認証した際にリダイレクトするURLを設定できます。"
 | 
			
		||||
  authority: "Autorisations "
 | 
			
		||||
  authority-desc: "ここで要求した機能だけがAPIからアクセスできます。"
 | 
			
		||||
  authority-warning: "アプリ作成後も変更できますが、新たな権限を付与する場合、その時点で関連付けられているユーザーキーはすべて無効になります。"
 | 
			
		||||
  account-read: "Afficher les informations du compte"
 | 
			
		||||
  account-write: "Modifications des informations du compte"
 | 
			
		||||
  note-write: "Publications."
 | 
			
		||||
  reaction-write: "Ajout et suppression de réactions."
 | 
			
		||||
  following-write: "S’abonner et se désabonner."
 | 
			
		||||
  drive-read: "Lecture du Drive."
 | 
			
		||||
  drive-write: "Téléversement/suppression des fichiers de votre Lecteur."
 | 
			
		||||
  notification-read: "Lire vos notifications."
 | 
			
		||||
  notification-write: "Gestion de vos notifications."
 | 
			
		||||
 
 | 
			
		||||
@@ -25,6 +25,14 @@ common:
 | 
			
		||||
  application-authorization: "アプリの連携"
 | 
			
		||||
  close: "閉じる"
 | 
			
		||||
  do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
 | 
			
		||||
  BSoD:
 | 
			
		||||
    fatal-error: ":( 致命的な問題が発生しました。"
 | 
			
		||||
    update-browser-os: "お使いのブラウザ(またはOS)のバージョンを更新すると解決する可能性があります。"
 | 
			
		||||
    error-code: "エラーコード"
 | 
			
		||||
    browser-version: "ブラウザ バージョン"
 | 
			
		||||
    client-version: "クライアント バージョン"
 | 
			
		||||
    email-support: "問題が解決しない場合は、上記の情報をお書き添えの上 syuilotan@yahoo.co.jp までご連絡ください。"
 | 
			
		||||
    thanks: "Thank you for using Misskey."
 | 
			
		||||
  got-it: "わかった"
 | 
			
		||||
  customization-tips:
 | 
			
		||||
    title: "カスタマイズのヒント"
 | 
			
		||||
@@ -54,6 +62,7 @@ common:
 | 
			
		||||
    years_ago: "{}年前"
 | 
			
		||||
  month-and-day: "{month}月 {day}日"
 | 
			
		||||
  trash: "ゴミ箱"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  weekday-short:
 | 
			
		||||
    sunday: "日"
 | 
			
		||||
    monday: "月"
 | 
			
		||||
@@ -115,6 +124,12 @@ common:
 | 
			
		||||
  reduce-motion: "UIの動きを減らす"
 | 
			
		||||
  this-setting-is-this-device-only: "このデバイスのみ"
 | 
			
		||||
  do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
 | 
			
		||||
  is-remote-user: "このユーザー情報はコピーです。"
 | 
			
		||||
  is-remote-post: "この投稿情報はコピーです。"
 | 
			
		||||
  view-on-remote: "正確な情報を見る"
 | 
			
		||||
  error:
 | 
			
		||||
    title: '問題が発生しました'
 | 
			
		||||
    retry: 'やり直す'
 | 
			
		||||
  reversi:
 | 
			
		||||
    drawn: "引き分け"
 | 
			
		||||
    my-turn: "あなたのターンです"
 | 
			
		||||
@@ -170,6 +185,7 @@ common:
 | 
			
		||||
    rename: "名前を変更"
 | 
			
		||||
    stack-left: "左に重ねる"
 | 
			
		||||
    pop-right: "右に出す"
 | 
			
		||||
  dev: "アプリの作成に失敗しました。再度お試しください。"
 | 
			
		||||
auth/views/form.vue:
 | 
			
		||||
  share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
 | 
			
		||||
  permission-ask: "このアプリは次の権限を要求しています:"
 | 
			
		||||
@@ -526,11 +542,14 @@ desktop/views/components/charts.vue:
 | 
			
		||||
  title: "チャート"
 | 
			
		||||
  per-day: "1日ごと"
 | 
			
		||||
  per-hour: "1時間ごと"
 | 
			
		||||
  federation: "フェデレーション"
 | 
			
		||||
  notes: "投稿"
 | 
			
		||||
  users: "ユーザー"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  network: "ネットワーク"
 | 
			
		||||
  charts:
 | 
			
		||||
    federation-instances: "インスタンスの増減"
 | 
			
		||||
    federation-instances-total: "インスタンスの積算"
 | 
			
		||||
    notes: "投稿の増減 (統合)"
 | 
			
		||||
    local-notes: "投稿の増減 (ローカル)"
 | 
			
		||||
    remote-notes: "投稿の増減 (リモート)"
 | 
			
		||||
@@ -560,7 +579,6 @@ desktop/views/components/crop-window.vue:
 | 
			
		||||
  ok: "決定"
 | 
			
		||||
desktop/views/components/drive-window.vue:
 | 
			
		||||
  used: "使用中"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
desktop/views/components/drive.file.vue:
 | 
			
		||||
  avatar: "アイコン"
 | 
			
		||||
  banner: "バナー"
 | 
			
		||||
@@ -590,8 +608,6 @@ desktop/views/components/drive.folder.vue:
 | 
			
		||||
    rename: "名前を変更"
 | 
			
		||||
    rename-folder: "フォルダ名の変更"
 | 
			
		||||
    input-new-folder-name: "新しいフォルダ名を入力してください"
 | 
			
		||||
desktop/views/components/drive.nav-folder.vue:
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
desktop/views/components/drive.vue:
 | 
			
		||||
  search: "検索"
 | 
			
		||||
  load-more: "もっと読み込む"
 | 
			
		||||
@@ -725,8 +741,8 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  profile: "プロフィール"
 | 
			
		||||
  notification: "通知"
 | 
			
		||||
  apps: "アプリ"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  mute-and-block: "ミュート/ブロック"
 | 
			
		||||
  blocking: "ブロック"
 | 
			
		||||
  security: "セキュリティ"
 | 
			
		||||
  signin: "サインイン履歴"
 | 
			
		||||
  password: "パスワード"
 | 
			
		||||
@@ -832,20 +848,32 @@ desktop/views/components/settings.2fa.vue:
 | 
			
		||||
  success: "設定が完了しました!"
 | 
			
		||||
  failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
 | 
			
		||||
  info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
 | 
			
		||||
desktop/views/components/settings.api.vue:
 | 
			
		||||
common/views/components/api-settings.vue:
 | 
			
		||||
  intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
 | 
			
		||||
  caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
 | 
			
		||||
  regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
 | 
			
		||||
  regenerate-token: "トークンを再生成"
 | 
			
		||||
  token: "Token:"
 | 
			
		||||
  enter-password: "パスワードを入力してください"
 | 
			
		||||
  console:
 | 
			
		||||
    title: 'APIコンソール'
 | 
			
		||||
    endpoint: 'エンドポイント'
 | 
			
		||||
    parameter: 'パラメータ'
 | 
			
		||||
    send: '送信'
 | 
			
		||||
    sending: '応答待ち'
 | 
			
		||||
    response: '結果'
 | 
			
		||||
desktop/views/components/settings.apps.vue:
 | 
			
		||||
  no-apps: "連携しているアプリケーションはありません"
 | 
			
		||||
desktop/views/components/settings.drive.vue:
 | 
			
		||||
  max: "中"
 | 
			
		||||
common/views/components/drive-settings.vue:
 | 
			
		||||
  max: "容量"
 | 
			
		||||
  in-use: "使用中"
 | 
			
		||||
desktop/views/components/settings.mute.vue:
 | 
			
		||||
  no-users: "ミュートしているユーザーはいません"
 | 
			
		||||
  stats: "統計"
 | 
			
		||||
common/views/components/mute-and-block.vue:
 | 
			
		||||
  mute-and-block: "ミュートとブロック"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  no-muted-users: "ミュートしているユーザーはいません"
 | 
			
		||||
  no-blocked-users: "ブロックしているユーザーはいません"
 | 
			
		||||
desktop/views/components/settings.password.vue:
 | 
			
		||||
  reset: "パスワードを変更する"
 | 
			
		||||
  enter-current-password: "現在のパスワードを入力してください"
 | 
			
		||||
@@ -877,7 +905,6 @@ desktop/views/components/ui.header.vue:
 | 
			
		||||
  adjective: "さん"
 | 
			
		||||
desktop/views/components/ui.header.account.vue:
 | 
			
		||||
  profile: "プロフィール"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  favorites: "お気に入り"
 | 
			
		||||
  lists: "リスト"
 | 
			
		||||
  follow-requests: "フォロー申請"
 | 
			
		||||
@@ -921,9 +948,10 @@ desktop/views/components/window.vue:
 | 
			
		||||
  close: "閉じる"
 | 
			
		||||
desktop/views/pages/admin/admin.vue:
 | 
			
		||||
  dashboard: "ダッシュボード"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  users: "ユーザー"
 | 
			
		||||
  update: "更新"
 | 
			
		||||
  announcements: "お知らせ"
 | 
			
		||||
  hashtags: "ハッシュタグ"
 | 
			
		||||
desktop/views/pages/admin/admin.dashboard.vue:
 | 
			
		||||
  dashboard: "ダッシュボード"
 | 
			
		||||
  all-users: "全てのユーザー"
 | 
			
		||||
@@ -931,6 +959,9 @@ desktop/views/pages/admin/admin.dashboard.vue:
 | 
			
		||||
  all-notes: "全ての投稿"
 | 
			
		||||
  original-notes: "このインスタンスの投稿"
 | 
			
		||||
  invite: "招待"
 | 
			
		||||
  banner-url: "Banner URL"
 | 
			
		||||
  disableRegistration: "Disable new user registration"
 | 
			
		||||
  disableLocalTimeline: "Disable the local timeline"
 | 
			
		||||
desktop/views/pages/admin/admin.suspend-user.vue:
 | 
			
		||||
  suspend-user: "ユーザーの凍結"
 | 
			
		||||
  suspend: "凍結"
 | 
			
		||||
@@ -947,12 +978,23 @@ desktop/views/pages/admin/admin.unverify-user.vue:
 | 
			
		||||
  unverify-user: "ユーザーの公式アカウント解除"
 | 
			
		||||
  unverify: "公式アカウントを解除する"
 | 
			
		||||
  unverified: "公式アカウントを解除しました"
 | 
			
		||||
desktop/views/pages/admin/admin.announcements.vue:
 | 
			
		||||
  announcements: "お知らせ"
 | 
			
		||||
desktop/views/pages/admin/admin.hashtags.vue:
 | 
			
		||||
  hided-tags: "Hidden Tags"
 | 
			
		||||
desktop/views/pages/deck/deck.tl-column.vue:
 | 
			
		||||
  is-media-only: "メディア投稿のみ"
 | 
			
		||||
  is-media-view: "メディアビュー"
 | 
			
		||||
  edit: "オプション"
 | 
			
		||||
desktop/views/pages/deck/deck.user-column.vue:
 | 
			
		||||
  posts: "投稿"
 | 
			
		||||
  following: "フォロー"
 | 
			
		||||
  followers: "フォロワー"
 | 
			
		||||
  images: "画像"
 | 
			
		||||
  activity: "アクティビティ"
 | 
			
		||||
  timeline: "タイムライン"
 | 
			
		||||
  pinned-notes: "ピン留めされた投稿"
 | 
			
		||||
  push-to-a-list: "リストに追加"
 | 
			
		||||
desktop/views/pages/stats/stats.vue:
 | 
			
		||||
  all-users: "全てのユーザー"
 | 
			
		||||
  original-users: "このインスタンスのユーザー"
 | 
			
		||||
@@ -1005,9 +1047,6 @@ desktop/views/pages/user/user.friends.vue:
 | 
			
		||||
  no-users: "よく話すユーザーはいません"
 | 
			
		||||
desktop/views/pages/user/user.vue:
 | 
			
		||||
  is-suspended: "このユーザーは凍結されています。"
 | 
			
		||||
  is-remote: "このユーザーはリモートユーザーです。"
 | 
			
		||||
  view-remote: "正確な情報を見る"
 | 
			
		||||
desktop/views/pages/user/user.home.vue:
 | 
			
		||||
  last-used-at: "最終アクセス"
 | 
			
		||||
desktop/views/pages/user/user.photos.vue:
 | 
			
		||||
  title: "フォト"
 | 
			
		||||
@@ -1021,6 +1060,9 @@ desktop/views/pages/user/user.profile.vue:
 | 
			
		||||
  mute: "ミュートする"
 | 
			
		||||
  muted: "ミュートしています"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロックする"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  block-confirm: "このユーザーをブロックしますか?"
 | 
			
		||||
  push-to-a-list: "リストに追加"
 | 
			
		||||
  list-pushed: "{user}を{list}に追加しました。"
 | 
			
		||||
desktop/views/pages/user/user.header.vue:
 | 
			
		||||
@@ -1028,6 +1070,10 @@ desktop/views/pages/user/user.header.vue:
 | 
			
		||||
  following: "フォロー"
 | 
			
		||||
  followers: "フォロワー"
 | 
			
		||||
  is-bot: "このアカウントはBotです"
 | 
			
		||||
  years-old: "歳"
 | 
			
		||||
  year: "年"
 | 
			
		||||
  month: "月"
 | 
			
		||||
  day: "日"
 | 
			
		||||
desktop/views/pages/user/user.timeline.vue:
 | 
			
		||||
  default: "投稿"
 | 
			
		||||
  with-replies: "投稿と返信"
 | 
			
		||||
@@ -1057,7 +1103,6 @@ desktop/views/widgets/users.vue:
 | 
			
		||||
  refresh: "他を見る"
 | 
			
		||||
  no-one: "いません!"
 | 
			
		||||
mobile/views/components/drive.vue:
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  used: "使用中"
 | 
			
		||||
  folder-count: "フォルダ"
 | 
			
		||||
  count-separator: "、"
 | 
			
		||||
@@ -1161,7 +1206,6 @@ mobile/views/components/ui.nav.vue:
 | 
			
		||||
  messaging: "メッセージ"
 | 
			
		||||
  follow-requests: "フォロー申請"
 | 
			
		||||
  search: "検索"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  favorites: "お気に入り"
 | 
			
		||||
  user-lists: "リスト"
 | 
			
		||||
  widgets: "ウィジェット"
 | 
			
		||||
@@ -1184,7 +1228,6 @@ mobile/views/pages/user-lists.vue:
 | 
			
		||||
  title: "リスト"
 | 
			
		||||
  enter-list-name: "リスト名を入力してください"
 | 
			
		||||
mobile/views/pages/drive.vue:
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  more: "もっと見る"
 | 
			
		||||
mobile/views/pages/signup.vue:
 | 
			
		||||
  lets-start: "📦 始めましょう"
 | 
			
		||||
@@ -1284,6 +1327,7 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  signout: "サインアウト"
 | 
			
		||||
  sound: "サウンド"
 | 
			
		||||
  enable-sounds: "サウンドを有効にする"
 | 
			
		||||
  mark-as-read-all-unread-notes: "すべての投稿を既読にする"
 | 
			
		||||
mobile/views/pages/user.vue:
 | 
			
		||||
  follows-you: "フォローされています"
 | 
			
		||||
  following: "フォロー"
 | 
			
		||||
@@ -1293,8 +1337,10 @@ mobile/views/pages/user.vue:
 | 
			
		||||
  timeline: "タイムライン"
 | 
			
		||||
  media: "メディア"
 | 
			
		||||
  is-suspended: "このユーザーは凍結されています。"
 | 
			
		||||
  is-remote: "このユーザーはリモートユーザーです。"
 | 
			
		||||
  view-remote: "正確な情報を見る"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
mobile/views/pages/user/home.vue:
 | 
			
		||||
  recent-notes: "最近の投稿"
 | 
			
		||||
  images: "画像"
 | 
			
		||||
@@ -1340,3 +1386,29 @@ docs:
 | 
			
		||||
      description: "説明"
 | 
			
		||||
dev/views/index.vue:
 | 
			
		||||
  manage-apps: "アプリの管理"
 | 
			
		||||
dev/views/apps.vue:
 | 
			
		||||
  manage-apps: "アプリを管理"
 | 
			
		||||
  create-app: "アプリ作成"
 | 
			
		||||
  app-missing: "アプリなし"
 | 
			
		||||
dev/views/new-app.vue:
 | 
			
		||||
  create-app: "アプリケーションの作成"
 | 
			
		||||
  app-name: "アプリケーション名"
 | 
			
		||||
  app-name-desc: "あなたのアプリの名称。"
 | 
			
		||||
  app-name-ex: "ex) Misskey for iOS"
 | 
			
		||||
  app-overview: "アプリの概要"
 | 
			
		||||
  app-desc: "あなたのアプリの簡単な説明や紹介。"
 | 
			
		||||
  app-desc-ex: "ex) Misskey iOSクライアント。"
 | 
			
		||||
  callback-url: "コールバックURL (オプション)"
 | 
			
		||||
  callback-url-desc: "ユーザーが認証フォームで認証した際にリダイレクトするURLを設定できます。"
 | 
			
		||||
  authority: "権限"
 | 
			
		||||
  authority-desc: "ここで要求した機能だけがAPIからアクセスできます。"
 | 
			
		||||
  authority-warning: "アプリ作成後も変更できますが、新たな権限を付与する場合、その時点で関連付けられているユーザーキーはすべて無効になります。"
 | 
			
		||||
  account-read: "アカウントの情報を見る。"
 | 
			
		||||
  account-write: "アカウントの情報を操作する。"
 | 
			
		||||
  note-write: "投稿する。"
 | 
			
		||||
  reaction-write: "リアクションしたりリアクションをキャンセルする。"
 | 
			
		||||
  following-write: "フォローしたりフォロー解除する。"
 | 
			
		||||
  drive-read: "ドライブを見る。"
 | 
			
		||||
  drive-write: "ドライブを操作する。"
 | 
			
		||||
  notification-read: "通知を見る。"
 | 
			
		||||
  notification-write: "通知を操作する。"
 | 
			
		||||
 
 | 
			
		||||
@@ -25,6 +25,15 @@ common:
 | 
			
		||||
  application-authorization: "アプリの連携"
 | 
			
		||||
  close: "閉じる"
 | 
			
		||||
  do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
 | 
			
		||||
  BSoD:
 | 
			
		||||
    fatal-error: ":( 致命的な問題が発生しました。"
 | 
			
		||||
    update-browser-os: "お使いのブラウザ(またはOS)のバージョンを更新すると解決する可能性があります。"
 | 
			
		||||
    error-code: "エラーコード"
 | 
			
		||||
    browser-version: "ブラウザ バージョン"
 | 
			
		||||
    client-version: "クライアント バージョン"
 | 
			
		||||
    email-support: "問題が解決しない場合は、上記の情報をお書き添えの上 syuilotan@yahoo.co.jp までご連絡ください。"
 | 
			
		||||
    thanks: "Thank you for using Misskey."
 | 
			
		||||
 | 
			
		||||
  got-it: "わかった"
 | 
			
		||||
  customization-tips:
 | 
			
		||||
    title: "カスタマイズのヒント"
 | 
			
		||||
@@ -55,6 +64,7 @@ common:
 | 
			
		||||
  month-and-day: "{month}月 {day}日"
 | 
			
		||||
 | 
			
		||||
  trash: "ゴミ箱"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
 | 
			
		||||
  weekday-short:
 | 
			
		||||
    sunday: "日"
 | 
			
		||||
@@ -124,6 +134,14 @@ common:
 | 
			
		||||
 | 
			
		||||
  do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
 | 
			
		||||
 | 
			
		||||
  is-remote-user: "このユーザー情報はコピーです。"
 | 
			
		||||
  is-remote-post: "この投稿情報はコピーです。"
 | 
			
		||||
  view-on-remote: "正確な情報を見る"
 | 
			
		||||
 | 
			
		||||
  error:
 | 
			
		||||
    title: '問題が発生しました'
 | 
			
		||||
    retry: 'やり直す'
 | 
			
		||||
 | 
			
		||||
  reversi:
 | 
			
		||||
    drawn: "引き分け"
 | 
			
		||||
    my-turn: "あなたのターンです"
 | 
			
		||||
@@ -182,6 +200,8 @@ common:
 | 
			
		||||
    stack-left: "左に重ねる"
 | 
			
		||||
    pop-right: "右に出す"
 | 
			
		||||
 | 
			
		||||
  dev: "アプリの作成に失敗しました。再度お試しください。"
 | 
			
		||||
 | 
			
		||||
auth/views/form.vue:
 | 
			
		||||
  share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
 | 
			
		||||
  permission-ask: "このアプリは次の権限を要求しています:"
 | 
			
		||||
@@ -582,11 +602,14 @@ desktop/views/components/charts.vue:
 | 
			
		||||
  title: "チャート"
 | 
			
		||||
  per-day: "1日ごと"
 | 
			
		||||
  per-hour: "1時間ごと"
 | 
			
		||||
  federation: "フェデレーション"
 | 
			
		||||
  notes: "投稿"
 | 
			
		||||
  users: "ユーザー"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  network: "ネットワーク"
 | 
			
		||||
  charts:
 | 
			
		||||
    federation-instances: "インスタンスの増減"
 | 
			
		||||
    federation-instances-total: "インスタンスの積算"
 | 
			
		||||
    notes: "投稿の増減 (統合)"
 | 
			
		||||
    local-notes: "投稿の増減 (ローカル)"
 | 
			
		||||
    remote-notes: "投稿の増減 (リモート)"
 | 
			
		||||
@@ -620,7 +643,6 @@ desktop/views/components/crop-window.vue:
 | 
			
		||||
 | 
			
		||||
desktop/views/components/drive-window.vue:
 | 
			
		||||
  used: "使用中"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
 | 
			
		||||
desktop/views/components/drive.file.vue:
 | 
			
		||||
  avatar: "アイコン"
 | 
			
		||||
@@ -653,9 +675,6 @@ desktop/views/components/drive.folder.vue:
 | 
			
		||||
    rename-folder: "フォルダ名の変更"
 | 
			
		||||
    input-new-folder-name: "新しいフォルダ名を入力してください"
 | 
			
		||||
 | 
			
		||||
desktop/views/components/drive.nav-folder.vue:
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
 | 
			
		||||
desktop/views/components/drive.vue:
 | 
			
		||||
  search: "検索"
 | 
			
		||||
  load-more: "もっと読み込む"
 | 
			
		||||
@@ -813,8 +832,8 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  profile: "プロフィール"
 | 
			
		||||
  notification: "通知"
 | 
			
		||||
  apps: "アプリ"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  mute-and-block: "ミュート/ブロック"
 | 
			
		||||
  blocking: "ブロック"
 | 
			
		||||
  security: "セキュリティ"
 | 
			
		||||
  signin: "サインイン履歴"
 | 
			
		||||
  password: "パスワード"
 | 
			
		||||
@@ -932,23 +951,35 @@ desktop/views/components/settings.2fa.vue:
 | 
			
		||||
  failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
 | 
			
		||||
  info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
 | 
			
		||||
 | 
			
		||||
desktop/views/components/settings.api.vue:
 | 
			
		||||
common/views/components/api-settings.vue:
 | 
			
		||||
  intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
 | 
			
		||||
  caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
 | 
			
		||||
  regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
 | 
			
		||||
  regenerate-token: "トークンを再生成"
 | 
			
		||||
  token: "Token:"
 | 
			
		||||
  enter-password: "パスワードを入力してください"
 | 
			
		||||
  console:
 | 
			
		||||
    title: 'APIコンソール'
 | 
			
		||||
    endpoint: 'エンドポイント'
 | 
			
		||||
    parameter: 'パラメータ'
 | 
			
		||||
    send: '送信'
 | 
			
		||||
    sending: '応答待ち'
 | 
			
		||||
    response: '結果'
 | 
			
		||||
 | 
			
		||||
desktop/views/components/settings.apps.vue:
 | 
			
		||||
  no-apps: "連携しているアプリケーションはありません"
 | 
			
		||||
 | 
			
		||||
desktop/views/components/settings.drive.vue:
 | 
			
		||||
  max: "中"
 | 
			
		||||
common/views/components/drive-settings.vue:
 | 
			
		||||
  max: "容量"
 | 
			
		||||
  in-use: "使用中"
 | 
			
		||||
  stats: "統計"
 | 
			
		||||
 | 
			
		||||
desktop/views/components/settings.mute.vue:
 | 
			
		||||
  no-users: "ミュートしているユーザーはいません"
 | 
			
		||||
common/views/components/mute-and-block.vue:
 | 
			
		||||
  mute-and-block: "ミュートとブロック"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  no-muted-users: "ミュートしているユーザーはいません"
 | 
			
		||||
  no-blocked-users: "ブロックしているユーザーはいません"
 | 
			
		||||
 | 
			
		||||
desktop/views/components/settings.password.vue:
 | 
			
		||||
  reset: "パスワードを変更する"
 | 
			
		||||
@@ -986,7 +1017,6 @@ desktop/views/components/ui.header.vue:
 | 
			
		||||
 | 
			
		||||
desktop/views/components/ui.header.account.vue:
 | 
			
		||||
  profile: "プロフィール"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  favorites: "お気に入り"
 | 
			
		||||
  lists: "リスト"
 | 
			
		||||
  follow-requests: "フォロー申請"
 | 
			
		||||
@@ -1041,9 +1071,10 @@ desktop/views/components/window.vue:
 | 
			
		||||
 | 
			
		||||
desktop/views/pages/admin/admin.vue:
 | 
			
		||||
  dashboard: "ダッシュボード"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  users: "ユーザー"
 | 
			
		||||
  update: "更新"
 | 
			
		||||
  announcements: "お知らせ"
 | 
			
		||||
  hashtags: "ハッシュタグ"
 | 
			
		||||
 | 
			
		||||
desktop/views/pages/admin/admin.dashboard.vue:
 | 
			
		||||
  dashboard: "ダッシュボード"
 | 
			
		||||
@@ -1052,6 +1083,9 @@ desktop/views/pages/admin/admin.dashboard.vue:
 | 
			
		||||
  all-notes: "全ての投稿"
 | 
			
		||||
  original-notes: "このインスタンスの投稿"
 | 
			
		||||
  invite: "招待"
 | 
			
		||||
  banner-url: "Banner URL"
 | 
			
		||||
  disableRegistration: "Disable new user registration"
 | 
			
		||||
  disableLocalTimeline: "Disable the local timeline"
 | 
			
		||||
 | 
			
		||||
desktop/views/pages/admin/admin.suspend-user.vue:
 | 
			
		||||
  suspend-user: "ユーザーの凍結"
 | 
			
		||||
@@ -1073,13 +1107,26 @@ desktop/views/pages/admin/admin.unverify-user.vue:
 | 
			
		||||
  unverify: "公式アカウントを解除する"
 | 
			
		||||
  unverified: "公式アカウントを解除しました"
 | 
			
		||||
 | 
			
		||||
desktop/views/pages/admin/admin.announcements.vue:
 | 
			
		||||
  announcements: "お知らせ"
 | 
			
		||||
 | 
			
		||||
desktop/views/pages/admin/admin.hashtags.vue:
 | 
			
		||||
  hided-tags: "Hidden Tags"
 | 
			
		||||
 | 
			
		||||
desktop/views/pages/deck/deck.tl-column.vue:
 | 
			
		||||
  is-media-only: "メディア投稿のみ"
 | 
			
		||||
  is-media-view: "メディアビュー"
 | 
			
		||||
  edit: "オプション"
 | 
			
		||||
 | 
			
		||||
desktop/views/pages/deck/deck.user-column.vue:
 | 
			
		||||
  posts: "投稿"
 | 
			
		||||
  following: "フォロー"
 | 
			
		||||
  followers: "フォロワー"
 | 
			
		||||
  images: "画像"
 | 
			
		||||
  activity: "アクティビティ"
 | 
			
		||||
  timeline: "タイムライン"
 | 
			
		||||
  pinned-notes: "ピン留めされた投稿"
 | 
			
		||||
  push-to-a-list: "リストに追加"
 | 
			
		||||
 | 
			
		||||
desktop/views/pages/stats/stats.vue:
 | 
			
		||||
  all-users: "全てのユーザー"
 | 
			
		||||
@@ -1146,10 +1193,6 @@ desktop/views/pages/user/user.friends.vue:
 | 
			
		||||
 | 
			
		||||
desktop/views/pages/user/user.vue:
 | 
			
		||||
  is-suspended: "このユーザーは凍結されています。"
 | 
			
		||||
  is-remote: "このユーザーはリモートユーザーです。"
 | 
			
		||||
  view-remote: "正確な情報を見る"
 | 
			
		||||
 | 
			
		||||
desktop/views/pages/user/user.home.vue:
 | 
			
		||||
  last-used-at: "最終アクセス"
 | 
			
		||||
 | 
			
		||||
desktop/views/pages/user/user.photos.vue:
 | 
			
		||||
@@ -1165,6 +1208,9 @@ desktop/views/pages/user/user.profile.vue:
 | 
			
		||||
  mute: "ミュートする"
 | 
			
		||||
  muted: "ミュートしています"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロックする"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  block-confirm: "このユーザーをブロックしますか?"
 | 
			
		||||
  push-to-a-list: "リストに追加"
 | 
			
		||||
  list-pushed: "{user}を{list}に追加しました。"
 | 
			
		||||
 | 
			
		||||
@@ -1173,6 +1219,10 @@ desktop/views/pages/user/user.header.vue:
 | 
			
		||||
  following: "フォロー"
 | 
			
		||||
  followers: "フォロワー"
 | 
			
		||||
  is-bot: "このアカウントはBotです"
 | 
			
		||||
  years-old: "歳"
 | 
			
		||||
  year: "年"
 | 
			
		||||
  month: "月"
 | 
			
		||||
  day: "日"
 | 
			
		||||
 | 
			
		||||
desktop/views/pages/user/user.timeline.vue:
 | 
			
		||||
  default: "投稿"
 | 
			
		||||
@@ -1211,7 +1261,6 @@ desktop/views/widgets/users.vue:
 | 
			
		||||
  no-one: "いません!"
 | 
			
		||||
 | 
			
		||||
mobile/views/components/drive.vue:
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  used: "使用中"
 | 
			
		||||
  folder-count: "フォルダ"
 | 
			
		||||
  count-separator: "、"
 | 
			
		||||
@@ -1335,7 +1384,6 @@ mobile/views/components/ui.nav.vue:
 | 
			
		||||
  messaging: "メッセージ"
 | 
			
		||||
  follow-requests: "フォロー申請"
 | 
			
		||||
  search: "検索"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  favorites: "お気に入り"
 | 
			
		||||
  user-lists: "リスト"
 | 
			
		||||
  widgets: "ウィジェット"
 | 
			
		||||
@@ -1363,7 +1411,6 @@ mobile/views/pages/user-lists.vue:
 | 
			
		||||
  enter-list-name: "リスト名を入力してください"
 | 
			
		||||
 | 
			
		||||
mobile/views/pages/drive.vue:
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  more: "もっと見る"
 | 
			
		||||
 | 
			
		||||
mobile/views/pages/signup.vue:
 | 
			
		||||
@@ -1481,6 +1528,7 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  signout: "サインアウト"
 | 
			
		||||
  sound: "サウンド"
 | 
			
		||||
  enable-sounds: "サウンドを有効にする"
 | 
			
		||||
  mark-as-read-all-unread-notes: "すべての投稿を既読にする"
 | 
			
		||||
 | 
			
		||||
mobile/views/pages/user.vue:
 | 
			
		||||
  follows-you: "フォローされています"
 | 
			
		||||
@@ -1491,8 +1539,10 @@ mobile/views/pages/user.vue:
 | 
			
		||||
  timeline: "タイムライン"
 | 
			
		||||
  media: "メディア"
 | 
			
		||||
  is-suspended: "このユーザーは凍結されています。"
 | 
			
		||||
  is-remote: "このユーザーはリモートユーザーです。"
 | 
			
		||||
  view-remote: "正確な情報を見る"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
 | 
			
		||||
mobile/views/pages/user/home.vue:
 | 
			
		||||
  recent-notes: "最近の投稿"
 | 
			
		||||
@@ -1546,3 +1596,31 @@ docs:
 | 
			
		||||
 | 
			
		||||
dev/views/index.vue:
 | 
			
		||||
  manage-apps: "アプリの管理"
 | 
			
		||||
 | 
			
		||||
dev/views/apps.vue:
 | 
			
		||||
  manage-apps: "アプリを管理"
 | 
			
		||||
  create-app: "アプリ作成"
 | 
			
		||||
  app-missing: "アプリなし"
 | 
			
		||||
 | 
			
		||||
dev/views/new-app.vue:
 | 
			
		||||
  create-app: "アプリケーションの作成"
 | 
			
		||||
  app-name: "アプリケーション名"
 | 
			
		||||
  app-name-desc: "あなたのアプリの名称。"
 | 
			
		||||
  app-name-ex: "ex) Misskey for iOS"
 | 
			
		||||
  app-overview: "アプリの概要"
 | 
			
		||||
  app-desc: "あなたのアプリの簡単な説明や紹介。"
 | 
			
		||||
  app-desc-ex: "ex) Misskey iOSクライアント。"
 | 
			
		||||
  callback-url: "コールバックURL (オプション)"
 | 
			
		||||
  callback-url-desc: "ユーザーが認証フォームで認証した際にリダイレクトするURLを設定できます。"
 | 
			
		||||
  authority: "権限"
 | 
			
		||||
  authority-desc: "ここで要求した機能だけがAPIからアクセスできます。"
 | 
			
		||||
  authority-warning: "アプリ作成後も変更できますが、新たな権限を付与する場合、その時点で関連付けられているユーザーキーはすべて無効になります。"
 | 
			
		||||
  account-read: "アカウントの情報を見る。"
 | 
			
		||||
  account-write: "アカウントの情報を操作する。"
 | 
			
		||||
  note-write: "投稿する。"
 | 
			
		||||
  reaction-write: "リアクションしたりリアクションをキャンセルする。"
 | 
			
		||||
  following-write: "フォローしたりフォロー解除する。"
 | 
			
		||||
  drive-read: "ドライブを見る。"
 | 
			
		||||
  drive-write: "ドライブを操作する。"
 | 
			
		||||
  notification-read: "通知を見る。"
 | 
			
		||||
  notification-write: "通知を操作する。"
 | 
			
		||||
 
 | 
			
		||||
@@ -25,6 +25,14 @@ common:
 | 
			
		||||
  application-authorization: "アプリの連携"
 | 
			
		||||
  close: "さいなら"
 | 
			
		||||
  do-not-copy-paste: "ここにコードを入力したり張り付けたりせんといてください。アカウントが不正利用されるかも分からん。知らんけど。"
 | 
			
		||||
  BSoD:
 | 
			
		||||
    fatal-error: "あかん、やってもうたわ… (致命的なエラー"
 | 
			
		||||
    update-browser-os: "ブラウザ(またはOS)のバージョン更新してくれへん?なおるかもしれんわ。"
 | 
			
		||||
    error-code: "エラーコード"
 | 
			
		||||
    browser-version: "ブラウザ バージョン"
 | 
			
		||||
    client-version: "クライアント バージョン"
 | 
			
		||||
    email-support: "それでもあかん?せやったら syuilotan@yahoo.co.jp に連絡してや!"
 | 
			
		||||
    thanks: "Thank you おおきに。Misskey"
 | 
			
		||||
  got-it: "ほい"
 | 
			
		||||
  customization-tips:
 | 
			
		||||
    title: "カスタマイズのヒント"
 | 
			
		||||
@@ -54,6 +62,7 @@ common:
 | 
			
		||||
    years_ago: "{}年前"
 | 
			
		||||
  month-and-day: "{month}月 {day}日"
 | 
			
		||||
  trash: "ゴミ箱"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  weekday-short:
 | 
			
		||||
    sunday: "日"
 | 
			
		||||
    monday: "月"
 | 
			
		||||
@@ -115,6 +124,12 @@ common:
 | 
			
		||||
  reduce-motion: "UI、動き過ぎや、静かにしてや"
 | 
			
		||||
  this-setting-is-this-device-only: "このデバイスのみ"
 | 
			
		||||
  do-not-use-in-production: '開発ビルドや。本番環境で使わんといて!知らんで!'
 | 
			
		||||
  is-remote-user: "このユーザー情報はコピーです。"
 | 
			
		||||
  is-remote-post: "この投稿情報はコピーです。"
 | 
			
		||||
  view-on-remote: "ちゃんとした情報見せてや!"
 | 
			
		||||
  error:
 | 
			
		||||
    title: '問題が起こったわ'
 | 
			
		||||
    retry: 'もっぺん'
 | 
			
		||||
  reversi:
 | 
			
		||||
    drawn: "おあいこ"
 | 
			
		||||
    my-turn: "あんさんのターンや"
 | 
			
		||||
@@ -170,6 +185,7 @@ common:
 | 
			
		||||
    rename: "名前を変更や!"
 | 
			
		||||
    stack-left: "左に重ねんで!"
 | 
			
		||||
    pop-right: "右に出すで!"
 | 
			
		||||
  dev: "アプリの作成あかんかったわ。もっぺんやってみて。"
 | 
			
		||||
auth/views/form.vue:
 | 
			
		||||
  share-access: "<i>{{ app.name }}</i>があんさんのアカウントにアクセスすんのを<b>許可</b>してもええか?"
 | 
			
		||||
  permission-ask: "このアプリは次の権限を要求してんで:"
 | 
			
		||||
@@ -425,16 +441,16 @@ common/views/components/profile-editor.vue:
 | 
			
		||||
  birthday: "誕生日"
 | 
			
		||||
  avatar: "アイコン"
 | 
			
		||||
  banner: "バナー"
 | 
			
		||||
  is-cat: "このアカウントはCatです"
 | 
			
		||||
  is-bot: "このアカウントはBotです"
 | 
			
		||||
  is-locked: "フォローを承認制にする"
 | 
			
		||||
  careful-bot: "Botからのフォローだけ承認制にする"
 | 
			
		||||
  is-cat: "このアカウントはCatやで"
 | 
			
		||||
  is-bot: "このアカウントはBotやで"
 | 
			
		||||
  is-locked: "他人のフォローは許可してからや!"
 | 
			
		||||
  careful-bot: "Botからのフォローだけは許可制や"
 | 
			
		||||
  advanced: "その他"
 | 
			
		||||
  privacy: "プライバシー"
 | 
			
		||||
  privacy: "プライバシーってなんや?オカンの年齢か?"
 | 
			
		||||
  save: "保存"
 | 
			
		||||
  saved: "プロフィールを保存しました"
 | 
			
		||||
  uploading: "アップロード中"
 | 
			
		||||
  upload-failed: "アップロードに失敗しました"
 | 
			
		||||
  saved: "プロフィールを保存したで"
 | 
			
		||||
  uploading: "アップロードしとります"
 | 
			
		||||
  upload-failed: "これアップロードでけへんわ"
 | 
			
		||||
common/views/widgets/broadcast.vue:
 | 
			
		||||
  fetching: "見てみるわ…"
 | 
			
		||||
  no-broadcasts: "お知らせはあらへんで"
 | 
			
		||||
@@ -526,11 +542,14 @@ desktop/views/components/charts.vue:
 | 
			
		||||
  title: "チャート"
 | 
			
		||||
  per-day: "1日ごと"
 | 
			
		||||
  per-hour: "1時間ごと"
 | 
			
		||||
  federation: "フェデレーション"
 | 
			
		||||
  notes: "投稿"
 | 
			
		||||
  users: "ユーザー"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  network: "ネットワーク"
 | 
			
		||||
  charts:
 | 
			
		||||
    federation-instances: "インスタンスの増減"
 | 
			
		||||
    federation-instances-total: "インスタンスの積算"
 | 
			
		||||
    notes: "投稿の増減(統合)"
 | 
			
		||||
    local-notes: "投稿の増減 (ローカル)"
 | 
			
		||||
    remote-notes: "投稿の増減 (リモート)"
 | 
			
		||||
@@ -560,7 +579,6 @@ desktop/views/components/crop-window.vue:
 | 
			
		||||
  ok: "そうする"
 | 
			
		||||
desktop/views/components/drive-window.vue:
 | 
			
		||||
  used: "使うとる"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
desktop/views/components/drive.file.vue:
 | 
			
		||||
  avatar: "アイコン"
 | 
			
		||||
  banner: "バナー"
 | 
			
		||||
@@ -590,8 +608,6 @@ desktop/views/components/drive.folder.vue:
 | 
			
		||||
    rename: "名前を変えるで"
 | 
			
		||||
    rename-folder: "フォルダ名を変えるで"
 | 
			
		||||
    input-new-folder-name: "新しいフォルダ名を入力してや"
 | 
			
		||||
desktop/views/components/drive.nav-folder.vue:
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
desktop/views/components/drive.vue:
 | 
			
		||||
  search: "検索"
 | 
			
		||||
  load-more: "もっとあらへんのか!"
 | 
			
		||||
@@ -661,12 +677,12 @@ desktop/views/components/note-detail.vue:
 | 
			
		||||
  add-reaction: "リアクション"
 | 
			
		||||
desktop/views/components/note.vue:
 | 
			
		||||
  reposted-by: "{}がRenote"
 | 
			
		||||
  reply: "返信"
 | 
			
		||||
  reply: "返す"
 | 
			
		||||
  renote: "Renote"
 | 
			
		||||
  add-reaction: "リアクション"
 | 
			
		||||
  detail: "詳細"
 | 
			
		||||
  private: "この投稿は非公開です"
 | 
			
		||||
  deleted: "この投稿は削除されました"
 | 
			
		||||
  detail: "もっと"
 | 
			
		||||
  private: "この投稿は見せられへんわ"
 | 
			
		||||
  deleted: "この投稿なんか無くなってもうたわ"
 | 
			
		||||
desktop/views/components/notes.vue:
 | 
			
		||||
  error: "あかん、読み込めへんわ"
 | 
			
		||||
  retry: "もっぺん"
 | 
			
		||||
@@ -725,8 +741,8 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  profile: "プロフィール"
 | 
			
		||||
  notification: "通知"
 | 
			
		||||
  apps: "アプリ"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  mute-and-block: "ミュート/ブロック"
 | 
			
		||||
  blocking: "ブロック"
 | 
			
		||||
  security: "守護神セキュリティ"
 | 
			
		||||
  signin: "こんな感じでサインインしたらしいで"
 | 
			
		||||
  password: "パスワード"
 | 
			
		||||
@@ -746,7 +762,7 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  api-via-stream: "ストリームを経由したAPIリクエスト"
 | 
			
		||||
  api-via-stream-desc: "この設定をオンにすると、WebSocket接続を経由してAPIリクエストが行われんで(パフォーマンス向上するかも、知らんけど)。オフにすると、ネイティブの fetch API が利用されるで。この設定はこのデバイスのみ有効やで。"
 | 
			
		||||
  deck-nav: "デッキ内ナビゲーション"
 | 
			
		||||
  deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
 | 
			
		||||
  deck-nav-desc: "デッキを使うとるとき、ナビゲーションが発生するときにページ移動せんで、一時的なカラムで受けれるようにするで"
 | 
			
		||||
  deck-default: "デッキをデフォルトのUIにする"
 | 
			
		||||
  display: "見た感じ"
 | 
			
		||||
  customize: "ホームをカスタマイズ"
 | 
			
		||||
@@ -768,7 +784,7 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  show-local-renotes: "ローカル投稿のRenoteも見たいんや"
 | 
			
		||||
  show-maps: "地図勝手にバァーって開いてくれ"
 | 
			
		||||
  deck-column-align: "デッキのカラムの位置"
 | 
			
		||||
  deck-column-align-center: "中央"
 | 
			
		||||
  deck-column-align-center: "真ん中"
 | 
			
		||||
  deck-column-align-left: "左"
 | 
			
		||||
  sound: "サウンド"
 | 
			
		||||
  enable-sounds: "サウンド鳴らす"
 | 
			
		||||
@@ -832,20 +848,32 @@ desktop/views/components/settings.2fa.vue:
 | 
			
		||||
  success: "設定が完了したで!"
 | 
			
		||||
  failed: "なんか設定に失敗したで。トークンを間違えとらんか確認してや。"
 | 
			
		||||
  info: "次のサインインからは、パスワードに加えてデバイスに出とるトークンを入力してな。"
 | 
			
		||||
desktop/views/components/settings.api.vue:
 | 
			
		||||
  intro: "APIを利用するには、上記のトークンを「i」っちゅうキーでパラメータに付加してリクエストしてや。"
 | 
			
		||||
  caution: "アカウントを不正利用されるかも知れんから、このトークンは第三者に教えたらあかんで(アプリなどにも入力しんといてな)。"
 | 
			
		||||
  regeneration-of-token: "万が一このトークンが漏れたとかその可能性があったらトークンを再生成できるで。"
 | 
			
		||||
  regenerate-token: "トークンを再生成"
 | 
			
		||||
  token: "トークン:"
 | 
			
		||||
  enter-password: "パスワードを入力してや"
 | 
			
		||||
common/views/components/api-settings.vue:
 | 
			
		||||
  intro: "API使うんやったらこのトークンを「i」っちゅうパラメータにくっつけてリクエストできるで。"
 | 
			
		||||
  caution: "アカウント勝手にいじられるかも知れんから、このトークンは教えたらあかんし、アプリにも書いたらあかんで(これはフリちゃうで)"
 | 
			
		||||
  regeneration-of-token: "トークン漏れてもうたんやったらもっかい生成できるで。"
 | 
			
		||||
  regenerate-token: "トークンもっかい生成"
 | 
			
		||||
  token: "Token:"
 | 
			
		||||
  enter-password: "パスワードを入れてや"
 | 
			
		||||
  console:
 | 
			
		||||
    title: 'APIコンソール'
 | 
			
		||||
    endpoint: 'エンドポイント'
 | 
			
		||||
    parameter: 'パラメータ'
 | 
			
		||||
    send: '送る'
 | 
			
		||||
    sending: '応答待っとる'
 | 
			
		||||
    response: 'こんなん返ってきたわ'
 | 
			
		||||
desktop/views/components/settings.apps.vue:
 | 
			
		||||
  no-apps: "連携しているアプリケーションはあらへんで"
 | 
			
		||||
desktop/views/components/settings.drive.vue:
 | 
			
		||||
  max: "中"
 | 
			
		||||
  in-use: "使用中"
 | 
			
		||||
desktop/views/components/settings.mute.vue:
 | 
			
		||||
  no-users: "ミュートしているユーザーはおらんで"
 | 
			
		||||
common/views/components/drive-settings.vue:
 | 
			
		||||
  max: "容量"
 | 
			
		||||
  in-use: "使うとる"
 | 
			
		||||
  stats: "統計"
 | 
			
		||||
common/views/components/mute-and-block.vue:
 | 
			
		||||
  mute-and-block: "ミュートとブロック"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  no-muted-users: "ミュートしているユーザーはいません"
 | 
			
		||||
  no-blocked-users: "ブロックしているユーザーはいません"
 | 
			
		||||
desktop/views/components/settings.password.vue:
 | 
			
		||||
  reset: "パスワードを変更する"
 | 
			
		||||
  enter-current-password: "今のパスワードを入れてや"
 | 
			
		||||
@@ -877,7 +905,6 @@ desktop/views/components/ui.header.vue:
 | 
			
		||||
  adjective: "はん"
 | 
			
		||||
desktop/views/components/ui.header.account.vue:
 | 
			
		||||
  profile: "プロフィール"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  favorites: "お気に入り"
 | 
			
		||||
  lists: "リスト"
 | 
			
		||||
  follow-requests: "フォロー許してくれや!言うてみる"
 | 
			
		||||
@@ -921,9 +948,10 @@ desktop/views/components/window.vue:
 | 
			
		||||
  close: "さいなら"
 | 
			
		||||
desktop/views/pages/admin/admin.vue:
 | 
			
		||||
  dashboard: "ダッシュボード"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  users: "ユーザー"
 | 
			
		||||
  update: "更新"
 | 
			
		||||
  announcements: "知っといてや"
 | 
			
		||||
  hashtags: "ハッシュタグ"
 | 
			
		||||
desktop/views/pages/admin/admin.dashboard.vue:
 | 
			
		||||
  dashboard: "ダッシュボード"
 | 
			
		||||
  all-users: "知り合い全員や"
 | 
			
		||||
@@ -931,6 +959,9 @@ desktop/views/pages/admin/admin.dashboard.vue:
 | 
			
		||||
  all-notes: "全ての投稿"
 | 
			
		||||
  original-notes: "このインスタンスの投稿"
 | 
			
		||||
  invite: "来てや"
 | 
			
		||||
  banner-url: "Banner URL"
 | 
			
		||||
  disableRegistration: "Disable new user registration"
 | 
			
		||||
  disableLocalTimeline: "Disable the local timeline"
 | 
			
		||||
desktop/views/pages/admin/admin.suspend-user.vue:
 | 
			
		||||
  suspend-user: "ユーザーの凍結"
 | 
			
		||||
  suspend: "凍結"
 | 
			
		||||
@@ -947,12 +978,23 @@ desktop/views/pages/admin/admin.unverify-user.vue:
 | 
			
		||||
  unverify-user: "ユーザーの公式アカウントにせーへん"
 | 
			
		||||
  unverify: "公式アカウントにはさせへんで"
 | 
			
		||||
  unverified: "公式アカウントを解除したで"
 | 
			
		||||
desktop/views/pages/admin/admin.announcements.vue:
 | 
			
		||||
  announcements: "知っといてや"
 | 
			
		||||
desktop/views/pages/admin/admin.hashtags.vue:
 | 
			
		||||
  hided-tags: "Hidden Tags"
 | 
			
		||||
desktop/views/pages/deck/deck.tl-column.vue:
 | 
			
		||||
  is-media-only: "メディア投稿だけや"
 | 
			
		||||
  is-media-view: "メディアビュー"
 | 
			
		||||
  edit: "オプション"
 | 
			
		||||
desktop/views/pages/deck/deck.user-column.vue:
 | 
			
		||||
  pinned-notes: "ピン留めされた投稿"
 | 
			
		||||
  posts: "投稿"
 | 
			
		||||
  following: "フォロー"
 | 
			
		||||
  followers: "フォロワー"
 | 
			
		||||
  images: "画像"
 | 
			
		||||
  activity: "やっとること"
 | 
			
		||||
  timeline: "タイムライン"
 | 
			
		||||
  pinned-notes: "ピン留めしはった投稿"
 | 
			
		||||
  push-to-a-list: "リストに入れたる"
 | 
			
		||||
desktop/views/pages/stats/stats.vue:
 | 
			
		||||
  all-users: "全てのユーザー"
 | 
			
		||||
  original-users: "ここの人らだけ"
 | 
			
		||||
@@ -1005,10 +1047,7 @@ desktop/views/pages/user/user.friends.vue:
 | 
			
		||||
  no-users: "よう話すツレは居らん"
 | 
			
		||||
desktop/views/pages/user/user.vue:
 | 
			
		||||
  is-suspended: "このユーザーはあかんわ。凍結されとる。"
 | 
			
		||||
  is-remote: "このユーザーはリモートユーザーや。"
 | 
			
		||||
  view-remote: "ちゃんとした情報を見る"
 | 
			
		||||
desktop/views/pages/user/user.home.vue:
 | 
			
		||||
  last-used-at: "最後いつ来た?"
 | 
			
		||||
  last-used-at: "最後いつ来はった?"
 | 
			
		||||
desktop/views/pages/user/user.photos.vue:
 | 
			
		||||
  title: "写真"
 | 
			
		||||
  loading: "読み込んどります"
 | 
			
		||||
@@ -1021,6 +1060,9 @@ desktop/views/pages/user/user.profile.vue:
 | 
			
		||||
  mute: "ミュートする"
 | 
			
		||||
  muted: "ミュートしとるで"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロックする"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  block-confirm: "このユーザーをブロックしますか?"
 | 
			
		||||
  push-to-a-list: "リストに追加"
 | 
			
		||||
  list-pushed: "{user}を{list}に追加したで。"
 | 
			
		||||
desktop/views/pages/user/user.header.vue:
 | 
			
		||||
@@ -1028,6 +1070,10 @@ desktop/views/pages/user/user.header.vue:
 | 
			
		||||
  following: "フォロー"
 | 
			
		||||
  followers: "フォロワー"
 | 
			
		||||
  is-bot: "このアカウントはBotや"
 | 
			
		||||
  years-old: "歳"
 | 
			
		||||
  year: "年"
 | 
			
		||||
  month: "月"
 | 
			
		||||
  day: "日"
 | 
			
		||||
desktop/views/pages/user/user.timeline.vue:
 | 
			
		||||
  default: "投稿"
 | 
			
		||||
  with-replies: "投稿と返信"
 | 
			
		||||
@@ -1057,7 +1103,6 @@ desktop/views/widgets/users.vue:
 | 
			
		||||
  refresh: "他を見る"
 | 
			
		||||
  no-one: "おらん!"
 | 
			
		||||
mobile/views/components/drive.vue:
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  used: "使うとる"
 | 
			
		||||
  folder-count: "フォルダ"
 | 
			
		||||
  count-separator: "、"
 | 
			
		||||
@@ -1087,8 +1132,8 @@ mobile/views/components/drive.file-detail.vue:
 | 
			
		||||
  hash: "ハッシュ(md5)"
 | 
			
		||||
  exif: "EXIF"
 | 
			
		||||
  nsfw: "ちょっと見せられへんわ"
 | 
			
		||||
  mark-as-sensitive: "閲覧注意に設定"
 | 
			
		||||
  unmark-as-sensitive: "閲覧注意を解除"
 | 
			
		||||
  mark-as-sensitive: "見たらあかん感じにしとく"
 | 
			
		||||
  unmark-as-sensitive: "やっぱ見せたるわ"
 | 
			
		||||
mobile/views/components/media-image.vue:
 | 
			
		||||
  sensitive: "見たらあかんで"
 | 
			
		||||
  click-to-show: "押してみ、見せたるわ"
 | 
			
		||||
@@ -1161,7 +1206,6 @@ mobile/views/components/ui.nav.vue:
 | 
			
		||||
  messaging: "メッセージ"
 | 
			
		||||
  follow-requests: "フォロー許してくれや!言うてみる"
 | 
			
		||||
  search: "検索"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  favorites: "お気に入り"
 | 
			
		||||
  user-lists: "リスト"
 | 
			
		||||
  widgets: "ウィジェット"
 | 
			
		||||
@@ -1184,7 +1228,6 @@ mobile/views/pages/user-lists.vue:
 | 
			
		||||
  title: "リスト"
 | 
			
		||||
  enter-list-name: "リスト名を入力してや"
 | 
			
		||||
mobile/views/pages/drive.vue:
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  more: "もっとあるやろ!"
 | 
			
		||||
mobile/views/pages/signup.vue:
 | 
			
		||||
  lets-start: "📦 始めようや"
 | 
			
		||||
@@ -1284,6 +1327,7 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  signout: "さいなら"
 | 
			
		||||
  sound: "サウンド"
 | 
			
		||||
  enable-sounds: "サウンド鳴らす"
 | 
			
		||||
  mark-as-read-all-unread-notes: "全部もう読んだわ"
 | 
			
		||||
mobile/views/pages/user.vue:
 | 
			
		||||
  follows-you: "フォローされとるで"
 | 
			
		||||
  following: "フォロー"
 | 
			
		||||
@@ -1293,8 +1337,10 @@ mobile/views/pages/user.vue:
 | 
			
		||||
  timeline: "タイムライン"
 | 
			
		||||
  media: "メディア"
 | 
			
		||||
  is-suspended: "このユーザーはあかんわ。凍結されとる。"
 | 
			
		||||
  is-remote: "このユーザーは東京とかそこらへんのリモートユーザーや。"
 | 
			
		||||
  view-remote: "ちゃんとした情報を見る"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
mobile/views/pages/user/home.vue:
 | 
			
		||||
  recent-notes: "最近儲かりまっか?"
 | 
			
		||||
  images: "画像"
 | 
			
		||||
@@ -1340,3 +1386,29 @@ docs:
 | 
			
		||||
      description: "説明"
 | 
			
		||||
dev/views/index.vue:
 | 
			
		||||
  manage-apps: "アプリの管理"
 | 
			
		||||
dev/views/apps.vue:
 | 
			
		||||
  manage-apps: "アプリを管理"
 | 
			
		||||
  create-app: "アプリ作る"
 | 
			
		||||
  app-missing: "アプリあらへん"
 | 
			
		||||
dev/views/new-app.vue:
 | 
			
		||||
  create-app: "アプリケーション作る"
 | 
			
		||||
  app-name: "アプリケーションの名前"
 | 
			
		||||
  app-name-desc: "あんたのアプリの名前。"
 | 
			
		||||
  app-name-ex: "ex) 関西ミスキー保安協会"
 | 
			
		||||
  app-overview: "このアプリどんなん?"
 | 
			
		||||
  app-desc: "あんたのアプリどんなんか教えて"
 | 
			
		||||
  app-desc-ex: "ex) 関西人なら誰でも口ずさめるこのCMがついにMisskeyへ。"
 | 
			
		||||
  callback-url: "コールバックURL (無くてもええで)"
 | 
			
		||||
  callback-url-desc: "ユーザーが認証フォームで認証した後どこに連れてくかを設定できるで"
 | 
			
		||||
  authority: "権限"
 | 
			
		||||
  authority-desc: "ここにチェックした機能しかAPIからアクセスできひんから気ぃつけてな"
 | 
			
		||||
  authority-warning: "アプリ作った後でも変えれるけど、新しいやつ追加したらそん時関連付いてるユーザーキーは全部ほかされるで。"
 | 
			
		||||
  account-read: "アカウントの情報見せて"
 | 
			
		||||
  account-write: "アカウントの情報いじらせて"
 | 
			
		||||
  note-write: "投稿させて"
 | 
			
		||||
  reaction-write: "リアクションしたりそれをキャンセルさせて"
 | 
			
		||||
  following-write: "フォローとかフォロー解除させて"
 | 
			
		||||
  drive-read: "ドライブ見せて"
 | 
			
		||||
  drive-write: "ドライブいじらせて"
 | 
			
		||||
  notification-read: "通知見せて"
 | 
			
		||||
  notification-write: "通知いじらせて"
 | 
			
		||||
 
 | 
			
		||||
@@ -25,6 +25,14 @@ common:
 | 
			
		||||
  application-authorization: "앱의 연계"
 | 
			
		||||
  close: "닫기"
 | 
			
		||||
  do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
 | 
			
		||||
  BSoD:
 | 
			
		||||
    fatal-error: ":( 致命的な問題が発生しました。"
 | 
			
		||||
    update-browser-os: "お使いのブラウザ(またはOS)のバージョンを更新すると解決する可能性があります。"
 | 
			
		||||
    error-code: "エラーコード"
 | 
			
		||||
    browser-version: "ブラウザ バージョン"
 | 
			
		||||
    client-version: "クライアント バージョン"
 | 
			
		||||
    email-support: "問題が解決しない場合は、上記の情報をお書き添えの上 syuilotan@yahoo.co.jp までご連絡ください。"
 | 
			
		||||
    thanks: "Thank you for using Misskey."
 | 
			
		||||
  got-it: "알았습니다"
 | 
			
		||||
  customization-tips:
 | 
			
		||||
    title: "사용자 정의 팁"
 | 
			
		||||
@@ -54,6 +62,7 @@ common:
 | 
			
		||||
    years_ago: "{}년전"
 | 
			
		||||
  month-and-day: "{month}월 {day}일"
 | 
			
		||||
  trash: "휴지통"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  weekday-short:
 | 
			
		||||
    sunday: "일"
 | 
			
		||||
    monday: "월"
 | 
			
		||||
@@ -115,6 +124,12 @@ common:
 | 
			
		||||
  reduce-motion: "UIの動きを減らす"
 | 
			
		||||
  this-setting-is-this-device-only: "이 장치만"
 | 
			
		||||
  do-not-use-in-production: '이것은 개발 빌드입니다. 프로덕션 환경에서 사용하지 마십시오.'
 | 
			
		||||
  is-remote-user: "このユーザー情報はコピーです。"
 | 
			
		||||
  is-remote-post: "この投稿情報はコピーです。"
 | 
			
		||||
  view-on-remote: "正確な情報を見る"
 | 
			
		||||
  error:
 | 
			
		||||
    title: '問題が発生しました'
 | 
			
		||||
    retry: 'やり直す'
 | 
			
		||||
  reversi:
 | 
			
		||||
    drawn: "무승부"
 | 
			
		||||
    my-turn: "당신의 차례입니다"
 | 
			
		||||
@@ -170,6 +185,7 @@ common:
 | 
			
		||||
    rename: "이름 변경"
 | 
			
		||||
    stack-left: "左に重ねる"
 | 
			
		||||
    pop-right: "右に出す"
 | 
			
		||||
  dev: "アプリの作成に失敗しました。再度お試しください。"
 | 
			
		||||
auth/views/form.vue:
 | 
			
		||||
  share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
 | 
			
		||||
  permission-ask: "このアプリは次の権限を要求しています:"
 | 
			
		||||
@@ -526,11 +542,14 @@ desktop/views/components/charts.vue:
 | 
			
		||||
  title: "チャート"
 | 
			
		||||
  per-day: "1日ごと"
 | 
			
		||||
  per-hour: "1時間ごと"
 | 
			
		||||
  federation: "フェデレーション"
 | 
			
		||||
  notes: "投稿"
 | 
			
		||||
  users: "ユーザー"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  network: "ネットワーク"
 | 
			
		||||
  charts:
 | 
			
		||||
    federation-instances: "インスタンスの増減"
 | 
			
		||||
    federation-instances-total: "インスタンスの積算"
 | 
			
		||||
    notes: "投稿の増減 (統合)"
 | 
			
		||||
    local-notes: "投稿の増減 (ローカル)"
 | 
			
		||||
    remote-notes: "投稿の増減 (リモート)"
 | 
			
		||||
@@ -560,7 +579,6 @@ desktop/views/components/crop-window.vue:
 | 
			
		||||
  ok: "決定"
 | 
			
		||||
desktop/views/components/drive-window.vue:
 | 
			
		||||
  used: "使用中"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
desktop/views/components/drive.file.vue:
 | 
			
		||||
  avatar: "アイコン"
 | 
			
		||||
  banner: "バナー"
 | 
			
		||||
@@ -590,8 +608,6 @@ desktop/views/components/drive.folder.vue:
 | 
			
		||||
    rename: "名前を変更"
 | 
			
		||||
    rename-folder: "フォルダ名の変更"
 | 
			
		||||
    input-new-folder-name: "新しいフォルダ名を入力してください"
 | 
			
		||||
desktop/views/components/drive.nav-folder.vue:
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
desktop/views/components/drive.vue:
 | 
			
		||||
  search: "検索"
 | 
			
		||||
  load-more: "もっと読み込む"
 | 
			
		||||
@@ -725,8 +741,8 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  profile: "プロフィール"
 | 
			
		||||
  notification: "通知"
 | 
			
		||||
  apps: "アプリ"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  mute-and-block: "ミュート/ブロック"
 | 
			
		||||
  blocking: "ブロック"
 | 
			
		||||
  security: "セキュリティ"
 | 
			
		||||
  signin: "サインイン履歴"
 | 
			
		||||
  password: "パスワード"
 | 
			
		||||
@@ -832,20 +848,32 @@ desktop/views/components/settings.2fa.vue:
 | 
			
		||||
  success: "設定が完了しました!"
 | 
			
		||||
  failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
 | 
			
		||||
  info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
 | 
			
		||||
desktop/views/components/settings.api.vue:
 | 
			
		||||
common/views/components/api-settings.vue:
 | 
			
		||||
  intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
 | 
			
		||||
  caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
 | 
			
		||||
  regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
 | 
			
		||||
  regenerate-token: "トークンを再生成"
 | 
			
		||||
  token: "Token:"
 | 
			
		||||
  enter-password: "パスワードを入力してください"
 | 
			
		||||
  console:
 | 
			
		||||
    title: 'APIコンソール'
 | 
			
		||||
    endpoint: 'エンドポイント'
 | 
			
		||||
    parameter: 'パラメータ'
 | 
			
		||||
    send: '送信'
 | 
			
		||||
    sending: '応答待ち'
 | 
			
		||||
    response: '結果'
 | 
			
		||||
desktop/views/components/settings.apps.vue:
 | 
			
		||||
  no-apps: "連携しているアプリケーションはありません"
 | 
			
		||||
desktop/views/components/settings.drive.vue:
 | 
			
		||||
  max: "中"
 | 
			
		||||
common/views/components/drive-settings.vue:
 | 
			
		||||
  max: "容量"
 | 
			
		||||
  in-use: "使用中"
 | 
			
		||||
desktop/views/components/settings.mute.vue:
 | 
			
		||||
  no-users: "ミュートしているユーザーはいません"
 | 
			
		||||
  stats: "統計"
 | 
			
		||||
common/views/components/mute-and-block.vue:
 | 
			
		||||
  mute-and-block: "ミュートとブロック"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  no-muted-users: "ミュートしているユーザーはいません"
 | 
			
		||||
  no-blocked-users: "ブロックしているユーザーはいません"
 | 
			
		||||
desktop/views/components/settings.password.vue:
 | 
			
		||||
  reset: "パスワードを変更する"
 | 
			
		||||
  enter-current-password: "現在のパスワードを入力してください"
 | 
			
		||||
@@ -877,7 +905,6 @@ desktop/views/components/ui.header.vue:
 | 
			
		||||
  adjective: "さん"
 | 
			
		||||
desktop/views/components/ui.header.account.vue:
 | 
			
		||||
  profile: "プロフィール"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  favorites: "お気に入り"
 | 
			
		||||
  lists: "リスト"
 | 
			
		||||
  follow-requests: "フォロー申請"
 | 
			
		||||
@@ -921,9 +948,10 @@ desktop/views/components/window.vue:
 | 
			
		||||
  close: "閉じる"
 | 
			
		||||
desktop/views/pages/admin/admin.vue:
 | 
			
		||||
  dashboard: "ダッシュボード"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  users: "ユーザー"
 | 
			
		||||
  update: "更新"
 | 
			
		||||
  announcements: "お知らせ"
 | 
			
		||||
  hashtags: "ハッシュタグ"
 | 
			
		||||
desktop/views/pages/admin/admin.dashboard.vue:
 | 
			
		||||
  dashboard: "ダッシュボード"
 | 
			
		||||
  all-users: "全てのユーザー"
 | 
			
		||||
@@ -931,6 +959,9 @@ desktop/views/pages/admin/admin.dashboard.vue:
 | 
			
		||||
  all-notes: "全ての投稿"
 | 
			
		||||
  original-notes: "このインスタンスの投稿"
 | 
			
		||||
  invite: "招待"
 | 
			
		||||
  banner-url: "Banner URL"
 | 
			
		||||
  disableRegistration: "Disable new user registration"
 | 
			
		||||
  disableLocalTimeline: "Disable the local timeline"
 | 
			
		||||
desktop/views/pages/admin/admin.suspend-user.vue:
 | 
			
		||||
  suspend-user: "ユーザーの凍結"
 | 
			
		||||
  suspend: "凍結"
 | 
			
		||||
@@ -947,12 +978,23 @@ desktop/views/pages/admin/admin.unverify-user.vue:
 | 
			
		||||
  unverify-user: "ユーザーの公式アカウント解除"
 | 
			
		||||
  unverify: "公式アカウントを解除する"
 | 
			
		||||
  unverified: "公式アカウントを解除しました"
 | 
			
		||||
desktop/views/pages/admin/admin.announcements.vue:
 | 
			
		||||
  announcements: "お知らせ"
 | 
			
		||||
desktop/views/pages/admin/admin.hashtags.vue:
 | 
			
		||||
  hided-tags: "Hidden Tags"
 | 
			
		||||
desktop/views/pages/deck/deck.tl-column.vue:
 | 
			
		||||
  is-media-only: "メディア投稿のみ"
 | 
			
		||||
  is-media-view: "メディアビュー"
 | 
			
		||||
  edit: "オプション"
 | 
			
		||||
desktop/views/pages/deck/deck.user-column.vue:
 | 
			
		||||
  posts: "投稿"
 | 
			
		||||
  following: "フォロー"
 | 
			
		||||
  followers: "フォロワー"
 | 
			
		||||
  images: "画像"
 | 
			
		||||
  activity: "アクティビティ"
 | 
			
		||||
  timeline: "タイムライン"
 | 
			
		||||
  pinned-notes: "ピン留めされた投稿"
 | 
			
		||||
  push-to-a-list: "リストに追加"
 | 
			
		||||
desktop/views/pages/stats/stats.vue:
 | 
			
		||||
  all-users: "全てのユーザー"
 | 
			
		||||
  original-users: "このインスタンスのユーザー"
 | 
			
		||||
@@ -1005,9 +1047,6 @@ desktop/views/pages/user/user.friends.vue:
 | 
			
		||||
  no-users: "よく話すユーザーはいません"
 | 
			
		||||
desktop/views/pages/user/user.vue:
 | 
			
		||||
  is-suspended: "このユーザーは凍結されています。"
 | 
			
		||||
  is-remote: "このユーザーはリモートユーザーです。"
 | 
			
		||||
  view-remote: "正確な情報を見る"
 | 
			
		||||
desktop/views/pages/user/user.home.vue:
 | 
			
		||||
  last-used-at: "最終アクセス"
 | 
			
		||||
desktop/views/pages/user/user.photos.vue:
 | 
			
		||||
  title: "フォト"
 | 
			
		||||
@@ -1021,6 +1060,9 @@ desktop/views/pages/user/user.profile.vue:
 | 
			
		||||
  mute: "ミュートする"
 | 
			
		||||
  muted: "ミュートしています"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロックする"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  block-confirm: "このユーザーをブロックしますか?"
 | 
			
		||||
  push-to-a-list: "リストに追加"
 | 
			
		||||
  list-pushed: "{user}を{list}に追加しました。"
 | 
			
		||||
desktop/views/pages/user/user.header.vue:
 | 
			
		||||
@@ -1028,6 +1070,10 @@ desktop/views/pages/user/user.header.vue:
 | 
			
		||||
  following: "フォロー"
 | 
			
		||||
  followers: "フォロワー"
 | 
			
		||||
  is-bot: "このアカウントはBotです"
 | 
			
		||||
  years-old: "歳"
 | 
			
		||||
  year: "年"
 | 
			
		||||
  month: "月"
 | 
			
		||||
  day: "日"
 | 
			
		||||
desktop/views/pages/user/user.timeline.vue:
 | 
			
		||||
  default: "投稿"
 | 
			
		||||
  with-replies: "投稿と返信"
 | 
			
		||||
@@ -1057,7 +1103,6 @@ desktop/views/widgets/users.vue:
 | 
			
		||||
  refresh: "他を見る"
 | 
			
		||||
  no-one: "いません!"
 | 
			
		||||
mobile/views/components/drive.vue:
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  used: "使用中"
 | 
			
		||||
  folder-count: "フォルダ"
 | 
			
		||||
  count-separator: "、"
 | 
			
		||||
@@ -1161,7 +1206,6 @@ mobile/views/components/ui.nav.vue:
 | 
			
		||||
  messaging: "メッセージ"
 | 
			
		||||
  follow-requests: "フォロー申請"
 | 
			
		||||
  search: "検索"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  favorites: "お気に入り"
 | 
			
		||||
  user-lists: "リスト"
 | 
			
		||||
  widgets: "ウィジェット"
 | 
			
		||||
@@ -1184,7 +1228,6 @@ mobile/views/pages/user-lists.vue:
 | 
			
		||||
  title: "リスト"
 | 
			
		||||
  enter-list-name: "リスト名を入力してください"
 | 
			
		||||
mobile/views/pages/drive.vue:
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  more: "もっと見る"
 | 
			
		||||
mobile/views/pages/signup.vue:
 | 
			
		||||
  lets-start: "📦 始めましょう"
 | 
			
		||||
@@ -1284,6 +1327,7 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  signout: "サインアウト"
 | 
			
		||||
  sound: "サウンド"
 | 
			
		||||
  enable-sounds: "サウンドを有効にする"
 | 
			
		||||
  mark-as-read-all-unread-notes: "すべての投稿を既読にする"
 | 
			
		||||
mobile/views/pages/user.vue:
 | 
			
		||||
  follows-you: "フォローされています"
 | 
			
		||||
  following: "フォロー"
 | 
			
		||||
@@ -1293,8 +1337,10 @@ mobile/views/pages/user.vue:
 | 
			
		||||
  timeline: "タイムライン"
 | 
			
		||||
  media: "メディア"
 | 
			
		||||
  is-suspended: "このユーザーは凍結されています。"
 | 
			
		||||
  is-remote: "このユーザーはリモートユーザーです。"
 | 
			
		||||
  view-remote: "正確な情報を見る"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
mobile/views/pages/user/home.vue:
 | 
			
		||||
  recent-notes: "最近の投稿"
 | 
			
		||||
  images: "画像"
 | 
			
		||||
@@ -1340,3 +1386,29 @@ docs:
 | 
			
		||||
      description: "説明"
 | 
			
		||||
dev/views/index.vue:
 | 
			
		||||
  manage-apps: "アプリの管理"
 | 
			
		||||
dev/views/apps.vue:
 | 
			
		||||
  manage-apps: "アプリを管理"
 | 
			
		||||
  create-app: "アプリ作成"
 | 
			
		||||
  app-missing: "アプリなし"
 | 
			
		||||
dev/views/new-app.vue:
 | 
			
		||||
  create-app: "アプリケーションの作成"
 | 
			
		||||
  app-name: "アプリケーション名"
 | 
			
		||||
  app-name-desc: "あなたのアプリの名称。"
 | 
			
		||||
  app-name-ex: "ex) Misskey for iOS"
 | 
			
		||||
  app-overview: "アプリの概要"
 | 
			
		||||
  app-desc: "あなたのアプリの簡単な説明や紹介。"
 | 
			
		||||
  app-desc-ex: "ex) Misskey iOSクライアント。"
 | 
			
		||||
  callback-url: "コールバックURL (オプション)"
 | 
			
		||||
  callback-url-desc: "ユーザーが認証フォームで認証した際にリダイレクトするURLを設定できます。"
 | 
			
		||||
  authority: "権限"
 | 
			
		||||
  authority-desc: "ここで要求した機能だけがAPIからアクセスできます。"
 | 
			
		||||
  authority-warning: "アプリ作成後も変更できますが、新たな権限を付与する場合、その時点で関連付けられているユーザーキーはすべて無効になります。"
 | 
			
		||||
  account-read: "アカウントの情報を見る。"
 | 
			
		||||
  account-write: "アカウントの情報を操作する。"
 | 
			
		||||
  note-write: "投稿する。"
 | 
			
		||||
  reaction-write: "リアクションしたりリアクションをキャンセルする。"
 | 
			
		||||
  following-write: "フォローしたりフォロー解除する。"
 | 
			
		||||
  drive-read: "ドライブを見る。"
 | 
			
		||||
  drive-write: "ドライブを操作する。"
 | 
			
		||||
  notification-read: "通知を見る。"
 | 
			
		||||
  notification-write: "通知を操作する。"
 | 
			
		||||
 
 | 
			
		||||
@@ -25,6 +25,14 @@ common:
 | 
			
		||||
  application-authorization: "アプリの連携"
 | 
			
		||||
  close: "閉じる"
 | 
			
		||||
  do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
 | 
			
		||||
  BSoD:
 | 
			
		||||
    fatal-error: ":( 致命的な問題が発生しました。"
 | 
			
		||||
    update-browser-os: "お使いのブラウザ(またはOS)のバージョンを更新すると解決する可能性があります。"
 | 
			
		||||
    error-code: "エラーコード"
 | 
			
		||||
    browser-version: "ブラウザ バージョン"
 | 
			
		||||
    client-version: "クライアント バージョン"
 | 
			
		||||
    email-support: "問題が解決しない場合は、上記の情報をお書き添えの上 syuilotan@yahoo.co.jp までご連絡ください。"
 | 
			
		||||
    thanks: "Thank you for using Misskey."
 | 
			
		||||
  got-it: "わかった"
 | 
			
		||||
  customization-tips:
 | 
			
		||||
    title: "カスタマイズのヒント"
 | 
			
		||||
@@ -54,6 +62,7 @@ common:
 | 
			
		||||
    years_ago: "{}jaar geleden"
 | 
			
		||||
  month-and-day: "{month}月 {day}日"
 | 
			
		||||
  trash: "ゴミ箱"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  weekday-short:
 | 
			
		||||
    sunday: "Z"
 | 
			
		||||
    monday: "M"
 | 
			
		||||
@@ -115,6 +124,12 @@ common:
 | 
			
		||||
  reduce-motion: "UIの動きを減らす"
 | 
			
		||||
  this-setting-is-this-device-only: "このデバイスのみ"
 | 
			
		||||
  do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
 | 
			
		||||
  is-remote-user: "このユーザー情報はコピーです。"
 | 
			
		||||
  is-remote-post: "この投稿情報はコピーです。"
 | 
			
		||||
  view-on-remote: "正確な情報を見る"
 | 
			
		||||
  error:
 | 
			
		||||
    title: '問題が発生しました'
 | 
			
		||||
    retry: 'やり直す'
 | 
			
		||||
  reversi:
 | 
			
		||||
    drawn: "引き分け"
 | 
			
		||||
    my-turn: "あなたのターンです"
 | 
			
		||||
@@ -170,6 +185,7 @@ common:
 | 
			
		||||
    rename: "名前を変更"
 | 
			
		||||
    stack-left: "左に重ねる"
 | 
			
		||||
    pop-right: "右に出す"
 | 
			
		||||
  dev: "アプリの作成に失敗しました。再度お試しください。"
 | 
			
		||||
auth/views/form.vue:
 | 
			
		||||
  share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
 | 
			
		||||
  permission-ask: "このアプリは次の権限を要求しています:"
 | 
			
		||||
@@ -526,11 +542,14 @@ desktop/views/components/charts.vue:
 | 
			
		||||
  title: "チャート"
 | 
			
		||||
  per-day: "1日ごと"
 | 
			
		||||
  per-hour: "1時間ごと"
 | 
			
		||||
  federation: "フェデレーション"
 | 
			
		||||
  notes: "投稿"
 | 
			
		||||
  users: "ユーザー"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  network: "ネットワーク"
 | 
			
		||||
  charts:
 | 
			
		||||
    federation-instances: "インスタンスの増減"
 | 
			
		||||
    federation-instances-total: "インスタンスの積算"
 | 
			
		||||
    notes: "投稿の増減 (統合)"
 | 
			
		||||
    local-notes: "投稿の増減 (ローカル)"
 | 
			
		||||
    remote-notes: "投稿の増減 (リモート)"
 | 
			
		||||
@@ -560,7 +579,6 @@ desktop/views/components/crop-window.vue:
 | 
			
		||||
  ok: "Oké"
 | 
			
		||||
desktop/views/components/drive-window.vue:
 | 
			
		||||
  used: "gebruikt"
 | 
			
		||||
  drive: "Drive"
 | 
			
		||||
desktop/views/components/drive.file.vue:
 | 
			
		||||
  avatar: "Gebruikersafbeelding"
 | 
			
		||||
  banner: "Omslagfoto"
 | 
			
		||||
@@ -590,8 +608,6 @@ desktop/views/components/drive.folder.vue:
 | 
			
		||||
    rename: "Naam wijzigen"
 | 
			
		||||
    rename-folder: "Mapnaam wijzigen"
 | 
			
		||||
    input-new-folder-name: "Voer een nieuwe naam in"
 | 
			
		||||
desktop/views/components/drive.nav-folder.vue:
 | 
			
		||||
  drive: "Drive"
 | 
			
		||||
desktop/views/components/drive.vue:
 | 
			
		||||
  search: "Zoeken"
 | 
			
		||||
  load-more: "Meer laden"
 | 
			
		||||
@@ -725,8 +741,8 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  profile: "Profiel"
 | 
			
		||||
  notification: "Melding"
 | 
			
		||||
  apps: "Apps"
 | 
			
		||||
  mute: "Dempen"
 | 
			
		||||
  drive: "Drive"
 | 
			
		||||
  mute-and-block: "ミュート/ブロック"
 | 
			
		||||
  blocking: "ブロック"
 | 
			
		||||
  security: "Beveiliging"
 | 
			
		||||
  signin: "Inloggeschiedenis"
 | 
			
		||||
  password: "Wachtwoord"
 | 
			
		||||
@@ -832,20 +848,32 @@ desktop/views/components/settings.2fa.vue:
 | 
			
		||||
  success: "Instellen voltooid!"
 | 
			
		||||
  failed: "Instellen mislukt. Zorg ervoor dat de sleutel juist is."
 | 
			
		||||
  info: "Vanaf nu moet je ook de op je apparaat getoonde sleutel tonen bij het inloggen op Misskey."
 | 
			
		||||
desktop/views/components/settings.api.vue:
 | 
			
		||||
  intro: "Als je toegang wilt tot de API, stel deze sleutel dan in als 'i' bij de verzoekparameters."
 | 
			
		||||
  caution: "Laat deze sleutel niet zien aan derde partijen (en voer hem nergens anders in dan hier), anders kan je account gehackt worden."
 | 
			
		||||
  regeneration-of-token: "Mocht deze sleutel tóch uitlekken, dan kun je hem opnieuw genereren."
 | 
			
		||||
  regenerate-token: "Sleutel opnieuw genereren"
 | 
			
		||||
  token: "Sleutel:"
 | 
			
		||||
  enter-password: "Voer je wachtwoord in"
 | 
			
		||||
common/views/components/api-settings.vue:
 | 
			
		||||
  intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
 | 
			
		||||
  caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
 | 
			
		||||
  regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
 | 
			
		||||
  regenerate-token: "トークンを再生成"
 | 
			
		||||
  token: "Token:"
 | 
			
		||||
  enter-password: "パスワードを入力してください"
 | 
			
		||||
  console:
 | 
			
		||||
    title: 'APIコンソール'
 | 
			
		||||
    endpoint: 'エンドポイント'
 | 
			
		||||
    parameter: 'パラメータ'
 | 
			
		||||
    send: '送信'
 | 
			
		||||
    sending: '応答待ち'
 | 
			
		||||
    response: '結果'
 | 
			
		||||
desktop/views/components/settings.apps.vue:
 | 
			
		||||
  no-apps: "連携しているアプリケーションはありません"
 | 
			
		||||
desktop/views/components/settings.drive.vue:
 | 
			
		||||
  max: "中"
 | 
			
		||||
common/views/components/drive-settings.vue:
 | 
			
		||||
  max: "容量"
 | 
			
		||||
  in-use: "使用中"
 | 
			
		||||
desktop/views/components/settings.mute.vue:
 | 
			
		||||
  no-users: "Geen gedempte gebruikers"
 | 
			
		||||
  stats: "統計"
 | 
			
		||||
common/views/components/mute-and-block.vue:
 | 
			
		||||
  mute-and-block: "ミュートとブロック"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  no-muted-users: "ミュートしているユーザーはいません"
 | 
			
		||||
  no-blocked-users: "ブロックしているユーザーはいません"
 | 
			
		||||
desktop/views/components/settings.password.vue:
 | 
			
		||||
  reset: "Wachtwoord wijzigen"
 | 
			
		||||
  enter-current-password: "Voer je huidige wachtwoord in"
 | 
			
		||||
@@ -877,7 +905,6 @@ desktop/views/components/ui.header.vue:
 | 
			
		||||
  adjective: "さん"
 | 
			
		||||
desktop/views/components/ui.header.account.vue:
 | 
			
		||||
  profile: "Je profiel"
 | 
			
		||||
  drive: "Drive"
 | 
			
		||||
  favorites: "Favorieten"
 | 
			
		||||
  lists: "Lijsten"
 | 
			
		||||
  follow-requests: "フォロー申請"
 | 
			
		||||
@@ -921,9 +948,10 @@ desktop/views/components/window.vue:
 | 
			
		||||
  close: "Sluiten"
 | 
			
		||||
desktop/views/pages/admin/admin.vue:
 | 
			
		||||
  dashboard: "ダッシュボード"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  users: "ユーザー"
 | 
			
		||||
  update: "更新"
 | 
			
		||||
  announcements: "お知らせ"
 | 
			
		||||
  hashtags: "ハッシュタグ"
 | 
			
		||||
desktop/views/pages/admin/admin.dashboard.vue:
 | 
			
		||||
  dashboard: "ダッシュボード"
 | 
			
		||||
  all-users: "全てのユーザー"
 | 
			
		||||
@@ -931,6 +959,9 @@ desktop/views/pages/admin/admin.dashboard.vue:
 | 
			
		||||
  all-notes: "全ての投稿"
 | 
			
		||||
  original-notes: "このインスタンスの投稿"
 | 
			
		||||
  invite: "招待"
 | 
			
		||||
  banner-url: "Banner URL"
 | 
			
		||||
  disableRegistration: "Disable new user registration"
 | 
			
		||||
  disableLocalTimeline: "Disable the local timeline"
 | 
			
		||||
desktop/views/pages/admin/admin.suspend-user.vue:
 | 
			
		||||
  suspend-user: "ユーザーの凍結"
 | 
			
		||||
  suspend: "凍結"
 | 
			
		||||
@@ -947,12 +978,23 @@ desktop/views/pages/admin/admin.unverify-user.vue:
 | 
			
		||||
  unverify-user: "ユーザーの公式アカウント解除"
 | 
			
		||||
  unverify: "公式アカウントを解除する"
 | 
			
		||||
  unverified: "公式アカウントを解除しました"
 | 
			
		||||
desktop/views/pages/admin/admin.announcements.vue:
 | 
			
		||||
  announcements: "お知らせ"
 | 
			
		||||
desktop/views/pages/admin/admin.hashtags.vue:
 | 
			
		||||
  hided-tags: "Hidden Tags"
 | 
			
		||||
desktop/views/pages/deck/deck.tl-column.vue:
 | 
			
		||||
  is-media-only: "メディア投稿のみ"
 | 
			
		||||
  is-media-view: "メディアビュー"
 | 
			
		||||
  edit: "オプション"
 | 
			
		||||
desktop/views/pages/deck/deck.user-column.vue:
 | 
			
		||||
  posts: "投稿"
 | 
			
		||||
  following: "フォロー"
 | 
			
		||||
  followers: "フォロワー"
 | 
			
		||||
  images: "画像"
 | 
			
		||||
  activity: "アクティビティ"
 | 
			
		||||
  timeline: "タイムライン"
 | 
			
		||||
  pinned-notes: "ピン留めされた投稿"
 | 
			
		||||
  push-to-a-list: "リストに追加"
 | 
			
		||||
desktop/views/pages/stats/stats.vue:
 | 
			
		||||
  all-users: "全てのユーザー"
 | 
			
		||||
  original-users: "このインスタンスのユーザー"
 | 
			
		||||
@@ -1005,10 +1047,7 @@ desktop/views/pages/user/user.friends.vue:
 | 
			
		||||
  no-users: "Geen gebruikers"
 | 
			
		||||
desktop/views/pages/user/user.vue:
 | 
			
		||||
  is-suspended: "このユーザーは凍結されています。"
 | 
			
		||||
  is-remote: "このユーザーはリモートユーザーです。"
 | 
			
		||||
  view-remote: "正確な情報を見る"
 | 
			
		||||
desktop/views/pages/user/user.home.vue:
 | 
			
		||||
  last-used-at: "Laatst actief: "
 | 
			
		||||
  last-used-at: "最終アクセス"
 | 
			
		||||
desktop/views/pages/user/user.photos.vue:
 | 
			
		||||
  title: "Foto's"
 | 
			
		||||
  loading: "Bezig met laden"
 | 
			
		||||
@@ -1021,6 +1060,9 @@ desktop/views/pages/user/user.profile.vue:
 | 
			
		||||
  mute: "Dempen"
 | 
			
		||||
  muted: "Dempend"
 | 
			
		||||
  unmute: "Ontdempen"
 | 
			
		||||
  block: "ブロックする"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  block-confirm: "このユーザーをブロックしますか?"
 | 
			
		||||
  push-to-a-list: "リストに追加"
 | 
			
		||||
  list-pushed: "{user}を{list}に追加しました。"
 | 
			
		||||
desktop/views/pages/user/user.header.vue:
 | 
			
		||||
@@ -1028,6 +1070,10 @@ desktop/views/pages/user/user.header.vue:
 | 
			
		||||
  following: "フォロー"
 | 
			
		||||
  followers: "フォロワー"
 | 
			
		||||
  is-bot: "このアカウントはBotです"
 | 
			
		||||
  years-old: "歳"
 | 
			
		||||
  year: "年"
 | 
			
		||||
  month: "月"
 | 
			
		||||
  day: "日"
 | 
			
		||||
desktop/views/pages/user/user.timeline.vue:
 | 
			
		||||
  default: "Berichten"
 | 
			
		||||
  with-replies: "Berichten en antwoorden"
 | 
			
		||||
@@ -1057,7 +1103,6 @@ desktop/views/widgets/users.vue:
 | 
			
		||||
  refresh: "Anderen tonen"
 | 
			
		||||
  no-one: "Niemand"
 | 
			
		||||
mobile/views/components/drive.vue:
 | 
			
		||||
  drive: "Drive"
 | 
			
		||||
  used: "gebruikt"
 | 
			
		||||
  folder-count: "Map(pen)"
 | 
			
		||||
  count-separator: ", "
 | 
			
		||||
@@ -1161,7 +1206,6 @@ mobile/views/components/ui.nav.vue:
 | 
			
		||||
  messaging: "Gesprekken"
 | 
			
		||||
  follow-requests: "フォロー申請"
 | 
			
		||||
  search: "Zoeken"
 | 
			
		||||
  drive: "Drive"
 | 
			
		||||
  favorites: "お気に入り"
 | 
			
		||||
  user-lists: "リスト"
 | 
			
		||||
  widgets: "ウィジェット"
 | 
			
		||||
@@ -1184,7 +1228,6 @@ mobile/views/pages/user-lists.vue:
 | 
			
		||||
  title: "リスト"
 | 
			
		||||
  enter-list-name: "リスト名を入力してください"
 | 
			
		||||
mobile/views/pages/drive.vue:
 | 
			
		||||
  drive: "Drive"
 | 
			
		||||
  more: "もっと見る"
 | 
			
		||||
mobile/views/pages/signup.vue:
 | 
			
		||||
  lets-start: "📦 始めましょう"
 | 
			
		||||
@@ -1284,6 +1327,7 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  signout: "Uitloggen"
 | 
			
		||||
  sound: "サウンド"
 | 
			
		||||
  enable-sounds: "サウンドを有効にする"
 | 
			
		||||
  mark-as-read-all-unread-notes: "すべての投稿を既読にする"
 | 
			
		||||
mobile/views/pages/user.vue:
 | 
			
		||||
  follows-you: "Volgt jou"
 | 
			
		||||
  following: "Volgend"
 | 
			
		||||
@@ -1293,8 +1337,10 @@ mobile/views/pages/user.vue:
 | 
			
		||||
  timeline: "Tijdlijn"
 | 
			
		||||
  media: "Media"
 | 
			
		||||
  is-suspended: "Dit account is geschorst."
 | 
			
		||||
  is-remote: "Deze gebruiker is een externe gebruiker; de informatie is daarom niet volledig. "
 | 
			
		||||
  view-remote: "Volledige informatie bekijken"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
mobile/views/pages/user/home.vue:
 | 
			
		||||
  recent-notes: "Recente notities"
 | 
			
		||||
  images: "Afbeeldingen"
 | 
			
		||||
@@ -1303,7 +1349,7 @@ mobile/views/pages/user/home.vue:
 | 
			
		||||
  domains: "Domeinnamen"
 | 
			
		||||
  frequently-replied-users: "Frequent gesproken gebruikers"
 | 
			
		||||
  followers-you-know: "Volgers die je kent"
 | 
			
		||||
  last-used-at: "Laatst actief:"
 | 
			
		||||
  last-used-at: "Laatst actief"
 | 
			
		||||
mobile/views/pages/user/home.followers-you-know.vue:
 | 
			
		||||
  loading: "Bezig met laden"
 | 
			
		||||
  no-users: "Geen gebruikers"
 | 
			
		||||
@@ -1340,3 +1386,29 @@ docs:
 | 
			
		||||
      description: "Omschrijving"
 | 
			
		||||
dev/views/index.vue:
 | 
			
		||||
  manage-apps: "アプリの管理"
 | 
			
		||||
dev/views/apps.vue:
 | 
			
		||||
  manage-apps: "アプリを管理"
 | 
			
		||||
  create-app: "アプリ作成"
 | 
			
		||||
  app-missing: "アプリなし"
 | 
			
		||||
dev/views/new-app.vue:
 | 
			
		||||
  create-app: "アプリケーションの作成"
 | 
			
		||||
  app-name: "アプリケーション名"
 | 
			
		||||
  app-name-desc: "あなたのアプリの名称。"
 | 
			
		||||
  app-name-ex: "ex) Misskey for iOS"
 | 
			
		||||
  app-overview: "アプリの概要"
 | 
			
		||||
  app-desc: "あなたのアプリの簡単な説明や紹介。"
 | 
			
		||||
  app-desc-ex: "ex) Misskey iOSクライアント。"
 | 
			
		||||
  callback-url: "コールバックURL (オプション)"
 | 
			
		||||
  callback-url-desc: "ユーザーが認証フォームで認証した際にリダイレクトするURLを設定できます。"
 | 
			
		||||
  authority: "権限"
 | 
			
		||||
  authority-desc: "ここで要求した機能だけがAPIからアクセスできます。"
 | 
			
		||||
  authority-warning: "アプリ作成後も変更できますが、新たな権限を付与する場合、その時点で関連付けられているユーザーキーはすべて無効になります。"
 | 
			
		||||
  account-read: "アカウントの情報を見る。"
 | 
			
		||||
  account-write: "アカウントの情報を操作する。"
 | 
			
		||||
  note-write: "投稿する。"
 | 
			
		||||
  reaction-write: "リアクションしたりリアクションをキャンセルする。"
 | 
			
		||||
  following-write: "フォローしたりフォロー解除する。"
 | 
			
		||||
  drive-read: "ドライブを見る。"
 | 
			
		||||
  drive-write: "ドライブを操作する。"
 | 
			
		||||
  notification-read: "通知を見る。"
 | 
			
		||||
  notification-write: "通知を操作する。"
 | 
			
		||||
 
 | 
			
		||||
@@ -25,6 +25,14 @@ common:
 | 
			
		||||
  application-authorization: "アプリの連携"
 | 
			
		||||
  close: "Lukk"
 | 
			
		||||
  do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
 | 
			
		||||
  BSoD:
 | 
			
		||||
    fatal-error: ":( 致命的な問題が発生しました。"
 | 
			
		||||
    update-browser-os: "お使いのブラウザ(またはOS)のバージョンを更新すると解決する可能性があります。"
 | 
			
		||||
    error-code: "エラーコード"
 | 
			
		||||
    browser-version: "ブラウザ バージョン"
 | 
			
		||||
    client-version: "クライアント バージョン"
 | 
			
		||||
    email-support: "問題が解決しない場合は、上記の情報をお書き添えの上 syuilotan@yahoo.co.jp までご連絡ください。"
 | 
			
		||||
    thanks: "Thank you for using Misskey."
 | 
			
		||||
  got-it: "Skjønner!"
 | 
			
		||||
  customization-tips:
 | 
			
		||||
    title: "カスタマイズのヒント"
 | 
			
		||||
@@ -54,6 +62,7 @@ common:
 | 
			
		||||
    years_ago: "{} år siden"
 | 
			
		||||
  month-and-day: "{day}/{month}"
 | 
			
		||||
  trash: "Papirkurv"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  weekday-short:
 | 
			
		||||
    sunday: "S"
 | 
			
		||||
    monday: "M"
 | 
			
		||||
@@ -115,6 +124,12 @@ common:
 | 
			
		||||
  reduce-motion: "UIの動きを減らす"
 | 
			
		||||
  this-setting-is-this-device-only: "このデバイスのみ"
 | 
			
		||||
  do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
 | 
			
		||||
  is-remote-user: "このユーザー情報はコピーです。"
 | 
			
		||||
  is-remote-post: "この投稿情報はコピーです。"
 | 
			
		||||
  view-on-remote: "正確な情報を見る"
 | 
			
		||||
  error:
 | 
			
		||||
    title: '問題が発生しました'
 | 
			
		||||
    retry: 'やり直す'
 | 
			
		||||
  reversi:
 | 
			
		||||
    drawn: "引き分け"
 | 
			
		||||
    my-turn: "あなたのターンです"
 | 
			
		||||
@@ -170,6 +185,7 @@ common:
 | 
			
		||||
    rename: "Endre navn"
 | 
			
		||||
    stack-left: "左に重ねる"
 | 
			
		||||
    pop-right: "Til høyre"
 | 
			
		||||
  dev: "アプリの作成に失敗しました。再度お試しください。"
 | 
			
		||||
auth/views/form.vue:
 | 
			
		||||
  share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
 | 
			
		||||
  permission-ask: "このアプリは次の権限を要求しています:"
 | 
			
		||||
@@ -526,11 +542,14 @@ desktop/views/components/charts.vue:
 | 
			
		||||
  title: "Diagrammer"
 | 
			
		||||
  per-day: "per dag"
 | 
			
		||||
  per-hour: "1時間ごと"
 | 
			
		||||
  federation: "フェデレーション"
 | 
			
		||||
  notes: "Innlegg"
 | 
			
		||||
  users: "Brukere"
 | 
			
		||||
  drive: "Disk"
 | 
			
		||||
  network: "ネットワーク"
 | 
			
		||||
  charts:
 | 
			
		||||
    federation-instances: "インスタンスの増減"
 | 
			
		||||
    federation-instances-total: "インスタンスの積算"
 | 
			
		||||
    notes: "投稿の増減 (統合)"
 | 
			
		||||
    local-notes: "投稿の増減 (ローカル)"
 | 
			
		||||
    remote-notes: "投稿の増減 (リモート)"
 | 
			
		||||
@@ -560,7 +579,6 @@ desktop/views/components/crop-window.vue:
 | 
			
		||||
  ok: "Ok"
 | 
			
		||||
desktop/views/components/drive-window.vue:
 | 
			
		||||
  used: "brukt"
 | 
			
		||||
  drive: "Disk"
 | 
			
		||||
desktop/views/components/drive.file.vue:
 | 
			
		||||
  avatar: "Avatar"
 | 
			
		||||
  banner: "Banner"
 | 
			
		||||
@@ -590,8 +608,6 @@ desktop/views/components/drive.folder.vue:
 | 
			
		||||
    rename: "Endre navn"
 | 
			
		||||
    rename-folder: "フォルダ名の変更"
 | 
			
		||||
    input-new-folder-name: "新しいフォルダ名を入力してください"
 | 
			
		||||
desktop/views/components/drive.nav-folder.vue:
 | 
			
		||||
  drive: "Disk"
 | 
			
		||||
desktop/views/components/drive.vue:
 | 
			
		||||
  search: "Søk"
 | 
			
		||||
  load-more: "もっと読み込む"
 | 
			
		||||
@@ -725,8 +741,8 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  profile: "プロフィール"
 | 
			
		||||
  notification: "Notifikasjon"
 | 
			
		||||
  apps: "Apper"
 | 
			
		||||
  mute: "Demp"
 | 
			
		||||
  drive: "Disk"
 | 
			
		||||
  mute-and-block: "ミュート/ブロック"
 | 
			
		||||
  blocking: "ブロック"
 | 
			
		||||
  security: "セキュリティ"
 | 
			
		||||
  signin: "サインイン履歴"
 | 
			
		||||
  password: "Passord"
 | 
			
		||||
@@ -832,20 +848,32 @@ desktop/views/components/settings.2fa.vue:
 | 
			
		||||
  success: "設定が完了しました!"
 | 
			
		||||
  failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
 | 
			
		||||
  info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
 | 
			
		||||
desktop/views/components/settings.api.vue:
 | 
			
		||||
common/views/components/api-settings.vue:
 | 
			
		||||
  intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
 | 
			
		||||
  caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
 | 
			
		||||
  regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
 | 
			
		||||
  regenerate-token: "トークンを再生成"
 | 
			
		||||
  token: "Token:"
 | 
			
		||||
  enter-password: "パスワードを入力してください"
 | 
			
		||||
  console:
 | 
			
		||||
    title: 'APIコンソール'
 | 
			
		||||
    endpoint: 'エンドポイント'
 | 
			
		||||
    parameter: 'パラメータ'
 | 
			
		||||
    send: '送信'
 | 
			
		||||
    sending: '応答待ち'
 | 
			
		||||
    response: '結果'
 | 
			
		||||
desktop/views/components/settings.apps.vue:
 | 
			
		||||
  no-apps: "連携しているアプリケーションはありません"
 | 
			
		||||
desktop/views/components/settings.drive.vue:
 | 
			
		||||
  max: "Maks"
 | 
			
		||||
  in-use: "I bruk"
 | 
			
		||||
desktop/views/components/settings.mute.vue:
 | 
			
		||||
  no-users: "ミュートしているユーザーはいません"
 | 
			
		||||
common/views/components/drive-settings.vue:
 | 
			
		||||
  max: "容量"
 | 
			
		||||
  in-use: "使用中"
 | 
			
		||||
  stats: "統計"
 | 
			
		||||
common/views/components/mute-and-block.vue:
 | 
			
		||||
  mute-and-block: "ミュートとブロック"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  no-muted-users: "ミュートしているユーザーはいません"
 | 
			
		||||
  no-blocked-users: "ブロックしているユーザーはいません"
 | 
			
		||||
desktop/views/components/settings.password.vue:
 | 
			
		||||
  reset: "パスワードを変更する"
 | 
			
		||||
  enter-current-password: "現在のパスワードを入力してください"
 | 
			
		||||
@@ -877,7 +905,6 @@ desktop/views/components/ui.header.vue:
 | 
			
		||||
  adjective: "-san"
 | 
			
		||||
desktop/views/components/ui.header.account.vue:
 | 
			
		||||
  profile: "プロフィール"
 | 
			
		||||
  drive: "Disk"
 | 
			
		||||
  favorites: "Favoritter"
 | 
			
		||||
  lists: "Lister"
 | 
			
		||||
  follow-requests: "フォロー申請"
 | 
			
		||||
@@ -921,9 +948,10 @@ desktop/views/components/window.vue:
 | 
			
		||||
  close: "Lukk"
 | 
			
		||||
desktop/views/pages/admin/admin.vue:
 | 
			
		||||
  dashboard: "ダッシュボード"
 | 
			
		||||
  drive: "Disk"
 | 
			
		||||
  users: "Brukere"
 | 
			
		||||
  update: "Oppdater"
 | 
			
		||||
  announcements: "お知らせ"
 | 
			
		||||
  hashtags: "ハッシュタグ"
 | 
			
		||||
desktop/views/pages/admin/admin.dashboard.vue:
 | 
			
		||||
  dashboard: "ダッシュボード"
 | 
			
		||||
  all-users: "全てのユーザー"
 | 
			
		||||
@@ -931,6 +959,9 @@ desktop/views/pages/admin/admin.dashboard.vue:
 | 
			
		||||
  all-notes: "全ての投稿"
 | 
			
		||||
  original-notes: "このインスタンスの投稿"
 | 
			
		||||
  invite: "Inviter"
 | 
			
		||||
  banner-url: "Banner URL"
 | 
			
		||||
  disableRegistration: "Disable new user registration"
 | 
			
		||||
  disableLocalTimeline: "Disable the local timeline"
 | 
			
		||||
desktop/views/pages/admin/admin.suspend-user.vue:
 | 
			
		||||
  suspend-user: "ユーザーの凍結"
 | 
			
		||||
  suspend: "Suspender"
 | 
			
		||||
@@ -947,12 +978,23 @@ desktop/views/pages/admin/admin.unverify-user.vue:
 | 
			
		||||
  unverify-user: "ユーザーの公式アカウント解除"
 | 
			
		||||
  unverify: "公式アカウントを解除する"
 | 
			
		||||
  unverified: "公式アカウントを解除しました"
 | 
			
		||||
desktop/views/pages/admin/admin.announcements.vue:
 | 
			
		||||
  announcements: "お知らせ"
 | 
			
		||||
desktop/views/pages/admin/admin.hashtags.vue:
 | 
			
		||||
  hided-tags: "Hidden Tags"
 | 
			
		||||
desktop/views/pages/deck/deck.tl-column.vue:
 | 
			
		||||
  is-media-only: "メディア投稿のみ"
 | 
			
		||||
  is-media-view: "メディアビュー"
 | 
			
		||||
  edit: "オプション"
 | 
			
		||||
desktop/views/pages/deck/deck.user-column.vue:
 | 
			
		||||
  posts: "投稿"
 | 
			
		||||
  following: "フォロー"
 | 
			
		||||
  followers: "フォロワー"
 | 
			
		||||
  images: "画像"
 | 
			
		||||
  activity: "アクティビティ"
 | 
			
		||||
  timeline: "タイムライン"
 | 
			
		||||
  pinned-notes: "ピン留めされた投稿"
 | 
			
		||||
  push-to-a-list: "リストに追加"
 | 
			
		||||
desktop/views/pages/stats/stats.vue:
 | 
			
		||||
  all-users: "全てのユーザー"
 | 
			
		||||
  original-users: "このインスタンスのユーザー"
 | 
			
		||||
@@ -1005,9 +1047,6 @@ desktop/views/pages/user/user.friends.vue:
 | 
			
		||||
  no-users: "よく話すユーザーはいません"
 | 
			
		||||
desktop/views/pages/user/user.vue:
 | 
			
		||||
  is-suspended: "このユーザーは凍結されています。"
 | 
			
		||||
  is-remote: "このユーザーはリモートユーザーです。"
 | 
			
		||||
  view-remote: "正確な情報を見る"
 | 
			
		||||
desktop/views/pages/user/user.home.vue:
 | 
			
		||||
  last-used-at: "最終アクセス"
 | 
			
		||||
desktop/views/pages/user/user.photos.vue:
 | 
			
		||||
  title: "Bilder"
 | 
			
		||||
@@ -1021,6 +1060,9 @@ desktop/views/pages/user/user.profile.vue:
 | 
			
		||||
  mute: "ミュートする"
 | 
			
		||||
  muted: "ミュートしています"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロックする"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  block-confirm: "このユーザーをブロックしますか?"
 | 
			
		||||
  push-to-a-list: "リストに追加"
 | 
			
		||||
  list-pushed: "{user}を{list}に追加しました。"
 | 
			
		||||
desktop/views/pages/user/user.header.vue:
 | 
			
		||||
@@ -1028,6 +1070,10 @@ desktop/views/pages/user/user.header.vue:
 | 
			
		||||
  following: "Følger"
 | 
			
		||||
  followers: "フォロワー"
 | 
			
		||||
  is-bot: "このアカウントはBotです"
 | 
			
		||||
  years-old: "歳"
 | 
			
		||||
  year: "年"
 | 
			
		||||
  month: "月"
 | 
			
		||||
  day: "日"
 | 
			
		||||
desktop/views/pages/user/user.timeline.vue:
 | 
			
		||||
  default: "Innlegg"
 | 
			
		||||
  with-replies: "Innlegg og svar"
 | 
			
		||||
@@ -1057,7 +1103,6 @@ desktop/views/widgets/users.vue:
 | 
			
		||||
  refresh: "Oppdater"
 | 
			
		||||
  no-one: "Ingen"
 | 
			
		||||
mobile/views/components/drive.vue:
 | 
			
		||||
  drive: "Disk"
 | 
			
		||||
  used: "brukt"
 | 
			
		||||
  folder-count: "Mappe(r)"
 | 
			
		||||
  count-separator: ","
 | 
			
		||||
@@ -1161,7 +1206,6 @@ mobile/views/components/ui.nav.vue:
 | 
			
		||||
  messaging: "Meldinger"
 | 
			
		||||
  follow-requests: "フォロー申請"
 | 
			
		||||
  search: "Søk"
 | 
			
		||||
  drive: "Disk"
 | 
			
		||||
  favorites: "Favoritter"
 | 
			
		||||
  user-lists: "Lister"
 | 
			
		||||
  widgets: "ウィジェット"
 | 
			
		||||
@@ -1184,7 +1228,6 @@ mobile/views/pages/user-lists.vue:
 | 
			
		||||
  title: "Lister"
 | 
			
		||||
  enter-list-name: "リスト名を入力してください"
 | 
			
		||||
mobile/views/pages/drive.vue:
 | 
			
		||||
  drive: "Disk"
 | 
			
		||||
  more: "Vis mer"
 | 
			
		||||
mobile/views/pages/signup.vue:
 | 
			
		||||
  lets-start: "📦 始めましょう"
 | 
			
		||||
@@ -1284,6 +1327,7 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  signout: "サインアウト"
 | 
			
		||||
  sound: "Lyder"
 | 
			
		||||
  enable-sounds: "サウンドを有効にする"
 | 
			
		||||
  mark-as-read-all-unread-notes: "すべての投稿を既読にする"
 | 
			
		||||
mobile/views/pages/user.vue:
 | 
			
		||||
  follows-you: "フォローされています"
 | 
			
		||||
  following: "Følger"
 | 
			
		||||
@@ -1293,8 +1337,10 @@ mobile/views/pages/user.vue:
 | 
			
		||||
  timeline: "タイムライン"
 | 
			
		||||
  media: "Media"
 | 
			
		||||
  is-suspended: "このユーザーは凍結されています。"
 | 
			
		||||
  is-remote: "このユーザーはリモートユーザーです。"
 | 
			
		||||
  view-remote: "正確な情報を見る"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
mobile/views/pages/user/home.vue:
 | 
			
		||||
  recent-notes: "Nylige innlegg"
 | 
			
		||||
  images: "Bilder"
 | 
			
		||||
@@ -1340,3 +1386,29 @@ docs:
 | 
			
		||||
      description: "Beskrivelse"
 | 
			
		||||
dev/views/index.vue:
 | 
			
		||||
  manage-apps: "アプリの管理"
 | 
			
		||||
dev/views/apps.vue:
 | 
			
		||||
  manage-apps: "アプリを管理"
 | 
			
		||||
  create-app: "アプリ作成"
 | 
			
		||||
  app-missing: "アプリなし"
 | 
			
		||||
dev/views/new-app.vue:
 | 
			
		||||
  create-app: "アプリケーションの作成"
 | 
			
		||||
  app-name: "アプリケーション名"
 | 
			
		||||
  app-name-desc: "あなたのアプリの名称。"
 | 
			
		||||
  app-name-ex: "ex) Misskey for iOS"
 | 
			
		||||
  app-overview: "アプリの概要"
 | 
			
		||||
  app-desc: "あなたのアプリの簡単な説明や紹介。"
 | 
			
		||||
  app-desc-ex: "ex) Misskey iOSクライアント。"
 | 
			
		||||
  callback-url: "コールバックURL (オプション)"
 | 
			
		||||
  callback-url-desc: "ユーザーが認証フォームで認証した際にリダイレクトするURLを設定できます。"
 | 
			
		||||
  authority: "権限"
 | 
			
		||||
  authority-desc: "ここで要求した機能だけがAPIからアクセスできます。"
 | 
			
		||||
  authority-warning: "アプリ作成後も変更できますが、新たな権限を付与する場合、その時点で関連付けられているユーザーキーはすべて無効になります。"
 | 
			
		||||
  account-read: "アカウントの情報を見る。"
 | 
			
		||||
  account-write: "アカウントの情報を操作する。"
 | 
			
		||||
  note-write: "投稿する。"
 | 
			
		||||
  reaction-write: "リアクションしたりリアクションをキャンセルする。"
 | 
			
		||||
  following-write: "フォローしたりフォロー解除する。"
 | 
			
		||||
  drive-read: "ドライブを見る。"
 | 
			
		||||
  drive-write: "ドライブを操作する。"
 | 
			
		||||
  notification-read: "通知を見る。"
 | 
			
		||||
  notification-write: "通知を操作する。"
 | 
			
		||||
 
 | 
			
		||||
@@ -25,6 +25,14 @@ common:
 | 
			
		||||
  application-authorization: "アプリの連携"
 | 
			
		||||
  close: "Zamknij"
 | 
			
		||||
  do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
 | 
			
		||||
  BSoD:
 | 
			
		||||
    fatal-error: ":( 致命的な問題が発生しました。"
 | 
			
		||||
    update-browser-os: "お使いのブラウザ(またはOS)のバージョンを更新すると解決する可能性があります。"
 | 
			
		||||
    error-code: "エラーコード"
 | 
			
		||||
    browser-version: "ブラウザ バージョン"
 | 
			
		||||
    client-version: "クライアント バージョン"
 | 
			
		||||
    email-support: "問題が解決しない場合は、上記の情報をお書き添えの上 syuilotan@yahoo.co.jp までご連絡ください。"
 | 
			
		||||
    thanks: "Thank you for using Misskey."
 | 
			
		||||
  got-it: "Rozumiem!"
 | 
			
		||||
  customization-tips:
 | 
			
		||||
    title: "Wskazówki o dostosowywaniu"
 | 
			
		||||
@@ -54,6 +62,7 @@ common:
 | 
			
		||||
    years_ago: "{} lat temu"
 | 
			
		||||
  month-and-day: "{month}-{day}"
 | 
			
		||||
  trash: "Kosz"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  weekday-short:
 | 
			
		||||
    sunday: "N"
 | 
			
		||||
    monday: "Pn"
 | 
			
		||||
@@ -115,6 +124,12 @@ common:
 | 
			
		||||
  reduce-motion: "UIの動きを減らす"
 | 
			
		||||
  this-setting-is-this-device-only: "このデバイスのみ"
 | 
			
		||||
  do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
 | 
			
		||||
  is-remote-user: "このユーザー情報はコピーです。"
 | 
			
		||||
  is-remote-post: "この投稿情報はコピーです。"
 | 
			
		||||
  view-on-remote: "正確な情報を見る"
 | 
			
		||||
  error:
 | 
			
		||||
    title: '問題が発生しました'
 | 
			
		||||
    retry: 'やり直す'
 | 
			
		||||
  reversi:
 | 
			
		||||
    drawn: "Remis"
 | 
			
		||||
    my-turn: "Twoja kolej"
 | 
			
		||||
@@ -170,6 +185,7 @@ common:
 | 
			
		||||
    rename: "Zmień nazwę"
 | 
			
		||||
    stack-left: "Przypnij do lewej"
 | 
			
		||||
    pop-right: "Odepnij w prawo"
 | 
			
		||||
  dev: "アプリの作成に失敗しました。再度お試しください。"
 | 
			
		||||
auth/views/form.vue:
 | 
			
		||||
  share-access: "Czy chcesz <b>zezwolić</b> <i>{{ app.name }}</i> na dostęp do Twojego konta?"
 | 
			
		||||
  permission-ask: "Ta aplikacja wymaga następujących uprawnień:"
 | 
			
		||||
@@ -526,11 +542,14 @@ desktop/views/components/charts.vue:
 | 
			
		||||
  title: "チャート"
 | 
			
		||||
  per-day: "1日ごと"
 | 
			
		||||
  per-hour: "1時間ごと"
 | 
			
		||||
  federation: "フェデレーション"
 | 
			
		||||
  notes: "投稿"
 | 
			
		||||
  users: "ユーザー"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  network: "ネットワーク"
 | 
			
		||||
  charts:
 | 
			
		||||
    federation-instances: "インスタンスの増減"
 | 
			
		||||
    federation-instances-total: "インスタンスの積算"
 | 
			
		||||
    notes: "投稿の増減 (統合)"
 | 
			
		||||
    local-notes: "投稿の増減 (ローカル)"
 | 
			
		||||
    remote-notes: "投稿の増減 (リモート)"
 | 
			
		||||
@@ -560,7 +579,6 @@ desktop/views/components/crop-window.vue:
 | 
			
		||||
  ok: "OK"
 | 
			
		||||
desktop/views/components/drive-window.vue:
 | 
			
		||||
  used: "wykorzystane"
 | 
			
		||||
  drive: "Dysk"
 | 
			
		||||
desktop/views/components/drive.file.vue:
 | 
			
		||||
  avatar: "Awatar"
 | 
			
		||||
  banner: "Baner"
 | 
			
		||||
@@ -590,8 +608,6 @@ desktop/views/components/drive.folder.vue:
 | 
			
		||||
    rename: "Zmień nazwę"
 | 
			
		||||
    rename-folder: "Zmień nazwę katalogu"
 | 
			
		||||
    input-new-folder-name: "Wprowadź nową nazwę"
 | 
			
		||||
desktop/views/components/drive.nav-folder.vue:
 | 
			
		||||
  drive: "Dysk"
 | 
			
		||||
desktop/views/components/drive.vue:
 | 
			
		||||
  search: "Szukaj"
 | 
			
		||||
  load-more: "Załaduj więcej"
 | 
			
		||||
@@ -725,8 +741,8 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  profile: "Profil"
 | 
			
		||||
  notification: "Powiadomienia"
 | 
			
		||||
  apps: "Aplikacje"
 | 
			
		||||
  mute: "Wyciszanie"
 | 
			
		||||
  drive: "Dysk"
 | 
			
		||||
  mute-and-block: "ミュート/ブロック"
 | 
			
		||||
  blocking: "ブロック"
 | 
			
		||||
  security: "Bezpieczeństwo"
 | 
			
		||||
  signin: "Historia logowań"
 | 
			
		||||
  password: "Hasło"
 | 
			
		||||
@@ -832,20 +848,32 @@ desktop/views/components/settings.2fa.vue:
 | 
			
		||||
  success: "Pomyślnie ukończono konfigurację!"
 | 
			
		||||
  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."
 | 
			
		||||
desktop/views/components/settings.api.vue:
 | 
			
		||||
  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"
 | 
			
		||||
common/views/components/api-settings.vue:
 | 
			
		||||
  intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
 | 
			
		||||
  caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
 | 
			
		||||
  regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
 | 
			
		||||
  regenerate-token: "トークンを再生成"
 | 
			
		||||
  token: "Token:"
 | 
			
		||||
  enter-password: "Wprowadź hasło"
 | 
			
		||||
  enter-password: "パスワードを入力してください"
 | 
			
		||||
  console:
 | 
			
		||||
    title: 'APIコンソール'
 | 
			
		||||
    endpoint: 'エンドポイント'
 | 
			
		||||
    parameter: 'パラメータ'
 | 
			
		||||
    send: '送信'
 | 
			
		||||
    sending: '応答待ち'
 | 
			
		||||
    response: '結果'
 | 
			
		||||
desktop/views/components/settings.apps.vue:
 | 
			
		||||
  no-apps: "Brak zautoryzowanych aplikacji"
 | 
			
		||||
desktop/views/components/settings.drive.vue:
 | 
			
		||||
  max: "Maksymalnie"
 | 
			
		||||
  in-use: " w użyciu."
 | 
			
		||||
desktop/views/components/settings.mute.vue:
 | 
			
		||||
  no-users: "Brak wyciszonych użytkowników"
 | 
			
		||||
common/views/components/drive-settings.vue:
 | 
			
		||||
  max: "容量"
 | 
			
		||||
  in-use: "使用中"
 | 
			
		||||
  stats: "統計"
 | 
			
		||||
common/views/components/mute-and-block.vue:
 | 
			
		||||
  mute-and-block: "ミュートとブロック"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  no-muted-users: "ミュートしているユーザーはいません"
 | 
			
		||||
  no-blocked-users: "ブロックしているユーザーはいません"
 | 
			
		||||
desktop/views/components/settings.password.vue:
 | 
			
		||||
  reset: "Zmień hasło"
 | 
			
		||||
  enter-current-password: "Wprowadź obecne hasło"
 | 
			
		||||
@@ -877,7 +905,6 @@ desktop/views/components/ui.header.vue:
 | 
			
		||||
  adjective: "さん"
 | 
			
		||||
desktop/views/components/ui.header.account.vue:
 | 
			
		||||
  profile: "Twój profil"
 | 
			
		||||
  drive: "Dysk"
 | 
			
		||||
  favorites: "Ulubione"
 | 
			
		||||
  lists: "Listy"
 | 
			
		||||
  follow-requests: "Prośby o śledzenie"
 | 
			
		||||
@@ -921,9 +948,10 @@ desktop/views/components/window.vue:
 | 
			
		||||
  close: "Zamknij"
 | 
			
		||||
desktop/views/pages/admin/admin.vue:
 | 
			
		||||
  dashboard: "ダッシュボード"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  users: "ユーザー"
 | 
			
		||||
  update: "更新"
 | 
			
		||||
  announcements: "お知らせ"
 | 
			
		||||
  hashtags: "ハッシュタグ"
 | 
			
		||||
desktop/views/pages/admin/admin.dashboard.vue:
 | 
			
		||||
  dashboard: "ダッシュボード"
 | 
			
		||||
  all-users: "全てのユーザー"
 | 
			
		||||
@@ -931,6 +959,9 @@ desktop/views/pages/admin/admin.dashboard.vue:
 | 
			
		||||
  all-notes: "全ての投稿"
 | 
			
		||||
  original-notes: "このインスタンスの投稿"
 | 
			
		||||
  invite: "招待"
 | 
			
		||||
  banner-url: "Banner URL"
 | 
			
		||||
  disableRegistration: "Disable new user registration"
 | 
			
		||||
  disableLocalTimeline: "Disable the local timeline"
 | 
			
		||||
desktop/views/pages/admin/admin.suspend-user.vue:
 | 
			
		||||
  suspend-user: "ユーザーの凍結"
 | 
			
		||||
  suspend: "凍結"
 | 
			
		||||
@@ -947,12 +978,23 @@ desktop/views/pages/admin/admin.unverify-user.vue:
 | 
			
		||||
  unverify-user: "ユーザーの公式アカウント解除"
 | 
			
		||||
  unverify: "公式アカウントを解除する"
 | 
			
		||||
  unverified: "公式アカウントを解除しました"
 | 
			
		||||
desktop/views/pages/admin/admin.announcements.vue:
 | 
			
		||||
  announcements: "お知らせ"
 | 
			
		||||
desktop/views/pages/admin/admin.hashtags.vue:
 | 
			
		||||
  hided-tags: "Hidden Tags"
 | 
			
		||||
desktop/views/pages/deck/deck.tl-column.vue:
 | 
			
		||||
  is-media-only: "Tylko wpisy z zawartością multimedialną"
 | 
			
		||||
  is-media-view: "Widok multimediów"
 | 
			
		||||
  edit: "Opcje"
 | 
			
		||||
desktop/views/pages/deck/deck.user-column.vue:
 | 
			
		||||
  posts: "投稿"
 | 
			
		||||
  following: "フォロー"
 | 
			
		||||
  followers: "フォロワー"
 | 
			
		||||
  images: "画像"
 | 
			
		||||
  activity: "アクティビティ"
 | 
			
		||||
  timeline: "タイムライン"
 | 
			
		||||
  pinned-notes: "ピン留めされた投稿"
 | 
			
		||||
  push-to-a-list: "リストに追加"
 | 
			
		||||
desktop/views/pages/stats/stats.vue:
 | 
			
		||||
  all-users: "全てのユーザー"
 | 
			
		||||
  original-users: "このインスタンスのユーザー"
 | 
			
		||||
@@ -1005,10 +1047,7 @@ desktop/views/pages/user/user.friends.vue:
 | 
			
		||||
  no-users: "Brak użytkowników"
 | 
			
		||||
desktop/views/pages/user/user.vue:
 | 
			
		||||
  is-suspended: "To konto zostało zawieszone."
 | 
			
		||||
  is-remote: "To jest użytkownik zdalnej instancji, informacje mogą nie być w pełni dokładne."
 | 
			
		||||
  view-remote: "Wyświetl dokładne informacje"
 | 
			
		||||
desktop/views/pages/user/user.home.vue:
 | 
			
		||||
  last-used-at: "Ostatnio aktywny: "
 | 
			
		||||
  last-used-at: "最終アクセス"
 | 
			
		||||
desktop/views/pages/user/user.photos.vue:
 | 
			
		||||
  title: "Zdjęcia"
 | 
			
		||||
  loading: "Ładowanie"
 | 
			
		||||
@@ -1021,6 +1060,9 @@ desktop/views/pages/user/user.profile.vue:
 | 
			
		||||
  mute: "Wycisz"
 | 
			
		||||
  muted: "Wyciszyłeś"
 | 
			
		||||
  unmute: "Cofnij wyciszenie"
 | 
			
		||||
  block: "ブロックする"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  block-confirm: "このユーザーをブロックしますか?"
 | 
			
		||||
  push-to-a-list: "Dodaj do listy"
 | 
			
		||||
  list-pushed: "Dodałeś(-aś) {user} do {list}."
 | 
			
		||||
desktop/views/pages/user/user.header.vue:
 | 
			
		||||
@@ -1028,6 +1070,10 @@ desktop/views/pages/user/user.header.vue:
 | 
			
		||||
  following: "Śledzeni"
 | 
			
		||||
  followers: "Śledzący"
 | 
			
		||||
  is-bot: "To konto jest botem"
 | 
			
		||||
  years-old: "歳"
 | 
			
		||||
  year: "年"
 | 
			
		||||
  month: "月"
 | 
			
		||||
  day: "日"
 | 
			
		||||
desktop/views/pages/user/user.timeline.vue:
 | 
			
		||||
  default: "Wpisy"
 | 
			
		||||
  with-replies: "Wpisy i odpowiedzi"
 | 
			
		||||
@@ -1057,7 +1103,6 @@ desktop/views/widgets/users.vue:
 | 
			
		||||
  refresh: "Pokaż innych"
 | 
			
		||||
  no-one: "Pusto"
 | 
			
		||||
mobile/views/components/drive.vue:
 | 
			
		||||
  drive: "Dysk"
 | 
			
		||||
  used: "użyto"
 | 
			
		||||
  folder-count: "Katalog(i)"
 | 
			
		||||
  count-separator: ", "
 | 
			
		||||
@@ -1161,7 +1206,6 @@ mobile/views/components/ui.nav.vue:
 | 
			
		||||
  messaging: "Wiadomości"
 | 
			
		||||
  follow-requests: "Prośby o śledzenie"
 | 
			
		||||
  search: "Szukaj"
 | 
			
		||||
  drive: "Dysk"
 | 
			
		||||
  favorites: "Ulubione"
 | 
			
		||||
  user-lists: "Listy"
 | 
			
		||||
  widgets: "Widżety"
 | 
			
		||||
@@ -1184,7 +1228,6 @@ mobile/views/pages/user-lists.vue:
 | 
			
		||||
  title: "Listy"
 | 
			
		||||
  enter-list-name: "Wprowadź nazwę listy"
 | 
			
		||||
mobile/views/pages/drive.vue:
 | 
			
		||||
  drive: "Dysk"
 | 
			
		||||
  more: "Załaduj więcej"
 | 
			
		||||
mobile/views/pages/signup.vue:
 | 
			
		||||
  lets-start: "Rozpocznijmy! 📦"
 | 
			
		||||
@@ -1284,6 +1327,7 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  signout: "Wyloguj"
 | 
			
		||||
  sound: "サウンド"
 | 
			
		||||
  enable-sounds: "サウンドを有効にする"
 | 
			
		||||
  mark-as-read-all-unread-notes: "すべての投稿を既読にする"
 | 
			
		||||
mobile/views/pages/user.vue:
 | 
			
		||||
  follows-you: "Śledzi Cię"
 | 
			
		||||
  following: "Śledzeni"
 | 
			
		||||
@@ -1293,8 +1337,10 @@ mobile/views/pages/user.vue:
 | 
			
		||||
  timeline: "Oś czasu"
 | 
			
		||||
  media: "Multimedia"
 | 
			
		||||
  is-suspended: "To konto zostało zablokowane"
 | 
			
		||||
  is-remote: "To jest użytkownik zdalnej instancji, informacje mogą nie być w pełni dokładne."
 | 
			
		||||
  view-remote: "Wyświetl dokładne informacje"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
mobile/views/pages/user/home.vue:
 | 
			
		||||
  recent-notes: "Ostatnie wpisy"
 | 
			
		||||
  images: "Zdjęcia"
 | 
			
		||||
@@ -1340,3 +1386,29 @@ docs:
 | 
			
		||||
      description: "Opis"
 | 
			
		||||
dev/views/index.vue:
 | 
			
		||||
  manage-apps: "Zarządzaj aplikacjami"
 | 
			
		||||
dev/views/apps.vue:
 | 
			
		||||
  manage-apps: "アプリを管理"
 | 
			
		||||
  create-app: "アプリ作成"
 | 
			
		||||
  app-missing: "アプリなし"
 | 
			
		||||
dev/views/new-app.vue:
 | 
			
		||||
  create-app: "アプリケーションの作成"
 | 
			
		||||
  app-name: "アプリケーション名"
 | 
			
		||||
  app-name-desc: "あなたのアプリの名称。"
 | 
			
		||||
  app-name-ex: "ex) Misskey for iOS"
 | 
			
		||||
  app-overview: "アプリの概要"
 | 
			
		||||
  app-desc: "あなたのアプリの簡単な説明や紹介。"
 | 
			
		||||
  app-desc-ex: "ex) Misskey iOSクライアント。"
 | 
			
		||||
  callback-url: "コールバックURL (オプション)"
 | 
			
		||||
  callback-url-desc: "ユーザーが認証フォームで認証した際にリダイレクトするURLを設定できます。"
 | 
			
		||||
  authority: "権限"
 | 
			
		||||
  authority-desc: "ここで要求した機能だけがAPIからアクセスできます。"
 | 
			
		||||
  authority-warning: "アプリ作成後も変更できますが、新たな権限を付与する場合、その時点で関連付けられているユーザーキーはすべて無効になります。"
 | 
			
		||||
  account-read: "アカウントの情報を見る。"
 | 
			
		||||
  account-write: "アカウントの情報を操作する。"
 | 
			
		||||
  note-write: "投稿する。"
 | 
			
		||||
  reaction-write: "リアクションしたりリアクションをキャンセルする。"
 | 
			
		||||
  following-write: "フォローしたりフォロー解除する。"
 | 
			
		||||
  drive-read: "ドライブを見る。"
 | 
			
		||||
  drive-write: "ドライブを操作する。"
 | 
			
		||||
  notification-read: "通知を見る。"
 | 
			
		||||
  notification-write: "通知を操作する。"
 | 
			
		||||
 
 | 
			
		||||
@@ -25,6 +25,14 @@ common:
 | 
			
		||||
  application-authorization: "Aplicativos autorizados"
 | 
			
		||||
  close: "Fechar"
 | 
			
		||||
  do-not-copy-paste: "Por favor, não digite ou copie o código aqui. A conta pode ser comprometida."
 | 
			
		||||
  BSoD:
 | 
			
		||||
    fatal-error: ":( 致命的な問題が発生しました。"
 | 
			
		||||
    update-browser-os: "お使いのブラウザ(またはOS)のバージョンを更新すると解決する可能性があります。"
 | 
			
		||||
    error-code: "エラーコード"
 | 
			
		||||
    browser-version: "ブラウザ バージョン"
 | 
			
		||||
    client-version: "クライアント バージョン"
 | 
			
		||||
    email-support: "問題が解決しない場合は、上記の情報をお書き添えの上 syuilotan@yahoo.co.jp までご連絡ください。"
 | 
			
		||||
    thanks: "Thank you for using Misskey."
 | 
			
		||||
  got-it: "Entendi!"
 | 
			
		||||
  customization-tips:
 | 
			
		||||
    title: "Dicas de personalização"
 | 
			
		||||
@@ -54,6 +62,7 @@ common:
 | 
			
		||||
    years_ago: "{} ano(s) atrás"
 | 
			
		||||
  month-and-day: "{day}/{month}"
 | 
			
		||||
  trash: "Lixo"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  weekday-short:
 | 
			
		||||
    sunday: "Dom"
 | 
			
		||||
    monday: "Seg"
 | 
			
		||||
@@ -115,6 +124,12 @@ common:
 | 
			
		||||
  reduce-motion: "UIの動きを減らす"
 | 
			
		||||
  this-setting-is-this-device-only: "このデバイスのみ"
 | 
			
		||||
  do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
 | 
			
		||||
  is-remote-user: "このユーザー情報はコピーです。"
 | 
			
		||||
  is-remote-post: "この投稿情報はコピーです。"
 | 
			
		||||
  view-on-remote: "正確な情報を見る"
 | 
			
		||||
  error:
 | 
			
		||||
    title: '問題が発生しました'
 | 
			
		||||
    retry: 'やり直す'
 | 
			
		||||
  reversi:
 | 
			
		||||
    drawn: "Empatado"
 | 
			
		||||
    my-turn: "Seu turno"
 | 
			
		||||
@@ -170,6 +185,7 @@ common:
 | 
			
		||||
    rename: "Renomear"
 | 
			
		||||
    stack-left: "左に重ねる"
 | 
			
		||||
    pop-right: "Acoplar à direita"
 | 
			
		||||
  dev: "アプリの作成に失敗しました。再度お試しください。"
 | 
			
		||||
auth/views/form.vue:
 | 
			
		||||
  share-access: "Você <b>permite</b> que <i>{{ app.name }}</i> acesse sua conta?"
 | 
			
		||||
  permission-ask: "Este aplicativo precisa das seguintes permissões:"
 | 
			
		||||
@@ -526,11 +542,14 @@ desktop/views/components/charts.vue:
 | 
			
		||||
  title: "チャート"
 | 
			
		||||
  per-day: "1日ごと"
 | 
			
		||||
  per-hour: "1時間ごと"
 | 
			
		||||
  federation: "フェデレーション"
 | 
			
		||||
  notes: "投稿"
 | 
			
		||||
  users: "ユーザー"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  network: "ネットワーク"
 | 
			
		||||
  charts:
 | 
			
		||||
    federation-instances: "インスタンスの増減"
 | 
			
		||||
    federation-instances-total: "インスタンスの積算"
 | 
			
		||||
    notes: "投稿の増減 (統合)"
 | 
			
		||||
    local-notes: "投稿の増減 (ローカル)"
 | 
			
		||||
    remote-notes: "投稿の増減 (リモート)"
 | 
			
		||||
@@ -560,7 +579,6 @@ desktop/views/components/crop-window.vue:
 | 
			
		||||
  ok: "決定"
 | 
			
		||||
desktop/views/components/drive-window.vue:
 | 
			
		||||
  used: "使用中"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
desktop/views/components/drive.file.vue:
 | 
			
		||||
  avatar: "アイコン"
 | 
			
		||||
  banner: "バナー"
 | 
			
		||||
@@ -590,8 +608,6 @@ desktop/views/components/drive.folder.vue:
 | 
			
		||||
    rename: "名前を変更"
 | 
			
		||||
    rename-folder: "フォルダ名の変更"
 | 
			
		||||
    input-new-folder-name: "新しいフォルダ名を入力してください"
 | 
			
		||||
desktop/views/components/drive.nav-folder.vue:
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
desktop/views/components/drive.vue:
 | 
			
		||||
  search: "検索"
 | 
			
		||||
  load-more: "もっと読み込む"
 | 
			
		||||
@@ -725,8 +741,8 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  profile: "プロフィール"
 | 
			
		||||
  notification: "通知"
 | 
			
		||||
  apps: "アプリ"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  mute-and-block: "ミュート/ブロック"
 | 
			
		||||
  blocking: "ブロック"
 | 
			
		||||
  security: "セキュリティ"
 | 
			
		||||
  signin: "サインイン履歴"
 | 
			
		||||
  password: "パスワード"
 | 
			
		||||
@@ -832,20 +848,32 @@ desktop/views/components/settings.2fa.vue:
 | 
			
		||||
  success: "設定が完了しました!"
 | 
			
		||||
  failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
 | 
			
		||||
  info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
 | 
			
		||||
desktop/views/components/settings.api.vue:
 | 
			
		||||
common/views/components/api-settings.vue:
 | 
			
		||||
  intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
 | 
			
		||||
  caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
 | 
			
		||||
  regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
 | 
			
		||||
  regenerate-token: "トークンを再生成"
 | 
			
		||||
  token: "Token:"
 | 
			
		||||
  enter-password: "パスワードを入力してください"
 | 
			
		||||
  console:
 | 
			
		||||
    title: 'APIコンソール'
 | 
			
		||||
    endpoint: 'エンドポイント'
 | 
			
		||||
    parameter: 'パラメータ'
 | 
			
		||||
    send: '送信'
 | 
			
		||||
    sending: '応答待ち'
 | 
			
		||||
    response: '結果'
 | 
			
		||||
desktop/views/components/settings.apps.vue:
 | 
			
		||||
  no-apps: "連携しているアプリケーションはありません"
 | 
			
		||||
desktop/views/components/settings.drive.vue:
 | 
			
		||||
  max: "中"
 | 
			
		||||
common/views/components/drive-settings.vue:
 | 
			
		||||
  max: "容量"
 | 
			
		||||
  in-use: "使用中"
 | 
			
		||||
desktop/views/components/settings.mute.vue:
 | 
			
		||||
  no-users: "ミュートしているユーザーはいません"
 | 
			
		||||
  stats: "統計"
 | 
			
		||||
common/views/components/mute-and-block.vue:
 | 
			
		||||
  mute-and-block: "ミュートとブロック"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  no-muted-users: "ミュートしているユーザーはいません"
 | 
			
		||||
  no-blocked-users: "ブロックしているユーザーはいません"
 | 
			
		||||
desktop/views/components/settings.password.vue:
 | 
			
		||||
  reset: "パスワードを変更する"
 | 
			
		||||
  enter-current-password: "現在のパスワードを入力してください"
 | 
			
		||||
@@ -877,7 +905,6 @@ desktop/views/components/ui.header.vue:
 | 
			
		||||
  adjective: "さん"
 | 
			
		||||
desktop/views/components/ui.header.account.vue:
 | 
			
		||||
  profile: "プロフィール"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  favorites: "お気に入り"
 | 
			
		||||
  lists: "リスト"
 | 
			
		||||
  follow-requests: "フォロー申請"
 | 
			
		||||
@@ -921,9 +948,10 @@ desktop/views/components/window.vue:
 | 
			
		||||
  close: "閉じる"
 | 
			
		||||
desktop/views/pages/admin/admin.vue:
 | 
			
		||||
  dashboard: "ダッシュボード"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  users: "Usuários"
 | 
			
		||||
  update: "Actualizações"
 | 
			
		||||
  announcements: "お知らせ"
 | 
			
		||||
  hashtags: "ハッシュタグ"
 | 
			
		||||
desktop/views/pages/admin/admin.dashboard.vue:
 | 
			
		||||
  dashboard: "ダッシュボード"
 | 
			
		||||
  all-users: "Todos os usuários"
 | 
			
		||||
@@ -931,6 +959,9 @@ desktop/views/pages/admin/admin.dashboard.vue:
 | 
			
		||||
  all-notes: "全ての投稿"
 | 
			
		||||
  original-notes: "このインスタンスの投稿"
 | 
			
		||||
  invite: "招待"
 | 
			
		||||
  banner-url: "Banner URL"
 | 
			
		||||
  disableRegistration: "Disable new user registration"
 | 
			
		||||
  disableLocalTimeline: "Disable the local timeline"
 | 
			
		||||
desktop/views/pages/admin/admin.suspend-user.vue:
 | 
			
		||||
  suspend-user: "ユーザーの凍結"
 | 
			
		||||
  suspend: "凍結"
 | 
			
		||||
@@ -947,12 +978,23 @@ desktop/views/pages/admin/admin.unverify-user.vue:
 | 
			
		||||
  unverify-user: "ユーザーの公式アカウント解除"
 | 
			
		||||
  unverify: "公式アカウントを解除する"
 | 
			
		||||
  unverified: "公式アカウントを解除しました"
 | 
			
		||||
desktop/views/pages/admin/admin.announcements.vue:
 | 
			
		||||
  announcements: "お知らせ"
 | 
			
		||||
desktop/views/pages/admin/admin.hashtags.vue:
 | 
			
		||||
  hided-tags: "Hidden Tags"
 | 
			
		||||
desktop/views/pages/deck/deck.tl-column.vue:
 | 
			
		||||
  is-media-only: "メディア投稿のみ"
 | 
			
		||||
  is-media-view: "メディアビュー"
 | 
			
		||||
  edit: "オプション"
 | 
			
		||||
desktop/views/pages/deck/deck.user-column.vue:
 | 
			
		||||
  posts: "投稿"
 | 
			
		||||
  following: "フォロー"
 | 
			
		||||
  followers: "フォロワー"
 | 
			
		||||
  images: "画像"
 | 
			
		||||
  activity: "アクティビティ"
 | 
			
		||||
  timeline: "タイムライン"
 | 
			
		||||
  pinned-notes: "ピン留めされた投稿"
 | 
			
		||||
  push-to-a-list: "リストに追加"
 | 
			
		||||
desktop/views/pages/stats/stats.vue:
 | 
			
		||||
  all-users: "全てのユーザー"
 | 
			
		||||
  original-users: "このインスタンスのユーザー"
 | 
			
		||||
@@ -1005,9 +1047,6 @@ desktop/views/pages/user/user.friends.vue:
 | 
			
		||||
  no-users: "よく話すユーザーはいません"
 | 
			
		||||
desktop/views/pages/user/user.vue:
 | 
			
		||||
  is-suspended: "このユーザーは凍結されています。"
 | 
			
		||||
  is-remote: "このユーザーはリモートユーザーです。"
 | 
			
		||||
  view-remote: "正確な情報を見る"
 | 
			
		||||
desktop/views/pages/user/user.home.vue:
 | 
			
		||||
  last-used-at: "最終アクセス"
 | 
			
		||||
desktop/views/pages/user/user.photos.vue:
 | 
			
		||||
  title: "フォト"
 | 
			
		||||
@@ -1021,6 +1060,9 @@ desktop/views/pages/user/user.profile.vue:
 | 
			
		||||
  mute: "ミュートする"
 | 
			
		||||
  muted: "ミュートしています"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロックする"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  block-confirm: "このユーザーをブロックしますか?"
 | 
			
		||||
  push-to-a-list: "リストに追加"
 | 
			
		||||
  list-pushed: "{user}を{list}に追加しました。"
 | 
			
		||||
desktop/views/pages/user/user.header.vue:
 | 
			
		||||
@@ -1028,6 +1070,10 @@ desktop/views/pages/user/user.header.vue:
 | 
			
		||||
  following: "フォロー"
 | 
			
		||||
  followers: "フォロワー"
 | 
			
		||||
  is-bot: "このアカウントはBotです"
 | 
			
		||||
  years-old: "歳"
 | 
			
		||||
  year: "年"
 | 
			
		||||
  month: "月"
 | 
			
		||||
  day: "日"
 | 
			
		||||
desktop/views/pages/user/user.timeline.vue:
 | 
			
		||||
  default: "投稿"
 | 
			
		||||
  with-replies: "投稿と返信"
 | 
			
		||||
@@ -1057,7 +1103,6 @@ desktop/views/widgets/users.vue:
 | 
			
		||||
  refresh: "他を見る"
 | 
			
		||||
  no-one: "いません!"
 | 
			
		||||
mobile/views/components/drive.vue:
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  used: "使用中"
 | 
			
		||||
  folder-count: "フォルダ"
 | 
			
		||||
  count-separator: "、"
 | 
			
		||||
@@ -1161,7 +1206,6 @@ mobile/views/components/ui.nav.vue:
 | 
			
		||||
  messaging: "メッセージ"
 | 
			
		||||
  follow-requests: "フォロー申請"
 | 
			
		||||
  search: "検索"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  favorites: "お気に入り"
 | 
			
		||||
  user-lists: "リスト"
 | 
			
		||||
  widgets: "ウィジェット"
 | 
			
		||||
@@ -1184,7 +1228,6 @@ mobile/views/pages/user-lists.vue:
 | 
			
		||||
  title: "リスト"
 | 
			
		||||
  enter-list-name: "リスト名を入力してください"
 | 
			
		||||
mobile/views/pages/drive.vue:
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  more: "もっと見る"
 | 
			
		||||
mobile/views/pages/signup.vue:
 | 
			
		||||
  lets-start: "📦 始めましょう"
 | 
			
		||||
@@ -1284,6 +1327,7 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  signout: "Sair"
 | 
			
		||||
  sound: "Sons"
 | 
			
		||||
  enable-sounds: "Ativar sons"
 | 
			
		||||
  mark-as-read-all-unread-notes: "すべての投稿を既読にする"
 | 
			
		||||
mobile/views/pages/user.vue:
 | 
			
		||||
  follows-you: "Te segue"
 | 
			
		||||
  following: "Seguindo"
 | 
			
		||||
@@ -1293,8 +1337,10 @@ mobile/views/pages/user.vue:
 | 
			
		||||
  timeline: "Linha do tempo"
 | 
			
		||||
  media: "Mídia"
 | 
			
		||||
  is-suspended: "Esta conta foi suspensa"
 | 
			
		||||
  is-remote: "Este é uma usuário remoto. O perfil que vê aqui pode não estar completo."
 | 
			
		||||
  view-remote: "Ver o perfil completo."
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
mobile/views/pages/user/home.vue:
 | 
			
		||||
  recent-notes: "Notas recentes"
 | 
			
		||||
  images: "Imagens"
 | 
			
		||||
@@ -1303,7 +1349,7 @@ mobile/views/pages/user/home.vue:
 | 
			
		||||
  domains: "Domínios"
 | 
			
		||||
  frequently-replied-users: "Perguntas frequentes"
 | 
			
		||||
  followers-you-know: "Seguidores que você conhece"
 | 
			
		||||
  last-used-at: "Ativo pela última vez:"
 | 
			
		||||
  last-used-at: "Ativo pela última vez"
 | 
			
		||||
mobile/views/pages/user/home.followers-you-know.vue:
 | 
			
		||||
  loading: "Carregando"
 | 
			
		||||
  no-users: "知り合いのユーザーはいません"
 | 
			
		||||
@@ -1340,3 +1386,29 @@ docs:
 | 
			
		||||
      description: "Descrição"
 | 
			
		||||
dev/views/index.vue:
 | 
			
		||||
  manage-apps: "Gerenciar aplicativos"
 | 
			
		||||
dev/views/apps.vue:
 | 
			
		||||
  manage-apps: "アプリを管理"
 | 
			
		||||
  create-app: "アプリ作成"
 | 
			
		||||
  app-missing: "アプリなし"
 | 
			
		||||
dev/views/new-app.vue:
 | 
			
		||||
  create-app: "アプリケーションの作成"
 | 
			
		||||
  app-name: "アプリケーション名"
 | 
			
		||||
  app-name-desc: "あなたのアプリの名称。"
 | 
			
		||||
  app-name-ex: "ex) Misskey for iOS"
 | 
			
		||||
  app-overview: "アプリの概要"
 | 
			
		||||
  app-desc: "あなたのアプリの簡単な説明や紹介。"
 | 
			
		||||
  app-desc-ex: "ex) Misskey iOSクライアント。"
 | 
			
		||||
  callback-url: "コールバックURL (オプション)"
 | 
			
		||||
  callback-url-desc: "ユーザーが認証フォームで認証した際にリダイレクトするURLを設定できます。"
 | 
			
		||||
  authority: "権限"
 | 
			
		||||
  authority-desc: "ここで要求した機能だけがAPIからアクセスできます。"
 | 
			
		||||
  authority-warning: "アプリ作成後も変更できますが、新たな権限を付与する場合、その時点で関連付けられているユーザーキーはすべて無効になります。"
 | 
			
		||||
  account-read: "アカウントの情報を見る。"
 | 
			
		||||
  account-write: "アカウントの情報を操作する。"
 | 
			
		||||
  note-write: "投稿する。"
 | 
			
		||||
  reaction-write: "リアクションしたりリアクションをキャンセルする。"
 | 
			
		||||
  following-write: "フォローしたりフォロー解除する。"
 | 
			
		||||
  drive-read: "ドライブを見る。"
 | 
			
		||||
  drive-write: "ドライブを操作する。"
 | 
			
		||||
  notification-read: "通知を見る。"
 | 
			
		||||
  notification-write: "通知を操作する。"
 | 
			
		||||
 
 | 
			
		||||
@@ -25,6 +25,14 @@ common:
 | 
			
		||||
  application-authorization: "アプリの連携"
 | 
			
		||||
  close: "閉じる"
 | 
			
		||||
  do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
 | 
			
		||||
  BSoD:
 | 
			
		||||
    fatal-error: ":( 致命的な問題が発生しました。"
 | 
			
		||||
    update-browser-os: "お使いのブラウザ(またはOS)のバージョンを更新すると解決する可能性があります。"
 | 
			
		||||
    error-code: "エラーコード"
 | 
			
		||||
    browser-version: "ブラウザ バージョン"
 | 
			
		||||
    client-version: "クライアント バージョン"
 | 
			
		||||
    email-support: "問題が解決しない場合は、上記の情報をお書き添えの上 syuilotan@yahoo.co.jp までご連絡ください。"
 | 
			
		||||
    thanks: "Thank you for using Misskey."
 | 
			
		||||
  got-it: "わかった"
 | 
			
		||||
  customization-tips:
 | 
			
		||||
    title: "カスタマイズのヒント"
 | 
			
		||||
@@ -54,6 +62,7 @@ common:
 | 
			
		||||
    years_ago: "{}年前"
 | 
			
		||||
  month-and-day: "{month}月 {day}日"
 | 
			
		||||
  trash: "ゴミ箱"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  weekday-short:
 | 
			
		||||
    sunday: "日"
 | 
			
		||||
    monday: "月"
 | 
			
		||||
@@ -115,6 +124,12 @@ common:
 | 
			
		||||
  reduce-motion: "UIの動きを減らす"
 | 
			
		||||
  this-setting-is-this-device-only: "このデバイスのみ"
 | 
			
		||||
  do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
 | 
			
		||||
  is-remote-user: "このユーザー情報はコピーです。"
 | 
			
		||||
  is-remote-post: "この投稿情報はコピーです。"
 | 
			
		||||
  view-on-remote: "正確な情報を見る"
 | 
			
		||||
  error:
 | 
			
		||||
    title: '問題が発生しました'
 | 
			
		||||
    retry: 'やり直す'
 | 
			
		||||
  reversi:
 | 
			
		||||
    drawn: "引き分け"
 | 
			
		||||
    my-turn: "あなたのターンです"
 | 
			
		||||
@@ -170,6 +185,7 @@ common:
 | 
			
		||||
    rename: "名前を変更"
 | 
			
		||||
    stack-left: "左に重ねる"
 | 
			
		||||
    pop-right: "右に出す"
 | 
			
		||||
  dev: "アプリの作成に失敗しました。再度お試しください。"
 | 
			
		||||
auth/views/form.vue:
 | 
			
		||||
  share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
 | 
			
		||||
  permission-ask: "このアプリは次の権限を要求しています:"
 | 
			
		||||
@@ -526,11 +542,14 @@ desktop/views/components/charts.vue:
 | 
			
		||||
  title: "チャート"
 | 
			
		||||
  per-day: "1日ごと"
 | 
			
		||||
  per-hour: "1時間ごと"
 | 
			
		||||
  federation: "フェデレーション"
 | 
			
		||||
  notes: "投稿"
 | 
			
		||||
  users: "ユーザー"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  network: "ネットワーク"
 | 
			
		||||
  charts:
 | 
			
		||||
    federation-instances: "インスタンスの増減"
 | 
			
		||||
    federation-instances-total: "インスタンスの積算"
 | 
			
		||||
    notes: "投稿の増減 (統合)"
 | 
			
		||||
    local-notes: "投稿の増減 (ローカル)"
 | 
			
		||||
    remote-notes: "投稿の増減 (リモート)"
 | 
			
		||||
@@ -560,7 +579,6 @@ desktop/views/components/crop-window.vue:
 | 
			
		||||
  ok: "決定"
 | 
			
		||||
desktop/views/components/drive-window.vue:
 | 
			
		||||
  used: "使用中"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
desktop/views/components/drive.file.vue:
 | 
			
		||||
  avatar: "アイコン"
 | 
			
		||||
  banner: "バナー"
 | 
			
		||||
@@ -590,8 +608,6 @@ desktop/views/components/drive.folder.vue:
 | 
			
		||||
    rename: "名前を変更"
 | 
			
		||||
    rename-folder: "フォルダ名の変更"
 | 
			
		||||
    input-new-folder-name: "新しいフォルダ名を入力してください"
 | 
			
		||||
desktop/views/components/drive.nav-folder.vue:
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
desktop/views/components/drive.vue:
 | 
			
		||||
  search: "検索"
 | 
			
		||||
  load-more: "もっと読み込む"
 | 
			
		||||
@@ -725,8 +741,8 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  profile: "プロフィール"
 | 
			
		||||
  notification: "通知"
 | 
			
		||||
  apps: "アプリ"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  mute-and-block: "ミュート/ブロック"
 | 
			
		||||
  blocking: "ブロック"
 | 
			
		||||
  security: "セキュリティ"
 | 
			
		||||
  signin: "サインイン履歴"
 | 
			
		||||
  password: "パスワード"
 | 
			
		||||
@@ -832,20 +848,32 @@ desktop/views/components/settings.2fa.vue:
 | 
			
		||||
  success: "設定が完了しました!"
 | 
			
		||||
  failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
 | 
			
		||||
  info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
 | 
			
		||||
desktop/views/components/settings.api.vue:
 | 
			
		||||
common/views/components/api-settings.vue:
 | 
			
		||||
  intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
 | 
			
		||||
  caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
 | 
			
		||||
  regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
 | 
			
		||||
  regenerate-token: "トークンを再生成"
 | 
			
		||||
  token: "Token:"
 | 
			
		||||
  enter-password: "パスワードを入力してください"
 | 
			
		||||
  console:
 | 
			
		||||
    title: 'APIコンソール'
 | 
			
		||||
    endpoint: 'エンドポイント'
 | 
			
		||||
    parameter: 'パラメータ'
 | 
			
		||||
    send: '送信'
 | 
			
		||||
    sending: '応答待ち'
 | 
			
		||||
    response: '結果'
 | 
			
		||||
desktop/views/components/settings.apps.vue:
 | 
			
		||||
  no-apps: "連携しているアプリケーションはありません"
 | 
			
		||||
desktop/views/components/settings.drive.vue:
 | 
			
		||||
  max: "中"
 | 
			
		||||
common/views/components/drive-settings.vue:
 | 
			
		||||
  max: "容量"
 | 
			
		||||
  in-use: "使用中"
 | 
			
		||||
desktop/views/components/settings.mute.vue:
 | 
			
		||||
  no-users: "ミュートしているユーザーはいません"
 | 
			
		||||
  stats: "統計"
 | 
			
		||||
common/views/components/mute-and-block.vue:
 | 
			
		||||
  mute-and-block: "ミュートとブロック"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  no-muted-users: "ミュートしているユーザーはいません"
 | 
			
		||||
  no-blocked-users: "ブロックしているユーザーはいません"
 | 
			
		||||
desktop/views/components/settings.password.vue:
 | 
			
		||||
  reset: "パスワードを変更する"
 | 
			
		||||
  enter-current-password: "現在のパスワードを入力してください"
 | 
			
		||||
@@ -877,7 +905,6 @@ desktop/views/components/ui.header.vue:
 | 
			
		||||
  adjective: "さん"
 | 
			
		||||
desktop/views/components/ui.header.account.vue:
 | 
			
		||||
  profile: "プロフィール"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  favorites: "お気に入り"
 | 
			
		||||
  lists: "リスト"
 | 
			
		||||
  follow-requests: "フォロー申請"
 | 
			
		||||
@@ -921,9 +948,10 @@ desktop/views/components/window.vue:
 | 
			
		||||
  close: "閉じる"
 | 
			
		||||
desktop/views/pages/admin/admin.vue:
 | 
			
		||||
  dashboard: "ダッシュボード"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  users: "ユーザー"
 | 
			
		||||
  update: "更新"
 | 
			
		||||
  announcements: "お知らせ"
 | 
			
		||||
  hashtags: "ハッシュタグ"
 | 
			
		||||
desktop/views/pages/admin/admin.dashboard.vue:
 | 
			
		||||
  dashboard: "ダッシュボード"
 | 
			
		||||
  all-users: "全てのユーザー"
 | 
			
		||||
@@ -931,6 +959,9 @@ desktop/views/pages/admin/admin.dashboard.vue:
 | 
			
		||||
  all-notes: "全ての投稿"
 | 
			
		||||
  original-notes: "このインスタンスの投稿"
 | 
			
		||||
  invite: "招待"
 | 
			
		||||
  banner-url: "Banner URL"
 | 
			
		||||
  disableRegistration: "Disable new user registration"
 | 
			
		||||
  disableLocalTimeline: "Disable the local timeline"
 | 
			
		||||
desktop/views/pages/admin/admin.suspend-user.vue:
 | 
			
		||||
  suspend-user: "ユーザーの凍結"
 | 
			
		||||
  suspend: "凍結"
 | 
			
		||||
@@ -947,12 +978,23 @@ desktop/views/pages/admin/admin.unverify-user.vue:
 | 
			
		||||
  unverify-user: "ユーザーの公式アカウント解除"
 | 
			
		||||
  unverify: "公式アカウントを解除する"
 | 
			
		||||
  unverified: "公式アカウントを解除しました"
 | 
			
		||||
desktop/views/pages/admin/admin.announcements.vue:
 | 
			
		||||
  announcements: "お知らせ"
 | 
			
		||||
desktop/views/pages/admin/admin.hashtags.vue:
 | 
			
		||||
  hided-tags: "Hidden Tags"
 | 
			
		||||
desktop/views/pages/deck/deck.tl-column.vue:
 | 
			
		||||
  is-media-only: "メディア投稿のみ"
 | 
			
		||||
  is-media-view: "メディアビュー"
 | 
			
		||||
  edit: "オプション"
 | 
			
		||||
desktop/views/pages/deck/deck.user-column.vue:
 | 
			
		||||
  posts: "投稿"
 | 
			
		||||
  following: "フォロー"
 | 
			
		||||
  followers: "フォロワー"
 | 
			
		||||
  images: "画像"
 | 
			
		||||
  activity: "アクティビティ"
 | 
			
		||||
  timeline: "タイムライン"
 | 
			
		||||
  pinned-notes: "ピン留めされた投稿"
 | 
			
		||||
  push-to-a-list: "リストに追加"
 | 
			
		||||
desktop/views/pages/stats/stats.vue:
 | 
			
		||||
  all-users: "全てのユーザー"
 | 
			
		||||
  original-users: "このインスタンスのユーザー"
 | 
			
		||||
@@ -1005,9 +1047,6 @@ desktop/views/pages/user/user.friends.vue:
 | 
			
		||||
  no-users: "よく話すユーザーはいません"
 | 
			
		||||
desktop/views/pages/user/user.vue:
 | 
			
		||||
  is-suspended: "このユーザーは凍結されています。"
 | 
			
		||||
  is-remote: "このユーザーはリモートユーザーです。"
 | 
			
		||||
  view-remote: "正確な情報を見る"
 | 
			
		||||
desktop/views/pages/user/user.home.vue:
 | 
			
		||||
  last-used-at: "最終アクセス"
 | 
			
		||||
desktop/views/pages/user/user.photos.vue:
 | 
			
		||||
  title: "フォト"
 | 
			
		||||
@@ -1021,6 +1060,9 @@ desktop/views/pages/user/user.profile.vue:
 | 
			
		||||
  mute: "ミュートする"
 | 
			
		||||
  muted: "ミュートしています"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロックする"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  block-confirm: "このユーザーをブロックしますか?"
 | 
			
		||||
  push-to-a-list: "リストに追加"
 | 
			
		||||
  list-pushed: "{user}を{list}に追加しました。"
 | 
			
		||||
desktop/views/pages/user/user.header.vue:
 | 
			
		||||
@@ -1028,6 +1070,10 @@ desktop/views/pages/user/user.header.vue:
 | 
			
		||||
  following: "フォロー"
 | 
			
		||||
  followers: "フォロワー"
 | 
			
		||||
  is-bot: "このアカウントはBotです"
 | 
			
		||||
  years-old: "歳"
 | 
			
		||||
  year: "年"
 | 
			
		||||
  month: "月"
 | 
			
		||||
  day: "日"
 | 
			
		||||
desktop/views/pages/user/user.timeline.vue:
 | 
			
		||||
  default: "投稿"
 | 
			
		||||
  with-replies: "投稿と返信"
 | 
			
		||||
@@ -1057,7 +1103,6 @@ desktop/views/widgets/users.vue:
 | 
			
		||||
  refresh: "他を見る"
 | 
			
		||||
  no-one: "いません!"
 | 
			
		||||
mobile/views/components/drive.vue:
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  used: "使用中"
 | 
			
		||||
  folder-count: "フォルダ"
 | 
			
		||||
  count-separator: "、"
 | 
			
		||||
@@ -1161,7 +1206,6 @@ mobile/views/components/ui.nav.vue:
 | 
			
		||||
  messaging: "メッセージ"
 | 
			
		||||
  follow-requests: "フォロー申請"
 | 
			
		||||
  search: "検索"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  favorites: "お気に入り"
 | 
			
		||||
  user-lists: "リスト"
 | 
			
		||||
  widgets: "ウィジェット"
 | 
			
		||||
@@ -1184,7 +1228,6 @@ mobile/views/pages/user-lists.vue:
 | 
			
		||||
  title: "リスト"
 | 
			
		||||
  enter-list-name: "リスト名を入力してください"
 | 
			
		||||
mobile/views/pages/drive.vue:
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  more: "もっと見る"
 | 
			
		||||
mobile/views/pages/signup.vue:
 | 
			
		||||
  lets-start: "📦 始めましょう"
 | 
			
		||||
@@ -1284,6 +1327,7 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  signout: "サインアウト"
 | 
			
		||||
  sound: "サウンド"
 | 
			
		||||
  enable-sounds: "サウンドを有効にする"
 | 
			
		||||
  mark-as-read-all-unread-notes: "すべての投稿を既読にする"
 | 
			
		||||
mobile/views/pages/user.vue:
 | 
			
		||||
  follows-you: "フォローされています"
 | 
			
		||||
  following: "フォロー"
 | 
			
		||||
@@ -1293,8 +1337,10 @@ mobile/views/pages/user.vue:
 | 
			
		||||
  timeline: "タイムライン"
 | 
			
		||||
  media: "メディア"
 | 
			
		||||
  is-suspended: "このユーザーは凍結されています。"
 | 
			
		||||
  is-remote: "このユーザーはリモートユーザーです。"
 | 
			
		||||
  view-remote: "正確な情報を見る"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
mobile/views/pages/user/home.vue:
 | 
			
		||||
  recent-notes: "最近の投稿"
 | 
			
		||||
  images: "画像"
 | 
			
		||||
@@ -1340,3 +1386,29 @@ docs:
 | 
			
		||||
      description: "説明"
 | 
			
		||||
dev/views/index.vue:
 | 
			
		||||
  manage-apps: "アプリの管理"
 | 
			
		||||
dev/views/apps.vue:
 | 
			
		||||
  manage-apps: "アプリを管理"
 | 
			
		||||
  create-app: "アプリ作成"
 | 
			
		||||
  app-missing: "アプリなし"
 | 
			
		||||
dev/views/new-app.vue:
 | 
			
		||||
  create-app: "アプリケーションの作成"
 | 
			
		||||
  app-name: "アプリケーション名"
 | 
			
		||||
  app-name-desc: "あなたのアプリの名称。"
 | 
			
		||||
  app-name-ex: "ex) Misskey for iOS"
 | 
			
		||||
  app-overview: "アプリの概要"
 | 
			
		||||
  app-desc: "あなたのアプリの簡単な説明や紹介。"
 | 
			
		||||
  app-desc-ex: "ex) Misskey iOSクライアント。"
 | 
			
		||||
  callback-url: "コールバックURL (オプション)"
 | 
			
		||||
  callback-url-desc: "ユーザーが認証フォームで認証した際にリダイレクトするURLを設定できます。"
 | 
			
		||||
  authority: "権限"
 | 
			
		||||
  authority-desc: "ここで要求した機能だけがAPIからアクセスできます。"
 | 
			
		||||
  authority-warning: "アプリ作成後も変更できますが、新たな権限を付与する場合、その時点で関連付けられているユーザーキーはすべて無効になります。"
 | 
			
		||||
  account-read: "アカウントの情報を見る。"
 | 
			
		||||
  account-write: "アカウントの情報を操作する。"
 | 
			
		||||
  note-write: "投稿する。"
 | 
			
		||||
  reaction-write: "リアクションしたりリアクションをキャンセルする。"
 | 
			
		||||
  following-write: "フォローしたりフォロー解除する。"
 | 
			
		||||
  drive-read: "ドライブを見る。"
 | 
			
		||||
  drive-write: "ドライブを操作する。"
 | 
			
		||||
  notification-read: "通知を見る。"
 | 
			
		||||
  notification-write: "通知を操作する。"
 | 
			
		||||
 
 | 
			
		||||
@@ -25,6 +25,14 @@ common:
 | 
			
		||||
  application-authorization: "アプリの連携"
 | 
			
		||||
  close: "閉じる"
 | 
			
		||||
  do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
 | 
			
		||||
  BSoD:
 | 
			
		||||
    fatal-error: ":( 致命的な問題が発生しました。"
 | 
			
		||||
    update-browser-os: "お使いのブラウザ(またはOS)のバージョンを更新すると解決する可能性があります。"
 | 
			
		||||
    error-code: "エラーコード"
 | 
			
		||||
    browser-version: "ブラウザ バージョン"
 | 
			
		||||
    client-version: "クライアント バージョン"
 | 
			
		||||
    email-support: "問題が解決しない場合は、上記の情報をお書き添えの上 syuilotan@yahoo.co.jp までご連絡ください。"
 | 
			
		||||
    thanks: "Thank you for using Misskey."
 | 
			
		||||
  got-it: "わかった"
 | 
			
		||||
  customization-tips:
 | 
			
		||||
    title: "カスタマイズのヒント"
 | 
			
		||||
@@ -54,6 +62,7 @@ common:
 | 
			
		||||
    years_ago: "{}年前"
 | 
			
		||||
  month-and-day: "{month}月 {day}日"
 | 
			
		||||
  trash: "ゴミ箱"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  weekday-short:
 | 
			
		||||
    sunday: "日"
 | 
			
		||||
    monday: "月"
 | 
			
		||||
@@ -115,6 +124,12 @@ common:
 | 
			
		||||
  reduce-motion: "UIの動きを減らす"
 | 
			
		||||
  this-setting-is-this-device-only: "このデバイスのみ"
 | 
			
		||||
  do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
 | 
			
		||||
  is-remote-user: "このユーザー情報はコピーです。"
 | 
			
		||||
  is-remote-post: "この投稿情報はコピーです。"
 | 
			
		||||
  view-on-remote: "正確な情報を見る"
 | 
			
		||||
  error:
 | 
			
		||||
    title: '問題が発生しました'
 | 
			
		||||
    retry: 'やり直す'
 | 
			
		||||
  reversi:
 | 
			
		||||
    drawn: "引き分け"
 | 
			
		||||
    my-turn: "あなたのターンです"
 | 
			
		||||
@@ -170,6 +185,7 @@ common:
 | 
			
		||||
    rename: "名前を変更"
 | 
			
		||||
    stack-left: "左に重ねる"
 | 
			
		||||
    pop-right: "右に出す"
 | 
			
		||||
  dev: "アプリの作成に失敗しました。再度お試しください。"
 | 
			
		||||
auth/views/form.vue:
 | 
			
		||||
  share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
 | 
			
		||||
  permission-ask: "このアプリは次の権限を要求しています:"
 | 
			
		||||
@@ -526,11 +542,14 @@ desktop/views/components/charts.vue:
 | 
			
		||||
  title: "チャート"
 | 
			
		||||
  per-day: "1日ごと"
 | 
			
		||||
  per-hour: "1時間ごと"
 | 
			
		||||
  federation: "フェデレーション"
 | 
			
		||||
  notes: "投稿"
 | 
			
		||||
  users: "ユーザー"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  network: "ネットワーク"
 | 
			
		||||
  charts:
 | 
			
		||||
    federation-instances: "インスタンスの増減"
 | 
			
		||||
    federation-instances-total: "インスタンスの積算"
 | 
			
		||||
    notes: "投稿の増減 (統合)"
 | 
			
		||||
    local-notes: "投稿の増減 (ローカル)"
 | 
			
		||||
    remote-notes: "投稿の増減 (リモート)"
 | 
			
		||||
@@ -560,7 +579,6 @@ desktop/views/components/crop-window.vue:
 | 
			
		||||
  ok: "決定"
 | 
			
		||||
desktop/views/components/drive-window.vue:
 | 
			
		||||
  used: "使用中"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
desktop/views/components/drive.file.vue:
 | 
			
		||||
  avatar: "アイコン"
 | 
			
		||||
  banner: "バナー"
 | 
			
		||||
@@ -590,8 +608,6 @@ desktop/views/components/drive.folder.vue:
 | 
			
		||||
    rename: "名前を変更"
 | 
			
		||||
    rename-folder: "フォルダ名の変更"
 | 
			
		||||
    input-new-folder-name: "新しいフォルダ名を入力してください"
 | 
			
		||||
desktop/views/components/drive.nav-folder.vue:
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
desktop/views/components/drive.vue:
 | 
			
		||||
  search: "検索"
 | 
			
		||||
  load-more: "もっと読み込む"
 | 
			
		||||
@@ -725,8 +741,8 @@ desktop/views/components/settings.vue:
 | 
			
		||||
  profile: "プロフィール"
 | 
			
		||||
  notification: "通知"
 | 
			
		||||
  apps: "アプリ"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  mute-and-block: "ミュート/ブロック"
 | 
			
		||||
  blocking: "ブロック"
 | 
			
		||||
  security: "セキュリティ"
 | 
			
		||||
  signin: "サインイン履歴"
 | 
			
		||||
  password: "パスワード"
 | 
			
		||||
@@ -832,20 +848,32 @@ desktop/views/components/settings.2fa.vue:
 | 
			
		||||
  success: "設定が完了しました!"
 | 
			
		||||
  failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
 | 
			
		||||
  info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
 | 
			
		||||
desktop/views/components/settings.api.vue:
 | 
			
		||||
common/views/components/api-settings.vue:
 | 
			
		||||
  intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
 | 
			
		||||
  caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
 | 
			
		||||
  regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
 | 
			
		||||
  regenerate-token: "トークンを再生成"
 | 
			
		||||
  token: "Token:"
 | 
			
		||||
  enter-password: "パスワードを入力してください"
 | 
			
		||||
  console:
 | 
			
		||||
    title: 'APIコンソール'
 | 
			
		||||
    endpoint: 'エンドポイント'
 | 
			
		||||
    parameter: 'パラメータ'
 | 
			
		||||
    send: '送信'
 | 
			
		||||
    sending: '応答待ち'
 | 
			
		||||
    response: '結果'
 | 
			
		||||
desktop/views/components/settings.apps.vue:
 | 
			
		||||
  no-apps: "連携しているアプリケーションはありません"
 | 
			
		||||
desktop/views/components/settings.drive.vue:
 | 
			
		||||
  max: "中"
 | 
			
		||||
common/views/components/drive-settings.vue:
 | 
			
		||||
  max: "容量"
 | 
			
		||||
  in-use: "使用中"
 | 
			
		||||
desktop/views/components/settings.mute.vue:
 | 
			
		||||
  no-users: "ミュートしているユーザーはいません"
 | 
			
		||||
  stats: "統計"
 | 
			
		||||
common/views/components/mute-and-block.vue:
 | 
			
		||||
  mute-and-block: "ミュートとブロック"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  no-muted-users: "ミュートしているユーザーはいません"
 | 
			
		||||
  no-blocked-users: "ブロックしているユーザーはいません"
 | 
			
		||||
desktop/views/components/settings.password.vue:
 | 
			
		||||
  reset: "パスワードを変更する"
 | 
			
		||||
  enter-current-password: "現在のパスワードを入力してください"
 | 
			
		||||
@@ -877,7 +905,6 @@ desktop/views/components/ui.header.vue:
 | 
			
		||||
  adjective: "さん"
 | 
			
		||||
desktop/views/components/ui.header.account.vue:
 | 
			
		||||
  profile: "プロフィール"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  favorites: "お気に入り"
 | 
			
		||||
  lists: "リスト"
 | 
			
		||||
  follow-requests: "フォロー申請"
 | 
			
		||||
@@ -921,9 +948,10 @@ desktop/views/components/window.vue:
 | 
			
		||||
  close: "閉じる"
 | 
			
		||||
desktop/views/pages/admin/admin.vue:
 | 
			
		||||
  dashboard: "ダッシュボード"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  users: "ユーザー"
 | 
			
		||||
  update: "更新"
 | 
			
		||||
  announcements: "お知らせ"
 | 
			
		||||
  hashtags: "ハッシュタグ"
 | 
			
		||||
desktop/views/pages/admin/admin.dashboard.vue:
 | 
			
		||||
  dashboard: "ダッシュボード"
 | 
			
		||||
  all-users: "全てのユーザー"
 | 
			
		||||
@@ -931,6 +959,9 @@ desktop/views/pages/admin/admin.dashboard.vue:
 | 
			
		||||
  all-notes: "全ての投稿"
 | 
			
		||||
  original-notes: "このインスタンスの投稿"
 | 
			
		||||
  invite: "招待"
 | 
			
		||||
  banner-url: "Banner URL"
 | 
			
		||||
  disableRegistration: "Disable new user registration"
 | 
			
		||||
  disableLocalTimeline: "Disable the local timeline"
 | 
			
		||||
desktop/views/pages/admin/admin.suspend-user.vue:
 | 
			
		||||
  suspend-user: "ユーザーの凍結"
 | 
			
		||||
  suspend: "凍結"
 | 
			
		||||
@@ -947,12 +978,23 @@ desktop/views/pages/admin/admin.unverify-user.vue:
 | 
			
		||||
  unverify-user: "ユーザーの公式アカウント解除"
 | 
			
		||||
  unverify: "公式アカウントを解除する"
 | 
			
		||||
  unverified: "公式アカウントを解除しました"
 | 
			
		||||
desktop/views/pages/admin/admin.announcements.vue:
 | 
			
		||||
  announcements: "お知らせ"
 | 
			
		||||
desktop/views/pages/admin/admin.hashtags.vue:
 | 
			
		||||
  hided-tags: "Hidden Tags"
 | 
			
		||||
desktop/views/pages/deck/deck.tl-column.vue:
 | 
			
		||||
  is-media-only: "メディア投稿のみ"
 | 
			
		||||
  is-media-view: "メディアビュー"
 | 
			
		||||
  edit: "オプション"
 | 
			
		||||
desktop/views/pages/deck/deck.user-column.vue:
 | 
			
		||||
  posts: "投稿"
 | 
			
		||||
  following: "フォロー"
 | 
			
		||||
  followers: "フォロワー"
 | 
			
		||||
  images: "画像"
 | 
			
		||||
  activity: "アクティビティ"
 | 
			
		||||
  timeline: "タイムライン"
 | 
			
		||||
  pinned-notes: "ピン留めされた投稿"
 | 
			
		||||
  push-to-a-list: "リストに追加"
 | 
			
		||||
desktop/views/pages/stats/stats.vue:
 | 
			
		||||
  all-users: "全てのユーザー"
 | 
			
		||||
  original-users: "このインスタンスのユーザー"
 | 
			
		||||
@@ -1005,9 +1047,6 @@ desktop/views/pages/user/user.friends.vue:
 | 
			
		||||
  no-users: "よく話すユーザーはいません"
 | 
			
		||||
desktop/views/pages/user/user.vue:
 | 
			
		||||
  is-suspended: "このユーザーは凍結されています。"
 | 
			
		||||
  is-remote: "このユーザーはリモートユーザーです。"
 | 
			
		||||
  view-remote: "正確な情報を見る"
 | 
			
		||||
desktop/views/pages/user/user.home.vue:
 | 
			
		||||
  last-used-at: "最終アクセス"
 | 
			
		||||
desktop/views/pages/user/user.photos.vue:
 | 
			
		||||
  title: "フォト"
 | 
			
		||||
@@ -1021,6 +1060,9 @@ desktop/views/pages/user/user.profile.vue:
 | 
			
		||||
  mute: "ミュートする"
 | 
			
		||||
  muted: "ミュートしています"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロックする"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
  block-confirm: "このユーザーをブロックしますか?"
 | 
			
		||||
  push-to-a-list: "リストに追加"
 | 
			
		||||
  list-pushed: "{user}を{list}に追加しました。"
 | 
			
		||||
desktop/views/pages/user/user.header.vue:
 | 
			
		||||
@@ -1028,6 +1070,10 @@ desktop/views/pages/user/user.header.vue:
 | 
			
		||||
  following: "フォロー"
 | 
			
		||||
  followers: "フォロワー"
 | 
			
		||||
  is-bot: "このアカウントはBotです"
 | 
			
		||||
  years-old: "歳"
 | 
			
		||||
  year: "年"
 | 
			
		||||
  month: "月"
 | 
			
		||||
  day: "日"
 | 
			
		||||
desktop/views/pages/user/user.timeline.vue:
 | 
			
		||||
  default: "投稿"
 | 
			
		||||
  with-replies: "投稿と返信"
 | 
			
		||||
@@ -1057,7 +1103,6 @@ desktop/views/widgets/users.vue:
 | 
			
		||||
  refresh: "他を見る"
 | 
			
		||||
  no-one: "いません!"
 | 
			
		||||
mobile/views/components/drive.vue:
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  used: "使用中"
 | 
			
		||||
  folder-count: "フォルダ"
 | 
			
		||||
  count-separator: "、"
 | 
			
		||||
@@ -1161,7 +1206,6 @@ mobile/views/components/ui.nav.vue:
 | 
			
		||||
  messaging: "メッセージ"
 | 
			
		||||
  follow-requests: "フォロー申請"
 | 
			
		||||
  search: "検索"
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  favorites: "お気に入り"
 | 
			
		||||
  user-lists: "リスト"
 | 
			
		||||
  widgets: "ウィジェット"
 | 
			
		||||
@@ -1184,7 +1228,6 @@ mobile/views/pages/user-lists.vue:
 | 
			
		||||
  title: "リスト"
 | 
			
		||||
  enter-list-name: "リスト名を入力してください"
 | 
			
		||||
mobile/views/pages/drive.vue:
 | 
			
		||||
  drive: "ドライブ"
 | 
			
		||||
  more: "もっと見る"
 | 
			
		||||
mobile/views/pages/signup.vue:
 | 
			
		||||
  lets-start: "📦 始めましょう"
 | 
			
		||||
@@ -1284,6 +1327,7 @@ mobile/views/pages/settings.vue:
 | 
			
		||||
  signout: "サインアウト"
 | 
			
		||||
  sound: "サウンド"
 | 
			
		||||
  enable-sounds: "サウンドを有効にする"
 | 
			
		||||
  mark-as-read-all-unread-notes: "すべての投稿を既読にする"
 | 
			
		||||
mobile/views/pages/user.vue:
 | 
			
		||||
  follows-you: "フォローされています"
 | 
			
		||||
  following: "フォロー"
 | 
			
		||||
@@ -1293,8 +1337,10 @@ mobile/views/pages/user.vue:
 | 
			
		||||
  timeline: "タイムライン"
 | 
			
		||||
  media: "メディア"
 | 
			
		||||
  is-suspended: "このユーザーは凍結されています。"
 | 
			
		||||
  is-remote: "このユーザーはリモートユーザーです。"
 | 
			
		||||
  view-remote: "正確な情報を見る"
 | 
			
		||||
  mute: "ミュート"
 | 
			
		||||
  unmute: "ミュート解除"
 | 
			
		||||
  block: "ブロック"
 | 
			
		||||
  unblock: "ブロック解除"
 | 
			
		||||
mobile/views/pages/user/home.vue:
 | 
			
		||||
  recent-notes: "最近の投稿"
 | 
			
		||||
  images: "画像"
 | 
			
		||||
@@ -1340,3 +1386,29 @@ docs:
 | 
			
		||||
      description: "説明"
 | 
			
		||||
dev/views/index.vue:
 | 
			
		||||
  manage-apps: "アプリの管理"
 | 
			
		||||
dev/views/apps.vue:
 | 
			
		||||
  manage-apps: "アプリを管理"
 | 
			
		||||
  create-app: "アプリ作成"
 | 
			
		||||
  app-missing: "アプリなし"
 | 
			
		||||
dev/views/new-app.vue:
 | 
			
		||||
  create-app: "アプリケーションの作成"
 | 
			
		||||
  app-name: "アプリケーション名"
 | 
			
		||||
  app-name-desc: "あなたのアプリの名称。"
 | 
			
		||||
  app-name-ex: "ex) Misskey for iOS"
 | 
			
		||||
  app-overview: "アプリの概要"
 | 
			
		||||
  app-desc: "あなたのアプリの簡単な説明や紹介。"
 | 
			
		||||
  app-desc-ex: "ex) Misskey iOSクライアント。"
 | 
			
		||||
  callback-url: "コールバックURL (オプション)"
 | 
			
		||||
  callback-url-desc: "ユーザーが認証フォームで認証した際にリダイレクトするURLを設定できます。"
 | 
			
		||||
  authority: "権限"
 | 
			
		||||
  authority-desc: "ここで要求した機能だけがAPIからアクセスできます。"
 | 
			
		||||
  authority-warning: "アプリ作成後も変更できますが、新たな権限を付与する場合、その時点で関連付けられているユーザーキーはすべて無効になります。"
 | 
			
		||||
  account-read: "アカウントの情報を見る。"
 | 
			
		||||
  account-write: "アカウントの情報を操作する。"
 | 
			
		||||
  note-write: "投稿する。"
 | 
			
		||||
  reaction-write: "リアクションしたりリアクションをキャンセルする。"
 | 
			
		||||
  following-write: "フォローしたりフォロー解除する。"
 | 
			
		||||
  drive-read: "ドライブを見る。"
 | 
			
		||||
  drive-write: "ドライブを操作する。"
 | 
			
		||||
  notification-read: "通知を見る。"
 | 
			
		||||
  notification-write: "通知を操作する。"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										17556
									
								
								package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										17556
									
								
								package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										36
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										36
									
								
								package.json
									
									
									
									
									
								
							@@ -1,8 +1,8 @@
 | 
			
		||||
{
 | 
			
		||||
	"name": "misskey",
 | 
			
		||||
	"author": "syuilo <i@syuilo.com>",
 | 
			
		||||
	"version": "10.27.0",
 | 
			
		||||
	"clientVersion": "1.0.10768",
 | 
			
		||||
	"version": "10.35.1",
 | 
			
		||||
	"clientVersion": "1.0.11285",
 | 
			
		||||
	"codename": "nighthike",
 | 
			
		||||
	"main": "./built/index.js",
 | 
			
		||||
	"private": true,
 | 
			
		||||
@@ -58,7 +58,7 @@
 | 
			
		||||
		"@types/koa__cors": "2.2.3",
 | 
			
		||||
		"@types/minio": "7.0.0",
 | 
			
		||||
		"@types/mkdirp": "0.5.2",
 | 
			
		||||
		"@types/mocha": "5.2.3",
 | 
			
		||||
		"@types/mocha": "5.2.5",
 | 
			
		||||
		"@types/mongodb": "3.1.12",
 | 
			
		||||
		"@types/ms": "0.7.30",
 | 
			
		||||
		"@types/node": "10.12.0",
 | 
			
		||||
@@ -74,7 +74,7 @@
 | 
			
		||||
		"@types/sharp": "0.21.0",
 | 
			
		||||
		"@types/showdown": "1.7.5",
 | 
			
		||||
		"@types/single-line-log": "1.1.0",
 | 
			
		||||
		"@types/speakeasy": "2.0.2",
 | 
			
		||||
		"@types/speakeasy": "2.0.3",
 | 
			
		||||
		"@types/systeminformation": "3.23.0",
 | 
			
		||||
		"@types/tinycolor2": "1.4.1",
 | 
			
		||||
		"@types/tmp": "0.0.33",
 | 
			
		||||
@@ -84,6 +84,7 @@
 | 
			
		||||
		"@types/websocket": "0.0.40",
 | 
			
		||||
		"@types/ws": "6.0.1",
 | 
			
		||||
		"animejs": "2.2.0",
 | 
			
		||||
		"apexcharts": "2.1.6",
 | 
			
		||||
		"autobind-decorator": "2.1.0",
 | 
			
		||||
		"autosize": "4.0.2",
 | 
			
		||||
		"autwh": "0.1.0",
 | 
			
		||||
@@ -103,17 +104,15 @@
 | 
			
		||||
		"deep-equal": "1.0.1",
 | 
			
		||||
		"deepcopy": "0.6.3",
 | 
			
		||||
		"diskusage": "0.2.5",
 | 
			
		||||
		"dompurify": "1.0.5",
 | 
			
		||||
		"double-ended-queue": "2.1.0-0",
 | 
			
		||||
		"elasticsearch": "15.1.1",
 | 
			
		||||
		"emojilib": "2.3.0",
 | 
			
		||||
		"escape-regexp": "0.0.1",
 | 
			
		||||
		"eslint": "5.0.1",
 | 
			
		||||
		"eslint": "5.8.0",
 | 
			
		||||
		"eslint-plugin-vue": "4.7.1",
 | 
			
		||||
		"eventemitter3": "3.1.0",
 | 
			
		||||
		"exif-js": "2.3.0",
 | 
			
		||||
		"file-loader": "2.0.0",
 | 
			
		||||
		"file-type": "10.0.0",
 | 
			
		||||
		"file-type": "10.2.0",
 | 
			
		||||
		"fuckadblock": "3.2.1",
 | 
			
		||||
		"gulp": "3.9.1",
 | 
			
		||||
		"gulp-cssnano": "2.1.3",
 | 
			
		||||
@@ -130,8 +129,7 @@
 | 
			
		||||
		"gulp-uglify": "3.0.1",
 | 
			
		||||
		"gulp-util": "3.0.8",
 | 
			
		||||
		"hard-source-webpack-plugin": "0.12.0",
 | 
			
		||||
		"highlight.js": "9.12.0",
 | 
			
		||||
		"html-minifier": "3.5.20",
 | 
			
		||||
		"html-minifier": "3.5.21",
 | 
			
		||||
		"http-signature": "1.2.0",
 | 
			
		||||
		"insert-text-at-cursor": "0.1.1",
 | 
			
		||||
		"is-root": "2.0.0",
 | 
			
		||||
@@ -140,7 +138,7 @@
 | 
			
		||||
		"jsdom": "12.2.0",
 | 
			
		||||
		"json5": "2.1.0",
 | 
			
		||||
		"json5-loader": "1.0.1",
 | 
			
		||||
		"koa": "2.5.1",
 | 
			
		||||
		"koa": "2.6.1",
 | 
			
		||||
		"koa-bodyparser": "4.2.1",
 | 
			
		||||
		"koa-compress": "3.0.0",
 | 
			
		||||
		"koa-favicon": "2.0.1",
 | 
			
		||||
@@ -153,7 +151,6 @@
 | 
			
		||||
		"koa-slow": "2.1.0",
 | 
			
		||||
		"koa-views": "6.1.4",
 | 
			
		||||
		"loader-utils": "1.1.0",
 | 
			
		||||
		"lodash.assign": "4.2.0",
 | 
			
		||||
		"mecab-async": "0.1.2",
 | 
			
		||||
		"merge-options": "1.0.1",
 | 
			
		||||
		"minio": "7.0.1",
 | 
			
		||||
@@ -199,15 +196,15 @@
 | 
			
		||||
		"stylus": "0.54.5",
 | 
			
		||||
		"stylus-loader": "3.0.2",
 | 
			
		||||
		"summaly": "2.2.0",
 | 
			
		||||
		"systeminformation": "3.45.7",
 | 
			
		||||
		"systeminformation": "3.45.9",
 | 
			
		||||
		"syuilo-password-strength": "0.0.1",
 | 
			
		||||
		"textarea-caret": "3.1.0",
 | 
			
		||||
		"tinycolor2": "1.4.1",
 | 
			
		||||
		"tmp": "0.0.33",
 | 
			
		||||
		"ts-loader": "4.4.1",
 | 
			
		||||
		"ts-loader": "5.2.2",
 | 
			
		||||
		"ts-node": "7.0.1",
 | 
			
		||||
		"tslint": "5.10.0",
 | 
			
		||||
		"typescript": "2.9.2",
 | 
			
		||||
		"typescript": "3.1.4",
 | 
			
		||||
		"typescript-eslint-parser": "20.0.0",
 | 
			
		||||
		"uglify-es": "3.3.9",
 | 
			
		||||
		"url-loader": "1.1.2",
 | 
			
		||||
@@ -232,17 +229,10 @@
 | 
			
		||||
		"vuex-persistedstate": "2.5.4",
 | 
			
		||||
		"web-push": "3.3.3",
 | 
			
		||||
		"webfinger.js": "2.6.6",
 | 
			
		||||
		"webpack": "4.21.0",
 | 
			
		||||
		"webpack": "4.23.1",
 | 
			
		||||
		"webpack-cli": "3.1.2",
 | 
			
		||||
		"websocket": "1.0.28",
 | 
			
		||||
		"ws": "6.1.0",
 | 
			
		||||
		"xev": "2.0.1"
 | 
			
		||||
	},
 | 
			
		||||
	"greenkeeper": {
 | 
			
		||||
		"ignore": [
 | 
			
		||||
			"deepcopy",
 | 
			
		||||
			"cafy",
 | 
			
		||||
			"@types/gulp"
 | 
			
		||||
		]
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										122
									
								
								src/chart/drive.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										122
									
								
								src/chart/drive.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,122 @@
 | 
			
		||||
import autobind from 'autobind-decorator';
 | 
			
		||||
import Chart, { Obj } from './';
 | 
			
		||||
import DriveFile, { IDriveFile } from '../models/drive-file';
 | 
			
		||||
import { isLocalUser } from '../models/user';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ドライブに関するチャート
 | 
			
		||||
 */
 | 
			
		||||
type DriveLog = {
 | 
			
		||||
	local: {
 | 
			
		||||
		/**
 | 
			
		||||
		 * 集計期間時点での、全ドライブファイル数
 | 
			
		||||
		 */
 | 
			
		||||
		totalCount: number;
 | 
			
		||||
 | 
			
		||||
		/**
 | 
			
		||||
		 * 集計期間時点での、全ドライブファイルの合計サイズ
 | 
			
		||||
		 */
 | 
			
		||||
		totalSize: number;
 | 
			
		||||
 | 
			
		||||
		/**
 | 
			
		||||
		 * 増加したドライブファイル数
 | 
			
		||||
		 */
 | 
			
		||||
		incCount: number;
 | 
			
		||||
 | 
			
		||||
		/**
 | 
			
		||||
		 * 増加したドライブ使用量
 | 
			
		||||
		 */
 | 
			
		||||
		incSize: number;
 | 
			
		||||
 | 
			
		||||
		/**
 | 
			
		||||
		 * 減少したドライブファイル数
 | 
			
		||||
		 */
 | 
			
		||||
		decCount: number;
 | 
			
		||||
 | 
			
		||||
		/**
 | 
			
		||||
		 * 減少したドライブ使用量
 | 
			
		||||
		 */
 | 
			
		||||
		decSize: number;
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	remote: DriveLog['local'];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class DriveChart extends Chart<DriveLog> {
 | 
			
		||||
	constructor() {
 | 
			
		||||
		super('drive');
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
	protected async getTemplate(init: boolean, latest?: DriveLog): Promise<DriveLog> {
 | 
			
		||||
		const calcSize = (local: boolean) => DriveFile
 | 
			
		||||
			.aggregate([{
 | 
			
		||||
				$match: {
 | 
			
		||||
					'metadata._user.host': local ? null : { $ne: null },
 | 
			
		||||
					'metadata.deletedAt': { $exists: false }
 | 
			
		||||
				}
 | 
			
		||||
			}, {
 | 
			
		||||
				$project: {
 | 
			
		||||
					length: true
 | 
			
		||||
				}
 | 
			
		||||
			}, {
 | 
			
		||||
				$group: {
 | 
			
		||||
					_id: null,
 | 
			
		||||
					usage: { $sum: '$length' }
 | 
			
		||||
				}
 | 
			
		||||
			}])
 | 
			
		||||
			.then(res => res.length > 0 ? res[0].usage : 0);
 | 
			
		||||
 | 
			
		||||
		const [localCount, remoteCount, localSize, remoteSize] = init ? await Promise.all([
 | 
			
		||||
			DriveFile.count({ 'metadata._user.host': null }),
 | 
			
		||||
			DriveFile.count({ 'metadata._user.host': { $ne: null } }),
 | 
			
		||||
			calcSize(true),
 | 
			
		||||
			calcSize(false)
 | 
			
		||||
		]) : [
 | 
			
		||||
			latest ? latest.local.totalCount : 0,
 | 
			
		||||
			latest ? latest.remote.totalCount : 0,
 | 
			
		||||
			latest ? latest.local.totalSize : 0,
 | 
			
		||||
			latest ? latest.remote.totalSize : 0
 | 
			
		||||
		];
 | 
			
		||||
 | 
			
		||||
		return {
 | 
			
		||||
			local: {
 | 
			
		||||
				totalCount: localCount,
 | 
			
		||||
				totalSize: localSize,
 | 
			
		||||
				incCount: 0,
 | 
			
		||||
				incSize: 0,
 | 
			
		||||
				decCount: 0,
 | 
			
		||||
				decSize: 0
 | 
			
		||||
			},
 | 
			
		||||
			remote: {
 | 
			
		||||
				totalCount: remoteCount,
 | 
			
		||||
				totalSize: remoteSize,
 | 
			
		||||
				incCount: 0,
 | 
			
		||||
				incSize: 0,
 | 
			
		||||
				decCount: 0,
 | 
			
		||||
				decSize: 0
 | 
			
		||||
			}
 | 
			
		||||
		};
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
	public async update(file: IDriveFile, isAdditional: boolean) {
 | 
			
		||||
		const update: Obj = {};
 | 
			
		||||
 | 
			
		||||
		update.totalCount = isAdditional ? 1 : -1;
 | 
			
		||||
		update.totalSize = isAdditional ? file.length : -file.length;
 | 
			
		||||
		if (isAdditional) {
 | 
			
		||||
			update.incCount = 1;
 | 
			
		||||
			update.incSize = file.length;
 | 
			
		||||
		} else {
 | 
			
		||||
			update.decCount = 1;
 | 
			
		||||
			update.decSize = file.length;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		await this.inc({
 | 
			
		||||
			[isLocalUser(file.metadata._user) ? 'local' : 'remote']: update
 | 
			
		||||
		});
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default new DriveChart();
 | 
			
		||||
							
								
								
									
										66
									
								
								src/chart/federation.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								src/chart/federation.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,66 @@
 | 
			
		||||
import autobind from 'autobind-decorator';
 | 
			
		||||
import Chart, { Obj } from '.';
 | 
			
		||||
import Instance from '../models/instance';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * フェデレーションに関するチャート
 | 
			
		||||
 */
 | 
			
		||||
type FederationLog = {
 | 
			
		||||
	instance: {
 | 
			
		||||
		/**
 | 
			
		||||
		 * インスタンス数の合計
 | 
			
		||||
		 */
 | 
			
		||||
		total: number;
 | 
			
		||||
 | 
			
		||||
		/**
 | 
			
		||||
		 * 増加インスタンス数
 | 
			
		||||
		 */
 | 
			
		||||
		inc: number;
 | 
			
		||||
 | 
			
		||||
		/**
 | 
			
		||||
		 * 減少インスタンス数
 | 
			
		||||
		 */
 | 
			
		||||
		dec: number;
 | 
			
		||||
	};
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class FederationChart extends Chart<FederationLog> {
 | 
			
		||||
	constructor() {
 | 
			
		||||
		super('federation');
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
	protected async getTemplate(init: boolean, latest?: FederationLog): Promise<FederationLog> {
 | 
			
		||||
		const [total] = init ? await Promise.all([
 | 
			
		||||
			Instance.count({})
 | 
			
		||||
		]) : [
 | 
			
		||||
			latest ? latest.instance.total : 0
 | 
			
		||||
		];
 | 
			
		||||
 | 
			
		||||
		return {
 | 
			
		||||
			instance: {
 | 
			
		||||
				total: total,
 | 
			
		||||
				inc: 0,
 | 
			
		||||
				dec: 0
 | 
			
		||||
			}
 | 
			
		||||
		};
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
	public async update(isAdditional: boolean) {
 | 
			
		||||
		const update: Obj = {};
 | 
			
		||||
 | 
			
		||||
		update.total = isAdditional ? 1 : -1;
 | 
			
		||||
		if (isAdditional) {
 | 
			
		||||
			update.inc = 1;
 | 
			
		||||
		} else {
 | 
			
		||||
			update.dec = 1;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		await this.inc({
 | 
			
		||||
			instance: update
 | 
			
		||||
		});
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default new FederationChart();
 | 
			
		||||
							
								
								
									
										56
									
								
								src/chart/hashtag.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								src/chart/hashtag.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,56 @@
 | 
			
		||||
import autobind from 'autobind-decorator';
 | 
			
		||||
import Chart, { Obj } from './';
 | 
			
		||||
import { IUser, isLocalUser } from '../models/user';
 | 
			
		||||
import db from '../db/mongodb';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ハッシュタグに関するチャート
 | 
			
		||||
 */
 | 
			
		||||
type HashtagLog = {
 | 
			
		||||
	local: {
 | 
			
		||||
		/**
 | 
			
		||||
		 * 投稿された数
 | 
			
		||||
		 */
 | 
			
		||||
		count: number;
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	remote: HashtagLog['local'];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class HashtagChart extends Chart<HashtagLog> {
 | 
			
		||||
	constructor() {
 | 
			
		||||
		super('hashtag', true);
 | 
			
		||||
 | 
			
		||||
		// 後方互換性のため
 | 
			
		||||
		db.get('chart.hashtag').findOne().then(doc => {
 | 
			
		||||
			if (doc != null && doc.data.local == null) {
 | 
			
		||||
				db.get('chart.hashtag').drop();
 | 
			
		||||
			}
 | 
			
		||||
		});
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
	protected async getTemplate(init: boolean, latest?: HashtagLog): Promise<HashtagLog> {
 | 
			
		||||
		return {
 | 
			
		||||
			local: {
 | 
			
		||||
				count: 0
 | 
			
		||||
			},
 | 
			
		||||
			remote: {
 | 
			
		||||
				count: 0
 | 
			
		||||
			}
 | 
			
		||||
		};
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
	public async update(hashtag: string, user: IUser) {
 | 
			
		||||
		const update: Obj = {
 | 
			
		||||
			count: 1
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
		await this.incIfUnique({
 | 
			
		||||
			[isLocalUser(user) ? 'local' : 'remote']: update
 | 
			
		||||
		}, 'users', user._id.toHexString(), hashtag);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default new HashtagChart();
 | 
			
		||||
							
								
								
									
										306
									
								
								src/chart/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										306
									
								
								src/chart/index.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,306 @@
 | 
			
		||||
/**
 | 
			
		||||
 * チャートエンジン
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
const nestedProperty = require('nested-property');
 | 
			
		||||
import autobind from 'autobind-decorator';
 | 
			
		||||
import * as mongo from 'mongodb';
 | 
			
		||||
import db from '../db/mongodb';
 | 
			
		||||
import { ICollection } from 'monk';
 | 
			
		||||
 | 
			
		||||
export type Obj = { [key: string]: any };
 | 
			
		||||
 | 
			
		||||
export type Partial<T> = {
 | 
			
		||||
	[P in keyof T]?: Partial<T[P]>;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
type ArrayValue<T> = {
 | 
			
		||||
	[P in keyof T]: T[P] extends number ? Array<T[P]> : ArrayValue<T[P]>;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
type Span = 'day' | 'hour';
 | 
			
		||||
 | 
			
		||||
type Log<T extends Obj> = {
 | 
			
		||||
	_id: mongo.ObjectID;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * 集計のグループ
 | 
			
		||||
	 */
 | 
			
		||||
	group?: any;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * 集計日時
 | 
			
		||||
	 */
 | 
			
		||||
	date: Date;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * 集計期間
 | 
			
		||||
	 */
 | 
			
		||||
	span: Span;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * データ
 | 
			
		||||
	 */
 | 
			
		||||
	data: T;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * ユニークインクリメント用
 | 
			
		||||
	 */
 | 
			
		||||
	unique?: Obj;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 様々なチャートの管理を司るクラス
 | 
			
		||||
 */
 | 
			
		||||
export default abstract class Chart<T> {
 | 
			
		||||
	protected collection: ICollection<Log<T>>;
 | 
			
		||||
	protected abstract async getTemplate(init: boolean, latest?: T, group?: any): Promise<T>;
 | 
			
		||||
 | 
			
		||||
	constructor(name: string, grouped = false) {
 | 
			
		||||
		this.collection = db.get<Log<T>>(`chart.${name}`);
 | 
			
		||||
		if (grouped) {
 | 
			
		||||
			this.collection.createIndex({ span: -1, date: -1, group: -1 }, { unique: true });
 | 
			
		||||
		} else {
 | 
			
		||||
			this.collection.createIndex({ span: -1, date: -1 }, { unique: true });
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
	private convertQuery(x: Obj, path: string): Obj {
 | 
			
		||||
		const query: Obj = {};
 | 
			
		||||
 | 
			
		||||
		const dive = (x: Obj, path: string) => {
 | 
			
		||||
			Object.entries(x).forEach(([k, v]) => {
 | 
			
		||||
				const p = path ? `${path}.${k}` : k;
 | 
			
		||||
				if (typeof v === 'number') {
 | 
			
		||||
					query[p] = v;
 | 
			
		||||
				} else {
 | 
			
		||||
					dive(v, p);
 | 
			
		||||
				}
 | 
			
		||||
			});
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
		dive(x, path);
 | 
			
		||||
 | 
			
		||||
		return query;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
	private getCurrentDate(): [number, number, number, number] {
 | 
			
		||||
		const now = new Date();
 | 
			
		||||
 | 
			
		||||
		const y = now.getFullYear();
 | 
			
		||||
		const m = now.getMonth();
 | 
			
		||||
		const d = now.getDate();
 | 
			
		||||
		const h = now.getHours();
 | 
			
		||||
 | 
			
		||||
		return [y, m, d, h];
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
	private getLatestLog(span: Span, group?: any): Promise<Log<T>> {
 | 
			
		||||
		return this.collection.findOne({
 | 
			
		||||
			group: group,
 | 
			
		||||
			span: span
 | 
			
		||||
		}, {
 | 
			
		||||
			sort: {
 | 
			
		||||
				date: -1
 | 
			
		||||
			}
 | 
			
		||||
		});
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
	private async getCurrentLog(span: Span, group?: any): Promise<Log<T>> {
 | 
			
		||||
		const [y, m, d, h] = this.getCurrentDate();
 | 
			
		||||
 | 
			
		||||
		const current =
 | 
			
		||||
			span == 'day' ? new Date(y, m, d) :
 | 
			
		||||
			span == 'hour' ? new Date(y, m, d, h) :
 | 
			
		||||
			null;
 | 
			
		||||
 | 
			
		||||
		// 現在(今日または今のHour)のログ
 | 
			
		||||
		const currentLog = await this.collection.findOne({
 | 
			
		||||
			group: group,
 | 
			
		||||
			span: span,
 | 
			
		||||
			date: current
 | 
			
		||||
		});
 | 
			
		||||
 | 
			
		||||
		// ログがあればそれを返して終了
 | 
			
		||||
		if (currentLog != null) {
 | 
			
		||||
			return currentLog;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		let log: Log<T>;
 | 
			
		||||
		let data: T;
 | 
			
		||||
 | 
			
		||||
		// 集計期間が変わってから、初めてのチャート更新なら
 | 
			
		||||
		// 最も最近のログを持ってくる
 | 
			
		||||
		// * 例えば集計期間が「日」である場合で考えると、
 | 
			
		||||
		// * 昨日何もチャートを更新するような出来事がなかった場合は、
 | 
			
		||||
		// * ログがそもそも作られずドキュメントが存在しないということがあり得るため、
 | 
			
		||||
		// * 「昨日の」と決め打ちせずに「もっとも最近の」とします
 | 
			
		||||
		const latest = await this.getLatestLog(span, group);
 | 
			
		||||
 | 
			
		||||
		if (latest != null) {
 | 
			
		||||
			// 空ログデータを作成
 | 
			
		||||
			data = await this.getTemplate(false, latest.data);
 | 
			
		||||
		} else {
 | 
			
		||||
			// ログが存在しなかったら
 | 
			
		||||
			// (Misskeyインスタンスを建てて初めてのチャート更新時など
 | 
			
		||||
			// または何らかの理由でチャートコレクションを抹消した場合)
 | 
			
		||||
 | 
			
		||||
			// 初期ログデータを作成
 | 
			
		||||
			data = await this.getTemplate(true, null, group);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		try {
 | 
			
		||||
			// 新規ログ挿入
 | 
			
		||||
			log = await this.collection.insert({
 | 
			
		||||
				group: group,
 | 
			
		||||
				span: span,
 | 
			
		||||
				date: current,
 | 
			
		||||
				data: data
 | 
			
		||||
			});
 | 
			
		||||
		} catch (e) {
 | 
			
		||||
			// 11000 is duplicate key error
 | 
			
		||||
			// 並列動作している他のチャートエンジンプロセスと処理が重なる場合がある
 | 
			
		||||
			// その場合は再度最も新しいログを持ってくる
 | 
			
		||||
			if (e.code === 11000) {
 | 
			
		||||
				log = await this.getLatestLog(span, group);
 | 
			
		||||
			} else {
 | 
			
		||||
				console.error(e);
 | 
			
		||||
				throw e;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return log;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
	protected commit(query: Obj, group?: any, uniqueKey?: string, uniqueValue?: string): void {
 | 
			
		||||
		const update = (log: Log<T>) => {
 | 
			
		||||
			// ユニークインクリメントの場合、指定のキーに指定の値が既に存在していたら弾く
 | 
			
		||||
			if (
 | 
			
		||||
				uniqueKey &&
 | 
			
		||||
				log.unique &&
 | 
			
		||||
				log.unique[uniqueKey] &&
 | 
			
		||||
				log.unique[uniqueKey].includes(uniqueValue)
 | 
			
		||||
			) return;
 | 
			
		||||
 | 
			
		||||
			// ユニークインクリメントの指定のキーに値を追加
 | 
			
		||||
			if (uniqueKey) {
 | 
			
		||||
				query['$push'] = {
 | 
			
		||||
					[`unique.${uniqueKey}`]: uniqueValue
 | 
			
		||||
				};
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			// ログ更新
 | 
			
		||||
			this.collection.update({
 | 
			
		||||
				_id: log._id
 | 
			
		||||
			}, query);
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
		this.getCurrentLog('day', group).then(log => update(log));
 | 
			
		||||
		this.getCurrentLog('hour', group).then(log => update(log));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
	protected inc(inc: Partial<T>, group?: any): void {
 | 
			
		||||
		this.commit({
 | 
			
		||||
			$inc: this.convertQuery(inc, 'data')
 | 
			
		||||
		}, group);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
	protected incIfUnique(inc: Partial<T>, key: string, value: string, group?: any): void {
 | 
			
		||||
		this.commit({
 | 
			
		||||
			$inc: this.convertQuery(inc, 'data')
 | 
			
		||||
		}, group, key, value);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
	public async getChart(span: Span, range: number, group?: any): Promise<ArrayValue<T>> {
 | 
			
		||||
		const promisedChart: Promise<T>[] = [];
 | 
			
		||||
 | 
			
		||||
		const [y, m, d, h] = this.getCurrentDate();
 | 
			
		||||
 | 
			
		||||
		const gt =
 | 
			
		||||
			span == 'day' ? new Date(y, m, d - range) :
 | 
			
		||||
			span == 'hour' ? new Date(y, m, d, h - range) :
 | 
			
		||||
			null;
 | 
			
		||||
 | 
			
		||||
		// ログ取得
 | 
			
		||||
		const logs = await this.collection.find({
 | 
			
		||||
			group: group,
 | 
			
		||||
			span: span,
 | 
			
		||||
			date: {
 | 
			
		||||
				$gt: gt
 | 
			
		||||
			}
 | 
			
		||||
		}, {
 | 
			
		||||
			sort: {
 | 
			
		||||
				date: -1
 | 
			
		||||
			},
 | 
			
		||||
			fields: {
 | 
			
		||||
				_id: 0
 | 
			
		||||
			}
 | 
			
		||||
		});
 | 
			
		||||
 | 
			
		||||
		// 整形
 | 
			
		||||
		for (let i = (range - 1); i >= 0; i--) {
 | 
			
		||||
			const current =
 | 
			
		||||
				span == 'day' ? new Date(y, m, d - i) :
 | 
			
		||||
				span == 'hour' ? new Date(y, m, d, h - i) :
 | 
			
		||||
				null;
 | 
			
		||||
 | 
			
		||||
			const log = logs.find(l => l.date.getTime() == current.getTime());
 | 
			
		||||
 | 
			
		||||
			if (log) {
 | 
			
		||||
				promisedChart.unshift(Promise.resolve(log.data));
 | 
			
		||||
			} else {
 | 
			
		||||
				// 隙間埋め
 | 
			
		||||
				const latest = logs.find(l => l.date.getTime() < current.getTime());
 | 
			
		||||
				promisedChart.unshift(this.getTemplate(false, latest ? latest.data : null));
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		const chart = await Promise.all(promisedChart);
 | 
			
		||||
 | 
			
		||||
		const res: ArrayValue<T> = {} as any;
 | 
			
		||||
 | 
			
		||||
		/**
 | 
			
		||||
		 * [{
 | 
			
		||||
		 * 	xxxxx: 1,
 | 
			
		||||
		 * 	yyyyy: 5
 | 
			
		||||
		 * }, {
 | 
			
		||||
		 * 	xxxxx: 2,
 | 
			
		||||
		 * 	yyyyy: 6
 | 
			
		||||
		 * }, {
 | 
			
		||||
		 * 	xxxxx: 3,
 | 
			
		||||
		 * 	yyyyy: 7
 | 
			
		||||
		 * }]
 | 
			
		||||
		 *
 | 
			
		||||
		 * を
 | 
			
		||||
		 *
 | 
			
		||||
		 * {
 | 
			
		||||
		 * 	xxxxx: [1, 2, 3],
 | 
			
		||||
		 * 	yyyyy: [5, 6, 7]
 | 
			
		||||
		 * }
 | 
			
		||||
		 *
 | 
			
		||||
		 * にする
 | 
			
		||||
		 */
 | 
			
		||||
		const dive = (x: Obj, path?: string) => {
 | 
			
		||||
			Object.entries(x).forEach(([k, v]) => {
 | 
			
		||||
				const p = path ? `${path}.${k}` : k;
 | 
			
		||||
				if (typeof v == 'object') {
 | 
			
		||||
					dive(v, p);
 | 
			
		||||
				} else {
 | 
			
		||||
					nestedProperty.set(res, p, chart.map(s => nestedProperty.get(s, p)));
 | 
			
		||||
				}
 | 
			
		||||
			});
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
		dive(chart[0]);
 | 
			
		||||
 | 
			
		||||
		return res;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										64
									
								
								src/chart/network.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								src/chart/network.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,64 @@
 | 
			
		||||
import autobind from 'autobind-decorator';
 | 
			
		||||
import Chart, { Partial } from './';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ネットワークに関するチャート
 | 
			
		||||
 */
 | 
			
		||||
type NetworkLog = {
 | 
			
		||||
	/**
 | 
			
		||||
	 * 受信したリクエスト数
 | 
			
		||||
	 */
 | 
			
		||||
	incomingRequests: number;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * 送信したリクエスト数
 | 
			
		||||
	 */
 | 
			
		||||
	outgoingRequests: number;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * 応答時間の合計
 | 
			
		||||
	 * TIP: (totalTime / incomingRequests) でひとつのリクエストに平均でどれくらいの時間がかかったか知れる
 | 
			
		||||
	 */
 | 
			
		||||
	totalTime: number;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * 合計受信データ量
 | 
			
		||||
	 */
 | 
			
		||||
	incomingBytes: number;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * 合計送信データ量
 | 
			
		||||
	 */
 | 
			
		||||
	outgoingBytes: number;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class NetworkChart extends Chart<NetworkLog> {
 | 
			
		||||
	constructor() {
 | 
			
		||||
		super('network');
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
	protected async getTemplate(init: boolean, latest?: NetworkLog): Promise<NetworkLog> {
 | 
			
		||||
		return {
 | 
			
		||||
			incomingRequests: 0,
 | 
			
		||||
			outgoingRequests: 0,
 | 
			
		||||
			totalTime: 0,
 | 
			
		||||
			incomingBytes: 0,
 | 
			
		||||
			outgoingBytes: 0
 | 
			
		||||
		};
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
	public async update(incomingRequests: number, time: number, incomingBytes: number, outgoingBytes: number) {
 | 
			
		||||
		const inc: Partial<NetworkLog> = {
 | 
			
		||||
			incomingRequests: incomingRequests,
 | 
			
		||||
			totalTime: time,
 | 
			
		||||
			incomingBytes: incomingBytes,
 | 
			
		||||
			outgoingBytes: outgoingBytes
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
		await this.inc(inc);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default new NetworkChart();
 | 
			
		||||
							
								
								
									
										114
									
								
								src/chart/notes.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										114
									
								
								src/chart/notes.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,114 @@
 | 
			
		||||
import autobind from 'autobind-decorator';
 | 
			
		||||
import Chart, { Obj } from '.';
 | 
			
		||||
import Note, { INote } from '../models/note';
 | 
			
		||||
import { isLocalUser } from '../models/user';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 投稿に関するチャート
 | 
			
		||||
 */
 | 
			
		||||
type NotesLog = {
 | 
			
		||||
	local: {
 | 
			
		||||
		/**
 | 
			
		||||
		 * 集計期間時点での、全投稿数
 | 
			
		||||
		 */
 | 
			
		||||
		total: number;
 | 
			
		||||
 | 
			
		||||
		/**
 | 
			
		||||
		 * 増加した投稿数
 | 
			
		||||
		 */
 | 
			
		||||
		inc: number;
 | 
			
		||||
 | 
			
		||||
		/**
 | 
			
		||||
		 * 減少した投稿数
 | 
			
		||||
		 */
 | 
			
		||||
		dec: number;
 | 
			
		||||
 | 
			
		||||
		diffs: {
 | 
			
		||||
			/**
 | 
			
		||||
			 * 通常の投稿数の差分
 | 
			
		||||
			 */
 | 
			
		||||
			normal: number;
 | 
			
		||||
 | 
			
		||||
			/**
 | 
			
		||||
			 * リプライの投稿数の差分
 | 
			
		||||
			 */
 | 
			
		||||
			reply: number;
 | 
			
		||||
 | 
			
		||||
			/**
 | 
			
		||||
			 * Renoteの投稿数の差分
 | 
			
		||||
			 */
 | 
			
		||||
			renote: number;
 | 
			
		||||
		};
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	remote: NotesLog['local'];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class NotesChart extends Chart<NotesLog> {
 | 
			
		||||
	constructor() {
 | 
			
		||||
		super('notes');
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
	protected async getTemplate(init: boolean, latest?: NotesLog): Promise<NotesLog> {
 | 
			
		||||
		const [localCount, remoteCount] = init ? await Promise.all([
 | 
			
		||||
			Note.count({ '_user.host': null }),
 | 
			
		||||
			Note.count({ '_user.host': { $ne: null } })
 | 
			
		||||
		]) : [
 | 
			
		||||
			latest ? latest.local.total : 0,
 | 
			
		||||
			latest ? latest.remote.total : 0
 | 
			
		||||
		];
 | 
			
		||||
 | 
			
		||||
		return {
 | 
			
		||||
			local: {
 | 
			
		||||
				total: localCount,
 | 
			
		||||
				inc: 0,
 | 
			
		||||
				dec: 0,
 | 
			
		||||
				diffs: {
 | 
			
		||||
					normal: 0,
 | 
			
		||||
					reply: 0,
 | 
			
		||||
					renote: 0
 | 
			
		||||
				}
 | 
			
		||||
			},
 | 
			
		||||
			remote: {
 | 
			
		||||
				total: remoteCount,
 | 
			
		||||
				inc: 0,
 | 
			
		||||
				dec: 0,
 | 
			
		||||
				diffs: {
 | 
			
		||||
					normal: 0,
 | 
			
		||||
					reply: 0,
 | 
			
		||||
					renote: 0
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		};
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
	public async update(note: INote, isAdditional: boolean) {
 | 
			
		||||
		const update: Obj = {
 | 
			
		||||
			diffs: {}
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
		update.total = isAdditional ? 1 : -1;
 | 
			
		||||
 | 
			
		||||
		if (isAdditional) {
 | 
			
		||||
			update.inc = 1;
 | 
			
		||||
		} else {
 | 
			
		||||
			update.dec = 1;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (note.replyId != null) {
 | 
			
		||||
			update.diffs.reply = isAdditional ? 1 : -1;
 | 
			
		||||
		} else if (note.renoteId != null) {
 | 
			
		||||
			update.diffs.renote = isAdditional ? 1 : -1;
 | 
			
		||||
		} else {
 | 
			
		||||
			update.diffs.normal = isAdditional ? 1 : -1;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		await this.inc({
 | 
			
		||||
			[isLocalUser(note._user) ? 'local' : 'remote']: update
 | 
			
		||||
		});
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default new NotesChart();
 | 
			
		||||
							
								
								
									
										101
									
								
								src/chart/per-user-drive.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								src/chart/per-user-drive.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,101 @@
 | 
			
		||||
import autobind from 'autobind-decorator';
 | 
			
		||||
import Chart, { Obj } from './';
 | 
			
		||||
import DriveFile, { IDriveFile } from '../models/drive-file';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ユーザーごとのドライブに関するチャート
 | 
			
		||||
 */
 | 
			
		||||
type PerUserDriveLog = {
 | 
			
		||||
	/**
 | 
			
		||||
	 * 集計期間時点での、全ドライブファイル数
 | 
			
		||||
	 */
 | 
			
		||||
	totalCount: number;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * 集計期間時点での、全ドライブファイルの合計サイズ
 | 
			
		||||
	 */
 | 
			
		||||
	totalSize: number;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * 増加したドライブファイル数
 | 
			
		||||
	 */
 | 
			
		||||
	incCount: number;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * 増加したドライブ使用量
 | 
			
		||||
	 */
 | 
			
		||||
	incSize: number;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * 減少したドライブファイル数
 | 
			
		||||
	 */
 | 
			
		||||
	decCount: number;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * 減少したドライブ使用量
 | 
			
		||||
	 */
 | 
			
		||||
	decSize: number;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class PerUserDriveChart extends Chart<PerUserDriveLog> {
 | 
			
		||||
	constructor() {
 | 
			
		||||
		super('perUserDrive', true);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
	protected async getTemplate(init: boolean, latest?: PerUserDriveLog, group?: any): Promise<PerUserDriveLog> {
 | 
			
		||||
		const calcSize = () => DriveFile
 | 
			
		||||
			.aggregate([{
 | 
			
		||||
				$match: {
 | 
			
		||||
					'metadata.userId': group,
 | 
			
		||||
					'metadata.deletedAt': { $exists: false }
 | 
			
		||||
				}
 | 
			
		||||
			}, {
 | 
			
		||||
				$project: {
 | 
			
		||||
					length: true
 | 
			
		||||
				}
 | 
			
		||||
			}, {
 | 
			
		||||
				$group: {
 | 
			
		||||
					_id: null,
 | 
			
		||||
					usage: { $sum: '$length' }
 | 
			
		||||
				}
 | 
			
		||||
			}])
 | 
			
		||||
			.then(res => res.length > 0 ? res[0].usage : 0);
 | 
			
		||||
 | 
			
		||||
		const [count, size] = init ? await Promise.all([
 | 
			
		||||
			DriveFile.count({ 'metadata.userId': group }),
 | 
			
		||||
			calcSize()
 | 
			
		||||
		]) : [
 | 
			
		||||
			latest ? latest.totalCount : 0,
 | 
			
		||||
			latest ? latest.totalSize : 0
 | 
			
		||||
		];
 | 
			
		||||
 | 
			
		||||
		return {
 | 
			
		||||
			totalCount: count,
 | 
			
		||||
			totalSize: size,
 | 
			
		||||
			incCount: 0,
 | 
			
		||||
			incSize: 0,
 | 
			
		||||
			decCount: 0,
 | 
			
		||||
			decSize: 0
 | 
			
		||||
		};
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
	public async update(file: IDriveFile, isAdditional: boolean) {
 | 
			
		||||
		const update: Obj = {};
 | 
			
		||||
 | 
			
		||||
		update.totalCount = isAdditional ? 1 : -1;
 | 
			
		||||
		update.totalSize = isAdditional ? file.length : -file.length;
 | 
			
		||||
		if (isAdditional) {
 | 
			
		||||
			update.incCount = 1;
 | 
			
		||||
			update.incSize = file.length;
 | 
			
		||||
		} else {
 | 
			
		||||
			update.decCount = 1;
 | 
			
		||||
			update.decSize = file.length;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		await this.inc(update, file.metadata.userId);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default new PerUserDriveChart();
 | 
			
		||||
							
								
								
									
										128
									
								
								src/chart/per-user-following.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										128
									
								
								src/chart/per-user-following.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,128 @@
 | 
			
		||||
import autobind from 'autobind-decorator';
 | 
			
		||||
import Chart, { Obj } from './';
 | 
			
		||||
import Following from '../models/following';
 | 
			
		||||
import { IUser, isLocalUser } from '../models/user';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ユーザーごとのフォローに関するチャート
 | 
			
		||||
 */
 | 
			
		||||
type PerUserFollowingLog = {
 | 
			
		||||
	local: {
 | 
			
		||||
		/**
 | 
			
		||||
		 * フォローしている
 | 
			
		||||
		 */
 | 
			
		||||
		followings: {
 | 
			
		||||
			/**
 | 
			
		||||
			 * 合計
 | 
			
		||||
			 */
 | 
			
		||||
			total: number;
 | 
			
		||||
 | 
			
		||||
			/**
 | 
			
		||||
			 * フォローした数
 | 
			
		||||
			 */
 | 
			
		||||
			inc: number;
 | 
			
		||||
 | 
			
		||||
			/**
 | 
			
		||||
			 * フォロー解除した数
 | 
			
		||||
			 */
 | 
			
		||||
			dec: number;
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
		/**
 | 
			
		||||
		 * フォローされている
 | 
			
		||||
		 */
 | 
			
		||||
		followers: {
 | 
			
		||||
			/**
 | 
			
		||||
			 * 合計
 | 
			
		||||
			 */
 | 
			
		||||
			total: number;
 | 
			
		||||
 | 
			
		||||
			/**
 | 
			
		||||
			 * フォローされた数
 | 
			
		||||
			 */
 | 
			
		||||
			inc: number;
 | 
			
		||||
 | 
			
		||||
			/**
 | 
			
		||||
			 * フォロー解除された数
 | 
			
		||||
			 */
 | 
			
		||||
			dec: number;
 | 
			
		||||
		};
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	remote: PerUserFollowingLog['local'];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class PerUserFollowingChart extends Chart<PerUserFollowingLog> {
 | 
			
		||||
	constructor() {
 | 
			
		||||
		super('perUserFollowing', true);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
	protected async getTemplate(init: boolean, latest?: PerUserFollowingLog, group?: any): Promise<PerUserFollowingLog> {
 | 
			
		||||
		const [
 | 
			
		||||
			localFollowingsCount,
 | 
			
		||||
			localFollowersCount,
 | 
			
		||||
			remoteFollowingsCount,
 | 
			
		||||
			remoteFollowersCount
 | 
			
		||||
		] = init ? await Promise.all([
 | 
			
		||||
			Following.count({ followerId: group, '_followee.host': null }),
 | 
			
		||||
			Following.count({ followeeId: group, '_follower.host': null }),
 | 
			
		||||
			Following.count({ followerId: group, '_followee.host': { $ne: null } }),
 | 
			
		||||
			Following.count({ followeeId: group, '_follower.host': { $ne: null } })
 | 
			
		||||
		]) : [
 | 
			
		||||
			latest ? latest.local.followings.total : 0,
 | 
			
		||||
			latest ? latest.local.followers.total : 0,
 | 
			
		||||
			latest ? latest.remote.followings.total : 0,
 | 
			
		||||
			latest ? latest.remote.followers.total : 0
 | 
			
		||||
		];
 | 
			
		||||
 | 
			
		||||
		return {
 | 
			
		||||
			local: {
 | 
			
		||||
				followings: {
 | 
			
		||||
					total: localFollowingsCount,
 | 
			
		||||
					inc: 0,
 | 
			
		||||
					dec: 0
 | 
			
		||||
				},
 | 
			
		||||
				followers: {
 | 
			
		||||
					total: localFollowersCount,
 | 
			
		||||
					inc: 0,
 | 
			
		||||
					dec: 0
 | 
			
		||||
				}
 | 
			
		||||
			},
 | 
			
		||||
			remote: {
 | 
			
		||||
				followings: {
 | 
			
		||||
					total: remoteFollowingsCount,
 | 
			
		||||
					inc: 0,
 | 
			
		||||
					dec: 0
 | 
			
		||||
				},
 | 
			
		||||
				followers: {
 | 
			
		||||
					total: remoteFollowersCount,
 | 
			
		||||
					inc: 0,
 | 
			
		||||
					dec: 0
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		};
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
	public async update(follower: IUser, followee: IUser, isFollow: boolean) {
 | 
			
		||||
		const update: Obj = {};
 | 
			
		||||
 | 
			
		||||
		update.total = isFollow ? 1 : -1;
 | 
			
		||||
 | 
			
		||||
		if (isFollow) {
 | 
			
		||||
			update.inc = 1;
 | 
			
		||||
		} else {
 | 
			
		||||
			update.dec = 1;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		this.inc({
 | 
			
		||||
			[isLocalUser(follower) ? 'local' : 'remote']: { followings: update }
 | 
			
		||||
		}, follower._id);
 | 
			
		||||
		this.inc({
 | 
			
		||||
			[isLocalUser(followee) ? 'local' : 'remote']: { followers: update }
 | 
			
		||||
		}, followee._id);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default new PerUserFollowingChart();
 | 
			
		||||
							
								
								
									
										94
									
								
								src/chart/per-user-notes.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								src/chart/per-user-notes.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,94 @@
 | 
			
		||||
import autobind from 'autobind-decorator';
 | 
			
		||||
import Chart, { Obj } from './';
 | 
			
		||||
import Note, { INote } from '../models/note';
 | 
			
		||||
import { IUser } from '../models/user';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ユーザーごとの投稿に関するチャート
 | 
			
		||||
 */
 | 
			
		||||
type PerUserNotesLog = {
 | 
			
		||||
	/**
 | 
			
		||||
	 * 集計期間時点での、全投稿数
 | 
			
		||||
	 */
 | 
			
		||||
	total: number;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * 増加した投稿数
 | 
			
		||||
	 */
 | 
			
		||||
	inc: number;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * 減少した投稿数
 | 
			
		||||
	 */
 | 
			
		||||
	dec: number;
 | 
			
		||||
 | 
			
		||||
	diffs: {
 | 
			
		||||
		/**
 | 
			
		||||
		 * 通常の投稿数の差分
 | 
			
		||||
		 */
 | 
			
		||||
		normal: number;
 | 
			
		||||
 | 
			
		||||
		/**
 | 
			
		||||
		 * リプライの投稿数の差分
 | 
			
		||||
		 */
 | 
			
		||||
		reply: number;
 | 
			
		||||
 | 
			
		||||
		/**
 | 
			
		||||
		 * Renoteの投稿数の差分
 | 
			
		||||
		 */
 | 
			
		||||
		renote: number;
 | 
			
		||||
	};
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class PerUserNotesChart extends Chart<PerUserNotesLog> {
 | 
			
		||||
	constructor() {
 | 
			
		||||
		super('perUserNotes', true);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
	protected async getTemplate(init: boolean, latest?: PerUserNotesLog, group?: any): Promise<PerUserNotesLog> {
 | 
			
		||||
		const [count] = init ? await Promise.all([
 | 
			
		||||
			Note.count({ userId: group, deletedAt: null }),
 | 
			
		||||
		]) : [
 | 
			
		||||
			latest ? latest.total : 0
 | 
			
		||||
		];
 | 
			
		||||
 | 
			
		||||
		return {
 | 
			
		||||
			total: count,
 | 
			
		||||
			inc: 0,
 | 
			
		||||
			dec: 0,
 | 
			
		||||
			diffs: {
 | 
			
		||||
				normal: 0,
 | 
			
		||||
				reply: 0,
 | 
			
		||||
				renote: 0
 | 
			
		||||
			}
 | 
			
		||||
		};
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
	public async update(user: IUser, note: INote, isAdditional: boolean) {
 | 
			
		||||
		const update: Obj = {
 | 
			
		||||
			diffs: {}
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
		update.total = isAdditional ? 1 : -1;
 | 
			
		||||
 | 
			
		||||
		if (isAdditional) {
 | 
			
		||||
			update.inc = 1;
 | 
			
		||||
		} else {
 | 
			
		||||
			update.dec = 1;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (note.replyId != null) {
 | 
			
		||||
			update.diffs.reply = isAdditional ? 1 : -1;
 | 
			
		||||
		} else if (note.renoteId != null) {
 | 
			
		||||
			update.diffs.renote = isAdditional ? 1 : -1;
 | 
			
		||||
		} else {
 | 
			
		||||
			update.diffs.normal = isAdditional ? 1 : -1;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		await this.inc(update, user._id);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default new PerUserNotesChart();
 | 
			
		||||
							
								
								
									
										45
									
								
								src/chart/per-user-reactions.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								src/chart/per-user-reactions.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,45 @@
 | 
			
		||||
import autobind from 'autobind-decorator';
 | 
			
		||||
import Chart from './';
 | 
			
		||||
import { IUser, isLocalUser } from '../models/user';
 | 
			
		||||
import { INote } from '../models/note';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ユーザーごとのリアクションに関するチャート
 | 
			
		||||
 */
 | 
			
		||||
type PerUserReactionsLog = {
 | 
			
		||||
	local: {
 | 
			
		||||
		/**
 | 
			
		||||
		 * リアクションされた数
 | 
			
		||||
		 */
 | 
			
		||||
		count: number;
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	remote: PerUserReactionsLog['local'];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class PerUserReactionsChart extends Chart<PerUserReactionsLog> {
 | 
			
		||||
	constructor() {
 | 
			
		||||
		super('perUserReaction', true);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
	protected async getTemplate(init: boolean, latest?: PerUserReactionsLog, group?: any): Promise<PerUserReactionsLog> {
 | 
			
		||||
		return {
 | 
			
		||||
			local: {
 | 
			
		||||
				count: 0
 | 
			
		||||
			},
 | 
			
		||||
			remote: {
 | 
			
		||||
				count: 0
 | 
			
		||||
			}
 | 
			
		||||
		};
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
	public async update(user: IUser, note: INote) {
 | 
			
		||||
		this.inc({
 | 
			
		||||
			[isLocalUser(user) ? 'local' : 'remote']: { count: 1 }
 | 
			
		||||
		}, note.userId);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default new PerUserReactionsChart();
 | 
			
		||||
							
								
								
									
										75
									
								
								src/chart/users.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								src/chart/users.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,75 @@
 | 
			
		||||
import autobind from 'autobind-decorator';
 | 
			
		||||
import Chart, { Obj } from './';
 | 
			
		||||
import User, { IUser, isLocalUser } from '../models/user';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ユーザーに関するチャート
 | 
			
		||||
 */
 | 
			
		||||
type UsersLog = {
 | 
			
		||||
	local: {
 | 
			
		||||
		/**
 | 
			
		||||
		 * 集計期間時点での、全ユーザー数
 | 
			
		||||
		 */
 | 
			
		||||
		total: number;
 | 
			
		||||
 | 
			
		||||
		/**
 | 
			
		||||
		 * 増加したユーザー数
 | 
			
		||||
		 */
 | 
			
		||||
		inc: number;
 | 
			
		||||
 | 
			
		||||
		/**
 | 
			
		||||
		 * 減少したユーザー数
 | 
			
		||||
		 */
 | 
			
		||||
		dec: number;
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	remote: UsersLog['local'];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class UsersChart extends Chart<UsersLog> {
 | 
			
		||||
	constructor() {
 | 
			
		||||
		super('users');
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
	protected async getTemplate(init: boolean, latest?: UsersLog): Promise<UsersLog> {
 | 
			
		||||
		const [localCount, remoteCount] = init ? await Promise.all([
 | 
			
		||||
			User.count({ host: null }),
 | 
			
		||||
			User.count({ host: { $ne: null } })
 | 
			
		||||
		]) : [
 | 
			
		||||
			latest ? latest.local.total : 0,
 | 
			
		||||
			latest ? latest.remote.total : 0
 | 
			
		||||
		];
 | 
			
		||||
 | 
			
		||||
		return {
 | 
			
		||||
			local: {
 | 
			
		||||
				total: localCount,
 | 
			
		||||
				inc: 0,
 | 
			
		||||
				dec: 0
 | 
			
		||||
			},
 | 
			
		||||
			remote: {
 | 
			
		||||
				total: remoteCount,
 | 
			
		||||
				inc: 0,
 | 
			
		||||
				dec: 0
 | 
			
		||||
			}
 | 
			
		||||
		};
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
	public async update(user: IUser, isAdditional: boolean) {
 | 
			
		||||
		const update: Obj = {};
 | 
			
		||||
 | 
			
		||||
		update.total = isAdditional ? 1 : -1;
 | 
			
		||||
		if (isAdditional) {
 | 
			
		||||
			update.inc = 1;
 | 
			
		||||
		} else {
 | 
			
		||||
			update.dec = 1;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		await this.inc({
 | 
			
		||||
			[isLocalUser(user) ? 'local' : 'remote']: update
 | 
			
		||||
		});
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default new UsersChart();
 | 
			
		||||
@@ -37,10 +37,6 @@ export default (opts: Opts = {}) => ({
 | 
			
		||||
				'ctrl+q': this.renoteDirectly,
 | 
			
		||||
				'up|k|shift+tab': this.focusBefore,
 | 
			
		||||
				'down|j|tab': this.focusAfter,
 | 
			
		||||
				'shift+up': () => this.$emit('parentFocus', 'up'),
 | 
			
		||||
				'shift+down': () => this.$emit('parentFocus', 'down'),
 | 
			
		||||
				'shift+left': () => this.$emit('parentFocus', 'left'),
 | 
			
		||||
				'shift+right': () => this.$emit('parentFocus', 'right'),
 | 
			
		||||
				'esc': this.blur,
 | 
			
		||||
				'm|o': () => this.menu(true),
 | 
			
		||||
				's': this.toggleShowContent,
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										72
									
								
								src/client/app/common/views/components/api-settings.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								src/client/app/common/views/components/api-settings.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,72 @@
 | 
			
		||||
<template>
 | 
			
		||||
<ui-card>
 | 
			
		||||
	<div slot="title">%fa:key% API</div>
 | 
			
		||||
 | 
			
		||||
	<section class="fit-top">
 | 
			
		||||
		<ui-input :value="$store.state.i.token" readonly>
 | 
			
		||||
			<span>%i18n:@token%</span>
 | 
			
		||||
		</ui-input>
 | 
			
		||||
		<p>%i18n:@intro%</p>
 | 
			
		||||
		<ui-info warn>%i18n:@caution%</ui-info>
 | 
			
		||||
		<p>%i18n:@regeneration-of-token%</p>
 | 
			
		||||
		<ui-button @click="regenerateToken">%fa:sync-alt% %i18n:@regenerate-token%</ui-button>
 | 
			
		||||
	</section>
 | 
			
		||||
 | 
			
		||||
	<section>
 | 
			
		||||
		<header>%fa:terminal% %i18n:@console.title%</header>
 | 
			
		||||
		<ui-input v-model="endpoint">
 | 
			
		||||
			<span>%i18n:@console.endpoint%</span>
 | 
			
		||||
		</ui-input>
 | 
			
		||||
		<ui-textarea v-model="body">
 | 
			
		||||
			<span>%i18n:@console.parameter% (JSON or JSON5)</span>
 | 
			
		||||
		</ui-textarea>
 | 
			
		||||
		<ui-button @click="send" :disabled="sending">
 | 
			
		||||
			<template v-if="sending">%i18n:@console.sending%</template>
 | 
			
		||||
			<template v-else>%fa:paper-plane% %i18n:@console.send%</template>
 | 
			
		||||
		</ui-button>
 | 
			
		||||
		<ui-textarea v-if="res" v-model="res" readonly tall>
 | 
			
		||||
			<span>%i18n:@console.response%</span>
 | 
			
		||||
		</ui-textarea>
 | 
			
		||||
	</section>
 | 
			
		||||
</ui-card>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
import Vue from 'vue';
 | 
			
		||||
import * as JSON5 from 'json5';
 | 
			
		||||
 | 
			
		||||
export default Vue.extend({
 | 
			
		||||
	data() {
 | 
			
		||||
		return {
 | 
			
		||||
			endpoint: '',
 | 
			
		||||
			body: '{}',
 | 
			
		||||
			res: null,
 | 
			
		||||
			sending: false
 | 
			
		||||
		};
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	methods: {
 | 
			
		||||
		regenerateToken() {
 | 
			
		||||
			(this as any).apis.input({
 | 
			
		||||
				title: '%i18n:@enter-password%',
 | 
			
		||||
				type: 'password'
 | 
			
		||||
			}).then(password => {
 | 
			
		||||
				(this as any).api('i/regenerate_token', {
 | 
			
		||||
					password: password
 | 
			
		||||
				});
 | 
			
		||||
			});
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		send() {
 | 
			
		||||
			this.sending = true;
 | 
			
		||||
			(this as any).api(this.endpoint, JSON5.parse(this.body)).then(res => {
 | 
			
		||||
				this.sending = false;
 | 
			
		||||
				this.res = JSON5.stringify(res, null, 2);
 | 
			
		||||
			}, err => {
 | 
			
		||||
				this.sending = false;
 | 
			
		||||
				this.res = JSON5.stringify(err, null, 2);
 | 
			
		||||
			});
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
							
								
								
									
										171
									
								
								src/client/app/common/views/components/drive-settings.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										171
									
								
								src/client/app/common/views/components/drive-settings.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,171 @@
 | 
			
		||||
<template>
 | 
			
		||||
<ui-card>
 | 
			
		||||
	<div slot="title">%fa:cloud% %i18n:common.drive%</div>
 | 
			
		||||
 | 
			
		||||
	<section v-if="!fetching" class="juakhbxthdewydyreaphkepoxgxvfogn">
 | 
			
		||||
		<div class="meter"><div :style="meterStyle"></div></div>
 | 
			
		||||
		<p>%i18n:@max%: <b>{{ capacity | bytes }}</b> %i18n:@in-use%: <b>{{ usage | bytes }}</b></p>
 | 
			
		||||
	</section>
 | 
			
		||||
 | 
			
		||||
	<section>
 | 
			
		||||
		<header>%i18n:@stats%</header>
 | 
			
		||||
		<div ref="chart" style="margin-bottom: -16px; color: #000;"></div>
 | 
			
		||||
	</section>
 | 
			
		||||
</ui-card>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
import Vue from 'vue';
 | 
			
		||||
import * as tinycolor from 'tinycolor2';
 | 
			
		||||
import * as ApexCharts from 'apexcharts';
 | 
			
		||||
 | 
			
		||||
export default Vue.extend({
 | 
			
		||||
	data() {
 | 
			
		||||
		return {
 | 
			
		||||
			fetching: true,
 | 
			
		||||
			usage: null,
 | 
			
		||||
			capacity: null
 | 
			
		||||
		};
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	computed: {
 | 
			
		||||
		meterStyle(): any {
 | 
			
		||||
			return {
 | 
			
		||||
				width: `${this.usage / this.capacity * 100}%`,
 | 
			
		||||
				background: tinycolor({
 | 
			
		||||
					h: 180 - (this.usage / this.capacity * 180),
 | 
			
		||||
					s: 0.7,
 | 
			
		||||
					l: 0.5
 | 
			
		||||
				})
 | 
			
		||||
			};
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	mounted() {
 | 
			
		||||
		(this as any).api('drive').then(info => {
 | 
			
		||||
			this.capacity = info.capacity;
 | 
			
		||||
			this.usage = info.usage;
 | 
			
		||||
			this.fetching = false;
 | 
			
		||||
 | 
			
		||||
			this.$nextTick(() => {
 | 
			
		||||
				this.renderChart();
 | 
			
		||||
			});
 | 
			
		||||
		});
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	methods: {
 | 
			
		||||
		renderChart() {
 | 
			
		||||
			(this as any).api('charts/user/drive', {
 | 
			
		||||
				userId: this.$store.state.i.id,
 | 
			
		||||
				span: 'day',
 | 
			
		||||
				limit: 21
 | 
			
		||||
			}).then(stats => {
 | 
			
		||||
				const addition = [];
 | 
			
		||||
				const deletion = [];
 | 
			
		||||
 | 
			
		||||
				const now = new Date();
 | 
			
		||||
				const y = now.getFullYear();
 | 
			
		||||
				const m = now.getMonth();
 | 
			
		||||
				const d = now.getDate();
 | 
			
		||||
 | 
			
		||||
				for (let i = 0; i < 21; i++) {
 | 
			
		||||
					const x = new Date(y, m, d - i);
 | 
			
		||||
					addition.push([
 | 
			
		||||
						x,
 | 
			
		||||
						stats.incSize[i]
 | 
			
		||||
					]);
 | 
			
		||||
					deletion.push([
 | 
			
		||||
						x,
 | 
			
		||||
						-stats.decSize[i]
 | 
			
		||||
					]);
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				const chart = new ApexCharts(this.$refs.chart, {
 | 
			
		||||
					chart: {
 | 
			
		||||
						type: 'bar',
 | 
			
		||||
						stacked: true,
 | 
			
		||||
						height: 150,
 | 
			
		||||
						zoom: {
 | 
			
		||||
							enabled: false
 | 
			
		||||
						}
 | 
			
		||||
					},
 | 
			
		||||
					plotOptions: {
 | 
			
		||||
						bar: {
 | 
			
		||||
							columnWidth: '90%',
 | 
			
		||||
							endingShape: 'rounded'
 | 
			
		||||
						}
 | 
			
		||||
					},
 | 
			
		||||
					grid: {
 | 
			
		||||
						clipMarkers: false,
 | 
			
		||||
						borderColor: 'rgba(0, 0, 0, 0.1)'
 | 
			
		||||
					},
 | 
			
		||||
					tooltip: {
 | 
			
		||||
						shared: true,
 | 
			
		||||
						intersect: false
 | 
			
		||||
					},
 | 
			
		||||
					dataLabels: {
 | 
			
		||||
						enabled: false
 | 
			
		||||
					},
 | 
			
		||||
					legend: {
 | 
			
		||||
						show: false
 | 
			
		||||
					},
 | 
			
		||||
					series: [{
 | 
			
		||||
						name: 'Additions',
 | 
			
		||||
						data: addition
 | 
			
		||||
					}, {
 | 
			
		||||
						name: 'Deletions',
 | 
			
		||||
						data: deletion
 | 
			
		||||
					}],
 | 
			
		||||
					xaxis: {
 | 
			
		||||
						type: 'datetime',
 | 
			
		||||
						labels: {
 | 
			
		||||
							style: {
 | 
			
		||||
								colors: tinycolor(getComputedStyle(document.documentElement).getPropertyValue('--text')).toRgbString()
 | 
			
		||||
							}
 | 
			
		||||
						},
 | 
			
		||||
						axisBorder: {
 | 
			
		||||
							color: 'rgba(0, 0, 0, 0.1)'
 | 
			
		||||
						},
 | 
			
		||||
						axisTicks: {
 | 
			
		||||
							color: 'rgba(0, 0, 0, 0.1)'
 | 
			
		||||
						},
 | 
			
		||||
						crosshairs: {
 | 
			
		||||
							width: 1,
 | 
			
		||||
							opacity: 1
 | 
			
		||||
						}
 | 
			
		||||
					},
 | 
			
		||||
					yaxis: {
 | 
			
		||||
						labels: {
 | 
			
		||||
							formatter: v => Vue.filter('bytes')(v, 0),
 | 
			
		||||
							style: {
 | 
			
		||||
								color: tinycolor(getComputedStyle(document.documentElement).getPropertyValue('--text')).toRgbString()
 | 
			
		||||
							}
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				});
 | 
			
		||||
 | 
			
		||||
				chart.render();
 | 
			
		||||
			});
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="stylus" scoped>
 | 
			
		||||
.juakhbxthdewydyreaphkepoxgxvfogn
 | 
			
		||||
	> .meter
 | 
			
		||||
		$size = 12px
 | 
			
		||||
 | 
			
		||||
		margin-bottom 16px
 | 
			
		||||
		background rgba(0, 0, 0, 0.1)
 | 
			
		||||
		border-radius ($size / 2)
 | 
			
		||||
		overflow hidden
 | 
			
		||||
 | 
			
		||||
		> div
 | 
			
		||||
			height $size
 | 
			
		||||
			border-radius ($size / 2)
 | 
			
		||||
 | 
			
		||||
	> p
 | 
			
		||||
		margin 0
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
							
								
								
									
										19
									
								
								src/client/app/common/views/components/error.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								src/client/app/common/views/components/error.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
			
		||||
<template>
 | 
			
		||||
<div class="wjqjnyhzogztorhrdgcpqlkxhkmuetgj">
 | 
			
		||||
	<p>%fa:exclamation-triangle% %i18n:common.error.title%</p>
 | 
			
		||||
	<ui-button @click="() => $emit('retry')">%i18n:common.error.retry%</ui-button>
 | 
			
		||||
</div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<style lang="stylus" scoped>
 | 
			
		||||
.wjqjnyhzogztorhrdgcpqlkxhkmuetgj
 | 
			
		||||
	max-width 350px
 | 
			
		||||
	margin 0 auto
 | 
			
		||||
	padding 32px
 | 
			
		||||
	text-align center
 | 
			
		||||
	color var(--text)
 | 
			
		||||
 | 
			
		||||
	> p
 | 
			
		||||
		margin 0 0 8px 0
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
@@ -1,5 +1,9 @@
 | 
			
		||||
import Vue from 'vue';
 | 
			
		||||
 | 
			
		||||
import muteAndBlock from './mute-and-block.vue';
 | 
			
		||||
import error from './error.vue';
 | 
			
		||||
import apiSettings from './api-settings.vue';
 | 
			
		||||
import driveSettings from './drive-settings.vue';
 | 
			
		||||
import profileEditor from './profile-editor.vue';
 | 
			
		||||
import noteSkeleton from './note-skeleton.vue';
 | 
			
		||||
import theme from './theme.vue';
 | 
			
		||||
@@ -43,9 +47,14 @@ import uiTextarea from './ui/textarea.vue';
 | 
			
		||||
import uiSwitch from './ui/switch.vue';
 | 
			
		||||
import uiRadio from './ui/radio.vue';
 | 
			
		||||
import uiSelect from './ui/select.vue';
 | 
			
		||||
import uiInfo from './ui/info.vue';
 | 
			
		||||
import formButton from './ui/form/button.vue';
 | 
			
		||||
import formRadio from './ui/form/radio.vue';
 | 
			
		||||
 | 
			
		||||
Vue.component('mk-mute-and-block', muteAndBlock);
 | 
			
		||||
Vue.component('mk-error', error);
 | 
			
		||||
Vue.component('mk-api-settings', apiSettings);
 | 
			
		||||
Vue.component('mk-drive-settings', driveSettings);
 | 
			
		||||
Vue.component('mk-profile-editor', profileEditor);
 | 
			
		||||
Vue.component('mk-note-skeleton', noteSkeleton);
 | 
			
		||||
Vue.component('mk-theme', theme);
 | 
			
		||||
@@ -89,5 +98,6 @@ Vue.component('ui-textarea', uiTextarea);
 | 
			
		||||
Vue.component('ui-switch', uiSwitch);
 | 
			
		||||
Vue.component('ui-radio', uiRadio);
 | 
			
		||||
Vue.component('ui-select', uiSelect);
 | 
			
		||||
Vue.component('ui-info', uiInfo);
 | 
			
		||||
Vue.component('form-button', formButton);
 | 
			
		||||
Vue.component('form-radio', formRadio);
 | 
			
		||||
 
 | 
			
		||||
@@ -114,10 +114,9 @@ export default Vue.component('misskey-flavored-markdown', {
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				case 'mention': {
 | 
			
		||||
					return (createElement as any)('a', {
 | 
			
		||||
					return (createElement as any)('router-link', {
 | 
			
		||||
						attrs: {
 | 
			
		||||
							href: `${url}/${token.canonical}`,
 | 
			
		||||
							target: '_blank',
 | 
			
		||||
							to: `/${token.canonical}`,
 | 
			
		||||
							dataIsMe: (this as any).i && getAcct((this as any).i) == getAcct(token),
 | 
			
		||||
							style: 'color:var(--mfmMention);'
 | 
			
		||||
						},
 | 
			
		||||
@@ -129,10 +128,9 @@ export default Vue.component('misskey-flavored-markdown', {
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				case 'hashtag': {
 | 
			
		||||
					return [createElement('a', {
 | 
			
		||||
					return [createElement('router-link', {
 | 
			
		||||
						attrs: {
 | 
			
		||||
							href: `${url}/tags/${encodeURIComponent(token.hashtag)}`,
 | 
			
		||||
							target: '_blank',
 | 
			
		||||
							to: `/tags/${encodeURIComponent(token.hashtag)}`,
 | 
			
		||||
							style: 'color:var(--mfmHashtag);'
 | 
			
		||||
						}
 | 
			
		||||
					}, token.content)];
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										52
									
								
								src/client/app/common/views/components/mute-and-block.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								src/client/app/common/views/components/mute-and-block.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,52 @@
 | 
			
		||||
<template>
 | 
			
		||||
<ui-card>
 | 
			
		||||
	<div slot="title">%fa:ban% %i18n:@mute-and-block%</div>
 | 
			
		||||
 | 
			
		||||
	<section>
 | 
			
		||||
		<header>%i18n:@mute%</header>
 | 
			
		||||
		<ui-info v-if="!muteFetching && mute.length == 0">%i18n:@no-muted-users%</ui-info>
 | 
			
		||||
		<div class="users" v-if="mute.length != 0">
 | 
			
		||||
			<div v-for="user in mute" :key="user.id">
 | 
			
		||||
				<p><b>{{ user | userName }}</b> @{{ user | acct }}</p>
 | 
			
		||||
			</div>
 | 
			
		||||
		</div>
 | 
			
		||||
	</section>
 | 
			
		||||
 | 
			
		||||
	<section>
 | 
			
		||||
		<header>%i18n:@block%</header>
 | 
			
		||||
		<ui-info v-if="!blockFetching && block.length == 0">%i18n:@no-blocked-users%</ui-info>
 | 
			
		||||
		<div class="users" v-if="block.length != 0">
 | 
			
		||||
			<div v-for="user in block" :key="user.id">
 | 
			
		||||
				<p><b>{{ user | userName }}</b> @{{ user | acct }}</p>
 | 
			
		||||
			</div>
 | 
			
		||||
		</div>
 | 
			
		||||
	</section>
 | 
			
		||||
</ui-card>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
import Vue from 'vue';
 | 
			
		||||
 | 
			
		||||
export default Vue.extend({
 | 
			
		||||
	data() {
 | 
			
		||||
		return {
 | 
			
		||||
			muteFetching: true,
 | 
			
		||||
			blockFetching: true,
 | 
			
		||||
			mute: [],
 | 
			
		||||
			block: []
 | 
			
		||||
		};
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	mounted() {
 | 
			
		||||
		(this as any).api('mute/list').then(mute => {
 | 
			
		||||
			this.mute = mute.map(x => x.mutee);
 | 
			
		||||
			this.muteFetching = false;
 | 
			
		||||
		});
 | 
			
		||||
 | 
			
		||||
		(this as any).api('blocking/list').then(blocking => {
 | 
			
		||||
			this.block = blocking.map(x => x.blockee);
 | 
			
		||||
			this.blockFetching = false;
 | 
			
		||||
		});
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
@@ -2,11 +2,11 @@
 | 
			
		||||
<header class="bvonvjxbwzaiskogyhbwgyxvcgserpmu">
 | 
			
		||||
	<mk-avatar class="avatar" :user="note.user" v-if="$store.state.device.postStyle == 'smart'"/>
 | 
			
		||||
	<router-link class="name" :to="note.user | userPage" v-user-preview="note.user.id">{{ note.user | userName }}</router-link>
 | 
			
		||||
	<span class="is-verified" v-if="note.user.isVerified" title="%i18n:common.verified-user%">%fa:star%</span>
 | 
			
		||||
	<span class="is-admin" v-if="note.user.isAdmin">admin</span>
 | 
			
		||||
	<span class="is-bot" v-if="note.user.isBot">bot</span>
 | 
			
		||||
	<span class="is-cat" v-if="note.user.isCat">cat</span>
 | 
			
		||||
	<span class="username"><mk-acct :user="note.user"/></span>
 | 
			
		||||
	<span class="is-verified" v-if="note.user.isVerified" title="%i18n:common.verified-user%">%fa:star%</span>
 | 
			
		||||
	<div class="info">
 | 
			
		||||
		<span class="app" v-if="note.app && !mini">via <b>{{ note.app.name }}</b></span>
 | 
			
		||||
		<span class="mobile" v-if="note.viaMobile">%fa:mobile-alt%</span>
 | 
			
		||||
@@ -68,10 +68,6 @@ export default Vue.extend({
 | 
			
		||||
		&:hover
 | 
			
		||||
			text-decoration underline
 | 
			
		||||
 | 
			
		||||
	> .is-verified
 | 
			
		||||
		margin-right 8px
 | 
			
		||||
		color #4dabf7
 | 
			
		||||
 | 
			
		||||
	> .is-admin
 | 
			
		||||
	> .is-bot
 | 
			
		||||
	> .is-cat
 | 
			
		||||
@@ -95,6 +91,10 @@ export default Vue.extend({
 | 
			
		||||
		color var(--noteHeaderAcct)
 | 
			
		||||
		flex-shrink 2147483647
 | 
			
		||||
 | 
			
		||||
	> .is-verified
 | 
			
		||||
		margin 0 .5em 0 0
 | 
			
		||||
		color #4dabf7
 | 
			
		||||
 | 
			
		||||
	> .info
 | 
			
		||||
		margin-left auto
 | 
			
		||||
		font-size 0.9em
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										43
									
								
								src/client/app/common/views/components/ui/info.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								src/client/app/common/views/components/ui/info.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,43 @@
 | 
			
		||||
<template>
 | 
			
		||||
<div class="ymxyweixqwsxauxldgpvecjepnwxbylu" :class="{ warn }">
 | 
			
		||||
	<i v-if="warn">%fa:exclamation-triangle%</i>
 | 
			
		||||
	<i v-else>%fa:info-circle%</i>
 | 
			
		||||
	<slot></slot>
 | 
			
		||||
</div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
import Vue from 'vue';
 | 
			
		||||
export default Vue.extend({
 | 
			
		||||
	props: {
 | 
			
		||||
		warn: {
 | 
			
		||||
			type: Boolean,
 | 
			
		||||
			required: false,
 | 
			
		||||
			default: false
 | 
			
		||||
		},
 | 
			
		||||
	},
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="stylus" scoped>
 | 
			
		||||
.ymxyweixqwsxauxldgpvecjepnwxbylu
 | 
			
		||||
	margin 16px 0
 | 
			
		||||
	padding 16px
 | 
			
		||||
	font-size 90%
 | 
			
		||||
	background var(--infoBg)
 | 
			
		||||
	color var(--infoFg)
 | 
			
		||||
 | 
			
		||||
	&.warn
 | 
			
		||||
		background var(--infoWarnBg)
 | 
			
		||||
		color var(--infoWarnFg)
 | 
			
		||||
 | 
			
		||||
	&:first-child
 | 
			
		||||
		margin-top 0
 | 
			
		||||
 | 
			
		||||
	&:last-child
 | 
			
		||||
		margin-bottom 0
 | 
			
		||||
 | 
			
		||||
	> i
 | 
			
		||||
		margin-right 4px
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
<template>
 | 
			
		||||
<div class="ui-textarea" :class="{ focused, filled }">
 | 
			
		||||
<div class="ui-textarea" :class="{ focused, filled, tall }">
 | 
			
		||||
	<div class="input">
 | 
			
		||||
		<span class="label" ref="label"><slot></slot></span>
 | 
			
		||||
		<textarea ref="input"
 | 
			
		||||
@@ -10,8 +10,8 @@
 | 
			
		||||
			:autocomplete="autocomplete"
 | 
			
		||||
			@input="$emit('input', $event.target.value)"
 | 
			
		||||
			@focus="focused = true"
 | 
			
		||||
				@blur="focused = false">
 | 
			
		||||
		</textarea>
 | 
			
		||||
			@blur="focused = false"
 | 
			
		||||
		></textarea>
 | 
			
		||||
	</div>
 | 
			
		||||
	<div class="text"><slot name="text"></slot></div>
 | 
			
		||||
</div>
 | 
			
		||||
@@ -41,7 +41,12 @@ export default Vue.extend({
 | 
			
		||||
		autocomplete: {
 | 
			
		||||
			type: String,
 | 
			
		||||
			required: false
 | 
			
		||||
		}
 | 
			
		||||
		},
 | 
			
		||||
		tall: {
 | 
			
		||||
			type: Boolean,
 | 
			
		||||
			required: false,
 | 
			
		||||
			default: false
 | 
			
		||||
		},
 | 
			
		||||
	},
 | 
			
		||||
	data() {
 | 
			
		||||
		return {
 | 
			
		||||
@@ -66,6 +71,9 @@ export default Vue.extend({
 | 
			
		||||
root(fill)
 | 
			
		||||
	margin 42px 0 32px 0
 | 
			
		||||
 | 
			
		||||
	&:last-child
 | 
			
		||||
		margin-bottom 0
 | 
			
		||||
 | 
			
		||||
	> .input
 | 
			
		||||
		padding 12px
 | 
			
		||||
 | 
			
		||||
@@ -157,6 +165,11 @@ root(fill)
 | 
			
		||||
				left 0 !important
 | 
			
		||||
				transform scale(0.75)
 | 
			
		||||
 | 
			
		||||
	&.tall
 | 
			
		||||
		> .input
 | 
			
		||||
			> textarea
 | 
			
		||||
				min-height 200px
 | 
			
		||||
 | 
			
		||||
.ui-textarea.fill
 | 
			
		||||
	root(true)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@
 | 
			
		||||
 | 
			
		||||
		<p :class="$style.fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p>
 | 
			
		||||
		<div :class="$style.stream" v-if="!fetching && images.length > 0">
 | 
			
		||||
			<div v-for="image in images" :class="$style.img" :style="`background-image: url(${image.url})`"></div>
 | 
			
		||||
			<div v-for="image in images" :class="$style.img" :style="`background-image: url(${image.thumbnailUrl || image.url})`"></div>
 | 
			
		||||
		</div>
 | 
			
		||||
		<p :class="$style.empty" v-if="!fetching && images.length == 0">%i18n:@no-photos%</p>
 | 
			
		||||
	</mk-widget-container>
 | 
			
		||||
 
 | 
			
		||||
@@ -33,7 +33,7 @@ export default Vue.extend({
 | 
			
		||||
				},
 | 
			
		||||
				tooltips: {
 | 
			
		||||
					intersect: false,
 | 
			
		||||
					mode: 'x',
 | 
			
		||||
					mode: 'index',
 | 
			
		||||
					position: 'nearest'
 | 
			
		||||
				}
 | 
			
		||||
			}, this.opts || {}));
 | 
			
		||||
 
 | 
			
		||||
@@ -3,6 +3,10 @@
 | 
			
		||||
	<header>
 | 
			
		||||
		<b>%i18n:@title%:</b>
 | 
			
		||||
		<select v-model="chartType">
 | 
			
		||||
			<optgroup label="%i18n:@federation%">
 | 
			
		||||
				<option value="federation-instances">%i18n:@charts.federation-instances%</option>
 | 
			
		||||
				<option value="federation-instances-total">%i18n:@charts.federation-instances-total%</option>
 | 
			
		||||
			</optgroup>
 | 
			
		||||
			<optgroup label="%i18n:@users%">
 | 
			
		||||
				<option value="users">%i18n:@charts.users%</option>
 | 
			
		||||
				<option value="users-total">%i18n:@charts.users-total%</option>
 | 
			
		||||
@@ -56,6 +60,11 @@ const rgba = (color: string): string => {
 | 
			
		||||
	return color.replace('rgb', 'rgba').replace(')', ', 0.1)');
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const limit = 35;
 | 
			
		||||
 | 
			
		||||
const sum = (...arr) => arr.reduce((r, a) => r.map((b, i) => a[i] + b));
 | 
			
		||||
const negate = arr => arr.map(x => -x);
 | 
			
		||||
 | 
			
		||||
export default Vue.extend({
 | 
			
		||||
	components: {
 | 
			
		||||
		XChart
 | 
			
		||||
@@ -63,6 +72,7 @@ export default Vue.extend({
 | 
			
		||||
 | 
			
		||||
	data() {
 | 
			
		||||
		return {
 | 
			
		||||
			now: null,
 | 
			
		||||
			chart: null,
 | 
			
		||||
			chartType: 'notes',
 | 
			
		||||
			span: 'hour'
 | 
			
		||||
@@ -73,6 +83,8 @@ export default Vue.extend({
 | 
			
		||||
		data(): any {
 | 
			
		||||
			if (this.chart == null) return null;
 | 
			
		||||
			switch (this.chartType) {
 | 
			
		||||
				case 'federation-instances': return this.federationInstancesChart(false);
 | 
			
		||||
				case 'federation-instances-total': return this.federationInstancesChart(true);
 | 
			
		||||
				case 'users': return this.usersChart(false);
 | 
			
		||||
				case 'users-total': return this.usersChart(true);
 | 
			
		||||
				case 'notes': return this.notesChart('combined');
 | 
			
		||||
@@ -90,32 +102,88 @@ export default Vue.extend({
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		stats(): any[] {
 | 
			
		||||
			return (
 | 
			
		||||
			const stats =
 | 
			
		||||
				this.span == 'day' ? this.chart.perDay :
 | 
			
		||||
				this.span == 'hour' ? this.chart.perHour :
 | 
			
		||||
				null
 | 
			
		||||
			);
 | 
			
		||||
				null;
 | 
			
		||||
 | 
			
		||||
			return stats;
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	created() {
 | 
			
		||||
		(this as any).api('chart', {
 | 
			
		||||
			limit: 35
 | 
			
		||||
		}).then(chart => {
 | 
			
		||||
	async created() {
 | 
			
		||||
		this.now = new Date();
 | 
			
		||||
 | 
			
		||||
		const [perHour, perDay] = await Promise.all([Promise.all([
 | 
			
		||||
			(this as any).api('charts/federation', { limit: limit, span: 'hour' }),
 | 
			
		||||
			(this as any).api('charts/users', { limit: limit, span: 'hour' }),
 | 
			
		||||
			(this as any).api('charts/notes', { limit: limit, span: 'hour' }),
 | 
			
		||||
			(this as any).api('charts/drive', { limit: limit, span: 'hour' }),
 | 
			
		||||
			(this as any).api('charts/network', { limit: limit, span: 'hour' })
 | 
			
		||||
		]), Promise.all([
 | 
			
		||||
			(this as any).api('charts/federation', { limit: limit, span: 'day' }),
 | 
			
		||||
			(this as any).api('charts/users', { limit: limit, span: 'day' }),
 | 
			
		||||
			(this as any).api('charts/notes', { limit: limit, span: 'day' }),
 | 
			
		||||
			(this as any).api('charts/drive', { limit: limit, span: 'day' }),
 | 
			
		||||
			(this as any).api('charts/network', { limit: limit, span: 'day' })
 | 
			
		||||
		])]);
 | 
			
		||||
 | 
			
		||||
		const chart = {
 | 
			
		||||
			perHour: {
 | 
			
		||||
				federation: perHour[0],
 | 
			
		||||
				users: perHour[1],
 | 
			
		||||
				notes: perHour[2],
 | 
			
		||||
				drive: perHour[3],
 | 
			
		||||
				network: perHour[4]
 | 
			
		||||
			},
 | 
			
		||||
			perDay: {
 | 
			
		||||
				federation: perDay[0],
 | 
			
		||||
				users: perDay[1],
 | 
			
		||||
				notes: perDay[2],
 | 
			
		||||
				drive: perDay[3],
 | 
			
		||||
				network: perDay[4]
 | 
			
		||||
			}
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
		this.chart = chart;
 | 
			
		||||
		});
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	methods: {
 | 
			
		||||
		notesChart(type: string): any {
 | 
			
		||||
			const data = this.stats.slice().reverse().map(x => ({
 | 
			
		||||
				date: new Date(x.date),
 | 
			
		||||
				normal: type == 'local' ? x.notes.local.diffs.normal : type == 'remote' ? x.notes.remote.diffs.normal : x.notes.local.diffs.normal + x.notes.remote.diffs.normal,
 | 
			
		||||
				reply: type == 'local' ? x.notes.local.diffs.reply : type == 'remote' ? x.notes.remote.diffs.reply : x.notes.local.diffs.reply + x.notes.remote.diffs.reply,
 | 
			
		||||
				renote: type == 'local' ? x.notes.local.diffs.renote : type == 'remote' ? x.notes.remote.diffs.renote : x.notes.local.diffs.renote + x.notes.remote.diffs.renote,
 | 
			
		||||
				all: type == 'local' ? (x.notes.local.inc + -x.notes.local.dec) : type == 'remote' ? (x.notes.remote.inc + -x.notes.remote.dec) : (x.notes.local.inc + -x.notes.local.dec) + (x.notes.remote.inc + -x.notes.remote.dec)
 | 
			
		||||
			}));
 | 
			
		||||
		getDate(i: number) {
 | 
			
		||||
			const y = this.now.getFullYear();
 | 
			
		||||
			const m = this.now.getMonth();
 | 
			
		||||
			const d = this.now.getDate();
 | 
			
		||||
			const h = this.now.getHours();
 | 
			
		||||
 | 
			
		||||
			return (
 | 
			
		||||
				this.span == 'day' ? new Date(y, m, d - i) :
 | 
			
		||||
				this.span == 'hour' ? new Date(y, m, d, h - i) :
 | 
			
		||||
				null
 | 
			
		||||
			);
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		format(arr) {
 | 
			
		||||
			return arr.map((v, i) => ({ t: this.getDate(i).getTime(), y: v }));
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		federationInstancesChart(total: boolean): any {
 | 
			
		||||
			return [{
 | 
			
		||||
				datasets: [{
 | 
			
		||||
					label: 'Instances',
 | 
			
		||||
					fill: true,
 | 
			
		||||
					backgroundColor: rgba(colors.localPlus),
 | 
			
		||||
					borderColor: colors.localPlus,
 | 
			
		||||
					borderWidth: 2,
 | 
			
		||||
					pointBackgroundColor: '#fff',
 | 
			
		||||
					lineTension: 0,
 | 
			
		||||
					data: this.format(total
 | 
			
		||||
						? this.stats.federation.instance.total
 | 
			
		||||
						: sum(this.stats.federation.instance.inc, negate(this.stats.federation.instance.dec)))
 | 
			
		||||
				}]
 | 
			
		||||
			}];
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		notesChart(type: string): any {
 | 
			
		||||
			return [{
 | 
			
		||||
				datasets: [{
 | 
			
		||||
					label: 'All',
 | 
			
		||||
@@ -125,7 +193,10 @@ export default Vue.extend({
 | 
			
		||||
					borderDash: [4, 4],
 | 
			
		||||
					pointBackgroundColor: '#fff',
 | 
			
		||||
					lineTension: 0,
 | 
			
		||||
					data: data.map(x => ({ t: x.date, y: x.all }))
 | 
			
		||||
					data: this.format(type == 'combined'
 | 
			
		||||
						? sum(this.stats.notes.local.inc, negate(this.stats.notes.local.dec), this.stats.notes.remote.inc, negate(this.stats.notes.remote.dec))
 | 
			
		||||
						: sum(this.stats.notes[type].inc, negate(this.stats.notes[type].dec))
 | 
			
		||||
					)
 | 
			
		||||
				}, {
 | 
			
		||||
					label: 'Renotes',
 | 
			
		||||
					fill: true,
 | 
			
		||||
@@ -134,7 +205,10 @@ export default Vue.extend({
 | 
			
		||||
					borderWidth: 2,
 | 
			
		||||
					pointBackgroundColor: '#fff',
 | 
			
		||||
					lineTension: 0,
 | 
			
		||||
					data: data.map(x => ({ t: x.date, y: x.renote }))
 | 
			
		||||
					data: this.format(type == 'combined'
 | 
			
		||||
						? sum(this.stats.notes.local.diffs.renote, this.stats.notes.remote.diffs.renote)
 | 
			
		||||
						: this.stats.notes[type].diffs.renote
 | 
			
		||||
					)
 | 
			
		||||
				}, {
 | 
			
		||||
					label: 'Replies',
 | 
			
		||||
					fill: true,
 | 
			
		||||
@@ -143,7 +217,10 @@ export default Vue.extend({
 | 
			
		||||
					borderWidth: 2,
 | 
			
		||||
					pointBackgroundColor: '#fff',
 | 
			
		||||
					lineTension: 0,
 | 
			
		||||
					data: data.map(x => ({ t: x.date, y: x.reply }))
 | 
			
		||||
					data: this.format(type == 'combined'
 | 
			
		||||
						? sum(this.stats.notes.local.diffs.reply, this.stats.notes.remote.diffs.reply)
 | 
			
		||||
						: this.stats.notes[type].diffs.reply
 | 
			
		||||
					)
 | 
			
		||||
				}, {
 | 
			
		||||
					label: 'Normal',
 | 
			
		||||
					fill: true,
 | 
			
		||||
@@ -152,7 +229,10 @@ export default Vue.extend({
 | 
			
		||||
					borderWidth: 2,
 | 
			
		||||
					pointBackgroundColor: '#fff',
 | 
			
		||||
					lineTension: 0,
 | 
			
		||||
					data: data.map(x => ({ t: x.date, y: x.normal }))
 | 
			
		||||
					data: this.format(type == 'combined'
 | 
			
		||||
						? sum(this.stats.notes.local.diffs.normal, this.stats.notes.remote.diffs.normal)
 | 
			
		||||
						: this.stats.notes[type].diffs.normal
 | 
			
		||||
					)
 | 
			
		||||
				}]
 | 
			
		||||
			}, {
 | 
			
		||||
				scales: {
 | 
			
		||||
@@ -176,12 +256,6 @@ export default Vue.extend({
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		notesTotalChart(): any {
 | 
			
		||||
			const data = this.stats.slice().reverse().map(x => ({
 | 
			
		||||
				date: new Date(x.date),
 | 
			
		||||
				localCount: x.notes.local.total,
 | 
			
		||||
				remoteCount: x.notes.remote.total
 | 
			
		||||
			}));
 | 
			
		||||
 | 
			
		||||
			return [{
 | 
			
		||||
				datasets: [{
 | 
			
		||||
					label: 'Combined',
 | 
			
		||||
@@ -191,7 +265,7 @@ export default Vue.extend({
 | 
			
		||||
					borderDash: [4, 4],
 | 
			
		||||
					pointBackgroundColor: '#fff',
 | 
			
		||||
					lineTension: 0,
 | 
			
		||||
					data: data.map(x => ({ t: x.date, y: x.remoteCount + x.localCount }))
 | 
			
		||||
					data: this.format(sum(this.stats.notes.local.total, this.stats.notes.remote.total))
 | 
			
		||||
				}, {
 | 
			
		||||
					label: 'Local',
 | 
			
		||||
					fill: true,
 | 
			
		||||
@@ -200,7 +274,7 @@ export default Vue.extend({
 | 
			
		||||
					borderWidth: 2,
 | 
			
		||||
					pointBackgroundColor: '#fff',
 | 
			
		||||
					lineTension: 0,
 | 
			
		||||
					data: data.map(x => ({ t: x.date, y: x.localCount }))
 | 
			
		||||
					data: this.format(this.stats.notes.local.total)
 | 
			
		||||
				}, {
 | 
			
		||||
					label: 'Remote',
 | 
			
		||||
					fill: true,
 | 
			
		||||
@@ -209,7 +283,7 @@ export default Vue.extend({
 | 
			
		||||
					borderWidth: 2,
 | 
			
		||||
					pointBackgroundColor: '#fff',
 | 
			
		||||
					lineTension: 0,
 | 
			
		||||
					data: data.map(x => ({ t: x.date, y: x.remoteCount }))
 | 
			
		||||
					data: this.format(this.stats.notes.remote.total)
 | 
			
		||||
				}]
 | 
			
		||||
			}, {
 | 
			
		||||
				scales: {
 | 
			
		||||
@@ -233,12 +307,6 @@ export default Vue.extend({
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		usersChart(total: boolean): any {
 | 
			
		||||
			const data = this.stats.slice().reverse().map(x => ({
 | 
			
		||||
				date: new Date(x.date),
 | 
			
		||||
				localCount: total ? x.users.local.total : (x.users.local.inc + -x.users.local.dec),
 | 
			
		||||
				remoteCount: total ? x.users.remote.total : (x.users.remote.inc + -x.users.remote.dec)
 | 
			
		||||
			}));
 | 
			
		||||
 | 
			
		||||
			return [{
 | 
			
		||||
				datasets: [{
 | 
			
		||||
					label: 'Combined',
 | 
			
		||||
@@ -248,7 +316,10 @@ export default Vue.extend({
 | 
			
		||||
					borderDash: [4, 4],
 | 
			
		||||
					pointBackgroundColor: '#fff',
 | 
			
		||||
					lineTension: 0,
 | 
			
		||||
					data: data.map(x => ({ t: x.date, y: x.remoteCount + x.localCount }))
 | 
			
		||||
					data: this.format(total
 | 
			
		||||
						? sum(this.stats.users.local.total, this.stats.users.remote.total)
 | 
			
		||||
						: sum(this.stats.users.local.inc, negate(this.stats.users.local.dec), this.stats.users.remote.inc, negate(this.stats.users.remote.dec))
 | 
			
		||||
					)
 | 
			
		||||
				}, {
 | 
			
		||||
					label: 'Local',
 | 
			
		||||
					fill: true,
 | 
			
		||||
@@ -257,7 +328,10 @@ export default Vue.extend({
 | 
			
		||||
					borderWidth: 2,
 | 
			
		||||
					pointBackgroundColor: '#fff',
 | 
			
		||||
					lineTension: 0,
 | 
			
		||||
					data: data.map(x => ({ t: x.date, y: x.localCount }))
 | 
			
		||||
					data: this.format(total
 | 
			
		||||
						? this.stats.users.local.total
 | 
			
		||||
						: sum(this.stats.users.local.inc, negate(this.stats.users.local.dec))
 | 
			
		||||
					)
 | 
			
		||||
				}, {
 | 
			
		||||
					label: 'Remote',
 | 
			
		||||
					fill: true,
 | 
			
		||||
@@ -266,7 +340,10 @@ export default Vue.extend({
 | 
			
		||||
					borderWidth: 2,
 | 
			
		||||
					pointBackgroundColor: '#fff',
 | 
			
		||||
					lineTension: 0,
 | 
			
		||||
					data: data.map(x => ({ t: x.date, y: x.remoteCount }))
 | 
			
		||||
					data: this.format(total
 | 
			
		||||
						? this.stats.users.remote.total
 | 
			
		||||
						: sum(this.stats.users.remote.inc, negate(this.stats.users.remote.dec))
 | 
			
		||||
					)
 | 
			
		||||
				}]
 | 
			
		||||
			}, {
 | 
			
		||||
				scales: {
 | 
			
		||||
@@ -290,14 +367,6 @@ export default Vue.extend({
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		driveChart(): any {
 | 
			
		||||
			const data = this.stats.slice().reverse().map(x => ({
 | 
			
		||||
				date: new Date(x.date),
 | 
			
		||||
				localInc: x.drive.local.incSize,
 | 
			
		||||
				localDec: -x.drive.local.decSize,
 | 
			
		||||
				remoteInc: x.drive.remote.incSize,
 | 
			
		||||
				remoteDec: -x.drive.remote.decSize,
 | 
			
		||||
			}));
 | 
			
		||||
 | 
			
		||||
			return [{
 | 
			
		||||
				datasets: [{
 | 
			
		||||
					label: 'All',
 | 
			
		||||
@@ -307,7 +376,7 @@ export default Vue.extend({
 | 
			
		||||
					borderDash: [4, 4],
 | 
			
		||||
					pointBackgroundColor: '#fff',
 | 
			
		||||
					lineTension: 0,
 | 
			
		||||
					data: data.map(x => ({ t: x.date, y: x.localInc + x.localDec + x.remoteInc + x.remoteDec }))
 | 
			
		||||
					data: this.format(sum(this.stats.drive.local.incSize, negate(this.stats.drive.local.decSize), this.stats.drive.remote.incSize, negate(this.stats.drive.remote.decSize)))
 | 
			
		||||
				}, {
 | 
			
		||||
					label: 'Local +',
 | 
			
		||||
					fill: true,
 | 
			
		||||
@@ -316,7 +385,7 @@ export default Vue.extend({
 | 
			
		||||
					borderWidth: 2,
 | 
			
		||||
					pointBackgroundColor: '#fff',
 | 
			
		||||
					lineTension: 0,
 | 
			
		||||
					data: data.map(x => ({ t: x.date, y: x.localInc }))
 | 
			
		||||
					data: this.format(this.stats.drive.local.incSize)
 | 
			
		||||
				}, {
 | 
			
		||||
					label: 'Local -',
 | 
			
		||||
					fill: true,
 | 
			
		||||
@@ -325,7 +394,7 @@ export default Vue.extend({
 | 
			
		||||
					borderWidth: 2,
 | 
			
		||||
					pointBackgroundColor: '#fff',
 | 
			
		||||
					lineTension: 0,
 | 
			
		||||
					data: data.map(x => ({ t: x.date, y: x.localDec }))
 | 
			
		||||
					data: this.format(negate(this.stats.drive.local.decSize))
 | 
			
		||||
				}, {
 | 
			
		||||
					label: 'Remote +',
 | 
			
		||||
					fill: true,
 | 
			
		||||
@@ -334,7 +403,7 @@ export default Vue.extend({
 | 
			
		||||
					borderWidth: 2,
 | 
			
		||||
					pointBackgroundColor: '#fff',
 | 
			
		||||
					lineTension: 0,
 | 
			
		||||
					data: data.map(x => ({ t: x.date, y: x.remoteInc }))
 | 
			
		||||
					data: this.format(this.stats.drive.remote.incSize)
 | 
			
		||||
				}, {
 | 
			
		||||
					label: 'Remote -',
 | 
			
		||||
					fill: true,
 | 
			
		||||
@@ -343,7 +412,7 @@ export default Vue.extend({
 | 
			
		||||
					borderWidth: 2,
 | 
			
		||||
					pointBackgroundColor: '#fff',
 | 
			
		||||
					lineTension: 0,
 | 
			
		||||
					data: data.map(x => ({ t: x.date, y: x.remoteDec }))
 | 
			
		||||
					data: this.format(negate(this.stats.drive.remote.decSize))
 | 
			
		||||
				}]
 | 
			
		||||
			}, {
 | 
			
		||||
				scales: {
 | 
			
		||||
@@ -367,12 +436,6 @@ export default Vue.extend({
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		driveTotalChart(): any {
 | 
			
		||||
			const data = this.stats.slice().reverse().map(x => ({
 | 
			
		||||
				date: new Date(x.date),
 | 
			
		||||
				localSize: x.drive.local.totalSize,
 | 
			
		||||
				remoteSize: x.drive.remote.totalSize
 | 
			
		||||
			}));
 | 
			
		||||
 | 
			
		||||
			return [{
 | 
			
		||||
				datasets: [{
 | 
			
		||||
					label: 'Combined',
 | 
			
		||||
@@ -382,7 +445,7 @@ export default Vue.extend({
 | 
			
		||||
					borderDash: [4, 4],
 | 
			
		||||
					pointBackgroundColor: '#fff',
 | 
			
		||||
					lineTension: 0,
 | 
			
		||||
					data: data.map(x => ({ t: x.date, y: x.remoteSize + x.localSize }))
 | 
			
		||||
					data: this.format(sum(this.stats.drive.local.totalSize, this.stats.drive.remote.totalSize))
 | 
			
		||||
				}, {
 | 
			
		||||
					label: 'Local',
 | 
			
		||||
					fill: true,
 | 
			
		||||
@@ -391,7 +454,7 @@ export default Vue.extend({
 | 
			
		||||
					borderWidth: 2,
 | 
			
		||||
					pointBackgroundColor: '#fff',
 | 
			
		||||
					lineTension: 0,
 | 
			
		||||
					data: data.map(x => ({ t: x.date, y: x.localSize }))
 | 
			
		||||
					data: this.format(this.stats.drive.local.totalSize)
 | 
			
		||||
				}, {
 | 
			
		||||
					label: 'Remote',
 | 
			
		||||
					fill: true,
 | 
			
		||||
@@ -400,7 +463,7 @@ export default Vue.extend({
 | 
			
		||||
					borderWidth: 2,
 | 
			
		||||
					pointBackgroundColor: '#fff',
 | 
			
		||||
					lineTension: 0,
 | 
			
		||||
					data: data.map(x => ({ t: x.date, y: x.remoteSize }))
 | 
			
		||||
					data: this.format(this.stats.drive.remote.totalSize)
 | 
			
		||||
				}]
 | 
			
		||||
			}, {
 | 
			
		||||
				scales: {
 | 
			
		||||
@@ -424,14 +487,6 @@ export default Vue.extend({
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		driveFilesChart(): any {
 | 
			
		||||
			const data = this.stats.slice().reverse().map(x => ({
 | 
			
		||||
				date: new Date(x.date),
 | 
			
		||||
				localInc: x.drive.local.incCount,
 | 
			
		||||
				localDec: -x.drive.local.decCount,
 | 
			
		||||
				remoteInc: x.drive.remote.incCount,
 | 
			
		||||
				remoteDec: -x.drive.remote.decCount
 | 
			
		||||
			}));
 | 
			
		||||
 | 
			
		||||
			return [{
 | 
			
		||||
				datasets: [{
 | 
			
		||||
					label: 'All',
 | 
			
		||||
@@ -441,7 +496,7 @@ export default Vue.extend({
 | 
			
		||||
					borderDash: [4, 4],
 | 
			
		||||
					pointBackgroundColor: '#fff',
 | 
			
		||||
					lineTension: 0,
 | 
			
		||||
					data: data.map(x => ({ t: x.date, y: x.localInc + x.localDec + x.remoteInc + x.remoteDec }))
 | 
			
		||||
					data: this.format(sum(this.stats.drive.local.incCount, negate(this.stats.drive.local.decCount), this.stats.drive.remote.incCount, negate(this.stats.drive.remote.decCount)))
 | 
			
		||||
				}, {
 | 
			
		||||
					label: 'Local +',
 | 
			
		||||
					fill: true,
 | 
			
		||||
@@ -450,7 +505,7 @@ export default Vue.extend({
 | 
			
		||||
					borderWidth: 2,
 | 
			
		||||
					pointBackgroundColor: '#fff',
 | 
			
		||||
					lineTension: 0,
 | 
			
		||||
					data: data.map(x => ({ t: x.date, y: x.localInc }))
 | 
			
		||||
					data: this.format(this.stats.drive.local.incCount)
 | 
			
		||||
				}, {
 | 
			
		||||
					label: 'Local -',
 | 
			
		||||
					fill: true,
 | 
			
		||||
@@ -459,7 +514,7 @@ export default Vue.extend({
 | 
			
		||||
					borderWidth: 2,
 | 
			
		||||
					pointBackgroundColor: '#fff',
 | 
			
		||||
					lineTension: 0,
 | 
			
		||||
					data: data.map(x => ({ t: x.date, y: x.localDec }))
 | 
			
		||||
					data: this.format(negate(this.stats.drive.local.decCount))
 | 
			
		||||
				}, {
 | 
			
		||||
					label: 'Remote +',
 | 
			
		||||
					fill: true,
 | 
			
		||||
@@ -468,7 +523,7 @@ export default Vue.extend({
 | 
			
		||||
					borderWidth: 2,
 | 
			
		||||
					pointBackgroundColor: '#fff',
 | 
			
		||||
					lineTension: 0,
 | 
			
		||||
					data: data.map(x => ({ t: x.date, y: x.remoteInc }))
 | 
			
		||||
					data: this.format(this.stats.drive.remote.incCount)
 | 
			
		||||
				}, {
 | 
			
		||||
					label: 'Remote -',
 | 
			
		||||
					fill: true,
 | 
			
		||||
@@ -477,7 +532,7 @@ export default Vue.extend({
 | 
			
		||||
					borderWidth: 2,
 | 
			
		||||
					pointBackgroundColor: '#fff',
 | 
			
		||||
					lineTension: 0,
 | 
			
		||||
					data: data.map(x => ({ t: x.date, y: x.remoteDec }))
 | 
			
		||||
					data: this.format(negate(this.stats.drive.remote.decCount))
 | 
			
		||||
				}]
 | 
			
		||||
			}, {
 | 
			
		||||
				scales: {
 | 
			
		||||
@@ -501,12 +556,6 @@ export default Vue.extend({
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		driveFilesTotalChart(): any {
 | 
			
		||||
			const data = this.stats.slice().reverse().map(x => ({
 | 
			
		||||
				date: new Date(x.date),
 | 
			
		||||
				localCount: x.drive.local.totalCount,
 | 
			
		||||
				remoteCount: x.drive.remote.totalCount,
 | 
			
		||||
			}));
 | 
			
		||||
 | 
			
		||||
			return [{
 | 
			
		||||
				datasets: [{
 | 
			
		||||
					label: 'Combined',
 | 
			
		||||
@@ -516,7 +565,7 @@ export default Vue.extend({
 | 
			
		||||
					borderDash: [4, 4],
 | 
			
		||||
					pointBackgroundColor: '#fff',
 | 
			
		||||
					lineTension: 0,
 | 
			
		||||
					data: data.map(x => ({ t: x.date, y: x.localCount + x.remoteCount }))
 | 
			
		||||
					data: this.format(sum(this.stats.drive.local.totalCount, this.stats.drive.remote.totalCount))
 | 
			
		||||
				}, {
 | 
			
		||||
					label: 'Local',
 | 
			
		||||
					fill: true,
 | 
			
		||||
@@ -525,7 +574,7 @@ export default Vue.extend({
 | 
			
		||||
					borderWidth: 2,
 | 
			
		||||
					pointBackgroundColor: '#fff',
 | 
			
		||||
					lineTension: 0,
 | 
			
		||||
					data: data.map(x => ({ t: x.date, y: x.localCount }))
 | 
			
		||||
					data: this.format(this.stats.drive.local.totalCount)
 | 
			
		||||
				}, {
 | 
			
		||||
					label: 'Remote',
 | 
			
		||||
					fill: true,
 | 
			
		||||
@@ -534,7 +583,7 @@ export default Vue.extend({
 | 
			
		||||
					borderWidth: 2,
 | 
			
		||||
					pointBackgroundColor: '#fff',
 | 
			
		||||
					lineTension: 0,
 | 
			
		||||
					data: data.map(x => ({ t: x.date, y: x.remoteCount }))
 | 
			
		||||
					data: this.format(this.stats.drive.remote.totalCount)
 | 
			
		||||
				}]
 | 
			
		||||
			}, {
 | 
			
		||||
				scales: {
 | 
			
		||||
@@ -558,30 +607,26 @@ export default Vue.extend({
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		networkRequestsChart(): any {
 | 
			
		||||
			const data = this.stats.slice().reverse().map(x => ({
 | 
			
		||||
				date: new Date(x.date),
 | 
			
		||||
				requests: x.network.requests
 | 
			
		||||
			}));
 | 
			
		||||
 | 
			
		||||
			return [{
 | 
			
		||||
				datasets: [{
 | 
			
		||||
					label: 'Requests',
 | 
			
		||||
					label: 'Incoming',
 | 
			
		||||
					fill: true,
 | 
			
		||||
					backgroundColor: rgba(colors.localPlus),
 | 
			
		||||
					borderColor: colors.localPlus,
 | 
			
		||||
					borderWidth: 2,
 | 
			
		||||
					pointBackgroundColor: '#fff',
 | 
			
		||||
					lineTension: 0,
 | 
			
		||||
					data: data.map(x => ({ t: x.date, y: x.requests }))
 | 
			
		||||
					data: this.format(this.stats.network.incomingRequests)
 | 
			
		||||
				}]
 | 
			
		||||
			}];
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		networkTimeChart(): any {
 | 
			
		||||
			const data = this.stats.slice().reverse().map(x => ({
 | 
			
		||||
				date: new Date(x.date),
 | 
			
		||||
				time: x.network.requests != 0 ? (x.network.totalTime / x.network.requests) : 0,
 | 
			
		||||
			}));
 | 
			
		||||
			const data = [];
 | 
			
		||||
 | 
			
		||||
			for (let i = 0; i < limit; i++) {
 | 
			
		||||
				data.push(this.stats.network.incomingRequests[i] != 0 ? (this.stats.network.totalTime[i] / this.stats.network.incomingRequests[i]) : 0);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			return [{
 | 
			
		||||
				datasets: [{
 | 
			
		||||
@@ -592,18 +637,12 @@ export default Vue.extend({
 | 
			
		||||
					borderWidth: 2,
 | 
			
		||||
					pointBackgroundColor: '#fff',
 | 
			
		||||
					lineTension: 0,
 | 
			
		||||
					data: data.map(x => ({ t: x.date, y: x.time }))
 | 
			
		||||
					data: this.format(data)
 | 
			
		||||
				}]
 | 
			
		||||
			}];
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		networkUsageChart(): any {
 | 
			
		||||
			const data = this.stats.slice().reverse().map(x => ({
 | 
			
		||||
				date: new Date(x.date),
 | 
			
		||||
				incoming: x.network.incomingBytes,
 | 
			
		||||
				outgoing: x.network.outgoingBytes
 | 
			
		||||
			}));
 | 
			
		||||
 | 
			
		||||
			return [{
 | 
			
		||||
				datasets: [{
 | 
			
		||||
					label: 'Incoming',
 | 
			
		||||
@@ -613,7 +652,7 @@ export default Vue.extend({
 | 
			
		||||
					borderWidth: 2,
 | 
			
		||||
					pointBackgroundColor: '#fff',
 | 
			
		||||
					lineTension: 0,
 | 
			
		||||
					data: data.map(x => ({ t: x.date, y: x.incoming }))
 | 
			
		||||
					data: this.format(this.stats.network.incomingBytes)
 | 
			
		||||
				}, {
 | 
			
		||||
					label: 'Outgoing',
 | 
			
		||||
					fill: true,
 | 
			
		||||
@@ -622,7 +661,7 @@ export default Vue.extend({
 | 
			
		||||
					borderWidth: 2,
 | 
			
		||||
					pointBackgroundColor: '#fff',
 | 
			
		||||
					lineTension: 0,
 | 
			
		||||
					data: data.map(x => ({ t: x.date, y: x.outgoing }))
 | 
			
		||||
					data: this.format(this.stats.network.outgoingBytes)
 | 
			
		||||
				}]
 | 
			
		||||
			}, {
 | 
			
		||||
				scales: {
 | 
			
		||||
@@ -649,8 +688,6 @@ export default Vue.extend({
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="stylus" scoped>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.gkgckalzgidaygcxnugepioremxvxvpt
 | 
			
		||||
	padding 32px
 | 
			
		||||
	background #fff
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
<mk-window ref="window" @closed="destroyDom" width="800px" height="500px" :popout-url="popout">
 | 
			
		||||
	<template slot="header">
 | 
			
		||||
		<p v-if="usage" :class="$style.info"><b>{{ usage.toFixed(1) }}%</b> %i18n:@used%</p>
 | 
			
		||||
		<span :class="$style.title">%fa:cloud%%i18n:@drive%</span>
 | 
			
		||||
		<span :class="$style.title">%fa:cloud%%i18n:common.drive%</span>
 | 
			
		||||
	</template>
 | 
			
		||||
	<mk-drive :class="$style.browser" multiple :init-folder="folder" ref="browser"/>
 | 
			
		||||
</mk-window>
 | 
			
		||||
 
 | 
			
		||||
@@ -67,12 +67,12 @@ export default Vue.extend({
 | 
			
		||||
				text: '%i18n:@contextmenu.rename%',
 | 
			
		||||
				icon: '%fa:i-cursor%',
 | 
			
		||||
				action: this.rename
 | 
			
		||||
			}/*, null, {
 | 
			
		||||
			}, null, {
 | 
			
		||||
				type: 'item',
 | 
			
		||||
				text: '%i18n:common.delete%',
 | 
			
		||||
				icon: '%fa:R trash-alt%',
 | 
			
		||||
				action: this.deleteFolder
 | 
			
		||||
			}*/], {
 | 
			
		||||
			}], {
 | 
			
		||||
					closed: () => {
 | 
			
		||||
						this.isContextmenuShowing = false;
 | 
			
		||||
					}
 | 
			
		||||
@@ -207,7 +207,9 @@ export default Vue.extend({
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		deleteFolder() {
 | 
			
		||||
			alert('not implemented yet');
 | 
			
		||||
			(this as any).api('drive/folders/delete', {
 | 
			
		||||
				folderId: this.folder.id
 | 
			
		||||
			});
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
	@drop.stop="onDrop"
 | 
			
		||||
>
 | 
			
		||||
	<template v-if="folder == null">%fa:cloud%</template>
 | 
			
		||||
	<span>{{ folder == null ? '%i18n:@drive%' : folder.name }}</span>
 | 
			
		||||
	<span>{{ folder == null ? '%i18n:common.drive%' : folder.name }}</span>
 | 
			
		||||
</div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -98,7 +98,7 @@ export default Vue.extend({
 | 
			
		||||
			hierarchyFolders: [],
 | 
			
		||||
			selectedFiles: [],
 | 
			
		||||
			uploadings: [],
 | 
			
		||||
			connection: null
 | 
			
		||||
			connection: null,
 | 
			
		||||
 | 
			
		||||
			/**
 | 
			
		||||
			 * ドロップされようとしているか
 | 
			
		||||
@@ -117,11 +117,12 @@ export default Vue.extend({
 | 
			
		||||
	mounted() {
 | 
			
		||||
		this.connection = (this as any).os.stream.useSharedConnection('drive');
 | 
			
		||||
 | 
			
		||||
		this.connection.on('file_created', this.onStreamDriveFileCreated);
 | 
			
		||||
		this.connection.on('file_updated', this.onStreamDriveFileUpdated);
 | 
			
		||||
		this.connection.on('file_deleted', this.onStreamDriveFileDeleted);
 | 
			
		||||
		this.connection.on('folder_created', this.onStreamDriveFolderCreated);
 | 
			
		||||
		this.connection.on('folder_updated', this.onStreamDriveFolderUpdated);
 | 
			
		||||
		this.connection.on('fileCreated', this.onStreamDriveFileCreated);
 | 
			
		||||
		this.connection.on('fileUpdated', this.onStreamDriveFileUpdated);
 | 
			
		||||
		this.connection.on('fileDeleted', this.onStreamDriveFileDeleted);
 | 
			
		||||
		this.connection.on('folderCreated', this.onStreamDriveFolderCreated);
 | 
			
		||||
		this.connection.on('folderUpdated', this.onStreamDriveFolderUpdated);
 | 
			
		||||
		this.connection.on('folderDeleted', this.onStreamDriveFolderDeleted);
 | 
			
		||||
 | 
			
		||||
		if (this.initFolder) {
 | 
			
		||||
			this.move(this.initFolder);
 | 
			
		||||
@@ -182,6 +183,10 @@ export default Vue.extend({
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		onStreamDriveFolderDeleted(folderId) {
 | 
			
		||||
			this.removeFolder(folderId);
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		onChangeUploaderUploads(uploads) {
 | 
			
		||||
			this.uploadings = uploads;
 | 
			
		||||
		},
 | 
			
		||||
 
 | 
			
		||||
@@ -40,8 +40,8 @@ export default Vue.extend({
 | 
			
		||||
 | 
			
		||||
	mounted() {
 | 
			
		||||
		this.connection = (this as any).os.stream.useSharedConnection('main');
 | 
			
		||||
		this.connection.on('follow', this.onFollow);
 | 
			
		||||
		this.connection.on('unfollow', this.onUnfollow);
 | 
			
		||||
		this.connection.on('follow', this.onFollowChange);
 | 
			
		||||
		this.connection.on('unfollow', this.onFollowChange);
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	beforeDestroy() {
 | 
			
		||||
@@ -49,17 +49,11 @@ export default Vue.extend({
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	methods: {
 | 
			
		||||
		onFollow(user) {
 | 
			
		||||
			if (user.id == this.u.id) {
 | 
			
		||||
				this.u.isFollowing = user.isFollowing;
 | 
			
		||||
				this.u.hasPendingFollowRequestFromYou = user.hasPendingFollowRequestFromYou;
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		onUnfollow(user) {
 | 
			
		||||
		onFollowChange(user) {
 | 
			
		||||
			if (user.id == this.u.id) {
 | 
			
		||||
				this.u.isFollowing = user.isFollowing;
 | 
			
		||||
				this.u.hasPendingFollowRequestFromYou = user.hasPendingFollowRequestFromYou;
 | 
			
		||||
				this.$forceUpdate();
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -17,7 +17,7 @@
 | 
			
		||||
		<mk-avatar class="avatar" :user="note.user"/>
 | 
			
		||||
		%fa:retweet%
 | 
			
		||||
		<span>{{ '%i18n:@reposted-by%'.substr(0, '%i18n:@reposted-by%'.indexOf('{')) }}</span>
 | 
			
		||||
		<a class="name" :href="note.user | userPage" v-user-preview="note.userId">{{ note.user | userName }}</a>
 | 
			
		||||
		<router-link class="name" :to="note.user | userPage" v-user-preview="note.userId">{{ note.user | userName }}</router-link>
 | 
			
		||||
		<span>{{ '%i18n:@reposted-by%'.substr('%i18n:@reposted-by%'.indexOf('}') + 1) }}</span>
 | 
			
		||||
		<mk-time :time="note.createdAt"/>
 | 
			
		||||
	</div>
 | 
			
		||||
 
 | 
			
		||||
@@ -4,10 +4,7 @@
 | 
			
		||||
 | 
			
		||||
	<slot name="empty" v-if="notes.length == 0 && !fetching && requestInitPromise == null"></slot>
 | 
			
		||||
 | 
			
		||||
	<div v-if="!fetching && requestInitPromise != null">
 | 
			
		||||
		<p>%i18n:@error%</p>
 | 
			
		||||
		<button @click="resolveInitPromise">%i18n:@retry%</button>
 | 
			
		||||
	</div>
 | 
			
		||||
	<mk-error v-if="!fetching && requestInitPromise != null" @retry="resolveInitPromise"/>
 | 
			
		||||
 | 
			
		||||
	<div class="placeholder" v-if="fetching">
 | 
			
		||||
		<template v-for="i in 10">
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,7 @@
 | 
			
		||||
		</div>
 | 
			
		||||
		<div class="hashtags" v-if="recentHashtags.length > 0 && $store.state.settings.suggestRecentHashtags">
 | 
			
		||||
			<b>%i18n:@recent-tags%:</b>
 | 
			
		||||
			<a v-for="tag in recentHashtags.slice(0, 5)" @click="addTag(tag)" title="%@click-to-tagging%">#{{ tag }}</a>
 | 
			
		||||
			<a v-for="tag in recentHashtags.slice(0, 5)" @click="addTag(tag)" title="%i18n:@click-to-tagging%">#{{ tag }}</a>
 | 
			
		||||
		</div>
 | 
			
		||||
		<input v-show="useCw" v-model="cw" placeholder="%i18n:@annotations%">
 | 
			
		||||
		<textarea :class="{ with: (files.length != 0 || poll) }"
 | 
			
		||||
@@ -45,7 +45,7 @@
 | 
			
		||||
		<span v-if="visibility === 'specified'">%fa:envelope%</span>
 | 
			
		||||
		<span v-if="visibility === 'private'">%fa:lock%</span>
 | 
			
		||||
	</button>
 | 
			
		||||
	<p class="text-count" :class="{ over: this.trimmedLength(text) > 1000 }">{{ 1000 - this.trimmedLength(text) }}</p>
 | 
			
		||||
	<p class="text-count" :class="{ over: this.trimmedLength(text) > this.maxNoteTextLength }">{{ this.maxNoteTextLength - this.trimmedLength(text) }}</p>
 | 
			
		||||
	<button :class="{ posting }" class="submit" :disabled="!canPost" @click="post">
 | 
			
		||||
		{{ posting ? '%i18n:@posting%' : submitText }}<mk-ellipsis v-if="posting"/>
 | 
			
		||||
	</button>
 | 
			
		||||
@@ -107,10 +107,17 @@ export default Vue.extend({
 | 
			
		||||
			visibleUsers: [],
 | 
			
		||||
			autocomplete: null,
 | 
			
		||||
			draghover: false,
 | 
			
		||||
			recentHashtags: JSON.parse(localStorage.getItem('hashtags') || '[]')
 | 
			
		||||
			recentHashtags: JSON.parse(localStorage.getItem('hashtags') || '[]'),
 | 
			
		||||
			maxNoteTextLength: 1000
 | 
			
		||||
		};
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	created() {
 | 
			
		||||
		(this as any).os.getMeta().then(meta => {
 | 
			
		||||
			this.maxNoteTextLength = meta.maxNoteTextLength;
 | 
			
		||||
		});
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	computed: {
 | 
			
		||||
		draftId(): string {
 | 
			
		||||
			return this.renote
 | 
			
		||||
@@ -149,7 +156,7 @@ export default Vue.extend({
 | 
			
		||||
		canPost(): boolean {
 | 
			
		||||
			return !this.posting &&
 | 
			
		||||
				(1 <= this.text.length || 1 <= this.files.length || this.poll || this.renote) &&
 | 
			
		||||
				(length(this.text.trim()) <= 1000);
 | 
			
		||||
				(length(this.text.trim()) <= this.maxNoteTextLength);
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
<template>
 | 
			
		||||
<div class="2fa">
 | 
			
		||||
	<p>%i18n:@intro%<a href="%i18n:@url%" target="_blank">%i18n:@detail%</a></p>
 | 
			
		||||
	<div class="ui info warn"><p>%fa:exclamation-triangle%%i18n:@caution%</p></div>
 | 
			
		||||
	<p style="margin-top:0;">%i18n:@intro%<a href="%i18n:@url%" target="_blank">%i18n:@detail%</a></p>
 | 
			
		||||
	<ui-info warn>%i18n:@caution%</ui-info>
 | 
			
		||||
	<p v-if="!data && !$store.state.i.twoFactorEnabled"><ui-button @click="register">%i18n:@register%</ui-button></p>
 | 
			
		||||
	<template v-if="$store.state.i.twoFactorEnabled">
 | 
			
		||||
		<p>%i18n:@already-registered%</p>
 | 
			
		||||
@@ -72,9 +72,3 @@ export default Vue.extend({
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="stylus" scoped>
 | 
			
		||||
.2fa
 | 
			
		||||
	color #4a535a
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,40 +0,0 @@
 | 
			
		||||
<template>
 | 
			
		||||
<div class="root api">
 | 
			
		||||
	<ui-input :value="$store.state.i.token" readonly>
 | 
			
		||||
		<span>%i18n:@token%</span>
 | 
			
		||||
	</ui-input>
 | 
			
		||||
	<p>%i18n:@intro%</p>
 | 
			
		||||
	<div class="ui info warn"><p>%fa:exclamation-triangle%%i18n:@caution%</p></div>
 | 
			
		||||
	<p>%i18n:@regeneration-of-token%</p>
 | 
			
		||||
	<ui-button @click="regenerateToken">%i18n:@regenerate-token%</ui-button>
 | 
			
		||||
</div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
import Vue from 'vue';
 | 
			
		||||
 | 
			
		||||
export default Vue.extend({
 | 
			
		||||
	methods: {
 | 
			
		||||
		regenerateToken() {
 | 
			
		||||
			(this as any).apis.input({
 | 
			
		||||
				title: '%i18n:@enter-password%',
 | 
			
		||||
				type: 'password'
 | 
			
		||||
			}).then(password => {
 | 
			
		||||
				(this as any).api('i/regenerate_token', {
 | 
			
		||||
					password: password
 | 
			
		||||
				});
 | 
			
		||||
			});
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="stylus" scoped>
 | 
			
		||||
.root.api
 | 
			
		||||
	code
 | 
			
		||||
		display inline-block
 | 
			
		||||
		padding 4px 6px
 | 
			
		||||
		color #555
 | 
			
		||||
		background #eee
 | 
			
		||||
		border-radius 2px
 | 
			
		||||
</style>
 | 
			
		||||
@@ -1,8 +1,6 @@
 | 
			
		||||
<template>
 | 
			
		||||
<div class="root">
 | 
			
		||||
	<div class="none ui info" v-if="!fetching && apps.length == 0">
 | 
			
		||||
		<p>%fa:info-circle%%i18n:@no-apps%</p>
 | 
			
		||||
	</div>
 | 
			
		||||
	<ui-info v-if="!fetching && apps.length == 0">%i18n:@no-apps%</ui-info>
 | 
			
		||||
	<div class="apps" v-if="apps.length != 0">
 | 
			
		||||
		<div v-for="app in apps">
 | 
			
		||||
			<p><b>{{ app.name }}</b></p>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,34 +0,0 @@
 | 
			
		||||
<template>
 | 
			
		||||
<div class="root">
 | 
			
		||||
	<template v-if="!fetching">
 | 
			
		||||
		<p><b>{{ capacity | bytes }}</b>%i18n:max%<b>{{ usage | bytes }}</b>%i18n:in-use%</p>
 | 
			
		||||
	</template>
 | 
			
		||||
</div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
import Vue from 'vue';
 | 
			
		||||
export default Vue.extend({
 | 
			
		||||
	data() {
 | 
			
		||||
		return {
 | 
			
		||||
			fetching: true,
 | 
			
		||||
			usage: null,
 | 
			
		||||
			capacity: null
 | 
			
		||||
		};
 | 
			
		||||
	},
 | 
			
		||||
	mounted() {
 | 
			
		||||
		(this as any).api('drive').then(info => {
 | 
			
		||||
			this.capacity = info.capacity;
 | 
			
		||||
			this.usage = info.usage;
 | 
			
		||||
			this.fetching = false;
 | 
			
		||||
		});
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="stylus" scoped>
 | 
			
		||||
.root
 | 
			
		||||
	> p
 | 
			
		||||
		> b
 | 
			
		||||
			margin 0 8px
 | 
			
		||||
</style>
 | 
			
		||||
@@ -1,31 +0,0 @@
 | 
			
		||||
<template>
 | 
			
		||||
<div>
 | 
			
		||||
	<div class="none ui info" v-if="!fetching && users.length == 0">
 | 
			
		||||
		<p>%fa:info-circle%%i18n:@no-users%</p>
 | 
			
		||||
	</div>
 | 
			
		||||
	<div class="users" v-if="users.length != 0">
 | 
			
		||||
		<div v-for="user in users" :key="user.id">
 | 
			
		||||
			<p><b>{{ user | userName }}</b> @{{ user | acct }}</p>
 | 
			
		||||
		</div>
 | 
			
		||||
	</div>
 | 
			
		||||
</div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
import Vue from 'vue';
 | 
			
		||||
 | 
			
		||||
export default Vue.extend({
 | 
			
		||||
	data() {
 | 
			
		||||
		return {
 | 
			
		||||
			fetching: true,
 | 
			
		||||
			users: []
 | 
			
		||||
		};
 | 
			
		||||
	},
 | 
			
		||||
	mounted() {
 | 
			
		||||
		(this as any).api('mute/list').then(x => {
 | 
			
		||||
			this.users = x.users;
 | 
			
		||||
			this.fetching = false;
 | 
			
		||||
		});
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
@@ -5,9 +5,9 @@
 | 
			
		||||
		<p :class="{ active: page == 'theme' }" @mousedown="page = 'theme'">%fa:palette .fw%%i18n:@theme%</p>
 | 
			
		||||
		<p :class="{ active: page == 'web' }" @mousedown="page = 'web'">%fa:desktop .fw%Web</p>
 | 
			
		||||
		<p :class="{ active: page == 'notification' }" @mousedown="page = 'notification'">%fa:R bell .fw%%i18n:@notification%</p>
 | 
			
		||||
		<p :class="{ active: page == 'drive' }" @mousedown="page = 'drive'">%fa:cloud .fw%%i18n:@drive%</p>
 | 
			
		||||
		<p :class="{ active: page == 'drive' }" @mousedown="page = 'drive'">%fa:cloud .fw%%i18n:common.drive%</p>
 | 
			
		||||
		<p :class="{ active: page == 'hashtags' }" @mousedown="page = 'hashtags'">%fa:hashtag .fw%%i18n:@tags%</p>
 | 
			
		||||
		<p :class="{ active: page == 'mute' }" @mousedown="page = 'mute'">%fa:ban .fw%%i18n:@mute%</p>
 | 
			
		||||
		<p :class="{ active: page == 'muteAndBlock' }" @mousedown="page = 'muteAndBlock'">%fa:ban .fw%%i18n:@mute-and-block%</p>
 | 
			
		||||
		<p :class="{ active: page == 'apps' }" @mousedown="page = 'apps'">%fa:puzzle-piece .fw%%i18n:@apps%</p>
 | 
			
		||||
		<p :class="{ active: page == 'security' }" @mousedown="page = 'security'">%fa:unlock-alt .fw%%i18n:@security%</p>
 | 
			
		||||
		<p :class="{ active: page == 'api' }" @mousedown="page = 'api'">%fa:key .fw%API</p>
 | 
			
		||||
@@ -189,12 +189,9 @@
 | 
			
		||||
			</section>
 | 
			
		||||
		</ui-card>
 | 
			
		||||
 | 
			
		||||
		<ui-card class="drive" v-show="page == 'drive'">
 | 
			
		||||
			<div slot="title">%fa:cloud% %i18n:@drive%</div>
 | 
			
		||||
			<section>
 | 
			
		||||
				<x-drive/>
 | 
			
		||||
			</section>
 | 
			
		||||
		</ui-card>
 | 
			
		||||
		<div class="drive" v-if="page == 'drive'">
 | 
			
		||||
			<mk-drive-settings/>
 | 
			
		||||
		</div>
 | 
			
		||||
 | 
			
		||||
		<ui-card class="hashtags" v-show="page == 'hashtags'">
 | 
			
		||||
			<div slot="title">%fa:hashtag% %i18n:@tags%</div>
 | 
			
		||||
@@ -203,12 +200,9 @@
 | 
			
		||||
			</section>
 | 
			
		||||
		</ui-card>
 | 
			
		||||
 | 
			
		||||
		<ui-card class="mute" v-show="page == 'mute'">
 | 
			
		||||
			<div slot="title">%fa:ban% %i18n:@mute%</div>
 | 
			
		||||
			<section>
 | 
			
		||||
				<x-mute/>
 | 
			
		||||
			</section>
 | 
			
		||||
		</ui-card>
 | 
			
		||||
		<div class="muteAndBlock" v-show="page == 'muteAndBlock'">
 | 
			
		||||
			<mk-mute-and-block/>
 | 
			
		||||
		</div>
 | 
			
		||||
 | 
			
		||||
		<ui-card class="apps" v-show="page == 'apps'">
 | 
			
		||||
			<div slot="title">%fa:puzzle-piece% %i18n:@apps%</div>
 | 
			
		||||
@@ -238,12 +232,9 @@
 | 
			
		||||
			</section>
 | 
			
		||||
		</ui-card>
 | 
			
		||||
 | 
			
		||||
		<ui-card class="api" v-show="page == 'api'">
 | 
			
		||||
			<div slot="title">%fa:key% API</div>
 | 
			
		||||
			<section class="fit-top">
 | 
			
		||||
				<x-api/>
 | 
			
		||||
			</section>
 | 
			
		||||
		</ui-card>
 | 
			
		||||
		<div class="api" v-show="page == 'api'">
 | 
			
		||||
			<mk-api-settings/>
 | 
			
		||||
		</div>
 | 
			
		||||
 | 
			
		||||
		<ui-card class="other" v-show="page == 'other'">
 | 
			
		||||
			<div slot="title">%fa:info-circle% %i18n:@about%</div>
 | 
			
		||||
@@ -295,26 +286,20 @@
 | 
			
		||||
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
import Vue from 'vue';
 | 
			
		||||
import XMute from './settings.mute.vue';
 | 
			
		||||
import XPassword from './settings.password.vue';
 | 
			
		||||
import X2fa from './settings.2fa.vue';
 | 
			
		||||
import XApi from './settings.api.vue';
 | 
			
		||||
import XApps from './settings.apps.vue';
 | 
			
		||||
import XSignins from './settings.signins.vue';
 | 
			
		||||
import XDrive from './settings.drive.vue';
 | 
			
		||||
import XTags from './settings.tags.vue';
 | 
			
		||||
import { url, langs, version } from '../../../config';
 | 
			
		||||
import checkForUpdate from '../../../common/scripts/check-for-update';
 | 
			
		||||
 | 
			
		||||
export default Vue.extend({
 | 
			
		||||
	components: {
 | 
			
		||||
		XMute,
 | 
			
		||||
		XPassword,
 | 
			
		||||
		X2fa,
 | 
			
		||||
		XApi,
 | 
			
		||||
		XApps,
 | 
			
		||||
		XSignins,
 | 
			
		||||
		XDrive,
 | 
			
		||||
		XTags
 | 
			
		||||
	},
 | 
			
		||||
	props: {
 | 
			
		||||
 
 | 
			
		||||
@@ -11,7 +11,7 @@
 | 
			
		||||
					<router-link :to="`/@${ $store.state.i.username }`">%fa:user%<span>%i18n:@profile%</span>%fa:angle-right%</router-link>
 | 
			
		||||
				</li>
 | 
			
		||||
				<li @click="drive">
 | 
			
		||||
					<p>%fa:cloud%<span>%i18n:@drive%</span>%fa:angle-right%</p>
 | 
			
		||||
					<p>%fa:cloud%<span>%i18n:common.drive%</span>%fa:angle-right%</p>
 | 
			
		||||
				</li>
 | 
			
		||||
				<li>
 | 
			
		||||
					<router-link to="/i/favorites">%fa:star%<span>%i18n:@favorites%</span>%fa:angle-right%</router-link>
 | 
			
		||||
 
 | 
			
		||||
@@ -13,7 +13,7 @@
 | 
			
		||||
			<li v-if="this.$store.state.i && this.$store.state.i.isAdmin"
 | 
			
		||||
				@click="nav('hashtags')" :class="{ active: page == 'hashtags' }">%fa:hashtag .fw%%i18n:@hashtags%</li>
 | 
			
		||||
 | 
			
		||||
			<!-- <li @click="nav('drive')" :class="{ active: page == 'drive' }">%fa:cloud .fw%%i18n:@drive%</li> -->
 | 
			
		||||
			<!-- <li @click="nav('drive')" :class="{ active: page == 'drive' }">%fa:cloud .fw%%i18n:common.drive%</li> -->
 | 
			
		||||
			<!-- <li @click="nav('update')" :class="{ active: page == 'update' }">%i18n:@update%</li> -->
 | 
			
		||||
		</ul>
 | 
			
		||||
	</nav>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,14 +1,14 @@
 | 
			
		||||
<template>
 | 
			
		||||
<x-widgets-column v-if="column.type == 'widgets'" :column="column" :is-stacked="isStacked"/>
 | 
			
		||||
<x-notifications-column v-else-if="column.type == 'notifications'" :column="column" :is-stacked="isStacked"/>
 | 
			
		||||
<x-tl-column v-else-if="column.type == 'home'" :column="column" :is-stacked="isStacked" @parentFocus="parentFocus"/>
 | 
			
		||||
<x-tl-column v-else-if="column.type == 'local'" :column="column" :is-stacked="isStacked" @parentFocus="parentFocus"/>
 | 
			
		||||
<x-tl-column v-else-if="column.type == 'hybrid'" :column="column" :is-stacked="isStacked" @parentFocus="parentFocus"/>
 | 
			
		||||
<x-tl-column v-else-if="column.type == 'global'" :column="column" :is-stacked="isStacked" @parentFocus="parentFocus"/>
 | 
			
		||||
<x-tl-column v-else-if="column.type == 'list'" :column="column" :is-stacked="isStacked" @parentFocus="parentFocus"/>
 | 
			
		||||
<x-tl-column v-else-if="column.type == 'hashtag'" :column="column" :is-stacked="isStacked" @parentFocus="parentFocus"/>
 | 
			
		||||
<x-mentions-column v-else-if="column.type == 'mentions'" :column="column" :is-stacked="isStacked" @parentFocus="parentFocus"/>
 | 
			
		||||
<x-direct-column v-else-if="column.type == 'direct'" :column="column" :is-stacked="isStacked" @parentFocus="parentFocus"/>
 | 
			
		||||
<x-widgets-column v-if="column.type == 'widgets'" :column="column" :is-stacked="isStacked" v-on="$listeners"/>
 | 
			
		||||
<x-notifications-column v-else-if="column.type == 'notifications'" :column="column" :is-stacked="isStacked" v-on="$listeners"/>
 | 
			
		||||
<x-tl-column v-else-if="column.type == 'home'" :column="column" :is-stacked="isStacked" v-on="$listeners"/>
 | 
			
		||||
<x-tl-column v-else-if="column.type == 'local'" :column="column" :is-stacked="isStacked" v-on="$listeners"/>
 | 
			
		||||
<x-tl-column v-else-if="column.type == 'hybrid'" :column="column" :is-stacked="isStacked" v-on="$listeners"/>
 | 
			
		||||
<x-tl-column v-else-if="column.type == 'global'" :column="column" :is-stacked="isStacked" v-on="$listeners"/>
 | 
			
		||||
<x-tl-column v-else-if="column.type == 'list'" :column="column" :is-stacked="isStacked" v-on="$listeners"/>
 | 
			
		||||
<x-tl-column v-else-if="column.type == 'hashtag'" :column="column" :is-stacked="isStacked" v-on="$listeners"/>
 | 
			
		||||
<x-mentions-column v-else-if="column.type == 'mentions'" :column="column" :is-stacked="isStacked" v-on="$listeners"/>
 | 
			
		||||
<x-direct-column v-else-if="column.type == 'direct'" :column="column" :is-stacked="isStacked" v-on="$listeners"/>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
@@ -43,11 +43,7 @@ export default Vue.extend({
 | 
			
		||||
	methods: {
 | 
			
		||||
		focus() {
 | 
			
		||||
			this.$children[0].focus();
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		parentFocus(direction) {
 | 
			
		||||
			this.$emit('parentFocus', direction);
 | 
			
		||||
		},
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,9 @@
 | 
			
		||||
<template>
 | 
			
		||||
<div class="dnpfarvgbnfmyzbdquhhzyxcmstpdqzs" :class="{ naked, narrow, active, isStacked, draghover, dragging, dropready }"
 | 
			
		||||
		@dragover.prevent.stop="onDragover"
 | 
			
		||||
		@dragenter.prevent.stop="onDragenter"
 | 
			
		||||
		@dragleave="onDragleave"
 | 
			
		||||
		@drop.prevent.stop="onDrop">
 | 
			
		||||
		@drop.prevent.stop="onDrop"
 | 
			
		||||
		v-hotkey="keymap">
 | 
			
		||||
	<header :class="{ indicate: count > 0 }"
 | 
			
		||||
			draggable="true"
 | 
			
		||||
			@click="goTop"
 | 
			
		||||
@@ -66,6 +67,15 @@ export default Vue.extend({
 | 
			
		||||
	computed: {
 | 
			
		||||
		isTemporaryColumn(): boolean {
 | 
			
		||||
			return this.column == null;
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		keymap(): any {
 | 
			
		||||
			return {
 | 
			
		||||
				'shift+up': () => this.$parent.$emit('parentFocus', 'up'),
 | 
			
		||||
				'shift+down': () => this.$parent.$emit('parentFocus', 'down'),
 | 
			
		||||
				'shift+left': () => this.$parent.$emit('parentFocus', 'left'),
 | 
			
		||||
				'shift+right': () => this.$parent.$emit('parentFocus', 'right'),
 | 
			
		||||
			};
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
@@ -259,7 +269,7 @@ export default Vue.extend({
 | 
			
		||||
			this.dragging = false;
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		onDragover(e) {
 | 
			
		||||
		onDragenter(e) {
 | 
			
		||||
			// テンポラリカラムにはドロップさせない
 | 
			
		||||
			if (this.isTemporaryColumn) {
 | 
			
		||||
				e.dataTransfer.dropEffect = 'none';
 | 
			
		||||
@@ -277,7 +287,7 @@ export default Vue.extend({
 | 
			
		||||
 | 
			
		||||
			e.dataTransfer.dropEffect = isDeckColumn ? 'move' : 'none';
 | 
			
		||||
 | 
			
		||||
			if (!this.dragging) this.draghover = true;
 | 
			
		||||
			if (!this.dragging && isDeckColumn) this.draghover = true;
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		onDragleave() {
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
<x-column :name="name" :column="column" :is-stacked="isStacked">
 | 
			
		||||
	<span slot="header">%fa:envelope R%{{ name }}</span>
 | 
			
		||||
 | 
			
		||||
	<x-direct @parentFocus="parentFocus"/>
 | 
			
		||||
	<x-direct/>
 | 
			
		||||
</x-column>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
@@ -38,11 +38,7 @@ export default Vue.extend({
 | 
			
		||||
	methods: {
 | 
			
		||||
		focus() {
 | 
			
		||||
			this.$refs.tl.focus();
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		parentFocus(direction) {
 | 
			
		||||
			this.$emit('parentFocus', direction);
 | 
			
		||||
		},
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
<template>
 | 
			
		||||
	<x-notes ref="timeline" :more="existMore ? more : null" @parentFocus="parentFocus"/>
 | 
			
		||||
	<x-notes ref="timeline" :more="existMore ? more : null"/>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
@@ -93,11 +93,7 @@ export default Vue.extend({
 | 
			
		||||
 | 
			
		||||
		focus() {
 | 
			
		||||
			this.$refs.timeline.focus();
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		parentFocus(direction) {
 | 
			
		||||
			this.$emit('parentFocus', direction);
 | 
			
		||||
		},
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,10 @@
 | 
			
		||||
		%fa:hashtag%<span>{{ tag }}</span>
 | 
			
		||||
	</span>
 | 
			
		||||
 | 
			
		||||
	<x-hashtag-tl :tag-tl="tagTl"/>
 | 
			
		||||
	<div class="xroyrflcmhhtmlwmyiwpfqiirqokfueb">
 | 
			
		||||
		<div ref="chart" class="chart"></div>
 | 
			
		||||
		<x-hashtag-tl :tag-tl="tagTl" class="tl"/>
 | 
			
		||||
	</div>
 | 
			
		||||
</x-column>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
@@ -12,6 +15,7 @@
 | 
			
		||||
import Vue from 'vue';
 | 
			
		||||
import XColumn from './deck.column.vue';
 | 
			
		||||
import XHashtagTl from './deck.hashtag-tl.vue';
 | 
			
		||||
import * as ApexCharts from 'apexcharts';
 | 
			
		||||
 | 
			
		||||
export default Vue.extend({
 | 
			
		||||
	components: {
 | 
			
		||||
@@ -32,6 +36,77 @@ export default Vue.extend({
 | 
			
		||||
				query: [[this.tag]]
 | 
			
		||||
			};
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	mounted() {
 | 
			
		||||
		(this as any).api('charts/hashtag', {
 | 
			
		||||
			tag: this.tag,
 | 
			
		||||
			span: 'hour',
 | 
			
		||||
			limit: 24
 | 
			
		||||
		}).then(stats => {
 | 
			
		||||
			const local = [];
 | 
			
		||||
			const remote = [];
 | 
			
		||||
 | 
			
		||||
			const now = new Date();
 | 
			
		||||
			const y = now.getFullYear();
 | 
			
		||||
			const m = now.getMonth();
 | 
			
		||||
			const d = now.getDate();
 | 
			
		||||
			const h = now.getHours();
 | 
			
		||||
 | 
			
		||||
			for (let i = 0; i < 24; i++) {
 | 
			
		||||
				const x = new Date(y, m, d, h - i);
 | 
			
		||||
				local.push([x, stats.local.count[i]]);
 | 
			
		||||
				remote.push([x, stats.remote.count[i]]);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			const chart = new ApexCharts(this.$refs.chart, {
 | 
			
		||||
				chart: {
 | 
			
		||||
					type: 'area',
 | 
			
		||||
					height: 70,
 | 
			
		||||
					sparkline: {
 | 
			
		||||
						enabled: true
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				grid: {
 | 
			
		||||
					clipMarkers: false,
 | 
			
		||||
					padding: {
 | 
			
		||||
						top: 16,
 | 
			
		||||
						right: 16,
 | 
			
		||||
						bottom: 16,
 | 
			
		||||
						left: 16
 | 
			
		||||
					}
 | 
			
		||||
				},
 | 
			
		||||
				stroke: {
 | 
			
		||||
					curve: 'straight',
 | 
			
		||||
					width: 2
 | 
			
		||||
				},
 | 
			
		||||
				series: [{
 | 
			
		||||
					name: 'Local',
 | 
			
		||||
					data: local
 | 
			
		||||
				}, {
 | 
			
		||||
					name: 'Remote',
 | 
			
		||||
					data: remote
 | 
			
		||||
				}],
 | 
			
		||||
				xaxis: {
 | 
			
		||||
					type: 'datetime',
 | 
			
		||||
				}
 | 
			
		||||
			});
 | 
			
		||||
 | 
			
		||||
			chart.render();
 | 
			
		||||
		});
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="stylus" scoped>
 | 
			
		||||
.xroyrflcmhhtmlwmyiwpfqiirqokfueb
 | 
			
		||||
	background var(--deckColumnBg)
 | 
			
		||||
 | 
			
		||||
	> .chart
 | 
			
		||||
		margin-bottom 16px
 | 
			
		||||
		background var(--face)
 | 
			
		||||
 | 
			
		||||
	> .tl
 | 
			
		||||
		background var(--face)
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
<template>
 | 
			
		||||
<x-notes ref="timeline" :more="existMore ? more : null" :media-view="mediaView" @parentFocus="parentFocus"/>
 | 
			
		||||
<x-notes ref="timeline" :more="existMore ? more : null" :media-view="mediaView"/>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
@@ -47,14 +47,16 @@ export default Vue.extend({
 | 
			
		||||
 | 
			
		||||
	mounted() {
 | 
			
		||||
		if (this.connection) this.connection.close();
 | 
			
		||||
		this.connection = (this as any).os.stream.connectToChannel('hashtag', this.tagTl.query);
 | 
			
		||||
		this.connection = (this as any).os.stream.connectToChannel('hashtag', {
 | 
			
		||||
			q: this.tagTl.query
 | 
			
		||||
		});
 | 
			
		||||
		this.connection.on('note', this.onNote);
 | 
			
		||||
 | 
			
		||||
		this.fetch();
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	beforeDestroy() {
 | 
			
		||||
		this.connection.close();
 | 
			
		||||
		this.connection.dispose();
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	methods: {
 | 
			
		||||
@@ -116,11 +118,7 @@ export default Vue.extend({
 | 
			
		||||
 | 
			
		||||
		focus() {
 | 
			
		||||
			this.$refs.timeline.focus();
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		parentFocus(direction) {
 | 
			
		||||
			this.$emit('parentFocus', direction);
 | 
			
		||||
		},
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
<template>
 | 
			
		||||
<x-notes ref="timeline" :more="existMore ? more : null" :media-view="mediaView" @parentFocus="parentFocus"/>
 | 
			
		||||
<x-notes ref="timeline" :more="existMore ? more : null" :media-view="mediaView"/>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
@@ -128,11 +128,7 @@ export default Vue.extend({
 | 
			
		||||
 | 
			
		||||
		focus() {
 | 
			
		||||
			this.$refs.timeline.focus();
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		parentFocus(direction) {
 | 
			
		||||
			this.$emit('parentFocus', direction);
 | 
			
		||||
		},
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
<x-column :name="name" :column="column" :is-stacked="isStacked">
 | 
			
		||||
	<span slot="header">%fa:at%{{ name }}</span>
 | 
			
		||||
 | 
			
		||||
	<x-mentions ref="tl" @parentFocus="parentFocus"/>
 | 
			
		||||
	<x-mentions ref="tl"/>
 | 
			
		||||
</x-column>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
@@ -38,11 +38,7 @@ export default Vue.extend({
 | 
			
		||||
	methods: {
 | 
			
		||||
		focus() {
 | 
			
		||||
			this.$refs.tl.focus();
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		parentFocus(direction) {
 | 
			
		||||
			this.$emit('parentFocus', direction);
 | 
			
		||||
		},
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
<template>
 | 
			
		||||
	<x-notes ref="timeline" :more="existMore ? more : null" @parentFocus="parentFocus"/>
 | 
			
		||||
	<x-notes ref="timeline" :more="existMore ? more : null"/>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
@@ -89,11 +89,7 @@ export default Vue.extend({
 | 
			
		||||
 | 
			
		||||
		focus() {
 | 
			
		||||
			this.$refs.timeline.focus();
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		parentFocus(direction) {
 | 
			
		||||
			this.$emit('parentFocus', direction);
 | 
			
		||||
		},
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,12 @@
 | 
			
		||||
	</span>
 | 
			
		||||
 | 
			
		||||
	<div class="rvtscbadixhhbsczoorqoaygovdeecsx" v-if="note">
 | 
			
		||||
		<div class="is-remote" v-if="note.user.host != null">%fa:exclamation-triangle% %i18n:@is-remote%<a :href="note.url || note.uri" target="_blank">%i18n:@view-remote%</a></div>
 | 
			
		||||
		<div class="is-remote" v-if="note.user.host != null">
 | 
			
		||||
			<details>
 | 
			
		||||
				<summary>%fa:exclamation-triangle% %i18n:common.is-remote-post%</summary>
 | 
			
		||||
				<a :href="note.url || note.uri" target="_blank">%i18n:common.view-on-remote%</a>
 | 
			
		||||
			</details>
 | 
			
		||||
		</div>
 | 
			
		||||
		<x-note :note="note" :detail="true" :mini="true"/>
 | 
			
		||||
	</div>
 | 
			
		||||
</x-column>
 | 
			
		||||
 
 | 
			
		||||
@@ -8,10 +8,7 @@
 | 
			
		||||
		</template>
 | 
			
		||||
	</div>
 | 
			
		||||
 | 
			
		||||
	<div v-if="!fetching && requestInitPromise != null">
 | 
			
		||||
		<p>%i18n:@error%</p>
 | 
			
		||||
		<button @click="resolveInitPromise">%i18n:@retry%</button>
 | 
			
		||||
	</div>
 | 
			
		||||
	<mk-error v-if="!fetching && requestInitPromise != null" @retry="resolveInitPromise"/>
 | 
			
		||||
 | 
			
		||||
	<!-- トランジションを有効にするとなぜかメモリリークする -->
 | 
			
		||||
	<!--<transition-group name="mk-notes" class="transition" ref="notes">-->
 | 
			
		||||
@@ -22,8 +19,7 @@
 | 
			
		||||
				:key="note.id"
 | 
			
		||||
				@update:note="onNoteUpdated(i, $event)"
 | 
			
		||||
				:media-view="mediaView"
 | 
			
		||||
				:mini="true"
 | 
			
		||||
				@parentFocus="parentFocus"/>
 | 
			
		||||
				:mini="true"/>
 | 
			
		||||
			<p class="date" :key="note.id + '_date'" v-if="i != notes.length - 1 && note._date != _notes[i + 1]._date">
 | 
			
		||||
				<span>%fa:angle-up%{{ note._datetext }}</span>
 | 
			
		||||
				<span>%fa:angle-down%{{ _notes[i + 1]._datetext }}</span>
 | 
			
		||||
@@ -111,10 +107,6 @@ export default Vue.extend({
 | 
			
		||||
			(this.$refs.notes as any).children[0].focus ? (this.$refs.notes as any).children[0].focus() : (this.$refs.notes as any).$el.children[0].focus();
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		parentFocus(direction) {
 | 
			
		||||
			this.$emit('parentFocus', direction);
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		onNoteUpdated(i, note) {
 | 
			
		||||
			Vue.set((this as any).notes, i, note);
 | 
			
		||||
		},
 | 
			
		||||
@@ -164,8 +156,8 @@ export default Vue.extend({
 | 
			
		||||
			}
 | 
			
		||||
			//#endregion
 | 
			
		||||
 | 
			
		||||
			// タブが非表示またはスクロール位置が最上部ではないならタイトルで通知
 | 
			
		||||
			if (document.hidden || !this.isScrollTop()) {
 | 
			
		||||
			// タブが非表示ならタイトルで通知
 | 
			
		||||
			if (document.hidden) {
 | 
			
		||||
				this.$store.commit('pushBehindNote', note);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
@@ -234,7 +226,7 @@ export default Vue.extend({
 | 
			
		||||
		> .date
 | 
			
		||||
			display block
 | 
			
		||||
			margin 0
 | 
			
		||||
			line-height 32px
 | 
			
		||||
			line-height 28px
 | 
			
		||||
			font-size 12px
 | 
			
		||||
			text-align center
 | 
			
		||||
			color var(--dateDividerFg)
 | 
			
		||||
 
 | 
			
		||||
@@ -178,9 +178,9 @@ export default Vue.extend({
 | 
			
		||||
		> .date
 | 
			
		||||
			display block
 | 
			
		||||
			margin 0
 | 
			
		||||
			line-height 32px
 | 
			
		||||
			line-height 28px
 | 
			
		||||
			text-align center
 | 
			
		||||
			font-size 0.8em
 | 
			
		||||
			font-size 12px
 | 
			
		||||
			color var(--dateDividerFg)
 | 
			
		||||
			background var(--dateDividerBg)
 | 
			
		||||
			border-bottom solid 1px var(--faceDivider)
 | 
			
		||||
 
 | 
			
		||||
@@ -20,21 +20,18 @@
 | 
			
		||||
		:media-only="column.isMediaOnly"
 | 
			
		||||
		:media-view="column.isMediaView"
 | 
			
		||||
		ref="tl"
 | 
			
		||||
		@parentFocus="parentFocus"
 | 
			
		||||
	/>
 | 
			
		||||
	<x-hashtag-tl v-else-if="column.type == 'hashtag'"
 | 
			
		||||
		:tag-tl="$store.state.settings.tagTimelines.find(x => x.id == column.tagTlId)"
 | 
			
		||||
		:media-only="column.isMediaOnly"
 | 
			
		||||
		:media-view="column.isMediaView"
 | 
			
		||||
		ref="tl"
 | 
			
		||||
		@parentFocus="parentFocus"
 | 
			
		||||
	/>
 | 
			
		||||
	<x-tl v-else
 | 
			
		||||
		:src="column.type"
 | 
			
		||||
		:media-only="column.isMediaOnly"
 | 
			
		||||
		:media-view="column.isMediaView"
 | 
			
		||||
		ref="tl"
 | 
			
		||||
		@parentFocus="parentFocus"
 | 
			
		||||
	/>
 | 
			
		||||
</x-column>
 | 
			
		||||
</template>
 | 
			
		||||
@@ -100,11 +97,7 @@ export default Vue.extend({
 | 
			
		||||
 | 
			
		||||
		focus() {
 | 
			
		||||
			this.$refs.tl.focus();
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		parentFocus(direction) {
 | 
			
		||||
			this.$emit('parentFocus', direction);
 | 
			
		||||
		},
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
<template>
 | 
			
		||||
<x-notes ref="timeline" :more="existMore ? more : null" :media-view="mediaView" @parentFocus="parentFocus"/>
 | 
			
		||||
<x-notes ref="timeline" :more="existMore ? more : null" :media-view="mediaView"/>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
@@ -143,11 +143,7 @@ export default Vue.extend({
 | 
			
		||||
 | 
			
		||||
		focus() {
 | 
			
		||||
			(this.$refs.timeline as any).focus();
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		parentFocus(direction) {
 | 
			
		||||
			this.$emit('parentFocus', direction);
 | 
			
		||||
		},
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
 
 | 
			
		||||
@@ -5,9 +5,15 @@
 | 
			
		||||
	</span>
 | 
			
		||||
 | 
			
		||||
	<div class="zubukjlciycdsyynicqrnlsmdwmymzqu" v-if="user">
 | 
			
		||||
		<div class="is-remote" v-if="user.host != null">%fa:exclamation-triangle% %i18n:@is-remote%<a :href="user.url || user.uri" target="_blank">%i18n:@view-remote%</a></div>
 | 
			
		||||
		<div class="is-remote" v-if="user.host != null">
 | 
			
		||||
			<details>
 | 
			
		||||
				<summary>%fa:exclamation-triangle% %i18n:common.is-remote-user%</summary>
 | 
			
		||||
				<a :href="user.url || user.uri" target="_blank">%i18n:common.view-on-remote%</a>
 | 
			
		||||
			</details>
 | 
			
		||||
		</div>
 | 
			
		||||
		<header :style="bannerStyle">
 | 
			
		||||
			<div>
 | 
			
		||||
				<button class="menu" @click="menu" ref="menu">%fa:ellipsis-h%</button>
 | 
			
		||||
				<mk-follow-button v-if="$store.getters.isSignedIn && user.id != $store.state.i.id" :user="user" class="follow"/>
 | 
			
		||||
				<mk-avatar class="avatar" :user="user" :disable-preview="true"/>
 | 
			
		||||
				<span class="name">{{ user | userName }}</span>
 | 
			
		||||
@@ -18,20 +24,57 @@
 | 
			
		||||
			<div class="description">
 | 
			
		||||
				<misskey-flavored-markdown v-if="user.description" :text="user.description" :i="$store.state.i"/>
 | 
			
		||||
			</div>
 | 
			
		||||
			<div class="counts">
 | 
			
		||||
				<div>
 | 
			
		||||
					<b>{{ user.notesCount | number }}</b>
 | 
			
		||||
					<span>%i18n:@posts%</span>
 | 
			
		||||
				</div>
 | 
			
		||||
				<div>
 | 
			
		||||
					<b>{{ user.followingCount | number }}</b>
 | 
			
		||||
					<span>%i18n:@following%</span>
 | 
			
		||||
				</div>
 | 
			
		||||
				<div>
 | 
			
		||||
					<b>{{ user.followersCount | number }}</b>
 | 
			
		||||
					<span>%i18n:@followers%</span>
 | 
			
		||||
				</div>
 | 
			
		||||
			</div>
 | 
			
		||||
		</div>
 | 
			
		||||
		<div class="pinned" v-if="user.pinnedNotes && user.pinnedNotes.length > 0">
 | 
			
		||||
			<p>%fa:thumbtack% %i18n:@pinned-notes%</p>
 | 
			
		||||
			<div class="notes">
 | 
			
		||||
			<p class="caption" @click="toggleShowPinned">%fa:thumbtack% %i18n:@pinned-notes%</p>
 | 
			
		||||
			<span class="angle" v-if="showPinned">%fa:angle-up%</span>
 | 
			
		||||
			<span class="angle" v-else>%fa:angle-down%</span>
 | 
			
		||||
			<div class="notes" v-show="showPinned">
 | 
			
		||||
				<x-note v-for="n in user.pinnedNotes" :key="n.id" :note="n" :mini="true"/>
 | 
			
		||||
			</div>
 | 
			
		||||
		</div>
 | 
			
		||||
		<div class="images" v-if="images.length > 0">
 | 
			
		||||
			<router-link v-for="image in images" :style="`background-image: url(${image.thumbnailUrl})`" :key="`${image.id}:${image._note.id}`" :to="image._note | notePage"></router-link>
 | 
			
		||||
			<p class="caption" @click="toggleShowImages">%fa:images R% %i18n:@images%</p>
 | 
			
		||||
			<span class="angle" v-if="showImages">%fa:angle-up%</span>
 | 
			
		||||
			<span class="angle" v-else>%fa:angle-down%</span>
 | 
			
		||||
			<div v-show="showImages">
 | 
			
		||||
				<router-link v-for="image in images"
 | 
			
		||||
					:style="`background-image: url(${image.thumbnailUrl})`"
 | 
			
		||||
					:key="`${image.id}:${image._note.id}`"
 | 
			
		||||
					:to="image._note | notePage"
 | 
			
		||||
					:title="`${image.name}\n${(new Date(image.createdAt)).toLocaleString()}`"
 | 
			
		||||
				></router-link>
 | 
			
		||||
			</div>
 | 
			
		||||
		</div>
 | 
			
		||||
		<div class="activity">
 | 
			
		||||
			<p class="caption" @click="toggleShowActivity">%fa:chart-bar R% %i18n:@activity%</p>
 | 
			
		||||
			<span class="angle" v-if="showActivity">%fa:angle-up%</span>
 | 
			
		||||
			<span class="angle" v-else>%fa:angle-down%</span>
 | 
			
		||||
			<div v-show="showActivity">
 | 
			
		||||
				<div ref="chart"></div>
 | 
			
		||||
			</div>
 | 
			
		||||
		</div>
 | 
			
		||||
		<div class="tl">
 | 
			
		||||
			<p class="caption">%fa:comment-alt R% %i18n:@timeline%</p>
 | 
			
		||||
			<div>
 | 
			
		||||
				<x-notes ref="timeline" :more="existMore ? fetchMoreNotes : null"/>
 | 
			
		||||
			</div>
 | 
			
		||||
		</div>
 | 
			
		||||
	</div>
 | 
			
		||||
</x-column>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
@@ -41,7 +84,11 @@ import parseAcct from '../../../../../../misc/acct/parse';
 | 
			
		||||
import XColumn from './deck.column.vue';
 | 
			
		||||
import XNotes from './deck.notes.vue';
 | 
			
		||||
import XNote from '../../components/note.vue';
 | 
			
		||||
import Menu from '../../../../common/views/components/menu.vue';
 | 
			
		||||
import MkUserListsWindow from '../../components/user-lists-window.vue';
 | 
			
		||||
import Ok from '../../../../common/views/components/ok.vue';
 | 
			
		||||
import { concat } from '../../../../../../prelude/array';
 | 
			
		||||
import * as ApexCharts from 'apexcharts';
 | 
			
		||||
 | 
			
		||||
const fetchLimit = 10;
 | 
			
		||||
 | 
			
		||||
@@ -66,7 +113,10 @@ export default Vue.extend({
 | 
			
		||||
			existMore: false,
 | 
			
		||||
			moreFetching: false,
 | 
			
		||||
			withFiles: false,
 | 
			
		||||
			images: []
 | 
			
		||||
			images: [],
 | 
			
		||||
			showPinned: true,
 | 
			
		||||
			showImages: true,
 | 
			
		||||
			showActivity: true
 | 
			
		||||
		};
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
@@ -111,7 +161,87 @@ export default Vue.extend({
 | 
			
		||||
					});
 | 
			
		||||
				});
 | 
			
		||||
				const files = concat(notes.map((n: any): any[] => n.files));
 | 
			
		||||
				this.images = files.filter(f => image.includes(f.type)).slice(0, 6);
 | 
			
		||||
				this.images = files.filter(f => image.includes(f.type)).slice(0, 9);
 | 
			
		||||
			});
 | 
			
		||||
 | 
			
		||||
			(this as any).api('charts/user/notes', {
 | 
			
		||||
				userId: this.user.id,
 | 
			
		||||
				span: 'day',
 | 
			
		||||
				limit: 21
 | 
			
		||||
			}).then(stats => {
 | 
			
		||||
				const normal = [];
 | 
			
		||||
				const reply = [];
 | 
			
		||||
				const renote = [];
 | 
			
		||||
 | 
			
		||||
				const now = new Date();
 | 
			
		||||
				const y = now.getFullYear();
 | 
			
		||||
				const m = now.getMonth();
 | 
			
		||||
				const d = now.getDate();
 | 
			
		||||
 | 
			
		||||
				for (let i = 0; i < 21; i++) {
 | 
			
		||||
					const x = new Date(y, m, d - i);
 | 
			
		||||
					normal.push([
 | 
			
		||||
						x,
 | 
			
		||||
						stats.diffs.normal[i]
 | 
			
		||||
					]);
 | 
			
		||||
					reply.push([
 | 
			
		||||
						x,
 | 
			
		||||
						stats.diffs.reply[i]
 | 
			
		||||
					]);
 | 
			
		||||
					renote.push([
 | 
			
		||||
						x,
 | 
			
		||||
						stats.diffs.renote[i]
 | 
			
		||||
					]);
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				const chart = new ApexCharts(this.$refs.chart, {
 | 
			
		||||
					chart: {
 | 
			
		||||
						type: 'bar',
 | 
			
		||||
						stacked: true,
 | 
			
		||||
						height: 100,
 | 
			
		||||
						sparkline: {
 | 
			
		||||
							enabled: true
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
					plotOptions: {
 | 
			
		||||
						bar: {
 | 
			
		||||
							columnWidth: '90%',
 | 
			
		||||
							endingShape: 'rounded'
 | 
			
		||||
						}
 | 
			
		||||
					},
 | 
			
		||||
					grid: {
 | 
			
		||||
						clipMarkers: false,
 | 
			
		||||
						padding: {
 | 
			
		||||
							top: 16,
 | 
			
		||||
							right: 16,
 | 
			
		||||
							bottom: 16,
 | 
			
		||||
							left: 16
 | 
			
		||||
						}
 | 
			
		||||
					},
 | 
			
		||||
					tooltip: {
 | 
			
		||||
						shared: true,
 | 
			
		||||
						intersect: false
 | 
			
		||||
					},
 | 
			
		||||
					series: [{
 | 
			
		||||
						name: 'Normal',
 | 
			
		||||
						data: normal
 | 
			
		||||
					}, {
 | 
			
		||||
						name: 'Reply',
 | 
			
		||||
						data: reply
 | 
			
		||||
					}, {
 | 
			
		||||
						name: 'Renote',
 | 
			
		||||
						data: renote
 | 
			
		||||
					}],
 | 
			
		||||
					xaxis: {
 | 
			
		||||
						type: 'datetime',
 | 
			
		||||
						crosshairs: {
 | 
			
		||||
							width: 1,
 | 
			
		||||
							opacity: 1
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				});
 | 
			
		||||
 | 
			
		||||
				chart.render();
 | 
			
		||||
			});
 | 
			
		||||
		});
 | 
			
		||||
	},
 | 
			
		||||
@@ -161,13 +291,49 @@ export default Vue.extend({
 | 
			
		||||
 | 
			
		||||
			return promise;
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		menu() {
 | 
			
		||||
			let menu = [{
 | 
			
		||||
				icon: '%fa:list%',
 | 
			
		||||
				text: '%i18n:@push-to-a-list%',
 | 
			
		||||
				action: () => {
 | 
			
		||||
					const w = (this as any).os.new(MkUserListsWindow);
 | 
			
		||||
					w.$once('choosen', async list => {
 | 
			
		||||
						w.close();
 | 
			
		||||
						await (this as any).api('users/lists/push', {
 | 
			
		||||
							listId: list.id,
 | 
			
		||||
							userId: this.user.id
 | 
			
		||||
						});
 | 
			
		||||
						(this as any).os.new(Ok);
 | 
			
		||||
					});
 | 
			
		||||
				}
 | 
			
		||||
			}];
 | 
			
		||||
 | 
			
		||||
			this.os.new(Menu, {
 | 
			
		||||
				source: this.$refs.menu,
 | 
			
		||||
				compact: false,
 | 
			
		||||
				items: menu
 | 
			
		||||
			});
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		toggleShowPinned() {
 | 
			
		||||
			this.showPinned = !this.showPinned;
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		toggleShowImages() {
 | 
			
		||||
			this.showImages = !this.showImages;
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		toggleShowActivity() {
 | 
			
		||||
			this.showActivity = !this.showActivity;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="stylus" scoped>
 | 
			
		||||
.zubukjlciycdsyynicqrnlsmdwmymzqu
 | 
			
		||||
	background var(--deckUserColumnBg)
 | 
			
		||||
	background var(--deckColumnBg)
 | 
			
		||||
 | 
			
		||||
	> .is-remote
 | 
			
		||||
		padding 8px 16px
 | 
			
		||||
@@ -191,6 +357,14 @@ export default Vue.extend({
 | 
			
		||||
			color #fff
 | 
			
		||||
			text-align center
 | 
			
		||||
 | 
			
		||||
			> .menu
 | 
			
		||||
				position absolute
 | 
			
		||||
				top 8px
 | 
			
		||||
				left 8px
 | 
			
		||||
				padding 8px
 | 
			
		||||
				font-size 16px
 | 
			
		||||
				text-shadow 0 0 8px #000
 | 
			
		||||
 | 
			
		||||
			> .follow
 | 
			
		||||
				position absolute
 | 
			
		||||
				top 16px
 | 
			
		||||
@@ -215,11 +389,10 @@ export default Vue.extend({
 | 
			
		||||
 | 
			
		||||
	> .info
 | 
			
		||||
		padding 16px
 | 
			
		||||
		font-size 14px
 | 
			
		||||
		font-size 12px
 | 
			
		||||
		color var(--text)
 | 
			
		||||
		text-align center
 | 
			
		||||
		background var(--face)
 | 
			
		||||
		border-bottom solid 1px var(--faceDivider)
 | 
			
		||||
 | 
			
		||||
		&:before
 | 
			
		||||
			content ""
 | 
			
		||||
@@ -235,35 +408,65 @@ export default Vue.extend({
 | 
			
		||||
			border-right solid 16px transparent
 | 
			
		||||
			border-bottom solid 16px var(--face)
 | 
			
		||||
 | 
			
		||||
	> .pinned
 | 
			
		||||
		padding-bottom 16px
 | 
			
		||||
		background var(--deckUserColumnBg)
 | 
			
		||||
		> .counts
 | 
			
		||||
			display grid
 | 
			
		||||
			grid-template-columns 1fr 1fr 1fr
 | 
			
		||||
			margin-top 8px
 | 
			
		||||
			border-top solid 1px var(--faceDivider)
 | 
			
		||||
 | 
			
		||||
		> p
 | 
			
		||||
			> div
 | 
			
		||||
				padding 8px 8px 0 8px
 | 
			
		||||
				text-align center
 | 
			
		||||
 | 
			
		||||
				> b
 | 
			
		||||
					display block
 | 
			
		||||
					font-size 110%
 | 
			
		||||
 | 
			
		||||
				> span
 | 
			
		||||
					display block
 | 
			
		||||
					font-size 80%
 | 
			
		||||
					opacity 0.7
 | 
			
		||||
 | 
			
		||||
	> *
 | 
			
		||||
		> p.caption
 | 
			
		||||
			margin 0
 | 
			
		||||
			padding 8px 16px
 | 
			
		||||
			font-size 12px
 | 
			
		||||
			color var(--text)
 | 
			
		||||
 | 
			
		||||
			& + .angle
 | 
			
		||||
				position absolute
 | 
			
		||||
				top 0
 | 
			
		||||
				right 8px
 | 
			
		||||
				padding 6px
 | 
			
		||||
				font-size 14px
 | 
			
		||||
				color var(--text)
 | 
			
		||||
 | 
			
		||||
	> .pinned
 | 
			
		||||
		> .notes
 | 
			
		||||
			background var(--face)
 | 
			
		||||
 | 
			
		||||
	> .images
 | 
			
		||||
		> div
 | 
			
		||||
			display grid
 | 
			
		||||
		grid-template-rows 1fr 1fr 1fr
 | 
			
		||||
			grid-template-columns 1fr 1fr 1fr
 | 
			
		||||
		gap 4px
 | 
			
		||||
		height 250px
 | 
			
		||||
			gap 8px
 | 
			
		||||
			padding 16px
 | 
			
		||||
		margin-bottom 16px
 | 
			
		||||
			background var(--face)
 | 
			
		||||
 | 
			
		||||
			> *
 | 
			
		||||
				height 70px
 | 
			
		||||
				background-position center center
 | 
			
		||||
				background-size cover
 | 
			
		||||
				background-clip content-box
 | 
			
		||||
				border-radius 4px
 | 
			
		||||
 | 
			
		||||
	> .activity
 | 
			
		||||
		> div
 | 
			
		||||
			background var(--face)
 | 
			
		||||
 | 
			
		||||
	> .tl
 | 
			
		||||
		> div
 | 
			
		||||
			background var(--face)
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
 
 | 
			
		||||
@@ -18,7 +18,7 @@
 | 
			
		||||
		</div>
 | 
			
		||||
		<div class="info">
 | 
			
		||||
			<span class="location" v-if="user.host === null && user.profile.location">%fa:map-marker% {{ user.profile.location }}</span>
 | 
			
		||||
			<span class="birthday" v-if="user.host === null && user.profile.birthday">%fa:birthday-cake% {{ user.profile.birthday.replace('-', '年').replace('-', '月') + '日' }} ({{ age }}歳)</span>
 | 
			
		||||
			<span class="birthday" v-if="user.host === null && user.profile.birthday">%fa:birthday-cake% {{ user.profile.birthday.replace('-', '%i18n:@year%').replace('-', '%i18n:@month%') + '%i18n:@day%' }} ({{ age }}%i18n:@years-old%)</span>
 | 
			
		||||
		</div>
 | 
			
		||||
		<div class="status">
 | 
			
		||||
			<span class="notes-count"><b>{{ user.notesCount | number }}</b>%i18n:@posts%</span>
 | 
			
		||||
 
 | 
			
		||||
@@ -9,11 +9,15 @@
 | 
			
		||||
		</p>
 | 
			
		||||
	</div>
 | 
			
		||||
	<div class="action-form">
 | 
			
		||||
		<button class="mute ui" @click="user.isMuted ? unmute() : mute()" v-if="$store.state.i.id != user.id">
 | 
			
		||||
		<ui-button @click="user.isMuted ? unmute() : mute()" v-if="$store.state.i.id != user.id">
 | 
			
		||||
			<span v-if="user.isMuted">%fa:eye% %i18n:@unmute%</span>
 | 
			
		||||
			<span v-if="!user.isMuted">%fa:eye-slash% %i18n:@mute%</span>
 | 
			
		||||
		</button>
 | 
			
		||||
		<button class="mute ui" @click="list">%fa:list% %i18n:@push-to-a-list%</button>
 | 
			
		||||
			<span v-else>%fa:eye-slash% %i18n:@mute%</span>
 | 
			
		||||
		</ui-button>
 | 
			
		||||
		<ui-button @click="user.isBlocking ? unblock() : block()" v-if="$store.state.i.id != user.id">
 | 
			
		||||
			<span v-if="user.isBlocking">%fa:user% %i18n:@unblock%</span>
 | 
			
		||||
			<span v-else>%fa:user-slash% %i18n:@block%</span>
 | 
			
		||||
		</ui-button>
 | 
			
		||||
		<ui-button @click="list">%fa:list% %i18n:@push-to-a-list%</ui-button>
 | 
			
		||||
	</div>
 | 
			
		||||
</div>
 | 
			
		||||
</template>
 | 
			
		||||
@@ -66,6 +70,27 @@ export default Vue.extend({
 | 
			
		||||
			});
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		block() {
 | 
			
		||||
			if (!window.confirm('%i18n:@block-confirm%')) return;
 | 
			
		||||
			(this as any).api('blocking/create', {
 | 
			
		||||
				userId: this.user.id
 | 
			
		||||
			}).then(() => {
 | 
			
		||||
				this.user.isBlocking = true;
 | 
			
		||||
			}, () => {
 | 
			
		||||
				alert('error');
 | 
			
		||||
			});
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		unblock() {
 | 
			
		||||
			(this as any).api('blocking/delete', {
 | 
			
		||||
				userId: this.user.id
 | 
			
		||||
			}).then(() => {
 | 
			
		||||
				this.user.isBlocking = false;
 | 
			
		||||
			}, () => {
 | 
			
		||||
				alert('error');
 | 
			
		||||
			});
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		list() {
 | 
			
		||||
			const w = (this as any).os.new(MkUserListsWindow);
 | 
			
		||||
			w.$once('choosen', async list => {
 | 
			
		||||
@@ -114,7 +139,6 @@ export default Vue.extend({
 | 
			
		||||
	> .action-form
 | 
			
		||||
		padding 16px
 | 
			
		||||
		text-align center
 | 
			
		||||
		border-bottom solid 1px var(--faceDivider)
 | 
			
		||||
 | 
			
		||||
		> *
 | 
			
		||||
			width 100%
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
<mk-ui>
 | 
			
		||||
	<div class="xygkxeaeontfaokvqmiblezmhvhostak" v-if="!fetching">
 | 
			
		||||
		<div class="is-suspended" v-if="user.isSuspended">%fa:exclamation-triangle% %i18n:@is-suspended%</div>
 | 
			
		||||
		<div class="is-remote" v-if="user.host != null">%fa:exclamation-triangle% %i18n:@is-remote%<a :href="user.url || user.uri" target="_blank">%i18n:@view-remote%</a></div>
 | 
			
		||||
		<div class="is-remote" v-if="user.host != null">%fa:exclamation-triangle% %i18n:common.is-remote-user%<a :href="user.url || user.uri" target="_blank">%i18n:common.view-on-remote%</a></div>
 | 
			
		||||
		<main>
 | 
			
		||||
			<div class="main">
 | 
			
		||||
				<x-header :user="user"/>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,12 @@
 | 
			
		||||
<template>
 | 
			
		||||
<mk-ui>
 | 
			
		||||
	<b-card header="アプリを管理">
 | 
			
		||||
		<b-button to="/app/new" variant="primary">アプリ作成</b-button>
 | 
			
		||||
	<b-card header="%i18n:@manage-apps%">
 | 
			
		||||
		<b-button to="/app/new" variant="primary">%i18n:@create-app%</b-button>
 | 
			
		||||
		<hr>
 | 
			
		||||
		<div class="apps">
 | 
			
		||||
			<p v-if="fetching">読み込み中</p>
 | 
			
		||||
			<p v-if="fetching">%i18n:common.loading%</p>
 | 
			
		||||
			<template v-if="!fetching">
 | 
			
		||||
				<b-alert v-if="apps.length == 0">アプリなし</b-alert>
 | 
			
		||||
				<b-alert v-if="apps.length == 0">%i18n:@app-missing%</b-alert>
 | 
			
		||||
				<b-list-group v-else>
 | 
			
		||||
					<b-list-group-item v-for="app in apps" :key="app.id" :to="`/app/${app.id}`">
 | 
			
		||||
						{{ app.name }}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,34 +1,34 @@
 | 
			
		||||
<template>
 | 
			
		||||
<mk-ui>
 | 
			
		||||
	<b-card header="アプリケーションの作成">
 | 
			
		||||
	<b-card header="%i18n:@create-app%">
 | 
			
		||||
		<b-form @submit.prevent="onSubmit" autocomplete="off">
 | 
			
		||||
			<b-form-group label="アプリケーション名" description="あなたのアプリの名称。">
 | 
			
		||||
				<b-form-input v-model="name" type="text" placeholder="ex) Misskey for iOS" autocomplete="off" required/>
 | 
			
		||||
			<b-form-group label="%i18n:@app-name%" description="%i18n:@app-name-desc%">
 | 
			
		||||
				<b-form-input v-model="name" type="text" placeholder="%i18n:@app-name-ex%" autocomplete="off" required/>
 | 
			
		||||
			</b-form-group>
 | 
			
		||||
			<b-form-group label="アプリの概要" description="あなたのアプリの簡単な説明や紹介。">
 | 
			
		||||
				<b-textarea v-model="description" placeholder="ex) Misskey iOSクライアント。" autocomplete="off" required></b-textarea>
 | 
			
		||||
			<b-form-group label="%i18n:@app-overview%" description="%i18n:@app-desc%">
 | 
			
		||||
				<b-textarea v-model="description" placeholder="%i18n:@app-desc-ex%" autocomplete="off" required></b-textarea>
 | 
			
		||||
			</b-form-group>
 | 
			
		||||
			<b-form-group label="コールバックURL (オプション)" description="ユーザーが認証フォームで認証した際にリダイレクトするURLを設定できます。">
 | 
			
		||||
			<b-form-group label="%i18n:@callback-url%" description="%i18n:@callback-url-desc%">
 | 
			
		||||
				<b-input v-model="cb" type="url" placeholder="ex) https://your.app.example.com/callback.php" autocomplete="off"/>
 | 
			
		||||
			</b-form-group>
 | 
			
		||||
			<b-card header="権限">
 | 
			
		||||
				<b-form-group description="ここで要求した機能だけがAPIからアクセスできます。">
 | 
			
		||||
					<b-alert show variant="warning">%fa:exclamation-triangle%アプリ作成後も変更できますが、新たな権限を付与する場合、その時点で関連付けられているユーザーキーはすべて無効になります。</b-alert>
 | 
			
		||||
			<b-card header="%i18n:@authority%">
 | 
			
		||||
				<b-form-group description="%i18n:@authority-desc%">
 | 
			
		||||
					<b-alert show variant="warning">%fa:exclamation-triangle% %i18n:@authority-warning%</b-alert>
 | 
			
		||||
					<b-form-checkbox-group v-model="permission" stacked>
 | 
			
		||||
						<b-form-checkbox value="account-read">アカウントの情報を見る。</b-form-checkbox>
 | 
			
		||||
						<b-form-checkbox value="account-write">アカウントの情報を操作する。</b-form-checkbox>
 | 
			
		||||
						<b-form-checkbox value="note-write">投稿する。</b-form-checkbox>
 | 
			
		||||
						<b-form-checkbox value="reaction-write">リアクションしたりリアクションをキャンセルする。</b-form-checkbox>
 | 
			
		||||
						<b-form-checkbox value="following-write">フォローしたりフォロー解除する。</b-form-checkbox>
 | 
			
		||||
						<b-form-checkbox value="drive-read">ドライブを見る。</b-form-checkbox>
 | 
			
		||||
						<b-form-checkbox value="drive-write">ドライブを操作する。</b-form-checkbox>
 | 
			
		||||
						<b-form-checkbox value="notification-read">通知を見る。</b-form-checkbox>
 | 
			
		||||
						<b-form-checkbox value="notification-write">通知を操作する。</b-form-checkbox>
 | 
			
		||||
						<b-form-checkbox value="account-read">%i18n:@account-read%</b-form-checkbox>
 | 
			
		||||
						<b-form-checkbox value="account-write">%i18n:@account-write%</b-form-checkbox>
 | 
			
		||||
						<b-form-checkbox value="note-write">%i18n:@note-write%</b-form-checkbox>
 | 
			
		||||
						<b-form-checkbox value="reaction-write">%i18n:@reaction-write%</b-form-checkbox>
 | 
			
		||||
						<b-form-checkbox value="following-write">%i18n:@following-write%</b-form-checkbox>
 | 
			
		||||
						<b-form-checkbox value="drive-read">%i18n:@drive-read%</b-form-checkbox>
 | 
			
		||||
						<b-form-checkbox value="drive-write">%i18n:@drive-write%</b-form-checkbox>
 | 
			
		||||
						<b-form-checkbox value="notification-read">%i18n:@notification-read%</b-form-checkbox>
 | 
			
		||||
						<b-form-checkbox value="notification-write">%i18n:@notification-write%</b-form-checkbox>
 | 
			
		||||
					</b-form-checkbox-group>
 | 
			
		||||
				</b-form-group>
 | 
			
		||||
			</b-card>
 | 
			
		||||
			<hr>
 | 
			
		||||
			<b-button type="submit" variant="primary">アプリ作成</b-button>
 | 
			
		||||
			<b-button type="submit" variant="primary">%i18n:@create-app%</b-button>
 | 
			
		||||
		</b-form>
 | 
			
		||||
	</b-card>
 | 
			
		||||
</mk-ui>
 | 
			
		||||
@@ -56,7 +56,7 @@ export default Vue.extend({
 | 
			
		||||
			}).then(() => {
 | 
			
		||||
				location.href = '/dev/apps';
 | 
			
		||||
			}).catch(() => {
 | 
			
		||||
				alert('アプリの作成に失敗しました。再度お試しください。');
 | 
			
		||||
				alert('%i18n:common.dev.failed-to-create%');
 | 
			
		||||
			});
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -167,6 +167,12 @@ export default (callback: (launch: (router: VueRouter, api?: (os: MiOS) => API)
 | 
			
		||||
				}
 | 
			
		||||
			}, false);
 | 
			
		||||
 | 
			
		||||
			window.addEventListener('scroll', () => {
 | 
			
		||||
				if (window.scrollY <= 8) {
 | 
			
		||||
					os.store.commit('clearBehindNotes');
 | 
			
		||||
				}
 | 
			
		||||
			}, { passive: true });
 | 
			
		||||
 | 
			
		||||
			Vue.mixin({
 | 
			
		||||
				data() {
 | 
			
		||||
					return {
 | 
			
		||||
@@ -216,15 +222,15 @@ function panic(e) {
 | 
			
		||||
	document.documentElement.style.background = '#1269e2';
 | 
			
		||||
	document.body.innerHTML =
 | 
			
		||||
		'<div id="error">'
 | 
			
		||||
			+ '<h1>:( 致命的な問題が発生しました。</h1>'
 | 
			
		||||
			+ '<p>お使いのブラウザ(またはOS)のバージョンを更新すると解決する可能性があります。</p>'
 | 
			
		||||
			+ '<h1>%i18n.common.BSoD.fatal-error%</h1>'
 | 
			
		||||
			+ '<p>%i18n.common.BSoD.update-browser-os%</p>'
 | 
			
		||||
			+ '<hr>'
 | 
			
		||||
			+ `<p>エラーコード: ${e.toString()}</p>`
 | 
			
		||||
			+ `<p>ブラウザ バージョン: ${navigator.userAgent}</p>`
 | 
			
		||||
			+ `<p>クライアント バージョン: ${version}</p>`
 | 
			
		||||
			+ `<p>%i18n.common.BSoD.error-code%: ${e.toString()}</p>`
 | 
			
		||||
			+ `<p>%i18n.common.BSoD.browser-version%: ${navigator.userAgent}</p>`
 | 
			
		||||
			+ `<p>%i18n.common.BSoD.client-version%: ${version}</p>`
 | 
			
		||||
			+ '<hr>'
 | 
			
		||||
			+ '<p>問題が解決しない場合は、上記の情報をお書き添えの上 syuilotan@yahoo.co.jp までご連絡ください。</p>'
 | 
			
		||||
			+ '<p>Thank you for using Misskey.</p>'
 | 
			
		||||
			+ '<p>%i18n.common.BSoD.email-support%</p>'
 | 
			
		||||
			+ '<p>%i18n.common.BSoD.thanks%</p>'
 | 
			
		||||
		+ '</div>';
 | 
			
		||||
 | 
			
		||||
	// TODO: Report the bug
 | 
			
		||||
 
 | 
			
		||||
@@ -244,10 +244,10 @@ export default class MiOS extends EventEmitter {
 | 
			
		||||
					this.store.dispatch('login', me);
 | 
			
		||||
					fetched();
 | 
			
		||||
				} else {
 | 
			
		||||
					this.initStream();
 | 
			
		||||
 | 
			
		||||
					// Finish init
 | 
			
		||||
					callback();
 | 
			
		||||
 | 
			
		||||
					this.initStream();
 | 
			
		||||
				}
 | 
			
		||||
			});
 | 
			
		||||
		}
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,6 @@
 | 
			
		||||
			:src="file.url"
 | 
			
		||||
			:alt="file.name"
 | 
			
		||||
			:title="file.name"
 | 
			
		||||
			@load="onImageLoaded"
 | 
			
		||||
			:style="style">
 | 
			
		||||
		<template v-if="kind != 'image'">%fa:file%</template>
 | 
			
		||||
		<footer v-if="kind == 'image' && file.properties && file.properties.width && file.properties.height">
 | 
			
		||||
@@ -46,14 +45,6 @@
 | 
			
		||||
			<ui-button @click="del">%fa:trash-alt R% %i18n:@delete%</ui-button>
 | 
			
		||||
		</div>
 | 
			
		||||
	</div>
 | 
			
		||||
	<div class="exif" v-show="exif">
 | 
			
		||||
		<div>
 | 
			
		||||
			<p>
 | 
			
		||||
				%fa:camera%%i18n:@exif%
 | 
			
		||||
			</p>
 | 
			
		||||
			<pre ref="exif" class="json">{{ exif ? JSON.stringify(exif, null, 2) : '' }}</pre>
 | 
			
		||||
		</div>
 | 
			
		||||
	</div>
 | 
			
		||||
	<div class="hash">
 | 
			
		||||
		<div>
 | 
			
		||||
			<p>
 | 
			
		||||
@@ -67,8 +58,6 @@
 | 
			
		||||
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
import Vue from 'vue';
 | 
			
		||||
import * as EXIF from 'exif-js';
 | 
			
		||||
import * as hljs from 'highlight.js';
 | 
			
		||||
import { gcd } from '../../../../../prelude/math';
 | 
			
		||||
 | 
			
		||||
export default Vue.extend({
 | 
			
		||||
@@ -139,15 +128,6 @@ export default Vue.extend({
 | 
			
		||||
 | 
			
		||||
		showCreatedAt() {
 | 
			
		||||
			alert(new Date(this.file.createdAt).toLocaleString());
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		onImageLoaded() {
 | 
			
		||||
			const self = this;
 | 
			
		||||
			EXIF.getData(this.$refs.img, function(this: any) {
 | 
			
		||||
				const allMetaData = EXIF.getAllTags(this);
 | 
			
		||||
				self.exif = allMetaData;
 | 
			
		||||
				hljs.highlightBlock(self.$refs.exif);
 | 
			
		||||
			});
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
@@ -256,34 +236,4 @@ export default Vue.extend({
 | 
			
		||||
				border-radius 2px
 | 
			
		||||
				background #f5f5f5
 | 
			
		||||
 | 
			
		||||
	> .exif
 | 
			
		||||
		padding 14px
 | 
			
		||||
		border-top solid 1px var(--faceDivider)
 | 
			
		||||
 | 
			
		||||
		> div
 | 
			
		||||
			max-width 500px
 | 
			
		||||
			margin 0 auto
 | 
			
		||||
 | 
			
		||||
			> p
 | 
			
		||||
				display block
 | 
			
		||||
				margin 0
 | 
			
		||||
				padding 0
 | 
			
		||||
				color var(--text)
 | 
			
		||||
				font-size 0.9em
 | 
			
		||||
 | 
			
		||||
				> [data-fa]
 | 
			
		||||
					margin-right 4px
 | 
			
		||||
 | 
			
		||||
			> pre
 | 
			
		||||
				display block
 | 
			
		||||
				width 100%
 | 
			
		||||
				margin 6px 0 0 0
 | 
			
		||||
				padding 8px
 | 
			
		||||
				height 128px
 | 
			
		||||
				overflow auto
 | 
			
		||||
				font-size 0.9em
 | 
			
		||||
				border solid 1px #dfdfdf
 | 
			
		||||
				border-radius 2px
 | 
			
		||||
				background #f5f5f5
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
<template>
 | 
			
		||||
<div class="kmmwchoexgckptowjmjgfsygeltxfeqs">
 | 
			
		||||
	<nav ref="nav">
 | 
			
		||||
		<a @click.prevent="goRoot()" href="/i/drive">%fa:cloud%%i18n:@drive%</a>
 | 
			
		||||
		<a @click.prevent="goRoot()" href="/i/drive">%fa:cloud%%i18n:common.drive%</a>
 | 
			
		||||
		<template v-for="folder in hierarchyFolders">
 | 
			
		||||
			<span :key="folder.id + '>'">%fa:angle-right%</span>
 | 
			
		||||
			<a :key="folder.id" @click.prevent="cd(folder)" :href="`/i/drive/folder/${folder.id}`">{{ folder.name }}</a>
 | 
			
		||||
@@ -103,11 +103,11 @@ export default Vue.extend({
 | 
			
		||||
	mounted() {
 | 
			
		||||
		this.connection = (this as any).os.stream.useSharedConnection('drive');
 | 
			
		||||
 | 
			
		||||
		this.connection.on('file_created', this.onStreamDriveFileCreated);
 | 
			
		||||
		this.connection.on('file_updated', this.onStreamDriveFileUpdated);
 | 
			
		||||
		this.connection.on('file_deleted', this.onStreamDriveFileDeleted);
 | 
			
		||||
		this.connection.on('folder_created', this.onStreamDriveFolderCreated);
 | 
			
		||||
		this.connection.on('folder_updated', this.onStreamDriveFolderUpdated);
 | 
			
		||||
		this.connection.on('fileCreated', this.onStreamDriveFileCreated);
 | 
			
		||||
		this.connection.on('fileUpdated', this.onStreamDriveFileUpdated);
 | 
			
		||||
		this.connection.on('fileDeleted', this.onStreamDriveFileDeleted);
 | 
			
		||||
		this.connection.on('folderCreated', this.onStreamDriveFolderCreated);
 | 
			
		||||
		this.connection.on('folderUpdated', this.onStreamDriveFolderUpdated);
 | 
			
		||||
 | 
			
		||||
		if (this.initFolder) {
 | 
			
		||||
			this.cd(this.initFolder, true);
 | 
			
		||||
 
 | 
			
		||||
@@ -17,6 +17,7 @@
 | 
			
		||||
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
import Vue from 'vue';
 | 
			
		||||
 | 
			
		||||
export default Vue.extend({
 | 
			
		||||
	props: {
 | 
			
		||||
		user: {
 | 
			
		||||
@@ -24,6 +25,7 @@ export default Vue.extend({
 | 
			
		||||
			required: true
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	data() {
 | 
			
		||||
		return {
 | 
			
		||||
			u: this.user,
 | 
			
		||||
@@ -31,28 +33,24 @@ export default Vue.extend({
 | 
			
		||||
			connection: null
 | 
			
		||||
		};
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	mounted() {
 | 
			
		||||
		this.connection = (this as any).os.stream.useSharedConnection('main');
 | 
			
		||||
 | 
			
		||||
		this.connection.on('follow', this.onFollow);
 | 
			
		||||
		this.connection.on('unfollow', this.onUnfollow);
 | 
			
		||||
		this.connection.on('follow', this.onFollowChange);
 | 
			
		||||
		this.connection.on('unfollow', this.onFollowChange);
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	beforeDestroy() {
 | 
			
		||||
		this.connection.dispose();
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	methods: {
 | 
			
		||||
 | 
			
		||||
		onFollow(user) {
 | 
			
		||||
			if (user.id == this.u.id) {
 | 
			
		||||
				this.u.isFollowing = user.isFollowing;
 | 
			
		||||
				this.u.hasPendingFollowRequestFromYou = user.hasPendingFollowRequestFromYou;
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		onUnfollow(user) {
 | 
			
		||||
		onFollowChange(user) {
 | 
			
		||||
			if (user.id == this.u.id) {
 | 
			
		||||
				this.u.isFollowing = user.isFollowing;
 | 
			
		||||
				this.u.hasPendingFollowRequestFromYou = user.hasPendingFollowRequestFromYou;
 | 
			
		||||
				this.$forceUpdate();
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
@@ -90,8 +88,6 @@ export default Vue.extend({
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="stylus" scoped>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.mk-follow-button
 | 
			
		||||
	display block
 | 
			
		||||
	user-select none
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,6 @@ import noteCard from './note-card.vue';
 | 
			
		||||
import userCard from './user-card.vue';
 | 
			
		||||
import noteDetail from './note-detail.vue';
 | 
			
		||||
import followButton from './follow-button.vue';
 | 
			
		||||
import muteButton from './mute-button.vue';
 | 
			
		||||
import friendsMaker from './friends-maker.vue';
 | 
			
		||||
import notification from './notification.vue';
 | 
			
		||||
import notifications from './notifications.vue';
 | 
			
		||||
@@ -37,7 +36,6 @@ Vue.component('mk-note-card', noteCard);
 | 
			
		||||
Vue.component('mk-user-card', userCard);
 | 
			
		||||
Vue.component('mk-note-detail', noteDetail);
 | 
			
		||||
Vue.component('mk-follow-button', followButton);
 | 
			
		||||
Vue.component('mk-mute-button', muteButton);
 | 
			
		||||
Vue.component('mk-friends-maker', friendsMaker);
 | 
			
		||||
Vue.component('mk-notification', notification);
 | 
			
		||||
Vue.component('mk-notifications', notifications);
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user