Compare commits
	
		
			811 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 0790dd7a2c | ||
|   | 408118a1e8 | ||
|   | 6a45bb21c3 | ||
|   | 5d4e9aa949 | ||
|   | c87b98c2af | ||
|   | 5a13c38a6d | ||
|   | 67f60ab307 | ||
|   | 08c278578d | ||
|   | 0e01fb5fc3 | ||
|   | d44dc7e00d | ||
|   | 82ee3a538b | ||
|   | 380cf0de69 | ||
|   | 11f25ea2e7 | ||
|   | ef62497777 | ||
|   | 2824d8a5b6 | ||
|   | 1c84c0828e | ||
|   | 39e4494836 | ||
|   | e7180d529a | ||
|   | b8cd872738 | ||
|   | efaaa76185 | ||
|   | 19e1f996a6 | ||
|   | 40a69bf200 | ||
|   | 9e3abb9989 | ||
|   | 5ba48e06f7 | ||
|   | 8b3a0a524b | ||
|   | d9fe9cc5df | ||
|   | b202c7906a | ||
|   | b9c868cac6 | ||
|   | 33adf3c88d | ||
|   | 8b84f40975 | ||
|   | fa131d2023 | ||
|   | a83b38b50a | ||
|   | dcd7b286ef | ||
|   | b85bf769cd | ||
|   | 630a20d61e | ||
|   | 88c3794cf1 | ||
|   | 42eb457ad0 | ||
|   | d153a8de20 | ||
|   | 7f7551f44c | ||
|   | 23082b55a4 | ||
| ![greenkeeper[bot]](/assets/img/avatar_default.png)  | dac7387a7f | ||
|   | 8c6856d894 | ||
| ![greenkeeper[bot]](/assets/img/avatar_default.png)  | 2c0e514fb2 | ||
|   | 1917b0339e | ||
|   | c05419f223 | ||
|   | e0deaec695 | ||
|   | d70e2a788e | ||
|   | 7343e6e2e8 | ||
|   | 106d4cc0d6 | ||
|   | c98879cb7a | ||
|   | 9ca755c313 | ||
|   | 25e0b98840 | ||
|   | 5599c43c71 | ||
|   | eb7597d7e4 | ||
|   | d5767e92c4 | ||
|   | ba3749d373 | ||
|   | d8088acdf2 | ||
|   | ad93e0aa3d | ||
|   | 691e58f03d | ||
|   | 95d5bccfca | ||
|   | 2aa8e0a4bf | ||
|   | 6e96d6677d | ||
|   | 8816c20f51 | ||
|   | e955fe1ffd | ||
|   | 5cbcac713a | ||
|   | 2b50364ab4 | ||
|   | fa04ac789e | ||
|   | 95ce8dce3d | ||
|   | 0b5eec4ca8 | ||
|   | 6d9716f90e | ||
| ![greenkeeper[bot]](/assets/img/avatar_default.png)  | aa31061d90 | ||
|   | acc7797dff | ||
|   | 7959196dc7 | ||
|   | c6ff6939a5 | ||
|   | 769960f29e | ||
|   | d92e9759f3 | ||
|   | bf7e19b288 | ||
|   | 98954cd6d4 | ||
|   | 538bb978ed | ||
|   | 10232c5866 | ||
|   | 5cd6a0db16 | ||
|   | ff0a05a2d6 | ||
|   | e34b264af2 | ||
|   | 00d79487cd | ||
|   | 3cace734c7 | ||
|   | f428372869 | ||
| ![greenkeeper[bot]](/assets/img/avatar_default.png)  | 5dd2feba9b | ||
| ![greenkeeper[bot]](/assets/img/avatar_default.png)  | a1b026239e | ||
|   | 40735ce76b | ||
|   | 4a00c13b33 | ||
|   | 8e359d54bd | ||
|   | fb76dff836 | ||
|   | 2448bf4e4e | ||
|   | 91e0fc8c62 | ||
|   | b4f86feddb | ||
|   | 7167c8c593 | ||
|   | 51b79d4250 | ||
|   | 925fcc1c64 | ||
|   | fcdc14862c | ||
|   | dac2844cae | ||
|   | 706b0cea16 | ||
|   | 842e7844c7 | ||
|   | 1dceda50d8 | ||
|   | af8b9abba4 | ||
|   | 07b07685fa | ||
|   | cde43fe3c8 | ||
|   | 2fe84aa75b | ||
|   | 7d79a4840d | ||
|   | 3ee9479572 | ||
|   | ccf8e44acc | ||
|   | 451acb77df | ||
|   | e2c6227f47 | ||
|   | ebd1c877ad | ||
|   | 498094b3c7 | ||
|   | 1cc183ecdb | ||
|   | e8948452fd | ||
|   | ade7e62836 | ||
|   | 395cfa6108 | ||
|   | b5ff2abdb9 | ||
|   | 229e85b2c5 | ||
|   | 37058e3480 | ||
|   | a1b82e9723 | ||
|   | db943df0c8 | ||
|   | ff8d300ea8 | ||
|   | 8b490b9b94 | ||
| ![greenkeeper[bot]](/assets/img/avatar_default.png)  | f83f8631ac | ||
|   | 16da91d8d1 | ||
|   | 8ffd62b462 | ||
|   | 935367e167 | ||
|   | 00618260f2 | ||
|   | 77d66fac7b | ||
|   | 17d7f59b06 | ||
|   | 2561547db1 | ||
|   | 7738438616 | ||
|   | 3d8fc4a794 | ||
|   | 87b4e7905e | ||
|   | 13c5d4985a | ||
|   | f0df4096fd | ||
|   | 5044424549 | ||
|   | 8ce67cdcd6 | ||
|   | 1915ccabdd | ||
|   | 6fea2f52f1 | ||
|   | f77eaaa08a | ||
|   | 7c5bc03492 | ||
|   | 72a1af6cd4 | ||
| ![greenkeeper[bot]](/assets/img/avatar_default.png)  | 4bce6f14f3 | ||
| ![greenkeeper[bot]](/assets/img/avatar_default.png)  | a38ce86f87 | ||
| ![greenkeeper[bot]](/assets/img/avatar_default.png)  | f539491502 | ||
|   | d279f8e9ff | ||
|   | eaec936fa6 | ||
| ![greenkeeper[bot]](/assets/img/avatar_default.png)  | a0735b0e7a | ||
|   | 5b039a1bee | ||
|   | 921609cab1 | ||
|   | 199573ccee | ||
|   | 977200b7cd | ||
|   | 6abff253ea | ||
|   | ba64de334a | ||
|   | dc1d7fa9d7 | ||
|   | f42665d4bc | ||
|   | a5eb19c878 | ||
|   | 60fa8e13d6 | ||
|   | ecbaea463b | ||
|   | 814ddeb436 | ||
|   | d6466106e8 | ||
|   | 633f5384f9 | ||
|   | fa7989772c | ||
|   | 0e395612a6 | ||
|   | fb3f52f3ad | ||
|   | ba11c71d65 | ||
|   | bdc3081167 | ||
|   | 430efcf1b9 | ||
|   | 996450dd7c | ||
|   | fa779f0417 | ||
|   | 25cec6d28a | ||
|   | c5f8403cea | ||
|   | a9ae9a65c8 | ||
|   | 3698c679e2 | ||
|   | 881df20f1b | ||
|   | 7d269c0441 | ||
|   | ba38f64353 | ||
|   | db3ae303cb | ||
|   | 66f3a155e6 | ||
|   | 639b483e6c | ||
|   | 09843a409b | ||
|   | e894ed5a8b | ||
|   | d7808299fd | ||
|   | f92e0c16d2 | ||
|   | d94b3757be | ||
|   | 13e822cba6 | ||
|   | c57bf87f52 | ||
|   | 99fbd60265 | ||
|   | ea9b48db3c | ||
|   | c145c994a9 | ||
|   | d033998b56 | ||
|   | 3136c714bf | ||
|   | c0ee134f19 | ||
|   | d15ebe5732 | ||
|   | ef630195fa | ||
|   | e31921151e | ||
|   | f94992abbe | ||
|   | b00060c09c | ||
|   | f6217d96d2 | ||
|   | 3a6947c7ed | ||
|   | 0fb528ddf8 | ||
|   | 14c03f226d | ||
|   | 4f0d844b43 | ||
|   | b93395fc4c | ||
|   | 34eacb7e2d | ||
|   | 0177023ead | ||
|   | a4678e45de | ||
|   | f24869625e | ||
|   | 01beb705a2 | ||
|   | ce28c70c35 | ||
|   | 5e0f5c31e7 | ||
|   | b28dd4be52 | ||
|   | 291beb45fc | ||
|   | ffb345ccb5 | ||
|   | d2abe2cd81 | ||
|   | acffc3e522 | ||
|   | 0962e62b8c | ||
|   | 91ebd310b7 | ||
|   | 2974c74b4e | ||
|   | 3d24112d2d | ||
|   | 4a977cd523 | ||
|   | 4b1886990f | ||
|   | f3499b787c | ||
|   | 5209a584a2 | ||
|   | 57a63d38aa | ||
|   | 3efffbcf22 | ||
|   | 15eaebe522 | ||
|   | eee98358ac | ||
|   | 795fc5e7bc | ||
|   | 70ac668474 | ||
|   | 1004e0d6e8 | ||
|   | 52aa64fcb6 | ||
|   | 7860d97a10 | ||
|   | 409b37b271 | ||
|   | ad9b9964fa | ||
|   | d2b5276f43 | ||
|   | 7204e2a84c | ||
|   | 1377fa3332 | ||
|   | bf087bfccf | ||
|   | e846e3d571 | ||
|   | d646e62888 | ||
|   | c008154d18 | ||
|   | 29bd4de26a | ||
|   | 7559b8da6c | ||
|   | 35218e84fc | ||
|   | 2c135fa2f6 | ||
|   | 21da6bd047 | ||
|   | f1d65a66b4 | ||
|   | 63e2dbbb0d | ||
|   | a228c522f1 | ||
|   | a951c337b8 | ||
|   | db3efb3791 | ||
|   | 8ee771ca77 | ||
|   | 488bbc9651 | ||
|   | 29b2bdf613 | ||
|   | 7e35048829 | ||
|   | 4d6b9f62e5 | ||
|   | 5f9a9867eb | ||
|   | 059a8e07d2 | ||
|   | cf82f56e66 | ||
|   | 2778bd14d4 | ||
|   | 5b0446739c | ||
|   | 55f235d0ac | ||
|   | 4ec44c68e9 | ||
|   | e6952d499a | ||
|   | e0b82f827b | ||
|   | 0bccb17e82 | ||
|   | b251b8c6a9 | ||
|   | c2a62f632b | ||
|   | 359da9a5a1 | ||
|   | 2a235151ed | ||
|   | 9e318d5ebc | ||
|   | 6819eb3b4d | ||
|   | 4c6fb60dd2 | ||
|   | bffb9a5c45 | ||
|   | dca4053a67 | ||
|   | fd07f00d14 | ||
|   | bbeb6d534e | ||
|   | 37b5afa1a3 | ||
|   | 63b8af4531 | ||
|   | e89e76076a | ||
|   | 18b4f74cdb | ||
|   | b80d0a3b12 | ||
|   | e53dde385c | ||
|   | 6a7a4c20e6 | ||
|   | 6434dac04d | ||
|   | 5deb1bf40e | ||
| ![greenkeeper[bot]](/assets/img/avatar_default.png)  | 9cd334576c | ||
|   | ae36bf301a | ||
|   | 9f60688d37 | ||
|   | 6a5a9de795 | ||
|   | ca0ea9e57c | ||
|   | a77a7e8112 | ||
|   | b26ea2edc0 | ||
|   | 02b99dfd76 | ||
|   | af02b0f115 | ||
|   | 9b3c379678 | ||
|   | a423fd7695 | ||
|   | de6e1d8c9b | ||
|   | d9db3e8629 | ||
|   | ac1c81b7d6 | ||
|   | 49b2eec534 | ||
|   | f0abc46429 | ||
|   | 9fd4f5ee0a | ||
|   | 5e202c3def | ||
|   | 48223c1c76 | ||
|   | dddf7834cc | ||
|   | 66ef30b2cc | ||
|   | f802fe57b9 | ||
|   | ead884ce89 | ||
| ![greenkeeper[bot]](/assets/img/avatar_default.png)  | 6a87e9f690 | ||
| ![greenkeeper[bot]](/assets/img/avatar_default.png)  | 5b943722fb | ||
|   | 4d92b14308 | ||
|   | 167c96d14e | ||
|   | 8a42373753 | ||
|   | c1751a9b84 | ||
|   | 4e11da98d9 | ||
|   | 1b7d98c17e | ||
|   | 3038434712 | ||
|   | 117ab633a1 | ||
|   | e50fa4762d | ||
|   | aed1e839ba | ||
|   | 00f2974a2a | ||
| ![greenkeeper[bot]](/assets/img/avatar_default.png)  | 073c96af47 | ||
|   | 71da498364 | ||
|   | 8e9c11f160 | ||
| ![greenkeeper[bot]](/assets/img/avatar_default.png)  | 98f6b23249 | ||
|   | 89288d8e0d | ||
|   | 724121eeaa | ||
|   | edee95a5ca | ||
|   | 0c2361bf72 | ||
|   | 92f8dc48e3 | ||
|   | 06a0fff4b0 | ||
|   | d55e4621ac | ||
|   | bc6bda3714 | ||
|   | d3aafd3f13 | ||
|   | 1a508de1c4 | ||
|   | 768cc0aff5 | ||
|   | 67f4c1f429 | ||
|   | 2d4ceec0a5 | ||
|   | 3e2a0cd89a | ||
|   | d1f4f2f663 | ||
|   | 6e3bf26cad | ||
|   | 672377f116 | ||
|   | 80ee5afba7 | ||
|   | f55fcd3305 | ||
|   | 64fc14ade5 | ||
|   | 807f245657 | ||
| ![greenkeeper[bot]](/assets/img/avatar_default.png)  | 62f966dc27 | ||
|   | 09f97bf7a7 | ||
|   | 69460e494c | ||
| ![greenkeeper[bot]](/assets/img/avatar_default.png)  | 9bef723346 | ||
| ![greenkeeper[bot]](/assets/img/avatar_default.png)  | b99eabb2cf | ||
|   | 17be3f3d0f | ||
|   | 05fe2cb173 | ||
|   | 428be14c27 | ||
|   | a04fa8441e | ||
|   | 7bcfa84e1a | ||
|   | 1cc5986df3 | ||
|   | 7aa5d03875 | ||
|   | a59fbfac19 | ||
|   | 677f9ee8f6 | ||
|   | f4a16be2b4 | ||
|   | 46b967ee4a | ||
|   | 78568accd1 | ||
|   | e9f20a0fad | ||
|   | bbd9894e6b | ||
|   | f92745e381 | ||
|   | 2762b78bcc | ||
|   | 2d4ed2c8c2 | ||
|   | 2de8e8c358 | ||
|   | eb7b638db3 | ||
|   | 321e851b26 | ||
| ![greenkeeper[bot]](/assets/img/avatar_default.png)  | f8340be3bf | ||
|   | 02341ceb6e | ||
|   | 3dcdd7a5d7 | ||
|   | 85188b5de2 | ||
|   | b721d049c6 | ||
|   | e518fff944 | ||
|   | 048128c7e1 | ||
|   | d3717449c2 | ||
|   | 04de6218d3 | ||
|   | 0082473d78 | ||
|   | 77baca8e6e | ||
|   | 6a7169630c | ||
|   | 6b2089e043 | ||
|   | 14ad3af30d | ||
|   | e7e6d833b7 | ||
|   | d1a9561135 | ||
| ![greenkeeper[bot]](/assets/img/avatar_default.png)  | c7bda6f908 | ||
|   | ef43721e32 | ||
| ![greenkeeper[bot]](/assets/img/avatar_default.png)  | ba6cd874aa | ||
|   | f283d2423f | ||
|   | c07f668f14 | ||
|   | 596524a63c | ||
|   | 975e4dd285 | ||
|   | 09b05c8552 | ||
|   | 530ee6f80e | ||
|   | 6ad31dca76 | ||
|   | d423f8ae57 | ||
|   | 8e5ce7f8e3 | ||
|   | 33dfc21e4b | ||
|   | 3266f3948a | ||
|   | 7259887124 | ||
|   | 800de03187 | ||
|   | 78ba305e5c | ||
|   | bfed1475bb | ||
|   | 3281d263c4 | ||
|   | a9a1798e3a | ||
| ![greenkeeper[bot]](/assets/img/avatar_default.png)  | 6806eafaed | ||
|   | 3e20ea5b2e | ||
|   | 3f30a69b8b | ||
|   | 2d2e16d9f6 | ||
|   | 9c32118b77 | ||
|   | ecf2eb4738 | ||
|   | 3d754ea7eb | ||
|   | f755f24560 | ||
|   | 699879d95d | ||
|   | 6677508ba7 | ||
|   | 58da32358b | ||
|   | 491bc75095 | ||
|   | b9eafeee3f | ||
|   | c56ff5d88d | ||
|   | f5dd83a44a | ||
|   | 9a295a85b1 | ||
|   | 8e06d93c31 | ||
|   | 1a42200137 | ||
|   | bbf33d2475 | ||
|   | 93203ebfd1 | ||
|   | 67053eeaa0 | ||
|   | 43baf4ad6a | ||
|   | 5b2a36e47b | ||
|   | 2a0862a24e | ||
|   | ce31027b2e | ||
|   | 3f66c77821 | ||
|   | bc713656ec | ||
|   | 46d89faebc | ||
|   | 7135c0e308 | ||
|   | 1962bfb4a5 | ||
|   | a1fca2550e | ||
|   | c17f99b7a5 | ||
|   | 7cd76d60c2 | ||
|   | fa7c8cfe5b | ||
|   | 05fb8d35af | ||
|   | eaa827e2d9 | ||
|   | f365ea4585 | ||
|   | 5d2e43ffb9 | ||
|   | e9a97ed99a | ||
|   | fe98102600 | ||
|   | aae8845664 | ||
|   | 81a4388ecc | ||
|   | be3ab026fd | ||
|   | f92f9d8cb0 | ||
|   | 08a59591ae | ||
|   | a09a244242 | ||
|   | 483a61d90d | ||
|   | 385fb7586b | ||
| ![greenkeeper[bot]](/assets/img/avatar_default.png)  | c624da70ef | ||
|   | 675668c395 | ||
| ![greenkeeper[bot]](/assets/img/avatar_default.png)  | bc9c7efe85 | ||
|   | 2488d40421 | ||
|   | bf7875bfaa | ||
|   | a84fa30774 | ||
|   | c19a763b3d | ||
|   | 0875460974 | ||
|   | f0b08d3936 | ||
|   | 16520c7b4c | ||
|   | 65549d06d9 | ||
|   | 52da66d550 | ||
|   | 251c3c3fe4 | ||
| ![greenkeeper[bot]](/assets/img/avatar_default.png)  | ce2d2a10c1 | ||
|   | 3b6d242ef6 | ||
|   | 0ebe801af4 | ||
|   | 05daa7ac7d | ||
|   | 990a583e5e | ||
|   | d9b02a18bf | ||
|   | 30aae79e5c | ||
|   | a149c121fb | ||
|   | 47f4b51207 | ||
|   | 79f4d886d0 | ||
|   | 2b556aba03 | ||
|   | 4f62043b0c | ||
|   | b1ae304c51 | ||
|   | 425bc032d0 | ||
|   | 0156b75bde | ||
|   | 8bc8fc58de | ||
|   | 9bf847b1fb | ||
|   | 0b078d203b | ||
|   | df59018b47 | ||
|   | b2681dcb5d | ||
|   | 46fa471636 | ||
|   | 5f2c441996 | ||
|   | a79cc42b26 | ||
|   | 739c993911 | ||
|   | cb180e00de | ||
|   | 4d46a61051 | ||
|   | 81969ea8b2 | ||
|   | ac474f3884 | ||
|   | a39aaf6eb1 | ||
|   | 68a7661f08 | ||
|   | ffcb2f755c | ||
| ![greenkeeper[bot]](/assets/img/avatar_default.png)  | 366e0d6bde | ||
|   | b3a3238e43 | ||
|   | 92828028db | ||
|   | bd97e315ff | ||
|   | 51083419f5 | ||
|   | b23bfd4d86 | ||
|   | 7de3e847bd | ||
|   | 0d1a541dba | ||
|   | 2717109fe2 | ||
|   | 60ca0626ce | ||
|   | 15dae0ae65 | ||
|   | 1c680118a0 | ||
|   | ad5efbba59 | ||
|   | 6dc7baa5e9 | ||
|   | c2b886e750 | ||
|   | edb61e52c5 | ||
|   | ded297b04c | ||
|   | 65e1d5978a | ||
|   | 86e76358b1 | ||
|   | 435e0257a4 | ||
|   | 1c45cc808b | ||
|   | ed27a2f963 | ||
|   | 1f53d1a149 | ||
|   | 8295f6d7a3 | ||
|   | b02f6341c9 | ||
|   | f6d577d411 | ||
|   | db3e73318e | ||
|   | 29c2071711 | ||
|   | 3acd524d09 | ||
|   | dae65cc123 | ||
|   | 695f154d87 | ||
|   | 59dca9a812 | ||
|   | b9f04f8f53 | ||
|   | 0985f14f18 | ||
|   | 56684dd7c3 | ||
|   | 47a5f3bc67 | ||
|   | 1c1e3009e9 | ||
|   | c7c3f6999b | ||
|   | fb4aa9bc1c | ||
|   | ef57f5907b | ||
|   | eff44f9cd1 | ||
|   | d7fa92d58f | ||
|   | 4e8033d5a4 | ||
|   | 8a207d8311 | ||
|   | 94ba9c8437 | ||
|   | 88c71c2998 | ||
|   | 7b6e55047f | ||
|   | 9d85d0bb08 | ||
|   | 27ac0bbc00 | ||
|   | affde9b4e2 | ||
|   | 88324b6dd9 | ||
|   | 9b95ffe6c6 | ||
|   | 6b137f8d69 | ||
|   | e78b2b0ab8 | ||
|   | 8b51428347 | ||
|   | b8d53a7b40 | ||
|   | b0d9e9caa2 | ||
|   | 1fc4ec8dc1 | ||
|   | a1e1e25800 | ||
|   | 3b020732ec | ||
|   | dcf92945fe | ||
|   | f9f33903d4 | ||
|   | d8bf06ab0f | ||
|   | 806dabe58b | ||
|   | a17b8c56d7 | ||
|   | 0eaaaba8f2 | ||
|   | f359d79d36 | ||
|   | 1d84000d94 | ||
|   | b70e22c150 | ||
|   | 0774ffe376 | ||
|   | 0096d7d8ac | ||
|   | 38db966b3d | ||
|   | cb7d313a66 | ||
|   | 91b7905f3f | ||
|   | 9a81fba992 | ||
|   | 43553d5c09 | ||
|   | e0ca8ce173 | ||
|   | 13624ea7c2 | ||
|   | 9502586c8b | ||
| ![greenkeeper[bot]](/assets/img/avatar_default.png)  | d6753f2cf2 | ||
|   | 5ba36efcd2 | ||
|   | fd497ef105 | ||
|   | 9c4a7bf94c | ||
|   | 91f8adc138 | ||
|   | 69fa2373cb | ||
|   | 8b37fc4772 | ||
|   | 81e4ed9591 | ||
|   | 9cda89ec04 | ||
|   | fc180f030f | ||
|   | a827b6028d | ||
|   | 4517bf7342 | ||
|   | b21287262e | ||
|   | a60ae130c1 | ||
|   | dd88acd411 | ||
|   | b63fc1a9e5 | ||
|   | 17f143cfb2 | ||
|   | cf57d847d1 | ||
|   | 7c4c7bea14 | ||
|   | e5ec47fc75 | ||
|   | ad91dc2423 | ||
|   | 7acbe53948 | ||
|   | fe1b8ba0cb | ||
|   | b0a8a51b69 | ||
|   | c3ca21e610 | ||
|   | c1b47a2119 | ||
|   | caf625afee | ||
|   | 2bad3865a3 | ||
|   | 3f7d248684 | ||
|   | 4e7382b793 | ||
|   | 552ff4a044 | ||
|   | afb52a0cd5 | ||
|   | 1ac89b0f5b | ||
|   | 5039ca7ee1 | ||
|   | a48fd9ce18 | ||
|   | 58859c4811 | ||
|   | 5988fb3111 | ||
|   | 8dce821789 | ||
|   | 16fde0b507 | ||
|   | 9723662706 | ||
|   | df4415b4fe | ||
|   | 6e179e7cde | ||
|   | 87f248b8ec | ||
|   | 027140eccc | ||
|   | 92cf205c66 | ||
|   | fa3299840f | ||
|   | f54529d46f | ||
|   | b772add064 | ||
|   | 231f2e77a4 | ||
|   | a000a9e607 | ||
|   | e8da15ab1e | ||
|   | e070ccb313 | ||
|   | 2b06579228 | ||
|   | 853c847ba1 | ||
|   | e852680b0a | ||
|   | 0b0ee915b3 | ||
|   | 516d1d093f | ||
|   | aee9c79c0f | ||
|   | 2d4b183c14 | ||
|   | 03b20e11ca | ||
|   | e0e006e284 | ||
|   | a294a881ec | ||
|   | 53926082e7 | ||
|   | 2d185becc3 | ||
|   | 67fff324b0 | ||
|   | f64b7fcabc | ||
|   | 4cefa16db6 | ||
|   | 22722379df | ||
|   | b2b83dc45d | ||
|   | ebf6f8bbfd | ||
|   | 3e1631d180 | ||
|   | 97cb3c8613 | ||
|   | 6dda3a5d8a | ||
|   | e50b0540f5 | ||
|   | 63b4aee9bd | ||
|   | 5b5de6a89c | ||
|   | a11c991f83 | ||
|   | a0adcf0d1a | ||
|   | 93b2b82993 | ||
|   | 4dee7d91b1 | ||
|   | 839be6477d | ||
|   | 59e2ed8ab0 | ||
|   | 83790004dd | ||
| ![greenkeeper[bot]](/assets/img/avatar_default.png)  | b70e9824ac | ||
| ![greenkeeper[bot]](/assets/img/avatar_default.png)  | 155d49e8ac | ||
| ![greenkeeper[bot]](/assets/img/avatar_default.png)  | 4ae10ab33d | ||
|   | 7124586eb1 | ||
|   | 74f6ed1851 | ||
|   | efae7a7bce | ||
|   | e59f13e8ff | ||
|   | 31ed8949b9 | ||
|   | f1174a15e0 | ||
|   | 912ffae600 | ||
|   | 71a5662195 | ||
|   | 774834a31f | ||
|   | 91f1c3a10a | ||
|   | 8fc1e07136 | ||
|   | a62e2b83ff | ||
|   | e31a2f7e55 | ||
|   | 1598e996b1 | ||
|   | 4fb7ee760a | ||
|   | 37865cb381 | ||
|   | ab8b882435 | ||
|   | 1b2996947e | ||
|   | 1d9c88e9a1 | ||
|   | ea56d368e3 | ||
|   | dbd3a750f5 | ||
|   | f41818141f | ||
|   | d2f576accd | ||
|   | 4e483856d4 | ||
|   | 2997f26e3c | ||
|   | cdab596240 | ||
|   | fca7a9da94 | ||
|   | 8ba178f795 | ||
|   | 8eb8243153 | ||
|   | b4967b862c | ||
|   | aee3517736 | ||
|   | 52ff8e84fa | ||
|   | 9bb6db649c | ||
|   | da99be9897 | ||
|   | 2d7ec8a471 | ||
|   | 4cbbfdad1a | ||
|   | 2924858311 | ||
|   | 85916bfea1 | ||
|   | 38ccd9e794 | ||
|   | c64b6be915 | ||
|   | d98c67e13c | ||
|   | d129151fdf | ||
|   | 1b9c69f793 | ||
|   | 42dd092334 | ||
|   | 8dc9ec06f8 | ||
|   | ae5da782e5 | ||
|   | 313b0cec65 | ||
|   | 12a51972ed | ||
|   | a2f3b2966f | ||
|   | 0c2627f08b | ||
|   | 9535df12dd | ||
|   | 2400471a0d | ||
|   | 784da8c37b | ||
|   | 3778f9c521 | ||
|   | e1cec85f1e | ||
|   | ca9c087060 | ||
|   | 5b2d91baad | ||
|   | 08e099b88d | ||
|   | 4153b0db38 | ||
|   | 88701a21bb | ||
|   | 3ddc73ca94 | ||
|   | 693d793265 | ||
|   | 5d685233dd | ||
|   | 16575751d9 | ||
|   | 1f6295f437 | ||
|   | 6737fe2ead | ||
|   | 4e77939fca | ||
|   | 21f528c07d | ||
|   | 23f835fac0 | ||
|   | f21343225c | ||
|   | f13a59f7db | ||
|   | 0315b9274c | ||
|   | da88043962 | ||
|   | 0352bf0cc2 | ||
|   | baa71070a8 | ||
|   | 2713064f27 | ||
|   | f6387ac115 | ||
|   | d704aca035 | ||
|   | 2b54b4ac06 | ||
| ![greenkeeper[bot]](/assets/img/avatar_default.png)  | 7410f2f4c0 | ||
|   | 99c3c1258a | ||
|   | e51184931d | ||
| ![greenkeeper[bot]](/assets/img/avatar_default.png)  | 3bc9a40b48 | ||
|   | 9f49ca8fdb | ||
|   | 550d1547b4 | ||
|   | ca0b56ee57 | ||
|   | ef1d854f2c | ||
|   | a5023271ef | ||
|   | c3747db670 | ||
|   | fe1e60a28c | ||
|   | f91d2e8c8d | ||
|   | dccc2c60e3 | ||
|   | 933e25804c | ||
|   | 0b503661af | ||
|   | 58082431ff | ||
|   | 2536bfb5f5 | ||
|   | 6428066552 | ||
|   | 4bf3827b73 | ||
|   | 3cad494404 | ||
|   | ef0793311f | ||
|   | 6f3e341e89 | ||
|   | 2fea3be7c0 | ||
|   | 82059d4fd9 | ||
|   | 07ddeae2f1 | ||
|   | f2279758b2 | ||
|   | 1ed189a518 | ||
|   | 137741d307 | ||
|   | d702f6e090 | ||
|   | f33701233c | ||
|   | 70003269e5 | ||
|   | 61896d2386 | ||
|   | 52d640c5a7 | ||
|   | c65f5761e1 | ||
|   | 3016ac4805 | ||
|   | 28a47cd331 | ||
|   | 6ecb88b0d1 | ||
|   | 8df1278c8e | ||
|   | 52bec430d4 | ||
|   | da4cec8767 | ||
|   | ad0087d7dd | ||
|   | 9630860035 | ||
|   | 75e4c8d74d | ||
| ![greenkeeper[bot]](/assets/img/avatar_default.png)  | 1a5ee81e7e | ||
|   | 3476be16ab | ||
| ![greenkeeper[bot]](/assets/img/avatar_default.png)  | c42f61a0f4 | ||
|   | b42a9e1c4e | ||
|   | 4495525705 | ||
|   | a603602f32 | ||
| ![greenkeeper[bot]](/assets/img/avatar_default.png)  | 67b28f9b6e | ||
|   | fd947407af | ||
|   | 30444e5f1a | ||
|   | f0d818de24 | ||
|   | 3fb98e808f | ||
|   | 2c9bacfcea | ||
|   | ae0284b1b1 | ||
|   | 166c4ebda0 | ||
|   | 319eed029b | ||
| ![greenkeeper[bot]](/assets/img/avatar_default.png)  | ec5aa10167 | ||
|   | a542765cf8 | ||
|   | fd3f8d43db | ||
|   | 4f4496078a | ||
|   | 09d1f1c20d | 
							
								
								
									
										87
									
								
								.autogen/autogen.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										87
									
								
								.autogen/autogen.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,87 @@ | |||||||
|  | #!/usr/bin/env bash | ||||||
|  | # __MISSKEY_BEARER_TOKEN= | ||||||
|  | # __MISSKEY_CAMPAIGN_ID= | ||||||
|  | # __MISSKEY_GITHUB_TOKEN= | ||||||
|  | # __MISSKEY_HEAD=acid-chicken:patch-autogen | ||||||
|  | # __MISSKEY_REPO=syuilo/misskey | ||||||
|  | # __MISSKEY_BRANCH=develop | ||||||
|  | test "$(curl -LSs -w '\n' -- "https://api.github.com/repos/$REPO/pulls?access_token=$__MISSKEY_GITHUB_TOKEN" | jq -r '.[].head.label' | grep $__MISSKEY_HEAD)" && exit 1 | ||||||
|  | cd "$(dirname $0)/.." && \ | ||||||
|  | touch null.cache && \ | ||||||
|  | rm *.cache && \ | ||||||
|  | git checkout $__MISSKEY_BRANCH && \ | ||||||
|  | git pull origin $__MISSKEY_BRANCH && \ | ||||||
|  | git pull upstream $__MISSKEY_BRANCH && \ | ||||||
|  | git stash && \ | ||||||
|  | git rebase -f upstream/$__MISSKEY_BRANCH && \ | ||||||
|  | git branch patch-autogen && \ | ||||||
|  | git checkout patch-autogen && \ | ||||||
|  | git reset --hard HEAD || \ | ||||||
|  | exit 1 | ||||||
|  | touch patreon.md.cache && \ | ||||||
|  | rm patreon.md.cache && \ | ||||||
|  | echo '<!-- PATREON_START -->' > patreon.md.cache && \ | ||||||
|  | url="https://www.patreon.com/api/oauth2/v2/campaigns/$__MISSKEY_CAMPAIGN_ID/members?include=currently_entitled_tiers,user&fields%5Btier%5D=title&fields%5Buser%5D=full_name,thumb_url,url,hide_pledges" | ||||||
|  | while : | ||||||
|  |  do | ||||||
|  |   touch patreon.raw.cache && \ | ||||||
|  |   rm patreon.raw.cache && \ | ||||||
|  |   curl -LSs -w '\n' -H "Authorization: Bearer $__MISSKEY_BEARER_TOKEN" -- $url > patreon.raw.cache && \ | ||||||
|  |   touch patreon.cache && \ | ||||||
|  |   rm patreon.cache && \ | ||||||
|  |   cat patreon.raw.cache | \ | ||||||
|  |   jq -r '(.data|map(select(.relationships.currently_entitled_tiers.data[]))|map(.relationships.user.data.id))as$data|.included|map(select(.attributes.hide_pledges==false))|map(select(.id as$id|$data|contains([$id])))|map(.attributes|[.full_name,.thumb_url,.url]|@tsv)|.[]|@text' >> patreon.cache && \ | ||||||
|  |   echo '<table><tr>' >> patreon.md.cache && \ | ||||||
|  |   cat patreon.cache | \ | ||||||
|  |   awk -F'\t' '{print $2,$1}' | \ | ||||||
|  |   sed -e 's/ /\\" alt=\\"/' | \ | ||||||
|  |   xargs -I% echo '<td><img src="%"></td>' >> patreon.md.cache && \ | ||||||
|  |   echo '</tr><tr>' >> patreon.md.cache && \ | ||||||
|  |   cat patreon.cache | \ | ||||||
|  |   awk -F'\t' '{print $3,$1}' | \ | ||||||
|  |   sed -e 's/ /\\">/' | \ | ||||||
|  |   xargs -I% echo '<td><a href="%</a></td>' >> patreon.md.cache && \ | ||||||
|  |   echo '</tr></table>' >> patreon.md.cache || \ | ||||||
|  |   exit 1 | ||||||
|  |   new_url="$(cat patreon.raw.cache | jq -r '.links.next')" | ||||||
|  |   test "$new_url" = 'null' && \ | ||||||
|  |   break || \ | ||||||
|  |   URL="$url" | ||||||
|  | done | ||||||
|  | ignore= && \ | ||||||
|  | echo -e "\n**Last updated:** $(date -uR | sed 's/\+0000/UTC/')\n<!-- PATREON_END -->" >> patreon.md.cache && \ | ||||||
|  | touch README.md && \ | ||||||
|  | touch .autogen/README.md && \ | ||||||
|  | rm .autogen/README.md && \ | ||||||
|  | mv README.md .autogen/README.md && \ | ||||||
|  | cat .autogen/README.md | while IFS= read line; | ||||||
|  |  do | ||||||
|  |   if [[ -z "$ignore" ]] | ||||||
|  |    then | ||||||
|  |     if [[ "$line" = '<!-- PATREON_START -->' ]] | ||||||
|  |      then | ||||||
|  |       ignore='PATREON_INSIDE' | ||||||
|  |      else | ||||||
|  |       echo "$line" >> README.md | ||||||
|  |     fi | ||||||
|  |    else | ||||||
|  |     if [[ "$LINE" = '<!-- PATREON_END -->' ]] | ||||||
|  |      then | ||||||
|  |       ignore= | ||||||
|  |       cat patreon.md.cache >> README.md | ||||||
|  |     fi | ||||||
|  |   fi | ||||||
|  | done | ||||||
|  | cat patreon.md.cache | ||||||
|  | touch null.cache && \ | ||||||
|  | rm *.cache && \ | ||||||
|  | diff .autogen/README.md README.md > diff.cache | ||||||
|  | cat diff.cache && \ | ||||||
|  | test 4 -lt $(cat diff.cache | wc -l) && \ | ||||||
|  | git add README.md && \ | ||||||
|  | git commit -m 'Update README.md [AUTOGEN]' && \ | ||||||
|  | git push -f origin patch-autogen && \ | ||||||
|  | curl -LSs -w '\n' -X POST -d '{"title":"[AUTOMATED] Update README.md","body":"*This pull request was created by a tool.*","head":"'$__MISSKEY_HEAD'","base":"'$__MISSKEY_BRANCH'"}' -- "https://api.github.com/repos/$__MISSKEY_REPO/pulls?access_token=$__MISSKEY_GITHUB_TOKEN" | ||||||
|  | git stash | ||||||
|  | git checkout $__MISSKEY_BRANCH | ||||||
|  | git branch -D patch-autogen | ||||||
| @@ -138,3 +138,6 @@ drive: | |||||||
|  |  | ||||||
| # Clustering | # Clustering | ||||||
| # clusterLimit: 1 | # clusterLimit: 1 | ||||||
|  |  | ||||||
|  | # Summaly proxy | ||||||
|  | # summalyProxy: "http://example.com" | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								.npmrc
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								.npmrc
									
									
									
									
									
								
							| @@ -1,2 +1,2 @@ | |||||||
| save-exact=true | save-exact = true | ||||||
| package-lock = false | package-lock = false | ||||||
|   | |||||||
							
								
								
									
										14
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								CHANGELOG.md
									
									
									
									
									
								
							| @@ -5,6 +5,16 @@ ChangeLog | |||||||
|  |  | ||||||
| This document describes breaking changes only. | This document describes breaking changes only. | ||||||
|  |  | ||||||
|  | 8.0.0 | ||||||
|  | ----- | ||||||
|  |  | ||||||
|  | ### Migration | ||||||
|  |  | ||||||
|  | 起動する前に、`node cli/migration/8.0.0`してください。 | ||||||
|  |  | ||||||
|  | Please run `node cli/migration/8.0.0` before launch. | ||||||
|  |  | ||||||
|  |  | ||||||
| 7.0.0 | 7.0.0 | ||||||
| ----- | ----- | ||||||
|  |  | ||||||
| @@ -37,13 +47,13 @@ Please run `node cli/migration/5.0.0` before launch. | |||||||
|  |  | ||||||
| オセロがリバーシに変更されました。 | オセロがリバーシに変更されました。 | ||||||
|  |  | ||||||
| Othello is now Reversi. | Othello is rename to Reversi. | ||||||
|  |  | ||||||
| ### Migration | ### Migration | ||||||
|  |  | ||||||
| MongoDBの、`othelloGames`と`othelloMatchings`コレクションをそれぞれ`reversiGames`と`reversiMatchings`にリネームしてください。 | MongoDBの、`othelloGames`と`othelloMatchings`コレクションをそれぞれ`reversiGames`と`reversiMatchings`にリネームしてください。 | ||||||
|  |  | ||||||
| You need to rename `othelloGames` and `othelloMatchings` MongoDB collections to `reversiGames` and `reversiMatchings`. | Please rename `othelloGames` and `othelloMatchings` MongoDB collections to `reversiGames` and `reversiMatchings` respectively. | ||||||
|  |  | ||||||
| 3.0.0 | 3.0.0 | ||||||
| ----- | ----- | ||||||
|   | |||||||
| @@ -1,27 +1,27 @@ | |||||||
| # Contribution guide | # Contribution guide | ||||||
| :v: Misskeyへの貢献ありがとうございます。 :v: | :v: Thanks for your contributions :v: | ||||||
|  |  | ||||||
| ## Issueの報告 | ## Issues | ||||||
| 新機能の提案や不具合の報告は https://github.com/syuilo/misskey/issues で管理しています。 | Feature suggestions and bug reports are filed in https://github.com/syuilo/misskey/issues . | ||||||
| Issueを作成する前に、既に同じIssueが作成されていないかご確認ください。 | Before creating a new issue, please search existing issues to avoid duplication. | ||||||
| もし既にIssueが作成されている場合は、既存のIssueにコメントをしたりリアクションをするようお願いします。 | If you find the existing issue, please add your reaction or comment to the issue. | ||||||
|  |  | ||||||
| ## Issueの解決 | ## Internationalization (i18n) | ||||||
| [pr-welcomeのラベルがついているIssue](https://github.com/syuilo/misskey/labels/pr-welcome) | Please see [Translation guide](./docs/translate.en.md). | ||||||
| の解決を目的としたPull Requestを作成してくださると非常にありがたいです。 |  | ||||||
|  |  | ||||||
| ## 翻訳の改善 | ## Localization (l10n) | ||||||
| ソースコード中の `%i18n:id%` という形の文字列は、言語ファイルの対応するテキストに置換されます。 | Please use [Crowdin](https://crowdin.com/project/misskey) for localization. | ||||||
| 言語ファイルは /locales ディレクトリに存在します。 |  | ||||||
|  |  | ||||||
| ## ドキュメントの編集 |  | ||||||
| 現在Misskeyはドキュメントが大きく不足しています。 |  | ||||||
| ドキュメントは /docs ディレクトリに存在します。 |  | ||||||
|  |  | ||||||
| ## テストの追加 | ## Documentation | ||||||
| 現在Misskeyはテストが大きく不足しています。 | * Documents for contributors are located in `/docs`. | ||||||
| テストコードは /test ディレクトリに存在します。 | * Documents for instance admins are located in `/docs`. | ||||||
|  | * Documents for end users are located in `src/docs`. | ||||||
|  |  | ||||||
| ## 自動テスト及び自動リリース | ## Test | ||||||
| Travis CIで行っています。 | * Test codes are located in `/test`. | ||||||
| 設定ファイルは /.travis に存在します。 |  | ||||||
|  | ## Continuous integration | ||||||
|  | Misskey uses Travis for automated test. | ||||||
|  | Configuration files are located in `/.travis`. | ||||||
|   | |||||||
							
								
								
									
										37
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										37
									
								
								README.md
									
									
									
									
									
								
							| @@ -24,7 +24,7 @@ Why don't you take a short break from the hustle and bustle of the city, and div | |||||||
| * Reactions | * Reactions | ||||||
| * User lists | * User lists | ||||||
| * Customizable column view (called MisskeyDeck) | * Customizable column view (called MisskeyDeck) | ||||||
|   * and widgets! | * Customizable widgets | ||||||
| * Private messages | * Private messages | ||||||
| * ActivityPub support | * ActivityPub support | ||||||
|  |  | ||||||
| @@ -32,52 +32,49 @@ and more! You can see it with your own eyes at [misskey.xyz](https://misskey.xyz | |||||||
|  |  | ||||||
| :package: Create your own instance | :package: Create your own instance | ||||||
| ---------------------------------------------------------------- | ---------------------------------------------------------------- | ||||||
| If you want to run your own instance of Misskey, | Please see [Setup and installation guide](./docs/setup.en.md). | ||||||
| please see [Setup and installation guide](./docs/setup.en.md). |  | ||||||
|  |  | ||||||
| :wrench: Contribute | :wrench: Contribution | ||||||
| ---------------------------------------------------------------- | ---------------------------------------------------------------- | ||||||
| **[PR](https://github.com/syuilo/misskey/pulls)s welcome!** | Please see [Contribution guide](./CONTRIBUTING.md). | ||||||
|  |  | ||||||
| If you want to... |  | ||||||
| * i18n ... please see [Translation guide](./docs/translate.en.md). |  | ||||||
| * l10n ... please visit https://crowdin.com/project/misskey |  | ||||||
|  |  | ||||||
| :heart: Backers & Sponsors | :heart: Backers & Sponsors | ||||||
| ---------------------------------------------------------------- | ---------------------------------------------------------------- | ||||||
| <!-- PATREON_START --> | <!-- PATREON_START --> | ||||||
| <table><tr> | <table><tr> | ||||||
| <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12378075/0156f769e20f412594fa6b87d85fe228/1?token-time=2145916800&token-hash=IsIJRUXszzoD6-7pDnRY8I05T9nSznc4GTaxj7C9SwU%3D" alt="39ff"></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/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/1?token-time=2145916800&token-hash=f03BFb4S2FUx9YEt87TnEmifb4h33OywGBW2akQVtQY%3D" alt="Melilot"></td> | <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12913507/f7181eacafe8469a93033d85f5969c29/1?token-time=2145916800&token-hash=f03BFb4S2FUx9YEt87TnEmifb4h33OywGBW2akQVtQY%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="Axella"></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/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/12021162/963128bb8d14476dbd8407943db8f31a/1?token-time=2145916800&token-hash=GgJ_NmUB6_nnRNLVGUWjV-WX91On7BOu59LKncYV9fE%3D" alt="gutfuckllc"></td> | ||||||
| <td><img src="https://c8.patreon.com/2/100/12718187" alt="Peter G."></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/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/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/12931605/ead494101f364dffa90efe49e36fb494/1?token-time=2145916800&token-hash=NzSFPjIlodXyv41rwK61aZWVZWfI4surJaNj8vWKvqM%3D" alt="Reiju"></td> |  | ||||||
| </tr><tr> | </tr><tr> | ||||||
| <td><a href="https://www.patreon.com/user?u=12378075">39ff</a></td> |  | ||||||
| <td><a href="https://www.patreon.com/user?u=12731202">negao</a></td> | <td><a href="https://www.patreon.com/user?u=12731202">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/user?u=12913507">Melilot</a></td> | ||||||
|  | <td><a href="https://www.patreon.com/AxellaMC">Axella</a></td> | ||||||
| <td><a href="https://www.patreon.com/user?u=3384329">べすれい</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/gutfuckllc">gutfuckllc</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=12718187">Peter G.</a></td> | ||||||
| <td><a href="https://www.patreon.com/user?u=5881381">Naoki Kosaka</a></td> | <td><a href="https://www.patreon.com/user?u=13039004">nemu</a></td> | ||||||
| <td><a href="https://www.patreon.com/user?u=12931605">Reiju</a></td> |  | ||||||
| </tr></table> | </tr></table> | ||||||
| <table><tr> | <table><tr> | ||||||
|  | <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/12931605/ead494101f364dffa90efe49e36fb494/1?token-time=2145916800&token-hash=NzSFPjIlodXyv41rwK61aZWVZWfI4surJaNj8vWKvqM%3D" alt="Reiju"></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/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/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/4950409/28e7d016209243759d9316be2e21381d/2?token-time=2145916800&token-hash=LuEaDkchH3GQWUcTOhBQ8xfKQYF0s5FjlZRd7Yduia8%3D" alt="mikan54951"></td> |  | ||||||
| <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12531784/93a45137841849329ba692da92ac7c60/1?token-time=2145916800&token-hash=tMosUojzUYJCH_3t--tvYA-SMCyrS__hzSndyaRSnbo%3D" alt="Takashi Shibuya"></td> | <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12531784/93a45137841849329ba692da92ac7c60/1?token-time=2145916800&token-hash=tMosUojzUYJCH_3t--tvYA-SMCyrS__hzSndyaRSnbo%3D" alt="Takashi Shibuya"></td> | ||||||
| <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12959468/c249e15aebec4424b5c0f427173671b6/1?token-time=2145916800&token-hash=lubpCEdxAkxPlpR2O6bvZ7BIh8Q4nGf-U_mE1qpjVAQ%3D" alt="fujishan"></td> |  | ||||||
| </tr><tr> | </tr><tr> | ||||||
|  | <td><a href="https://www.patreon.com/user?u=5881381">Naoki Kosaka</a></td> | ||||||
|  | <td><a href="https://www.patreon.com/user?u=12931605">Reiju</a></td> | ||||||
|  | <td><a href="https://www.patreon.com/hiratake">Hiratake</a></td> | ||||||
| <td><a href="https://www.patreon.com/dansup">dansup</a></td> | <td><a href="https://www.patreon.com/dansup">dansup</a></td> | ||||||
| <td><a href="https://www.patreon.com/user?u=4950409">mikan54951</a></td> |  | ||||||
| <td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td> | <td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td> | ||||||
| <td><a href="https://www.patreon.com/fujishan">fujishan</a></td> |  | ||||||
| </tr></table> | </tr></table> | ||||||
|  |  | ||||||
| **Last updated:** Sat, 18 Aug 2018 02:02:58 UTC | **Last updated:** Sun, 02 Sep 2018 05:30:06 UTC | ||||||
| <!-- PATREON_END --> | <!-- PATREON_END --> | ||||||
|  |  | ||||||
| :four_leaf_clover: Copyright | :four_leaf_clover: Copyright | ||||||
|   | |||||||
							
								
								
									
										
											BIN
										
									
								
								assets/about/drive.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								assets/about/drive.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 110 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/about/post.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								assets/about/post.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 344 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/about/reaction.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								assets/about/reaction.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 24 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/about/ui.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								assets/about/ui.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 125 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/ai-orig.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								assets/ai-orig.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 256 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/ai.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								assets/ai.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 243 KiB | 
| @@ -1,40 +0,0 @@ | |||||||
| const { default: User, deleteUser } = require('../built/models/user'); |  | ||||||
| const { default: zip } = require('@prezzemolo/zip') |  | ||||||
|  |  | ||||||
| const migrate = async (user) => { |  | ||||||
| 	try { |  | ||||||
| 		await deleteUser(user._id); |  | ||||||
| 		return true; |  | ||||||
| 	} catch (e) { |  | ||||||
| 		return false; |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| async function main() { |  | ||||||
| 	const count = await User.count({ |  | ||||||
| 		uri: /#/ |  | ||||||
| 	}); |  | ||||||
|  |  | ||||||
| 	const dop = 1 |  | ||||||
| 	const idop = ((count - (count % dop)) / dop) + 1 |  | ||||||
|  |  | ||||||
| 	return zip( |  | ||||||
| 		1, |  | ||||||
| 		async (time) => { |  | ||||||
| 			console.log(`${time} / ${idop}`) |  | ||||||
| 			const doc = await User.find({ |  | ||||||
| 				uri: /#/ |  | ||||||
| 			}, { |  | ||||||
| 				limit: dop, skip: time * dop |  | ||||||
| 			}) |  | ||||||
| 			return Promise.all(doc.map(migrate)) |  | ||||||
| 		}, |  | ||||||
| 		idop |  | ||||||
| 	).then(a => { |  | ||||||
| 		const rv = [] |  | ||||||
| 		a.forEach(e => rv.push(...e)) |  | ||||||
| 		return rv |  | ||||||
| 	}) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| main().then(console.dir).catch(console.error) |  | ||||||
							
								
								
									
										144
									
								
								cli/migration/8.0.0.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										144
									
								
								cli/migration/8.0.0.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,144 @@ | |||||||
|  | const { default: Stats } = require('../../built/models/stats'); | ||||||
|  | const { default: User } = require('../../built/models/user'); | ||||||
|  | const { default: Note } = require('../../built/models/note'); | ||||||
|  | const { default: DriveFile } = require('../../built/models/drive-file'); | ||||||
|  |  | ||||||
|  | const now = new Date(); | ||||||
|  | const y = now.getFullYear(); | ||||||
|  | const m = now.getMonth(); | ||||||
|  | const d = now.getDate(); | ||||||
|  | const h = now.getHours(); | ||||||
|  | const date = new Date(y, m, d, h); | ||||||
|  |  | ||||||
|  | async function main() { | ||||||
|  | 	await Stats.update({}, { | ||||||
|  | 		$set: { | ||||||
|  | 			span: 'day' | ||||||
|  | 		} | ||||||
|  | 	}, { | ||||||
|  | 		multi: true | ||||||
|  | 	}); | ||||||
|  |  | ||||||
|  | 	const localUsersCount = await User.count({ | ||||||
|  | 		host: null | ||||||
|  | 	}); | ||||||
|  |  | ||||||
|  | 	const remoteUsersCount = await User.count({ | ||||||
|  | 		host: { $ne: null } | ||||||
|  | 	}); | ||||||
|  |  | ||||||
|  | 	const localNotesCount = await Note.count({ | ||||||
|  | 		'_user.host': null | ||||||
|  | 	}); | ||||||
|  |  | ||||||
|  | 	const remoteNotesCount = await Note.count({ | ||||||
|  | 		'_user.host': { $ne: null } | ||||||
|  | 	}); | ||||||
|  |  | ||||||
|  | 	const localDriveFilesCount = await DriveFile.count({ | ||||||
|  | 		'metadata._user.host': null | ||||||
|  | 	}); | ||||||
|  |  | ||||||
|  | 	const remoteDriveFilesCount = await DriveFile.count({ | ||||||
|  | 		'metadata._user.host': { $ne: null } | ||||||
|  | 	}); | ||||||
|  |  | ||||||
|  | 	const localDriveFilesSize = await DriveFile | ||||||
|  | 		.aggregate([{ | ||||||
|  | 			$match: { | ||||||
|  | 				'metadata._user.host': null, | ||||||
|  | 				'metadata.deletedAt': { $exists: false } | ||||||
|  | 			} | ||||||
|  | 		}, { | ||||||
|  | 			$project: { | ||||||
|  | 				length: true | ||||||
|  | 			} | ||||||
|  | 		}, { | ||||||
|  | 			$group: { | ||||||
|  | 				_id: null, | ||||||
|  | 				usage: { $sum: '$length' } | ||||||
|  | 			} | ||||||
|  | 		}]) | ||||||
|  | 		.then(aggregates => { | ||||||
|  | 			if (aggregates.length > 0) { | ||||||
|  | 				return aggregates[0].usage; | ||||||
|  | 			} | ||||||
|  | 			return 0; | ||||||
|  | 		}); | ||||||
|  |  | ||||||
|  | 	const remoteDriveFilesSize = await DriveFile | ||||||
|  | 		.aggregate([{ | ||||||
|  | 			$match: { | ||||||
|  | 				'metadata._user.host': { $ne: null }, | ||||||
|  | 				'metadata.deletedAt': { $exists: false } | ||||||
|  | 			} | ||||||
|  | 		}, { | ||||||
|  | 			$project: { | ||||||
|  | 				length: true | ||||||
|  | 			} | ||||||
|  | 		}, { | ||||||
|  | 			$group: { | ||||||
|  | 				_id: null, | ||||||
|  | 				usage: { $sum: '$length' } | ||||||
|  | 			} | ||||||
|  | 		}]) | ||||||
|  | 		.then(aggregates => { | ||||||
|  | 			if (aggregates.length > 0) { | ||||||
|  | 				return aggregates[0].usage; | ||||||
|  | 			} | ||||||
|  | 			return 0; | ||||||
|  | 		}); | ||||||
|  |  | ||||||
|  | 	await Stats.insert({ | ||||||
|  | 		date: date, | ||||||
|  | 		span: 'hour', | ||||||
|  | 		users: { | ||||||
|  | 			local: { | ||||||
|  | 				total: localUsersCount, | ||||||
|  | 				diff: 0 | ||||||
|  | 			}, | ||||||
|  | 			remote: { | ||||||
|  | 				total: remoteUsersCount, | ||||||
|  | 				diff: 0 | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		notes: { | ||||||
|  | 			local: { | ||||||
|  | 				total: localNotesCount, | ||||||
|  | 				diff: 0, | ||||||
|  | 				diffs: { | ||||||
|  | 					normal: 0, | ||||||
|  | 					reply: 0, | ||||||
|  | 					renote: 0 | ||||||
|  | 				} | ||||||
|  | 			}, | ||||||
|  | 			remote: { | ||||||
|  | 				total: remoteNotesCount, | ||||||
|  | 				diff: 0, | ||||||
|  | 				diffs: { | ||||||
|  | 					normal: 0, | ||||||
|  | 					reply: 0, | ||||||
|  | 					renote: 0 | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		drive: { | ||||||
|  | 			local: { | ||||||
|  | 				totalCount: localDriveFilesCount, | ||||||
|  | 				totalSize: localDriveFilesSize, | ||||||
|  | 				diffCount: 0, | ||||||
|  | 				diffSize: 0 | ||||||
|  | 			}, | ||||||
|  | 			remote: { | ||||||
|  | 				totalCount: remoteDriveFilesCount, | ||||||
|  | 				totalSize: remoteDriveFilesSize, | ||||||
|  | 				diffCount: 0, | ||||||
|  | 				diffSize: 0 | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	}); | ||||||
|  |  | ||||||
|  | 	console.log('done'); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | main(); | ||||||
| @@ -1,3 +1,3 @@ | |||||||
| files: | files: | ||||||
|   - source: /locales/ja.yml |   - source: /locales/ja-JP.yml | ||||||
|     translation: /locales/%two_letters_code%.yml |     translation: /locales/%locale%.yml | ||||||
|   | |||||||
| @@ -54,7 +54,7 @@ Please visit https://www.google.com/recaptcha/intro/ and generate keys. | |||||||
|  |  | ||||||
| *(optional)* Generating VAPID keys | *(optional)* Generating VAPID keys | ||||||
| ---------------------------------------------------------------- | ---------------------------------------------------------------- | ||||||
| If you want to enable ServiceWroker, you need to generate VAPID keys: | If you want to enable ServiceWorker, you need to generate VAPID keys: | ||||||
| Unless you have set your global node_modules location elsewhere, you need to run this in root. | Unless you have set your global node_modules location elsewhere, you need to run this in root. | ||||||
|  |  | ||||||
| ``` shell | ``` shell | ||||||
| @@ -131,6 +131,7 @@ You can check if the service is running with `systemctl status misskey`. | |||||||
| 2. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` | 2. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` | ||||||
| 3. `npm install` | 3. `npm install` | ||||||
| 4. `npm run build` | 4. `npm run build` | ||||||
|  | 5. Check [ChangeLog](../CHANGELOG.md) for migration information | ||||||
|  |  | ||||||
| ---------------------------------------------------------------- | ---------------------------------------------------------------- | ||||||
|  |  | ||||||
|   | |||||||
| @@ -109,6 +109,7 @@ Restart=always | |||||||
| [Install] | [Install] | ||||||
| WantedBy=multi-user.target | WantedBy=multi-user.target | ||||||
| ``` | ``` | ||||||
|  | CentOSで1024以下のポートを使用してMisskeyを使用する場合は`ExecStart=/usr/bin/sudo /usr/bin/npm start`に変更する必要があります。 | ||||||
|  |  | ||||||
| 3. `systemctl daemon-reload ; systemctl enable misskey` systemdを再読み込みしmisskeyサービスを有効化 | 3. `systemctl daemon-reload ; systemctl enable misskey` systemdを再読み込みしmisskeyサービスを有効化 | ||||||
| 4. `systemctl start misskey` misskeyサービスの起動 | 4. `systemctl start misskey` misskeyサービスの起動 | ||||||
| @@ -120,6 +121,7 @@ WantedBy=multi-user.target | |||||||
| 2. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` | 2. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` | ||||||
| 3. `npm install` | 3. `npm install` | ||||||
| 4. `npm run build` | 4. `npm run build` | ||||||
|  | 5. [ChangeLog](../CHANGELOG.md)でマイグレーション情報を確認する | ||||||
|  |  | ||||||
| ---------------------------------------------------------------- | ---------------------------------------------------------------- | ||||||
|  |  | ||||||
|   | |||||||
| @@ -11,12 +11,12 @@ If you find an untranslated part on Misskey: | |||||||
| 	- In fact, `foo` should be a word that is appropriate for the situation and is easy to understand in English. | 	- In fact, `foo` should be a word that is appropriate for the situation and is easy to understand in English. | ||||||
| 	- For example, if the untranslated portion is the following "タイムライン" you must write: `%i18n:@timeline%`. | 	- For example, if the untranslated portion is the following "タイムライン" you must write: `%i18n:@timeline%`. | ||||||
|  |  | ||||||
| 3. Open the `locales/ja.yml`, check whether the <strong>file name (path)</strong> found in step 1 exists, if not, create it. | 3. Open the `locales/ja-JP.yml`, check whether the <strong>file name (path)</strong> found in step 1 exists, if not, create it. | ||||||
| 	- Do not put the beginning of the path `src/client/app/` in the locale file. | 	- Do not put the beginning of the path `src/client/app/` in the locale file. | ||||||
| 	- For example, in this case we want to modify untranslated parts of `src/client/app/mobile/views/pages/home.vue`, so the key is `mobile/views/pages/home.vue`. | 	- For example, in this case we want to modify untranslated parts of `src/client/app/mobile/views/pages/home.vue`, so the key is `mobile/views/pages/home.vue`. | ||||||
|  |  | ||||||
| 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. | 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.yml`. | 	-   For example, in this case we add timeline: `timeline: "タイムライン"` to `locales/ja-JP.yml`. | ||||||
|  |  | ||||||
| 5. And done! | 5. And done! | ||||||
|  |  | ||||||
|   | |||||||
| @@ -16,7 +16,7 @@ Si vous trouvez un segment non-traduit sur Misskey : | |||||||
| 	- Par exemple, dans ce cas de figure, nous voulons modifier le segment non-traduit de : `src/client/app/mobile/views/pages/home.vue`donc il faut juste écrire : `mobile/views/pages/home.vue` dans les fichiers linguistiques. | 	- Par exemple, dans ce cas de figure, nous voulons modifier le segment non-traduit de : `src/client/app/mobile/views/pages/home.vue`donc il faut juste écrire : `mobile/views/pages/home.vue` dans les fichiers linguistiques. | ||||||
|  |  | ||||||
| 4. Ajoutez la propriété du texte traduit grâce à la clef `foo`, en-dessous du chemin correspondant à votre modification que vous avez trouvé ou créé dans l'étape 2. À côté, veuillez indiquer entre "guillemets" la valeur de votre traduction. | 4. Ajoutez la propriété du texte traduit grâce à la clef `foo`, en-dessous du chemin correspondant à votre modification que vous avez trouvé ou créé dans l'étape 2. À côté, veuillez indiquer entre "guillemets" la valeur de votre traduction. | ||||||
| 	- Par exemple, dans ce cas de figure, nous ajoutons la propriété et la traduction `timeline: "Timeline"` à `locales/fr.yml`, mais aussi la propriété et la version originale `timeline: "タイムライン"` à `locales/ja.yml`. | 	- Par exemple, dans ce cas de figure, nous ajoutons la propriété et la traduction `timeline: "Timeline"` à `locales/fr.yml`, mais aussi la propriété et la version originale `timeline: "タイムライン"` à `locales/ja-JP.yml`. | ||||||
|  |  | ||||||
| 5. Vous avez réussi à traduire une portion de misskey ! | 5. Vous avez réussi à traduire une portion de misskey ! | ||||||
|  |  | ||||||
|   | |||||||
| @@ -11,12 +11,12 @@ Misskey内の未翻訳箇所を見つけたら | |||||||
| 	- `foo`は実際にはその場に適したわかりやすい(英語の)名前にしてください。 | 	- `foo`は実際にはその場に適したわかりやすい(英語の)名前にしてください。 | ||||||
| 	- 例えば未翻訳箇所が「タイムライン」というテキストだった場合、`%i18n:@timeline%`のようにします。 | 	- 例えば未翻訳箇所が「タイムライン」というテキストだった場合、`%i18n:@timeline%`のようにします。 | ||||||
|  |  | ||||||
| 3. `locales/ja.yml`を開き、1.で見つけた<strong>ファイル名(パス)</strong>のキーが存在するか確認し、無ければ作成してください。 | 3. `locales/ja-JP.yml`を開き、1.で見つけた<strong>ファイル名(パス)</strong>のキーが存在するか確認し、無ければ作成してください。 | ||||||
| 	- パスの`src/client/app/`は省略してください。 | 	- パスの`src/client/app/`は省略してください。 | ||||||
| 	- 例えば、今回の例では`src/client/app/mobile/views/pages/home.vue`の未翻訳箇所を修正したいので、キーは`mobile/views/pages/home.vue`になります。 | 	- 例えば、今回の例では`src/client/app/mobile/views/pages/home.vue`の未翻訳箇所を修正したいので、キーは`mobile/views/pages/home.vue`になります。 | ||||||
|  |  | ||||||
| 4. そのキーの直下に2.で置換した`foo`の部分をキーとし、テキストを値とするプロパティを追加します。 | 4. そのキーの直下に2.で置換した`foo`の部分をキーとし、テキストを値とするプロパティを追加します。 | ||||||
| 	- 例えば、今回の例で言うと`locales/ja.yml`に`timeline: "タイムライン"`を追加します。 | 	- 例えば、今回の例で言うと`locales/ja-JP.yml`に`timeline: "タイムライン"`を追加します。 | ||||||
|  |  | ||||||
| 5. 完了です! | 5. 完了です! | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										13
									
								
								gulpfile.ts
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								gulpfile.ts
									
									
									
									
									
								
							| @@ -23,7 +23,6 @@ const uglifyes = require('uglify-es'); | |||||||
|  |  | ||||||
| const locales = require('./locales'); | const locales = require('./locales'); | ||||||
| import { fa } from './src/misc/fa'; | import { fa } from './src/misc/fa'; | ||||||
| import config from './src/config'; |  | ||||||
|  |  | ||||||
| const uglify = uglifyComposer(uglifyes, console); | const uglify = uglifyComposer(uglifyes, console); | ||||||
|  |  | ||||||
| @@ -60,7 +59,16 @@ gulp.task('build:copy:views', () => | |||||||
| 	gulp.src('./src/server/web/views/**/*').pipe(gulp.dest('./built/server/web/views')) | 	gulp.src('./src/server/web/views/**/*').pipe(gulp.dest('./built/server/web/views')) | ||||||
| ); | ); | ||||||
|  |  | ||||||
| gulp.task('build:copy', ['build:copy:views'], () => | // 互換性のため | ||||||
|  | gulp.task('build:copy:lang', () => | ||||||
|  | 	gulp.src(['./built/client/assets/*.*-*.js']) | ||||||
|  | 		.pipe(rename(path => { | ||||||
|  | 			path.basename = path.basename.replace(/\-(.*)$/, ''); | ||||||
|  | 		})) | ||||||
|  | 		.pipe(gulp.dest('./built/client/assets/')) | ||||||
|  | ); | ||||||
|  |  | ||||||
|  | gulp.task('build:copy', ['build:copy:views', 'build:copy:lang'], () => | ||||||
| 	gulp.src([ | 	gulp.src([ | ||||||
| 		'./build/Release/crypto_key.node', | 		'./build/Release/crypto_key.node', | ||||||
| 		'./src/const.json', | 		'./src/const.json', | ||||||
| @@ -118,7 +126,6 @@ gulp.task('build:client:script', () => { | |||||||
| 	const client = require('./built/client/meta.json'); | 	const client = require('./built/client/meta.json'); | ||||||
| 	return gulp.src(['./src/client/app/boot.js', './src/client/app/safe.js']) | 	return gulp.src(['./src/client/app/boot.js', './src/client/app/safe.js']) | ||||||
| 		.pipe(replace('VERSION', JSON.stringify(client.version))) | 		.pipe(replace('VERSION', JSON.stringify(client.version))) | ||||||
| 		.pipe(replace('API', JSON.stringify(config.api_url))) |  | ||||||
| 		.pipe(replace('ENV', JSON.stringify(env))) | 		.pipe(replace('ENV', JSON.stringify(env))) | ||||||
| 		.pipe(replace('LANGS', JSON.stringify(Object.keys(locales)))) | 		.pipe(replace('LANGS', JSON.stringify(Object.keys(locales)))) | ||||||
| 		.pipe(isProduction ? uglify({ | 		.pipe(isProduction ? uglify({ | ||||||
|   | |||||||
| @@ -1,5 +1,3 @@ | |||||||
| # **Please DO NOT edit these files** except `ja.yml`. | # **DO NOT edit locale files** except `ja-JP.yml`. | ||||||
|  |  | ||||||
| If you want to... | Please see [Contribution guide](../CONTRIBUTING.md) for more information. | ||||||
| * i18n ... please see [Translation guide](../docs/translate.en.md). |  | ||||||
| * l10n ... please visit https://crowdin.com/project/misskey |  | ||||||
|   | |||||||
| @@ -84,8 +84,10 @@ common: | |||||||
|   my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。" |   my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。" | ||||||
|   i-like-sushi: "私は(プリンよりむしろ)寿司が好き" |   i-like-sushi: "私は(プリンよりむしろ)寿司が好き" | ||||||
|   show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示" |   show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示" | ||||||
|  |   use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける" | ||||||
|   verified-user: "公式アカウント" |   verified-user: "公式アカウント" | ||||||
|   disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" |   disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" | ||||||
|  |   do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' | ||||||
|   reversi: |   reversi: | ||||||
|     drawn: "引き分け" |     drawn: "引き分け" | ||||||
|     my-turn: "あなたのターンです" |     my-turn: "あなたのターンです" | ||||||
| @@ -259,6 +261,8 @@ common/views/components/nav.vue: | |||||||
|   develop: "開発者" |   develop: "開発者" | ||||||
|   feedback: "フィードバック" |   feedback: "フィードバック" | ||||||
| common/views/components/note-menu.vue: | common/views/components/note-menu.vue: | ||||||
|  |   detail: "詳細" | ||||||
|  |   copy-link: "リンクをコピー" | ||||||
|   favorite: "お気に入り" |   favorite: "お気に入り" | ||||||
|   pin: "ピン留め" |   pin: "ピン留め" | ||||||
|   delete: "削除" |   delete: "削除" | ||||||
| @@ -336,6 +340,9 @@ common/views/components/visibility-chooser.vue: | |||||||
|   specified: "ダイレクト" |   specified: "ダイレクト" | ||||||
|   specified-desc: "指定したユーザーにのみ公開" |   specified-desc: "指定したユーザーにのみ公開" | ||||||
|   private: "非公開" |   private: "非公開" | ||||||
|  | common/views/components/trends.vue: | ||||||
|  |   count: "{}人が投稿" | ||||||
|  |   empty: "トレンドなし" | ||||||
| common/views/widgets/broadcast.vue: | common/views/widgets/broadcast.vue: | ||||||
|   fetching: "確認中" |   fetching: "確認中" | ||||||
|   no-broadcasts: "お知らせはありません" |   no-broadcasts: "お知らせはありません" | ||||||
| @@ -359,8 +366,6 @@ common/views/widgets/posts-monitor.vue: | |||||||
|   toggle: "表示を切り替え" |   toggle: "表示を切り替え" | ||||||
| common/views/widgets/hashtags.vue: | common/views/widgets/hashtags.vue: | ||||||
|   title: "ハッシュタグ" |   title: "ハッシュタグ" | ||||||
|   count: "{}人が投稿" |  | ||||||
|   empty: "トレンドなし" |  | ||||||
| common/views/widgets/server.vue: | common/views/widgets/server.vue: | ||||||
|   title: "サーバー情報" |   title: "サーバー情報" | ||||||
|   toggle: "表示を切り替え" |   toggle: "表示を切り替え" | ||||||
| @@ -410,6 +415,7 @@ desktop: | |||||||
|   uploading-avatar: "新しいアバターをアップロードしています" |   uploading-avatar: "新しいアバターをアップロードしています" | ||||||
|   avatar-updated: "アバターを更新しました" |   avatar-updated: "アバターを更新しました" | ||||||
|   choose-avatar: "アバターにする画像を選択" |   choose-avatar: "アバターにする画像を選択" | ||||||
|  |   invalid-filetype: "この形式のファイルはサポートされていません" | ||||||
| desktop/views/components/activity.chart.vue: | desktop/views/components/activity.chart.vue: | ||||||
|   total: "Black ... Total" |   total: "Black ... Total" | ||||||
|   notes: "Blue ... Notes" |   notes: "Blue ... Notes" | ||||||
| @@ -423,6 +429,24 @@ desktop/views/components/calendar.vue: | |||||||
|   prev: "前の月" |   prev: "前の月" | ||||||
|   next: "次の月" |   next: "次の月" | ||||||
|   go: "クリックして時間遡行" |   go: "クリックして時間遡行" | ||||||
|  | desktop/views/components/charts.vue: | ||||||
|  |   title: "チャート" | ||||||
|  |   per-day: "1日ごと" | ||||||
|  |   per-hour: "1時間ごと" | ||||||
|  |   notes: "投稿" | ||||||
|  |   users: "ユーザー" | ||||||
|  |   drive: "ドライブ" | ||||||
|  |   charts: | ||||||
|  |     notes: "投稿の増減 (統合)" | ||||||
|  |     local-notes: "投稿の増減 (ローカル)" | ||||||
|  |     remote-notes: "投稿の増減 (リモート)" | ||||||
|  |     notes-total: "投稿の累計" | ||||||
|  |     users: "ユーザーの増減" | ||||||
|  |     users-total: "ユーザーの累計" | ||||||
|  |     drive: "ドライブ使用量の増減" | ||||||
|  |     drive-total: "ドライブ使用量の累計" | ||||||
|  |     drive-files: "ドライブのファイル数の増減" | ||||||
|  |     drive-files-total: "ドライブのファイル数の累計" | ||||||
| desktop/views/components/choose-file-from-drive-window.vue: | desktop/views/components/choose-file-from-drive-window.vue: | ||||||
|   choose-file: "ファイル選択中" |   choose-file: "ファイル選択中" | ||||||
|   upload: "PCからドライブにファイルをアップロード" |   upload: "PCからドライブにファイルをアップロード" | ||||||
| @@ -627,9 +651,11 @@ desktop/views/components/settings.vue: | |||||||
|   delete-wallpaper: "壁紙を削除" |   delete-wallpaper: "壁紙を削除" | ||||||
|   dark-mode: "ダークモード" |   dark-mode: "ダークモード" | ||||||
|   circle-icons: "円形のアイコンを使用" |   circle-icons: "円形のアイコンを使用" | ||||||
|  |   contrasted-acct: "ユーザー名にコントラストを付ける" | ||||||
|   gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用" |   gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用" | ||||||
|   post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" |   post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" | ||||||
|   suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" |   suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" | ||||||
|  |   show-clock-on-header: "右上に時計を表示する" | ||||||
|   show-reply-target: "リプライ先を表示する" |   show-reply-target: "リプライ先を表示する" | ||||||
|   show-my-renotes: "自分の行ったRenoteをタイムラインに表示する" |   show-my-renotes: "自分の行ったRenoteをタイムラインに表示する" | ||||||
|   show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" |   show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" | ||||||
| @@ -754,6 +780,7 @@ desktop/views/components/ui.header.account.vue: | |||||||
|   lists: "リスト" |   lists: "リスト" | ||||||
|   follow-requests: "フォロー申請" |   follow-requests: "フォロー申請" | ||||||
|   customize: "ホームのカスタマイズ" |   customize: "ホームのカスタマイズ" | ||||||
|  |   admin: "管理" | ||||||
|   settings: "設定" |   settings: "設定" | ||||||
|   signout: "サインアウト" |   signout: "サインアウト" | ||||||
|   dark: "闇に飲まれる" |   dark: "闇に飲まれる" | ||||||
| @@ -799,8 +826,8 @@ desktop/views/pages/admin/admin.dashboard.vue: | |||||||
|   dashboard: "ダッシュボード" |   dashboard: "ダッシュボード" | ||||||
|   all-users: "全てのユーザー" |   all-users: "全てのユーザー" | ||||||
|   original-users: "このインスタンスのユーザー" |   original-users: "このインスタンスのユーザー" | ||||||
|   all-notes: "全てのノート" |   all-notes: "全ての投稿" | ||||||
|   original-notes: "このインスタンスのノート" |   original-notes: "このインスタンスの投稿" | ||||||
|   invite: "招待" |   invite: "招待" | ||||||
| desktop/views/pages/admin/admin.suspend-user.vue: | desktop/views/pages/admin/admin.suspend-user.vue: | ||||||
|   suspend-user: "ユーザーの凍結" |   suspend-user: "ユーザーの凍結" | ||||||
| @@ -818,18 +845,6 @@ desktop/views/pages/admin/admin.unverify-user.vue: | |||||||
|   unverify-user: "ユーザーの公式アカウント解除" |   unverify-user: "ユーザーの公式アカウント解除" | ||||||
|   unverify: "公式アカウントを解除する" |   unverify: "公式アカウントを解除する" | ||||||
|   unverified: "公式アカウントを解除しました" |   unverified: "公式アカウントを解除しました" | ||||||
| desktop/views/pages/admin/admin.notes-chart.vue: |  | ||||||
|   title: "投稿" |  | ||||||
|   local: "ローカル" |  | ||||||
|   remote: "リモート" |  | ||||||
| desktop/views/pages/admin/admin.users-chart.vue: |  | ||||||
|   title: "ユーザー" |  | ||||||
|   local: "ローカル" |  | ||||||
|   remote: "リモート" |  | ||||||
| desktop/views/pages/admin/admin.drive-chart.vue: |  | ||||||
|   title: "ドライブ" |  | ||||||
|   local: "ローカル" |  | ||||||
|   remote: "リモート" |  | ||||||
| desktop/views/pages/deck/deck.tl-column.vue: | desktop/views/pages/deck/deck.tl-column.vue: | ||||||
|   is-media-only: "メディア投稿のみ" |   is-media-only: "メディア投稿のみ" | ||||||
|   is-media-view: "メディアビュー" |   is-media-view: "メディアビュー" | ||||||
| @@ -838,6 +853,11 @@ desktop/views/pages/deck/deck.note.vue: | |||||||
|   reposted-by: "{}がRenote" |   reposted-by: "{}がRenote" | ||||||
|   private: "この投稿は非公開です" |   private: "この投稿は非公開です" | ||||||
|   deleted: "この投稿は削除されました" |   deleted: "この投稿は削除されました" | ||||||
|  | desktop/views/pages/stats/stats.vue: | ||||||
|  |   all-users: "全てのユーザー" | ||||||
|  |   original-users: "このインスタンスのユーザー" | ||||||
|  |   all-notes: "全ての投稿" | ||||||
|  |   original-notes: "このインスタンスの投稿" | ||||||
| desktop/views/pages/welcome.vue: | desktop/views/pages/welcome.vue: | ||||||
|   about: "詳しく..." |   about: "詳しく..." | ||||||
|   gotit: "わかった" |   gotit: "わかった" | ||||||
| @@ -846,7 +866,10 @@ desktop/views/pages/welcome.vue: | |||||||
|   signin-button: "やってる" |   signin-button: "やってる" | ||||||
|   signup-button: "やる" |   signup-button: "やる" | ||||||
|   timeline: "タイムライン" |   timeline: "タイムライン" | ||||||
|  |   announcements: "お知らせ" | ||||||
|  |   photos: "最近の画像" | ||||||
|   powered-by-misskey: "Powered by <b>Misskey</b>." |   powered-by-misskey: "Powered by <b>Misskey</b>." | ||||||
|  |   info: "情報" | ||||||
| desktop/views/pages/drive.vue: | desktop/views/pages/drive.vue: | ||||||
|   title: "Misskey Drive" |   title: "Misskey Drive" | ||||||
| desktop/views/pages/favorites.vue: | desktop/views/pages/favorites.vue: | ||||||
| @@ -1044,6 +1067,7 @@ mobile/views/components/ui.nav.vue: | |||||||
|   game: "ゲーム" |   game: "ゲーム" | ||||||
|   darkmode: "ダークモード" |   darkmode: "ダークモード" | ||||||
|   settings: "設定" |   settings: "設定" | ||||||
|  |   admin: "管理" | ||||||
|   about: "Misskeyについて" |   about: "Misskeyについて" | ||||||
| mobile/views/components/user-timeline.vue: | mobile/views/components/user-timeline.vue: | ||||||
|   no-notes: "このユーザーは投稿していないようです。" |   no-notes: "このユーザーは投稿していないようです。" | ||||||
| @@ -1133,6 +1157,7 @@ mobile/views/pages/settings.vue: | |||||||
|   dark-mode: "ダークモード" |   dark-mode: "ダークモード" | ||||||
|   i-am-under-limited-internet: "私は通信を制限されている" |   i-am-under-limited-internet: "私は通信を制限されている" | ||||||
|   circle-icons: "円形のアイコンを使用" |   circle-icons: "円形のアイコンを使用" | ||||||
|  |   contrasted-acct: "ユーザー名にコントラストを付ける" | ||||||
|   timeline: "タイムライン" |   timeline: "タイムライン" | ||||||
|   show-reply-target: "リプライ先を表示する" |   show-reply-target: "リプライ先を表示する" | ||||||
|   show-my-renotes: "自分の行ったRenoteを表示する" |   show-my-renotes: "自分の行ったRenoteを表示する" | ||||||
| @@ -1141,6 +1166,9 @@ mobile/views/pages/settings.vue: | |||||||
|   post-style: "投稿の表示スタイル" |   post-style: "投稿の表示スタイル" | ||||||
|   post-style-standard: "標準" |   post-style-standard: "標準" | ||||||
|   post-style-smart: "スマート" |   post-style-smart: "スマート" | ||||||
|  |   notification-position: "通知の表示" | ||||||
|  |   notification-position-bottom: "下" | ||||||
|  |   notification-position-top: "上" | ||||||
|   behavior: "動作" |   behavior: "動作" | ||||||
|   fetch-on-scroll: "スクロールで自動読み込み" |   fetch-on-scroll: "スクロールで自動読み込み" | ||||||
|   disable-via-mobile: "「モバイルからの投稿」フラグを付けない" |   disable-via-mobile: "「モバイルからの投稿」フラグを付けない" | ||||||
| @@ -1161,6 +1189,8 @@ mobile/views/pages/settings.vue: | |||||||
|   update-available-desc: "ページを再度読み込みすると更新が適用されます。" |   update-available-desc: "ページを再度読み込みすると更新が適用されます。" | ||||||
|   settings: "設定" |   settings: "設定" | ||||||
|   signout: "サインアウト" |   signout: "サインアウト" | ||||||
|  |   sound: "サウンド" | ||||||
|  |   enable-sounds: "サウンドを有効にする" | ||||||
| mobile/views/pages/user.vue: | mobile/views/pages/user.vue: | ||||||
|   follows-you: "フォローされています" |   follows-you: "フォローされています" | ||||||
|   following: "フォロー" |   following: "フォロー" | ||||||
| @@ -58,7 +58,7 @@ common: | |||||||
|     friday: "金曜日" |     friday: "金曜日" | ||||||
|     saturday: "土曜日" |     saturday: "土曜日" | ||||||
|   reactions: |   reactions: | ||||||
|     like: "Gefällt mir" |     like: "いいね" | ||||||
|     love: "Lieben" |     love: "Lieben" | ||||||
|     laugh: "Lachen" |     laugh: "Lachen" | ||||||
|     hmm: "Hmm...?" |     hmm: "Hmm...?" | ||||||
| @@ -84,8 +84,10 @@ common: | |||||||
|   my-token-regenerated: "Dein Token wurde generiert. Du wirst jetzt abgemeldet." |   my-token-regenerated: "Dein Token wurde generiert. Du wirst jetzt abgemeldet." | ||||||
|   i-like-sushi: "私は(プリンよりむしろ)寿司が好き" |   i-like-sushi: "私は(プリンよりむしろ)寿司が好き" | ||||||
|   show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示" |   show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示" | ||||||
|  |   use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける" | ||||||
|   verified-user: "公式アカウント" |   verified-user: "公式アカウント" | ||||||
|   disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" |   disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" | ||||||
|  |   do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' | ||||||
|   reversi: |   reversi: | ||||||
|     drawn: "引き分け" |     drawn: "引き分け" | ||||||
|     my-turn: "あなたのターンです" |     my-turn: "あなたのターンです" | ||||||
| @@ -259,6 +261,8 @@ common/views/components/nav.vue: | |||||||
|   develop: "Entwickler" |   develop: "Entwickler" | ||||||
|   feedback: "Feedback" |   feedback: "Feedback" | ||||||
| common/views/components/note-menu.vue: | common/views/components/note-menu.vue: | ||||||
|  |   detail: "詳細" | ||||||
|  |   copy-link: "リンクをコピー" | ||||||
|   favorite: "Diese Anmerkung favorisieren" |   favorite: "Diese Anmerkung favorisieren" | ||||||
|   pin: "An die Profilseite pinnen" |   pin: "An die Profilseite pinnen" | ||||||
|   delete: "Löschen" |   delete: "Löschen" | ||||||
| @@ -336,6 +340,9 @@ common/views/components/visibility-chooser.vue: | |||||||
|   specified: "Direkt" |   specified: "Direkt" | ||||||
|   specified-desc: "Poste nur für bestimmte Benutzer" |   specified-desc: "Poste nur für bestimmte Benutzer" | ||||||
|   private: "Privat" |   private: "Privat" | ||||||
|  | common/views/components/trends.vue: | ||||||
|  |   count: "{}人が投稿" | ||||||
|  |   empty: "トレンドなし" | ||||||
| common/views/widgets/broadcast.vue: | common/views/widgets/broadcast.vue: | ||||||
|   fetching: "Laden" |   fetching: "Laden" | ||||||
|   no-broadcasts: "Keine Broadcasts" |   no-broadcasts: "Keine Broadcasts" | ||||||
| @@ -359,8 +366,6 @@ common/views/widgets/posts-monitor.vue: | |||||||
|   toggle: "表示を切り替え" |   toggle: "表示を切り替え" | ||||||
| common/views/widgets/hashtags.vue: | common/views/widgets/hashtags.vue: | ||||||
|   title: "ハッシュタグ" |   title: "ハッシュタグ" | ||||||
|   count: "{}人が投稿" |  | ||||||
|   empty: "トレンドなし" |  | ||||||
| common/views/widgets/server.vue: | common/views/widgets/server.vue: | ||||||
|   title: "Serverinformationen" |   title: "Serverinformationen" | ||||||
|   toggle: "Sicht umschalten" |   toggle: "Sicht umschalten" | ||||||
| @@ -410,6 +415,7 @@ desktop: | |||||||
|   uploading-avatar: "新しいアバターをアップロードしています" |   uploading-avatar: "新しいアバターをアップロードしています" | ||||||
|   avatar-updated: "アバターを更新しました" |   avatar-updated: "アバターを更新しました" | ||||||
|   choose-avatar: "アバターにする画像を選択" |   choose-avatar: "アバターにする画像を選択" | ||||||
|  |   invalid-filetype: "この形式のファイルはサポートされていません" | ||||||
| desktop/views/components/activity.chart.vue: | desktop/views/components/activity.chart.vue: | ||||||
|   total: "Schwarz ... komplett" |   total: "Schwarz ... komplett" | ||||||
|   notes: "Blau ... Hinweise" |   notes: "Blau ... Hinweise" | ||||||
| @@ -423,6 +429,24 @@ desktop/views/components/calendar.vue: | |||||||
|   prev: "Vorheriger Monat" |   prev: "Vorheriger Monat" | ||||||
|   next: "Nächster Monat" |   next: "Nächster Monat" | ||||||
|   go: "Klicke zur Navigation" |   go: "Klicke zur Navigation" | ||||||
|  | desktop/views/components/charts.vue: | ||||||
|  |   title: "チャート" | ||||||
|  |   per-day: "1日ごと" | ||||||
|  |   per-hour: "1時間ごと" | ||||||
|  |   notes: "投稿" | ||||||
|  |   users: "ユーザー" | ||||||
|  |   drive: "ドライブ" | ||||||
|  |   charts: | ||||||
|  |     notes: "投稿の増減 (統合)" | ||||||
|  |     local-notes: "投稿の増減 (ローカル)" | ||||||
|  |     remote-notes: "投稿の増減 (リモート)" | ||||||
|  |     notes-total: "投稿の累計" | ||||||
|  |     users: "ユーザーの増減" | ||||||
|  |     users-total: "ユーザーの累計" | ||||||
|  |     drive: "ドライブ使用量の増減" | ||||||
|  |     drive-total: "ドライブ使用量の累計" | ||||||
|  |     drive-files: "ドライブのファイル数の増減" | ||||||
|  |     drive-files-total: "ドライブのファイル数の累計" | ||||||
| desktop/views/components/choose-file-from-drive-window.vue: | desktop/views/components/choose-file-from-drive-window.vue: | ||||||
|   choose-file: "Datei auswählen" |   choose-file: "Datei auswählen" | ||||||
|   upload: "Dateien von deinem PC hochladen" |   upload: "Dateien von deinem PC hochladen" | ||||||
| @@ -627,9 +651,11 @@ desktop/views/components/settings.vue: | |||||||
|   delete-wallpaper: "壁紙を削除" |   delete-wallpaper: "壁紙を削除" | ||||||
|   dark-mode: "Nacht Modus" |   dark-mode: "Nacht Modus" | ||||||
|   circle-icons: "Kreisförmige Icons" |   circle-icons: "Kreisförmige Icons" | ||||||
|  |   contrasted-acct: "ユーザー名にコントラストを付ける" | ||||||
|   gradient-window-header: "Übergang in Fensterköpfen" |   gradient-window-header: "Übergang in Fensterköpfen" | ||||||
|   post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" |   post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" | ||||||
|   suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" |   suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" | ||||||
|  |   show-clock-on-header: "右上に時計を表示する" | ||||||
|   show-reply-target: "Zeige Antworten" |   show-reply-target: "Zeige Antworten" | ||||||
|   show-my-renotes: "Zeige meine Reposts auf der Zeitleiste" |   show-my-renotes: "Zeige meine Reposts auf der Zeitleiste" | ||||||
|   show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" |   show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" | ||||||
| @@ -754,6 +780,7 @@ desktop/views/components/ui.header.account.vue: | |||||||
|   lists: "Listen" |   lists: "Listen" | ||||||
|   follow-requests: "フォロー申請" |   follow-requests: "フォロー申請" | ||||||
|   customize: "ホームのカスタマイズ" |   customize: "ホームのカスタマイズ" | ||||||
|  |   admin: "管理" | ||||||
|   settings: "Einstellungen" |   settings: "Einstellungen" | ||||||
|   signout: "Ausloggen" |   signout: "Ausloggen" | ||||||
|   dark: "Verdunkeln" |   dark: "Verdunkeln" | ||||||
| @@ -799,8 +826,8 @@ desktop/views/pages/admin/admin.dashboard.vue: | |||||||
|   dashboard: "ダッシュボード" |   dashboard: "ダッシュボード" | ||||||
|   all-users: "全てのユーザー" |   all-users: "全てのユーザー" | ||||||
|   original-users: "このインスタンスのユーザー" |   original-users: "このインスタンスのユーザー" | ||||||
|   all-notes: "全てのノート" |   all-notes: "全ての投稿" | ||||||
|   original-notes: "このインスタンスのノート" |   original-notes: "このインスタンスの投稿" | ||||||
|   invite: "招待" |   invite: "招待" | ||||||
| desktop/views/pages/admin/admin.suspend-user.vue: | desktop/views/pages/admin/admin.suspend-user.vue: | ||||||
|   suspend-user: "ユーザーの凍結" |   suspend-user: "ユーザーの凍結" | ||||||
| @@ -818,18 +845,6 @@ desktop/views/pages/admin/admin.unverify-user.vue: | |||||||
|   unverify-user: "ユーザーの公式アカウント解除" |   unverify-user: "ユーザーの公式アカウント解除" | ||||||
|   unverify: "公式アカウントを解除する" |   unverify: "公式アカウントを解除する" | ||||||
|   unverified: "公式アカウントを解除しました" |   unverified: "公式アカウントを解除しました" | ||||||
| desktop/views/pages/admin/admin.notes-chart.vue: |  | ||||||
|   title: "投稿" |  | ||||||
|   local: "ローカル" |  | ||||||
|   remote: "リモート" |  | ||||||
| desktop/views/pages/admin/admin.users-chart.vue: |  | ||||||
|   title: "ユーザー" |  | ||||||
|   local: "ローカル" |  | ||||||
|   remote: "リモート" |  | ||||||
| desktop/views/pages/admin/admin.drive-chart.vue: |  | ||||||
|   title: "ドライブ" |  | ||||||
|   local: "ローカル" |  | ||||||
|   remote: "リモート" |  | ||||||
| desktop/views/pages/deck/deck.tl-column.vue: | desktop/views/pages/deck/deck.tl-column.vue: | ||||||
|   is-media-only: "メディア投稿のみ" |   is-media-only: "メディア投稿のみ" | ||||||
|   is-media-view: "メディアビュー" |   is-media-view: "メディアビュー" | ||||||
| @@ -838,6 +853,11 @@ desktop/views/pages/deck/deck.note.vue: | |||||||
|   reposted-by: "{}がRenote" |   reposted-by: "{}がRenote" | ||||||
|   private: "この投稿は非公開です" |   private: "この投稿は非公開です" | ||||||
|   deleted: "この投稿は削除されました" |   deleted: "この投稿は削除されました" | ||||||
|  | desktop/views/pages/stats/stats.vue: | ||||||
|  |   all-users: "全てのユーザー" | ||||||
|  |   original-users: "このインスタンスのユーザー" | ||||||
|  |   all-notes: "全ての投稿" | ||||||
|  |   original-notes: "このインスタンスの投稿" | ||||||
| desktop/views/pages/welcome.vue: | desktop/views/pages/welcome.vue: | ||||||
|   about: "詳しく..." |   about: "詳しく..." | ||||||
|   gotit: "わかった" |   gotit: "わかった" | ||||||
| @@ -846,7 +866,10 @@ desktop/views/pages/welcome.vue: | |||||||
|   signin-button: "やってる" |   signin-button: "やってる" | ||||||
|   signup-button: "やる" |   signup-button: "やる" | ||||||
|   timeline: "タイムライン" |   timeline: "タイムライン" | ||||||
|  |   announcements: "お知らせ" | ||||||
|  |   photos: "最近の画像" | ||||||
|   powered-by-misskey: "Powered by <b>Misskey</b>." |   powered-by-misskey: "Powered by <b>Misskey</b>." | ||||||
|  |   info: "情報" | ||||||
| desktop/views/pages/drive.vue: | desktop/views/pages/drive.vue: | ||||||
|   title: "Misskey Drive" |   title: "Misskey Drive" | ||||||
| desktop/views/pages/favorites.vue: | desktop/views/pages/favorites.vue: | ||||||
| @@ -1044,6 +1067,7 @@ mobile/views/components/ui.nav.vue: | |||||||
|   game: "ゲーム" |   game: "ゲーム" | ||||||
|   darkmode: "ダークモード" |   darkmode: "ダークモード" | ||||||
|   settings: "設定" |   settings: "設定" | ||||||
|  |   admin: "管理" | ||||||
|   about: "Misskeyについて" |   about: "Misskeyについて" | ||||||
| mobile/views/components/user-timeline.vue: | mobile/views/components/user-timeline.vue: | ||||||
|   no-notes: "このユーザーは投稿していないようです。" |   no-notes: "このユーザーは投稿していないようです。" | ||||||
| @@ -1133,6 +1157,7 @@ mobile/views/pages/settings.vue: | |||||||
|   dark-mode: "ダークモード" |   dark-mode: "ダークモード" | ||||||
|   i-am-under-limited-internet: "私は通信を制限されている" |   i-am-under-limited-internet: "私は通信を制限されている" | ||||||
|   circle-icons: "円形のアイコンを使用" |   circle-icons: "円形のアイコンを使用" | ||||||
|  |   contrasted-acct: "ユーザー名にコントラストを付ける" | ||||||
|   timeline: "タイムライン" |   timeline: "タイムライン" | ||||||
|   show-reply-target: "リプライ先を表示する" |   show-reply-target: "リプライ先を表示する" | ||||||
|   show-my-renotes: "自分の行ったRenoteを表示する" |   show-my-renotes: "自分の行ったRenoteを表示する" | ||||||
| @@ -1141,6 +1166,9 @@ mobile/views/pages/settings.vue: | |||||||
|   post-style: "投稿の表示スタイル" |   post-style: "投稿の表示スタイル" | ||||||
|   post-style-standard: "標準" |   post-style-standard: "標準" | ||||||
|   post-style-smart: "スマート" |   post-style-smart: "スマート" | ||||||
|  |   notification-position: "通知の表示" | ||||||
|  |   notification-position-bottom: "下" | ||||||
|  |   notification-position-top: "上" | ||||||
|   behavior: "動作" |   behavior: "動作" | ||||||
|   fetch-on-scroll: "スクロールで自動読み込み" |   fetch-on-scroll: "スクロールで自動読み込み" | ||||||
|   disable-via-mobile: "「モバイルからの投稿」フラグを付けない" |   disable-via-mobile: "「モバイルからの投稿」フラグを付けない" | ||||||
| @@ -1161,6 +1189,8 @@ mobile/views/pages/settings.vue: | |||||||
|   update-available-desc: "ページを再度読み込みすると更新が適用されます。" |   update-available-desc: "ページを再度読み込みすると更新が適用されます。" | ||||||
|   settings: "設定" |   settings: "設定" | ||||||
|   signout: "サインアウト" |   signout: "サインアウト" | ||||||
|  |   sound: "サウンド" | ||||||
|  |   enable-sounds: "サウンドを有効にする" | ||||||
| mobile/views/pages/user.vue: | mobile/views/pages/user.vue: | ||||||
|   follows-you: "フォローされています" |   follows-you: "フォローされています" | ||||||
|   following: "フォロー" |   following: "フォロー" | ||||||
| @@ -84,8 +84,10 @@ common: | |||||||
|   my-token-regenerated: "Your token has been regenerated, so you will be signed out." |   my-token-regenerated: "Your token has been regenerated, so you will be signed out." | ||||||
|   i-like-sushi: "I prefer sushi rather than pudding" |   i-like-sushi: "I prefer sushi rather than pudding" | ||||||
|   show-reversi-board-labels: "Show row and column labels in Reversi" |   show-reversi-board-labels: "Show row and column labels in Reversi" | ||||||
|  |   use-contrast-reversi-stones: "Make the stone color clear in reversi" | ||||||
|   verified-user: "Verified account" |   verified-user: "Verified account" | ||||||
|   disable-animated-mfm: "Disable animated texts in a post" |   disable-animated-mfm: "Disable animated texts in a post" | ||||||
|  |   do-not-use-in-production: 'As this is for development, do not use this in production.' | ||||||
|   reversi: |   reversi: | ||||||
|     drawn: "Draw" |     drawn: "Draw" | ||||||
|     my-turn: "Your turn" |     my-turn: "Your turn" | ||||||
| @@ -259,6 +261,8 @@ common/views/components/nav.vue: | |||||||
|   develop: "Developers" |   develop: "Developers" | ||||||
|   feedback: "Feedback" |   feedback: "Feedback" | ||||||
| common/views/components/note-menu.vue: | common/views/components/note-menu.vue: | ||||||
|  |   detail: "Details" | ||||||
|  |   copy-link: "Copy link" | ||||||
|   favorite: "Favorite this note" |   favorite: "Favorite this note" | ||||||
|   pin: "Pin to your profile" |   pin: "Pin to your profile" | ||||||
|   delete: "Delete" |   delete: "Delete" | ||||||
| @@ -336,6 +340,9 @@ common/views/components/visibility-chooser.vue: | |||||||
|   specified: "Direct" |   specified: "Direct" | ||||||
|   specified-desc: "Post to specified users only" |   specified-desc: "Post to specified users only" | ||||||
|   private: "Private" |   private: "Private" | ||||||
|  | common/views/components/trends.vue: | ||||||
|  |   count: "{} users mentioned" | ||||||
|  |   empty: "No popular hashtag trends" | ||||||
| common/views/widgets/broadcast.vue: | common/views/widgets/broadcast.vue: | ||||||
|   fetching: "Fetching" |   fetching: "Fetching" | ||||||
|   no-broadcasts: "No announcements" |   no-broadcasts: "No announcements" | ||||||
| @@ -359,8 +366,6 @@ common/views/widgets/posts-monitor.vue: | |||||||
|   toggle: "Toggle views" |   toggle: "Toggle views" | ||||||
| common/views/widgets/hashtags.vue: | common/views/widgets/hashtags.vue: | ||||||
|   title: "Hashtags" |   title: "Hashtags" | ||||||
|   count: "{} users mentioned" |  | ||||||
|   empty: "No popular hashtag trends" |  | ||||||
| common/views/widgets/server.vue: | common/views/widgets/server.vue: | ||||||
|   title: "Server info" |   title: "Server info" | ||||||
|   toggle: "Toggle views" |   toggle: "Toggle views" | ||||||
| @@ -410,6 +415,7 @@ desktop: | |||||||
|   uploading-avatar: "Uploading a new avatar" |   uploading-avatar: "Uploading a new avatar" | ||||||
|   avatar-updated: "Successfully updated the avatar" |   avatar-updated: "Successfully updated the avatar" | ||||||
|   choose-avatar: "Select an image for the avatar" |   choose-avatar: "Select an image for the avatar" | ||||||
|  |   invalid-filetype: "This filetype is not acceptable here" | ||||||
| desktop/views/components/activity.chart.vue: | desktop/views/components/activity.chart.vue: | ||||||
|   total: "Black ... Total" |   total: "Black ... Total" | ||||||
|   notes: "Blue ... Notes" |   notes: "Blue ... Notes" | ||||||
| @@ -423,6 +429,24 @@ desktop/views/components/calendar.vue: | |||||||
|   prev: "Previous month" |   prev: "Previous month" | ||||||
|   next: "Next month" |   next: "Next month" | ||||||
|   go: "Click to navigate" |   go: "Click to navigate" | ||||||
|  | desktop/views/components/charts.vue: | ||||||
|  |   title: "Charts" | ||||||
|  |   per-day: "per Day" | ||||||
|  |   per-hour: "per Hour" | ||||||
|  |   notes: "Posts" | ||||||
|  |   users: "Users" | ||||||
|  |   drive: "Drive" | ||||||
|  |   charts: | ||||||
|  |     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)" | ||||||
|  |     notes-total: "The number of posts: cumulative total" | ||||||
|  |     users: "The number of users: increase/decrease" | ||||||
|  |     users-total: "The number of users: cumulative total" | ||||||
|  |     drive: "Capacity used as the storage: increase/decrease" | ||||||
|  |     drive-total: "Capacity used as the storage: cumulative total" | ||||||
|  |     drive-files: "The number of files on the storage: increase/decrease" | ||||||
|  |     drive-files-total: "The number of files on the storage: cumulative total" | ||||||
| desktop/views/components/choose-file-from-drive-window.vue: | desktop/views/components/choose-file-from-drive-window.vue: | ||||||
|   choose-file: "Choose files" |   choose-file: "Choose files" | ||||||
|   upload: "Upload files from your device" |   upload: "Upload files from your device" | ||||||
| @@ -627,9 +651,11 @@ desktop/views/components/settings.vue: | |||||||
|   delete-wallpaper: "Remove background" |   delete-wallpaper: "Remove background" | ||||||
|   dark-mode: "Dark Mode" |   dark-mode: "Dark Mode" | ||||||
|   circle-icons: "Use circle icons" |   circle-icons: "Use circle icons" | ||||||
|  |   contrasted-acct: "Add contrast to username" | ||||||
|   gradient-window-header: "Use gradients on window headers" |   gradient-window-header: "Use gradients on window headers" | ||||||
|   post-form-on-timeline: "Display post form at the top of the timeline" |   post-form-on-timeline: "Display post form at the top of the timeline" | ||||||
|   suggest-recent-hashtags: "Show recent popular hashtags on the post form" |   suggest-recent-hashtags: "Show recent popular hashtags on the post form" | ||||||
|  |   show-clock-on-header: "Show clock on upper-right" | ||||||
|   show-reply-target: "Display reply target" |   show-reply-target: "Display reply target" | ||||||
|   show-my-renotes: "Show my renotes in the 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 my posts in timelines" | ||||||
| @@ -754,6 +780,7 @@ desktop/views/components/ui.header.account.vue: | |||||||
|   lists: "Lists" |   lists: "Lists" | ||||||
|   follow-requests: "Follow requests" |   follow-requests: "Follow requests" | ||||||
|   customize: "Customize home layout" |   customize: "Customize home layout" | ||||||
|  |   admin: "Admin" | ||||||
|   settings: "Settings" |   settings: "Settings" | ||||||
|   signout: "Sign out" |   signout: "Sign out" | ||||||
|   dark: "Submerge in dark" |   dark: "Submerge in dark" | ||||||
| @@ -799,7 +826,7 @@ desktop/views/pages/admin/admin.dashboard.vue: | |||||||
|   dashboard: "Dashboard" |   dashboard: "Dashboard" | ||||||
|   all-users: "All Users" |   all-users: "All Users" | ||||||
|   original-users: "Users on this instance" |   original-users: "Users on this instance" | ||||||
|   all-notes: "All Posts" |   all-notes: "All the posts" | ||||||
|   original-notes: "Posts on this instance" |   original-notes: "Posts on this instance" | ||||||
|   invite: "Invite" |   invite: "Invite" | ||||||
| desktop/views/pages/admin/admin.suspend-user.vue: | desktop/views/pages/admin/admin.suspend-user.vue: | ||||||
| @@ -818,18 +845,6 @@ desktop/views/pages/admin/admin.unverify-user.vue: | |||||||
|   unverify-user: "User account unverification settings" |   unverify-user: "User account unverification settings" | ||||||
|   unverify: "Unverify account" |   unverify: "Unverify account" | ||||||
|   unverified: "The account is now being unverified" |   unverified: "The account is now being unverified" | ||||||
| desktop/views/pages/admin/admin.notes-chart.vue: |  | ||||||
|   title: "Posts" |  | ||||||
|   local: "Local" |  | ||||||
|   remote: "Remote" |  | ||||||
| desktop/views/pages/admin/admin.users-chart.vue: |  | ||||||
|   title: "Users" |  | ||||||
|   local: "Local" |  | ||||||
|   remote: "Remote" |  | ||||||
| desktop/views/pages/admin/admin.drive-chart.vue: |  | ||||||
|   title: "Drive" |  | ||||||
|   local: "Local" |  | ||||||
|   remote: "Remote" |  | ||||||
| desktop/views/pages/deck/deck.tl-column.vue: | desktop/views/pages/deck/deck.tl-column.vue: | ||||||
|   is-media-only: "Only media posts" |   is-media-only: "Only media posts" | ||||||
|   is-media-view: "Media view" |   is-media-view: "Media view" | ||||||
| @@ -838,6 +853,11 @@ desktop/views/pages/deck/deck.note.vue: | |||||||
|   reposted-by: "Reposted by {}" |   reposted-by: "Reposted by {}" | ||||||
|   private: "This post is private" |   private: "This post is private" | ||||||
|   deleted: "This post has been deleted" |   deleted: "This post has been deleted" | ||||||
|  | desktop/views/pages/stats/stats.vue: | ||||||
|  |   all-users: "All Users" | ||||||
|  |   original-users: "Users on this instance" | ||||||
|  |   all-notes: "All the posts" | ||||||
|  |   original-notes: "Posts on this instance" | ||||||
| desktop/views/pages/welcome.vue: | desktop/views/pages/welcome.vue: | ||||||
|   about: "More details..." |   about: "More details..." | ||||||
|   gotit: "Got it!" |   gotit: "Got it!" | ||||||
| @@ -846,7 +866,10 @@ desktop/views/pages/welcome.vue: | |||||||
|   signin-button: "Logging in..." |   signin-button: "Logging in..." | ||||||
|   signup-button: "Sign up" |   signup-button: "Sign up" | ||||||
|   timeline: "Timeline" |   timeline: "Timeline" | ||||||
|  |   announcements: "Announcements" | ||||||
|  |   photos: "Recent uploaded" | ||||||
|   powered-by-misskey: "Powered by <b>Misskey</b>." |   powered-by-misskey: "Powered by <b>Misskey</b>." | ||||||
|  |   info: "Information" | ||||||
| desktop/views/pages/drive.vue: | desktop/views/pages/drive.vue: | ||||||
|   title: "Misskey storage" |   title: "Misskey storage" | ||||||
| desktop/views/pages/favorites.vue: | desktop/views/pages/favorites.vue: | ||||||
| @@ -1044,6 +1067,7 @@ mobile/views/components/ui.nav.vue: | |||||||
|   game: "Games" |   game: "Games" | ||||||
|   darkmode: "Dark theme" |   darkmode: "Dark theme" | ||||||
|   settings: "Settings" |   settings: "Settings" | ||||||
|  |   admin: "Admin" | ||||||
|   about: "About Misskey" |   about: "About Misskey" | ||||||
| mobile/views/components/user-timeline.vue: | mobile/views/components/user-timeline.vue: | ||||||
|   no-notes: "It seems this user hasn't posted anything yet." |   no-notes: "It seems this user hasn't posted anything yet." | ||||||
| @@ -1057,7 +1081,7 @@ mobile/views/pages/favorites.vue: | |||||||
|   title: "Favorites" |   title: "Favorites" | ||||||
| mobile/views/pages/user-lists.vue: | mobile/views/pages/user-lists.vue: | ||||||
|   title: "Lists" |   title: "Lists" | ||||||
|   enter-list-name: "Enter list name" |   enter-list-name: "Enter a name of the list to make" | ||||||
| mobile/views/pages/drive.vue: | mobile/views/pages/drive.vue: | ||||||
|   drive: "Drive" |   drive: "Drive" | ||||||
|   more: "Load more" |   more: "Load more" | ||||||
| @@ -1133,6 +1157,7 @@ mobile/views/pages/settings.vue: | |||||||
|   dark-mode: "Dark Mode" |   dark-mode: "Dark Mode" | ||||||
|   i-am-under-limited-internet: "I'm in limited bandwidth" |   i-am-under-limited-internet: "I'm in limited bandwidth" | ||||||
|   circle-icons: "Use circle icons" |   circle-icons: "Use circle icons" | ||||||
|  |   contrasted-acct: "Add contrast to username" | ||||||
|   timeline: "Timeline" |   timeline: "Timeline" | ||||||
|   show-reply-target: "Show reply target" |   show-reply-target: "Show reply target" | ||||||
|   show-my-renotes: "Show my reposts" |   show-my-renotes: "Show my reposts" | ||||||
| @@ -1141,6 +1166,9 @@ mobile/views/pages/settings.vue: | |||||||
|   post-style: "Post design" |   post-style: "Post design" | ||||||
|   post-style-standard: "Standard" |   post-style-standard: "Standard" | ||||||
|   post-style-smart: "Smart" |   post-style-smart: "Smart" | ||||||
|  |   notification-position: "Notification style" | ||||||
|  |   notification-position-bottom: "Bottom" | ||||||
|  |   notification-position-top: "Top" | ||||||
|   behavior: "Behavior" |   behavior: "Behavior" | ||||||
|   fetch-on-scroll: "Endless loading on scroll" |   fetch-on-scroll: "Endless loading on scroll" | ||||||
|   disable-via-mobile: "Don't mark the post as 'from mobile'" |   disable-via-mobile: "Don't mark the post as 'from mobile'" | ||||||
| @@ -1161,6 +1189,8 @@ mobile/views/pages/settings.vue: | |||||||
|   update-available-desc: "Updates will be applied after reloading the page" |   update-available-desc: "Updates will be applied after reloading the page" | ||||||
|   settings: "Settings" |   settings: "Settings" | ||||||
|   signout: "Sign out" |   signout: "Sign out" | ||||||
|  |   sound: "Sounds" | ||||||
|  |   enable-sounds: "Enable sounds" | ||||||
| mobile/views/pages/user.vue: | mobile/views/pages/user.vue: | ||||||
|   follows-you: "Follows you" |   follows-you: "Follows you" | ||||||
|   following: "Following" |   following: "Following" | ||||||
| @@ -11,7 +11,7 @@ common: | |||||||
|     warning: "<strong>Misskey no tiene anuncios publicitarios.</strong> Sin embargo, algunas características podrían no estar disponibles si el bloqueador de publicidad está habilitado." |     warning: "<strong>Misskey no tiene anuncios publicitarios.</strong> Sin embargo, algunas características podrían no estar disponibles si el bloqueador de publicidad está habilitado." | ||||||
|   application-authorization: "Autorizaciones de la aplicación." |   application-authorization: "Autorizaciones de la aplicación." | ||||||
|   close: "Cerrar" |   close: "Cerrar" | ||||||
|   do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。" |   do-not-copy-paste: "Por favor no copies código aquí. Tu cuenta puede resultar comprometida." | ||||||
|   got-it: "¡Listo!" |   got-it: "¡Listo!" | ||||||
|   customization-tips: |   customization-tips: | ||||||
|     title: "Consejos de personalización" |     title: "Consejos de personalización" | ||||||
| @@ -58,7 +58,7 @@ common: | |||||||
|     friday: "Viernes" |     friday: "Viernes" | ||||||
|     saturday: "Sábado" |     saturday: "Sábado" | ||||||
|   reactions: |   reactions: | ||||||
|     like: "me gusta" |     like: "Me gusta" | ||||||
|     love: "amor" |     love: "amor" | ||||||
|     laugh: "risa" |     laugh: "risa" | ||||||
|     hmm: "hmm" |     hmm: "hmm" | ||||||
| @@ -84,8 +84,10 @@ common: | |||||||
|   my-token-regenerated: "Tu token se ha regenerado vas a ser desconectado." |   my-token-regenerated: "Tu token se ha regenerado vas a ser desconectado." | ||||||
|   i-like-sushi: "Prefiero sushi a pudín" |   i-like-sushi: "Prefiero sushi a pudín" | ||||||
|   show-reversi-board-labels: "Mostrar etiquetas de filas y columnas en Reversi" |   show-reversi-board-labels: "Mostrar etiquetas de filas y columnas en Reversi" | ||||||
|   verified-user: "公式アカウント" |   use-contrast-reversi-stones: "Hacer el color de la piedra claro en Reversi" | ||||||
|  |   verified-user: "Cuenta verificada" | ||||||
|   disable-animated-mfm: "Desactivar texto animado en una publicación" |   disable-animated-mfm: "Desactivar texto animado en una publicación" | ||||||
|  |   do-not-use-in-production: 'Esto está en desarrollo, no usarlo para producción.' | ||||||
|   reversi: |   reversi: | ||||||
|     drawn: "Empatado" |     drawn: "Empatado" | ||||||
|     my-turn: "Mi turno" |     my-turn: "Mi turno" | ||||||
| @@ -169,9 +171,9 @@ common/views/components/games/reversi/reversi.vue: | |||||||
| common/views/components/games/reversi/reversi.game.vue: | common/views/components/games/reversi/reversi.game.vue: | ||||||
|   surrender: "Rendirse" |   surrender: "Rendirse" | ||||||
|   surrendered: "Por rendirse" |   surrendered: "Por rendirse" | ||||||
|   is-llotheo: "石の少ない方が勝ち(ロセオ)" |   is-llotheo: "El último gana (Llotheo)" | ||||||
|   looped-map: "ループマップ" |   looped-map: "Mapa en bucle" | ||||||
|   can-put-everywhere: "どこでも置けるモード" |   can-put-everywhere: "Puedes colocar donde quieras" | ||||||
| common/views/components/games/reversi/reversi.index.vue: | common/views/components/games/reversi/reversi.index.vue: | ||||||
|   title: "Misskey Reversi" |   title: "Misskey Reversi" | ||||||
|   sub-title: "¡Juega Reversi con tus amigos!" |   sub-title: "¡Juega Reversi con tus amigos!" | ||||||
| @@ -259,6 +261,8 @@ common/views/components/nav.vue: | |||||||
|   develop: "Desarrolladores" |   develop: "Desarrolladores" | ||||||
|   feedback: "Opiniones" |   feedback: "Opiniones" | ||||||
| common/views/components/note-menu.vue: | common/views/components/note-menu.vue: | ||||||
|  |   detail: "Detalles" | ||||||
|  |   copy-link: "Copiar enlace" | ||||||
|   favorite: "Me gusta esta nota" |   favorite: "Me gusta esta nota" | ||||||
|   pin: "Fijar en el perfil" |   pin: "Fijar en el perfil" | ||||||
|   delete: "Borrar" |   delete: "Borrar" | ||||||
| @@ -287,10 +291,10 @@ common/views/components/signin.vue: | |||||||
|   signin: "Entra" |   signin: "Entra" | ||||||
|   or: "O" |   or: "O" | ||||||
|   signin-with-twitter: "Ingresar con Twitter" |   signin-with-twitter: "Ingresar con Twitter" | ||||||
|   login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。" |   login-failed: "Autenticación fallida. Asegúrate de haber usado el nombre de usuario y contraseña correctos." | ||||||
| common/views/components/signup.vue: | common/views/components/signup.vue: | ||||||
|   invitation-code: "招待コード" |   invitation-code: "Código de invitación" | ||||||
|   invitation-info: "招待コードをお持ちでない方は、<a href=\"{}\">管理者</a>までご連絡ください。" |   invitation-info: "Si no tienes un código de invitación, por favor contacta un <a href=\"{}\">administrador</a>." | ||||||
|   username: "Usuario" |   username: "Usuario" | ||||||
|   checking: "Comprobando..." |   checking: "Comprobando..." | ||||||
|   available: "Disponible" |   available: "Disponible" | ||||||
| @@ -336,6 +340,9 @@ common/views/components/visibility-chooser.vue: | |||||||
|   specified: "Directo" |   specified: "Directo" | ||||||
|   specified-desc: "Publica solo para los seguidores que quieras" |   specified-desc: "Publica solo para los seguidores que quieras" | ||||||
|   private: "Privada" |   private: "Privada" | ||||||
|  | common/views/components/trends.vue: | ||||||
|  |   count: "{}人が投稿" | ||||||
|  |   empty: "トレンドなし" | ||||||
| common/views/widgets/broadcast.vue: | common/views/widgets/broadcast.vue: | ||||||
|   fetching: "Recuperando" |   fetching: "Recuperando" | ||||||
|   no-broadcasts: "Sin emisión" |   no-broadcasts: "Sin emisión" | ||||||
| @@ -359,8 +366,6 @@ common/views/widgets/posts-monitor.vue: | |||||||
|   toggle: "Alternar vistas" |   toggle: "Alternar vistas" | ||||||
| common/views/widgets/hashtags.vue: | common/views/widgets/hashtags.vue: | ||||||
|   title: "Etiquetas" |   title: "Etiquetas" | ||||||
|   count: "{} usuarios mencionados" |  | ||||||
|   empty: "Ninguna tendencia popular ahora" |  | ||||||
| common/views/widgets/server.vue: | common/views/widgets/server.vue: | ||||||
|   title: "Información del servidor" |   title: "Información del servidor" | ||||||
|   toggle: "Alternar vistas" |   toggle: "Alternar vistas" | ||||||
| @@ -410,6 +415,7 @@ desktop: | |||||||
|   uploading-avatar: "Cargando un nuevo avatar" |   uploading-avatar: "Cargando un nuevo avatar" | ||||||
|   avatar-updated: "Avatar actualizado" |   avatar-updated: "Avatar actualizado" | ||||||
|   choose-avatar: "Escoge una imagen de avatar" |   choose-avatar: "Escoge una imagen de avatar" | ||||||
|  |   invalid-filetype: "Este tipo de archivo no es compatible aquí" | ||||||
| desktop/views/components/activity.chart.vue: | desktop/views/components/activity.chart.vue: | ||||||
|   total: "Negro ... Total" |   total: "Negro ... Total" | ||||||
|   notes: "Azul ... Notas" |   notes: "Azul ... Notas" | ||||||
| @@ -423,6 +429,24 @@ desktop/views/components/calendar.vue: | |||||||
|   prev: "Mes anterior" |   prev: "Mes anterior" | ||||||
|   next: "Próximo mes" |   next: "Próximo mes" | ||||||
|   go: "Click para navegar" |   go: "Click para navegar" | ||||||
|  | desktop/views/components/charts.vue: | ||||||
|  |   title: "Gráficos" | ||||||
|  |   per-day: "por día" | ||||||
|  |   per-hour: "por hora" | ||||||
|  |   notes: "Publicaciones" | ||||||
|  |   users: "Usuarios" | ||||||
|  |   drive: "Unidad" | ||||||
|  |   charts: | ||||||
|  |     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)" | ||||||
|  |     notes-total: "Número de publicaciones: Acumulativo total" | ||||||
|  |     users: "Número de usuarios: aumentar/disminuir" | ||||||
|  |     users-total: "Número de usuarios: Acumulativo total" | ||||||
|  |     drive: "Capacidad de almacenamiento usada: aumentar/disminuir" | ||||||
|  |     drive-total: "Capacidad de almacenamiento usada: Acumulativa total" | ||||||
|  |     drive-files: "Número de archivos almacenados: aumentar/disminuir" | ||||||
|  |     drive-files-total: "Número de archivos almacenados: Acumulativo total" | ||||||
| desktop/views/components/choose-file-from-drive-window.vue: | desktop/views/components/choose-file-from-drive-window.vue: | ||||||
|   choose-file: "Escoger archivos" |   choose-file: "Escoger archivos" | ||||||
|   upload: "Cargar archivos de tu dispositivo" |   upload: "Cargar archivos de tu dispositivo" | ||||||
| @@ -443,7 +467,7 @@ desktop/views/components/drive-window.vue: | |||||||
| desktop/views/components/drive.file.vue: | desktop/views/components/drive.file.vue: | ||||||
|   avatar: "Avatar" |   avatar: "Avatar" | ||||||
|   banner: "Banner" |   banner: "Banner" | ||||||
|   nsfw: "閲覧注意" |   nsfw: "Ver más" | ||||||
|   contextmenu: |   contextmenu: | ||||||
|     rename: "Renombrar" |     rename: "Renombrar" | ||||||
|     mark-as-sensitive: "Marcar como 'sensible'" |     mark-as-sensitive: "Marcar como 'sensible'" | ||||||
| @@ -495,31 +519,31 @@ desktop/views/components/media-image.vue: | |||||||
|   sensitive: "El contenido es NSFW (no seguro para ver en el trabajo, 'not safe for work')" |   sensitive: "El contenido es NSFW (no seguro para ver en el trabajo, 'not safe for work')" | ||||||
|   click-to-show: "Click para mostrar" |   click-to-show: "Click para mostrar" | ||||||
| desktop/views/components/media-video.vue: | desktop/views/components/media-video.vue: | ||||||
|   sensitive: "閲覧注意" |   sensitive: "Este contenido no es apropiado para ver en el trabajo" | ||||||
|   click-to-show: "クリックして表示" |   click-to-show: "Click para mostrar" | ||||||
| desktop/views/components/follow-button.vue: | desktop/views/components/follow-button.vue: | ||||||
|   following: "Siguiendo" |   following: "Siguiendo" | ||||||
|   follow: "Sigue" |   follow: "Sigue" | ||||||
|   request-pending: "Pendiente de aprobación" |   request-pending: "Pendiente de aprobación" | ||||||
|   follow-request: "フォロー申請" |   follow-request: "Solicitud de seguir" | ||||||
| desktop/views/components/followers-window.vue: | desktop/views/components/followers-window.vue: | ||||||
|   followers: "{} のフォロワー" |   followers: "{} seguidores" | ||||||
| desktop/views/components/followers.vue: | desktop/views/components/followers.vue: | ||||||
|   empty: "フォロワーはいないようです。" |   empty: "Parece que no tienes seguidores aún." | ||||||
| desktop/views/components/following-window.vue: | desktop/views/components/following-window.vue: | ||||||
|   following: "{} のフォロー" |   following: "Siguiendo {}" | ||||||
| desktop/views/components/following.vue: | desktop/views/components/following.vue: | ||||||
|   empty: "フォロー中のユーザーはいないようです。" |   empty: "Parece que aún no sigues a nadie." | ||||||
| desktop/views/components/friends-maker.vue: | desktop/views/components/friends-maker.vue: | ||||||
|   title: "気になるユーザーをフォロー:" |   title: "Usuarios recomendados:" | ||||||
|   empty: "おすすめのユーザーは見つかりませんでした。" |   empty: "No se pudieron encontrar usuarios para recomendar" | ||||||
|   fetching: "読み込んでいます" |   fetching: "Cargando" | ||||||
|   refresh: "もっと見る" |   refresh: "Más" | ||||||
|   close: "閉じる" |   close: "Cerrar" | ||||||
| desktop/views/components/game-window.vue: | desktop/views/components/game-window.vue: | ||||||
|   game: "リバーシ" |   game: "Reversi" | ||||||
| desktop/views/components/home.vue: | desktop/views/components/home.vue: | ||||||
|   done: "完了" |   done: "Listo" | ||||||
|   add-widget: "Agregar accesorio:" |   add-widget: "Agregar accesorio:" | ||||||
|   add: "Agregar" |   add: "Agregar" | ||||||
| desktop/views/input-dialog.vue: | desktop/views/input-dialog.vue: | ||||||
| @@ -545,8 +569,8 @@ desktop/views/components/notes.note.vue: | |||||||
|   detail: "Mostrar detalles" |   detail: "Mostrar detalles" | ||||||
|   private: "Esta publicación es privada" |   private: "Esta publicación es privada" | ||||||
|   deleted: "Esta publicación ha sido borrada" |   deleted: "Esta publicación ha sido borrada" | ||||||
|   hide: "隠す" |   hide: "Esconder" | ||||||
|   see-more: "もっと見る" |   see-more: "Ver más" | ||||||
| desktop/views/components/notes.vue: | desktop/views/components/notes.vue: | ||||||
|   error: "Error al cargar." |   error: "Error al cargar." | ||||||
|   retry: "Reintentar" |   retry: "Reintentar" | ||||||
| @@ -582,7 +606,7 @@ desktop/views/components/post-form.vue: | |||||||
|   geolocation-alert: "Tu dispositivo no tiene soporte de geolocalización." |   geolocation-alert: "Tu dispositivo no tiene soporte de geolocalización." | ||||||
|   error: "Error" |   error: "Error" | ||||||
|   enter-username: "Por favor escribe un nombre de usuario..." |   enter-username: "Por favor escribe un nombre de usuario..." | ||||||
|   annotations: "内容への注釈 (オプション)" |   annotations: "Anotaciones a la publicación (opcional)" | ||||||
| desktop/views/components/post-form-window.vue: | desktop/views/components/post-form-window.vue: | ||||||
|   note: "Nota nueva" |   note: "Nota nueva" | ||||||
|   reply: "Responder" |   reply: "Responder" | ||||||
| @@ -627,9 +651,11 @@ desktop/views/components/settings.vue: | |||||||
|   delete-wallpaper: "Suprimir fondo" |   delete-wallpaper: "Suprimir fondo" | ||||||
|   dark-mode: "Modo Nocturno" |   dark-mode: "Modo Nocturno" | ||||||
|   circle-icons: "Usar iconos circulares" |   circle-icons: "Usar iconos circulares" | ||||||
|  |   contrasted-acct: "ユーザー名にコントラストを付ける" | ||||||
|   gradient-window-header: "Usar degradados en las cabeceras de las páginas" |   gradient-window-header: "Usar degradados en las cabeceras de las páginas" | ||||||
|   post-form-on-timeline: "Mostrar el formulario de las entradas encima de la línea de tiempo" |   post-form-on-timeline: "Mostrar el formulario de las entradas encima de la línea de tiempo" | ||||||
|   suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" |   suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" | ||||||
|  |   show-clock-on-header: "右上に時計を表示する" | ||||||
|   show-reply-target: "リプライ先を表示する" |   show-reply-target: "リプライ先を表示する" | ||||||
|   show-my-renotes: "自分の行ったRenoteをタイムラインに表示する" |   show-my-renotes: "自分の行ったRenoteをタイムラインに表示する" | ||||||
|   show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" |   show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" | ||||||
| @@ -745,39 +771,40 @@ desktop/views/components/timeline.vue: | |||||||
|   global: "グローバル" |   global: "グローバル" | ||||||
|   list: "リスト" |   list: "リスト" | ||||||
| desktop/views/components/ui.header.vue: | desktop/views/components/ui.header.vue: | ||||||
|   welcome-back: "おかえりなさい、" |   welcome-back: "Bienvenido/a de vuelta," | ||||||
|   adjective: "さん" |   adjective: "-san" | ||||||
| desktop/views/components/ui.header.account.vue: | desktop/views/components/ui.header.account.vue: | ||||||
|   profile: "プロフィール" |   profile: "Tu perfil" | ||||||
|   drive: "ドライブ" |   drive: "Unidad" | ||||||
|   favorites: "お気に入り" |   favorites: "Favoritos" | ||||||
|   lists: "リスト" |   lists: "Listas" | ||||||
|   follow-requests: "フォロー申請" |   follow-requests: "Solicitudes de seguimiento" | ||||||
|   customize: "ホームのカスタマイズ" |   customize: "Personalizar la página de inicio" | ||||||
|   settings: "設定" |   admin: "Admin" | ||||||
|   signout: "サインアウト" |   settings: "Configuraciones" | ||||||
|   dark: "闇に飲まれる" |   signout: "Desconectarse" | ||||||
|  |   dark: "Sumergirse en la oscuridad" | ||||||
| desktop/views/components/ui.header.nav.vue: | desktop/views/components/ui.header.nav.vue: | ||||||
|   home: "ホーム" |   home: "Inicio" | ||||||
|   deck: "デッキ" |   deck: "Cubierta" | ||||||
|   messaging: "メッセージ" |   messaging: "Mensajes" | ||||||
|   game: "ゲーム" |   game: "Juegos" | ||||||
| desktop/views/components/ui.header.notifications.vue: | desktop/views/components/ui.header.notifications.vue: | ||||||
|   title: "通知" |   title: "Notificaciones" | ||||||
| desktop/views/components/ui.header.post.vue: | desktop/views/components/ui.header.post.vue: | ||||||
|   post: "新規投稿" |   post: "Crear una publicación" | ||||||
| desktop/views/components/ui.header.search.vue: | desktop/views/components/ui.header.search.vue: | ||||||
|   placeholder: "検索" |   placeholder: "Buscar" | ||||||
| desktop/views/components/received-follow-requests-window.vue: | desktop/views/components/received-follow-requests-window.vue: | ||||||
|   title: "フォロー申請" |   title: "Solicitudes de seguidores" | ||||||
|   accept: "承認" |   accept: "Aceptar" | ||||||
|   reject: "拒否" |   reject: "Rechazar" | ||||||
| desktop/views/components/user-lists-window.vue: | desktop/views/components/user-lists-window.vue: | ||||||
|   title: "リスト" |   title: "Listas de usuario" | ||||||
|   create-list: "リストを作成" |   create-list: "Crear lista" | ||||||
|   list-name: "リスト名" |   list-name: "Nombre de lista" | ||||||
| desktop/views/components/user-preview.vue: | desktop/views/components/user-preview.vue: | ||||||
|   notes: "投稿" |   notes: "Publicaciones" | ||||||
|   following: "フォロー" |   following: "フォロー" | ||||||
|   followers: "フォロワー" |   followers: "フォロワー" | ||||||
| desktop/views/components/users-list.vue: | desktop/views/components/users-list.vue: | ||||||
| @@ -799,8 +826,8 @@ desktop/views/pages/admin/admin.dashboard.vue: | |||||||
|   dashboard: "ダッシュボード" |   dashboard: "ダッシュボード" | ||||||
|   all-users: "全てのユーザー" |   all-users: "全てのユーザー" | ||||||
|   original-users: "このインスタンスのユーザー" |   original-users: "このインスタンスのユーザー" | ||||||
|   all-notes: "全てのノート" |   all-notes: "全ての投稿" | ||||||
|   original-notes: "このインスタンスのノート" |   original-notes: "このインスタンスの投稿" | ||||||
|   invite: "招待" |   invite: "招待" | ||||||
| desktop/views/pages/admin/admin.suspend-user.vue: | desktop/views/pages/admin/admin.suspend-user.vue: | ||||||
|   suspend-user: "ユーザーの凍結" |   suspend-user: "ユーザーの凍結" | ||||||
| @@ -818,18 +845,6 @@ desktop/views/pages/admin/admin.unverify-user.vue: | |||||||
|   unverify-user: "ユーザーの公式アカウント解除" |   unverify-user: "ユーザーの公式アカウント解除" | ||||||
|   unverify: "公式アカウントを解除する" |   unverify: "公式アカウントを解除する" | ||||||
|   unverified: "公式アカウントを解除しました" |   unverified: "公式アカウントを解除しました" | ||||||
| desktop/views/pages/admin/admin.notes-chart.vue: |  | ||||||
|   title: "投稿" |  | ||||||
|   local: "ローカル" |  | ||||||
|   remote: "リモート" |  | ||||||
| desktop/views/pages/admin/admin.users-chart.vue: |  | ||||||
|   title: "ユーザー" |  | ||||||
|   local: "ローカル" |  | ||||||
|   remote: "リモート" |  | ||||||
| desktop/views/pages/admin/admin.drive-chart.vue: |  | ||||||
|   title: "ドライブ" |  | ||||||
|   local: "ローカル" |  | ||||||
|   remote: "リモート" |  | ||||||
| desktop/views/pages/deck/deck.tl-column.vue: | desktop/views/pages/deck/deck.tl-column.vue: | ||||||
|   is-media-only: "メディア投稿のみ" |   is-media-only: "メディア投稿のみ" | ||||||
|   is-media-view: "メディアビュー" |   is-media-view: "メディアビュー" | ||||||
| @@ -838,6 +853,11 @@ desktop/views/pages/deck/deck.note.vue: | |||||||
|   reposted-by: "{}がRenote" |   reposted-by: "{}がRenote" | ||||||
|   private: "この投稿は非公開です" |   private: "この投稿は非公開です" | ||||||
|   deleted: "この投稿は削除されました" |   deleted: "この投稿は削除されました" | ||||||
|  | desktop/views/pages/stats/stats.vue: | ||||||
|  |   all-users: "全てのユーザー" | ||||||
|  |   original-users: "このインスタンスのユーザー" | ||||||
|  |   all-notes: "全ての投稿" | ||||||
|  |   original-notes: "このインスタンスの投稿" | ||||||
| desktop/views/pages/welcome.vue: | desktop/views/pages/welcome.vue: | ||||||
|   about: "詳しく..." |   about: "詳しく..." | ||||||
|   gotit: "わかった" |   gotit: "わかった" | ||||||
| @@ -846,7 +866,10 @@ desktop/views/pages/welcome.vue: | |||||||
|   signin-button: "やってる" |   signin-button: "やってる" | ||||||
|   signup-button: "やる" |   signup-button: "やる" | ||||||
|   timeline: "タイムライン" |   timeline: "タイムライン" | ||||||
|  |   announcements: "お知らせ" | ||||||
|  |   photos: "最近の画像" | ||||||
|   powered-by-misskey: "Powered by <b>Misskey</b>." |   powered-by-misskey: "Powered by <b>Misskey</b>." | ||||||
|  |   info: "情報" | ||||||
| desktop/views/pages/drive.vue: | desktop/views/pages/drive.vue: | ||||||
|   title: "Misskey Drive" |   title: "Misskey Drive" | ||||||
| desktop/views/pages/favorites.vue: | desktop/views/pages/favorites.vue: | ||||||
| @@ -1044,6 +1067,7 @@ mobile/views/components/ui.nav.vue: | |||||||
|   game: "ゲーム" |   game: "ゲーム" | ||||||
|   darkmode: "ダークモード" |   darkmode: "ダークモード" | ||||||
|   settings: "設定" |   settings: "設定" | ||||||
|  |   admin: "管理" | ||||||
|   about: "Misskeyについて" |   about: "Misskeyについて" | ||||||
| mobile/views/components/user-timeline.vue: | mobile/views/components/user-timeline.vue: | ||||||
|   no-notes: "このユーザーは投稿していないようです。" |   no-notes: "このユーザーは投稿していないようです。" | ||||||
| @@ -1133,6 +1157,7 @@ mobile/views/pages/settings.vue: | |||||||
|   dark-mode: "ダークモード" |   dark-mode: "ダークモード" | ||||||
|   i-am-under-limited-internet: "私は通信を制限されている" |   i-am-under-limited-internet: "私は通信を制限されている" | ||||||
|   circle-icons: "円形のアイコンを使用" |   circle-icons: "円形のアイコンを使用" | ||||||
|  |   contrasted-acct: "ユーザー名にコントラストを付ける" | ||||||
|   timeline: "タイムライン" |   timeline: "タイムライン" | ||||||
|   show-reply-target: "リプライ先を表示する" |   show-reply-target: "リプライ先を表示する" | ||||||
|   show-my-renotes: "自分の行ったRenoteを表示する" |   show-my-renotes: "自分の行ったRenoteを表示する" | ||||||
| @@ -1141,6 +1166,9 @@ mobile/views/pages/settings.vue: | |||||||
|   post-style: "投稿の表示スタイル" |   post-style: "投稿の表示スタイル" | ||||||
|   post-style-standard: "標準" |   post-style-standard: "標準" | ||||||
|   post-style-smart: "スマート" |   post-style-smart: "スマート" | ||||||
|  |   notification-position: "通知の表示" | ||||||
|  |   notification-position-bottom: "下" | ||||||
|  |   notification-position-top: "上" | ||||||
|   behavior: "動作" |   behavior: "動作" | ||||||
|   fetch-on-scroll: "スクロールで自動読み込み" |   fetch-on-scroll: "スクロールで自動読み込み" | ||||||
|   disable-via-mobile: "「モバイルからの投稿」フラグを付けない" |   disable-via-mobile: "「モバイルからの投稿」フラグを付けない" | ||||||
| @@ -1161,6 +1189,8 @@ mobile/views/pages/settings.vue: | |||||||
|   update-available-desc: "ページを再度読み込みすると更新が適用されます。" |   update-available-desc: "ページを再度読み込みすると更新が適用されます。" | ||||||
|   settings: "設定" |   settings: "設定" | ||||||
|   signout: "サインアウト" |   signout: "サインアウト" | ||||||
|  |   sound: "サウンド" | ||||||
|  |   enable-sounds: "サウンドを有効にする" | ||||||
| mobile/views/pages/user.vue: | mobile/views/pages/user.vue: | ||||||
|   follows-you: "フォローされています" |   follows-you: "フォローされています" | ||||||
|   following: "フォロー" |   following: "フォロー" | ||||||
| @@ -30,7 +30,7 @@ common: | |||||||
|     quoted-by: "Cité·e par {} :" |     quoted-by: "Cité·e par {} :" | ||||||
|   time: |   time: | ||||||
|     unknown: "inconnu" |     unknown: "inconnu" | ||||||
|     future: "future" |     future: "à l'instant" | ||||||
|     just_now: "à l'instant" |     just_now: "à l'instant" | ||||||
|     seconds_ago: "Il y a {} seconde·s" |     seconds_ago: "Il y a {} seconde·s" | ||||||
|     minutes_ago: "Il y a {} minute·s" |     minutes_ago: "Il y a {} minute·s" | ||||||
| @@ -58,10 +58,10 @@ common: | |||||||
|     friday: "Vendredi" |     friday: "Vendredi" | ||||||
|     saturday: "Samedi" |     saturday: "Samedi" | ||||||
|   reactions: |   reactions: | ||||||
|     like: "Aime" |     like: "J'aime" | ||||||
|     love: "Adore" |     love: "Adore" | ||||||
|     laugh: "Rire" |     laugh: "Rire" | ||||||
|     hmm: "Hmm ... ?" |     hmm: "Hmm … ?" | ||||||
|     surprise: "Wow" |     surprise: "Wow" | ||||||
|     congrats: "Félicitations !" |     congrats: "Félicitations !" | ||||||
|     angry: "En colère" |     angry: "En colère" | ||||||
| @@ -69,10 +69,10 @@ common: | |||||||
|     rip: "RIP" |     rip: "RIP" | ||||||
|     pudding: "Pudding" |     pudding: "Pudding" | ||||||
|   note-placeholders: |   note-placeholders: | ||||||
|     a: "Que faites vous maintenant ?" |     a: "Que faites-vous maintenant ?" | ||||||
|     b: "Quoi de neuf ?" |     b: "Quoi de neuf ?" | ||||||
|     c: "Qu'avez-vous en tête ?" |     c: "Qu'avez-vous en tête ?" | ||||||
|     d: "Voulez-vous exprimer quelque chose ?" |     d: "Désirez-vous publier quelques mots ?" | ||||||
|     e: "Écrivez ici" |     e: "Écrivez ici" | ||||||
|     f: "En attente de vos écrits" |     f: "En attente de vos écrits" | ||||||
|   search: "Recherche" |   search: "Recherche" | ||||||
| @@ -84,8 +84,10 @@ common: | |||||||
|   my-token-regenerated: "Votre token vient d'être généré, vous allez maintenant être déconnecté." |   my-token-regenerated: "Votre token vient d'être généré, vous allez maintenant être déconnecté." | ||||||
|   i-like-sushi: "Je préfère les sushis plutôt que le pudding" |   i-like-sushi: "Je préfère les sushis plutôt que le pudding" | ||||||
|   show-reversi-board-labels: "Afficher les étiquettes des lignes et colonnes dans Reversi" |   show-reversi-board-labels: "Afficher les étiquettes des lignes et colonnes dans Reversi" | ||||||
|  |   use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける" | ||||||
|   verified-user: "Compte vérifié" |   verified-user: "Compte vérifié" | ||||||
|   disable-animated-mfm: "Désactiver les textes animés dans les publications" |   disable-animated-mfm: "Désactiver les textes animés dans les publications" | ||||||
|  |   do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' | ||||||
|   reversi: |   reversi: | ||||||
|     drawn: "Partie nulle" |     drawn: "Partie nulle" | ||||||
|     my-turn: "C’est votre tour" |     my-turn: "C’est votre tour" | ||||||
| @@ -230,7 +232,7 @@ common/views/components/connect-failed.troubleshooter.vue: | |||||||
|   flush: "Vider le cache" |   flush: "Vider le cache" | ||||||
|   set-version: "Choisissez une version" |   set-version: "Choisissez une version" | ||||||
| common/views/components/messaging.vue: | common/views/components/messaging.vue: | ||||||
|   search-user: "Trouver un·e utilisateur·rice" |   search-user: "Trouver un·e utilisateur·trice" | ||||||
|   you: "Vous" |   you: "Vous" | ||||||
|   no-history: "Pas d'historique" |   no-history: "Pas d'historique" | ||||||
| common/views/components/messaging-room.vue: | common/views/components/messaging-room.vue: | ||||||
| @@ -259,6 +261,8 @@ common/views/components/nav.vue: | |||||||
|   develop: "Développeur·se·s" |   develop: "Développeur·se·s" | ||||||
|   feedback: "Remarques" |   feedback: "Remarques" | ||||||
| common/views/components/note-menu.vue: | common/views/components/note-menu.vue: | ||||||
|  |   detail: "詳細" | ||||||
|  |   copy-link: "リンクをコピー" | ||||||
|   favorite: "Mettre cette note en favoris" |   favorite: "Mettre cette note en favoris" | ||||||
|   pin: "Épingler sur votre profil" |   pin: "Épingler sur votre profil" | ||||||
|   delete: "Supprimer" |   delete: "Supprimer" | ||||||
| @@ -287,7 +291,7 @@ common/views/components/signin.vue: | |||||||
|   signin: "Se connecter" |   signin: "Se connecter" | ||||||
|   or: "Ou" |   or: "Ou" | ||||||
|   signin-with-twitter: "Se connecter via Twitter" |   signin-with-twitter: "Se connecter via Twitter" | ||||||
|   login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。" |   login-failed: "Échec d'authentification. Veuillez vérifier que votre nom d'utilisateur et mot de passe sont corrects." | ||||||
| common/views/components/signup.vue: | common/views/components/signup.vue: | ||||||
|   invitation-code: "Code d’invitation" |   invitation-code: "Code d’invitation" | ||||||
|   invitation-info: "Si vous n’avez pas de code d’invitation, contactez un·e <a href=\"{}\">administrateur·rice</a>." |   invitation-info: "Si vous n’avez pas de code d’invitation, contactez un·e <a href=\"{}\">administrateur·rice</a>." | ||||||
| @@ -336,6 +340,9 @@ common/views/components/visibility-chooser.vue: | |||||||
|   specified: "Direct" |   specified: "Direct" | ||||||
|   specified-desc: "Publier aux utilisateur·rice·s mentionné·e·s" |   specified-desc: "Publier aux utilisateur·rice·s mentionné·e·s" | ||||||
|   private: "Privé" |   private: "Privé" | ||||||
|  | common/views/components/trends.vue: | ||||||
|  |   count: "{}人が投稿" | ||||||
|  |   empty: "トレンドなし" | ||||||
| common/views/widgets/broadcast.vue: | common/views/widgets/broadcast.vue: | ||||||
|   fetching: "Récupération" |   fetching: "Récupération" | ||||||
|   no-broadcasts: "Aucune annonce" |   no-broadcasts: "Aucune annonce" | ||||||
| @@ -359,8 +366,6 @@ common/views/widgets/posts-monitor.vue: | |||||||
|   toggle: "Basculer entre les vues" |   toggle: "Basculer entre les vues" | ||||||
| common/views/widgets/hashtags.vue: | common/views/widgets/hashtags.vue: | ||||||
|   title: "Étiquettes" |   title: "Étiquettes" | ||||||
|   count: "{} utilisateur·rice·s mentionné·e·s" |  | ||||||
|   empty: "Aucune tendance" |  | ||||||
| common/views/widgets/server.vue: | common/views/widgets/server.vue: | ||||||
|   title: "Informations sur le serveur" |   title: "Informations sur le serveur" | ||||||
|   toggle: "Afficher les vues" |   toggle: "Afficher les vues" | ||||||
| @@ -378,7 +383,7 @@ common/views/widgets/tips.vue: | |||||||
|   tips-line3: "Vous pouvez glisser et déposer des fichiers sur la fenêtre de la note" |   tips-line3: "Vous pouvez glisser et déposer des fichiers sur la fenêtre de la note" | ||||||
|   tips-line4: "Vous pouvez coller des images à partir du presse-papier sur la fenêtre de la note" |   tips-line4: "Vous pouvez coller des images à partir du presse-papier sur la fenêtre de la note" | ||||||
|   tips-line5: "Vous pouvez téléverser des fichiers sur le Drive en faisant un glisser-déposer" |   tips-line5: "Vous pouvez téléverser des fichiers sur le Drive en faisant un glisser-déposer" | ||||||
|   tips-line6: "ドライブでファイルをドラッグしてフォルダ移動できます" |   tips-line6: "Vous pouvez déplacer un dossier en le glissant dans le Drive" | ||||||
|   tips-line7: "ドライブでフォルダをドラッグしてフォルダ移動できます" |   tips-line7: "ドライブでフォルダをドラッグしてフォルダ移動できます" | ||||||
|   tips-line8: "Vous pouvez personnaliser l'Accueil via les paramètres" |   tips-line8: "Vous pouvez personnaliser l'Accueil via les paramètres" | ||||||
|   tips-line9: "Misskey est sous licence AGPLv3" |   tips-line9: "Misskey est sous licence AGPLv3" | ||||||
| @@ -410,6 +415,7 @@ desktop: | |||||||
|   uploading-avatar: "Téléversement du nouvel avatar" |   uploading-avatar: "Téléversement du nouvel avatar" | ||||||
|   avatar-updated: "L'avatar est mis à jour" |   avatar-updated: "L'avatar est mis à jour" | ||||||
|   choose-avatar: "Choisir un avatar" |   choose-avatar: "Choisir un avatar" | ||||||
|  |   invalid-filetype: "この形式のファイルはサポートされていません" | ||||||
| desktop/views/components/activity.chart.vue: | desktop/views/components/activity.chart.vue: | ||||||
|   total: "Noirs ... Total" |   total: "Noirs ... Total" | ||||||
|   notes: "Bleu ... Notes" |   notes: "Bleu ... Notes" | ||||||
| @@ -423,6 +429,24 @@ desktop/views/components/calendar.vue: | |||||||
|   prev: "Mois dernier" |   prev: "Mois dernier" | ||||||
|   next: "Mois prochain" |   next: "Mois prochain" | ||||||
|   go: "Cliquez pour naviguer" |   go: "Cliquez pour naviguer" | ||||||
|  | desktop/views/components/charts.vue: | ||||||
|  |   title: "Graphiques" | ||||||
|  |   per-day: "par jour" | ||||||
|  |   per-hour: "par heure" | ||||||
|  |   notes: "Publications" | ||||||
|  |   users: "Utilisateurs" | ||||||
|  |   drive: "Drive" | ||||||
|  |   charts: | ||||||
|  |     notes: "投稿の増減 (統合)" | ||||||
|  |     local-notes: "投稿の増減 (ローカル)" | ||||||
|  |     remote-notes: "投稿の増減 (リモート)" | ||||||
|  |     notes-total: "投稿の累計" | ||||||
|  |     users: "ユーザーの増減" | ||||||
|  |     users-total: "ユーザーの累計" | ||||||
|  |     drive: "ドライブ使用量の増減" | ||||||
|  |     drive-total: "ドライブ使用量の累計" | ||||||
|  |     drive-files: "ドライブのファイル数の増減" | ||||||
|  |     drive-files-total: "ドライブのファイル数の累計" | ||||||
| desktop/views/components/choose-file-from-drive-window.vue: | desktop/views/components/choose-file-from-drive-window.vue: | ||||||
|   choose-file: "Sélection de fichiers" |   choose-file: "Sélection de fichiers" | ||||||
|   upload: "Téléverser des fichiers à partir de votre ordinateur" |   upload: "Téléverser des fichiers à partir de votre ordinateur" | ||||||
| @@ -443,7 +467,7 @@ desktop/views/components/drive-window.vue: | |||||||
| desktop/views/components/drive.file.vue: | desktop/views/components/drive.file.vue: | ||||||
|   avatar: "Avatar" |   avatar: "Avatar" | ||||||
|   banner: "Bannière" |   banner: "Bannière" | ||||||
|   nsfw: "閲覧注意" |   nsfw: "CW" | ||||||
|   contextmenu: |   contextmenu: | ||||||
|     rename: "Renommer" |     rename: "Renommer" | ||||||
|     mark-as-sensitive: "Marquer comme sensible" |     mark-as-sensitive: "Marquer comme sensible" | ||||||
| @@ -512,7 +536,7 @@ desktop/views/components/following.vue: | |||||||
|   empty: "Vous ne suivez aucun compte." |   empty: "Vous ne suivez aucun compte." | ||||||
| desktop/views/components/friends-maker.vue: | desktop/views/components/friends-maker.vue: | ||||||
|   title: "Utilisateurs recommandés :" |   title: "Utilisateurs recommandés :" | ||||||
|   empty: "Impossible de trouver des utilisateurs à recommander." |   empty: "Impossible de trouver des utilisateurs·trices à recommander." | ||||||
|   fetching: "Chargement" |   fetching: "Chargement" | ||||||
|   refresh: "Plus" |   refresh: "Plus" | ||||||
|   close: "Fermer" |   close: "Fermer" | ||||||
| @@ -627,9 +651,11 @@ desktop/views/components/settings.vue: | |||||||
|   delete-wallpaper: "Supprimer le fond d'écran" |   delete-wallpaper: "Supprimer le fond d'écran" | ||||||
|   dark-mode: "Mode nuit" |   dark-mode: "Mode nuit" | ||||||
|   circle-icons: "Utiliser des icônes circulaires" |   circle-icons: "Utiliser des icônes circulaires" | ||||||
|  |   contrasted-acct: "ユーザー名にコントラストを付ける" | ||||||
|   gradient-window-header: "Utiliser les dégradés sur la barre de titre de la fenêtre" |   gradient-window-header: "Utiliser les dégradés sur la barre de titre de la fenêtre" | ||||||
|   post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" |   post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" | ||||||
|   suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" |   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" |   show-reply-target: "Afficher les réponses" | ||||||
|   show-my-renotes: "Afficher mes republications dans le fil" |   show-my-renotes: "Afficher mes republications dans le fil" | ||||||
|   show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" |   show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" | ||||||
| @@ -638,7 +664,7 @@ desktop/views/components/settings.vue: | |||||||
|   show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。" |   show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。" | ||||||
|   sound: "Son" |   sound: "Son" | ||||||
|   enable-sounds: "Activer le son" |   enable-sounds: "Activer le son" | ||||||
|   enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。" |   enable-sounds-desc: "Jouer un son lorsque vous recevez un message. Ce paramètre est sauvegardé dans le navigateur." | ||||||
|   volume: "Volume" |   volume: "Volume" | ||||||
|   test: "Test" |   test: "Test" | ||||||
|   mobile: "Mobile" |   mobile: "Mobile" | ||||||
| @@ -699,7 +725,7 @@ desktop/views/components/settings.2fa.vue: | |||||||
| desktop/views/components/settings.api.vue: | desktop/views/components/settings.api.vue: | ||||||
|   intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。" |   intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。" | ||||||
|   caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。" |   caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。" | ||||||
|   regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。" |   regeneration-of-token: "Si votre jeton est compromis, vous pouvez le régénérer." | ||||||
|   regenerate-token: "Regenerer le token" |   regenerate-token: "Regenerer le token" | ||||||
|   token: "Jeton :" |   token: "Jeton :" | ||||||
|   enter-password: "Veuillez entrer le mot de passe" |   enter-password: "Veuillez entrer le mot de passe" | ||||||
| @@ -754,6 +780,7 @@ desktop/views/components/ui.header.account.vue: | |||||||
|   lists: "Listes" |   lists: "Listes" | ||||||
|   follow-requests: "Demandes de suivi" |   follow-requests: "Demandes de suivi" | ||||||
|   customize: "Personnaliser l'Accueil" |   customize: "Personnaliser l'Accueil" | ||||||
|  |   admin: "Admin" | ||||||
|   settings: "Réglages" |   settings: "Réglages" | ||||||
|   signout: "Déconnexion" |   signout: "Déconnexion" | ||||||
|   dark: "Fall in dark" |   dark: "Fall in dark" | ||||||
| @@ -791,14 +818,14 @@ desktop/views/components/window.vue: | |||||||
|   popout: "ポップアウト" |   popout: "ポップアウト" | ||||||
|   close: "Fermer" |   close: "Fermer" | ||||||
| desktop/views/pages/admin/admin.vue: | desktop/views/pages/admin/admin.vue: | ||||||
|   dashboard: "ダッシュボード" |   dashboard: "Tableau de bord" | ||||||
|   drive: "Drive" |   drive: "Drive" | ||||||
|   users: "Utilisateur·rice·s" |   users: "Utilisateur·rice·s" | ||||||
|   update: "Mises à jour" |   update: "Mises à jour" | ||||||
| desktop/views/pages/admin/admin.dashboard.vue: | desktop/views/pages/admin/admin.dashboard.vue: | ||||||
|   dashboard: "ダッシュボード" |   dashboard: "Tableau de bord" | ||||||
|   all-users: "Tou·te·s les utilisateur·rice·s" |   all-users: "Toutes les utilisateurrices" | ||||||
|   original-users: "Utilisateur·rice·s sur cette instance" |   original-users: "Utilisateurrices sur cette instance" | ||||||
|   all-notes: "Toutes les publications" |   all-notes: "Toutes les publications" | ||||||
|   original-notes: "Publication sur cette instance" |   original-notes: "Publication sur cette instance" | ||||||
|   invite: "Invitation" |   invite: "Invitation" | ||||||
| @@ -811,25 +838,13 @@ desktop/views/pages/admin/admin.unsuspend-user.vue: | |||||||
|   unsuspend: "Suspension levée" |   unsuspend: "Suspension levée" | ||||||
|   unsuspended: "La suspension de l’utilisateur·rice a été levée avec succès" |   unsuspended: "La suspension de l’utilisateur·rice a été levée avec succès" | ||||||
| desktop/views/pages/admin/admin.verify-user.vue: | desktop/views/pages/admin/admin.verify-user.vue: | ||||||
|   verify-user: "ユーザーの公式アカウント設定" |   verify-user: "Paramètres de vérification du compte utilisateur" | ||||||
|   verify: "Vérification du compte" |   verify: "Vérification du compte" | ||||||
|   verified: "Le compte a été vérifié" |   verified: "Le compte a été vérifié" | ||||||
| desktop/views/pages/admin/admin.unverify-user.vue: | desktop/views/pages/admin/admin.unverify-user.vue: | ||||||
|   unverify-user: "ユーザーの公式アカウント解除" |   unverify-user: "ユーザーの公式アカウント解除" | ||||||
|   unverify: "公式アカウントを解除する" |   unverify: "Ôter la vérification du compte" | ||||||
|   unverified: "公式アカウントを解除しました" |   unverified: "Ce compte n'est pas vérifié" | ||||||
| desktop/views/pages/admin/admin.notes-chart.vue: |  | ||||||
|   title: "投稿" |  | ||||||
|   local: "ローカル" |  | ||||||
|   remote: "リモート" |  | ||||||
| desktop/views/pages/admin/admin.users-chart.vue: |  | ||||||
|   title: "ユーザー" |  | ||||||
|   local: "ローカル" |  | ||||||
|   remote: "リモート" |  | ||||||
| desktop/views/pages/admin/admin.drive-chart.vue: |  | ||||||
|   title: "ドライブ" |  | ||||||
|   local: "ローカル" |  | ||||||
|   remote: "リモート" |  | ||||||
| desktop/views/pages/deck/deck.tl-column.vue: | desktop/views/pages/deck/deck.tl-column.vue: | ||||||
|   is-media-only: "Les publications médias uniquement" |   is-media-only: "Les publications médias uniquement" | ||||||
|   is-media-view: "Vue média" |   is-media-view: "Vue média" | ||||||
| @@ -838,6 +853,11 @@ desktop/views/pages/deck/deck.note.vue: | |||||||
|   reposted-by: "Reposté par {}" |   reposted-by: "Reposté par {}" | ||||||
|   private: "cette publication est privée" |   private: "cette publication est privée" | ||||||
|   deleted: "cette publication a été supprimée" |   deleted: "cette publication a été supprimée" | ||||||
|  | desktop/views/pages/stats/stats.vue: | ||||||
|  |   all-users: "Toutes les utilisateurrices" | ||||||
|  |   original-users: "Utilisateurrices sur cette instance" | ||||||
|  |   all-notes: "Toutes les publications" | ||||||
|  |   original-notes: "Publication sur cette instance" | ||||||
| desktop/views/pages/welcome.vue: | desktop/views/pages/welcome.vue: | ||||||
|   about: "à propos" |   about: "à propos" | ||||||
|   gotit: "J'ai compris !" |   gotit: "J'ai compris !" | ||||||
| @@ -846,7 +866,10 @@ desktop/views/pages/welcome.vue: | |||||||
|   signin-button: "Se connecter" |   signin-button: "Se connecter" | ||||||
|   signup-button: "S'inscrire" |   signup-button: "S'inscrire" | ||||||
|   timeline: "Fil d'actualité" |   timeline: "Fil d'actualité" | ||||||
|  |   announcements: "お知らせ" | ||||||
|  |   photos: "最近の画像" | ||||||
|   powered-by-misskey: "Propulsé par <b>Misskey</b>." |   powered-by-misskey: "Propulsé par <b>Misskey</b>." | ||||||
|  |   info: "情報" | ||||||
| desktop/views/pages/drive.vue: | desktop/views/pages/drive.vue: | ||||||
|   title: "Lecteur de Misskey" |   title: "Lecteur de Misskey" | ||||||
| desktop/views/pages/favorites.vue: | desktop/views/pages/favorites.vue: | ||||||
| @@ -977,7 +1000,7 @@ mobile/views/components/follow-button.vue: | |||||||
|   follow-request: "Demande d'abonnement" |   follow-request: "Demande d'abonnement" | ||||||
| mobile/views/components/friends-maker.vue: | mobile/views/components/friends-maker.vue: | ||||||
|   title: "Abonnez-vous aux utilisateurs" |   title: "Abonnez-vous aux utilisateurs" | ||||||
|   empty: "Impossible de trouver des utilisateurs à recommander." |   empty: "Impossible de trouver des utilisateurs·trices à recommander." | ||||||
|   fetching: "Chargement" |   fetching: "Chargement" | ||||||
|   refresh: "Voir plus" |   refresh: "Voir plus" | ||||||
|   close: "Fermer" |   close: "Fermer" | ||||||
| @@ -1044,6 +1067,7 @@ mobile/views/components/ui.nav.vue: | |||||||
|   game: "Jeux" |   game: "Jeux" | ||||||
|   darkmode: "Mode nuit" |   darkmode: "Mode nuit" | ||||||
|   settings: "Réglages" |   settings: "Réglages" | ||||||
|  |   admin: "Admin" | ||||||
|   about: "À propose de Misskey" |   about: "À propose de Misskey" | ||||||
| mobile/views/components/user-timeline.vue: | mobile/views/components/user-timeline.vue: | ||||||
|   no-notes: "Cette utilisateur semble n'avoir rien poster pour le moment" |   no-notes: "Cette utilisateur semble n'avoir rien poster pour le moment" | ||||||
| @@ -1133,6 +1157,7 @@ mobile/views/pages/settings.vue: | |||||||
|   dark-mode: "Mode nuit" |   dark-mode: "Mode nuit" | ||||||
|   i-am-under-limited-internet: "J'ai un accès Internet limité" |   i-am-under-limited-internet: "J'ai un accès Internet limité" | ||||||
|   circle-icons: "Utiliser des icônes circulaires" |   circle-icons: "Utiliser des icônes circulaires" | ||||||
|  |   contrasted-acct: "ユーザー名にコントラストを付ける" | ||||||
|   timeline: "Fil d'actualité" |   timeline: "Fil d'actualité" | ||||||
|   show-reply-target: "Afficher les réponses" |   show-reply-target: "Afficher les réponses" | ||||||
|   show-my-renotes: "Afficher mes republications" |   show-my-renotes: "Afficher mes republications" | ||||||
| @@ -1141,6 +1166,9 @@ mobile/views/pages/settings.vue: | |||||||
|   post-style: "Style de la publication" |   post-style: "Style de la publication" | ||||||
|   post-style-standard: "Standard" |   post-style-standard: "Standard" | ||||||
|   post-style-smart: "Intelligent" |   post-style-smart: "Intelligent" | ||||||
|  |   notification-position: "通知の表示" | ||||||
|  |   notification-position-bottom: "下" | ||||||
|  |   notification-position-top: "上" | ||||||
|   behavior: "Comportement" |   behavior: "Comportement" | ||||||
|   fetch-on-scroll: "Chargement lors du défilement" |   fetch-on-scroll: "Chargement lors du défilement" | ||||||
|   disable-via-mobile: "Ne pas mentionner que ma publication provient d'un 'périphérique mobile'" |   disable-via-mobile: "Ne pas mentionner que ma publication provient d'un 'périphérique mobile'" | ||||||
| @@ -1161,6 +1189,8 @@ mobile/views/pages/settings.vue: | |||||||
|   update-available-desc: "Les mises à jour seront appliquées une fois la page est rechargée." |   update-available-desc: "Les mises à jour seront appliquées une fois la page est rechargée." | ||||||
|   settings: "Réglages" |   settings: "Réglages" | ||||||
|   signout: "Déconnexion" |   signout: "Déconnexion" | ||||||
|  |   sound: "Sons" | ||||||
|  |   enable-sounds: "サウンドを有効にする" | ||||||
| mobile/views/pages/user.vue: | mobile/views/pages/user.vue: | ||||||
|   follows-you: "vous suit" |   follows-you: "vous suit" | ||||||
|   following: "Abonnements" |   following: "Abonnements" | ||||||
| @@ -5,24 +5,9 @@ | |||||||
| const fs = require('fs'); | const fs = require('fs'); | ||||||
| const yaml = require('js-yaml'); | const yaml = require('js-yaml'); | ||||||
|  |  | ||||||
| const loadLang = lang => yaml.safeLoad( | const langs = ['de-DE', 'en-US', 'fr-FR', 'ja-JP', 'ja-KS', 'pl-PL', 'es-ES', 'nl-NL']; | ||||||
| 	fs.readFileSync(`${__dirname}/${lang}.yml`, 'utf-8')); |  | ||||||
|  |  | ||||||
| const native = loadLang('ja'); | const loadLocale = lang => yaml.safeLoad(fs.readFileSync(`${__dirname}/${lang}.yml`, 'utf-8')); | ||||||
|  | const locales = langs.map(lang => ({ [lang]: loadLocale(lang) })); | ||||||
|  |  | ||||||
| const langs = { | module.exports = locales.reduce((a, b) => ({ ...a, ...b })); | ||||||
| 	'de': loadLang('de'), |  | ||||||
| 	'en': loadLang('en'), |  | ||||||
| 	'fr': loadLang('fr'), |  | ||||||
| 	'ja': native, |  | ||||||
| 	'ja-ks': loadLang('ja-ks'), |  | ||||||
| 	'pl': loadLang('pl'), |  | ||||||
| 	'es': loadLang('es') |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| Object.values(langs).forEach(locale => { |  | ||||||
| 	// Extend native language (Japanese) |  | ||||||
| 	locale = Object.assign({}, native, locale); |  | ||||||
| }); |  | ||||||
|  |  | ||||||
| module.exports = langs; |  | ||||||
|   | |||||||
| @@ -84,8 +84,10 @@ common: | |||||||
|   my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。" |   my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。" | ||||||
|   i-like-sushi: "私は(プリンよりむしろ)寿司が好き" |   i-like-sushi: "私は(プリンよりむしろ)寿司が好き" | ||||||
|   show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示" |   show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示" | ||||||
|  |   use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける" | ||||||
|   verified-user: "公式アカウント" |   verified-user: "公式アカウント" | ||||||
|   disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" |   disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" | ||||||
|  |   do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' | ||||||
|   reversi: |   reversi: | ||||||
|     drawn: "引き分け" |     drawn: "引き分け" | ||||||
|     my-turn: "あなたのターンです" |     my-turn: "あなたのターンです" | ||||||
| @@ -259,6 +261,8 @@ common/views/components/nav.vue: | |||||||
|   develop: "開発者" |   develop: "開発者" | ||||||
|   feedback: "フィードバック" |   feedback: "フィードバック" | ||||||
| common/views/components/note-menu.vue: | common/views/components/note-menu.vue: | ||||||
|  |   detail: "詳細" | ||||||
|  |   copy-link: "リンクをコピー" | ||||||
|   favorite: "お気に入り" |   favorite: "お気に入り" | ||||||
|   pin: "ピン留め" |   pin: "ピン留め" | ||||||
|   delete: "削除" |   delete: "削除" | ||||||
| @@ -336,6 +340,9 @@ common/views/components/visibility-chooser.vue: | |||||||
|   specified: "ダイレクト" |   specified: "ダイレクト" | ||||||
|   specified-desc: "指定したユーザーにのみ公開" |   specified-desc: "指定したユーザーにのみ公開" | ||||||
|   private: "非公開" |   private: "非公開" | ||||||
|  | common/views/components/trends.vue: | ||||||
|  |   count: "{}人が投稿" | ||||||
|  |   empty: "トレンドなし" | ||||||
| common/views/widgets/broadcast.vue: | common/views/widgets/broadcast.vue: | ||||||
|   fetching: "確認中" |   fetching: "確認中" | ||||||
|   no-broadcasts: "お知らせはありません" |   no-broadcasts: "お知らせはありません" | ||||||
| @@ -359,8 +366,6 @@ common/views/widgets/posts-monitor.vue: | |||||||
|   toggle: "表示を切り替え" |   toggle: "表示を切り替え" | ||||||
| common/views/widgets/hashtags.vue: | common/views/widgets/hashtags.vue: | ||||||
|   title: "ハッシュタグ" |   title: "ハッシュタグ" | ||||||
|   count: "{}人が投稿" |  | ||||||
|   empty: "トレンドなし" |  | ||||||
| common/views/widgets/server.vue: | common/views/widgets/server.vue: | ||||||
|   title: "サーバー情報" |   title: "サーバー情報" | ||||||
|   toggle: "表示を切り替え" |   toggle: "表示を切り替え" | ||||||
| @@ -410,6 +415,7 @@ desktop: | |||||||
|   uploading-avatar: "新しいアバターをアップロードしています" |   uploading-avatar: "新しいアバターをアップロードしています" | ||||||
|   avatar-updated: "アバターを更新しました" |   avatar-updated: "アバターを更新しました" | ||||||
|   choose-avatar: "アバターにする画像を選択" |   choose-avatar: "アバターにする画像を選択" | ||||||
|  |   invalid-filetype: "この形式のファイルはサポートされていません" | ||||||
| desktop/views/components/activity.chart.vue: | desktop/views/components/activity.chart.vue: | ||||||
|   total: "Black ... Total" |   total: "Black ... Total" | ||||||
|   notes: "Blue ... Notes" |   notes: "Blue ... Notes" | ||||||
| @@ -423,6 +429,24 @@ desktop/views/components/calendar.vue: | |||||||
|   prev: "前の月" |   prev: "前の月" | ||||||
|   next: "次の月" |   next: "次の月" | ||||||
|   go: "クリックして時間遡行" |   go: "クリックして時間遡行" | ||||||
|  | desktop/views/components/charts.vue: | ||||||
|  |   title: "チャート" | ||||||
|  |   per-day: "1日ごと" | ||||||
|  |   per-hour: "1時間ごと" | ||||||
|  |   notes: "投稿" | ||||||
|  |   users: "ユーザー" | ||||||
|  |   drive: "ドライブ" | ||||||
|  |   charts: | ||||||
|  |     notes: "投稿の増減 (統合)" | ||||||
|  |     local-notes: "投稿の増減 (ローカル)" | ||||||
|  |     remote-notes: "投稿の増減 (リモート)" | ||||||
|  |     notes-total: "投稿の累計" | ||||||
|  |     users: "ユーザーの増減" | ||||||
|  |     users-total: "ユーザーの累計" | ||||||
|  |     drive: "ドライブ使用量の増減" | ||||||
|  |     drive-total: "ドライブ使用量の累計" | ||||||
|  |     drive-files: "ドライブのファイル数の増減" | ||||||
|  |     drive-files-total: "ドライブのファイル数の累計" | ||||||
| desktop/views/components/choose-file-from-drive-window.vue: | desktop/views/components/choose-file-from-drive-window.vue: | ||||||
|   choose-file: "ファイル選択中" |   choose-file: "ファイル選択中" | ||||||
|   upload: "PCからドライブにファイルをアップロード" |   upload: "PCからドライブにファイルをアップロード" | ||||||
| @@ -627,9 +651,11 @@ desktop/views/components/settings.vue: | |||||||
|   delete-wallpaper: "壁紙を削除" |   delete-wallpaper: "壁紙を削除" | ||||||
|   dark-mode: "ダークモード" |   dark-mode: "ダークモード" | ||||||
|   circle-icons: "円形のアイコンを使用" |   circle-icons: "円形のアイコンを使用" | ||||||
|  |   contrasted-acct: "ユーザー名にコントラストを付ける" | ||||||
|   gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用" |   gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用" | ||||||
|   post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" |   post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" | ||||||
|   suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" |   suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" | ||||||
|  |   show-clock-on-header: "右上に時計を表示する" | ||||||
|   show-reply-target: "リプライ先を表示する" |   show-reply-target: "リプライ先を表示する" | ||||||
|   show-my-renotes: "自分の行ったRenoteをタイムラインに表示する" |   show-my-renotes: "自分の行ったRenoteをタイムラインに表示する" | ||||||
|   show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" |   show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" | ||||||
| @@ -754,6 +780,7 @@ desktop/views/components/ui.header.account.vue: | |||||||
|   lists: "リスト" |   lists: "リスト" | ||||||
|   follow-requests: "フォロー申請" |   follow-requests: "フォロー申請" | ||||||
|   customize: "ホームのカスタマイズ" |   customize: "ホームのカスタマイズ" | ||||||
|  |   admin: "管理" | ||||||
|   settings: "設定" |   settings: "設定" | ||||||
|   signout: "サインアウト" |   signout: "サインアウト" | ||||||
|   dark: "闇に飲まれる" |   dark: "闇に飲まれる" | ||||||
| @@ -799,8 +826,8 @@ desktop/views/pages/admin/admin.dashboard.vue: | |||||||
|   dashboard: "ダッシュボード" |   dashboard: "ダッシュボード" | ||||||
|   all-users: "全てのユーザー" |   all-users: "全てのユーザー" | ||||||
|   original-users: "このインスタンスのユーザー" |   original-users: "このインスタンスのユーザー" | ||||||
|   all-notes: "全てのノート" |   all-notes: "全ての投稿" | ||||||
|   original-notes: "このインスタンスのノート" |   original-notes: "このインスタンスの投稿" | ||||||
|   invite: "招待" |   invite: "招待" | ||||||
| desktop/views/pages/admin/admin.suspend-user.vue: | desktop/views/pages/admin/admin.suspend-user.vue: | ||||||
|   suspend-user: "ユーザーの凍結" |   suspend-user: "ユーザーの凍結" | ||||||
| @@ -818,18 +845,6 @@ desktop/views/pages/admin/admin.unverify-user.vue: | |||||||
|   unverify-user: "ユーザーの公式アカウント解除" |   unverify-user: "ユーザーの公式アカウント解除" | ||||||
|   unverify: "公式アカウントを解除する" |   unverify: "公式アカウントを解除する" | ||||||
|   unverified: "公式アカウントを解除しました" |   unverified: "公式アカウントを解除しました" | ||||||
| desktop/views/pages/admin/admin.notes-chart.vue: |  | ||||||
|   title: "投稿" |  | ||||||
|   local: "ローカル" |  | ||||||
|   remote: "リモート" |  | ||||||
| desktop/views/pages/admin/admin.users-chart.vue: |  | ||||||
|   title: "ユーザー" |  | ||||||
|   local: "ローカル" |  | ||||||
|   remote: "リモート" |  | ||||||
| desktop/views/pages/admin/admin.drive-chart.vue: |  | ||||||
|   title: "ドライブ" |  | ||||||
|   local: "ローカル" |  | ||||||
|   remote: "リモート" |  | ||||||
| desktop/views/pages/deck/deck.tl-column.vue: | desktop/views/pages/deck/deck.tl-column.vue: | ||||||
|   is-media-only: "メディア投稿のみ" |   is-media-only: "メディア投稿のみ" | ||||||
|   is-media-view: "メディアビュー" |   is-media-view: "メディアビュー" | ||||||
| @@ -838,6 +853,11 @@ desktop/views/pages/deck/deck.note.vue: | |||||||
|   reposted-by: "{}がRenote" |   reposted-by: "{}がRenote" | ||||||
|   private: "この投稿は非公開です" |   private: "この投稿は非公開です" | ||||||
|   deleted: "この投稿は削除されました" |   deleted: "この投稿は削除されました" | ||||||
|  | desktop/views/pages/stats/stats.vue: | ||||||
|  |   all-users: "全てのユーザー" | ||||||
|  |   original-users: "このインスタンスのユーザー" | ||||||
|  |   all-notes: "全ての投稿" | ||||||
|  |   original-notes: "このインスタンスの投稿" | ||||||
| desktop/views/pages/welcome.vue: | desktop/views/pages/welcome.vue: | ||||||
|   about: "詳しく..." |   about: "詳しく..." | ||||||
|   gotit: "わかった" |   gotit: "わかった" | ||||||
| @@ -846,7 +866,10 @@ desktop/views/pages/welcome.vue: | |||||||
|   signin-button: "やってる" |   signin-button: "やってる" | ||||||
|   signup-button: "やる" |   signup-button: "やる" | ||||||
|   timeline: "タイムライン" |   timeline: "タイムライン" | ||||||
|  |   announcements: "お知らせ" | ||||||
|  |   photos: "最近の画像" | ||||||
|   powered-by-misskey: "Powered by <b>Misskey</b>." |   powered-by-misskey: "Powered by <b>Misskey</b>." | ||||||
|  |   info: "情報" | ||||||
| desktop/views/pages/drive.vue: | desktop/views/pages/drive.vue: | ||||||
|   title: "Misskey Drive" |   title: "Misskey Drive" | ||||||
| desktop/views/pages/favorites.vue: | desktop/views/pages/favorites.vue: | ||||||
| @@ -1044,6 +1067,7 @@ mobile/views/components/ui.nav.vue: | |||||||
|   game: "ゲーム" |   game: "ゲーム" | ||||||
|   darkmode: "ダークモード" |   darkmode: "ダークモード" | ||||||
|   settings: "設定" |   settings: "設定" | ||||||
|  |   admin: "管理" | ||||||
|   about: "Misskeyについて" |   about: "Misskeyについて" | ||||||
| mobile/views/components/user-timeline.vue: | mobile/views/components/user-timeline.vue: | ||||||
|   no-notes: "このユーザーは投稿していないようです。" |   no-notes: "このユーザーは投稿していないようです。" | ||||||
| @@ -1133,6 +1157,7 @@ mobile/views/pages/settings.vue: | |||||||
|   dark-mode: "ダークモード" |   dark-mode: "ダークモード" | ||||||
|   i-am-under-limited-internet: "私は通信を制限されている" |   i-am-under-limited-internet: "私は通信を制限されている" | ||||||
|   circle-icons: "円形のアイコンを使用" |   circle-icons: "円形のアイコンを使用" | ||||||
|  |   contrasted-acct: "ユーザー名にコントラストを付ける" | ||||||
|   timeline: "タイムライン" |   timeline: "タイムライン" | ||||||
|   show-reply-target: "リプライ先を表示する" |   show-reply-target: "リプライ先を表示する" | ||||||
|   show-my-renotes: "自分の行ったRenoteを表示する" |   show-my-renotes: "自分の行ったRenoteを表示する" | ||||||
| @@ -1141,6 +1166,9 @@ mobile/views/pages/settings.vue: | |||||||
|   post-style: "投稿の表示スタイル" |   post-style: "投稿の表示スタイル" | ||||||
|   post-style-standard: "標準" |   post-style-standard: "標準" | ||||||
|   post-style-smart: "スマート" |   post-style-smart: "スマート" | ||||||
|  |   notification-position: "通知の表示" | ||||||
|  |   notification-position-bottom: "下" | ||||||
|  |   notification-position-top: "上" | ||||||
|   behavior: "動作" |   behavior: "動作" | ||||||
|   fetch-on-scroll: "スクロールで自動読み込み" |   fetch-on-scroll: "スクロールで自動読み込み" | ||||||
|   disable-via-mobile: "「モバイルからの投稿」フラグを付けない" |   disable-via-mobile: "「モバイルからの投稿」フラグを付けない" | ||||||
| @@ -1161,6 +1189,8 @@ mobile/views/pages/settings.vue: | |||||||
|   update-available-desc: "ページを再度読み込みすると更新が適用されます。" |   update-available-desc: "ページを再度読み込みすると更新が適用されます。" | ||||||
|   settings: "設定" |   settings: "設定" | ||||||
|   signout: "サインアウト" |   signout: "サインアウト" | ||||||
|  |   sound: "サウンド" | ||||||
|  |   enable-sounds: "サウンドを有効にする" | ||||||
| mobile/views/pages/user.vue: | mobile/views/pages/user.vue: | ||||||
|   follows-you: "フォローされています" |   follows-you: "フォローされています" | ||||||
|   following: "フォロー" |   following: "フォロー" | ||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1249
									
								
								locales/ja-KS.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1249
									
								
								locales/ja-KS.yml
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1412
									
								
								locales/ja-ks.yml
									
									
									
									
									
								
							
							
						
						
									
										1412
									
								
								locales/ja-ks.yml
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -58,7 +58,7 @@ common: | |||||||
|     friday: "금요일" |     friday: "금요일" | ||||||
|     saturday: "토요일" |     saturday: "토요일" | ||||||
|   reactions: |   reactions: | ||||||
|     like: "좋네" |     like: "いいね" | ||||||
|     love: "좋아" |     love: "좋아" | ||||||
|     laugh: "크크" |     laugh: "크크" | ||||||
|     hmm: "음..." |     hmm: "음..." | ||||||
| @@ -84,8 +84,10 @@ common: | |||||||
|   my-token-regenerated: "당신의 토큰이 업데이트되어 있기 때문에 로그 아웃합니다." |   my-token-regenerated: "당신의 토큰이 업데이트되어 있기 때문에 로그 아웃합니다." | ||||||
|   i-like-sushi: "나는(푸딩보다 오히려)스시가 좋아" |   i-like-sushi: "나는(푸딩보다 오히려)스시가 좋아" | ||||||
|   show-reversi-board-labels: "리버시 보드의 행과 열 레이블을 표시" |   show-reversi-board-labels: "리버시 보드의 행과 열 레이블을 표시" | ||||||
|  |   use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける" | ||||||
|   verified-user: "公式アカウント" |   verified-user: "公式アカウント" | ||||||
|   disable-animated-mfm: "게시물의 문자 애니메이션을 비활성화 할" |   disable-animated-mfm: "게시물의 문자 애니메이션을 비활성화 할" | ||||||
|  |   do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' | ||||||
|   reversi: |   reversi: | ||||||
|     drawn: "무승부" |     drawn: "무승부" | ||||||
|     my-turn: "당신의 차례입니다" |     my-turn: "당신의 차례입니다" | ||||||
| @@ -259,6 +261,8 @@ common/views/components/nav.vue: | |||||||
|   develop: "開発者" |   develop: "開発者" | ||||||
|   feedback: "フィードバック" |   feedback: "フィードバック" | ||||||
| common/views/components/note-menu.vue: | common/views/components/note-menu.vue: | ||||||
|  |   detail: "詳細" | ||||||
|  |   copy-link: "リンクをコピー" | ||||||
|   favorite: "お気に入り" |   favorite: "お気に入り" | ||||||
|   pin: "ピン留め" |   pin: "ピン留め" | ||||||
|   delete: "削除" |   delete: "削除" | ||||||
| @@ -336,6 +340,9 @@ common/views/components/visibility-chooser.vue: | |||||||
|   specified: "ダイレクト" |   specified: "ダイレクト" | ||||||
|   specified-desc: "指定したユーザーにのみ公開" |   specified-desc: "指定したユーザーにのみ公開" | ||||||
|   private: "非公開" |   private: "非公開" | ||||||
|  | common/views/components/trends.vue: | ||||||
|  |   count: "{}人が投稿" | ||||||
|  |   empty: "トレンドなし" | ||||||
| common/views/widgets/broadcast.vue: | common/views/widgets/broadcast.vue: | ||||||
|   fetching: "確認中" |   fetching: "確認中" | ||||||
|   no-broadcasts: "お知らせはありません" |   no-broadcasts: "お知らせはありません" | ||||||
| @@ -359,8 +366,6 @@ common/views/widgets/posts-monitor.vue: | |||||||
|   toggle: "表示を切り替え" |   toggle: "表示を切り替え" | ||||||
| common/views/widgets/hashtags.vue: | common/views/widgets/hashtags.vue: | ||||||
|   title: "ハッシュタグ" |   title: "ハッシュタグ" | ||||||
|   count: "{}人が投稿" |  | ||||||
|   empty: "トレンドなし" |  | ||||||
| common/views/widgets/server.vue: | common/views/widgets/server.vue: | ||||||
|   title: "サーバー情報" |   title: "サーバー情報" | ||||||
|   toggle: "表示を切り替え" |   toggle: "表示を切り替え" | ||||||
| @@ -410,6 +415,7 @@ desktop: | |||||||
|   uploading-avatar: "新しいアバターをアップロードしています" |   uploading-avatar: "新しいアバターをアップロードしています" | ||||||
|   avatar-updated: "アバターを更新しました" |   avatar-updated: "アバターを更新しました" | ||||||
|   choose-avatar: "アバターにする画像を選択" |   choose-avatar: "アバターにする画像を選択" | ||||||
|  |   invalid-filetype: "この形式のファイルはサポートされていません" | ||||||
| desktop/views/components/activity.chart.vue: | desktop/views/components/activity.chart.vue: | ||||||
|   total: "Black ... Total" |   total: "Black ... Total" | ||||||
|   notes: "Blue ... Notes" |   notes: "Blue ... Notes" | ||||||
| @@ -423,6 +429,24 @@ desktop/views/components/calendar.vue: | |||||||
|   prev: "前の月" |   prev: "前の月" | ||||||
|   next: "次の月" |   next: "次の月" | ||||||
|   go: "クリックして時間遡行" |   go: "クリックして時間遡行" | ||||||
|  | desktop/views/components/charts.vue: | ||||||
|  |   title: "チャート" | ||||||
|  |   per-day: "1日ごと" | ||||||
|  |   per-hour: "1時間ごと" | ||||||
|  |   notes: "投稿" | ||||||
|  |   users: "ユーザー" | ||||||
|  |   drive: "ドライブ" | ||||||
|  |   charts: | ||||||
|  |     notes: "投稿の増減 (統合)" | ||||||
|  |     local-notes: "投稿の増減 (ローカル)" | ||||||
|  |     remote-notes: "投稿の増減 (リモート)" | ||||||
|  |     notes-total: "投稿の累計" | ||||||
|  |     users: "ユーザーの増減" | ||||||
|  |     users-total: "ユーザーの累計" | ||||||
|  |     drive: "ドライブ使用量の増減" | ||||||
|  |     drive-total: "ドライブ使用量の累計" | ||||||
|  |     drive-files: "ドライブのファイル数の増減" | ||||||
|  |     drive-files-total: "ドライブのファイル数の累計" | ||||||
| desktop/views/components/choose-file-from-drive-window.vue: | desktop/views/components/choose-file-from-drive-window.vue: | ||||||
|   choose-file: "ファイル選択中" |   choose-file: "ファイル選択中" | ||||||
|   upload: "PCからドライブにファイルをアップロード" |   upload: "PCからドライブにファイルをアップロード" | ||||||
| @@ -627,9 +651,11 @@ desktop/views/components/settings.vue: | |||||||
|   delete-wallpaper: "壁紙を削除" |   delete-wallpaper: "壁紙を削除" | ||||||
|   dark-mode: "ダークモード" |   dark-mode: "ダークモード" | ||||||
|   circle-icons: "円形のアイコンを使用" |   circle-icons: "円形のアイコンを使用" | ||||||
|  |   contrasted-acct: "ユーザー名にコントラストを付ける" | ||||||
|   gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用" |   gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用" | ||||||
|   post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" |   post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" | ||||||
|   suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" |   suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" | ||||||
|  |   show-clock-on-header: "右上に時計を表示する" | ||||||
|   show-reply-target: "リプライ先を表示する" |   show-reply-target: "リプライ先を表示する" | ||||||
|   show-my-renotes: "自分の行ったRenoteをタイムラインに表示する" |   show-my-renotes: "自分の行ったRenoteをタイムラインに表示する" | ||||||
|   show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" |   show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" | ||||||
| @@ -754,6 +780,7 @@ desktop/views/components/ui.header.account.vue: | |||||||
|   lists: "リスト" |   lists: "リスト" | ||||||
|   follow-requests: "フォロー申請" |   follow-requests: "フォロー申請" | ||||||
|   customize: "ホームのカスタマイズ" |   customize: "ホームのカスタマイズ" | ||||||
|  |   admin: "管理" | ||||||
|   settings: "設定" |   settings: "設定" | ||||||
|   signout: "サインアウト" |   signout: "サインアウト" | ||||||
|   dark: "闇に飲まれる" |   dark: "闇に飲まれる" | ||||||
| @@ -799,8 +826,8 @@ desktop/views/pages/admin/admin.dashboard.vue: | |||||||
|   dashboard: "ダッシュボード" |   dashboard: "ダッシュボード" | ||||||
|   all-users: "全てのユーザー" |   all-users: "全てのユーザー" | ||||||
|   original-users: "このインスタンスのユーザー" |   original-users: "このインスタンスのユーザー" | ||||||
|   all-notes: "全てのノート" |   all-notes: "全ての投稿" | ||||||
|   original-notes: "このインスタンスのノート" |   original-notes: "このインスタンスの投稿" | ||||||
|   invite: "招待" |   invite: "招待" | ||||||
| desktop/views/pages/admin/admin.suspend-user.vue: | desktop/views/pages/admin/admin.suspend-user.vue: | ||||||
|   suspend-user: "ユーザーの凍結" |   suspend-user: "ユーザーの凍結" | ||||||
| @@ -818,18 +845,6 @@ desktop/views/pages/admin/admin.unverify-user.vue: | |||||||
|   unverify-user: "ユーザーの公式アカウント解除" |   unverify-user: "ユーザーの公式アカウント解除" | ||||||
|   unverify: "公式アカウントを解除する" |   unverify: "公式アカウントを解除する" | ||||||
|   unverified: "公式アカウントを解除しました" |   unverified: "公式アカウントを解除しました" | ||||||
| desktop/views/pages/admin/admin.notes-chart.vue: |  | ||||||
|   title: "投稿" |  | ||||||
|   local: "ローカル" |  | ||||||
|   remote: "リモート" |  | ||||||
| desktop/views/pages/admin/admin.users-chart.vue: |  | ||||||
|   title: "ユーザー" |  | ||||||
|   local: "ローカル" |  | ||||||
|   remote: "リモート" |  | ||||||
| desktop/views/pages/admin/admin.drive-chart.vue: |  | ||||||
|   title: "ドライブ" |  | ||||||
|   local: "ローカル" |  | ||||||
|   remote: "リモート" |  | ||||||
| desktop/views/pages/deck/deck.tl-column.vue: | desktop/views/pages/deck/deck.tl-column.vue: | ||||||
|   is-media-only: "メディア投稿のみ" |   is-media-only: "メディア投稿のみ" | ||||||
|   is-media-view: "メディアビュー" |   is-media-view: "メディアビュー" | ||||||
| @@ -838,6 +853,11 @@ desktop/views/pages/deck/deck.note.vue: | |||||||
|   reposted-by: "{}がRenote" |   reposted-by: "{}がRenote" | ||||||
|   private: "この投稿は非公開です" |   private: "この投稿は非公開です" | ||||||
|   deleted: "この投稿は削除されました" |   deleted: "この投稿は削除されました" | ||||||
|  | desktop/views/pages/stats/stats.vue: | ||||||
|  |   all-users: "全てのユーザー" | ||||||
|  |   original-users: "このインスタンスのユーザー" | ||||||
|  |   all-notes: "全ての投稿" | ||||||
|  |   original-notes: "このインスタンスの投稿" | ||||||
| desktop/views/pages/welcome.vue: | desktop/views/pages/welcome.vue: | ||||||
|   about: "詳しく..." |   about: "詳しく..." | ||||||
|   gotit: "わかった" |   gotit: "わかった" | ||||||
| @@ -846,7 +866,10 @@ desktop/views/pages/welcome.vue: | |||||||
|   signin-button: "やってる" |   signin-button: "やってる" | ||||||
|   signup-button: "やる" |   signup-button: "やる" | ||||||
|   timeline: "タイムライン" |   timeline: "タイムライン" | ||||||
|  |   announcements: "お知らせ" | ||||||
|  |   photos: "最近の画像" | ||||||
|   powered-by-misskey: "Powered by <b>Misskey</b>." |   powered-by-misskey: "Powered by <b>Misskey</b>." | ||||||
|  |   info: "情報" | ||||||
| desktop/views/pages/drive.vue: | desktop/views/pages/drive.vue: | ||||||
|   title: "Misskey Drive" |   title: "Misskey Drive" | ||||||
| desktop/views/pages/favorites.vue: | desktop/views/pages/favorites.vue: | ||||||
| @@ -1044,6 +1067,7 @@ mobile/views/components/ui.nav.vue: | |||||||
|   game: "ゲーム" |   game: "ゲーム" | ||||||
|   darkmode: "ダークモード" |   darkmode: "ダークモード" | ||||||
|   settings: "設定" |   settings: "設定" | ||||||
|  |   admin: "管理" | ||||||
|   about: "Misskeyについて" |   about: "Misskeyについて" | ||||||
| mobile/views/components/user-timeline.vue: | mobile/views/components/user-timeline.vue: | ||||||
|   no-notes: "このユーザーは投稿していないようです。" |   no-notes: "このユーザーは投稿していないようです。" | ||||||
| @@ -1133,6 +1157,7 @@ mobile/views/pages/settings.vue: | |||||||
|   dark-mode: "ダークモード" |   dark-mode: "ダークモード" | ||||||
|   i-am-under-limited-internet: "私は通信を制限されている" |   i-am-under-limited-internet: "私は通信を制限されている" | ||||||
|   circle-icons: "円形のアイコンを使用" |   circle-icons: "円形のアイコンを使用" | ||||||
|  |   contrasted-acct: "ユーザー名にコントラストを付ける" | ||||||
|   timeline: "タイムライン" |   timeline: "タイムライン" | ||||||
|   show-reply-target: "リプライ先を表示する" |   show-reply-target: "リプライ先を表示する" | ||||||
|   show-my-renotes: "自分の行ったRenoteを表示する" |   show-my-renotes: "自分の行ったRenoteを表示する" | ||||||
| @@ -1141,6 +1166,9 @@ mobile/views/pages/settings.vue: | |||||||
|   post-style: "投稿の表示スタイル" |   post-style: "投稿の表示スタイル" | ||||||
|   post-style-standard: "標準" |   post-style-standard: "標準" | ||||||
|   post-style-smart: "スマート" |   post-style-smart: "スマート" | ||||||
|  |   notification-position: "通知の表示" | ||||||
|  |   notification-position-bottom: "下" | ||||||
|  |   notification-position-top: "上" | ||||||
|   behavior: "動作" |   behavior: "動作" | ||||||
|   fetch-on-scroll: "スクロールで自動読み込み" |   fetch-on-scroll: "スクロールで自動読み込み" | ||||||
|   disable-via-mobile: "「モバイルからの投稿」フラグを付けない" |   disable-via-mobile: "「モバイルからの投稿」フラグを付けない" | ||||||
| @@ -1161,6 +1189,8 @@ mobile/views/pages/settings.vue: | |||||||
|   update-available-desc: "ページを再度読み込みすると更新が適用されます。" |   update-available-desc: "ページを再度読み込みすると更新が適用されます。" | ||||||
|   settings: "設定" |   settings: "設定" | ||||||
|   signout: "サインアウト" |   signout: "サインアウト" | ||||||
|  |   sound: "サウンド" | ||||||
|  |   enable-sounds: "サウンドを有効にする" | ||||||
| mobile/views/pages/user.vue: | mobile/views/pages/user.vue: | ||||||
|   follows-you: "フォローされています" |   follows-you: "フォローされています" | ||||||
|   following: "フォロー" |   following: "フォロー" | ||||||
							
								
								
									
										1249
									
								
								locales/nl-NL.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1249
									
								
								locales/nl-NL.yml
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,6 +1,6 @@ | |||||||
| --- | --- | ||||||
| meta: | meta: | ||||||
|   lang: "日本語" |   lang: "norsk" | ||||||
|   divider: "" |   divider: "" | ||||||
| common: | common: | ||||||
|   misskey: "A ⭐ of fediverse" |   misskey: "A ⭐ of fediverse" | ||||||
| @@ -29,26 +29,26 @@ common: | |||||||
|     reply-from: "{}さんから返信:" |     reply-from: "{}さんから返信:" | ||||||
|     quoted-by: "{}さんが引用:" |     quoted-by: "{}さんが引用:" | ||||||
|   time: |   time: | ||||||
|     unknown: "なぞのじかん" |     unknown: "ukjent" | ||||||
|     future: "未来" |     future: "fremtidig" | ||||||
|     just_now: "たった今" |     just_now: "akkurat nå" | ||||||
|     seconds_ago: "{}秒前" |     seconds_ago: "{} sekunder siden" | ||||||
|     minutes_ago: "{}分前" |     minutes_ago: "{} minutter siden" | ||||||
|     hours_ago: "{}時間前" |     hours_ago: "{} time siden" | ||||||
|     days_ago: "{}日前" |     days_ago: "{} dag siden" | ||||||
|     weeks_ago: "{}週間前" |     weeks_ago: "{} uke(r) siden" | ||||||
|     months_ago: "{}ヶ月前" |     months_ago: "{} måned(er) siden" | ||||||
|     years_ago: "{}年前" |     years_ago: "{} år siden" | ||||||
|   month-and-day: "{month}月 {day}日" |   month-and-day: "{month}月 {day}日" | ||||||
|   trash: "ゴミ箱" |   trash: "ゴミ箱" | ||||||
|   weekday-short: |   weekday-short: | ||||||
|     sunday: "日" |     sunday: "S" | ||||||
|     monday: "月" |     monday: "M" | ||||||
|     tuesday: "火" |     tuesday: "T" | ||||||
|     wednesday: "水" |     wednesday: "O" | ||||||
|     thursday: "木" |     thursday: "T" | ||||||
|     friday: "金" |     friday: "F" | ||||||
|     saturday: "土" |     saturday: "L" | ||||||
|   weekday: |   weekday: | ||||||
|     sunday: "日曜日" |     sunday: "日曜日" | ||||||
|     monday: "月曜日" |     monday: "月曜日" | ||||||
| @@ -58,14 +58,14 @@ common: | |||||||
|     friday: "金曜日" |     friday: "金曜日" | ||||||
|     saturday: "土曜日" |     saturday: "土曜日" | ||||||
|   reactions: |   reactions: | ||||||
|     like: "ええやん" |     like: "Lik" | ||||||
|     love: "しゅき" |     love: "Elsk" | ||||||
|     laugh: "笑" |     laugh: "Le" | ||||||
|     hmm: "ふぅ~む" |     hmm: "Hmm…?" | ||||||
|     surprise: "わお" |     surprise: "Wow" | ||||||
|     congrats: "おめでとう" |     congrats: "Gratulerer!" | ||||||
|     angry: "おこ" |     angry: "Sint" | ||||||
|     confused: "こまこまのこまり" |     confused: "Forvirret" | ||||||
|     rip: "RIP" |     rip: "RIP" | ||||||
|     pudding: "Pudding" |     pudding: "Pudding" | ||||||
|   note-placeholders: |   note-placeholders: | ||||||
| @@ -80,12 +80,14 @@ common: | |||||||
|   loading: "読み込み中" |   loading: "読み込み中" | ||||||
|   ok: "わかった" |   ok: "わかった" | ||||||
|   update-available-title: "更新があります" |   update-available-title: "更新があります" | ||||||
|   update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。" |   update-available: "En ny versjon av Misskey er nå tilgjengelig ({newer}, nåværende versjon er {current}). Last inn siden igjen for at oppdateringen skal tre i kraft." | ||||||
|   my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。" |   my-token-regenerated: "Ditt synbol har blitt generert. Du vil nå bli utlogget." | ||||||
|   i-like-sushi: "私は(プリンよりむしろ)寿司が好き" |   i-like-sushi: "私は(プリンよりむしろ)寿司が好き" | ||||||
|   show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示" |   show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示" | ||||||
|  |   use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける" | ||||||
|   verified-user: "公式アカウント" |   verified-user: "公式アカウント" | ||||||
|   disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" |   disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" | ||||||
|  |   do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' | ||||||
|   reversi: |   reversi: | ||||||
|     drawn: "引き分け" |     drawn: "引き分け" | ||||||
|     my-turn: "あなたのターンです" |     my-turn: "あなたのターンです" | ||||||
| @@ -206,8 +208,8 @@ common/views/components/games/reversi/reversi.room.vue: | |||||||
|   ready: "準備完了" |   ready: "準備完了" | ||||||
|   cancel-ready: "準備続行" |   cancel-ready: "準備続行" | ||||||
| common/views/components/connect-failed.vue: | common/views/components/connect-failed.vue: | ||||||
|   title: "サーバーに接続できません" |   title: "Kunne ikke koble til tjeneren." | ||||||
|   description: "インターネット回線に問題があるか、サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから{再度お試し}ください。" |   description: "Det er enten et problem med internettilknytningen din, eller så har tjeneren blitt tatt ned for vedlikehold. {Prøv igjen} senere." | ||||||
|   thanks: "いつもMisskeyをご利用いただきありがとうございます。" |   thanks: "いつもMisskeyをご利用いただきありがとうございます。" | ||||||
|   troubleshoot: "トラブルシュート" |   troubleshoot: "トラブルシュート" | ||||||
| common/views/components/connect-failed.troubleshooter.vue: | common/views/components/connect-failed.troubleshooter.vue: | ||||||
| @@ -259,6 +261,8 @@ common/views/components/nav.vue: | |||||||
|   develop: "開発者" |   develop: "開発者" | ||||||
|   feedback: "フィードバック" |   feedback: "フィードバック" | ||||||
| common/views/components/note-menu.vue: | common/views/components/note-menu.vue: | ||||||
|  |   detail: "詳細" | ||||||
|  |   copy-link: "リンクをコピー" | ||||||
|   favorite: "お気に入り" |   favorite: "お気に入り" | ||||||
|   pin: "ピン留め" |   pin: "ピン留め" | ||||||
|   delete: "削除" |   delete: "削除" | ||||||
| @@ -336,6 +340,9 @@ common/views/components/visibility-chooser.vue: | |||||||
|   specified: "ダイレクト" |   specified: "ダイレクト" | ||||||
|   specified-desc: "指定したユーザーにのみ公開" |   specified-desc: "指定したユーザーにのみ公開" | ||||||
|   private: "非公開" |   private: "非公開" | ||||||
|  | common/views/components/trends.vue: | ||||||
|  |   count: "{}人が投稿" | ||||||
|  |   empty: "トレンドなし" | ||||||
| common/views/widgets/broadcast.vue: | common/views/widgets/broadcast.vue: | ||||||
|   fetching: "確認中" |   fetching: "確認中" | ||||||
|   no-broadcasts: "お知らせはありません" |   no-broadcasts: "お知らせはありません" | ||||||
| @@ -359,8 +366,6 @@ common/views/widgets/posts-monitor.vue: | |||||||
|   toggle: "表示を切り替え" |   toggle: "表示を切り替え" | ||||||
| common/views/widgets/hashtags.vue: | common/views/widgets/hashtags.vue: | ||||||
|   title: "ハッシュタグ" |   title: "ハッシュタグ" | ||||||
|   count: "{}人が投稿" |  | ||||||
|   empty: "トレンドなし" |  | ||||||
| common/views/widgets/server.vue: | common/views/widgets/server.vue: | ||||||
|   title: "サーバー情報" |   title: "サーバー情報" | ||||||
|   toggle: "表示を切り替え" |   toggle: "表示を切り替え" | ||||||
| @@ -410,6 +415,7 @@ desktop: | |||||||
|   uploading-avatar: "新しいアバターをアップロードしています" |   uploading-avatar: "新しいアバターをアップロードしています" | ||||||
|   avatar-updated: "アバターを更新しました" |   avatar-updated: "アバターを更新しました" | ||||||
|   choose-avatar: "アバターにする画像を選択" |   choose-avatar: "アバターにする画像を選択" | ||||||
|  |   invalid-filetype: "この形式のファイルはサポートされていません" | ||||||
| desktop/views/components/activity.chart.vue: | desktop/views/components/activity.chart.vue: | ||||||
|   total: "Black ... Total" |   total: "Black ... Total" | ||||||
|   notes: "Blue ... Notes" |   notes: "Blue ... Notes" | ||||||
| @@ -423,6 +429,24 @@ desktop/views/components/calendar.vue: | |||||||
|   prev: "前の月" |   prev: "前の月" | ||||||
|   next: "次の月" |   next: "次の月" | ||||||
|   go: "クリックして時間遡行" |   go: "クリックして時間遡行" | ||||||
|  | desktop/views/components/charts.vue: | ||||||
|  |   title: "チャート" | ||||||
|  |   per-day: "1日ごと" | ||||||
|  |   per-hour: "1時間ごと" | ||||||
|  |   notes: "投稿" | ||||||
|  |   users: "ユーザー" | ||||||
|  |   drive: "ドライブ" | ||||||
|  |   charts: | ||||||
|  |     notes: "投稿の増減 (統合)" | ||||||
|  |     local-notes: "投稿の増減 (ローカル)" | ||||||
|  |     remote-notes: "投稿の増減 (リモート)" | ||||||
|  |     notes-total: "投稿の累計" | ||||||
|  |     users: "ユーザーの増減" | ||||||
|  |     users-total: "ユーザーの累計" | ||||||
|  |     drive: "ドライブ使用量の増減" | ||||||
|  |     drive-total: "ドライブ使用量の累計" | ||||||
|  |     drive-files: "ドライブのファイル数の増減" | ||||||
|  |     drive-files-total: "ドライブのファイル数の累計" | ||||||
| desktop/views/components/choose-file-from-drive-window.vue: | desktop/views/components/choose-file-from-drive-window.vue: | ||||||
|   choose-file: "ファイル選択中" |   choose-file: "ファイル選択中" | ||||||
|   upload: "PCからドライブにファイルをアップロード" |   upload: "PCからドライブにファイルをアップロード" | ||||||
| @@ -627,9 +651,11 @@ desktop/views/components/settings.vue: | |||||||
|   delete-wallpaper: "壁紙を削除" |   delete-wallpaper: "壁紙を削除" | ||||||
|   dark-mode: "ダークモード" |   dark-mode: "ダークモード" | ||||||
|   circle-icons: "円形のアイコンを使用" |   circle-icons: "円形のアイコンを使用" | ||||||
|  |   contrasted-acct: "ユーザー名にコントラストを付ける" | ||||||
|   gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用" |   gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用" | ||||||
|   post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" |   post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" | ||||||
|   suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" |   suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" | ||||||
|  |   show-clock-on-header: "右上に時計を表示する" | ||||||
|   show-reply-target: "リプライ先を表示する" |   show-reply-target: "リプライ先を表示する" | ||||||
|   show-my-renotes: "自分の行ったRenoteをタイムラインに表示する" |   show-my-renotes: "自分の行ったRenoteをタイムラインに表示する" | ||||||
|   show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" |   show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" | ||||||
| @@ -754,6 +780,7 @@ desktop/views/components/ui.header.account.vue: | |||||||
|   lists: "リスト" |   lists: "リスト" | ||||||
|   follow-requests: "フォロー申請" |   follow-requests: "フォロー申請" | ||||||
|   customize: "ホームのカスタマイズ" |   customize: "ホームのカスタマイズ" | ||||||
|  |   admin: "管理" | ||||||
|   settings: "設定" |   settings: "設定" | ||||||
|   signout: "サインアウト" |   signout: "サインアウト" | ||||||
|   dark: "闇に飲まれる" |   dark: "闇に飲まれる" | ||||||
| @@ -799,8 +826,8 @@ desktop/views/pages/admin/admin.dashboard.vue: | |||||||
|   dashboard: "ダッシュボード" |   dashboard: "ダッシュボード" | ||||||
|   all-users: "全てのユーザー" |   all-users: "全てのユーザー" | ||||||
|   original-users: "このインスタンスのユーザー" |   original-users: "このインスタンスのユーザー" | ||||||
|   all-notes: "全てのノート" |   all-notes: "全ての投稿" | ||||||
|   original-notes: "このインスタンスのノート" |   original-notes: "このインスタンスの投稿" | ||||||
|   invite: "招待" |   invite: "招待" | ||||||
| desktop/views/pages/admin/admin.suspend-user.vue: | desktop/views/pages/admin/admin.suspend-user.vue: | ||||||
|   suspend-user: "ユーザーの凍結" |   suspend-user: "ユーザーの凍結" | ||||||
| @@ -818,18 +845,6 @@ desktop/views/pages/admin/admin.unverify-user.vue: | |||||||
|   unverify-user: "ユーザーの公式アカウント解除" |   unverify-user: "ユーザーの公式アカウント解除" | ||||||
|   unverify: "公式アカウントを解除する" |   unverify: "公式アカウントを解除する" | ||||||
|   unverified: "公式アカウントを解除しました" |   unverified: "公式アカウントを解除しました" | ||||||
| desktop/views/pages/admin/admin.notes-chart.vue: |  | ||||||
|   title: "投稿" |  | ||||||
|   local: "ローカル" |  | ||||||
|   remote: "リモート" |  | ||||||
| desktop/views/pages/admin/admin.users-chart.vue: |  | ||||||
|   title: "ユーザー" |  | ||||||
|   local: "ローカル" |  | ||||||
|   remote: "リモート" |  | ||||||
| desktop/views/pages/admin/admin.drive-chart.vue: |  | ||||||
|   title: "ドライブ" |  | ||||||
|   local: "ローカル" |  | ||||||
|   remote: "リモート" |  | ||||||
| desktop/views/pages/deck/deck.tl-column.vue: | desktop/views/pages/deck/deck.tl-column.vue: | ||||||
|   is-media-only: "メディア投稿のみ" |   is-media-only: "メディア投稿のみ" | ||||||
|   is-media-view: "メディアビュー" |   is-media-view: "メディアビュー" | ||||||
| @@ -838,6 +853,11 @@ desktop/views/pages/deck/deck.note.vue: | |||||||
|   reposted-by: "{}がRenote" |   reposted-by: "{}がRenote" | ||||||
|   private: "この投稿は非公開です" |   private: "この投稿は非公開です" | ||||||
|   deleted: "この投稿は削除されました" |   deleted: "この投稿は削除されました" | ||||||
|  | desktop/views/pages/stats/stats.vue: | ||||||
|  |   all-users: "全てのユーザー" | ||||||
|  |   original-users: "このインスタンスのユーザー" | ||||||
|  |   all-notes: "全ての投稿" | ||||||
|  |   original-notes: "このインスタンスの投稿" | ||||||
| desktop/views/pages/welcome.vue: | desktop/views/pages/welcome.vue: | ||||||
|   about: "詳しく..." |   about: "詳しく..." | ||||||
|   gotit: "わかった" |   gotit: "わかった" | ||||||
| @@ -846,7 +866,10 @@ desktop/views/pages/welcome.vue: | |||||||
|   signin-button: "やってる" |   signin-button: "やってる" | ||||||
|   signup-button: "やる" |   signup-button: "やる" | ||||||
|   timeline: "タイムライン" |   timeline: "タイムライン" | ||||||
|  |   announcements: "お知らせ" | ||||||
|  |   photos: "最近の画像" | ||||||
|   powered-by-misskey: "Powered by <b>Misskey</b>." |   powered-by-misskey: "Powered by <b>Misskey</b>." | ||||||
|  |   info: "情報" | ||||||
| desktop/views/pages/drive.vue: | desktop/views/pages/drive.vue: | ||||||
|   title: "Misskey Drive" |   title: "Misskey Drive" | ||||||
| desktop/views/pages/favorites.vue: | desktop/views/pages/favorites.vue: | ||||||
| @@ -1044,6 +1067,7 @@ mobile/views/components/ui.nav.vue: | |||||||
|   game: "ゲーム" |   game: "ゲーム" | ||||||
|   darkmode: "ダークモード" |   darkmode: "ダークモード" | ||||||
|   settings: "設定" |   settings: "設定" | ||||||
|  |   admin: "管理" | ||||||
|   about: "Misskeyについて" |   about: "Misskeyについて" | ||||||
| mobile/views/components/user-timeline.vue: | mobile/views/components/user-timeline.vue: | ||||||
|   no-notes: "このユーザーは投稿していないようです。" |   no-notes: "このユーザーは投稿していないようです。" | ||||||
| @@ -1133,6 +1157,7 @@ mobile/views/pages/settings.vue: | |||||||
|   dark-mode: "ダークモード" |   dark-mode: "ダークモード" | ||||||
|   i-am-under-limited-internet: "私は通信を制限されている" |   i-am-under-limited-internet: "私は通信を制限されている" | ||||||
|   circle-icons: "円形のアイコンを使用" |   circle-icons: "円形のアイコンを使用" | ||||||
|  |   contrasted-acct: "ユーザー名にコントラストを付ける" | ||||||
|   timeline: "タイムライン" |   timeline: "タイムライン" | ||||||
|   show-reply-target: "リプライ先を表示する" |   show-reply-target: "リプライ先を表示する" | ||||||
|   show-my-renotes: "自分の行ったRenoteを表示する" |   show-my-renotes: "自分の行ったRenoteを表示する" | ||||||
| @@ -1141,6 +1166,9 @@ mobile/views/pages/settings.vue: | |||||||
|   post-style: "投稿の表示スタイル" |   post-style: "投稿の表示スタイル" | ||||||
|   post-style-standard: "標準" |   post-style-standard: "標準" | ||||||
|   post-style-smart: "スマート" |   post-style-smart: "スマート" | ||||||
|  |   notification-position: "通知の表示" | ||||||
|  |   notification-position-bottom: "下" | ||||||
|  |   notification-position-top: "上" | ||||||
|   behavior: "動作" |   behavior: "動作" | ||||||
|   fetch-on-scroll: "スクロールで自動読み込み" |   fetch-on-scroll: "スクロールで自動読み込み" | ||||||
|   disable-via-mobile: "「モバイルからの投稿」フラグを付けない" |   disable-via-mobile: "「モバイルからの投稿」フラグを付けない" | ||||||
| @@ -1161,6 +1189,8 @@ mobile/views/pages/settings.vue: | |||||||
|   update-available-desc: "ページを再度読み込みすると更新が適用されます。" |   update-available-desc: "ページを再度読み込みすると更新が適用されます。" | ||||||
|   settings: "設定" |   settings: "設定" | ||||||
|   signout: "サインアウト" |   signout: "サインアウト" | ||||||
|  |   sound: "サウンド" | ||||||
|  |   enable-sounds: "サウンドを有効にする" | ||||||
| mobile/views/pages/user.vue: | mobile/views/pages/user.vue: | ||||||
|   follows-you: "フォローされています" |   follows-you: "フォローされています" | ||||||
|   following: "フォロー" |   following: "フォロー" | ||||||
| @@ -58,7 +58,7 @@ common: | |||||||
|     friday: "Piątek" |     friday: "Piątek" | ||||||
|     saturday: "Sobota" |     saturday: "Sobota" | ||||||
|   reactions: |   reactions: | ||||||
|     like: "Lubię" |     like: "いいね" | ||||||
|     love: "Kocham" |     love: "Kocham" | ||||||
|     laugh: "Śmieszne" |     laugh: "Śmieszne" | ||||||
|     hmm: "Hmm…?" |     hmm: "Hmm…?" | ||||||
| @@ -84,8 +84,10 @@ common: | |||||||
|   my-token-regenerated: "Twój token został wygenerowany. Zostaniesz wylogowany." |   my-token-regenerated: "Twój token został wygenerowany. Zostaniesz wylogowany." | ||||||
|   i-like-sushi: "Wolę sushi od puddingu" |   i-like-sushi: "Wolę sushi od puddingu" | ||||||
|   show-reversi-board-labels: "Pokazuj podpisy wierszy i kolumn w Reversi" |   show-reversi-board-labels: "Pokazuj podpisy wierszy i kolumn w Reversi" | ||||||
|  |   use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける" | ||||||
|   verified-user: "公式アカウント" |   verified-user: "公式アカウント" | ||||||
|   disable-animated-mfm: "Wyłącz animowany tekst we wpisach" |   disable-animated-mfm: "Wyłącz animowany tekst we wpisach" | ||||||
|  |   do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' | ||||||
|   reversi: |   reversi: | ||||||
|     drawn: "Remis" |     drawn: "Remis" | ||||||
|     my-turn: "Twoja kolej" |     my-turn: "Twoja kolej" | ||||||
| @@ -259,6 +261,8 @@ common/views/components/nav.vue: | |||||||
|   develop: "Autorzy" |   develop: "Autorzy" | ||||||
|   feedback: "Podziel się opinią" |   feedback: "Podziel się opinią" | ||||||
| common/views/components/note-menu.vue: | common/views/components/note-menu.vue: | ||||||
|  |   detail: "詳細" | ||||||
|  |   copy-link: "リンクをコピー" | ||||||
|   favorite: "Dodaj do ulubionych" |   favorite: "Dodaj do ulubionych" | ||||||
|   pin: "Przypnij do profilu" |   pin: "Przypnij do profilu" | ||||||
|   delete: "Usuń" |   delete: "Usuń" | ||||||
| @@ -336,6 +340,9 @@ common/views/components/visibility-chooser.vue: | |||||||
|   specified: "Bezpośredni" |   specified: "Bezpośredni" | ||||||
|   specified-desc: "Tylko dla określonych użytkowników" |   specified-desc: "Tylko dla określonych użytkowników" | ||||||
|   private: "Prywatny" |   private: "Prywatny" | ||||||
|  | common/views/components/trends.vue: | ||||||
|  |   count: "{}人が投稿" | ||||||
|  |   empty: "トレンドなし" | ||||||
| common/views/widgets/broadcast.vue: | common/views/widgets/broadcast.vue: | ||||||
|   fetching: "Sprawdzanie" |   fetching: "Sprawdzanie" | ||||||
|   no-broadcasts: "Brak transmisji" |   no-broadcasts: "Brak transmisji" | ||||||
| @@ -359,8 +366,6 @@ common/views/widgets/posts-monitor.vue: | |||||||
|   toggle: "Przełącz widok" |   toggle: "Przełącz widok" | ||||||
| common/views/widgets/hashtags.vue: | common/views/widgets/hashtags.vue: | ||||||
|   title: "Hashtagi" |   title: "Hashtagi" | ||||||
|   count: "Wspomniany przez {} użytkowników" |  | ||||||
|   empty: "Brak popularnych hashtagów" |  | ||||||
| common/views/widgets/server.vue: | common/views/widgets/server.vue: | ||||||
|   title: "Informacje o serwerze" |   title: "Informacje o serwerze" | ||||||
|   toggle: "Przełącz widok" |   toggle: "Przełącz widok" | ||||||
| @@ -410,6 +415,7 @@ desktop: | |||||||
|   uploading-avatar: "Wysyłanie awatara" |   uploading-avatar: "Wysyłanie awatara" | ||||||
|   avatar-updated: "Wysłano awatar" |   avatar-updated: "Wysłano awatar" | ||||||
|   choose-avatar: "Wybierz awatar" |   choose-avatar: "Wybierz awatar" | ||||||
|  |   invalid-filetype: "この形式のファイルはサポートされていません" | ||||||
| desktop/views/components/activity.chart.vue: | desktop/views/components/activity.chart.vue: | ||||||
|   total: "Czarny … Łącznie" |   total: "Czarny … Łącznie" | ||||||
|   notes: "Niebieski … Wpisy" |   notes: "Niebieski … Wpisy" | ||||||
| @@ -423,6 +429,24 @@ desktop/views/components/calendar.vue: | |||||||
|   prev: "Poprzedni miesiąc" |   prev: "Poprzedni miesiąc" | ||||||
|   next: "Następny miesiąc" |   next: "Następny miesiąc" | ||||||
|   go: "Naciśnij, aby przejść" |   go: "Naciśnij, aby przejść" | ||||||
|  | desktop/views/components/charts.vue: | ||||||
|  |   title: "チャート" | ||||||
|  |   per-day: "1日ごと" | ||||||
|  |   per-hour: "1時間ごと" | ||||||
|  |   notes: "投稿" | ||||||
|  |   users: "ユーザー" | ||||||
|  |   drive: "ドライブ" | ||||||
|  |   charts: | ||||||
|  |     notes: "投稿の増減 (統合)" | ||||||
|  |     local-notes: "投稿の増減 (ローカル)" | ||||||
|  |     remote-notes: "投稿の増減 (リモート)" | ||||||
|  |     notes-total: "投稿の累計" | ||||||
|  |     users: "ユーザーの増減" | ||||||
|  |     users-total: "ユーザーの累計" | ||||||
|  |     drive: "ドライブ使用量の増減" | ||||||
|  |     drive-total: "ドライブ使用量の累計" | ||||||
|  |     drive-files: "ドライブのファイル数の増減" | ||||||
|  |     drive-files-total: "ドライブのファイル数の累計" | ||||||
| desktop/views/components/choose-file-from-drive-window.vue: | desktop/views/components/choose-file-from-drive-window.vue: | ||||||
|   choose-file: "Wybierz plik" |   choose-file: "Wybierz plik" | ||||||
|   upload: "Wyślij pliki z Twojego komputera" |   upload: "Wyślij pliki z Twojego komputera" | ||||||
| @@ -627,9 +651,11 @@ desktop/views/components/settings.vue: | |||||||
|   delete-wallpaper: "Usuń tło" |   delete-wallpaper: "Usuń tło" | ||||||
|   dark-mode: "Tryb ciemny" |   dark-mode: "Tryb ciemny" | ||||||
|   circle-icons: "Używaj okrągłych ikon" |   circle-icons: "Używaj okrągłych ikon" | ||||||
|  |   contrasted-acct: "ユーザー名にコントラストを付ける" | ||||||
|   gradient-window-header: "Używaj gradientów na pasku tytułu okna" |   gradient-window-header: "Używaj gradientów na pasku tytułu okna" | ||||||
|   post-form-on-timeline: "Wyświetlaj formularz tworzenia wpisu w górnej części osi czasu" |   post-form-on-timeline: "Wyświetlaj formularz tworzenia wpisu w górnej części osi czasu" | ||||||
|   suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" |   suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" | ||||||
|  |   show-clock-on-header: "右上に時計を表示する" | ||||||
|   show-reply-target: "Pokazuj cel odpowiedzi" |   show-reply-target: "Pokazuj cel odpowiedzi" | ||||||
|   show-my-renotes: "Pokazuj moje udostępnienia na osi czasu" |   show-my-renotes: "Pokazuj moje udostępnienia na osi czasu" | ||||||
|   show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" |   show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" | ||||||
| @@ -754,6 +780,7 @@ desktop/views/components/ui.header.account.vue: | |||||||
|   lists: "Listy" |   lists: "Listy" | ||||||
|   follow-requests: "Prośby o śledzenie" |   follow-requests: "Prośby o śledzenie" | ||||||
|   customize: "Dostosuj stronę główną" |   customize: "Dostosuj stronę główną" | ||||||
|  |   admin: "管理" | ||||||
|   settings: "Ustawienia" |   settings: "Ustawienia" | ||||||
|   signout: "Wyloguj się" |   signout: "Wyloguj się" | ||||||
|   dark: "Sprowadź ciemność" |   dark: "Sprowadź ciemność" | ||||||
| @@ -799,8 +826,8 @@ desktop/views/pages/admin/admin.dashboard.vue: | |||||||
|   dashboard: "ダッシュボード" |   dashboard: "ダッシュボード" | ||||||
|   all-users: "全てのユーザー" |   all-users: "全てのユーザー" | ||||||
|   original-users: "このインスタンスのユーザー" |   original-users: "このインスタンスのユーザー" | ||||||
|   all-notes: "全てのノート" |   all-notes: "全ての投稿" | ||||||
|   original-notes: "このインスタンスのノート" |   original-notes: "このインスタンスの投稿" | ||||||
|   invite: "招待" |   invite: "招待" | ||||||
| desktop/views/pages/admin/admin.suspend-user.vue: | desktop/views/pages/admin/admin.suspend-user.vue: | ||||||
|   suspend-user: "ユーザーの凍結" |   suspend-user: "ユーザーの凍結" | ||||||
| @@ -818,18 +845,6 @@ desktop/views/pages/admin/admin.unverify-user.vue: | |||||||
|   unverify-user: "ユーザーの公式アカウント解除" |   unverify-user: "ユーザーの公式アカウント解除" | ||||||
|   unverify: "公式アカウントを解除する" |   unverify: "公式アカウントを解除する" | ||||||
|   unverified: "公式アカウントを解除しました" |   unverified: "公式アカウントを解除しました" | ||||||
| desktop/views/pages/admin/admin.notes-chart.vue: |  | ||||||
|   title: "投稿" |  | ||||||
|   local: "ローカル" |  | ||||||
|   remote: "リモート" |  | ||||||
| desktop/views/pages/admin/admin.users-chart.vue: |  | ||||||
|   title: "ユーザー" |  | ||||||
|   local: "ローカル" |  | ||||||
|   remote: "リモート" |  | ||||||
| desktop/views/pages/admin/admin.drive-chart.vue: |  | ||||||
|   title: "ドライブ" |  | ||||||
|   local: "ローカル" |  | ||||||
|   remote: "リモート" |  | ||||||
| desktop/views/pages/deck/deck.tl-column.vue: | desktop/views/pages/deck/deck.tl-column.vue: | ||||||
|   is-media-only: "Tylko wpisy z zawartością multimedialną" |   is-media-only: "Tylko wpisy z zawartością multimedialną" | ||||||
|   is-media-view: "Widok multimediów" |   is-media-view: "Widok multimediów" | ||||||
| @@ -838,6 +853,11 @@ desktop/views/pages/deck/deck.note.vue: | |||||||
|   reposted-by: "Udostępniono przez {}" |   reposted-by: "Udostępniono przez {}" | ||||||
|   private: "ten wpis jest prywatny" |   private: "ten wpis jest prywatny" | ||||||
|   deleted: "ten wpis został usunięty" |   deleted: "ten wpis został usunięty" | ||||||
|  | desktop/views/pages/stats/stats.vue: | ||||||
|  |   all-users: "全てのユーザー" | ||||||
|  |   original-users: "このインスタンスのユーザー" | ||||||
|  |   all-notes: "全ての投稿" | ||||||
|  |   original-notes: "このインスタンスの投稿" | ||||||
| desktop/views/pages/welcome.vue: | desktop/views/pages/welcome.vue: | ||||||
|   about: "O Misskey" |   about: "O Misskey" | ||||||
|   gotit: "Rozumiem!" |   gotit: "Rozumiem!" | ||||||
| @@ -846,7 +866,10 @@ desktop/views/pages/welcome.vue: | |||||||
|   signin-button: "Zaloguj się" |   signin-button: "Zaloguj się" | ||||||
|   signup-button: "Zarejestruj się" |   signup-button: "Zarejestruj się" | ||||||
|   timeline: "Oś czasu" |   timeline: "Oś czasu" | ||||||
|  |   announcements: "お知らせ" | ||||||
|  |   photos: "最近の画像" | ||||||
|   powered-by-misskey: "Oparto o <b>Misskey</b>." |   powered-by-misskey: "Oparto o <b>Misskey</b>." | ||||||
|  |   info: "情報" | ||||||
| desktop/views/pages/drive.vue: | desktop/views/pages/drive.vue: | ||||||
|   title: "Dysk Misskey" |   title: "Dysk Misskey" | ||||||
| desktop/views/pages/favorites.vue: | desktop/views/pages/favorites.vue: | ||||||
| @@ -1044,6 +1067,7 @@ mobile/views/components/ui.nav.vue: | |||||||
|   game: "Gry" |   game: "Gry" | ||||||
|   darkmode: "Tryb ciemny" |   darkmode: "Tryb ciemny" | ||||||
|   settings: "Ustawienia" |   settings: "Ustawienia" | ||||||
|  |   admin: "管理" | ||||||
|   about: "O Misskey" |   about: "O Misskey" | ||||||
| mobile/views/components/user-timeline.vue: | mobile/views/components/user-timeline.vue: | ||||||
|   no-notes: "Wygląda na to, że ten użytkownik nie opublikował jeszcze niczego" |   no-notes: "Wygląda na to, że ten użytkownik nie opublikował jeszcze niczego" | ||||||
| @@ -1133,6 +1157,7 @@ mobile/views/pages/settings.vue: | |||||||
|   dark-mode: "Tryb ciemny" |   dark-mode: "Tryb ciemny" | ||||||
|   i-am-under-limited-internet: "Ograniczaj zużycie transferu" |   i-am-under-limited-internet: "Ograniczaj zużycie transferu" | ||||||
|   circle-icons: "Używaj okrągłych ikon" |   circle-icons: "Używaj okrągłych ikon" | ||||||
|  |   contrasted-acct: "ユーザー名にコントラストを付ける" | ||||||
|   timeline: "Oś czasu" |   timeline: "Oś czasu" | ||||||
|   show-reply-target: "Pokazuj cel odpowiedzi" |   show-reply-target: "Pokazuj cel odpowiedzi" | ||||||
|   show-my-renotes: "Pokazuj moje udostępnienia" |   show-my-renotes: "Pokazuj moje udostępnienia" | ||||||
| @@ -1141,6 +1166,9 @@ mobile/views/pages/settings.vue: | |||||||
|   post-style: "Styl wpisów" |   post-style: "Styl wpisów" | ||||||
|   post-style-standard: "Standardowy" |   post-style-standard: "Standardowy" | ||||||
|   post-style-smart: "Inteligentny" |   post-style-smart: "Inteligentny" | ||||||
|  |   notification-position: "通知の表示" | ||||||
|  |   notification-position-bottom: "下" | ||||||
|  |   notification-position-top: "上" | ||||||
|   behavior: "Zachowanie" |   behavior: "Zachowanie" | ||||||
|   fetch-on-scroll: "Automatycznie ładuj po przeciągnięciu w dół" |   fetch-on-scroll: "Automatycznie ładuj po przeciągnięciu w dół" | ||||||
|   disable-via-mobile: "Nie oznaczaj wpisów jako „wysłane z telefonu”" |   disable-via-mobile: "Nie oznaczaj wpisów jako „wysłane z telefonu”" | ||||||
| @@ -1161,6 +1189,8 @@ mobile/views/pages/settings.vue: | |||||||
|   update-available-desc: "Odśwież stronę, aby zastosować aktualizację." |   update-available-desc: "Odśwież stronę, aby zastosować aktualizację." | ||||||
|   settings: "Ustawienia" |   settings: "Ustawienia" | ||||||
|   signout: "Wyloguj" |   signout: "Wyloguj" | ||||||
|  |   sound: "サウンド" | ||||||
|  |   enable-sounds: "サウンドを有効にする" | ||||||
| mobile/views/pages/user.vue: | mobile/views/pages/user.vue: | ||||||
|   follows-you: "Śledzi Cię" |   follows-you: "Śledzi Cię" | ||||||
|   following: "Śledzeni" |   following: "Śledzeni" | ||||||
							
								
								
									
										1249
									
								
								locales/pt-PT.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1249
									
								
								locales/pt-PT.yml
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -84,8 +84,10 @@ common: | |||||||
|   my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。" |   my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。" | ||||||
|   i-like-sushi: "私は(プリンよりむしろ)寿司が好き" |   i-like-sushi: "私は(プリンよりむしろ)寿司が好き" | ||||||
|   show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示" |   show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示" | ||||||
|  |   use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける" | ||||||
|   verified-user: "公式アカウント" |   verified-user: "公式アカウント" | ||||||
|   disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" |   disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" | ||||||
|  |   do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' | ||||||
|   reversi: |   reversi: | ||||||
|     drawn: "引き分け" |     drawn: "引き分け" | ||||||
|     my-turn: "あなたのターンです" |     my-turn: "あなたのターンです" | ||||||
| @@ -259,6 +261,8 @@ common/views/components/nav.vue: | |||||||
|   develop: "開発者" |   develop: "開発者" | ||||||
|   feedback: "フィードバック" |   feedback: "フィードバック" | ||||||
| common/views/components/note-menu.vue: | common/views/components/note-menu.vue: | ||||||
|  |   detail: "詳細" | ||||||
|  |   copy-link: "リンクをコピー" | ||||||
|   favorite: "お気に入り" |   favorite: "お気に入り" | ||||||
|   pin: "ピン留め" |   pin: "ピン留め" | ||||||
|   delete: "削除" |   delete: "削除" | ||||||
| @@ -336,6 +340,9 @@ common/views/components/visibility-chooser.vue: | |||||||
|   specified: "ダイレクト" |   specified: "ダイレクト" | ||||||
|   specified-desc: "指定したユーザーにのみ公開" |   specified-desc: "指定したユーザーにのみ公開" | ||||||
|   private: "非公開" |   private: "非公開" | ||||||
|  | common/views/components/trends.vue: | ||||||
|  |   count: "{}人が投稿" | ||||||
|  |   empty: "トレンドなし" | ||||||
| common/views/widgets/broadcast.vue: | common/views/widgets/broadcast.vue: | ||||||
|   fetching: "確認中" |   fetching: "確認中" | ||||||
|   no-broadcasts: "お知らせはありません" |   no-broadcasts: "お知らせはありません" | ||||||
| @@ -359,8 +366,6 @@ common/views/widgets/posts-monitor.vue: | |||||||
|   toggle: "表示を切り替え" |   toggle: "表示を切り替え" | ||||||
| common/views/widgets/hashtags.vue: | common/views/widgets/hashtags.vue: | ||||||
|   title: "ハッシュタグ" |   title: "ハッシュタグ" | ||||||
|   count: "{}人が投稿" |  | ||||||
|   empty: "トレンドなし" |  | ||||||
| common/views/widgets/server.vue: | common/views/widgets/server.vue: | ||||||
|   title: "サーバー情報" |   title: "サーバー情報" | ||||||
|   toggle: "表示を切り替え" |   toggle: "表示を切り替え" | ||||||
| @@ -410,6 +415,7 @@ desktop: | |||||||
|   uploading-avatar: "新しいアバターをアップロードしています" |   uploading-avatar: "新しいアバターをアップロードしています" | ||||||
|   avatar-updated: "アバターを更新しました" |   avatar-updated: "アバターを更新しました" | ||||||
|   choose-avatar: "アバターにする画像を選択" |   choose-avatar: "アバターにする画像を選択" | ||||||
|  |   invalid-filetype: "この形式のファイルはサポートされていません" | ||||||
| desktop/views/components/activity.chart.vue: | desktop/views/components/activity.chart.vue: | ||||||
|   total: "Black ... Total" |   total: "Black ... Total" | ||||||
|   notes: "Blue ... Notes" |   notes: "Blue ... Notes" | ||||||
| @@ -423,6 +429,24 @@ desktop/views/components/calendar.vue: | |||||||
|   prev: "前の月" |   prev: "前の月" | ||||||
|   next: "次の月" |   next: "次の月" | ||||||
|   go: "クリックして時間遡行" |   go: "クリックして時間遡行" | ||||||
|  | desktop/views/components/charts.vue: | ||||||
|  |   title: "チャート" | ||||||
|  |   per-day: "1日ごと" | ||||||
|  |   per-hour: "1時間ごと" | ||||||
|  |   notes: "投稿" | ||||||
|  |   users: "ユーザー" | ||||||
|  |   drive: "ドライブ" | ||||||
|  |   charts: | ||||||
|  |     notes: "投稿の増減 (統合)" | ||||||
|  |     local-notes: "投稿の増減 (ローカル)" | ||||||
|  |     remote-notes: "投稿の増減 (リモート)" | ||||||
|  |     notes-total: "投稿の累計" | ||||||
|  |     users: "ユーザーの増減" | ||||||
|  |     users-total: "ユーザーの累計" | ||||||
|  |     drive: "ドライブ使用量の増減" | ||||||
|  |     drive-total: "ドライブ使用量の累計" | ||||||
|  |     drive-files: "ドライブのファイル数の増減" | ||||||
|  |     drive-files-total: "ドライブのファイル数の累計" | ||||||
| desktop/views/components/choose-file-from-drive-window.vue: | desktop/views/components/choose-file-from-drive-window.vue: | ||||||
|   choose-file: "ファイル選択中" |   choose-file: "ファイル選択中" | ||||||
|   upload: "PCからドライブにファイルをアップロード" |   upload: "PCからドライブにファイルをアップロード" | ||||||
| @@ -627,9 +651,11 @@ desktop/views/components/settings.vue: | |||||||
|   delete-wallpaper: "壁紙を削除" |   delete-wallpaper: "壁紙を削除" | ||||||
|   dark-mode: "ダークモード" |   dark-mode: "ダークモード" | ||||||
|   circle-icons: "円形のアイコンを使用" |   circle-icons: "円形のアイコンを使用" | ||||||
|  |   contrasted-acct: "ユーザー名にコントラストを付ける" | ||||||
|   gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用" |   gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用" | ||||||
|   post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" |   post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" | ||||||
|   suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" |   suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" | ||||||
|  |   show-clock-on-header: "右上に時計を表示する" | ||||||
|   show-reply-target: "リプライ先を表示する" |   show-reply-target: "リプライ先を表示する" | ||||||
|   show-my-renotes: "自分の行ったRenoteをタイムラインに表示する" |   show-my-renotes: "自分の行ったRenoteをタイムラインに表示する" | ||||||
|   show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" |   show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" | ||||||
| @@ -754,6 +780,7 @@ desktop/views/components/ui.header.account.vue: | |||||||
|   lists: "リスト" |   lists: "リスト" | ||||||
|   follow-requests: "フォロー申請" |   follow-requests: "フォロー申請" | ||||||
|   customize: "ホームのカスタマイズ" |   customize: "ホームのカスタマイズ" | ||||||
|  |   admin: "管理" | ||||||
|   settings: "設定" |   settings: "設定" | ||||||
|   signout: "サインアウト" |   signout: "サインアウト" | ||||||
|   dark: "闇に飲まれる" |   dark: "闇に飲まれる" | ||||||
| @@ -799,8 +826,8 @@ desktop/views/pages/admin/admin.dashboard.vue: | |||||||
|   dashboard: "ダッシュボード" |   dashboard: "ダッシュボード" | ||||||
|   all-users: "全てのユーザー" |   all-users: "全てのユーザー" | ||||||
|   original-users: "このインスタンスのユーザー" |   original-users: "このインスタンスのユーザー" | ||||||
|   all-notes: "全てのノート" |   all-notes: "全ての投稿" | ||||||
|   original-notes: "このインスタンスのノート" |   original-notes: "このインスタンスの投稿" | ||||||
|   invite: "招待" |   invite: "招待" | ||||||
| desktop/views/pages/admin/admin.suspend-user.vue: | desktop/views/pages/admin/admin.suspend-user.vue: | ||||||
|   suspend-user: "ユーザーの凍結" |   suspend-user: "ユーザーの凍結" | ||||||
| @@ -818,18 +845,6 @@ desktop/views/pages/admin/admin.unverify-user.vue: | |||||||
|   unverify-user: "ユーザーの公式アカウント解除" |   unverify-user: "ユーザーの公式アカウント解除" | ||||||
|   unverify: "公式アカウントを解除する" |   unverify: "公式アカウントを解除する" | ||||||
|   unverified: "公式アカウントを解除しました" |   unverified: "公式アカウントを解除しました" | ||||||
| desktop/views/pages/admin/admin.notes-chart.vue: |  | ||||||
|   title: "投稿" |  | ||||||
|   local: "ローカル" |  | ||||||
|   remote: "リモート" |  | ||||||
| desktop/views/pages/admin/admin.users-chart.vue: |  | ||||||
|   title: "ユーザー" |  | ||||||
|   local: "ローカル" |  | ||||||
|   remote: "リモート" |  | ||||||
| desktop/views/pages/admin/admin.drive-chart.vue: |  | ||||||
|   title: "ドライブ" |  | ||||||
|   local: "ローカル" |  | ||||||
|   remote: "リモート" |  | ||||||
| desktop/views/pages/deck/deck.tl-column.vue: | desktop/views/pages/deck/deck.tl-column.vue: | ||||||
|   is-media-only: "メディア投稿のみ" |   is-media-only: "メディア投稿のみ" | ||||||
|   is-media-view: "メディアビュー" |   is-media-view: "メディアビュー" | ||||||
| @@ -838,6 +853,11 @@ desktop/views/pages/deck/deck.note.vue: | |||||||
|   reposted-by: "{}がRenote" |   reposted-by: "{}がRenote" | ||||||
|   private: "この投稿は非公開です" |   private: "この投稿は非公開です" | ||||||
|   deleted: "この投稿は削除されました" |   deleted: "この投稿は削除されました" | ||||||
|  | desktop/views/pages/stats/stats.vue: | ||||||
|  |   all-users: "全てのユーザー" | ||||||
|  |   original-users: "このインスタンスのユーザー" | ||||||
|  |   all-notes: "全ての投稿" | ||||||
|  |   original-notes: "このインスタンスの投稿" | ||||||
| desktop/views/pages/welcome.vue: | desktop/views/pages/welcome.vue: | ||||||
|   about: "詳しく..." |   about: "詳しく..." | ||||||
|   gotit: "わかった" |   gotit: "わかった" | ||||||
| @@ -846,7 +866,10 @@ desktop/views/pages/welcome.vue: | |||||||
|   signin-button: "やってる" |   signin-button: "やってる" | ||||||
|   signup-button: "やる" |   signup-button: "やる" | ||||||
|   timeline: "タイムライン" |   timeline: "タイムライン" | ||||||
|  |   announcements: "お知らせ" | ||||||
|  |   photos: "最近の画像" | ||||||
|   powered-by-misskey: "Powered by <b>Misskey</b>." |   powered-by-misskey: "Powered by <b>Misskey</b>." | ||||||
|  |   info: "情報" | ||||||
| desktop/views/pages/drive.vue: | desktop/views/pages/drive.vue: | ||||||
|   title: "Misskey Drive" |   title: "Misskey Drive" | ||||||
| desktop/views/pages/favorites.vue: | desktop/views/pages/favorites.vue: | ||||||
| @@ -1044,6 +1067,7 @@ mobile/views/components/ui.nav.vue: | |||||||
|   game: "ゲーム" |   game: "ゲーム" | ||||||
|   darkmode: "ダークモード" |   darkmode: "ダークモード" | ||||||
|   settings: "設定" |   settings: "設定" | ||||||
|  |   admin: "管理" | ||||||
|   about: "Misskeyについて" |   about: "Misskeyについて" | ||||||
| mobile/views/components/user-timeline.vue: | mobile/views/components/user-timeline.vue: | ||||||
|   no-notes: "このユーザーは投稿していないようです。" |   no-notes: "このユーザーは投稿していないようです。" | ||||||
| @@ -1133,6 +1157,7 @@ mobile/views/pages/settings.vue: | |||||||
|   dark-mode: "ダークモード" |   dark-mode: "ダークモード" | ||||||
|   i-am-under-limited-internet: "私は通信を制限されている" |   i-am-under-limited-internet: "私は通信を制限されている" | ||||||
|   circle-icons: "円形のアイコンを使用" |   circle-icons: "円形のアイコンを使用" | ||||||
|  |   contrasted-acct: "ユーザー名にコントラストを付ける" | ||||||
|   timeline: "タイムライン" |   timeline: "タイムライン" | ||||||
|   show-reply-target: "リプライ先を表示する" |   show-reply-target: "リプライ先を表示する" | ||||||
|   show-my-renotes: "自分の行ったRenoteを表示する" |   show-my-renotes: "自分の行ったRenoteを表示する" | ||||||
| @@ -1141,6 +1166,9 @@ mobile/views/pages/settings.vue: | |||||||
|   post-style: "投稿の表示スタイル" |   post-style: "投稿の表示スタイル" | ||||||
|   post-style-standard: "標準" |   post-style-standard: "標準" | ||||||
|   post-style-smart: "スマート" |   post-style-smart: "スマート" | ||||||
|  |   notification-position: "通知の表示" | ||||||
|  |   notification-position-bottom: "下" | ||||||
|  |   notification-position-top: "上" | ||||||
|   behavior: "動作" |   behavior: "動作" | ||||||
|   fetch-on-scroll: "スクロールで自動読み込み" |   fetch-on-scroll: "スクロールで自動読み込み" | ||||||
|   disable-via-mobile: "「モバイルからの投稿」フラグを付けない" |   disable-via-mobile: "「モバイルからの投稿」フラグを付けない" | ||||||
| @@ -1161,6 +1189,8 @@ mobile/views/pages/settings.vue: | |||||||
|   update-available-desc: "ページを再度読み込みすると更新が適用されます。" |   update-available-desc: "ページを再度読み込みすると更新が適用されます。" | ||||||
|   settings: "設定" |   settings: "設定" | ||||||
|   signout: "サインアウト" |   signout: "サインアウト" | ||||||
|  |   sound: "サウンド" | ||||||
|  |   enable-sounds: "サウンドを有効にする" | ||||||
| mobile/views/pages/user.vue: | mobile/views/pages/user.vue: | ||||||
|   follows-you: "フォローされています" |   follows-you: "フォローされています" | ||||||
|   following: "フォロー" |   following: "フォロー" | ||||||
| @@ -84,8 +84,10 @@ common: | |||||||
|   my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。" |   my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。" | ||||||
|   i-like-sushi: "私は(プリンよりむしろ)寿司が好き" |   i-like-sushi: "私は(プリンよりむしろ)寿司が好き" | ||||||
|   show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示" |   show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示" | ||||||
|  |   use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける" | ||||||
|   verified-user: "公式アカウント" |   verified-user: "公式アカウント" | ||||||
|   disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" |   disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" | ||||||
|  |   do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' | ||||||
|   reversi: |   reversi: | ||||||
|     drawn: "引き分け" |     drawn: "引き分け" | ||||||
|     my-turn: "あなたのターンです" |     my-turn: "あなたのターンです" | ||||||
| @@ -259,6 +261,8 @@ common/views/components/nav.vue: | |||||||
|   develop: "開発者" |   develop: "開発者" | ||||||
|   feedback: "フィードバック" |   feedback: "フィードバック" | ||||||
| common/views/components/note-menu.vue: | common/views/components/note-menu.vue: | ||||||
|  |   detail: "詳細" | ||||||
|  |   copy-link: "リンクをコピー" | ||||||
|   favorite: "お気に入り" |   favorite: "お気に入り" | ||||||
|   pin: "ピン留め" |   pin: "ピン留め" | ||||||
|   delete: "削除" |   delete: "削除" | ||||||
| @@ -336,6 +340,9 @@ common/views/components/visibility-chooser.vue: | |||||||
|   specified: "ダイレクト" |   specified: "ダイレクト" | ||||||
|   specified-desc: "指定したユーザーにのみ公開" |   specified-desc: "指定したユーザーにのみ公開" | ||||||
|   private: "非公開" |   private: "非公開" | ||||||
|  | common/views/components/trends.vue: | ||||||
|  |   count: "{}人が投稿" | ||||||
|  |   empty: "トレンドなし" | ||||||
| common/views/widgets/broadcast.vue: | common/views/widgets/broadcast.vue: | ||||||
|   fetching: "確認中" |   fetching: "確認中" | ||||||
|   no-broadcasts: "お知らせはありません" |   no-broadcasts: "お知らせはありません" | ||||||
| @@ -359,8 +366,6 @@ common/views/widgets/posts-monitor.vue: | |||||||
|   toggle: "表示を切り替え" |   toggle: "表示を切り替え" | ||||||
| common/views/widgets/hashtags.vue: | common/views/widgets/hashtags.vue: | ||||||
|   title: "ハッシュタグ" |   title: "ハッシュタグ" | ||||||
|   count: "{}人が投稿" |  | ||||||
|   empty: "トレンドなし" |  | ||||||
| common/views/widgets/server.vue: | common/views/widgets/server.vue: | ||||||
|   title: "サーバー情報" |   title: "サーバー情報" | ||||||
|   toggle: "表示を切り替え" |   toggle: "表示を切り替え" | ||||||
| @@ -410,6 +415,7 @@ desktop: | |||||||
|   uploading-avatar: "新しいアバターをアップロードしています" |   uploading-avatar: "新しいアバターをアップロードしています" | ||||||
|   avatar-updated: "アバターを更新しました" |   avatar-updated: "アバターを更新しました" | ||||||
|   choose-avatar: "アバターにする画像を選択" |   choose-avatar: "アバターにする画像を選択" | ||||||
|  |   invalid-filetype: "この形式のファイルはサポートされていません" | ||||||
| desktop/views/components/activity.chart.vue: | desktop/views/components/activity.chart.vue: | ||||||
|   total: "Black ... Total" |   total: "Black ... Total" | ||||||
|   notes: "Blue ... Notes" |   notes: "Blue ... Notes" | ||||||
| @@ -423,6 +429,24 @@ desktop/views/components/calendar.vue: | |||||||
|   prev: "前の月" |   prev: "前の月" | ||||||
|   next: "次の月" |   next: "次の月" | ||||||
|   go: "クリックして時間遡行" |   go: "クリックして時間遡行" | ||||||
|  | desktop/views/components/charts.vue: | ||||||
|  |   title: "チャート" | ||||||
|  |   per-day: "1日ごと" | ||||||
|  |   per-hour: "1時間ごと" | ||||||
|  |   notes: "投稿" | ||||||
|  |   users: "ユーザー" | ||||||
|  |   drive: "ドライブ" | ||||||
|  |   charts: | ||||||
|  |     notes: "投稿の増減 (統合)" | ||||||
|  |     local-notes: "投稿の増減 (ローカル)" | ||||||
|  |     remote-notes: "投稿の増減 (リモート)" | ||||||
|  |     notes-total: "投稿の累計" | ||||||
|  |     users: "ユーザーの増減" | ||||||
|  |     users-total: "ユーザーの累計" | ||||||
|  |     drive: "ドライブ使用量の増減" | ||||||
|  |     drive-total: "ドライブ使用量の累計" | ||||||
|  |     drive-files: "ドライブのファイル数の増減" | ||||||
|  |     drive-files-total: "ドライブのファイル数の累計" | ||||||
| desktop/views/components/choose-file-from-drive-window.vue: | desktop/views/components/choose-file-from-drive-window.vue: | ||||||
|   choose-file: "ファイル選択中" |   choose-file: "ファイル選択中" | ||||||
|   upload: "PCからドライブにファイルをアップロード" |   upload: "PCからドライブにファイルをアップロード" | ||||||
| @@ -627,9 +651,11 @@ desktop/views/components/settings.vue: | |||||||
|   delete-wallpaper: "壁紙を削除" |   delete-wallpaper: "壁紙を削除" | ||||||
|   dark-mode: "ダークモード" |   dark-mode: "ダークモード" | ||||||
|   circle-icons: "円形のアイコンを使用" |   circle-icons: "円形のアイコンを使用" | ||||||
|  |   contrasted-acct: "ユーザー名にコントラストを付ける" | ||||||
|   gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用" |   gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用" | ||||||
|   post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" |   post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" | ||||||
|   suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" |   suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" | ||||||
|  |   show-clock-on-header: "右上に時計を表示する" | ||||||
|   show-reply-target: "リプライ先を表示する" |   show-reply-target: "リプライ先を表示する" | ||||||
|   show-my-renotes: "自分の行ったRenoteをタイムラインに表示する" |   show-my-renotes: "自分の行ったRenoteをタイムラインに表示する" | ||||||
|   show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" |   show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" | ||||||
| @@ -754,6 +780,7 @@ desktop/views/components/ui.header.account.vue: | |||||||
|   lists: "リスト" |   lists: "リスト" | ||||||
|   follow-requests: "フォロー申請" |   follow-requests: "フォロー申請" | ||||||
|   customize: "ホームのカスタマイズ" |   customize: "ホームのカスタマイズ" | ||||||
|  |   admin: "管理" | ||||||
|   settings: "設定" |   settings: "設定" | ||||||
|   signout: "サインアウト" |   signout: "サインアウト" | ||||||
|   dark: "闇に飲まれる" |   dark: "闇に飲まれる" | ||||||
| @@ -799,8 +826,8 @@ desktop/views/pages/admin/admin.dashboard.vue: | |||||||
|   dashboard: "ダッシュボード" |   dashboard: "ダッシュボード" | ||||||
|   all-users: "全てのユーザー" |   all-users: "全てのユーザー" | ||||||
|   original-users: "このインスタンスのユーザー" |   original-users: "このインスタンスのユーザー" | ||||||
|   all-notes: "全てのノート" |   all-notes: "全ての投稿" | ||||||
|   original-notes: "このインスタンスのノート" |   original-notes: "このインスタンスの投稿" | ||||||
|   invite: "招待" |   invite: "招待" | ||||||
| desktop/views/pages/admin/admin.suspend-user.vue: | desktop/views/pages/admin/admin.suspend-user.vue: | ||||||
|   suspend-user: "ユーザーの凍結" |   suspend-user: "ユーザーの凍結" | ||||||
| @@ -818,18 +845,6 @@ desktop/views/pages/admin/admin.unverify-user.vue: | |||||||
|   unverify-user: "ユーザーの公式アカウント解除" |   unverify-user: "ユーザーの公式アカウント解除" | ||||||
|   unverify: "公式アカウントを解除する" |   unverify: "公式アカウントを解除する" | ||||||
|   unverified: "公式アカウントを解除しました" |   unverified: "公式アカウントを解除しました" | ||||||
| desktop/views/pages/admin/admin.notes-chart.vue: |  | ||||||
|   title: "投稿" |  | ||||||
|   local: "ローカル" |  | ||||||
|   remote: "リモート" |  | ||||||
| desktop/views/pages/admin/admin.users-chart.vue: |  | ||||||
|   title: "ユーザー" |  | ||||||
|   local: "ローカル" |  | ||||||
|   remote: "リモート" |  | ||||||
| desktop/views/pages/admin/admin.drive-chart.vue: |  | ||||||
|   title: "ドライブ" |  | ||||||
|   local: "ローカル" |  | ||||||
|   remote: "リモート" |  | ||||||
| desktop/views/pages/deck/deck.tl-column.vue: | desktop/views/pages/deck/deck.tl-column.vue: | ||||||
|   is-media-only: "メディア投稿のみ" |   is-media-only: "メディア投稿のみ" | ||||||
|   is-media-view: "メディアビュー" |   is-media-view: "メディアビュー" | ||||||
| @@ -838,6 +853,11 @@ desktop/views/pages/deck/deck.note.vue: | |||||||
|   reposted-by: "{}がRenote" |   reposted-by: "{}がRenote" | ||||||
|   private: "この投稿は非公開です" |   private: "この投稿は非公開です" | ||||||
|   deleted: "この投稿は削除されました" |   deleted: "この投稿は削除されました" | ||||||
|  | desktop/views/pages/stats/stats.vue: | ||||||
|  |   all-users: "全てのユーザー" | ||||||
|  |   original-users: "このインスタンスのユーザー" | ||||||
|  |   all-notes: "全ての投稿" | ||||||
|  |   original-notes: "このインスタンスの投稿" | ||||||
| desktop/views/pages/welcome.vue: | desktop/views/pages/welcome.vue: | ||||||
|   about: "詳しく..." |   about: "詳しく..." | ||||||
|   gotit: "わかった" |   gotit: "わかった" | ||||||
| @@ -846,7 +866,10 @@ desktop/views/pages/welcome.vue: | |||||||
|   signin-button: "やってる" |   signin-button: "やってる" | ||||||
|   signup-button: "やる" |   signup-button: "やる" | ||||||
|   timeline: "タイムライン" |   timeline: "タイムライン" | ||||||
|  |   announcements: "お知らせ" | ||||||
|  |   photos: "最近の画像" | ||||||
|   powered-by-misskey: "Powered by <b>Misskey</b>." |   powered-by-misskey: "Powered by <b>Misskey</b>." | ||||||
|  |   info: "情報" | ||||||
| desktop/views/pages/drive.vue: | desktop/views/pages/drive.vue: | ||||||
|   title: "Misskey Drive" |   title: "Misskey Drive" | ||||||
| desktop/views/pages/favorites.vue: | desktop/views/pages/favorites.vue: | ||||||
| @@ -1044,6 +1067,7 @@ mobile/views/components/ui.nav.vue: | |||||||
|   game: "ゲーム" |   game: "ゲーム" | ||||||
|   darkmode: "ダークモード" |   darkmode: "ダークモード" | ||||||
|   settings: "設定" |   settings: "設定" | ||||||
|  |   admin: "管理" | ||||||
|   about: "Misskeyについて" |   about: "Misskeyについて" | ||||||
| mobile/views/components/user-timeline.vue: | mobile/views/components/user-timeline.vue: | ||||||
|   no-notes: "このユーザーは投稿していないようです。" |   no-notes: "このユーザーは投稿していないようです。" | ||||||
| @@ -1133,6 +1157,7 @@ mobile/views/pages/settings.vue: | |||||||
|   dark-mode: "ダークモード" |   dark-mode: "ダークモード" | ||||||
|   i-am-under-limited-internet: "私は通信を制限されている" |   i-am-under-limited-internet: "私は通信を制限されている" | ||||||
|   circle-icons: "円形のアイコンを使用" |   circle-icons: "円形のアイコンを使用" | ||||||
|  |   contrasted-acct: "ユーザー名にコントラストを付ける" | ||||||
|   timeline: "タイムライン" |   timeline: "タイムライン" | ||||||
|   show-reply-target: "リプライ先を表示する" |   show-reply-target: "リプライ先を表示する" | ||||||
|   show-my-renotes: "自分の行ったRenoteを表示する" |   show-my-renotes: "自分の行ったRenoteを表示する" | ||||||
| @@ -1141,6 +1166,9 @@ mobile/views/pages/settings.vue: | |||||||
|   post-style: "投稿の表示スタイル" |   post-style: "投稿の表示スタイル" | ||||||
|   post-style-standard: "標準" |   post-style-standard: "標準" | ||||||
|   post-style-smart: "スマート" |   post-style-smart: "スマート" | ||||||
|  |   notification-position: "通知の表示" | ||||||
|  |   notification-position-bottom: "下" | ||||||
|  |   notification-position-top: "上" | ||||||
|   behavior: "動作" |   behavior: "動作" | ||||||
|   fetch-on-scroll: "スクロールで自動読み込み" |   fetch-on-scroll: "スクロールで自動読み込み" | ||||||
|   disable-via-mobile: "「モバイルからの投稿」フラグを付けない" |   disable-via-mobile: "「モバイルからの投稿」フラグを付けない" | ||||||
| @@ -1161,6 +1189,8 @@ mobile/views/pages/settings.vue: | |||||||
|   update-available-desc: "ページを再度読み込みすると更新が適用されます。" |   update-available-desc: "ページを再度読み込みすると更新が適用されます。" | ||||||
|   settings: "設定" |   settings: "設定" | ||||||
|   signout: "サインアウト" |   signout: "サインアウト" | ||||||
|  |   sound: "サウンド" | ||||||
|  |   enable-sounds: "サウンドを有効にする" | ||||||
| mobile/views/pages/user.vue: | mobile/views/pages/user.vue: | ||||||
|   follows-you: "フォローされています" |   follows-you: "フォローされています" | ||||||
|   following: "フォロー" |   following: "フォロー" | ||||||
							
								
								
									
										45
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										45
									
								
								package.json
									
									
									
									
									
								
							| @@ -1,8 +1,8 @@ | |||||||
| { | { | ||||||
| 	"name": "misskey", | 	"name": "misskey", | ||||||
| 	"author": "syuilo <i@syuilo.com>", | 	"author": "syuilo <i@syuilo.com>", | ||||||
| 	"version": "7.1.1", | 	"version": "8.33.1", | ||||||
| 	"clientVersion": "1.0.8687", | 	"clientVersion": "1.0.9497", | ||||||
| 	"codename": "nighthike", | 	"codename": "nighthike", | ||||||
| 	"main": "./built/index.js", | 	"main": "./built/index.js", | ||||||
| 	"private": true, | 	"private": true, | ||||||
| @@ -32,7 +32,7 @@ | |||||||
| 		"@types/debug": "0.0.30", | 		"@types/debug": "0.0.30", | ||||||
| 		"@types/deep-equal": "1.0.1", | 		"@types/deep-equal": "1.0.1", | ||||||
| 		"@types/double-ended-queue": "2.1.0", | 		"@types/double-ended-queue": "2.1.0", | ||||||
| 		"@types/elasticsearch": "5.0.25", | 		"@types/elasticsearch": "5.0.26", | ||||||
| 		"@types/file-type": "5.2.1", | 		"@types/file-type": "5.2.1", | ||||||
| 		"@types/gulp": "3.8.36", | 		"@types/gulp": "3.8.36", | ||||||
| 		"@types/gulp-htmlmin": "1.3.32", | 		"@types/gulp-htmlmin": "1.3.32", | ||||||
| @@ -55,12 +55,12 @@ | |||||||
| 		"@types/koa-send": "4.1.1", | 		"@types/koa-send": "4.1.1", | ||||||
| 		"@types/koa-views": "2.0.3", | 		"@types/koa-views": "2.0.3", | ||||||
| 		"@types/koa__cors": "2.2.3", | 		"@types/koa__cors": "2.2.3", | ||||||
| 		"@types/minio": "6.0.2", | 		"@types/minio": "7.0.0", | ||||||
| 		"@types/mkdirp": "0.5.2", | 		"@types/mkdirp": "0.5.2", | ||||||
| 		"@types/mocha": "5.2.3", | 		"@types/mocha": "5.2.3", | ||||||
| 		"@types/mongodb": "3.1.4", | 		"@types/mongodb": "3.1.4", | ||||||
| 		"@types/ms": "0.7.30", | 		"@types/ms": "0.7.30", | ||||||
| 		"@types/node": "10.7.1", | 		"@types/node": "10.9.4", | ||||||
| 		"@types/portscanner": "2.1.0", | 		"@types/portscanner": "2.1.0", | ||||||
| 		"@types/pug": "2.0.4", | 		"@types/pug": "2.0.4", | ||||||
| 		"@types/qrcode": "1.2.0", | 		"@types/qrcode": "1.2.0", | ||||||
| @@ -70,17 +70,17 @@ | |||||||
| 		"@types/request-promise-native": "1.0.15", | 		"@types/request-promise-native": "1.0.15", | ||||||
| 		"@types/rimraf": "2.0.2", | 		"@types/rimraf": "2.0.2", | ||||||
| 		"@types/seedrandom": "2.4.27", | 		"@types/seedrandom": "2.4.27", | ||||||
| 		"@types/sharp": "0.17.9", | 		"@types/sharp": "0.17.10", | ||||||
| 		"@types/showdown": "1.7.5", | 		"@types/showdown": "1.7.5", | ||||||
| 		"@types/single-line-log": "1.1.0", | 		"@types/single-line-log": "1.1.0", | ||||||
| 		"@types/speakeasy": "2.0.2", | 		"@types/speakeasy": "2.0.2", | ||||||
| 		"@types/systeminformation": "3.23.0", | 		"@types/systeminformation": "3.23.0", | ||||||
| 		"@types/tmp": "0.0.33", | 		"@types/tmp": "0.0.33", | ||||||
| 		"@types/uuid": "3.4.3", | 		"@types/uuid": "3.4.4", | ||||||
| 		"@types/webpack": "4.4.10", | 		"@types/webpack": "4.4.11", | ||||||
| 		"@types/webpack-stream": "3.2.10", | 		"@types/webpack-stream": "3.2.10", | ||||||
| 		"@types/websocket": "0.0.39", | 		"@types/websocket": "0.0.40", | ||||||
| 		"@types/ws": "6.0.0", | 		"@types/ws": "6.0.1", | ||||||
| 		"animejs": "2.2.0", | 		"animejs": "2.2.0", | ||||||
| 		"autosize": "4.0.2", | 		"autosize": "4.0.2", | ||||||
| 		"autwh": "0.1.0", | 		"autwh": "0.1.0", | ||||||
| @@ -89,6 +89,7 @@ | |||||||
| 		"bootstrap-vue": "2.0.0-rc.11", | 		"bootstrap-vue": "2.0.0-rc.11", | ||||||
| 		"cafy": "11.3.0", | 		"cafy": "11.3.0", | ||||||
| 		"chalk": "2.4.1", | 		"chalk": "2.4.1", | ||||||
|  | 		"chart.js": "2.7.2", | ||||||
| 		"commander": "2.17.1", | 		"commander": "2.17.1", | ||||||
| 		"crc-32": "1.2.0", | 		"crc-32": "1.2.0", | ||||||
| 		"css-loader": "1.0.0", | 		"css-loader": "1.0.0", | ||||||
| @@ -149,16 +150,18 @@ | |||||||
| 		"loader-utils": "1.1.0", | 		"loader-utils": "1.1.0", | ||||||
| 		"lodash.assign": "4.2.0", | 		"lodash.assign": "4.2.0", | ||||||
| 		"mecab-async": "0.1.2", | 		"mecab-async": "0.1.2", | ||||||
| 		"minio": "7.0.0", | 		"merge-options": "1.0.1", | ||||||
|  | 		"minio": "7.0.1", | ||||||
| 		"mkdirp": "0.5.1", | 		"mkdirp": "0.5.1", | ||||||
| 		"mocha": "5.2.0", | 		"mocha": "5.2.0", | ||||||
| 		"moji": "0.5.1", | 		"moji": "0.5.1", | ||||||
| 		"mongodb": "3.1.1", | 		"mongodb": "3.1.1", | ||||||
| 		"monk": "6.0.6", | 		"monk": "6.0.6", | ||||||
| 		"ms": "2.1.1", | 		"ms": "2.1.1", | ||||||
| 		"nan": "2.10.0", | 		"nan": "2.11.0", | ||||||
|  | 		"nested-property": "0.0.7", | ||||||
| 		"node-sass": "4.9.3", | 		"node-sass": "4.9.3", | ||||||
| 		"node-sass-json-importer": "3.3.1", | 		"node-sass-json-importer": "4.0.1", | ||||||
| 		"nprogress": "0.2.0", | 		"nprogress": "0.2.0", | ||||||
| 		"object-assign-deep": "0.4.0", | 		"object-assign-deep": "0.4.0", | ||||||
| 		"on-build-webpack": "0.1.0", | 		"on-build-webpack": "0.1.0", | ||||||
| @@ -181,17 +184,17 @@ | |||||||
| 		"s-age": "1.1.2", | 		"s-age": "1.1.2", | ||||||
| 		"sass-loader": "7.1.0", | 		"sass-loader": "7.1.0", | ||||||
| 		"seedrandom": "2.4.4", | 		"seedrandom": "2.4.4", | ||||||
| 		"sharp": "0.20.5", | 		"sharp": "0.20.7", | ||||||
| 		"showdown": "1.8.6", | 		"showdown": "1.8.6", | ||||||
| 		"showdown-highlightjs-extension": "0.1.2", | 		"showdown-highlightjs-extension": "0.1.2", | ||||||
| 		"single-line-log": "1.1.2", | 		"single-line-log": "1.1.2", | ||||||
| 		"speakeasy": "2.0.0", | 		"speakeasy": "2.0.0", | ||||||
| 		"stringz": "1.0.0", | 		"stringz": "1.0.0", | ||||||
| 		"style-loader": "0.22.1", | 		"style-loader": "0.23.0", | ||||||
| 		"stylus": "0.54.5", | 		"stylus": "0.54.5", | ||||||
| 		"stylus-loader": "3.0.2", | 		"stylus-loader": "3.0.2", | ||||||
| 		"summaly": "2.1.3", | 		"summaly": "2.2.0", | ||||||
| 		"systeminformation": "3.42.9", | 		"systeminformation": "3.45.1", | ||||||
| 		"syuilo-password-strength": "0.0.1", | 		"syuilo-password-strength": "0.0.1", | ||||||
| 		"textarea-caret": "3.1.0", | 		"textarea-caret": "3.1.0", | ||||||
| 		"tmp": "0.0.33", | 		"tmp": "0.0.33", | ||||||
| @@ -205,19 +208,21 @@ | |||||||
| 		"uuid": "3.3.2", | 		"uuid": "3.3.2", | ||||||
| 		"v-animate-css": "0.0.2", | 		"v-animate-css": "0.0.2", | ||||||
| 		"vue": "2.5.17", | 		"vue": "2.5.17", | ||||||
|  | 		"vue-chartjs": "3.4.0", | ||||||
| 		"vue-cropperjs": "2.2.1", | 		"vue-cropperjs": "2.2.1", | ||||||
| 		"vue-js-modal": "1.3.17", | 		"vue-js-modal": "1.3.26", | ||||||
| 		"vue-json-tree-view": "2.1.4", | 		"vue-json-tree-view": "2.1.4", | ||||||
| 		"vue-loader": "15.3.0", | 		"vue-loader": "15.4.1", | ||||||
| 		"vue-router": "3.0.1", | 		"vue-router": "3.0.1", | ||||||
| 		"vue-style-loader": "4.1.2", | 		"vue-style-loader": "4.1.2", | ||||||
| 		"vue-template-compiler": "2.5.17", | 		"vue-template-compiler": "2.5.17", | ||||||
| 		"vuedraggable": "2.16.0", | 		"vuedraggable": "2.16.0", | ||||||
|  | 		"vuewordcloud": "18.7.11", | ||||||
| 		"vuex": "3.0.1", | 		"vuex": "3.0.1", | ||||||
| 		"vuex-persistedstate": "2.5.4", | 		"vuex-persistedstate": "2.5.4", | ||||||
| 		"web-push": "3.3.2", | 		"web-push": "3.3.2", | ||||||
| 		"webfinger.js": "2.6.6", | 		"webfinger.js": "2.6.6", | ||||||
| 		"webpack": "4.16.5", | 		"webpack": "4.17.2", | ||||||
| 		"webpack-cli": "3.1.0", | 		"webpack-cli": "3.1.0", | ||||||
| 		"websocket": "1.0.26", | 		"websocket": "1.0.26", | ||||||
| 		"ws": "6.0.0", | 		"ws": "6.0.0", | ||||||
|   | |||||||
| @@ -6,6 +6,10 @@ html | |||||||
| 		&, * | 		&, * | ||||||
| 			cursor progress !important | 			cursor progress !important | ||||||
|  |  | ||||||
|  | html | ||||||
|  | 	// iOSのため | ||||||
|  | 	overflow auto | ||||||
|  |  | ||||||
| body | body | ||||||
| 	overflow-wrap break-word | 	overflow-wrap break-word | ||||||
|  |  | ||||||
|   | |||||||
| @@ -80,7 +80,7 @@ export default Vue.extend({ | |||||||
| 		accepted() { | 		accepted() { | ||||||
| 			this.state = 'accepted'; | 			this.state = 'accepted'; | ||||||
| 			if (this.session.app.callbackUrl) { | 			if (this.session.app.callbackUrl) { | ||||||
| 				location.href = this.session.app.callbackUrl + '?token=' + this.session.token; | 				location.href = `${this.session.app.callbackUrl}?token=${this.session.token}`; | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -32,19 +32,28 @@ | |||||||
| 	//#region Detect app name | 	//#region Detect app name | ||||||
| 	let app = null; | 	let app = null; | ||||||
|  |  | ||||||
| 	if (url.pathname == '/docs' || url.pathname.startsWith('/docs/')) app = 'docs'; | 	if (`${url.pathname}/`.startsWith('/docs/')) app = 'docs'; | ||||||
| 	if (url.pathname == '/dev' || url.pathname.startsWith('/dev/')) app = 'dev'; | 	if (`${url.pathname}/`.startsWith('/dev/')) app = 'dev'; | ||||||
| 	if (url.pathname == '/auth' || url.pathname.startsWith('/auth/')) app = 'auth'; | 	if (`${url.pathname}/`.startsWith('/auth/')) app = 'auth'; | ||||||
| 	//#endregion | 	//#endregion | ||||||
|  |  | ||||||
| 	//#region Detect the user language | 	//#region Detect the user language | ||||||
| 	let lang = navigator.language.split('-')[0]; | 	let lang = null; | ||||||
|  |  | ||||||
| 	// The default language is English | 	if (LANGS.includes(navigator.language)) { | ||||||
| 	if (!LANGS.includes(lang)) lang = 'en'; | 		lang = navigator.language; | ||||||
|  | 	} else { | ||||||
|  | 		lang = LANGS.find(x => x.split('-')[0] == navigator.language); | ||||||
|  |  | ||||||
| 	if (settings) { | 		if (lang == null) { | ||||||
| 		if (settings.device.lang) lang = settings.device.lang; | 			// Fallback | ||||||
|  | 			lang = 'en-US'; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if (settings && settings.device.lang && | ||||||
|  | 		LANGS.includes(settings.device.lang)) { | ||||||
|  | 		lang = settings.device.lang; | ||||||
| 	} | 	} | ||||||
| 	//#endregion | 	//#endregion | ||||||
|  |  | ||||||
| @@ -85,7 +94,7 @@ | |||||||
|  |  | ||||||
| 	// Get salt query | 	// Get salt query | ||||||
| 	const salt = localStorage.getItem('salt') | 	const salt = localStorage.getItem('salt') | ||||||
| 		? '?salt=' + localStorage.getItem('salt') | 		? `?salt=${localStorage.getItem('salt')}` | ||||||
| 		: ''; | 		: ''; | ||||||
|  |  | ||||||
| 	// Load an app script | 	// Load an app script | ||||||
| @@ -104,7 +113,7 @@ | |||||||
| 	// グローバルにタイマーIDを代入しておく | 	// グローバルにタイマーIDを代入しておく | ||||||
| 	window.mkBootTimer = window.setTimeout(async () => { | 	window.mkBootTimer = window.setTimeout(async () => { | ||||||
| 		// Fetch meta | 		// Fetch meta | ||||||
| 		const res = await fetch(API + '/meta', { | 		const res = await fetch('/api/meta', { | ||||||
| 			method: 'POST', | 			method: 'POST', | ||||||
| 			cache: 'no-cache' | 			cache: 'no-cache' | ||||||
| 		}); | 		}); | ||||||
| @@ -131,7 +140,7 @@ | |||||||
| 		// Random | 		// Random | ||||||
| 		localStorage.setItem('salt', Math.random().toString()); | 		localStorage.setItem('salt', Math.random().toString()); | ||||||
|  |  | ||||||
| 		// Clear cache (serive worker) | 		// Clear cache (service worker) | ||||||
| 		try { | 		try { | ||||||
| 			navigator.serviceWorker.controller.postMessage('clear'); | 			navigator.serviceWorker.controller.postMessage('clear'); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ export default async function(mios: MiOS, force = false, silent = false) { | |||||||
| 		localStorage.setItem('should-refresh', 'true'); | 		localStorage.setItem('should-refresh', 'true'); | ||||||
| 		localStorage.setItem('v', newer); | 		localStorage.setItem('v', newer); | ||||||
|  |  | ||||||
| 		// Clear cache (serive worker) | 		// Clear cache (service worker) | ||||||
| 		try { | 		try { | ||||||
| 			if (navigator.serviceWorker.controller) { | 			if (navigator.serviceWorker.controller) { | ||||||
| 				navigator.serviceWorker.controller.postMessage('clear'); | 				navigator.serviceWorker.controller.postMessage('clear'); | ||||||
|   | |||||||
| @@ -1,2 +0,0 @@ | |||||||
| const gcd = (a, b) => !b ? a : gcd(b, a % b); |  | ||||||
| export default gcd; |  | ||||||
| @@ -1,53 +0,0 @@ | |||||||
| export default function(qs: string) { |  | ||||||
| 	const q = { |  | ||||||
| 		text: '' |  | ||||||
| 	}; |  | ||||||
|  |  | ||||||
| 	qs.split(' ').forEach(x => { |  | ||||||
| 		if (/^([a-z_]+?):(.+?)$/.test(x)) { |  | ||||||
| 			const [key, value] = x.split(':'); |  | ||||||
| 			switch (key) { |  | ||||||
| 				case 'user': |  | ||||||
| 					q['includeUserUsernames'] = value.split(','); |  | ||||||
| 					break; |  | ||||||
| 				case 'exclude_user': |  | ||||||
| 					q['excludeUserUsernames'] = value.split(','); |  | ||||||
| 					break; |  | ||||||
| 				case 'follow': |  | ||||||
| 					q['following'] = value == 'null' ? null : value == 'true'; |  | ||||||
| 					break; |  | ||||||
| 				case 'reply': |  | ||||||
| 					q['reply'] = value == 'null' ? null : value == 'true'; |  | ||||||
| 					break; |  | ||||||
| 				case 'renote': |  | ||||||
| 					q['renote'] = value == 'null' ? null : value == 'true'; |  | ||||||
| 					break; |  | ||||||
| 				case 'media': |  | ||||||
| 					q['media'] = value == 'null' ? null : value == 'true'; |  | ||||||
| 					break; |  | ||||||
| 				case 'poll': |  | ||||||
| 					q['poll'] = value == 'null' ? null : value == 'true'; |  | ||||||
| 					break; |  | ||||||
| 				case 'until': |  | ||||||
| 				case 'since': |  | ||||||
| 					// YYYY-MM-DD |  | ||||||
| 					if (/^[0-9]+\-[0-9]+\-[0-9]+$/) { |  | ||||||
| 						const [yyyy, mm, dd] = value.split('-'); |  | ||||||
| 						q[`${key}_date`] = (new Date(parseInt(yyyy, 10), parseInt(mm, 10) - 1, parseInt(dd, 10))).getTime(); |  | ||||||
| 					} |  | ||||||
| 					break; |  | ||||||
| 				default: |  | ||||||
| 					q[key] = value; |  | ||||||
| 					break; |  | ||||||
| 			} |  | ||||||
| 		} else { |  | ||||||
| 			q.text += x + ' '; |  | ||||||
| 		} |  | ||||||
| 	}); |  | ||||||
|  |  | ||||||
| 	if (q.text) { |  | ||||||
| 		q.text = q.text.trim(); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return q; |  | ||||||
| } |  | ||||||
| @@ -3,8 +3,10 @@ import MiOS from '../../../../../mios'; | |||||||
|  |  | ||||||
| export class ReversiGameStream extends Stream { | export class ReversiGameStream extends Stream { | ||||||
| 	constructor(os: MiOS, me, game) { | 	constructor(os: MiOS, me, game) { | ||||||
| 		super(os, 'games/reversi-game', { | 		super(os, 'games/reversi-game', me ? { | ||||||
| 			i: me ? me.token : null, | 			i: me.token, | ||||||
|  | 			game: game.id | ||||||
|  | 		} : { | ||||||
| 			game: game.id | 			game: game.id | ||||||
| 		}); | 		}); | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -7,9 +7,9 @@ import MiOS from '../../../mios'; | |||||||
|  */ |  */ | ||||||
| export class LocalTimelineStream extends Stream { | export class LocalTimelineStream extends Stream { | ||||||
| 	constructor(os: MiOS, me) { | 	constructor(os: MiOS, me) { | ||||||
| 		super(os, 'local-timeline', { | 		super(os, 'local-timeline', me ? { | ||||||
| 			i: me.token | 			i: me.token | ||||||
| 		}); | 		} : {}); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,6 +1,7 @@ | |||||||
| import { EventEmitter } from 'eventemitter3'; | import { EventEmitter } from 'eventemitter3'; | ||||||
| import * as uuid from 'uuid'; | import * as uuid from 'uuid'; | ||||||
| import Connection from './stream'; | import Connection from './stream'; | ||||||
|  | import { erase } from '../../../../../prelude/array'; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * ストリーム接続を管理するクラス |  * ストリーム接続を管理するクラス | ||||||
| @@ -89,7 +90,7 @@ export default abstract class StreamManager<T extends Connection> extends EventE | |||||||
| 	 * @param userId use で発行したユーザーID | 	 * @param userId use で発行したユーザーID | ||||||
| 	 */ | 	 */ | ||||||
| 	public dispose(userId) { | 	public dispose(userId) { | ||||||
| 		this.users = this.users.filter(id => id != userId); | 		this.users = erase(userId, this.users); | ||||||
|  |  | ||||||
| 		this._connection.user = `Managed (${ this.users.length })`; | 		this._connection.user = `Managed (${ this.users.length })`; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -44,11 +44,11 @@ export default class Connection extends EventEmitter { | |||||||
|  |  | ||||||
| 		const query = params | 		const query = params | ||||||
| 			? Object.keys(params) | 			? Object.keys(params) | ||||||
| 				.map(k => encodeURIComponent(k) + '=' + encodeURIComponent(params[k])) | 				.map(k => `${encodeURIComponent(k)}=${encodeURIComponent(params[k])}`) | ||||||
| 				.join('&') | 				.join('&') | ||||||
| 			: null; | 			: null; | ||||||
|  |  | ||||||
| 		this.socket = new ReconnectingWebsocket(`${wsUrl}/${endpoint}${query ? '?' + query : ''}`); | 		this.socket = new ReconnectingWebsocket(`${wsUrl}/${endpoint}${query ? `?${query}` : ''}`); | ||||||
| 		this.socket.addEventListener('open', this.onOpen); | 		this.socket.addEventListener('open', this.onOpen); | ||||||
| 		this.socket.addEventListener('close', this.onClose); | 		this.socket.addEventListener('close', this.onClose); | ||||||
| 		this.socket.addEventListener('message', this.onMessage); | 		this.socket.addEventListener('message', this.onMessage); | ||||||
|   | |||||||
| @@ -1,19 +1,25 @@ | |||||||
| <template> | <template> | ||||||
| <span class="mk-acct"> | <span class="mk-acct"> | ||||||
| 	<span class="name">@{{ user.username }}</span> | 	<span class="name">@{{ user.username }}</span> | ||||||
| 	<span class="host" v-if="user.host">@{{ user.host }}</span> | 	<span class="host" :class="{ fade: $store.state.settings.contrastedAcct }" v-if="user.host || detail">@{{ user.host || host }}</span> | ||||||
| </span> | </span> | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
| <script lang="ts"> | <script lang="ts"> | ||||||
| import Vue from 'vue'; | import Vue from 'vue'; | ||||||
|  | import { host } from '../../../config'; | ||||||
| export default Vue.extend({ | export default Vue.extend({ | ||||||
| 	props: ['user'] | 	props: ['user', 'detail'], | ||||||
|  | 	data() { | ||||||
|  | 		return { | ||||||
|  | 			host | ||||||
|  | 		}; | ||||||
|  | 	} | ||||||
| }); | }); | ||||||
| </script> | </script> | ||||||
|  |  | ||||||
| <style lang="stylus" scoped> | <style lang="stylus" scoped> | ||||||
| .mk-acct | .mk-acct | ||||||
| 	> .host | 	> .host.fade | ||||||
| 		opacity 0.5 | 		opacity 0.5 | ||||||
| </style> | </style> | ||||||
|   | |||||||
| @@ -125,7 +125,7 @@ export default Vue.extend({ | |||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			if (this.type == 'user') { | 			if (this.type == 'user') { | ||||||
| 				const cacheKey = 'autocomplete:user:' + this.q; | 				const cacheKey = `autocomplete:user:${this.q}`; | ||||||
| 				const cache = sessionStorage.getItem(cacheKey); | 				const cache = sessionStorage.getItem(cacheKey); | ||||||
| 				if (cache) { | 				if (cache) { | ||||||
| 					const users = JSON.parse(cache); | 					const users = JSON.parse(cache); | ||||||
| @@ -148,7 +148,7 @@ export default Vue.extend({ | |||||||
| 					this.hashtags = JSON.parse(localStorage.getItem('hashtags') || '[]'); | 					this.hashtags = JSON.parse(localStorage.getItem('hashtags') || '[]'); | ||||||
| 					this.fetching = false; | 					this.fetching = false; | ||||||
| 				} else { | 				} else { | ||||||
| 					const cacheKey = 'autocomplete:hashtag:' + this.q; | 					const cacheKey = `autocomplete:hashtag:${this.q}`; | ||||||
| 					const cache = sessionStorage.getItem(cacheKey); | 					const cache = sessionStorage.getItem(cacheKey); | ||||||
| 					if (cache) { | 					if (cache) { | ||||||
| 						const hashtags = JSON.parse(cache); | 						const hashtags = JSON.parse(cache); | ||||||
|   | |||||||
| @@ -57,7 +57,7 @@ export default Vue.extend({ | |||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		// Check internet connection | 		// Check internet connection | ||||||
| 		fetch('https://google.com?rand=' + Math.random(), { | 		fetch(`https://google.com?rand=${Math.random()}`, { | ||||||
| 			mode: 'no-cors' | 			mode: 'no-cors' | ||||||
| 		}).then(() => { | 		}).then(() => { | ||||||
| 			this.internet = true; | 			this.internet = true; | ||||||
|   | |||||||
| @@ -18,11 +18,11 @@ | |||||||
| 	</div> | 	</div> | ||||||
|  |  | ||||||
| 	<div class="board"> | 	<div class="board"> | ||||||
| 		<div class="labels-x" v-if="this.$store.state.settings.reversiBoardLabels"> | 		<div class="labels-x" v-if="this.$store.state.settings.games.reversi.showBoardLabels"> | ||||||
| 			<span v-for="i in game.settings.map[0].length">{{ String.fromCharCode(64 + i) }}</span> | 			<span v-for="i in game.settings.map[0].length">{{ String.fromCharCode(64 + i) }}</span> | ||||||
| 		</div> | 		</div> | ||||||
| 		<div class="flex"> | 		<div class="flex"> | ||||||
| 			<div class="labels-y" v-if="this.$store.state.settings.reversiBoardLabels"> | 			<div class="labels-y" v-if="this.$store.state.settings.games.reversi.showBoardLabels"> | ||||||
| 				<div v-for="i in game.settings.map.length">{{ i }}</div> | 				<div v-for="i in game.settings.map.length">{{ i }}</div> | ||||||
| 			</div> | 			</div> | ||||||
| 			<div class="cells" :style="cellsStyle"> | 			<div class="cells" :style="cellsStyle"> | ||||||
| @@ -30,15 +30,15 @@ | |||||||
| 						:class="{ empty: stone == null, none: o.map[i] == 'null', isEnded: game.isEnded, myTurn: !game.isEnded && isMyTurn, can: turnUser ? o.canPut(turnUser.id == blackUser.id, i) : null, prev: o.prevPos == i }" | 						:class="{ empty: stone == null, none: o.map[i] == 'null', isEnded: game.isEnded, myTurn: !game.isEnded && isMyTurn, can: turnUser ? o.canPut(turnUser.id == blackUser.id, i) : null, prev: o.prevPos == i }" | ||||||
| 						@click="set(i)" | 						@click="set(i)" | ||||||
| 						:title="`${String.fromCharCode(65 + o.transformPosToXy(i)[0])}${o.transformPosToXy(i)[1] + 1}`"> | 						:title="`${String.fromCharCode(65 + o.transformPosToXy(i)[0])}${o.transformPosToXy(i)[1] + 1}`"> | ||||||
| 					<img v-if="stone === true" :src="blackUser.avatarUrl" alt=""> | 					<img v-if="stone === true" :src="blackUser.avatarUrl" alt="black" :class="{ contrast: $store.state.settings.games.reversi.useContrastStones }"> | ||||||
| 					<img v-if="stone === false" :src="whiteUser.avatarUrl" alt=""> | 					<img v-if="stone === false" :src="whiteUser.avatarUrl" alt="white" :class="{ contrast: $store.state.settings.games.reversi.useContrastStones }"> | ||||||
| 				</div> | 				</div> | ||||||
| 			</div> | 			</div> | ||||||
| 			<div class="labels-y" v-if="this.$store.state.settings.reversiBoardLabels"> | 			<div class="labels-y" v-if="this.$store.state.settings.games.reversi.showBoardLabels"> | ||||||
| 				<div v-for="i in game.settings.map.length">{{ i }}</div> | 				<div v-for="i in game.settings.map.length">{{ i }}</div> | ||||||
| 			</div> | 			</div> | ||||||
| 		</div> | 		</div> | ||||||
| 		<div class="labels-x" v-if="this.$store.state.settings.reversiBoardLabels"> | 		<div class="labels-x" v-if="this.$store.state.settings.games.reversi.showBoardLabels"> | ||||||
| 			<span v-for="i in game.settings.map[0].length">{{ String.fromCharCode(64 + i) }}</span> | 			<span v-for="i in game.settings.map[0].length">{{ String.fromCharCode(64 + i) }}</span> | ||||||
| 		</div> | 		</div> | ||||||
| 	</div> | 	</div> | ||||||
| @@ -159,11 +159,9 @@ export default Vue.extend({ | |||||||
| 				canPutEverywhere: this.game.settings.canPutEverywhere, | 				canPutEverywhere: this.game.settings.canPutEverywhere, | ||||||
| 				loopedBoard: this.game.settings.loopedBoard | 				loopedBoard: this.game.settings.loopedBoard | ||||||
| 			}); | 			}); | ||||||
| 			this.logs.forEach((log, i) => { | 			for (const log of this.logs.slice(0, v)) { | ||||||
| 				if (i < v) { |  | ||||||
| 				this.o.put(log.color, log.pos); | 				this.o.put(log.color, log.pos); | ||||||
| 			} | 			} | ||||||
| 			}); |  | ||||||
| 			this.$forceUpdate(); | 			this.$forceUpdate(); | ||||||
| 		} | 		} | ||||||
| 	}, | 	}, | ||||||
| @@ -421,6 +419,13 @@ root(isDark) | |||||||
| 						width 100% | 						width 100% | ||||||
| 						height 100% | 						height 100% | ||||||
|  |  | ||||||
|  | 						&.contrast | ||||||
|  | 							&[alt="black"] | ||||||
|  | 								filter brightness(.5) | ||||||
|  |  | ||||||
|  | 							&[alt="white"] | ||||||
|  | 								filter brightness(2) | ||||||
|  |  | ||||||
| 	> .graph | 	> .graph | ||||||
| 		display grid | 		display grid | ||||||
| 		grid-template-columns repeat(61, 1fr) | 		grid-template-columns repeat(61, 1fr) | ||||||
|   | |||||||
| @@ -1,5 +1,7 @@ | |||||||
| import Vue from 'vue'; | import Vue from 'vue'; | ||||||
|  |  | ||||||
|  | import tagCloud from './tag-cloud.vue'; | ||||||
|  | import trends from './trends.vue'; | ||||||
| import analogClock from './analog-clock.vue'; | import analogClock from './analog-clock.vue'; | ||||||
| import menu from './menu.vue'; | import menu from './menu.vue'; | ||||||
| import noteHeader from './note-header.vue'; | import noteHeader from './note-header.vue'; | ||||||
| @@ -40,6 +42,8 @@ import uiSelect from './ui/select.vue'; | |||||||
| import formButton from './ui/form/button.vue'; | import formButton from './ui/form/button.vue'; | ||||||
| import formRadio from './ui/form/radio.vue'; | import formRadio from './ui/form/radio.vue'; | ||||||
|  |  | ||||||
|  | Vue.component('mk-tag-cloud', tagCloud); | ||||||
|  | Vue.component('mk-trends', trends); | ||||||
| Vue.component('mk-analog-clock', analogClock); | Vue.component('mk-analog-clock', analogClock); | ||||||
| Vue.component('mk-menu', menu); | Vue.component('mk-menu', menu); | ||||||
| Vue.component('mk-note-header', noteHeader); | Vue.component('mk-note-header', noteHeader); | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| <template> | <template> | ||||||
| <div class="mk-menu"> | <div class="onchrpzrvnoruiaenfcqvccjfuupzzwv"> | ||||||
| 	<div class="backdrop" ref="backdrop" @click="close"></div> | 	<div class="backdrop" ref="backdrop" @click="close"></div> | ||||||
| 	<div class="popover" :class="{ hukidasi }" ref="popover"> | 	<div class="popover" :class="{ hukidasi }" ref="popover"> | ||||||
| 		<template v-for="item in items"> | 		<template v-for="item in items"> | ||||||
| @@ -119,9 +119,10 @@ export default Vue.extend({ | |||||||
| <style lang="stylus" scoped> | <style lang="stylus" scoped> | ||||||
| @import '~const.styl' | @import '~const.styl' | ||||||
|  |  | ||||||
| $border-color = rgba(27, 31, 35, 0.15) | root(isDark) | ||||||
|  | 	$bg-color = isDark ? #2c303c : #fff | ||||||
|  | 	$border-color = rgba(27, 31, 35, 0.15) | ||||||
|  |  | ||||||
| .mk-menu |  | ||||||
| 	position initial | 	position initial | ||||||
|  |  | ||||||
| 	> .backdrop | 	> .backdrop | ||||||
| @@ -131,14 +132,14 @@ $border-color = rgba(27, 31, 35, 0.15) | |||||||
| 		z-index 10000 | 		z-index 10000 | ||||||
| 		width 100% | 		width 100% | ||||||
| 		height 100% | 		height 100% | ||||||
| 		background rgba(#000, 0.1) | 		background rgba(#000, isDark ? 0.5 : 0.1) | ||||||
| 		opacity 0 | 		opacity 0 | ||||||
|  |  | ||||||
| 	> .popover | 	> .popover | ||||||
| 		position absolute | 		position absolute | ||||||
| 		z-index 10001 | 		z-index 10001 | ||||||
| 		padding 8px 0 | 		padding 8px 0 | ||||||
| 		background #fff | 		background $bg-color | ||||||
| 		border 1px solid $border-color | 		border 1px solid $border-color | ||||||
| 		border-radius 4px | 		border-radius 4px | ||||||
| 		box-shadow 0 3px 12px rgba(27, 31, 35, 0.15) | 		box-shadow 0 3px 12px rgba(27, 31, 35, 0.15) | ||||||
| @@ -172,12 +173,13 @@ $border-color = rgba(27, 31, 35, 0.15) | |||||||
| 				border-top solid $balloon-size transparent | 				border-top solid $balloon-size transparent | ||||||
| 				border-left solid $balloon-size transparent | 				border-left solid $balloon-size transparent | ||||||
| 				border-right solid $balloon-size transparent | 				border-right solid $balloon-size transparent | ||||||
| 				border-bottom solid $balloon-size #fff | 				border-bottom solid $balloon-size $bg-color | ||||||
|  |  | ||||||
| 		> button | 		> button | ||||||
| 			display block | 			display block | ||||||
| 			padding 8px 16px | 			padding 8px 16px | ||||||
| 			width 100% | 			width 100% | ||||||
|  | 			color isDark ? #d6dce2 : #111 | ||||||
|  |  | ||||||
| 			&:hover | 			&:hover | ||||||
| 				color $theme-color-foreground | 				color $theme-color-foreground | ||||||
| @@ -191,6 +193,12 @@ $border-color = rgba(27, 31, 35, 0.15) | |||||||
| 		> div | 		> div | ||||||
| 			margin 8px 0 | 			margin 8px 0 | ||||||
| 			height 1px | 			height 1px | ||||||
| 			background #eee | 			background isDark ? #1c2023 : #eee | ||||||
|  |  | ||||||
|  | .onchrpzrvnoruiaenfcqvccjfuupzzwv[data-darkmode] | ||||||
|  | 	root(true) | ||||||
|  |  | ||||||
|  | .onchrpzrvnoruiaenfcqvccjfuupzzwv:not([data-darkmode]) | ||||||
|  | 	root(false) | ||||||
|  |  | ||||||
| </style> | </style> | ||||||
|   | |||||||
| @@ -3,7 +3,7 @@ | |||||||
| 	@dragover.prevent.stop="onDragover" | 	@dragover.prevent.stop="onDragover" | ||||||
| 	@drop.prevent.stop="onDrop" | 	@drop.prevent.stop="onDrop" | ||||||
| > | > | ||||||
| 	<div class="stream"> | 	<div class="body"> | ||||||
| 		<p class="init" v-if="init">%fa:spinner .spin%%i18n:common.loading%</p> | 		<p class="init" v-if="init">%fa:spinner .spin%%i18n:common.loading%</p> | ||||||
| 		<p class="empty" v-if="!init && messages.length == 0">%fa:info-circle%%i18n:@empty%</p> | 		<p class="empty" v-if="!init && messages.length == 0">%fa:info-circle%%i18n:@empty%</p> | ||||||
| 		<p class="no-history" v-if="!init && messages.length > 0 && !existMoreMessages">%fa:flag%%i18n:@no-history%</p> | 		<p class="no-history" v-if="!init && messages.length > 0 && !existMoreMessages">%fa:flag%%i18n:@no-history%</p> | ||||||
| @@ -77,6 +77,12 @@ export default Vue.extend({ | |||||||
| 		this.connection.on('message', this.onMessage); | 		this.connection.on('message', this.onMessage); | ||||||
| 		this.connection.on('read', this.onRead); | 		this.connection.on('read', this.onRead); | ||||||
|  |  | ||||||
|  | 		if (this.isNaked) { | ||||||
|  | 			window.addEventListener('scroll', this.onScroll, { passive: true }); | ||||||
|  | 		} else { | ||||||
|  | 			this.$el.addEventListener('scroll', this.onScroll, { passive: true }); | ||||||
|  | 		} | ||||||
|  |  | ||||||
| 		document.addEventListener('visibilitychange', this.onVisibilitychange); | 		document.addEventListener('visibilitychange', this.onVisibilitychange); | ||||||
|  |  | ||||||
| 		this.fetchMessages().then(() => { | 		this.fetchMessages().then(() => { | ||||||
| @@ -90,6 +96,12 @@ export default Vue.extend({ | |||||||
| 		this.connection.off('read', this.onRead); | 		this.connection.off('read', this.onRead); | ||||||
| 		this.connection.close(); | 		this.connection.close(); | ||||||
|  |  | ||||||
|  | 		if (this.isNaked) { | ||||||
|  | 			window.removeEventListener('scroll', this.onScroll); | ||||||
|  | 		} else { | ||||||
|  | 			this.$el.removeEventListener('scroll', this.onScroll); | ||||||
|  | 		} | ||||||
|  |  | ||||||
| 		document.removeEventListener('visibilitychange', this.onVisibilitychange); | 		document.removeEventListener('visibilitychange', this.onVisibilitychange); | ||||||
| 	}, | 	}, | ||||||
|  |  | ||||||
| @@ -226,6 +238,14 @@ export default Vue.extend({ | |||||||
| 			}, 4000); | 			}, 4000); | ||||||
| 		}, | 		}, | ||||||
|  |  | ||||||
|  | 		onScroll() { | ||||||
|  | 			const el = this.isNaked ? window.document.documentElement : this.$el; | ||||||
|  | 			const current = el.scrollTop + el.clientHeight; | ||||||
|  | 			if (current > el.scrollHeight - 1) { | ||||||
|  | 				this.showIndicator = false; | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  |  | ||||||
| 		onVisibilitychange() { | 		onVisibilitychange() { | ||||||
| 			if (document.hidden) return; | 			if (document.hidden) return; | ||||||
| 			this.messages.forEach(message => { | 			this.messages.forEach(message => { | ||||||
| @@ -251,7 +271,7 @@ root(isDark) | |||||||
| 	height 100% | 	height 100% | ||||||
| 	background isDark ? #191b22 : #fff | 	background isDark ? #191b22 : #fff | ||||||
|  |  | ||||||
| 	> .stream | 	> .body | ||||||
| 		width 100% | 		width 100% | ||||||
| 		max-width 600px | 		max-width 600px | ||||||
| 		margin 0 auto | 		margin 0 auto | ||||||
|   | |||||||
| @@ -205,17 +205,8 @@ export default Vue.component('misskey-flavored-markdown', { | |||||||
| 			} | 			} | ||||||
| 		})); | 		})); | ||||||
|  |  | ||||||
| 		const _els = []; | 		// el.tag === 'br' のとき i !== 0 が保証されるため、短絡評価により els[i - 1] は配列外参照しない | ||||||
| 		els.forEach((el, i) => { | 		const _els = els.filter((el, i) => !(el.tag === 'br' && ['div', 'pre'].includes(els[i - 1].tag))); | ||||||
| 			if (el.tag == 'br') { |  | ||||||
| 				if (!['div', 'pre'].includes(els[i - 1].tag)) { |  | ||||||
| 					_els.push(el); |  | ||||||
| 				} |  | ||||||
| 			} else { |  | ||||||
| 				_els.push(el); |  | ||||||
| 			} |  | ||||||
| 		}); |  | ||||||
|  |  | ||||||
| 		return createElement('span', _els); | 		return createElement('span', _els); | ||||||
| 	} | 	} | ||||||
| }); | }); | ||||||
|   | |||||||
| @@ -6,7 +6,7 @@ | |||||||
| 	<i>・</i> | 	<i>・</i> | ||||||
| 	<a :href="feedbackUrl" target="_blank">%i18n:@feedback%</a> | 	<a :href="feedbackUrl" target="_blank">%i18n:@feedback%</a> | ||||||
| 	<i>・</i> | 	<i>・</i> | ||||||
| 	<a :href="devUrl">%i18n:@develop%</a> | 	<a href="/dev">%i18n:@develop%</a> | ||||||
| 	<i>・</i> | 	<i>・</i> | ||||||
| 	<a href="https://twitter.com/misskey_xyz" target="_blank">Follow us on %fa:B twitter%</a> | 	<a href="https://twitter.com/misskey_xyz" target="_blank">Follow us on %fa:B twitter%</a> | ||||||
| </span> | </span> | ||||||
| @@ -14,18 +14,21 @@ | |||||||
|  |  | ||||||
| <script lang="ts"> | <script lang="ts"> | ||||||
| import Vue from 'vue'; | import Vue from 'vue'; | ||||||
| import { docsUrl, statsUrl, statusUrl, devUrl, repositoryUrl, feedbackUrl, lang } from '../../../config'; | import { lang } from '../../../config'; | ||||||
|  |  | ||||||
| export default Vue.extend({ | export default Vue.extend({ | ||||||
| 	data() { | 	data() { | ||||||
| 		return { | 		return { | ||||||
| 			aboutUrl: `${docsUrl}/${lang}/about`, | 			aboutUrl: `/docs/${lang}/about`, | ||||||
| 			statsUrl, | 			repositoryUrl: 'https://github.com/syuilo/misskey', | ||||||
| 			statusUrl, | 			feedbackUrl: 'https://github.com/syuilo/misskey/issues/new' | ||||||
| 			devUrl, |  | ||||||
| 			repositoryUrl: repositoryUrl || `https://github.com/syuilo/misskey`, |  | ||||||
| 			feedbackUrl: feedbackUrl || `https://github.com/syuilo/misskey/issues/new` |  | ||||||
| 		} | 		} | ||||||
|  | 	}, | ||||||
|  | 	created() { | ||||||
|  | 		(this as any).os.getMeta().then(meta => { | ||||||
|  | 			if (meta.maintainer.repository_url) this.repositoryUrl = meta.maintainer.repository_url; | ||||||
|  | 			if (meta.maintainer.feedback_url) this.feedbackUrl = meta.maintainer.feedback_url; | ||||||
|  | 		}); | ||||||
| 	} | 	} | ||||||
| }); | }); | ||||||
| </script> | </script> | ||||||
|   | |||||||
| @@ -6,17 +6,27 @@ | |||||||
|  |  | ||||||
| <script lang="ts"> | <script lang="ts"> | ||||||
| import Vue from 'vue'; | import Vue from 'vue'; | ||||||
|  | import { url } from '../../../config'; | ||||||
|  | import copyToClipboard from '../../../common/scripts/copy-to-clipboard'; | ||||||
|  |  | ||||||
| export default Vue.extend({ | export default Vue.extend({ | ||||||
| 	props: ['note', 'source', 'compact'], | 	props: ['note', 'source', 'compact'], | ||||||
| 	computed: { | 	computed: { | ||||||
| 		items() { | 		items() { | ||||||
| 			const items = []; | 			const items = [{ | ||||||
| 			items.push({ | 				icon: '%fa:info-circle%', | ||||||
|  | 				text: '%i18n:@detail%', | ||||||
|  | 				action: this.detail | ||||||
|  | 			}, { | ||||||
|  | 				icon: '%fa:link%', | ||||||
|  | 				text: '%i18n:@copy-link%', | ||||||
|  | 				action: this.copyLink | ||||||
|  | 			}, null, { | ||||||
| 				icon: '%fa:star%', | 				icon: '%fa:star%', | ||||||
| 				text: '%i18n:@favorite%', | 				text: '%i18n:@favorite%', | ||||||
| 				action: this.favorite | 				action: this.favorite | ||||||
| 			}); | 			}]; | ||||||
|  |  | ||||||
| 			if (this.note.userId == this.$store.state.i.id) { | 			if (this.note.userId == this.$store.state.i.id) { | ||||||
| 				items.push({ | 				items.push({ | ||||||
| 					icon: '%fa:thumbtack%', | 					icon: '%fa:thumbtack%', | ||||||
| @@ -42,6 +52,14 @@ export default Vue.extend({ | |||||||
| 		} | 		} | ||||||
| 	}, | 	}, | ||||||
| 	methods: { | 	methods: { | ||||||
|  | 		detail() { | ||||||
|  | 			this.$router.push(`/notes/${ this.note.id }`); | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		copyLink() { | ||||||
|  | 			copyToClipboard(`${url}/notes/${ this.note.id }`); | ||||||
|  | 		}, | ||||||
|  |  | ||||||
| 		pin() { | 		pin() { | ||||||
| 			(this as any).api('i/pin', { | 			(this as any).api('i/pin', { | ||||||
| 				noteId: this.note.id | 				noteId: this.note.id | ||||||
|   | |||||||
| @@ -20,6 +20,7 @@ | |||||||
|  |  | ||||||
| <script lang="ts"> | <script lang="ts"> | ||||||
| import Vue from 'vue'; | import Vue from 'vue'; | ||||||
|  | import { erase } from '../../../../../prelude/array'; | ||||||
| export default Vue.extend({ | export default Vue.extend({ | ||||||
| 	data() { | 	data() { | ||||||
| 		return { | 		return { | ||||||
| @@ -53,7 +54,7 @@ export default Vue.extend({ | |||||||
|  |  | ||||||
| 		get() { | 		get() { | ||||||
| 			return { | 			return { | ||||||
| 				choices: this.choices.filter(choice => choice != '') | 				choices: erase('', this.choices) | ||||||
| 			} | 			} | ||||||
| 		}, | 		}, | ||||||
|  |  | ||||||
|   | |||||||
| @@ -21,6 +21,7 @@ | |||||||
|  |  | ||||||
| <script lang="ts"> | <script lang="ts"> | ||||||
| import Vue from 'vue'; | import Vue from 'vue'; | ||||||
|  | import { sum } from '../../../../../prelude/array'; | ||||||
| export default Vue.extend({ | export default Vue.extend({ | ||||||
| 	props: ['note'], | 	props: ['note'], | ||||||
| 	data() { | 	data() { | ||||||
| @@ -33,7 +34,7 @@ export default Vue.extend({ | |||||||
| 			return this.note.poll; | 			return this.note.poll; | ||||||
| 		}, | 		}, | ||||||
| 		total(): number { | 		total(): number { | ||||||
| 			return this.poll.choices.reduce((a, b) => a + b.votes, 0); | 			return sum(this.poll.choices.map(x => x.votes)); | ||||||
| 		}, | 		}, | ||||||
| 		isVoted(): boolean { | 		isVoted(): boolean { | ||||||
| 			return this.poll.choices.some(c => c.isVoted); | 			return this.poll.choices.some(c => c.isVoted); | ||||||
|   | |||||||
| @@ -1,17 +1,17 @@ | |||||||
| <template> | <template> | ||||||
| <span class="mk-reaction-icon"> | <span class="mk-reaction-icon"> | ||||||
| 	<img v-if="reaction == 'like'" src="/assets/reactions/like.png" alt="%i18n:common.reactions.like%"> | 	<img v-if="reaction == 'like'" src="https://twemoji.maxcdn.com/2/svg/1f44d.svg" alt="%i18n:common.reactions.like%"> | ||||||
| 	<img v-if="reaction == 'love'" src="/assets/reactions/love.png" alt="%i18n:common.reactions.love%"> | 	<img v-if="reaction == 'love'" src="https://twemoji.maxcdn.com/2/svg/2764.svg" alt="%i18n:common.reactions.love%"> | ||||||
| 	<img v-if="reaction == 'laugh'" src="/assets/reactions/laugh.png" alt="%i18n:common.reactions.laugh%"> | 	<img v-if="reaction == 'laugh'" src="https://twemoji.maxcdn.com/2/svg/1f606.svg" alt="%i18n:common.reactions.laugh%"> | ||||||
| 	<img v-if="reaction == 'hmm'" src="/assets/reactions/hmm.png" alt="%i18n:common.reactions.hmm%"> | 	<img v-if="reaction == 'hmm'" src="https://twemoji.maxcdn.com/2/svg/1f914.svg" alt="%i18n:common.reactions.hmm%"> | ||||||
| 	<img v-if="reaction == 'surprise'" src="/assets/reactions/surprise.png" alt="%i18n:common.reactions.surprise%"> | 	<img v-if="reaction == 'surprise'" src="https://twemoji.maxcdn.com/2/svg/1f62e.svg" alt="%i18n:common.reactions.surprise%"> | ||||||
| 	<img v-if="reaction == 'congrats'" src="/assets/reactions/congrats.png" alt="%i18n:common.reactions.congrats%"> | 	<img v-if="reaction == 'congrats'" src="https://twemoji.maxcdn.com/2/svg/1f389.svg" alt="%i18n:common.reactions.congrats%"> | ||||||
| 	<img v-if="reaction == 'angry'" src="/assets/reactions/angry.png" alt="%i18n:common.reactions.angry%"> | 	<img v-if="reaction == 'angry'" src="https://twemoji.maxcdn.com/2/svg/1f4a2.svg" alt="%i18n:common.reactions.angry%"> | ||||||
| 	<img v-if="reaction == 'confused'" src="/assets/reactions/confused.png" alt="%i18n:common.reactions.confused%"> | 	<img v-if="reaction == 'confused'" src="https://twemoji.maxcdn.com/2/svg/1f625.svg" alt="%i18n:common.reactions.confused%"> | ||||||
| 	<img v-if="reaction == 'rip'" src="/assets/reactions/rip.png" alt="%i18n:common.reactions.rip%"> | 	<img v-if="reaction == 'rip'" src="https://twemoji.maxcdn.com/2/svg/1f607.svg" alt="%i18n:common.reactions.rip%"> | ||||||
| 	<template v-if="reaction == 'pudding'"> | 	<template v-if="reaction == 'pudding'"> | ||||||
| 		<img v-if="$store.getters.isSignedIn && $store.state.settings.iLikeSushi" src="/assets/reactions/sushi.png" alt="%i18n:common.reactions.pudding%"> | 		<img v-if="$store.getters.isSignedIn && $store.state.settings.iLikeSushi" src="https://twemoji.maxcdn.com/2/svg/1f363.svg" alt="%i18n:common.reactions.pudding%"> | ||||||
| 		<img v-else src="/assets/reactions/pudding.png" alt="%i18n:common.reactions.pudding%"> | 		<img v-else src="https://twemoji.maxcdn.com/2/svg/1f36e.svg" alt="%i18n:common.reactions.pudding%"> | ||||||
| 	</template> | 	</template> | ||||||
| </span> | </span> | ||||||
| </template> | </template> | ||||||
|   | |||||||
| @@ -78,7 +78,7 @@ export default Vue.extend({ | |||||||
| 			cursor wait !important | 			cursor wait !important | ||||||
|  |  | ||||||
| 	> .avatar | 	> .avatar | ||||||
| 		margin 16px auto 0 auto | 		margin 0 auto 0 auto | ||||||
| 		width 64px | 		width 64px | ||||||
| 		height 64px | 		height 64px | ||||||
| 		background #ddd | 		background #ddd | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| <template> | <template> | ||||||
| <form class="mk-signup" @submit.prevent="onSubmit" :autocomplete="Math.random()"> | <form class="mk-signup" @submit.prevent="onSubmit" :autocomplete="Math.random()"> | ||||||
|  | 	<template v-if="meta"> | ||||||
| 		<ui-input v-if="meta.disableRegistration" v-model="invitationCode" type="text" :autocomplete="Math.random()" spellcheck="false" required> | 		<ui-input v-if="meta.disableRegistration" v-model="invitationCode" type="text" :autocomplete="Math.random()" spellcheck="false" required> | ||||||
| 			<span>%i18n:@invitation-code%</span> | 			<span>%i18n:@invitation-code%</span> | ||||||
| 			<span slot="prefix">%fa:id-card-alt%</span> | 			<span slot="prefix">%fa:id-card-alt%</span> | ||||||
| @@ -34,8 +35,9 @@ | |||||||
| 				<p slot="text" v-if="passwordRetypeState == 'not-match'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@password-not-matched%</p> | 				<p slot="text" v-if="passwordRetypeState == 'not-match'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@password-not-matched%</p> | ||||||
| 			</div> | 			</div> | ||||||
| 		</ui-input> | 		</ui-input> | ||||||
| 	<div v-if="meta && meta.recaptchaSitekey != null" class="g-recaptcha" :data-sitekey="meta.recaptchaSitekey" style="margin: 16px 0;"></div> | 		<div v-if="meta.recaptchaSitekey != null" class="g-recaptcha" :data-sitekey="meta.recaptchaSitekey" style="margin: 16px 0;"></div> | ||||||
| 		<ui-button type="submit">%i18n:@create%</ui-button> | 		<ui-button type="submit">%i18n:@create%</ui-button> | ||||||
|  | 	</template> | ||||||
| </form> | </form> | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										90
									
								
								src/client/app/common/views/components/tag-cloud.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								src/client/app/common/views/components/tag-cloud.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,90 @@ | |||||||
|  | <template> | ||||||
|  | <div class="jtivnzhfwquxpsfidertopbmwmchmnmo"> | ||||||
|  | 	<p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p> | ||||||
|  | 	<p class="empty" v-else-if="tags.length == 0">%fa:exclamation-circle%%i18n:@empty%</p> | ||||||
|  | 	<div v-else> | ||||||
|  | 		<vue-word-cloud | ||||||
|  | 				:words="tags.slice(0, 20).map(x => [x.name, x.count])" | ||||||
|  | 				:color="color" | ||||||
|  | 				:spacing="1"> | ||||||
|  | 			<template slot-scope="{word, text, weight}"> | ||||||
|  | 				<div style="cursor: pointer;" :title="weight"> | ||||||
|  | 					{{ text }} | ||||||
|  | 				</div> | ||||||
|  | 			</template> | ||||||
|  | 		</vue-word-cloud> | ||||||
|  | 	</div> | ||||||
|  | </div> | ||||||
|  | </template> | ||||||
|  |  | ||||||
|  | <script lang="ts"> | ||||||
|  | import Vue from 'vue'; | ||||||
|  | import * as VueWordCloud from 'vuewordcloud'; | ||||||
|  |  | ||||||
|  | export default Vue.extend({ | ||||||
|  | 	components: { | ||||||
|  | 		[VueWordCloud.name]: VueWordCloud | ||||||
|  | 	}, | ||||||
|  | 	data() { | ||||||
|  | 		return { | ||||||
|  | 			tags: [], | ||||||
|  | 			fetching: true, | ||||||
|  | 			clock: null | ||||||
|  | 		}; | ||||||
|  | 	}, | ||||||
|  | 	mounted() { | ||||||
|  | 		this.fetch(); | ||||||
|  | 		this.clock = setInterval(this.fetch, 1000 * 60); | ||||||
|  | 	}, | ||||||
|  | 	beforeDestroy() { | ||||||
|  | 		clearInterval(this.clock); | ||||||
|  | 	}, | ||||||
|  | 	methods: { | ||||||
|  | 		fetch() { | ||||||
|  | 			(this as any).api('aggregation/hashtags').then(tags => { | ||||||
|  | 				this.tags = tags; | ||||||
|  | 				this.fetching = false; | ||||||
|  | 			}); | ||||||
|  | 		}, | ||||||
|  | 		color([, weight]) { | ||||||
|  | 			const peak = Math.max.apply(null, this.tags.map(x => x.count)); | ||||||
|  | 			const w = weight / peak; | ||||||
|  |  | ||||||
|  | 			if (w > 0.9) { | ||||||
|  | 				return this.$store.state.device.darkmode ? '#ff4e69' : '#ff4e69'; | ||||||
|  | 			} else if (w > 0.5) { | ||||||
|  | 				return this.$store.state.device.darkmode ? '#3bc4c7' : '#3bc4c7'; | ||||||
|  | 			} else { | ||||||
|  | 				return this.$store.state.device.darkmode ? '#fff' : '#555'; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | }); | ||||||
|  | </script> | ||||||
|  |  | ||||||
|  | <style lang="stylus" scoped> | ||||||
|  | root(isDark) | ||||||
|  | 	height 100% | ||||||
|  | 	width 100% | ||||||
|  |  | ||||||
|  | 	> .fetching | ||||||
|  | 	> .empty | ||||||
|  | 		margin 0 | ||||||
|  | 		padding 16px | ||||||
|  | 		text-align center | ||||||
|  | 		color #aaa | ||||||
|  |  | ||||||
|  | 		> [data-fa] | ||||||
|  | 			margin-right 4px | ||||||
|  |  | ||||||
|  | 	> div | ||||||
|  | 		height 100% | ||||||
|  | 		width 100% | ||||||
|  |  | ||||||
|  | .jtivnzhfwquxpsfidertopbmwmchmnmo[data-darkmode] | ||||||
|  | 	root(true) | ||||||
|  |  | ||||||
|  | .jtivnzhfwquxpsfidertopbmwmchmnmo:not([data-darkmode]) | ||||||
|  | 	root(false) | ||||||
|  |  | ||||||
|  | </style> | ||||||
							
								
								
									
										105
									
								
								src/client/app/common/views/components/trends.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								src/client/app/common/views/components/trends.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,105 @@ | |||||||
|  | <template> | ||||||
|  | <div class="csqvmxybqbycalfhkxvyfrgbrdalkaoc"> | ||||||
|  | 	<p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p> | ||||||
|  | 	<p class="empty" v-else-if="stats.length == 0">%fa:exclamation-circle%%i18n:@empty%</p> | ||||||
|  | 	<!-- トランジションを有効にするとなぜかメモリリークする --> | ||||||
|  | 	<!-- <transition-group v-else tag="div" name="chart"> --> | ||||||
|  | 	<div> | ||||||
|  | 		<div v-for="stat in stats" :key="stat.tag"> | ||||||
|  | 			<div class="tag"> | ||||||
|  | 				<router-link :to="`/tags/${ encodeURIComponent(stat.tag) }`" :title="stat.tag">#{{ stat.tag }}</router-link> | ||||||
|  | 				<p>{{ '%i18n:@count%'.replace('{}', stat.usersCount) }}</p> | ||||||
|  | 			</div> | ||||||
|  | 			<x-chart class="chart" :src="stat.chart"/> | ||||||
|  | 		</div> | ||||||
|  | 	</div> | ||||||
|  | 	<!-- </transition-group> --> | ||||||
|  | </div> | ||||||
|  | </template> | ||||||
|  |  | ||||||
|  | <script lang="ts"> | ||||||
|  | import Vue from 'vue'; | ||||||
|  | import XChart from './trends.chart.vue'; | ||||||
|  |  | ||||||
|  | export default Vue.extend({ | ||||||
|  | 	components: { | ||||||
|  | 		XChart | ||||||
|  | 	}, | ||||||
|  | 	data() { | ||||||
|  | 		return { | ||||||
|  | 			stats: [], | ||||||
|  | 			fetching: true, | ||||||
|  | 			clock: null | ||||||
|  | 		}; | ||||||
|  | 	}, | ||||||
|  | 	mounted() { | ||||||
|  | 		this.fetch(); | ||||||
|  | 		this.clock = setInterval(this.fetch, 1000 * 60); | ||||||
|  | 	}, | ||||||
|  | 	beforeDestroy() { | ||||||
|  | 		clearInterval(this.clock); | ||||||
|  | 	}, | ||||||
|  | 	methods: { | ||||||
|  | 		fetch() { | ||||||
|  | 			(this as any).api('hashtags/trend').then(stats => { | ||||||
|  | 				this.stats = stats; | ||||||
|  | 				this.fetching = false; | ||||||
|  | 			}); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | }); | ||||||
|  | </script> | ||||||
|  |  | ||||||
|  | <style lang="stylus" scoped> | ||||||
|  | root(isDark) | ||||||
|  | 	> .fetching | ||||||
|  | 	> .empty | ||||||
|  | 		margin 0 | ||||||
|  | 		padding 16px | ||||||
|  | 		text-align center | ||||||
|  | 		color #aaa | ||||||
|  |  | ||||||
|  | 		> [data-fa] | ||||||
|  | 			margin-right 4px | ||||||
|  |  | ||||||
|  | 	> div | ||||||
|  | 		.chart-move | ||||||
|  | 			transition transform 1s ease | ||||||
|  |  | ||||||
|  | 		> div | ||||||
|  | 			display flex | ||||||
|  | 			align-items center | ||||||
|  | 			padding 14px 16px | ||||||
|  |  | ||||||
|  | 			&:not(:last-child) | ||||||
|  | 				border-bottom solid 1px isDark ? #393f4f : #eee | ||||||
|  |  | ||||||
|  | 			> .tag | ||||||
|  | 				flex 1 | ||||||
|  | 				overflow hidden | ||||||
|  | 				font-size 14px | ||||||
|  | 				color isDark ? #9baec8 : #65727b | ||||||
|  |  | ||||||
|  | 				> a | ||||||
|  | 					display block | ||||||
|  | 					width 100% | ||||||
|  | 					white-space nowrap | ||||||
|  | 					overflow hidden | ||||||
|  | 					text-overflow ellipsis | ||||||
|  | 					color inherit | ||||||
|  |  | ||||||
|  | 				> p | ||||||
|  | 					margin 0 | ||||||
|  | 					font-size 75% | ||||||
|  | 					opacity 0.7 | ||||||
|  |  | ||||||
|  | 			> .chart | ||||||
|  | 				height 30px | ||||||
|  |  | ||||||
|  | .csqvmxybqbycalfhkxvyfrgbrdalkaoc[data-darkmode] | ||||||
|  | 	root(true) | ||||||
|  |  | ||||||
|  | .csqvmxybqbycalfhkxvyfrgbrdalkaoc:not([data-darkmode]) | ||||||
|  | 	root(false) | ||||||
|  |  | ||||||
|  | </style> | ||||||
| @@ -24,17 +24,32 @@ export default Vue.extend({ | |||||||
|  |  | ||||||
| root(isDark) | root(isDark) | ||||||
| 	margin 16px | 	margin 16px | ||||||
| 	padding 16px |  | ||||||
| 	color isDark ? #fff : #000 | 	color isDark ? #fff : #000 | ||||||
| 	background isDark ? #282C37 : #fff | 	background isDark ? #282C37 : #fff | ||||||
| 	box-shadow 0 3px 1px -2px rgba(#000, 0.2), 0 2px 2px 0 rgba(#000, 0.14), 0 1px 5px 0 rgba(#000, 0.12) | 	box-shadow 0 3px 1px -2px rgba(#000, 0.2), 0 2px 2px 0 rgba(#000, 0.14), 0 1px 5px 0 rgba(#000, 0.12) | ||||||
|  |  | ||||||
|  | 	> header | ||||||
|  | 		padding 16px | ||||||
|  | 		font-weight bold | ||||||
|  | 		font-size 20px | ||||||
|  | 		color isDark ? #fff : #444 | ||||||
|  |  | ||||||
|  | 		@media (min-width 500px) | ||||||
|  | 			padding 24px 32px | ||||||
|  |  | ||||||
|  | 	> section | ||||||
|  | 		padding 20px 16px | ||||||
|  | 		border-top solid 1px isDark ? rgba(#000, 0.3) : rgba(#000, 0.1) | ||||||
|  |  | ||||||
| 		@media (min-width 500px) | 		@media (min-width 500px) | ||||||
| 			padding 32px | 			padding 32px | ||||||
|  |  | ||||||
|  | 		&.fit-top | ||||||
|  | 			padding-top 0 | ||||||
|  |  | ||||||
| 		> header | 		> header | ||||||
| 		font-weight normal | 			margin-bottom 16px | ||||||
| 		font-size 24px | 			font-weight bold | ||||||
| 			color isDark ? #fff : #444 | 			color isDark ? #fff : #444 | ||||||
|  |  | ||||||
| .ui-card[data-darkmode] | .ui-card[data-darkmode] | ||||||
|   | |||||||
| @@ -55,7 +55,7 @@ export default Vue.extend({ | |||||||
|  |  | ||||||
| root(isDark) | root(isDark) | ||||||
| 	display inline-block | 	display inline-block | ||||||
| 	margin 32px 32px 32px 0 | 	margin 0 32px 0 0 | ||||||
| 	cursor pointer | 	cursor pointer | ||||||
| 	transition all 0.3s | 	transition all 0.3s | ||||||
|  |  | ||||||
|   | |||||||
| @@ -64,6 +64,12 @@ root(isDark) | |||||||
| 	cursor pointer | 	cursor pointer | ||||||
| 	transition all 0.3s | 	transition all 0.3s | ||||||
|  |  | ||||||
|  | 	&:first-child | ||||||
|  | 		margin-top 0 | ||||||
|  |  | ||||||
|  | 	&:last-child | ||||||
|  | 		margin-bottom 0 | ||||||
|  |  | ||||||
| 	> * | 	> * | ||||||
| 		user-select none | 		user-select none | ||||||
|  |  | ||||||
| @@ -89,6 +95,7 @@ root(isDark) | |||||||
|  |  | ||||||
| 	> .button | 	> .button | ||||||
| 		display inline-block | 		display inline-block | ||||||
|  | 		flex-shrink 0 | ||||||
| 		margin 3px 0 0 0 | 		margin 3px 0 0 0 | ||||||
| 		width 34px | 		width 34px | ||||||
| 		height 14px | 		height 14px | ||||||
|   | |||||||
| @@ -1,18 +1,20 @@ | |||||||
| <template> | <template> | ||||||
| <iframe v-if="player" :src="player" heigth="250" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen /> | <div v-if="player.url" class="player" :style="`padding: ${(player.height || 0) / (player.width || 1) * 100}% 0 0`"> | ||||||
|  | 	<iframe :src="player.url" :width="player.width || '100%'" :heigth="player.height || 250" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen /> | ||||||
|  | </div> | ||||||
| <div v-else-if="tweetUrl && detail" class="twitter"> | <div v-else-if="tweetUrl && detail" class="twitter"> | ||||||
| 	<blockquote ref="tweet" class="twitter-tweet" :data-theme="$store.state.device.darkmode ? 'dark' : null"> | 	<blockquote ref="tweet" class="twitter-tweet" :data-theme="$store.state.device.darkmode ? 'dark' : null"> | ||||||
| 		<a :href="url"></a> | 		<a :href="url"></a> | ||||||
| 	</blockquote> | 	</blockquote> | ||||||
| </div> | </div> | ||||||
| <div v-else class="mk-url-preview"> | <div v-else class="mk-url-preview"> | ||||||
| 	<a :href="url" target="_blank" :title="url" v-if="!fetching"> | 	<a :class="{ mini }" :href="url" target="_blank" :title="url" v-if="!fetching"> | ||||||
| 		<div class="thumbnail" v-if="thumbnail" :style="`background-image: url(${thumbnail})`"></div> | 		<div class="thumbnail" v-if="thumbnail" :style="`background-image: url(${thumbnail})`"></div> | ||||||
| 		<article> | 		<article> | ||||||
| 			<header> | 			<header> | ||||||
| 				<h1>{{ title }}</h1> | 				<h1>{{ title }}</h1> | ||||||
| 			</header> | 			</header> | ||||||
| 			<p>{{ description }}</p> | 			<p>{{ description.length > 85 ? description.slice(0, 85) + '…' : description }}</p> | ||||||
| 			<footer> | 			<footer> | ||||||
| 				<img class="icon" v-if="icon" :src="icon"/> | 				<img class="icon" v-if="icon" :src="icon"/> | ||||||
| 				<p>{{ sitename }}</p> | 				<p>{{ sitename }}</p> | ||||||
| @@ -26,65 +28,8 @@ | |||||||
| import Vue from 'vue'; | import Vue from 'vue'; | ||||||
| import { url as misskeyUrl } from '../../../config'; | import { url as misskeyUrl } from '../../../config'; | ||||||
|  |  | ||||||
| export default Vue.extend({ | // THIS IS THE WHITELIST FOR THE EMBED PLAYER | ||||||
| 	props: { | const whiteList = [ | ||||||
| 		url: { |  | ||||||
| 			type: String, |  | ||||||
| 			require: true |  | ||||||
| 		}, |  | ||||||
| 		detail: { |  | ||||||
| 			type: Boolean, |  | ||||||
| 			required: false, |  | ||||||
| 			default: false |  | ||||||
| 		} |  | ||||||
| 	}, |  | ||||||
| 	data() { |  | ||||||
| 		return { |  | ||||||
| 			fetching: true, |  | ||||||
| 			title: null, |  | ||||||
| 			description: null, |  | ||||||
| 			thumbnail: null, |  | ||||||
| 			icon: null, |  | ||||||
| 			sitename: null, |  | ||||||
| 			player: null, |  | ||||||
| 			tweetUrl: null, |  | ||||||
| 			misskeyUrl |  | ||||||
| 		}; |  | ||||||
| 	}, |  | ||||||
| 	created() { |  | ||||||
| 		const url = new URL(this.url); |  | ||||||
|  |  | ||||||
| 		if (this.detail && url.hostname == 'twitter.com' && /^\/.+\/status(es)?\/\d+/.test(url.pathname)) { |  | ||||||
| 			this.tweetUrl = url; |  | ||||||
| 			const twttr = (window as any).twttr || {}; |  | ||||||
| 			const loadTweet = () => twttr.widgets.load(this.$refs.tweet); |  | ||||||
|  |  | ||||||
| 			if (twttr.widgets) { |  | ||||||
| 				Vue.nextTick(loadTweet); |  | ||||||
| 			} else { |  | ||||||
| 				const wjsId = 'twitter-wjs'; |  | ||||||
| 				if (!document.getElementById(wjsId)) { |  | ||||||
| 					const head = document.getElementsByTagName('head')[0]; |  | ||||||
| 					const script = document.createElement('script'); |  | ||||||
| 					script.setAttribute('id', wjsId); |  | ||||||
| 					script.setAttribute('src', 'https://platform.twitter.com/widgets.js'); |  | ||||||
| 					head.appendChild(script); |  | ||||||
| 				} |  | ||||||
| 				twttr.ready = loadTweet; |  | ||||||
| 				(window as any).twttr = twttr; |  | ||||||
| 			} |  | ||||||
| 			return; |  | ||||||
| 		} |  | ||||||
| 		fetch('/url?url=' + encodeURIComponent(this.url)).then(res => { |  | ||||||
| 			res.json().then(info => { |  | ||||||
| 				if (info.url != null) { |  | ||||||
| 					this.title = info.title; |  | ||||||
| 					this.description = info.description; |  | ||||||
| 					this.thumbnail = info.thumbnail; |  | ||||||
| 					this.icon = info.icon; |  | ||||||
| 					this.sitename = info.sitename; |  | ||||||
| 					this.fetching = false; |  | ||||||
| 					if ([ // THIS IS THE WHITELIST FOR THE EMBED PLAYER |  | ||||||
| 	'afreecatv.com', | 	'afreecatv.com', | ||||||
| 	'aparat.com', | 	'aparat.com', | ||||||
| 	'applemusic.com', | 	'applemusic.com', | ||||||
| @@ -160,17 +105,99 @@ export default Vue.extend({ | |||||||
| 	'web.tv', | 	'web.tv', | ||||||
| 	'youtube.com', | 	'youtube.com', | ||||||
| 	'youtu.be' | 	'youtu.be' | ||||||
| 					].some(x => x == url.hostname || url.hostname.endsWith(`.${x}`))) | ]; | ||||||
|  |  | ||||||
|  | export default Vue.extend({ | ||||||
|  | 	props: { | ||||||
|  | 		url: { | ||||||
|  | 			type: String, | ||||||
|  | 			require: true | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		detail: { | ||||||
|  | 			type: Boolean, | ||||||
|  | 			required: false, | ||||||
|  | 			default: false | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		mini: { | ||||||
|  | 			type: Boolean, | ||||||
|  | 			required: false, | ||||||
|  | 			default: false | ||||||
|  | 		} | ||||||
|  | 	}, | ||||||
|  |  | ||||||
|  | 	data() { | ||||||
|  | 		return { | ||||||
|  | 			fetching: true, | ||||||
|  | 			title: null, | ||||||
|  | 			description: null, | ||||||
|  | 			thumbnail: null, | ||||||
|  | 			icon: null, | ||||||
|  | 			sitename: null, | ||||||
|  | 			player: { | ||||||
|  | 				url: null, | ||||||
|  | 				width: null, | ||||||
|  | 				height: null | ||||||
|  | 			}, | ||||||
|  | 			tweetUrl: null, | ||||||
|  | 			misskeyUrl | ||||||
|  | 		}; | ||||||
|  | 	}, | ||||||
|  |  | ||||||
|  | 	created() { | ||||||
|  | 		const url = new URL(this.url); | ||||||
|  |  | ||||||
|  | 		if (this.detail && url.hostname == 'twitter.com' && /^\/.+\/status(es)?\/\d+/.test(url.pathname)) { | ||||||
|  | 			this.tweetUrl = url; | ||||||
|  | 			const twttr = (window as any).twttr || {}; | ||||||
|  | 			const loadTweet = () => twttr.widgets.load(this.$refs.tweet); | ||||||
|  |  | ||||||
|  | 			if (twttr.widgets) { | ||||||
|  | 				Vue.nextTick(loadTweet); | ||||||
|  | 			} else { | ||||||
|  | 				const wjsId = 'twitter-wjs'; | ||||||
|  | 				if (!document.getElementById(wjsId)) { | ||||||
|  | 					const head = document.getElementsByTagName('head')[0]; | ||||||
|  | 					const script = document.createElement('script'); | ||||||
|  | 					script.setAttribute('id', wjsId); | ||||||
|  | 					script.setAttribute('src', 'https://platform.twitter.com/widgets.js'); | ||||||
|  | 					head.appendChild(script); | ||||||
|  | 				} | ||||||
|  | 				twttr.ready = loadTweet; | ||||||
|  | 				(window as any).twttr = twttr; | ||||||
|  | 			} | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		fetch(`/url?url=${encodeURIComponent(this.url)}`).then(res => { | ||||||
|  | 			res.json().then(info => { | ||||||
|  | 				if (info.url == null) return; | ||||||
|  | 				this.title = info.title; | ||||||
|  | 				this.description = info.description; | ||||||
|  | 				this.thumbnail = info.thumbnail; | ||||||
|  | 				this.icon = info.icon; | ||||||
|  | 				this.sitename = info.sitename; | ||||||
|  | 				this.fetching = false; | ||||||
|  | 				if (whiteList.some(x => x == url.hostname || url.hostname.endsWith(`.${x}`))) { | ||||||
| 					this.player = info.player; | 					this.player = info.player; | ||||||
| 				}	// info.url | 				} | ||||||
| 			})	// json | 			}) | ||||||
| 		});	// fetch | 		}); | ||||||
| 	}	// created | 	} | ||||||
| }); | }); | ||||||
| </script> | </script> | ||||||
|  |  | ||||||
| <style lang="stylus" scoped> | <style lang="stylus" scoped> | ||||||
| iframe | .player | ||||||
|  | 	position relative | ||||||
|  | 	width 100% | ||||||
|  |  | ||||||
|  | 	> iframe | ||||||
|  | 		height 100% | ||||||
|  | 		left 0 | ||||||
|  | 		position absolute | ||||||
|  | 		top 0 | ||||||
| 		width 100% | 		width 100% | ||||||
|  |  | ||||||
| root(isDark) | root(isDark) | ||||||
| @@ -272,6 +299,29 @@ root(isDark) | |||||||
| 						width 12px | 						width 12px | ||||||
| 						height 12px | 						height 12px | ||||||
|  |  | ||||||
|  | 		&.mini | ||||||
|  | 			font-size 10px | ||||||
|  |  | ||||||
|  | 			> .thumbnail | ||||||
|  | 				position relative | ||||||
|  | 				width 100% | ||||||
|  | 				height 60px | ||||||
|  |  | ||||||
|  | 			> article | ||||||
|  | 				left 0 | ||||||
|  | 				width 100% | ||||||
|  | 				padding 8px | ||||||
|  |  | ||||||
|  | 				> header | ||||||
|  | 					margin-bottom 4px | ||||||
|  |  | ||||||
|  | 				> footer | ||||||
|  | 					margin-top 4px | ||||||
|  |  | ||||||
|  | 					> img | ||||||
|  | 						width 12px | ||||||
|  | 						height 12px | ||||||
|  |  | ||||||
| .mk-url-preview[data-darkmode] | .mk-url-preview[data-darkmode] | ||||||
| 	root(true) | 	root(true) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -12,6 +12,7 @@ | |||||||
|  |  | ||||||
| <script lang="ts"> | <script lang="ts"> | ||||||
| import Vue from 'vue'; | import Vue from 'vue'; | ||||||
|  | import { toUnicode as decodePunycode } from 'punycode'; | ||||||
| export default Vue.extend({ | export default Vue.extend({ | ||||||
| 	props: ['url', 'target'], | 	props: ['url', 'target'], | ||||||
| 	data() { | 	data() { | ||||||
| @@ -27,11 +28,11 @@ export default Vue.extend({ | |||||||
| 	created() { | 	created() { | ||||||
| 		const url = new URL(this.url); | 		const url = new URL(this.url); | ||||||
| 		this.schema = url.protocol; | 		this.schema = url.protocol; | ||||||
| 		this.hostname = url.hostname; | 		this.hostname = decodePunycode(url.hostname); | ||||||
| 		this.port = url.port; | 		this.port = url.port; | ||||||
| 		this.pathname = url.pathname; | 		this.pathname = decodeURIComponent(url.pathname); | ||||||
| 		this.query = url.search; | 		this.query = decodeURIComponent(url.search); | ||||||
| 		this.hash = url.hash; | 		this.hash = decodeURIComponent(url.hash); | ||||||
| 	} | 	} | ||||||
| }); | }); | ||||||
| </script> | </script> | ||||||
|   | |||||||
| @@ -47,7 +47,7 @@ export default Vue.extend({ | |||||||
| 	props: ['source', 'compact'], | 	props: ['source', 'compact'], | ||||||
| 	data() { | 	data() { | ||||||
| 		return { | 		return { | ||||||
| 			v: this.$store.state.device.visibility || 'public' | 			v: this.$store.state.settings.rememberNoteVisibility ? (this.$store.state.device.visibility || this.$store.state.settings.defaultNoteVisibility) : this.$store.state.settings.defaultNoteVisibility | ||||||
| 		} | 		} | ||||||
| 	}, | 	}, | ||||||
| 	mounted() { | 	mounted() { | ||||||
| @@ -97,7 +97,9 @@ export default Vue.extend({ | |||||||
| 	}, | 	}, | ||||||
| 	methods: { | 	methods: { | ||||||
| 		choose(visibility) { | 		choose(visibility) { | ||||||
|  | 			if (this.$store.state.settings.rememberNoteVisibility) { | ||||||
| 				this.$store.commit('device/setVisibility', visibility); | 				this.$store.commit('device/setVisibility', visibility); | ||||||
|  | 			} | ||||||
| 			this.$emit('chosen', visibility); | 			this.$emit('chosen', visibility); | ||||||
| 			this.$destroy(); | 			this.$destroy(); | ||||||
| 		}, | 		}, | ||||||
|   | |||||||
| @@ -1,6 +1,7 @@ | |||||||
| <template> | <template> | ||||||
| <div class="mk-welcome-timeline"> | <div class="mk-welcome-timeline"> | ||||||
| 	<div v-for="note in notes"> | 	<transition-group name="ldzpakcixzickvggyixyrhqwjaefknon" tag="div"> | ||||||
|  | 		<div v-for="note in notes" :key="note.id"> | ||||||
| 			<mk-avatar class="avatar" :user="note.user" target="_blank"/> | 			<mk-avatar class="avatar" :user="note.user" target="_blank"/> | ||||||
| 			<div class="body"> | 			<div class="body"> | ||||||
| 				<header> | 				<header> | ||||||
| @@ -17,6 +18,7 @@ | |||||||
| 				</div> | 				</div> | ||||||
| 			</div> | 			</div> | ||||||
| 		</div> | 		</div> | ||||||
|  | 	</transition-group> | ||||||
| </div> | </div> | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
| @@ -31,15 +33,30 @@ export default Vue.extend({ | |||||||
| 			default: undefined | 			default: undefined | ||||||
| 		} | 		} | ||||||
| 	}, | 	}, | ||||||
|  |  | ||||||
| 	data() { | 	data() { | ||||||
| 		return { | 		return { | ||||||
| 			fetching: true, | 			fetching: true, | ||||||
| 			notes: [] | 			notes: [], | ||||||
|  | 			connection: null, | ||||||
|  | 			connectionId: null | ||||||
| 		}; | 		}; | ||||||
| 	}, | 	}, | ||||||
|  |  | ||||||
| 	mounted() { | 	mounted() { | ||||||
| 		this.fetch(); | 		this.fetch(); | ||||||
|  |  | ||||||
|  | 		this.connection = (this as any).os.streams.localTimelineStream.getConnection(); | ||||||
|  | 		this.connectionId = (this as any).os.streams.localTimelineStream.use(); | ||||||
|  |  | ||||||
|  | 		this.connection.on('note', this.onNote); | ||||||
| 	}, | 	}, | ||||||
|  |  | ||||||
|  | 	beforeDestroy() { | ||||||
|  | 		this.connection.off('note', this.onNote); | ||||||
|  | 		(this as any).os.streams.localTimelineStream.dispose(this.connectionId); | ||||||
|  | 	}, | ||||||
|  |  | ||||||
| 	methods: { | 	methods: { | ||||||
| 		fetch(cb?) { | 		fetch(cb?) { | ||||||
| 			this.fetching = true; | 			this.fetching = true; | ||||||
| @@ -48,22 +65,38 @@ export default Vue.extend({ | |||||||
| 				local: true, | 				local: true, | ||||||
| 				reply: false, | 				reply: false, | ||||||
| 				renote: false, | 				renote: false, | ||||||
| 				media: false, | 				file: false, | ||||||
| 				poll: false, | 				poll: false | ||||||
| 				bot: false |  | ||||||
| 			}).then(notes => { | 			}).then(notes => { | ||||||
| 				this.notes = notes; | 				this.notes = notes; | ||||||
| 				this.fetching = false; | 				this.fetching = false; | ||||||
| 			}); | 			}); | ||||||
| 		} | 		}, | ||||||
|  |  | ||||||
|  | 		onNote(note) { | ||||||
|  | 			if (note.replyId != null) return; | ||||||
|  | 			if (note.renoteId != null) return; | ||||||
|  | 			if (note.poll != null) return; | ||||||
|  |  | ||||||
|  | 			this.notes.unshift(note); | ||||||
|  | 		}, | ||||||
| 	} | 	} | ||||||
| }); | }); | ||||||
| </script> | </script> | ||||||
|  |  | ||||||
| <style lang="stylus" scoped> | <style lang="stylus" scoped> | ||||||
|  | .ldzpakcixzickvggyixyrhqwjaefknon-enter | ||||||
|  | .ldzpakcixzickvggyixyrhqwjaefknon-leave-to | ||||||
|  | 	opacity 0 | ||||||
|  | 	transform translateY(-30px) | ||||||
|  |  | ||||||
| root(isDark) | root(isDark) | ||||||
| 	background isDark ? #282C37 : #fff | 	background isDark ? #282C37 : #fff | ||||||
|  |  | ||||||
|  | 	> div | ||||||
|  | 		> * | ||||||
|  | 			transition transform .3s ease, opacity .3s ease | ||||||
|  |  | ||||||
| 		> div | 		> div | ||||||
| 			padding 16px | 			padding 16px | ||||||
| 			overflow-wrap break-word | 			overflow-wrap break-word | ||||||
|   | |||||||
| @@ -191,7 +191,7 @@ class Autocomplete { | |||||||
| 			const acct = renderAcct(value); | 			const acct = renderAcct(value); | ||||||
|  |  | ||||||
| 			// 挿入 | 			// 挿入 | ||||||
| 			this.text = trimmedBefore + '@' + acct + ' ' + after; | 			this.text = `${trimmedBefore}@${acct} ${after}`; | ||||||
|  |  | ||||||
| 			// キャレットを戻す | 			// キャレットを戻す | ||||||
| 			this.vm.$nextTick(() => { | 			this.vm.$nextTick(() => { | ||||||
| @@ -207,7 +207,7 @@ class Autocomplete { | |||||||
| 			const after = source.substr(caret); | 			const after = source.substr(caret); | ||||||
|  |  | ||||||
| 			// 挿入 | 			// 挿入 | ||||||
| 			this.text = trimmedBefore + '#' + value + ' ' + after; | 			this.text = `${trimmedBefore}#${value} ${after}`; | ||||||
|  |  | ||||||
| 			// キャレットを戻す | 			// キャレットを戻す | ||||||
| 			this.vm.$nextTick(() => { | 			this.vm.$nextTick(() => { | ||||||
|   | |||||||
| @@ -1,8 +1,10 @@ | |||||||
| import Vue from 'vue'; | import Vue from 'vue'; | ||||||
|  |  | ||||||
| Vue.filter('bytes', (v, digits = 0) => { | Vue.filter('bytes', (v, digits = 0) => { | ||||||
| 	const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB']; | 	const sizes = ['B', 'KB', 'MB', 'GB', 'TB']; | ||||||
| 	if (v == 0) return '0Byte'; | 	if (v == 0) return '0'; | ||||||
|  | 	const isMinus = v < 0; | ||||||
|  | 	if (isMinus) v = -v; | ||||||
| 	const i = Math.floor(Math.log(v) / Math.log(1024)); | 	const i = Math.floor(Math.log(v) / Math.log(1024)); | ||||||
| 	return (v / Math.pow(1024, i)).toFixed(digits).replace(/\.0+$/, '') + sizes[i]; | 	return (isMinus ? '-' : '') + (v / Math.pow(1024, i)).toFixed(digits).replace(/\.0+$/, '') + sizes[i]; | ||||||
| }); | }); | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| import Vue from 'vue'; | import Vue from 'vue'; | ||||||
|  |  | ||||||
| Vue.filter('notePage', note => { | Vue.filter('notePage', note => { | ||||||
| 	return '/notes/' + note.id; | 	return `/notes/${note.id}`; | ||||||
| }); | }); | ||||||
|   | |||||||
| @@ -11,5 +11,5 @@ Vue.filter('userName', user => { | |||||||
| }); | }); | ||||||
|  |  | ||||||
| Vue.filter('userPage', (user, path?) => { | Vue.filter('userPage', (user, path?) => { | ||||||
| 	return '/@' + Vue.filter('acct')(user) + (path ? '/' + path : ''); | 	return `/@${Vue.filter('acct')(user)}${(path ? `/${path}` : '')}`; | ||||||
| }); | }); | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| <template> | <template> | ||||||
| <div class="syxhndwprovvuqhmyvveewmbqayniwkv" v-if="!fetching" :data-darkmode="$store.state.device.darkmode"> | <div class="syxhndwprovvuqhmyvveewmbqayniwkv" v-if="!fetching" :data-darkmode="$store.state.device.darkmode"> | ||||||
| 	<div class="signed-in-as" v-html="'%i18n:@signed-in-as%'.replace('{}', '<b>' + myName + '</b>')"></div> | 	<div class="signed-in-as" v-html="'%i18n:@signed-in-as%'.replace('{}', `<b>${myName}`)"></div> | ||||||
|  |  | ||||||
| 	<main> | 	<main> | ||||||
| 		<div class="banner" :style="bannerStyle"></div> | 		<div class="banner" :style="bannerStyle"></div> | ||||||
| @@ -83,7 +83,7 @@ export default Vue.extend({ | |||||||
| 						userId: this.user.id | 						userId: this.user.id | ||||||
| 					}); | 					}); | ||||||
| 				} else { | 				} else { | ||||||
| 					if (this.user.isLocked && this.user.hasPendingFollowRequestFromYou) { | 					if (this.user.hasPendingFollowRequestFromYou) { | ||||||
| 						this.user = await (this as any).api('following/requests/cancel', { | 						this.user = await (this as any).api('following/requests/cancel', { | ||||||
| 							userId: this.user.id | 							userId: this.user.id | ||||||
| 						}); | 						}); | ||||||
|   | |||||||
| @@ -1,8 +1,8 @@ | |||||||
| <template> | <template> | ||||||
| <div class="mkw-analog-clock"> | <div class="mkw-analog-clock"> | ||||||
| 	<mk-widget-container :naked="!(props.design % 2)" :show-header="false"> | 	<mk-widget-container :naked="props.style % 2 === 0" :show-header="false"> | ||||||
| 		<div class="mkw-analog-clock--body"> | 		<div class="mkw-analog-clock--body"> | ||||||
| 			<mk-analog-clock :dark="$store.state.device.darkmode" :smooth="!(props.design && ~props.design)"/> | 			<mk-analog-clock :dark="$store.state.device.darkmode" :smooth="props.style < 2"/> | ||||||
| 		</div> | 		</div> | ||||||
| 	</mk-widget-container> | 	</mk-widget-container> | ||||||
| </div> | </div> | ||||||
| @@ -13,13 +13,12 @@ import define from '../../../common/define-widget'; | |||||||
| export default define({ | export default define({ | ||||||
| 	name: 'analog-clock', | 	name: 'analog-clock', | ||||||
| 	props: () => ({ | 	props: () => ({ | ||||||
| 		design: -1 | 		style: 0 | ||||||
| 	}) | 	}) | ||||||
| }).extend({ | }).extend({ | ||||||
| 	methods: { | 	methods: { | ||||||
| 		func() { | 		func() { | ||||||
| 			if (++this.props.design > 2) | 			this.props.style = (this.props.style + 1) % 4; | ||||||
| 				this.props.design = -1; |  | ||||||
| 			this.save(); | 			this.save(); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| <template> | <template> | ||||||
| <div class="mkw-broadcast" | <div class="anltbovirfeutcigvwgmgxipejaeozxi" | ||||||
| 	:data-found="broadcasts.length != 0" | 	:data-found="announcements && announcements.length != 0" | ||||||
| 	:data-melt="props.design == 1" | 	:data-melt="props.design == 1" | ||||||
| 	:data-mobile="platform == 'mobile'" | 	:data-mobile="platform == 'mobile'" | ||||||
| > | > | ||||||
| @@ -14,18 +14,17 @@ | |||||||
| 		</svg> | 		</svg> | ||||||
| 	</div> | 	</div> | ||||||
| 	<p class="fetching" v-if="fetching">%i18n:@fetching%<mk-ellipsis/></p> | 	<p class="fetching" v-if="fetching">%i18n:@fetching%<mk-ellipsis/></p> | ||||||
| 	<h1 v-if="!fetching">{{ broadcasts.length == 0 ? '%i18n:@no-broadcasts%' : broadcasts[i].title }}</h1> | 	<h1 v-if="!fetching">{{ announcements.length == 0 ? '%i18n:@no-broadcasts%' : announcements[i].title }}</h1> | ||||||
| 	<p v-if="!fetching"> | 	<p v-if="!fetching"> | ||||||
| 		<span v-if="broadcasts.length != 0" v-html="broadcasts[i].text"></span> | 		<span v-if="announcements.length != 0" v-html="announcements[i].text"></span> | ||||||
| 		<template v-if="broadcasts.length == 0">%i18n:@have-a-nice-day%</template> | 		<template v-if="announcements.length == 0">%i18n:@have-a-nice-day%</template> | ||||||
| 	</p> | 	</p> | ||||||
| 	<a v-if="broadcasts.length > 1" @click="next">%i18n:@next% >></a> | 	<a v-if="announcements.length > 1" @click="next">%i18n:@next% >></a> | ||||||
| </div> | </div> | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
| <script lang="ts"> | <script lang="ts"> | ||||||
| import define from '../../../common/define-widget'; | import define from '../../../common/define-widget'; | ||||||
| import { lang } from '../../../config'; |  | ||||||
|  |  | ||||||
| export default define({ | export default define({ | ||||||
| 	name: 'broadcast', | 	name: 'broadcast', | ||||||
| @@ -37,26 +36,18 @@ export default define({ | |||||||
| 		return { | 		return { | ||||||
| 			i: 0, | 			i: 0, | ||||||
| 			fetching: true, | 			fetching: true, | ||||||
| 			broadcasts: [] | 			announcements: [] | ||||||
| 		}; | 		}; | ||||||
| 	}, | 	}, | ||||||
| 	mounted() { | 	mounted() { | ||||||
| 		(this as any).os.getMeta().then(meta => { | 		(this as any).os.getMeta().then(meta => { | ||||||
| 			let broadcasts = []; | 			this.announcements = meta.broadcasts; | ||||||
| 			if (meta.broadcasts) { |  | ||||||
| 				meta.broadcasts.forEach(broadcast => { |  | ||||||
| 					if (broadcast[lang]) { |  | ||||||
| 						broadcasts.push(broadcast[lang]); |  | ||||||
| 					} |  | ||||||
| 				}); |  | ||||||
| 			} |  | ||||||
| 			this.broadcasts = broadcasts; |  | ||||||
| 			this.fetching = false; | 			this.fetching = false; | ||||||
| 		}); | 		}); | ||||||
| 	}, | 	}, | ||||||
| 	methods: { | 	methods: { | ||||||
| 		next() { | 		next() { | ||||||
| 			if (this.i == this.broadcasts.length - 1) { | 			if (this.i == this.announcements.length - 1) { | ||||||
| 				this.i = 0; | 				this.i = 0; | ||||||
| 			} else { | 			} else { | ||||||
| 				this.i++; | 				this.i++; | ||||||
| @@ -75,7 +66,7 @@ export default define({ | |||||||
| </script> | </script> | ||||||
|  |  | ||||||
| <style lang="stylus" scoped> | <style lang="stylus" scoped> | ||||||
| .mkw-broadcast | root(isDark) | ||||||
| 	padding 10px | 	padding 10px | ||||||
| 	border solid 1px #4078c0 | 	border solid 1px #4078c0 | ||||||
| 	border-radius 6px | 	border-radius 6px | ||||||
| @@ -135,22 +126,18 @@ export default define({ | |||||||
| 		margin 0 | 		margin 0 | ||||||
| 		font-size 0.95em | 		font-size 0.95em | ||||||
| 		font-weight normal | 		font-weight normal | ||||||
| 		color #4078c0 | 		color isDark ? #539eff : #4078c0 | ||||||
|  |  | ||||||
| 	> p | 	> p | ||||||
| 		display block | 		display block | ||||||
| 		z-index 1 | 		z-index 1 | ||||||
| 		margin 0 | 		margin 0 | ||||||
| 		font-size 0.7em | 		font-size 0.7em | ||||||
| 		color #555 | 		color isDark ? #fff : #555 | ||||||
|  |  | ||||||
| 		&.fetching | 		&.fetching | ||||||
| 			text-align center | 			text-align center | ||||||
|  |  | ||||||
| 		a |  | ||||||
| 			color #555 |  | ||||||
| 			text-decoration underline |  | ||||||
|  |  | ||||||
| 	> a | 	> a | ||||||
| 		display block | 		display block | ||||||
| 		font-size 0.7em | 		font-size 0.7em | ||||||
| @@ -159,4 +146,10 @@ export default define({ | |||||||
| 		> p | 		> p | ||||||
| 			color #fff | 			color #fff | ||||||
|  |  | ||||||
|  | .anltbovirfeutcigvwgmgxipejaeozxi[data-darkmode] | ||||||
|  | 	root(true) | ||||||
|  |  | ||||||
|  | .anltbovirfeutcigvwgmgxipejaeozxi:not([data-darkmode]) | ||||||
|  | 	root(false) | ||||||
|  |  | ||||||
| </style> | </style> | ||||||
|   | |||||||
| @@ -2,9 +2,9 @@ | |||||||
| <div class="mkw-donation" :data-mobile="platform == 'mobile'"> | <div class="mkw-donation" :data-mobile="platform == 'mobile'"> | ||||||
| 	<article> | 	<article> | ||||||
| 		<h1>%fa:heart%%i18n:@title%</h1> | 		<h1>%fa:heart%%i18n:@title%</h1> | ||||||
| 		<p> | 		<p v-if="meta"> | ||||||
| 			{{ '%i18n:@text%'.substr(0, '%i18n:@text%'.indexOf('{')) }} | 			{{ '%i18n:@text%'.substr(0, '%i18n:@text%'.indexOf('{')) }} | ||||||
| 			<a href="https://syuilo.com">@syuilo</a> | 			<a :href="meta.maintainer.url">{{ meta.maintainer.name }}</a> | ||||||
| 			{{ '%i18n:@text%'.substr('%i18n:@text%'.indexOf('}') + 1) }} | 			{{ '%i18n:@text%'.substr('%i18n:@text%'.indexOf('}') + 1) }} | ||||||
| 		</p> | 		</p> | ||||||
| 	</article> | 	</article> | ||||||
| @@ -15,6 +15,17 @@ | |||||||
| import define from '../../../common/define-widget'; | import define from '../../../common/define-widget'; | ||||||
| export default define({ | export default define({ | ||||||
| 	name: 'donation' | 	name: 'donation' | ||||||
|  | }).extend({ | ||||||
|  | 	data() { | ||||||
|  | 		return { | ||||||
|  | 			meta: null | ||||||
|  | 		}; | ||||||
|  | 	}, | ||||||
|  | 	created() { | ||||||
|  | 		(this as any).os.getMeta().then(meta => { | ||||||
|  | 			this.meta = meta; | ||||||
|  | 		}); | ||||||
|  | 	} | ||||||
| }); | }); | ||||||
| </script> | </script> | ||||||
|  |  | ||||||
|   | |||||||
| @@ -4,20 +4,7 @@ | |||||||
| 		<template slot="header">%fa:hashtag%%i18n:@title%</template> | 		<template slot="header">%fa:hashtag%%i18n:@title%</template> | ||||||
|  |  | ||||||
| 		<div class="mkw-hashtags--body" :data-mobile="platform == 'mobile'"> | 		<div class="mkw-hashtags--body" :data-mobile="platform == 'mobile'"> | ||||||
| 			<p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p> | 			<mk-trends/> | ||||||
| 			<p class="empty" v-else-if="stats.length == 0">%fa:exclamation-circle%%i18n:@empty%</p> |  | ||||||
| 			<!-- トランジションを有効にするとなぜかメモリリークする --> |  | ||||||
| 			<!-- <transition-group v-else tag="div" name="chart"> --> |  | ||||||
| 			<div> |  | ||||||
| 				<div v-for="stat in stats" :key="stat.tag"> |  | ||||||
| 					<div class="tag"> |  | ||||||
| 						<router-link :to="`/tags/${ encodeURIComponent(stat.tag) }`" :title="stat.tag">#{{ stat.tag }}</router-link> |  | ||||||
| 						<p>{{ '%i18n:@count%'.replace('{}', stat.usersCount) }}</p> |  | ||||||
| 					</div> |  | ||||||
| 					<x-chart class="chart" :src="stat.chart"/> |  | ||||||
| 				</div> |  | ||||||
| 			</div> |  | ||||||
| 			<!-- </transition-group> --> |  | ||||||
| 		</div> | 		</div> | ||||||
| 	</mk-widget-container> | 	</mk-widget-container> | ||||||
| </div> | </div> | ||||||
| @@ -25,7 +12,6 @@ | |||||||
|  |  | ||||||
| <script lang="ts"> | <script lang="ts"> | ||||||
| import define from '../../../common/define-widget'; | import define from '../../../common/define-widget'; | ||||||
| import XChart from './hashtags.chart.vue'; |  | ||||||
|  |  | ||||||
| export default define({ | export default define({ | ||||||
| 	name: 'hashtags', | 	name: 'hashtags', | ||||||
| @@ -33,89 +19,11 @@ export default define({ | |||||||
| 		compact: false | 		compact: false | ||||||
| 	}) | 	}) | ||||||
| }).extend({ | }).extend({ | ||||||
| 	components: { |  | ||||||
| 		XChart |  | ||||||
| 	}, |  | ||||||
| 	data() { |  | ||||||
| 		return { |  | ||||||
| 			stats: [], |  | ||||||
| 			fetching: true, |  | ||||||
| 			clock: null |  | ||||||
| 		}; |  | ||||||
| 	}, |  | ||||||
| 	mounted() { |  | ||||||
| 		this.fetch(); |  | ||||||
| 		this.clock = setInterval(this.fetch, 1000 * 60); |  | ||||||
| 	}, |  | ||||||
| 	beforeDestroy() { |  | ||||||
| 		clearInterval(this.clock); |  | ||||||
| 	}, |  | ||||||
| 	methods: { | 	methods: { | ||||||
| 		func() { | 		func() { | ||||||
| 			this.props.compact = !this.props.compact; | 			this.props.compact = !this.props.compact; | ||||||
| 			this.save(); | 			this.save(); | ||||||
| 		}, |  | ||||||
| 		fetch() { |  | ||||||
| 			(this as any).api('hashtags/trend').then(stats => { |  | ||||||
| 				this.stats = stats; |  | ||||||
| 				this.fetching = false; |  | ||||||
| 			}); |  | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| }); | }); | ||||||
| </script> | </script> | ||||||
|  |  | ||||||
| <style lang="stylus" scoped> |  | ||||||
| root(isDark) |  | ||||||
| 	.mkw-hashtags--body |  | ||||||
| 		> .fetching |  | ||||||
| 		> .empty |  | ||||||
| 			margin 0 |  | ||||||
| 			padding 16px |  | ||||||
| 			text-align center |  | ||||||
| 			color #aaa |  | ||||||
|  |  | ||||||
| 			> [data-fa] |  | ||||||
| 				margin-right 4px |  | ||||||
|  |  | ||||||
| 		> div |  | ||||||
| 			.chart-move |  | ||||||
| 				transition transform 1s ease |  | ||||||
|  |  | ||||||
| 			> div |  | ||||||
| 				display flex |  | ||||||
| 				align-items center |  | ||||||
| 				padding 14px 16px |  | ||||||
|  |  | ||||||
| 				&:not(:last-child) |  | ||||||
| 					border-bottom solid 1px isDark ? #393f4f : #eee |  | ||||||
|  |  | ||||||
| 				> .tag |  | ||||||
| 					flex 1 |  | ||||||
| 					overflow hidden |  | ||||||
| 					font-size 14px |  | ||||||
| 					color isDark ? #9baec8 : #65727b |  | ||||||
|  |  | ||||||
| 					> a |  | ||||||
| 						display block |  | ||||||
| 						width 100% |  | ||||||
| 						white-space nowrap |  | ||||||
| 						overflow hidden |  | ||||||
| 						text-overflow ellipsis |  | ||||||
| 						color inherit |  | ||||||
|  |  | ||||||
| 					> p |  | ||||||
| 						margin 0 |  | ||||||
| 						font-size 75% |  | ||||||
| 						opacity 0.7 |  | ||||||
|  |  | ||||||
| 				> .chart |  | ||||||
| 					height 30px |  | ||||||
|  |  | ||||||
| .mkw-hashtags[data-darkmode] |  | ||||||
| 	root(true) |  | ||||||
|  |  | ||||||
| .mkw-hashtags:not([data-darkmode]) |  | ||||||
| 	root(false) |  | ||||||
|  |  | ||||||
| </style> |  | ||||||
|   | |||||||
| @@ -4,7 +4,7 @@ declare const _THEME_COLOR_: string; | |||||||
| declare const _COPYRIGHT_: string; | declare const _COPYRIGHT_: string; | ||||||
| declare const _VERSION_: string; | declare const _VERSION_: string; | ||||||
| declare const _CODENAME_: string; | declare const _CODENAME_: string; | ||||||
| declare const _LICENSE_: string; | declare const _ENV_: string; | ||||||
|  |  | ||||||
| const address = new URL(location.href); | const address = new URL(location.href); | ||||||
|  |  | ||||||
| @@ -19,4 +19,4 @@ export const themeColor = _THEME_COLOR_; | |||||||
| export const copyright = _COPYRIGHT_; | export const copyright = _COPYRIGHT_; | ||||||
| export const version = _VERSION_; | export const version = _VERSION_; | ||||||
| export const codename = _CODENAME_; | export const codename = _CODENAME_; | ||||||
| export const license = _LICENSE_; | export const env = _ENV_; | ||||||
|   | |||||||
| @@ -3,8 +3,21 @@ import { apiUrl } from '../../config'; | |||||||
| import CropWindow from '../views/components/crop-window.vue'; | import CropWindow from '../views/components/crop-window.vue'; | ||||||
| import ProgressDialog from '../views/components/progress-dialog.vue'; | import ProgressDialog from '../views/components/progress-dialog.vue'; | ||||||
|  |  | ||||||
| export default (os: OS) => (cb, file = null) => { | export default (os: OS) => { | ||||||
| 	const fileSelected = file => { |  | ||||||
|  | 	const cropImage = file => new Promise((resolve, reject) => { | ||||||
|  |  | ||||||
|  | 		const regex = RegExp('\.(jpg|jpeg|png|gif|webp|bmp|tiff)$'); | ||||||
|  | 		if (!regex.test(file.name) ) { | ||||||
|  | 			os.apis.dialog({ | ||||||
|  | 				title: '%fa:info-circle% %i18n:desktop.invalid-filetype%', | ||||||
|  | 				text: null, | ||||||
|  | 				actions: [{ | ||||||
|  | 					text: '%i18n:common.got-it%' | ||||||
|  | 				}] | ||||||
|  | 			}); | ||||||
|  | 			return reject('invalid-filetype'); | ||||||
|  | 		} | ||||||
|  |  | ||||||
| 		const w = os.new(CropWindow, { | 		const w = os.new(CropWindow, { | ||||||
| 			image: file, | 			image: file, | ||||||
| @@ -19,27 +32,29 @@ export default (os: OS) => (cb, file = null) => { | |||||||
|  |  | ||||||
| 			os.api('drive/folders/find', { | 			os.api('drive/folders/find', { | ||||||
| 				name: '%i18n:desktop.avatar%' | 				name: '%i18n:desktop.avatar%' | ||||||
| 			}).then(iconFolder => { | 			}).then(avatarFolder => { | ||||||
| 				if (iconFolder.length === 0) { | 				if (avatarFolder.length === 0) { | ||||||
| 					os.api('drive/folders/create', { | 					os.api('drive/folders/create', { | ||||||
| 						name: '%i18n:desktop.avatar%' | 						name: '%i18n:desktop.avatar%' | ||||||
| 					}).then(iconFolder => { | 					}).then(iconFolder => { | ||||||
| 						upload(data, iconFolder); | 						resolve(upload(data, iconFolder)); | ||||||
| 					}); | 					}); | ||||||
| 				} else { | 				} else { | ||||||
| 					upload(data, iconFolder[0]); | 					resolve(upload(data, avatarFolder[0])); | ||||||
| 				} | 				} | ||||||
| 			}); | 			}); | ||||||
| 		}); | 		}); | ||||||
|  |  | ||||||
| 		w.$once('skipped', () => { | 		w.$once('skipped', () => { | ||||||
| 			set(file); | 			resolve(file); | ||||||
| 		}); | 		}); | ||||||
|  |  | ||||||
| 		document.body.appendChild(w.$el); | 		w.$once('cancelled', reject); | ||||||
| 	}; |  | ||||||
|  |  | ||||||
| 	const upload = (data, folder) => { | 		document.body.appendChild(w.$el); | ||||||
|  | 	}); | ||||||
|  |  | ||||||
|  | 	const upload = (data, folder) => new Promise((resolve, reject) => { | ||||||
| 		const dialog = os.new(ProgressDialog, { | 		const dialog = os.new(ProgressDialog, { | ||||||
| 			title: '%i18n:desktop.uploading-avatar%' | 			title: '%i18n:desktop.uploading-avatar%' | ||||||
| 		}); | 		}); | ||||||
| @@ -52,18 +67,19 @@ export default (os: OS) => (cb, file = null) => { | |||||||
| 		xhr.onload = e => { | 		xhr.onload = e => { | ||||||
| 			const file = JSON.parse((e.target as any).response); | 			const file = JSON.parse((e.target as any).response); | ||||||
| 			(dialog as any).close(); | 			(dialog as any).close(); | ||||||
| 			set(file); | 			resolve(file); | ||||||
| 		}; | 		}; | ||||||
|  | 		xhr.onerror = reject; | ||||||
|  |  | ||||||
| 		xhr.upload.onprogress = e => { | 		xhr.upload.onprogress = e => { | ||||||
| 			if (e.lengthComputable) (dialog as any).update(e.loaded, e.total); | 			if (e.lengthComputable) (dialog as any).update(e.loaded, e.total); | ||||||
| 		}; | 		}; | ||||||
|  |  | ||||||
| 		xhr.send(data); | 		xhr.send(data); | ||||||
| 	}; | 	}); | ||||||
|  |  | ||||||
| 	const set = file => { | 	const setAvatar = file => { | ||||||
| 		os.api('i/update', { | 		return os.api('i/update', { | ||||||
| 			avatarId: file.id | 			avatarId: file.id | ||||||
| 		}).then(i => { | 		}).then(i => { | ||||||
| 			os.store.commit('updateIKeyValue', { | 			os.store.commit('updateIKeyValue', { | ||||||
| @@ -83,18 +99,21 @@ export default (os: OS) => (cb, file = null) => { | |||||||
| 				}] | 				}] | ||||||
| 			}); | 			}); | ||||||
|  |  | ||||||
| 			if (cb) cb(i); | 			return i; | ||||||
| 		}); | 		}); | ||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
| 	if (file) { | 	return (file = null) => { | ||||||
| 		fileSelected(file); | 		const selectedFile = file | ||||||
| 	} else { | 			? Promise.resolve(file) | ||||||
| 		os.apis.chooseDriveFile({ | 			: os.apis.chooseDriveFile({ | ||||||
| 				multiple: false, | 				multiple: false, | ||||||
| 				title: '%fa:image% %i18n:desktop.choose-avatar%' | 				title: '%fa:image% %i18n:desktop.choose-avatar%' | ||||||
| 		}).then(file => { |  | ||||||
| 			fileSelected(file); |  | ||||||
| 			}); | 			}); | ||||||
| 	} |  | ||||||
|  | 		return selectedFile | ||||||
|  | 			.then(cropImage) | ||||||
|  | 			.then(setAvatar) | ||||||
|  | 			.catch(err => err && console.warn(err)); | ||||||
|  | 	}; | ||||||
| }; | }; | ||||||
|   | |||||||
| @@ -6,6 +6,19 @@ import ProgressDialog from '../views/components/progress-dialog.vue'; | |||||||
| export default (os: OS) => { | export default (os: OS) => { | ||||||
|  |  | ||||||
| 	const cropImage = file => new Promise((resolve, reject) => { | 	const cropImage = file => new Promise((resolve, reject) => { | ||||||
|  |  | ||||||
|  | 		const regex = RegExp('\.(jpg|jpeg|png|gif|webp|bmp|tiff)$'); | ||||||
|  | 		if (!regex.test(file.name) ) { | ||||||
|  | 			os.apis.dialog({ | ||||||
|  | 				title: '%fa:info-circle% %i18n:desktop.invalid-filetype%', | ||||||
|  | 				text: null, | ||||||
|  | 				actions: [{ | ||||||
|  | 					text: '%i18n:common.got-it%' | ||||||
|  | 				}] | ||||||
|  | 			}); | ||||||
|  | 			return reject('invalid-filetype'); | ||||||
|  | 		} | ||||||
|  |  | ||||||
| 		const w = os.new(CropWindow, { | 		const w = os.new(CropWindow, { | ||||||
| 			image: file, | 			image: file, | ||||||
| 			title: '%i18n:desktop.banner-crop-title%', | 			title: '%i18n:desktop.banner-crop-title%', | ||||||
|   | |||||||
| @@ -25,6 +25,7 @@ import updateBanner from './api/update-banner'; | |||||||
| import MkIndex from './views/pages/index.vue'; | import MkIndex from './views/pages/index.vue'; | ||||||
| import MkDeck from './views/pages/deck/deck.vue'; | import MkDeck from './views/pages/deck/deck.vue'; | ||||||
| import MkAdmin from './views/pages/admin/admin.vue'; | import MkAdmin from './views/pages/admin/admin.vue'; | ||||||
|  | import MkStats from './views/pages/stats/stats.vue'; | ||||||
| import MkUser from './views/pages/user/user.vue'; | import MkUser from './views/pages/user/user.vue'; | ||||||
| import MkFavorites from './views/pages/favorites.vue'; | import MkFavorites from './views/pages/favorites.vue'; | ||||||
| import MkSelectDrive from './views/pages/selectdrive.vue'; | import MkSelectDrive from './views/pages/selectdrive.vue'; | ||||||
| @@ -57,6 +58,7 @@ init(async (launch) => { | |||||||
| 			{ path: '/', name: 'index', component: MkIndex }, | 			{ path: '/', name: 'index', component: MkIndex }, | ||||||
| 			{ path: '/deck', name: 'deck', component: MkDeck }, | 			{ path: '/deck', name: 'deck', component: MkDeck }, | ||||||
| 			{ path: '/admin', name: 'admin', component: MkAdmin }, | 			{ path: '/admin', name: 'admin', component: MkAdmin }, | ||||||
|  | 			{ path: '/stats', name: 'stats', component: MkStats }, | ||||||
| 			{ path: '/i/customize-home', component: MkHomeCustomize }, | 			{ path: '/i/customize-home', component: MkHomeCustomize }, | ||||||
| 			{ path: '/i/favorites', component: MkFavorites }, | 			{ path: '/i/favorites', component: MkFavorites }, | ||||||
| 			{ path: '/i/messaging/:user', component: MkMessagingRoom }, | 			{ path: '/i/messaging/:user', component: MkMessagingRoom }, | ||||||
| @@ -94,7 +96,7 @@ init(async (launch) => { | |||||||
| 	/** | 	/** | ||||||
| 	 * Init Notification | 	 * Init Notification | ||||||
| 	 */ | 	 */ | ||||||
| 	if ('Notification' in window) { | 	if ('Notification' in window && os.store.getters.isSignedIn) { | ||||||
| 		// 許可を得ていなかったらリクエスト | 		// 許可を得ていなかったらリクエスト | ||||||
| 		if ((Notification as any).permission == 'default') { | 		if ((Notification as any).permission == 'default') { | ||||||
| 			await Notification.requestPermission(); | 			await Notification.requestPermission(); | ||||||
|   | |||||||
							
								
								
									
										42
									
								
								src/client/app/desktop/views/components/charts.chart.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								src/client/app/desktop/views/components/charts.chart.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | |||||||
|  | import Vue from 'vue'; | ||||||
|  | import { Line } from 'vue-chartjs'; | ||||||
|  | import * as mergeOptions from 'merge-options'; | ||||||
|  |  | ||||||
|  | export default Vue.extend({ | ||||||
|  | 	extends: Line, | ||||||
|  | 	props: { | ||||||
|  | 		data: { | ||||||
|  | 			required: true | ||||||
|  | 		}, | ||||||
|  | 		opts: { | ||||||
|  | 			required: false | ||||||
|  | 		} | ||||||
|  | 	}, | ||||||
|  | 	watch: { | ||||||
|  | 		data() { | ||||||
|  | 			this.render(); | ||||||
|  | 		} | ||||||
|  | 	}, | ||||||
|  | 	mounted() { | ||||||
|  | 		this.render(); | ||||||
|  | 	}, | ||||||
|  | 	methods: { | ||||||
|  | 		render() { | ||||||
|  | 			this.renderChart(this.data, mergeOptions({ | ||||||
|  | 				responsive: true, | ||||||
|  | 				maintainAspectRatio: false, | ||||||
|  | 				scales: { | ||||||
|  | 					xAxes: [{ | ||||||
|  | 						type: 'time', | ||||||
|  | 						distribution: 'series' | ||||||
|  | 					}] | ||||||
|  | 				}, | ||||||
|  | 				tooltips: { | ||||||
|  | 					intersect: false, | ||||||
|  | 					mode: 'x', | ||||||
|  | 					position: 'nearest' | ||||||
|  | 				} | ||||||
|  | 			}, this.opts || {})); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | }); | ||||||
							
								
								
									
										587
									
								
								src/client/app/desktop/views/components/charts.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										587
									
								
								src/client/app/desktop/views/components/charts.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,587 @@ | |||||||
|  | <template> | ||||||
|  | <div class="gkgckalzgidaygcxnugepioremxvxvpt"> | ||||||
|  | 	<header> | ||||||
|  | 		<b>%i18n:@title%:</b> | ||||||
|  | 		<select v-model="chartType"> | ||||||
|  | 			<optgroup label="%i18n:@users%"> | ||||||
|  | 				<option value="users">%i18n:@charts.users%</option> | ||||||
|  | 				<option value="users-total">%i18n:@charts.users-total%</option> | ||||||
|  | 			</optgroup> | ||||||
|  | 			<optgroup label="%i18n:@notes%"> | ||||||
|  | 				<option value="notes">%i18n:@charts.notes%</option> | ||||||
|  | 				<option value="local-notes">%i18n:@charts.local-notes%</option> | ||||||
|  | 				<option value="remote-notes">%i18n:@charts.remote-notes%</option> | ||||||
|  | 				<option value="notes-total">%i18n:@charts.notes-total%</option> | ||||||
|  | 			</optgroup> | ||||||
|  | 			<optgroup label="%i18n:@drive%"> | ||||||
|  | 				<option value="drive-files">%i18n:@charts.drive-files%</option> | ||||||
|  | 				<option value="drive-files-total">%i18n:@charts.drive-files-total%</option> | ||||||
|  | 				<option value="drive">%i18n:@charts.drive%</option> | ||||||
|  | 				<option value="drive-total">%i18n:@charts.drive-total%</option> | ||||||
|  | 			</optgroup> | ||||||
|  | 		</select> | ||||||
|  | 		<div> | ||||||
|  | 			<span @click="span = 'day'" :class="{ active: span == 'day' }">%i18n:@per-day%</span> | <span @click="span = 'hour'" :class="{ active: span == 'hour' }">%i18n:@per-hour%</span> | ||||||
|  | 		</div> | ||||||
|  | 	</header> | ||||||
|  | 	<div> | ||||||
|  | 		<x-chart v-if="chart" :data="data[0]" :opts="data[1]"/> | ||||||
|  | 	</div> | ||||||
|  | </div> | ||||||
|  | </template> | ||||||
|  |  | ||||||
|  | <script lang="ts"> | ||||||
|  | import Vue from 'vue'; | ||||||
|  | import XChart from './charts.chart.ts'; | ||||||
|  |  | ||||||
|  | const colors = { | ||||||
|  | 	local: 'rgb(246, 88, 79)', | ||||||
|  | 	remote: 'rgb(65, 221, 222)', | ||||||
|  |  | ||||||
|  | 	localPlus: 'rgb(52, 178, 118)', | ||||||
|  | 	remotePlus: 'rgb(158, 255, 209)', | ||||||
|  | 	localMinus: 'rgb(255, 97, 74)', | ||||||
|  | 	remoteMinus: 'rgb(255, 149, 134)' | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | const rgba = (color: string): string => { | ||||||
|  | 	return color.replace('rgb', 'rgba').replace(')', ', 0.1)'); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | export default Vue.extend({ | ||||||
|  | 	components: { | ||||||
|  | 		XChart | ||||||
|  | 	}, | ||||||
|  |  | ||||||
|  | 	data() { | ||||||
|  | 		return { | ||||||
|  | 			chart: null, | ||||||
|  | 			chartType: 'notes', | ||||||
|  | 			span: 'hour' | ||||||
|  | 		}; | ||||||
|  | 	}, | ||||||
|  |  | ||||||
|  | 	computed: { | ||||||
|  | 		data(): any { | ||||||
|  | 			if (this.chart == null) return null; | ||||||
|  | 			switch (this.chartType) { | ||||||
|  | 				case 'users': return this.usersChart(false); | ||||||
|  | 				case 'users-total': return this.usersChart(true); | ||||||
|  | 				case 'notes': return this.notesChart('combined'); | ||||||
|  | 				case 'local-notes': return this.notesChart('local'); | ||||||
|  | 				case 'remote-notes': return this.notesChart('remote'); | ||||||
|  | 				case 'notes-total': return this.notesTotalChart(); | ||||||
|  | 				case 'drive': return this.driveChart(); | ||||||
|  | 				case 'drive-total': return this.driveTotalChart(); | ||||||
|  | 				case 'drive-files': return this.driveFilesChart(); | ||||||
|  | 				case 'drive-files-total': return this.driveFilesTotalChart(); | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		stats(): any[] { | ||||||
|  | 			return ( | ||||||
|  | 				this.span == 'day' ? this.chart.perDay : | ||||||
|  | 				this.span == 'hour' ? this.chart.perHour : | ||||||
|  | 				null | ||||||
|  | 			); | ||||||
|  | 		} | ||||||
|  | 	}, | ||||||
|  |  | ||||||
|  | 	created() { | ||||||
|  | 		(this as any).api('chart', { | ||||||
|  | 			limit: 32 | ||||||
|  | 		}).then(chart => { | ||||||
|  | 			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) | ||||||
|  | 			})); | ||||||
|  |  | ||||||
|  | 			return [{ | ||||||
|  | 				datasets: [{ | ||||||
|  | 					label: 'All', | ||||||
|  | 					fill: false, | ||||||
|  | 					borderColor: '#555', | ||||||
|  | 					borderWidth: 2, | ||||||
|  | 					borderDash: [4, 4], | ||||||
|  | 					pointBackgroundColor: '#fff', | ||||||
|  | 					lineTension: 0, | ||||||
|  | 					data: data.map(x => ({ t: x.date, y: x.all })) | ||||||
|  | 				}, { | ||||||
|  | 					label: 'Renotes', | ||||||
|  | 					fill: true, | ||||||
|  | 					backgroundColor: 'rgba(161, 222, 65, 0.1)', | ||||||
|  | 					borderColor: '#a1de41', | ||||||
|  | 					borderWidth: 2, | ||||||
|  | 					pointBackgroundColor: '#fff', | ||||||
|  | 					lineTension: 0, | ||||||
|  | 					data: data.map(x => ({ t: x.date, y: x.renote })) | ||||||
|  | 				}, { | ||||||
|  | 					label: 'Replies', | ||||||
|  | 					fill: true, | ||||||
|  | 					backgroundColor: 'rgba(247, 121, 108, 0.1)', | ||||||
|  | 					borderColor: '#f7796c', | ||||||
|  | 					borderWidth: 2, | ||||||
|  | 					pointBackgroundColor: '#fff', | ||||||
|  | 					lineTension: 0, | ||||||
|  | 					data: data.map(x => ({ t: x.date, y: x.reply })) | ||||||
|  | 				}, { | ||||||
|  | 					label: 'Normal', | ||||||
|  | 					fill: true, | ||||||
|  | 					backgroundColor: 'rgba(65, 221, 222, 0.1)', | ||||||
|  | 					borderColor: '#41ddde', | ||||||
|  | 					borderWidth: 2, | ||||||
|  | 					pointBackgroundColor: '#fff', | ||||||
|  | 					lineTension: 0, | ||||||
|  | 					data: data.map(x => ({ t: x.date, y: x.normal })) | ||||||
|  | 				}] | ||||||
|  | 			}, { | ||||||
|  | 				scales: { | ||||||
|  | 					yAxes: [{ | ||||||
|  | 						ticks: { | ||||||
|  | 							callback: value => { | ||||||
|  | 								return Vue.filter('number')(value); | ||||||
|  | 							} | ||||||
|  | 						} | ||||||
|  | 					}] | ||||||
|  | 				}, | ||||||
|  | 				tooltips: { | ||||||
|  | 					callbacks: { | ||||||
|  | 						label: (tooltipItem, data) => { | ||||||
|  | 							const label = data.datasets[tooltipItem.datasetIndex].label || ''; | ||||||
|  | 							return `${label}: ${Vue.filter('number')(tooltipItem.yLabel)}`; | ||||||
|  | 						} | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			}]; | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		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', | ||||||
|  | 					fill: false, | ||||||
|  | 					borderColor: '#555', | ||||||
|  | 					borderWidth: 2, | ||||||
|  | 					borderDash: [4, 4], | ||||||
|  | 					pointBackgroundColor: '#fff', | ||||||
|  | 					lineTension: 0, | ||||||
|  | 					data: data.map(x => ({ t: x.date, y: x.remoteCount + x.localCount })) | ||||||
|  | 				}, { | ||||||
|  | 					label: 'Local', | ||||||
|  | 					fill: true, | ||||||
|  | 					backgroundColor: rgba(colors.local), | ||||||
|  | 					borderColor: colors.local, | ||||||
|  | 					borderWidth: 2, | ||||||
|  | 					pointBackgroundColor: '#fff', | ||||||
|  | 					lineTension: 0, | ||||||
|  | 					data: data.map(x => ({ t: x.date, y: x.localCount })) | ||||||
|  | 				}, { | ||||||
|  | 					label: 'Remote', | ||||||
|  | 					fill: true, | ||||||
|  | 					backgroundColor: rgba(colors.remote), | ||||||
|  | 					borderColor: colors.remote, | ||||||
|  | 					borderWidth: 2, | ||||||
|  | 					pointBackgroundColor: '#fff', | ||||||
|  | 					lineTension: 0, | ||||||
|  | 					data: data.map(x => ({ t: x.date, y: x.remoteCount })) | ||||||
|  | 				}] | ||||||
|  | 			}, { | ||||||
|  | 				scales: { | ||||||
|  | 					yAxes: [{ | ||||||
|  | 						ticks: { | ||||||
|  | 							callback: value => { | ||||||
|  | 								return Vue.filter('number')(value); | ||||||
|  | 							} | ||||||
|  | 						} | ||||||
|  | 					}] | ||||||
|  | 				}, | ||||||
|  | 				tooltips: { | ||||||
|  | 					callbacks: { | ||||||
|  | 						label: (tooltipItem, data) => { | ||||||
|  | 							const label = data.datasets[tooltipItem.datasetIndex].label || ''; | ||||||
|  | 							return `${label}: ${Vue.filter('number')(tooltipItem.yLabel)}`; | ||||||
|  | 						} | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			}]; | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		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', | ||||||
|  | 					fill: false, | ||||||
|  | 					borderColor: '#555', | ||||||
|  | 					borderWidth: 2, | ||||||
|  | 					borderDash: [4, 4], | ||||||
|  | 					pointBackgroundColor: '#fff', | ||||||
|  | 					lineTension: 0, | ||||||
|  | 					data: data.map(x => ({ t: x.date, y: x.remoteCount + x.localCount })) | ||||||
|  | 				}, { | ||||||
|  | 					label: 'Local', | ||||||
|  | 					fill: true, | ||||||
|  | 					backgroundColor: rgba(colors.local), | ||||||
|  | 					borderColor: colors.local, | ||||||
|  | 					borderWidth: 2, | ||||||
|  | 					pointBackgroundColor: '#fff', | ||||||
|  | 					lineTension: 0, | ||||||
|  | 					data: data.map(x => ({ t: x.date, y: x.localCount })) | ||||||
|  | 				}, { | ||||||
|  | 					label: 'Remote', | ||||||
|  | 					fill: true, | ||||||
|  | 					backgroundColor: rgba(colors.remote), | ||||||
|  | 					borderColor: colors.remote, | ||||||
|  | 					borderWidth: 2, | ||||||
|  | 					pointBackgroundColor: '#fff', | ||||||
|  | 					lineTension: 0, | ||||||
|  | 					data: data.map(x => ({ t: x.date, y: x.remoteCount })) | ||||||
|  | 				}] | ||||||
|  | 			}, { | ||||||
|  | 				scales: { | ||||||
|  | 					yAxes: [{ | ||||||
|  | 						ticks: { | ||||||
|  | 							callback: value => { | ||||||
|  | 								return Vue.filter('number')(value); | ||||||
|  | 							} | ||||||
|  | 						} | ||||||
|  | 					}] | ||||||
|  | 				}, | ||||||
|  | 				tooltips: { | ||||||
|  | 					callbacks: { | ||||||
|  | 						label: (tooltipItem, data) => { | ||||||
|  | 							const label = data.datasets[tooltipItem.datasetIndex].label || ''; | ||||||
|  | 							return `${label}: ${Vue.filter('number')(tooltipItem.yLabel)}`; | ||||||
|  | 						} | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			}]; | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		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', | ||||||
|  | 					fill: false, | ||||||
|  | 					borderColor: '#555', | ||||||
|  | 					borderWidth: 2, | ||||||
|  | 					borderDash: [4, 4], | ||||||
|  | 					pointBackgroundColor: '#fff', | ||||||
|  | 					lineTension: 0, | ||||||
|  | 					data: data.map(x => ({ t: x.date, y: x.localInc + x.localDec + x.remoteInc + x.remoteDec })) | ||||||
|  | 				}, { | ||||||
|  | 					label: 'Local +', | ||||||
|  | 					fill: true, | ||||||
|  | 					backgroundColor: rgba(colors.localPlus), | ||||||
|  | 					borderColor: colors.localPlus, | ||||||
|  | 					borderWidth: 2, | ||||||
|  | 					pointBackgroundColor: '#fff', | ||||||
|  | 					lineTension: 0, | ||||||
|  | 					data: data.map(x => ({ t: x.date, y: x.localInc })) | ||||||
|  | 				}, { | ||||||
|  | 					label: 'Local -', | ||||||
|  | 					fill: true, | ||||||
|  | 					backgroundColor: rgba(colors.localMinus), | ||||||
|  | 					borderColor: colors.localMinus, | ||||||
|  | 					borderWidth: 2, | ||||||
|  | 					pointBackgroundColor: '#fff', | ||||||
|  | 					lineTension: 0, | ||||||
|  | 					data: data.map(x => ({ t: x.date, y: x.localDec })) | ||||||
|  | 				}, { | ||||||
|  | 					label: 'Remote +', | ||||||
|  | 					fill: true, | ||||||
|  | 					backgroundColor: rgba(colors.remotePlus), | ||||||
|  | 					borderColor: colors.remotePlus, | ||||||
|  | 					borderWidth: 2, | ||||||
|  | 					pointBackgroundColor: '#fff', | ||||||
|  | 					lineTension: 0, | ||||||
|  | 					data: data.map(x => ({ t: x.date, y: x.remoteInc })) | ||||||
|  | 				}, { | ||||||
|  | 					label: 'Remote -', | ||||||
|  | 					fill: true, | ||||||
|  | 					backgroundColor: rgba(colors.remoteMinus), | ||||||
|  | 					borderColor: colors.remoteMinus, | ||||||
|  | 					borderWidth: 2, | ||||||
|  | 					pointBackgroundColor: '#fff', | ||||||
|  | 					lineTension: 0, | ||||||
|  | 					data: data.map(x => ({ t: x.date, y: x.remoteDec })) | ||||||
|  | 				}] | ||||||
|  | 			}, { | ||||||
|  | 				scales: { | ||||||
|  | 					yAxes: [{ | ||||||
|  | 						ticks: { | ||||||
|  | 							callback: value => { | ||||||
|  | 								return Vue.filter('bytes')(value, 1); | ||||||
|  | 							} | ||||||
|  | 						} | ||||||
|  | 					}] | ||||||
|  | 				}, | ||||||
|  | 				tooltips: { | ||||||
|  | 					callbacks: { | ||||||
|  | 						label: (tooltipItem, data) => { | ||||||
|  | 							const label = data.datasets[tooltipItem.datasetIndex].label || ''; | ||||||
|  | 							return `${label}: ${Vue.filter('bytes')(tooltipItem.yLabel, 1)}`; | ||||||
|  | 						} | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			}]; | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		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', | ||||||
|  | 					fill: false, | ||||||
|  | 					borderColor: '#555', | ||||||
|  | 					borderWidth: 2, | ||||||
|  | 					borderDash: [4, 4], | ||||||
|  | 					pointBackgroundColor: '#fff', | ||||||
|  | 					lineTension: 0, | ||||||
|  | 					data: data.map(x => ({ t: x.date, y: x.remoteSize + x.localSize })) | ||||||
|  | 				}, { | ||||||
|  | 					label: 'Local', | ||||||
|  | 					fill: true, | ||||||
|  | 					backgroundColor: rgba(colors.local), | ||||||
|  | 					borderColor: colors.local, | ||||||
|  | 					borderWidth: 2, | ||||||
|  | 					pointBackgroundColor: '#fff', | ||||||
|  | 					lineTension: 0, | ||||||
|  | 					data: data.map(x => ({ t: x.date, y: x.localSize })) | ||||||
|  | 				}, { | ||||||
|  | 					label: 'Remote', | ||||||
|  | 					fill: true, | ||||||
|  | 					backgroundColor: rgba(colors.remote), | ||||||
|  | 					borderColor: colors.remote, | ||||||
|  | 					borderWidth: 2, | ||||||
|  | 					pointBackgroundColor: '#fff', | ||||||
|  | 					lineTension: 0, | ||||||
|  | 					data: data.map(x => ({ t: x.date, y: x.remoteSize })) | ||||||
|  | 				}] | ||||||
|  | 			}, { | ||||||
|  | 				scales: { | ||||||
|  | 					yAxes: [{ | ||||||
|  | 						ticks: { | ||||||
|  | 							callback: value => { | ||||||
|  | 								return Vue.filter('bytes')(value, 1); | ||||||
|  | 							} | ||||||
|  | 						} | ||||||
|  | 					}] | ||||||
|  | 				}, | ||||||
|  | 				tooltips: { | ||||||
|  | 					callbacks: { | ||||||
|  | 						label: (tooltipItem, data) => { | ||||||
|  | 							const label = data.datasets[tooltipItem.datasetIndex].label || ''; | ||||||
|  | 							return `${label}: ${Vue.filter('bytes')(tooltipItem.yLabel, 1)}`; | ||||||
|  | 						} | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			}]; | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		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', | ||||||
|  | 					fill: false, | ||||||
|  | 					borderColor: '#555', | ||||||
|  | 					borderWidth: 2, | ||||||
|  | 					borderDash: [4, 4], | ||||||
|  | 					pointBackgroundColor: '#fff', | ||||||
|  | 					lineTension: 0, | ||||||
|  | 					data: data.map(x => ({ t: x.date, y: x.localInc + x.localDec + x.remoteInc + x.remoteDec })) | ||||||
|  | 				}, { | ||||||
|  | 					label: 'Local +', | ||||||
|  | 					fill: true, | ||||||
|  | 					backgroundColor: rgba(colors.localPlus), | ||||||
|  | 					borderColor: colors.localPlus, | ||||||
|  | 					borderWidth: 2, | ||||||
|  | 					pointBackgroundColor: '#fff', | ||||||
|  | 					lineTension: 0, | ||||||
|  | 					data: data.map(x => ({ t: x.date, y: x.localInc })) | ||||||
|  | 				}, { | ||||||
|  | 					label: 'Local -', | ||||||
|  | 					fill: true, | ||||||
|  | 					backgroundColor: rgba(colors.localMinus), | ||||||
|  | 					borderColor: colors.localMinus, | ||||||
|  | 					borderWidth: 2, | ||||||
|  | 					pointBackgroundColor: '#fff', | ||||||
|  | 					lineTension: 0, | ||||||
|  | 					data: data.map(x => ({ t: x.date, y: x.localDec })) | ||||||
|  | 				}, { | ||||||
|  | 					label: 'Remote +', | ||||||
|  | 					fill: true, | ||||||
|  | 					backgroundColor: rgba(colors.remotePlus), | ||||||
|  | 					borderColor: colors.remotePlus, | ||||||
|  | 					borderWidth: 2, | ||||||
|  | 					pointBackgroundColor: '#fff', | ||||||
|  | 					lineTension: 0, | ||||||
|  | 					data: data.map(x => ({ t: x.date, y: x.remoteInc })) | ||||||
|  | 				}, { | ||||||
|  | 					label: 'Remote -', | ||||||
|  | 					fill: true, | ||||||
|  | 					backgroundColor: rgba(colors.remoteMinus), | ||||||
|  | 					borderColor: colors.remoteMinus, | ||||||
|  | 					borderWidth: 2, | ||||||
|  | 					pointBackgroundColor: '#fff', | ||||||
|  | 					lineTension: 0, | ||||||
|  | 					data: data.map(x => ({ t: x.date, y: x.remoteDec })) | ||||||
|  | 				}] | ||||||
|  | 			}, { | ||||||
|  | 				scales: { | ||||||
|  | 					yAxes: [{ | ||||||
|  | 						ticks: { | ||||||
|  | 							callback: value => { | ||||||
|  | 								return Vue.filter('number')(value); | ||||||
|  | 							} | ||||||
|  | 						} | ||||||
|  | 					}] | ||||||
|  | 				}, | ||||||
|  | 				tooltips: { | ||||||
|  | 					callbacks: { | ||||||
|  | 						label: (tooltipItem, data) => { | ||||||
|  | 							const label = data.datasets[tooltipItem.datasetIndex].label || ''; | ||||||
|  | 							return `${label}: ${Vue.filter('number')(tooltipItem.yLabel)}`; | ||||||
|  | 						} | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			}]; | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		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', | ||||||
|  | 					fill: false, | ||||||
|  | 					borderColor: '#555', | ||||||
|  | 					borderWidth: 2, | ||||||
|  | 					borderDash: [4, 4], | ||||||
|  | 					pointBackgroundColor: '#fff', | ||||||
|  | 					lineTension: 0, | ||||||
|  | 					data: data.map(x => ({ t: x.date, y: x.localCount + x.remoteCount })) | ||||||
|  | 				}, { | ||||||
|  | 					label: 'Local', | ||||||
|  | 					fill: true, | ||||||
|  | 					backgroundColor: rgba(colors.local), | ||||||
|  | 					borderColor: colors.local, | ||||||
|  | 					borderWidth: 2, | ||||||
|  | 					pointBackgroundColor: '#fff', | ||||||
|  | 					lineTension: 0, | ||||||
|  | 					data: data.map(x => ({ t: x.date, y: x.localCount })) | ||||||
|  | 				}, { | ||||||
|  | 					label: 'Remote', | ||||||
|  | 					fill: true, | ||||||
|  | 					backgroundColor: rgba(colors.remote), | ||||||
|  | 					borderColor: colors.remote, | ||||||
|  | 					borderWidth: 2, | ||||||
|  | 					pointBackgroundColor: '#fff', | ||||||
|  | 					lineTension: 0, | ||||||
|  | 					data: data.map(x => ({ t: x.date, y: x.remoteCount })) | ||||||
|  | 				}] | ||||||
|  | 			}, { | ||||||
|  | 				scales: { | ||||||
|  | 					yAxes: [{ | ||||||
|  | 						ticks: { | ||||||
|  | 							callback: value => { | ||||||
|  | 								return Vue.filter('number')(value); | ||||||
|  | 							} | ||||||
|  | 						} | ||||||
|  | 					}] | ||||||
|  | 				}, | ||||||
|  | 				tooltips: { | ||||||
|  | 					callbacks: { | ||||||
|  | 						label: (tooltipItem, data) => { | ||||||
|  | 							const label = data.datasets[tooltipItem.datasetIndex].label || ''; | ||||||
|  | 							return `${label}: ${Vue.filter('number')(tooltipItem.yLabel)}`; | ||||||
|  | 						} | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			}]; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | }); | ||||||
|  | </script> | ||||||
|  |  | ||||||
|  | <style lang="stylus" scoped> | ||||||
|  | @import '~const.styl' | ||||||
|  |  | ||||||
|  | .gkgckalzgidaygcxnugepioremxvxvpt | ||||||
|  | 	padding 32px | ||||||
|  | 	background #fff | ||||||
|  | 	box-shadow 0 2px 8px rgba(#000, 0.1) | ||||||
|  |  | ||||||
|  | 	* | ||||||
|  | 		user-select none | ||||||
|  |  | ||||||
|  | 	> header | ||||||
|  | 		display flex | ||||||
|  | 		margin 0 0 1em 0 | ||||||
|  | 		padding 0 0 8px 0 | ||||||
|  | 		font-size 1em | ||||||
|  | 		color #555 | ||||||
|  | 		border-bottom solid 1px #eee | ||||||
|  |  | ||||||
|  | 		> b | ||||||
|  | 			margin-right 8px | ||||||
|  |  | ||||||
|  | 		> *:last-child | ||||||
|  | 			margin-left auto | ||||||
|  |  | ||||||
|  | 			* | ||||||
|  | 				&:not(.active) | ||||||
|  | 					color $theme-color | ||||||
|  | 					cursor pointer | ||||||
|  |  | ||||||
|  | 	> div | ||||||
|  | 		> * | ||||||
|  | 			display block | ||||||
|  | 			height 320px | ||||||
|  |  | ||||||
|  | </style> | ||||||
| @@ -163,7 +163,7 @@ export default Vue.extend({ | |||||||
| 							}); | 							}); | ||||||
| 							break; | 							break; | ||||||
| 						default: | 						default: | ||||||
| 							alert('%i18n:@unhandled-error% ' + err); | 							alert(`%i18n:@unhandled-error% ${err}`); | ||||||
| 					} | 					} | ||||||
| 				}); | 				}); | ||||||
| 			} | 			} | ||||||
|   | |||||||
| @@ -323,7 +323,7 @@ export default Vue.extend({ | |||||||
| 							}); | 							}); | ||||||
| 							break; | 							break; | ||||||
| 						default: | 						default: | ||||||
| 							alert('%i18n:@unhandled-error% ' + err); | 							alert(`%i18n:@unhandled-error% ${err}`); | ||||||
| 					} | 					} | ||||||
| 				}); | 				}); | ||||||
| 			} | 			} | ||||||
| @@ -404,7 +404,7 @@ export default Vue.extend({ | |||||||
| 					folder: folder | 					folder: folder | ||||||
| 				}); | 				}); | ||||||
| 			} else { | 			} else { | ||||||
| 				window.open(url + '/i/drive/folder/' + folder.id, | 				window.open(`${url}/i/drive/folder/${folder.id}`, | ||||||
| 					'drive_window', | 					'drive_window', | ||||||
| 					'height=500, width=800'); | 					'height=500, width=800'); | ||||||
| 			} | 			} | ||||||
|   | |||||||
| @@ -55,13 +55,15 @@ export default Vue.extend({ | |||||||
| 	methods: { | 	methods: { | ||||||
| 		onFollow(user) { | 		onFollow(user) { | ||||||
| 			if (user.id == this.u.id) { | 			if (user.id == this.u.id) { | ||||||
| 				this.user.isFollowing = user.isFollowing; | 				this.u.isFollowing = user.isFollowing; | ||||||
|  | 				this.u.hasPendingFollowRequestFromYou = user.hasPendingFollowRequestFromYou; | ||||||
| 			} | 			} | ||||||
| 		}, | 		}, | ||||||
|  |  | ||||||
| 		onUnfollow(user) { | 		onUnfollow(user) { | ||||||
| 			if (user.id == this.u.id) { | 			if (user.id == this.u.id) { | ||||||
| 				this.user.isFollowing = user.isFollowing; | 				this.u.isFollowing = user.isFollowing; | ||||||
|  | 				this.u.hasPendingFollowRequestFromYou = user.hasPendingFollowRequestFromYou; | ||||||
| 			} | 			} | ||||||
| 		}, | 		}, | ||||||
|  |  | ||||||
| @@ -74,7 +76,7 @@ export default Vue.extend({ | |||||||
| 						userId: this.u.id | 						userId: this.u.id | ||||||
| 					}); | 					}); | ||||||
| 				} else { | 				} else { | ||||||
| 					if (this.u.isLocked && this.u.hasPendingFollowRequestFromYou) { | 					if (this.u.hasPendingFollowRequestFromYou) { | ||||||
| 						this.u = await (this as any).api('following/requests/cancel', { | 						this.u = await (this as any).api('following/requests/cancel', { | ||||||
| 							userId: this.u.id | 							userId: this.u.id | ||||||
| 						}); | 						}); | ||||||
|   | |||||||
| @@ -48,7 +48,7 @@ export default Vue.extend({ | |||||||
| 			const mouseY = e.clientY - rect.top; | 			const mouseY = e.clientY - rect.top; | ||||||
| 			const xp = mouseX / this.$el.offsetWidth * 100; | 			const xp = mouseX / this.$el.offsetWidth * 100; | ||||||
| 			const yp = mouseY / this.$el.offsetHeight * 100; | 			const yp = mouseY / this.$el.offsetHeight * 100; | ||||||
| 			this.$el.style.backgroundPosition = xp + '% ' + yp + '%'; | 			this.$el.style.backgroundPosition = `${xp}% ${yp}%`; | ||||||
| 			this.$el.style.backgroundImage = `url("${this.image.url}")`; | 			this.$el.style.backgroundImage = `url("${this.image.url}")`; | ||||||
| 		}, | 		}, | ||||||
|  |  | ||||||
|   | |||||||
| @@ -42,12 +42,12 @@ | |||||||
| 				<span v-if="p.deletedAt" style="opacity: 0.5">%i18n:@deleted%</span> | 				<span v-if="p.deletedAt" style="opacity: 0.5">%i18n:@deleted%</span> | ||||||
| 				<misskey-flavored-markdown v-if="p.text" :text="p.text" :i="$store.state.i"/> | 				<misskey-flavored-markdown v-if="p.text" :text="p.text" :i="$store.state.i"/> | ||||||
| 			</div> | 			</div> | ||||||
| 			<div class="media" v-if="p.media.length > 0"> | 			<div class="files" v-if="p.files.length > 0"> | ||||||
| 				<mk-media-list :media-list="p.media" :raw="true"/> | 				<mk-media-list :media-list="p.files" :raw="true"/> | ||||||
| 			</div> | 			</div> | ||||||
| 			<mk-poll v-if="p.poll" :note="p"/> | 			<mk-poll v-if="p.poll" :note="p"/> | ||||||
| 			<mk-url-preview v-for="url in urls" :url="url" :key="url" :detail="true"/> | 			<mk-url-preview v-for="url in urls" :url="url" :key="url" :detail="true"/> | ||||||
| 			<a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a> | 			<a class="location" v-if="p.geo" :href="`https://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a> | ||||||
| 			<div class="map" v-if="p.geo" ref="map"></div> | 			<div class="map" v-if="p.geo" ref="map"></div> | ||||||
| 			<div class="renote" v-if="p.renote"> | 			<div class="renote" v-if="p.renote"> | ||||||
| 				<mk-note-preview :note="p.renote"/> | 				<mk-note-preview :note="p.renote"/> | ||||||
| @@ -86,6 +86,7 @@ import MkRenoteFormWindow from './renote-form-window.vue'; | |||||||
| import MkNoteMenu from '../../../common/views/components/note-menu.vue'; | import MkNoteMenu from '../../../common/views/components/note-menu.vue'; | ||||||
| import MkReactionPicker from '../../../common/views/components/reaction-picker.vue'; | import MkReactionPicker from '../../../common/views/components/reaction-picker.vue'; | ||||||
| import XSub from './notes.note.sub.vue'; | import XSub from './notes.note.sub.vue'; | ||||||
|  | import { sum } from '../../../../../prelude/array'; | ||||||
|  |  | ||||||
| export default Vue.extend({ | export default Vue.extend({ | ||||||
| 	components: { | 	components: { | ||||||
| @@ -114,7 +115,7 @@ export default Vue.extend({ | |||||||
| 		isRenote(): boolean { | 		isRenote(): boolean { | ||||||
| 			return (this.note.renote && | 			return (this.note.renote && | ||||||
| 				this.note.text == null && | 				this.note.text == null && | ||||||
| 				this.note.mediaIds.length == 0 && | 				this.note.fileIds.length == 0 && | ||||||
| 				this.note.poll == null); | 				this.note.poll == null); | ||||||
| 		}, | 		}, | ||||||
| 		p(): any { | 		p(): any { | ||||||
| @@ -122,9 +123,7 @@ export default Vue.extend({ | |||||||
| 		}, | 		}, | ||||||
| 		reactionsCount(): number { | 		reactionsCount(): number { | ||||||
| 			return this.p.reactionCounts | 			return this.p.reactionCounts | ||||||
| 				? Object.keys(this.p.reactionCounts) | 				? sum(Object.values(this.p.reactionCounts)) | ||||||
| 					.map(key => this.p.reactionCounts[key]) |  | ||||||
| 					.reduce((a, b) => a + b) |  | ||||||
| 				: 0; | 				: 0; | ||||||
| 		}, | 		}, | ||||||
| 		title(): string { | 		title(): string { | ||||||
|   | |||||||
| @@ -28,11 +28,11 @@ | |||||||
| 						<misskey-flavored-markdown v-if="p.text" :text="p.text" :i="$store.state.i" :class="$style.text"/> | 						<misskey-flavored-markdown v-if="p.text" :text="p.text" :i="$store.state.i" :class="$style.text"/> | ||||||
| 						<a class="rp" v-if="p.renote">RP:</a> | 						<a class="rp" v-if="p.renote">RP:</a> | ||||||
| 					</div> | 					</div> | ||||||
| 					<div class="media" v-if="p.media.length > 0"> | 					<div class="files" v-if="p.files.length > 0"> | ||||||
| 						<mk-media-list :media-list="p.media"/> | 						<mk-media-list :media-list="p.files"/> | ||||||
| 					</div> | 					</div> | ||||||
| 					<mk-poll v-if="p.poll" :note="p" ref="pollViewer"/> | 					<mk-poll v-if="p.poll" :note="p" ref="pollViewer"/> | ||||||
| 					<a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% 位置情報</a> | 					<a class="location" v-if="p.geo" :href="`https://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% 位置情報</a> | ||||||
| 					<div class="map" v-if="p.geo" ref="map"></div> | 					<div class="map" v-if="p.geo" ref="map"></div> | ||||||
| 					<div class="renote" v-if="p.renote"> | 					<div class="renote" v-if="p.renote"> | ||||||
| 						<mk-note-preview :note="p.renote"/> | 						<mk-note-preview :note="p.renote"/> | ||||||
| @@ -78,6 +78,7 @@ import MkRenoteFormWindow from './renote-form-window.vue'; | |||||||
| import MkNoteMenu from '../../../common/views/components/note-menu.vue'; | import MkNoteMenu from '../../../common/views/components/note-menu.vue'; | ||||||
| import MkReactionPicker from '../../../common/views/components/reaction-picker.vue'; | import MkReactionPicker from '../../../common/views/components/reaction-picker.vue'; | ||||||
| import XSub from './notes.note.sub.vue'; | import XSub from './notes.note.sub.vue'; | ||||||
|  | import { sum } from '../../../../../prelude/array'; | ||||||
|  |  | ||||||
| function focus(el, fn) { | function focus(el, fn) { | ||||||
| 	const target = fn(el); | 	const target = fn(el); | ||||||
| @@ -110,7 +111,7 @@ export default Vue.extend({ | |||||||
| 		isRenote(): boolean { | 		isRenote(): boolean { | ||||||
| 			return (this.note.renote && | 			return (this.note.renote && | ||||||
| 				this.note.text == null && | 				this.note.text == null && | ||||||
| 				this.note.mediaIds.length == 0 && | 				this.note.fileIds.length == 0 && | ||||||
| 				this.note.poll == null); | 				this.note.poll == null); | ||||||
| 		}, | 		}, | ||||||
|  |  | ||||||
| @@ -120,9 +121,7 @@ export default Vue.extend({ | |||||||
|  |  | ||||||
| 		reactionsCount(): number { | 		reactionsCount(): number { | ||||||
| 			return this.p.reactionCounts | 			return this.p.reactionCounts | ||||||
| 				? Object.keys(this.p.reactionCounts) | 				? sum(Object.values(this.p.reactionCounts)) | ||||||
| 					.map(key => this.p.reactionCounts[key]) |  | ||||||
| 					.reduce((a, b) => a + b) |  | ||||||
| 				: 0; | 				: 0; | ||||||
| 		}, | 		}, | ||||||
|  |  | ||||||
|   | |||||||
| @@ -122,7 +122,7 @@ export default Vue.extend({ | |||||||
| 		prepend(note, silent = false) { | 		prepend(note, silent = false) { | ||||||
| 			//#region 弾く | 			//#region 弾く | ||||||
| 			const isMyNote = note.userId == this.$store.state.i.id; | 			const isMyNote = note.userId == this.$store.state.i.id; | ||||||
| 			const isPureRenote = note.renoteId != null && note.text == null && note.mediaIds.length == 0 && note.poll == null; | 			const isPureRenote = note.renoteId != null && note.text == null && note.fileIds.length == 0 && note.poll == null; | ||||||
|  |  | ||||||
| 			if (this.$store.state.settings.showMyRenotes === false) { | 			if (this.$store.state.settings.showMyRenotes === false) { | ||||||
| 				if (isMyNote && isPureRenote) { | 				if (isMyNote && isPureRenote) { | ||||||
|   | |||||||
| @@ -4,7 +4,7 @@ | |||||||
| 		<span class="icon" v-if="geo">%fa:map-marker-alt%</span> | 		<span class="icon" v-if="geo">%fa:map-marker-alt%</span> | ||||||
| 		<span v-if="!reply">%i18n:@note%</span> | 		<span v-if="!reply">%i18n:@note%</span> | ||||||
| 		<span v-if="reply">%i18n:@reply%</span> | 		<span v-if="reply">%i18n:@reply%</span> | ||||||
| 		<span class="count" v-if="media.length != 0">{{ '%i18n:@attaches%'.replace('{}', media.length) }}</span> | 		<span class="count" v-if="files.length != 0">{{ '%i18n:@attaches%'.replace('{}', files.length) }}</span> | ||||||
| 		<span class="count" v-if="uploadings.length != 0">{{ '%i18n:@uploading-media%'.replace('{}', uploadings.length) }}<mk-ellipsis/></span> | 		<span class="count" v-if="uploadings.length != 0">{{ '%i18n:@uploading-media%'.replace('{}', uploadings.length) }}<mk-ellipsis/></span> | ||||||
| 	</span> | 	</span> | ||||||
|  |  | ||||||
| @@ -14,7 +14,7 @@ | |||||||
| 			:reply="reply" | 			:reply="reply" | ||||||
| 			@posted="onPosted" | 			@posted="onPosted" | ||||||
| 			@change-uploadings="onChangeUploadings" | 			@change-uploadings="onChangeUploadings" | ||||||
| 			@change-attached-media="onChangeMedia" | 			@change-attached-files="onChangeFiles" | ||||||
| 			@geo-attached="onGeoAttached" | 			@geo-attached="onGeoAttached" | ||||||
| 			@geo-dettached="onGeoDettached"/> | 			@geo-dettached="onGeoDettached"/> | ||||||
| 	</div> | 	</div> | ||||||
| @@ -29,7 +29,7 @@ export default Vue.extend({ | |||||||
| 	data() { | 	data() { | ||||||
| 		return { | 		return { | ||||||
| 			uploadings: [], | 			uploadings: [], | ||||||
| 			media: [], | 			files: [], | ||||||
| 			geo: null | 			geo: null | ||||||
| 		}; | 		}; | ||||||
| 	}, | 	}, | ||||||
| @@ -42,8 +42,8 @@ export default Vue.extend({ | |||||||
| 		onChangeUploadings(files) { | 		onChangeUploadings(files) { | ||||||
| 			this.uploadings = files; | 			this.uploadings = files; | ||||||
| 		}, | 		}, | ||||||
| 		onChangeMedia(media) { | 		onChangeFiles(files) { | ||||||
| 			this.media = media; | 			this.files = files; | ||||||
| 		}, | 		}, | ||||||
| 		onGeoAttached(geo) { | 		onGeoAttached(geo) { | ||||||
| 			this.geo = geo; | 			this.geo = geo; | ||||||
|   | |||||||
| @@ -20,7 +20,7 @@ | |||||||
| 			@keydown="onKeydown" @paste="onPaste" :placeholder="placeholder" | 			@keydown="onKeydown" @paste="onPaste" :placeholder="placeholder" | ||||||
| 			v-autocomplete="'text'" | 			v-autocomplete="'text'" | ||||||
| 		></textarea> | 		></textarea> | ||||||
| 		<div class="medias" :class="{ with: poll }" v-show="files.length != 0"> | 		<div class="files" :class="{ with: poll }" v-show="files.length != 0"> | ||||||
| 			<x-draggable :list="files" :options="{ animation: 150 }"> | 			<x-draggable :list="files" :options="{ animation: 150 }"> | ||||||
| 				<div v-for="file in files" :key="file.id"> | 				<div v-for="file in files" :key="file.id"> | ||||||
| 					<div class="img" :style="{ backgroundImage: `url(${file.thumbnailUrl})` }" :title="file.name"></div> | 					<div class="img" :style="{ backgroundImage: `url(${file.thumbnailUrl})` }" :title="file.name"></div> | ||||||
| @@ -35,7 +35,7 @@ | |||||||
| 	<button class="upload" title="%i18n:@attach-media-from-local%" @click="chooseFile">%fa:upload%</button> | 	<button class="upload" title="%i18n:@attach-media-from-local%" @click="chooseFile">%fa:upload%</button> | ||||||
| 	<button class="drive" title="%i18n:@attach-media-from-drive%" @click="chooseFileFromDrive">%fa:cloud%</button> | 	<button class="drive" title="%i18n:@attach-media-from-drive%" @click="chooseFileFromDrive">%fa:cloud%</button> | ||||||
| 	<button class="kao" title="%i18n:@insert-a-kao%" @click="kao">%fa:R smile%</button> | 	<button class="kao" title="%i18n:@insert-a-kao%" @click="kao">%fa:R smile%</button> | ||||||
| 	<button class="poll" title="%i18n:@create-poll%" @click="poll = true">%fa:chart-pie%</button> | 	<button class="poll" title="%i18n:@create-poll%" @click="poll = !poll">%fa:chart-pie%</button> | ||||||
| 	<button class="poll" title="%i18n:@hide-contents%" @click="useCw = !useCw">%fa:eye-slash%</button> | 	<button class="poll" title="%i18n:@hide-contents%" @click="useCw = !useCw">%fa:eye-slash%</button> | ||||||
| 	<button class="geo" title="%i18n:@attach-location-information%" @click="geo ? removeGeo() : setGeo()">%fa:map-marker-alt%</button> | 	<button class="geo" title="%i18n:@attach-location-information%" @click="geo ? removeGeo() : setGeo()">%fa:map-marker-alt%</button> | ||||||
| 	<button class="visibility" title="%i18n:@visibility%" @click="setVisibility" ref="visibilityButton"> | 	<button class="visibility" title="%i18n:@visibility%" @click="setVisibility" ref="visibilityButton"> | ||||||
| @@ -62,6 +62,7 @@ import getFace from '../../../common/scripts/get-face'; | |||||||
| import MkVisibilityChooser from '../../../common/views/components/visibility-chooser.vue'; | import MkVisibilityChooser from '../../../common/views/components/visibility-chooser.vue'; | ||||||
| import parse from '../../../../../mfm/parse'; | import parse from '../../../../../mfm/parse'; | ||||||
| import { host } from '../../../config'; | import { host } from '../../../config'; | ||||||
|  | import { erase } from '../../../../../prelude/array'; | ||||||
|  |  | ||||||
| export default Vue.extend({ | export default Vue.extend({ | ||||||
| 	components: { | 	components: { | ||||||
| @@ -99,7 +100,7 @@ export default Vue.extend({ | |||||||
| 			useCw: false, | 			useCw: false, | ||||||
| 			cw: null, | 			cw: null, | ||||||
| 			geo: null, | 			geo: null, | ||||||
| 			visibility: this.$store.state.device.visibility || 'public', | 			visibility: this.$store.state.settings.rememberNoteVisibility ? (this.$store.state.device.visibility || this.$store.state.settings.defaultNoteVisibility) : this.$store.state.settings.defaultNoteVisibility, | ||||||
| 			visibleUsers: [], | 			visibleUsers: [], | ||||||
| 			autocomplete: null, | 			autocomplete: null, | ||||||
| 			draghover: false, | 			draghover: false, | ||||||
| @@ -110,9 +111,9 @@ export default Vue.extend({ | |||||||
| 	computed: { | 	computed: { | ||||||
| 		draftId(): string { | 		draftId(): string { | ||||||
| 			return this.renote | 			return this.renote | ||||||
| 				? 'renote:' + this.renote.id | 				? `renote:${this.renote.id}` | ||||||
| 				: this.reply | 				: this.reply | ||||||
| 					? 'reply:' + this.reply.id | 					? `reply:${this.reply.id}` | ||||||
| 					: 'note'; | 					: 'note'; | ||||||
| 		}, | 		}, | ||||||
|  |  | ||||||
| @@ -188,7 +189,7 @@ export default Vue.extend({ | |||||||
| 							(this.$refs.poll as any).set(draft.data.poll); | 							(this.$refs.poll as any).set(draft.data.poll); | ||||||
| 						}); | 						}); | ||||||
| 					} | 					} | ||||||
| 					this.$emit('change-attached-media', this.files); | 					this.$emit('change-attached-files', this.files); | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| @@ -225,12 +226,12 @@ export default Vue.extend({ | |||||||
|  |  | ||||||
| 		attachMedia(driveFile) { | 		attachMedia(driveFile) { | ||||||
| 			this.files.push(driveFile); | 			this.files.push(driveFile); | ||||||
| 			this.$emit('change-attached-media', this.files); | 			this.$emit('change-attached-files', this.files); | ||||||
| 		}, | 		}, | ||||||
|  |  | ||||||
| 		detachMedia(id) { | 		detachMedia(id) { | ||||||
| 			this.files = this.files.filter(x => x.id != id); | 			this.files = this.files.filter(x => x.id != id); | ||||||
| 			this.$emit('change-attached-media', this.files); | 			this.$emit('change-attached-files', this.files); | ||||||
| 		}, | 		}, | ||||||
|  |  | ||||||
| 		onChangeFile() { | 		onChangeFile() { | ||||||
| @@ -249,7 +250,7 @@ export default Vue.extend({ | |||||||
| 			this.text = ''; | 			this.text = ''; | ||||||
| 			this.files = []; | 			this.files = []; | ||||||
| 			this.poll = false; | 			this.poll = false; | ||||||
| 			this.$emit('change-attached-media', this.files); | 			this.$emit('change-attached-files', this.files); | ||||||
| 		}, | 		}, | ||||||
|  |  | ||||||
| 		onKeydown(e) { | 		onKeydown(e) { | ||||||
| @@ -297,7 +298,7 @@ export default Vue.extend({ | |||||||
| 			if (driveFile != null && driveFile != '') { | 			if (driveFile != null && driveFile != '') { | ||||||
| 				const file = JSON.parse(driveFile); | 				const file = JSON.parse(driveFile); | ||||||
| 				this.files.push(file); | 				this.files.push(file); | ||||||
| 				this.$emit('change-attached-media', this.files); | 				this.$emit('change-attached-files', this.files); | ||||||
| 				e.preventDefault(); | 				e.preventDefault(); | ||||||
| 			} | 			} | ||||||
| 			//#endregion | 			//#endregion | ||||||
| @@ -313,7 +314,7 @@ export default Vue.extend({ | |||||||
| 				this.geo = pos.coords; | 				this.geo = pos.coords; | ||||||
| 				this.$emit('geo-attached', this.geo); | 				this.$emit('geo-attached', this.geo); | ||||||
| 			}, err => { | 			}, err => { | ||||||
| 				alert('%i18n:@error%: ' + err.message); | 				alert(`%i18n:@error%: ${err.message}`); | ||||||
| 			}, { | 			}, { | ||||||
| 					enableHighAccuracy: true | 					enableHighAccuracy: true | ||||||
| 				}); | 				}); | ||||||
| @@ -346,7 +347,7 @@ export default Vue.extend({ | |||||||
| 		}, | 		}, | ||||||
|  |  | ||||||
| 		removeVisibleUser(user) { | 		removeVisibleUser(user) { | ||||||
| 			this.visibleUsers = this.visibleUsers.filter(u => u != user); | 			this.visibleUsers = erase(user, this.visibleUsers); | ||||||
| 		}, | 		}, | ||||||
|  |  | ||||||
| 		post() { | 		post() { | ||||||
| @@ -354,7 +355,7 @@ export default Vue.extend({ | |||||||
|  |  | ||||||
| 			(this as any).api('notes/create', { | 			(this as any).api('notes/create', { | ||||||
| 				text: this.text == '' ? undefined : this.text, | 				text: this.text == '' ? undefined : this.text, | ||||||
| 				mediaIds: this.files.length > 0 ? this.files.map(f => f.id) : undefined, | 				fileIds: this.files.length > 0 ? this.files.map(f => f.id) : undefined, | ||||||
| 				replyId: this.reply ? this.reply.id : undefined, | 				replyId: this.reply ? this.reply.id : undefined, | ||||||
| 				renoteId: this.renote ? this.renote.id : undefined, | 				renoteId: this.renote ? this.renote.id : undefined, | ||||||
| 				poll: this.poll ? (this.$refs.poll as any).get() : undefined, | 				poll: this.poll ? (this.$refs.poll as any).get() : undefined, | ||||||
| @@ -514,7 +515,7 @@ root(isDark) | |||||||
| 				margin-right 8px | 				margin-right 8px | ||||||
| 				white-space nowrap | 				white-space nowrap | ||||||
|  |  | ||||||
| 		> .medias | 		> .files | ||||||
| 			margin 0 | 			margin 0 | ||||||
| 			padding 0 | 			padding 0 | ||||||
| 			background isDark ? #181b23 : lighten($theme-color, 98%) | 			background isDark ? #181b23 : lighten($theme-color, 98%) | ||||||
|   | |||||||
| @@ -26,6 +26,22 @@ | |||||||
| 			<mk-switch v-model="autoPopout" text="%i18n:@auto-popout%"> | 			<mk-switch v-model="autoPopout" text="%i18n:@auto-popout%"> | ||||||
| 				<span>%i18n:@auto-popout-desc%</span> | 				<span>%i18n:@auto-popout-desc%</span> | ||||||
| 			</mk-switch> | 			</mk-switch> | ||||||
|  |  | ||||||
|  | 			<section> | ||||||
|  | 				<header>%i18n:@note-visibility%</header> | ||||||
|  | 				<mk-switch v-model="$store.state.settings.rememberNoteVisibility" @change="onChangeRememberNoteVisibility" text="%i18n:@remember-note-visibility%"/> | ||||||
|  | 				<section> | ||||||
|  | 					<header>%i18n:@default-note-visibility%</header> | ||||||
|  | 					<ui-select v-model="defaultNoteVisibility"> | ||||||
|  | 						<option value="public">%i18n:common.note-visibility.public%</option> | ||||||
|  | 						<option value="home">%i18n:common.note-visibility.home%</option> | ||||||
|  | 						<option value="followers">%i18n:common.note-visibility.followers%</option> | ||||||
|  | 						<option value="specified">%i18n:common.note-visibility.specified%</option> | ||||||
|  | 						<option value="private">%i18n:common.note-visibility.private%</option> | ||||||
|  | 					</ui-select> | ||||||
|  | 				</section> | ||||||
|  | 			</section> | ||||||
|  |  | ||||||
| 			<details> | 			<details> | ||||||
| 				<summary>%i18n:@advanced%</summary> | 				<summary>%i18n:@advanced%</summary> | ||||||
| 				<mk-switch v-model="apiViaStream" text="%i18n:@api-via-stream%"> | 				<mk-switch v-model="apiViaStream" text="%i18n:@api-via-stream%"> | ||||||
| @@ -44,11 +60,13 @@ | |||||||
| 				<button class="ui" @click="deleteWallpaper">%i18n:@delete-wallpaper%</button> | 				<button class="ui" @click="deleteWallpaper">%i18n:@delete-wallpaper%</button> | ||||||
| 				<mk-switch v-model="darkmode" text="%i18n:@dark-mode%"/> | 				<mk-switch v-model="darkmode" text="%i18n:@dark-mode%"/> | ||||||
| 				<mk-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons" text="%i18n:@circle-icons%"/> | 				<mk-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons" text="%i18n:@circle-icons%"/> | ||||||
|  | 				<mk-switch v-model="$store.state.settings.contrastedAcct" @change="onChangeContrastedAcct" text="%i18n:@contrasted-acct%"/> | ||||||
| 				<mk-switch v-model="$store.state.settings.gradientWindowHeader" @change="onChangeGradientWindowHeader" text="%i18n:@gradient-window-header%"/> | 				<mk-switch v-model="$store.state.settings.gradientWindowHeader" @change="onChangeGradientWindowHeader" text="%i18n:@gradient-window-header%"/> | ||||||
| 				<mk-switch v-model="$store.state.settings.iLikeSushi" @change="onChangeILikeSushi" text="%i18n:common.i-like-sushi%"/> | 				<mk-switch v-model="$store.state.settings.iLikeSushi" @change="onChangeILikeSushi" text="%i18n:common.i-like-sushi%"/> | ||||||
| 			</div> | 			</div> | ||||||
| 			<mk-switch v-model="$store.state.settings.showPostFormOnTopOfTl" @change="onChangeShowPostFormOnTopOfTl" text="%i18n:@post-form-on-timeline%"/> | 			<mk-switch v-model="$store.state.settings.showPostFormOnTopOfTl" @change="onChangeShowPostFormOnTopOfTl" text="%i18n:@post-form-on-timeline%"/> | ||||||
| 			<mk-switch v-model="$store.state.settings.suggestRecentHashtags" @change="onChangeSuggestRecentHashtags" text="%i18n:@suggest-recent-hashtags%"/> | 			<mk-switch v-model="$store.state.settings.suggestRecentHashtags" @change="onChangeSuggestRecentHashtags" text="%i18n:@suggest-recent-hashtags%"/> | ||||||
|  | 			<mk-switch v-model="$store.state.settings.showClockOnHeader" @change="onChangeShowClockOnHeader" text="%i18n:@show-clock-on-header%"/> | ||||||
| 			<mk-switch v-model="$store.state.settings.showReplyTarget" @change="onChangeShowReplyTarget" text="%i18n:@show-reply-target%"/> | 			<mk-switch v-model="$store.state.settings.showReplyTarget" @change="onChangeShowReplyTarget" text="%i18n:@show-reply-target%"/> | ||||||
| 			<mk-switch v-model="$store.state.settings.showMyRenotes" @change="onChangeShowMyRenotes" text="%i18n:@show-my-renotes%"/> | 			<mk-switch v-model="$store.state.settings.showMyRenotes" @change="onChangeShowMyRenotes" text="%i18n:@show-my-renotes%"/> | ||||||
| 			<mk-switch v-model="$store.state.settings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes" text="%i18n:@show-renoted-my-notes%"/> | 			<mk-switch v-model="$store.state.settings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes" text="%i18n:@show-renoted-my-notes%"/> | ||||||
| @@ -56,8 +74,9 @@ | |||||||
| 			<mk-switch v-model="$store.state.settings.showMaps" @change="onChangeShowMaps" text="%i18n:@show-maps%"> | 			<mk-switch v-model="$store.state.settings.showMaps" @change="onChangeShowMaps" text="%i18n:@show-maps%"> | ||||||
| 				<span>%i18n:@show-maps-desc%</span> | 				<span>%i18n:@show-maps-desc%</span> | ||||||
| 			</mk-switch> | 			</mk-switch> | ||||||
| 			<mk-switch v-model="$store.state.settings.reversiBoardLabels" @change="onChangeReversiBoardLabels" text="%i18n:common.show-reversi-board-labels%"/> |  | ||||||
| 			<mk-switch v-model="$store.state.settings.disableAnimatedMfm" @change="onChangeDisableAnimatedMfm" text="%i18n:common.disable-animated-mfm%"/> | 			<mk-switch v-model="$store.state.settings.disableAnimatedMfm" @change="onChangeDisableAnimatedMfm" text="%i18n:common.disable-animated-mfm%"/> | ||||||
|  | 			<mk-switch v-model="$store.state.settings.games.reversi.showBoardLabels" @change="onChangeReversiBoardLabels" text="%i18n:common.show-reversi-board-labels%"/> | ||||||
|  | 			<mk-switch v-model="$store.state.settings.games.reversi.useContrastStones" @change="onChangeUseContrastReversiStones" text="%i18n:common.use-contrast-reversi-stones%"/> | ||||||
| 		</section> | 		</section> | ||||||
|  |  | ||||||
| 		<section class="web" v-show="page == 'web'"> | 		<section class="web" v-show="page == 'web'"> | ||||||
| @@ -191,12 +210,6 @@ | |||||||
| 				<button class="ui button block" @click="taskmngr">%i18n:@task-manager%</button> | 				<button class="ui button block" @click="taskmngr">%i18n:@task-manager%</button> | ||||||
| 			</details> | 			</details> | ||||||
| 		</section> | 		</section> | ||||||
|  |  | ||||||
| 		<section class="other" v-show="page == 'other'"> |  | ||||||
| 			<h1>%i18n:@license%</h1> |  | ||||||
| 			<div v-html="license"></div> |  | ||||||
| 			<a :href="licenseUrl" target="_blank">%i18n:@third-parties%</a> |  | ||||||
| 		</section> |  | ||||||
| 	</div> | 	</div> | ||||||
| </div> | </div> | ||||||
| </template> | </template> | ||||||
| @@ -211,7 +224,7 @@ import XApi from './settings.api.vue'; | |||||||
| import XApps from './settings.apps.vue'; | import XApps from './settings.apps.vue'; | ||||||
| import XSignins from './settings.signins.vue'; | import XSignins from './settings.signins.vue'; | ||||||
| import XDrive from './settings.drive.vue'; | import XDrive from './settings.drive.vue'; | ||||||
| import { url, docsUrl, license, lang, langs, version } from '../../../config'; | import { url, langs, version } from '../../../config'; | ||||||
| import checkForUpdate from '../../../common/scripts/check-for-update'; | import checkForUpdate from '../../../common/scripts/check-for-update'; | ||||||
| import MkTaskManager from './taskmanager.vue'; | import MkTaskManager from './taskmanager.vue'; | ||||||
|  |  | ||||||
| @@ -230,7 +243,6 @@ export default Vue.extend({ | |||||||
| 		return { | 		return { | ||||||
| 			page: 'profile', | 			page: 'profile', | ||||||
| 			meta: null, | 			meta: null, | ||||||
| 			license, |  | ||||||
| 			version, | 			version, | ||||||
| 			langs, | 			langs, | ||||||
| 			latestVersion: undefined, | 			latestVersion: undefined, | ||||||
| @@ -238,15 +250,16 @@ export default Vue.extend({ | |||||||
| 		}; | 		}; | ||||||
| 	}, | 	}, | ||||||
| 	computed: { | 	computed: { | ||||||
| 		licenseUrl(): string { |  | ||||||
| 			return `${docsUrl}/${lang}/license`; |  | ||||||
| 		}, |  | ||||||
|  |  | ||||||
| 		apiViaStream: { | 		apiViaStream: { | ||||||
| 			get() { return this.$store.state.device.apiViaStream; }, | 			get() { return this.$store.state.device.apiViaStream; }, | ||||||
| 			set(value) { this.$store.commit('device/set', { key: 'apiViaStream', value }); } | 			set(value) { this.$store.commit('device/set', { key: 'apiViaStream', value }); } | ||||||
| 		}, | 		}, | ||||||
|  |  | ||||||
|  | 		defaultNoteVisibility: { | ||||||
|  | 			get() { return this.$store.state.settings.defaultNoteVisibility; }, | ||||||
|  | 			set(value) { this.$store.commit('settings/set', { key: 'defaultNoteVisibility', value }); } | ||||||
|  | 		}, | ||||||
|  |  | ||||||
| 		autoPopout: { | 		autoPopout: { | ||||||
| 			get() { return this.$store.state.device.autoPopout; }, | 			get() { return this.$store.state.device.autoPopout; }, | ||||||
| 			set(value) { this.$store.commit('device/set', { key: 'autoPopout', value }); } | 			set(value) { this.$store.commit('device/set', { key: 'autoPopout', value }); } | ||||||
| @@ -320,6 +333,12 @@ export default Vue.extend({ | |||||||
| 				value: v | 				value: v | ||||||
| 			}); | 			}); | ||||||
| 		}, | 		}, | ||||||
|  | 		onChangeRememberNoteVisibility(v) { | ||||||
|  | 			this.$store.dispatch('settings/set', { | ||||||
|  | 				key: 'rememberNoteVisibility', | ||||||
|  | 				value: v | ||||||
|  | 			}); | ||||||
|  | 		}, | ||||||
| 		onChangeAutoWatch(v) { | 		onChangeAutoWatch(v) { | ||||||
| 			(this as any).api('i/update', { | 			(this as any).api('i/update', { | ||||||
| 				autoWatch: v | 				autoWatch: v | ||||||
| @@ -343,6 +362,12 @@ export default Vue.extend({ | |||||||
| 				value: v | 				value: v | ||||||
| 			}); | 			}); | ||||||
| 		}, | 		}, | ||||||
|  | 		onChangeShowClockOnHeader(v) { | ||||||
|  | 			this.$store.dispatch('settings/set', { | ||||||
|  | 				key: 'showClockOnHeader', | ||||||
|  | 				value: v | ||||||
|  | 			}); | ||||||
|  | 		}, | ||||||
| 		onChangeShowReplyTarget(v) { | 		onChangeShowReplyTarget(v) { | ||||||
| 			this.$store.dispatch('settings/set', { | 			this.$store.dispatch('settings/set', { | ||||||
| 				key: 'showReplyTarget', | 				key: 'showReplyTarget', | ||||||
| @@ -379,6 +404,12 @@ export default Vue.extend({ | |||||||
| 				value: v | 				value: v | ||||||
| 			}); | 			}); | ||||||
| 		}, | 		}, | ||||||
|  | 		onChangeContrastedAcct(v) { | ||||||
|  | 			this.$store.dispatch('settings/set', { | ||||||
|  | 				key: 'contrastedAcct', | ||||||
|  | 				value: v | ||||||
|  | 			}); | ||||||
|  | 		}, | ||||||
| 		onChangeILikeSushi(v) { | 		onChangeILikeSushi(v) { | ||||||
| 			this.$store.dispatch('settings/set', { | 			this.$store.dispatch('settings/set', { | ||||||
| 				key: 'iLikeSushi', | 				key: 'iLikeSushi', | ||||||
| @@ -387,7 +418,13 @@ export default Vue.extend({ | |||||||
| 		}, | 		}, | ||||||
| 		onChangeReversiBoardLabels(v) { | 		onChangeReversiBoardLabels(v) { | ||||||
| 			this.$store.dispatch('settings/set', { | 			this.$store.dispatch('settings/set', { | ||||||
| 				key: 'reversiBoardLabels', | 				key: 'games.reversi.showBoardLabels', | ||||||
|  | 				value: v | ||||||
|  | 			}); | ||||||
|  | 		}, | ||||||
|  | 		onChangeUseContrastReversiStones(v) { | ||||||
|  | 			this.$store.dispatch('settings/set', { | ||||||
|  | 				key: 'games.reversi.useContrastStones', | ||||||
| 				value: v | 				value: v | ||||||
| 			}); | 			}); | ||||||
| 		}, | 		}, | ||||||
|   | |||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user