Compare commits
	
		
			358 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					15cac10d7b | ||
| 
						 | 
					49958ca03f | ||
| 
						 | 
					280dbe9853 | ||
| 
						 | 
					bf964ee969 | ||
| 
						 | 
					61dcd51888 | ||
| 
						 | 
					5448c22031 | ||
| 
						 | 
					27768081e2 | ||
| 
						 | 
					c3140f57b9 | ||
| 
						 | 
					7275bc6d3b | ||
| 
						 | 
					485f2f460e | ||
| 
						 | 
					336912e442 | ||
| 
						 | 
					dd9c94e47e | ||
| 
						 | 
					055863144d | ||
| 
						 | 
					0bf602bae6 | ||
| 
						 | 
					6fc28d1df7 | ||
| 
						 | 
					2ef795aba8 | ||
| 
						 | 
					1d2c50fc26 | ||
| 
						 | 
					cef8aa5e7a | ||
| 
						 | 
					edf3e75344 | ||
| 
						 | 
					62835c6011 | ||
| 
						 | 
					60fb22cb3c | ||
| 
						 | 
					20dea3a793 | ||
| 
						 | 
					aba37ae701 | ||
| 
						 | 
					2c6e6275aa | ||
| 
						 | 
					20ef362854 | ||
| 
						 | 
					4692aa8d9b | ||
| 
						 | 
					f7b6dc08f7 | ||
| 
						 | 
					7dfe7005e0 | ||
| 
						 | 
					b91de4ac12 | ||
| 
						 | 
					d5205d7328 | ||
| 
						 | 
					f44ce535fa | ||
| 
						 | 
					7177fd27c8 | ||
| 
						 | 
					cf304f88d4 | ||
| 
						 | 
					dff1d84031 | ||
| 
						 | 
					96bc17aa10 | ||
| 
						 | 
					41ba06a5e6 | ||
| 
						 | 
					d7ac0418d7 | ||
| 
						 | 
					f4319a9c01 | ||
| 
						 | 
					f4c4d53bbb | ||
| 
						 | 
					0ed43e1bdf | ||
| 
						 | 
					d25bd876cb | ||
| 
						 | 
					b9782397c2 | ||
| 
						 | 
					ea0abc9f71 | ||
| 
						 | 
					27d16c6a12 | ||
| 
						 | 
					ede70d354e | ||
| 
						 | 
					66fa583f6e | ||
| 
						 | 
					77bcb58f12 | ||
| 
						 | 
					61036e3a70 | ||
| 
						 | 
					bcd886c4f5 | ||
| 
						 | 
					4d868aaf1f | ||
| 
						 | 
					80ea747db6 | ||
| 
						 | 
					960f29ce81 | ||
| 
						 | 
					20ee57931f | ||
| 
						 | 
					71ba72e796 | ||
| 
						 | 
					9835945ee1 | ||
| 
						 | 
					4f2d52697d | ||
| 
						 | 
					46c258d77a | ||
| 
						 | 
					3b5b3cf521 | ||
| 
						 | 
					5e0bdd8a78 | ||
| 
						 | 
					b299988bb5 | ||
| 
						 | 
					e26bec6ab4 | ||
| 
						 | 
					e9955e01d6 | ||
| 
						 | 
					1974d8f58b | ||
| 
						 | 
					08c0be11b2 | ||
| 
						 | 
					87c7058494 | ||
| 
						 | 
					b92addffa9 | ||
| 
						 | 
					e8b49df842 | ||
| 
						 | 
					18fd39b335 | ||
| 
						 | 
					8a11322802 | ||
| 
						 | 
					31929dad61 | ||
| 
						 | 
					4a41d2fddc | ||
| 
						 | 
					4c65b0cd6f | ||
| 
						 | 
					3e89dc603d | ||
| 
						 | 
					2a1def3cce | ||
| 
						 | 
					938fe05fef | ||
| 
						 | 
					5db5bbd1cd | ||
| 
						 | 
					ba7e05837c | ||
| 
						 | 
					9dd06a7621 | ||
| 
						 | 
					2f4434b0d8 | ||
| 
						 | 
					350328770b | ||
| 
						 | 
					17e1b49bff | ||
| 
						 | 
					266c31981d | ||
| 
						 | 
					803fb0898a | ||
| 
						 | 
					01983da514 | ||
| 
						 | 
					6f473aa64a | ||
| 
						 | 
					574747b9d4 | ||
| 
						 | 
					dff1122bd5 | ||
| 
						 | 
					43cb12930a | ||
| 
						 | 
					8129d4dc23 | ||
| 
						 | 
					9b780dff04 | ||
| 
						 | 
					11a0ef485b | ||
| 
						 | 
					83b2aa72b1 | ||
| 
						 | 
					c71b24987d | ||
| 
						 | 
					78d22dbd22 | ||
| 
						 | 
					8961dab137 | ||
| 
						 | 
					bcc549fd8e | ||
| 
						 | 
					5a6c3fc11c | ||
| 
						 | 
					7d730f676d | ||
| 
						 | 
					6bda571660 | ||
| 
						 | 
					d3c7129e1f | ||
| 
						 | 
					3709ba95cd | ||
| 
						 | 
					4162981081 | ||
| 
						 | 
					7b7359fbdc | ||
| 
						 | 
					70c01c52a8 | ||
| 
						 | 
					443006c868 | ||
| 
						 | 
					7c1db1fea5 | ||
| 
						 | 
					7c2b704bef | ||
| 
						 | 
					368c3f1e29 | ||
| 
						 | 
					dd39d6ea37 | ||
| 
						 | 
					ef618b2431 | ||
| 
						 | 
					861302f0fd | ||
| 
						 | 
					f014b7ae0e | ||
| 
						 | 
					00b2d89f1a | ||
| 
						 | 
					5410efe9ca | ||
| 
						 | 
					1d814ba0e1 | ||
| 
						 | 
					c107333f56 | ||
| 
						 | 
					9595a56346 | ||
| 
						 | 
					06707705bf | ||
| 
						 | 
					68ee9a008e | ||
| 
						 | 
					3a035c481e | ||
| 
						 | 
					23a0aead9f | ||
| 
						 | 
					6cd41f9860 | ||
| 
						 | 
					baf861ac79 | ||
| 
						 | 
					0ae1190c08 | ||
| 
						 | 
					d3b3426ebe | ||
| 
						 | 
					4982ea8f14 | ||
| 
						 | 
					3be89e9702 | ||
| 
						 | 
					4275af2324 | ||
| 
						 | 
					84d42be090 | ||
| 
						 | 
					c4c7783691 | ||
| 
						 | 
					d6dba7fd71 | ||
| 
						 | 
					30b1b1a5ed | ||
| 
						 | 
					90b6688057 | ||
| 
						 | 
					b536ee4dcd | ||
| 
						 | 
					11101a6aca | ||
| 
						 | 
					b4a3e5aa4f | ||
| 
						 | 
					874c0eae6a | ||
| 
						 | 
					9950b6fbc6 | ||
| 
						 | 
					42d6ed62f6 | ||
| 
						 | 
					c7e8c27ce6 | ||
| 
						 | 
					67792fcb5e | ||
| 
						 | 
					353fc18f19 | ||
| 
						 | 
					cf9e8ed39e | ||
| 
						 | 
					beb1b570d4 | ||
| 
						 | 
					ba1b5a8ede | ||
| 
						 | 
					99d8d0a484 | ||
| 
						 | 
					5891135ac1 | ||
| 
						 | 
					c4f7491322 | ||
| 
						 | 
					206b57b962 | ||
| 
						 | 
					1b0e03704e | ||
| 
						 | 
					8b71006fbe | ||
| 
						 | 
					8f2f4b6d2d | ||
| 
						 | 
					6e0c055faf | ||
| 
						 | 
					893a3b527d | ||
| 
						 | 
					fe13c17fcb | ||
| 
						 | 
					5049870b6e | ||
| 
						 | 
					ce576dea8f | ||
| 
						 | 
					ceda3dd72a | ||
| 
						 | 
					014b58cb40 | ||
| 
						 | 
					b4859be098 | ||
| 
						 | 
					df54da9510 | ||
| 
						 | 
					b97f788d71 | ||
| 
						 | 
					edd1baa9f4 | ||
| 
						 | 
					4a23ebe534 | ||
| 
						 | 
					64c1075b06 | ||
| 
						 | 
					217e4ee39c | ||
| 
						 | 
					7e2a7cdff8 | ||
| 
						 | 
					e1fb4f23f0 | ||
| 
						 | 
					452fb8e496 | ||
| 
						 | 
					6758b0f133 | ||
| 
						 | 
					35e509850f | ||
| 
						 | 
					0868c3517f | ||
| 
						 | 
					1cd839215b | ||
| 
						 | 
					42be09ad33 | ||
| 
						 | 
					bcb7ee8d2a | ||
| 
						 | 
					3a5867b324 | ||
| 
						 | 
					efe2a6be14 | ||
| 
						 | 
					11f30b0444 | ||
| 
						 | 
					75558add17 | ||
| 
						 | 
					ca91709801 | ||
| 
						 | 
					45b905df6a | ||
| 
						 | 
					32a0cd4b13 | ||
| 
						 | 
					0b2571858f | ||
| 
						 | 
					08eb3851da | ||
| 
						 | 
					0bd0fb9fbf | ||
| 
						 | 
					9beab05a30 | ||
| 
						 | 
					3b3ef20e0a | ||
| 
						 | 
					3441acf56c | ||
| 
						 | 
					189f9f6592 | ||
| 
						 | 
					6071fc7077 | ||
| 
						 | 
					2f215ea34c | ||
| 
						 | 
					c44c777976 | ||
| 
						 | 
					7d2f0a1f31 | ||
| 
						 | 
					15eca04bc4 | ||
| 
						 | 
					238c6a428b | ||
| 
						 | 
					110eeb89f1 | ||
| 
						 | 
					278e43e9ba | ||
| 
						 | 
					d55277e57e | ||
| 
						 | 
					f53a93ea13 | ||
| 
						 | 
					a3e37294e5 | ||
| 
						 | 
					05baa89508 | ||
| 
						 | 
					80aa45372a | ||
| 
						 | 
					a91f95451a | ||
| 
						 | 
					122ef23e0f | ||
| 
						 | 
					cd9d67389a | ||
| 
						 | 
					52d6ec2138 | ||
| 
						 | 
					a5725c1d04 | ||
| 
						 | 
					db8ad3c035 | ||
| 
						 | 
					a0957f2e50 | ||
| 
						 | 
					301b8f5e13 | ||
| 
						 | 
					7f6bb75f95 | ||
| 
						 | 
					9be47df10e | ||
| 
						 | 
					bec014da4a | ||
| 
						 | 
					cefecd7903 | ||
| 
						 | 
					52cb043185 | ||
| 
						 | 
					3a440dd116 | ||
| 
						 | 
					8ae1039c77 | ||
| 
						 | 
					190eb0601f | ||
| 
						 | 
					84931003ea | ||
| 
						 | 
					2b0cb6d728 | ||
| 
						 | 
					4ea7e711ce | ||
| 
						 | 
					2a50997a75 | ||
| 
						 | 
					d692d531d1 | ||
| 
						 | 
					e325410649 | ||
| 
						 | 
					eea2b97ae5 | ||
| 
						 | 
					6b53e9ed29 | ||
| 
						 | 
					9ae3e7bdab | ||
| 
						 | 
					3905129eae | ||
| 
						 | 
					6b4e417cc7 | ||
| 
						 | 
					3040700005 | ||
| 
						 | 
					170b1bb4cc | ||
| 
						 | 
					da1a238be3 | ||
| 
						 | 
					9c106022ae | ||
| 
						 | 
					bab1dc1d97 | ||
| 
						 | 
					3b30ad5404 | ||
| 
						 | 
					27268fd6b7 | ||
| 
						 | 
					00f9c824d1 | ||
| 
						 | 
					40e177fa96 | ||
| 
						 | 
					2f72c38516 | ||
| 
						 | 
					2dc4696b0a | ||
| 
						 | 
					723d5baed5 | ||
| 
						 | 
					341838b502 | ||
| 
						 | 
					72efa278b3 | ||
| 
						 | 
					5fe9f2baee | ||
| 
						 | 
					c7ebf6f990 | ||
| 
						 | 
					9bf9519b8f | ||
| 
						 | 
					6c57690359 | ||
| 
						 | 
					3a03010ee2 | ||
| 
						 | 
					ba4dcc40da | ||
| 
						 | 
					1b0601b421 | ||
| 
						 | 
					e2bf0067b2 | ||
| 
						 | 
					6d004fde7c | ||
| 
						 | 
					f35547f3b8 | ||
| 
						 | 
					c34a278533 | ||
| 
						 | 
					6d3408ae73 | ||
| 
						 | 
					a6e7bbc306 | ||
| 
						 | 
					d140548784 | ||
| 
						 | 
					76569bfb08 | ||
| 
						 | 
					bbcdf1bb8a | ||
| 
						 | 
					6439a6c63f | ||
| 
						 | 
					76fe1c21c3 | ||
| 
						 | 
					4f99b98ed8 | ||
| 
						 | 
					7cb38f5525 | ||
| 
						 | 
					734277d9f6 | ||
| 
						 | 
					960d4e2e7b | ||
| 
						 | 
					33eb91c0f0 | ||
| 
						 | 
					6f1e47f0b3 | ||
| 
						 | 
					0a8488a78c | ||
| 
						 | 
					57ab640221 | ||
| 
						 | 
					3c4682782c | ||
| 
						 | 
					dc820ffba6 | ||
| 
						 | 
					e4c745bccd | ||
| 
						 | 
					a05c94437c | ||
| 
						 | 
					fdcc994291 | ||
| 
						 | 
					f54363076c | ||
| 
						 | 
					ec016e5a95 | ||
| 
						 | 
					bbdb2496a4 | ||
| 
						 | 
					b515cc90e9 | ||
| 
						 | 
					bb92158dff | ||
| 
						 | 
					c652add16a | ||
| 
						 | 
					b8a7468c4a | ||
| 
						 | 
					e220ef3e75 | ||
| 
						 | 
					4bb4903ee5 | ||
| 
						 | 
					9487840ae3 | ||
| 
						 | 
					7e3a8d56e6 | ||
| 
						 | 
					e909eac296 | ||
| 
						 | 
					8dc7f28744 | ||
| 
						 | 
					a4b1e8ca26 | ||
| 
						 | 
					79b0cc6785 | ||
| 
						 | 
					00b134ce1e | ||
| 
						 | 
					b3fc4dc00f | ||
| 
						 | 
					d06fbbe3ea | ||
| 
						 | 
					28bfb45426 | ||
| 
						 | 
					1c60a49c96 | ||
| 
						 | 
					3ae8ff083b | ||
| 
						 | 
					c12ccb2a15 | ||
| 
						 | 
					e3b1d00e4c | ||
| 
						 | 
					98795aad9a | ||
| 
						 | 
					ca26edbfce | ||
| 
						 | 
					3058e8f354 | ||
| 
						 | 
					4c9b66b0f0 | ||
| 
						 | 
					6eb9ba31bf | ||
| 
						 | 
					5bbf4187e6 | ||
| 
						 | 
					f2425f71c2 | ||
| 
						 | 
					b0e00da2f7 | ||
| 
						 | 
					215472cd17 | ||
| 
						 | 
					072fd4455e | ||
| 
						 | 
					2ed9e26a4f | ||
| 
						 | 
					8a3e26cdb8 | ||
| 
						 | 
					7301671962 | ||
| 
						 | 
					0d0f25818e | ||
| 
						 | 
					7850d68dc2 | ||
| 
						 | 
					f0f5b32300 | ||
| 
						 | 
					1ca0976e85 | ||
| 
						 | 
					7fbfd17896 | ||
| 
						 | 
					3d04f7db62 | ||
| 
						 | 
					e301630c9d | ||
| 
						 | 
					afbccaae41 | ||
| 
						 | 
					893c01c207 | ||
| 
						 | 
					41c80097ce | ||
| 
						 | 
					250933fff3 | ||
| 
						 | 
					bc9454f67c | ||
| 
						 | 
					377a7fdf3e | ||
| 
						 | 
					645f661911 | ||
| 
						 | 
					db7c83c8ff | ||
| 
						 | 
					97385db5b5 | ||
| 
						 | 
					c69d57a064 | ||
| 
						 | 
					a488d6e2d6 | ||
| 
						 | 
					85e8b1fbf4 | ||
| 
						 | 
					78763116c3 | ||
| 
						 | 
					103fe8b91d | ||
| 
						 | 
					311e67047d | ||
| 
						 | 
					62d41023e1 | ||
| 
						 | 
					5fac7c1718 | ||
| 
						 | 
					ade01139ca | ||
| 
						 | 
					5ea8e9c787 | ||
| 
						 | 
					e5cfdbf372 | ||
| 
						 | 
					d2cc5c3b63 | ||
| 
						 | 
					7cdd90db09 | ||
| 
						 | 
					aad1b8c12e | ||
| 
						 | 
					2519abdd39 | ||
| 
						 | 
					e8d0568a11 | ||
| 
						 | 
					5621113d1f | ||
| 
						 | 
					e4c0c8869e | ||
| 
						 | 
					405f98d6d1 | ||
| 
						 | 
					870ab3d3b6 | ||
| 
						 | 
					9ac2913afc | ||
| 
						 | 
					171651484a | ||
| 
						 | 
					bfadb4026d | ||
| 
						 | 
					3940a9a447 | ||
| 
						 | 
					714446fb46 | ||
| 
						 | 
					e806f33f9f | ||
| 
						 | 
					65ee1711e5 | ||
| 
						 | 
					ef92578555 | ||
| 
						 | 
					0352fd0acd | ||
| 
						 | 
					fffce73d3e | ||
| 
						 | 
					717f66b4a6 | ||
| 
						 | 
					7017d3ae07 | 
@@ -2,7 +2,7 @@
 | 
				
			|||||||
# __MISSKEY_BEARER_TOKEN=
 | 
					# __MISSKEY_BEARER_TOKEN=
 | 
				
			||||||
# __MISSKEY_CAMPAIGN_ID=
 | 
					# __MISSKEY_CAMPAIGN_ID=
 | 
				
			||||||
# __MISSKEY_GITHUB_TOKEN=
 | 
					# __MISSKEY_GITHUB_TOKEN=
 | 
				
			||||||
# __MISSKEY_HEAD=acid-chicken:patch-autogen
 | 
					# __MISSKEY_HEAD=syuilo:patch-autogen
 | 
				
			||||||
# __MISSKEY_REPO=syuilo/misskey
 | 
					# __MISSKEY_REPO=syuilo/misskey
 | 
				
			||||||
# __MISSKEY_BRANCH=develop
 | 
					# __MISSKEY_BRANCH=develop
 | 
				
			||||||
test "$(curl -LSs -w '\n' -- "https://api.github.com/repos/$REPO/pulls?access_token=$__MISSKEY_GITHUB_TOKEN" | jq -r -f check_pr.jq | grep $__MISSKEY_HEAD)" && exit 1
 | 
					test "$(curl -LSs -w '\n' -- "https://api.github.com/repos/$REPO/pulls?access_token=$__MISSKEY_GITHUB_TOKEN" | jq -r -f check_pr.jq | grep $__MISSKEY_HEAD)" && exit 1
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -30,22 +30,21 @@ jobs:
 | 
				
			|||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
      - checkout
 | 
					      - checkout
 | 
				
			||||||
      - run:
 | 
					      - run:
 | 
				
			||||||
          name: Ensure package-lock.json
 | 
					          name: Ensure yarn.lock
 | 
				
			||||||
          command: |
 | 
					          command: |
 | 
				
			||||||
            [ ! -e package-lock.json ] && echo '{}' > package-lock.json
 | 
					            touch yarn.lock
 | 
				
			||||||
      - restore_cache:
 | 
					      - restore_cache:
 | 
				
			||||||
          name: Restore npm package caches
 | 
					          name: Restore npm package caches
 | 
				
			||||||
          keys:
 | 
					          keys:
 | 
				
			||||||
            - npm-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-lock-{{ checksum "package-lock.json" }}-
 | 
					            - yarn-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-lock-{{ checksum "yarn.lock" }}
 | 
				
			||||||
            - npm-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-
 | 
					            - yarn-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-
 | 
				
			||||||
            - npm-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-
 | 
					            - yarn-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-
 | 
				
			||||||
            - npm-v1-arch-{{ arch }}-
 | 
					            - yarn-v1-arch-{{ arch }}-
 | 
				
			||||||
            - npm-v1-
 | 
					            - yarn-v1-
 | 
				
			||||||
      - run:
 | 
					      - run:
 | 
				
			||||||
          name: Install Dependencies
 | 
					          name: Install Dependencies
 | 
				
			||||||
          command: |
 | 
					          command: |
 | 
				
			||||||
            npm install
 | 
					            yarn install
 | 
				
			||||||
            npm prune
 | 
					 | 
				
			||||||
      - run:
 | 
					      - run:
 | 
				
			||||||
          name: Configure
 | 
					          name: Configure
 | 
				
			||||||
          command: |
 | 
					          command: |
 | 
				
			||||||
@@ -54,13 +53,11 @@ jobs:
 | 
				
			|||||||
      - run:
 | 
					      - run:
 | 
				
			||||||
          name: Build
 | 
					          name: Build
 | 
				
			||||||
          command: |
 | 
					          command: |
 | 
				
			||||||
            node-gyp configure
 | 
					            yarn build
 | 
				
			||||||
            node-gyp build
 | 
					            touch yarn.lock
 | 
				
			||||||
            npm run build || (echo -e '\033[0;34mRebuild modules\033[0;39m' && ls -1A node_modules | grep '^[^@]' | xargs npm rebuild && ls -1A node_modules | grep '^@' | xargs -I%1 sh -c 'ls -1A node_modules/'%1' | xargs -P0 -I%2 npm rebuild node_modules/'%1'/%2' && npm run build)
 | 
					 | 
				
			||||||
            ls -1ARl node_modules > ls
 | 
					 | 
				
			||||||
      - save_cache:
 | 
					      - save_cache:
 | 
				
			||||||
          name: Cache npm packages
 | 
					          name: Cache npm packages
 | 
				
			||||||
          key: npm-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-lock-{{ checksum "package-lock.json" }}-ls-{{ checksum "ls" }}
 | 
					          key: yarn-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-lock-{{ checksum "yarn.lock" }}
 | 
				
			||||||
          paths:
 | 
					          paths:
 | 
				
			||||||
            - node_modules
 | 
					            - node_modules
 | 
				
			||||||
#      - store_artifacts:
 | 
					#      - store_artifacts:
 | 
				
			||||||
@@ -90,11 +87,11 @@ jobs:
 | 
				
			|||||||
      - run:
 | 
					      - run:
 | 
				
			||||||
          name: Test
 | 
					          name: Test
 | 
				
			||||||
          command: |
 | 
					          command: |
 | 
				
			||||||
            npm run test
 | 
					            yarn test
 | 
				
			||||||
            ls -1ARl node_modules > ls
 | 
					            touch yarn.lock
 | 
				
			||||||
      - save_cache:
 | 
					      - save_cache:
 | 
				
			||||||
          name: Cache npm packages
 | 
					          name: Cache npm packages
 | 
				
			||||||
          key: npm-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-lock-{{ checksum "package-lock.json" }}-ls-{{ checksum "ls" }}
 | 
					          key: yarn-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-lock-{{ checksum "yarn.lock" }}
 | 
				
			||||||
          paths:
 | 
					          paths:
 | 
				
			||||||
            - node_modules
 | 
					            - node_modules
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -137,12 +134,14 @@ workflows:
 | 
				
			|||||||
              only:
 | 
					              only:
 | 
				
			||||||
                - l10n_develop
 | 
					                - l10n_develop
 | 
				
			||||||
                - imgbot
 | 
					                - imgbot
 | 
				
			||||||
 | 
					                - patch-autogen
 | 
				
			||||||
      - build:
 | 
					      - build:
 | 
				
			||||||
          filters:
 | 
					          filters:
 | 
				
			||||||
            branches:
 | 
					            branches:
 | 
				
			||||||
              ignore:
 | 
					              ignore:
 | 
				
			||||||
                - l10n_develop
 | 
					                - l10n_develop
 | 
				
			||||||
                - imgbot
 | 
					                - imgbot
 | 
				
			||||||
 | 
					                - patch-autogen
 | 
				
			||||||
      - test:
 | 
					      - test:
 | 
				
			||||||
          requires:
 | 
					          requires:
 | 
				
			||||||
            - build
 | 
					            - build
 | 
				
			||||||
@@ -152,13 +151,20 @@ workflows:
 | 
				
			|||||||
#                - master
 | 
					#                - master
 | 
				
			||||||
                - l10n_develop
 | 
					                - l10n_develop
 | 
				
			||||||
                - imgbot
 | 
					                - imgbot
 | 
				
			||||||
 | 
					                - patch-autogen
 | 
				
			||||||
      - test:
 | 
					      - test:
 | 
				
			||||||
          without_redis: "true"
 | 
					          without_redis: "true"
 | 
				
			||||||
          requires:
 | 
					          requires:
 | 
				
			||||||
            - build
 | 
					            - build
 | 
				
			||||||
          filters:
 | 
					          filters:
 | 
				
			||||||
 | 
					#            branches:
 | 
				
			||||||
 | 
					#              only: master
 | 
				
			||||||
            branches:
 | 
					            branches:
 | 
				
			||||||
              only: master
 | 
					              ignore:
 | 
				
			||||||
 | 
					#                - master
 | 
				
			||||||
 | 
					                - l10n_develop
 | 
				
			||||||
 | 
					                - imgbot
 | 
				
			||||||
 | 
					                - patch-autogen
 | 
				
			||||||
#      - docker:
 | 
					#      - docker:
 | 
				
			||||||
#          filters:
 | 
					#          filters:
 | 
				
			||||||
#            branches:
 | 
					#            branches:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,6 +6,8 @@ mongodb:
 | 
				
			|||||||
  db: misskey
 | 
					  db: misskey
 | 
				
			||||||
  user: syuilo
 | 
					  user: syuilo
 | 
				
			||||||
  pass: ''
 | 
					  pass: ''
 | 
				
			||||||
 | 
					drive:
 | 
				
			||||||
 | 
					  storage: 'db'
 | 
				
			||||||
redis:
 | 
					redis:
 | 
				
			||||||
  host: localhost
 | 
					  host: localhost
 | 
				
			||||||
  port: 6379
 | 
					  port: 6379
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,6 +6,8 @@ mongodb:
 | 
				
			|||||||
  db: test-misskey
 | 
					  db: test-misskey
 | 
				
			||||||
  user: admin
 | 
					  user: admin
 | 
				
			||||||
  pass: ''
 | 
					  pass: ''
 | 
				
			||||||
 | 
					drive:
 | 
				
			||||||
 | 
					  storage: 'db'
 | 
				
			||||||
# __REDIS__
 | 
					# __REDIS__
 | 
				
			||||||
redis:
 | 
					redis:
 | 
				
			||||||
  host: localhost
 | 
					  host: localhost
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -108,5 +108,8 @@ autoAdmin: true
 | 
				
			|||||||
#  port: 9200
 | 
					#  port: 9200
 | 
				
			||||||
#  pass: null
 | 
					#  pass: null
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Whether disable HSTS
 | 
				
			||||||
 | 
					#disableHsts: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Clustering
 | 
					# Clustering
 | 
				
			||||||
#clusterLimit: 1
 | 
					#clusterLimit: 1
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										10
									
								
								.github/ISSUE_TEMPLATE/bug_report.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								.github/ISSUE_TEMPLATE/bug_report.md
									
									
									
									
										vendored
									
									
								
							@@ -1,22 +1,30 @@
 | 
				
			|||||||
---
 | 
					---
 | 
				
			||||||
name: Bug Report
 | 
					name: Bug Report
 | 
				
			||||||
about: Create a report to help us improve
 | 
					about: Create a report to help us improve
 | 
				
			||||||
 | 
					title: ''
 | 
				
			||||||
 | 
					labels: bug
 | 
				
			||||||
 | 
					assignees: ''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
---
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Summary
 | 
					# Summary
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<!-- Tell us what the bug is -->
 | 
					<!-- Tell us what the bug is -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Expected Behavior
 | 
					# Expected Behavior
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<!--- Tell us what should happen -->
 | 
					<!--- Tell us what should happen -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Actual Behavior
 | 
					# Actual Behavior
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<!--- Tell us what happens instead of the expected behavior -->
 | 
					<!--- Tell us what happens instead of the expected behavior -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Steps to Reproduce
 | 
					# Steps to Reproduce
 | 
				
			||||||
 | 
					
 | 
				
			||||||
1.
 | 
					1.
 | 
				
			||||||
2.
 | 
					2.
 | 
				
			||||||
3.
 | 
					3.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Environment
 | 
					# Environment
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<!-- Tell us where on the platform it happens -->
 | 
					<!-- Tell us where on the platform it happens -->
 | 
				
			||||||
<!-- e.g. desktop or mobile version, your browser, your OS -->
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										31
									
								
								.github/ISSUE_TEMPLATE/client-side-bug-report.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								.github/ISSUE_TEMPLATE/client-side-bug-report.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
				
			|||||||
 | 
					---
 | 
				
			||||||
 | 
					name: Client-side Bug Report
 | 
				
			||||||
 | 
					about: Create a report to help us improve
 | 
				
			||||||
 | 
					title: ''
 | 
				
			||||||
 | 
					labels: bug, client-side
 | 
				
			||||||
 | 
					assignees: ''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Summary
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<!-- Tell us what the bug is -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Expected Behavior
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<!--- Tell us what should happen -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Actual Behavior
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<!--- Tell us what happens instead of the expected behavior -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Steps to Reproduce
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1.
 | 
				
			||||||
 | 
					2.
 | 
				
			||||||
 | 
					3.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Environment
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<!-- Tell us where on the platform it happens -->
 | 
				
			||||||
 | 
					<!-- e.g. desktop or mobile version, your browser, your OS -->
 | 
				
			||||||
							
								
								
									
										12
									
								
								.github/ISSUE_TEMPLATE/client-side-feature-request.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								.github/ISSUE_TEMPLATE/client-side-feature-request.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,12 @@
 | 
				
			|||||||
 | 
					---
 | 
				
			||||||
 | 
					name: Client-side Feature Request
 | 
				
			||||||
 | 
					about: Suggest an idea for this project
 | 
				
			||||||
 | 
					title: ''
 | 
				
			||||||
 | 
					labels: client-side, feature
 | 
				
			||||||
 | 
					assignees: ''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Summary
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<!-- Tell us what the suggestion is -->
 | 
				
			||||||
							
								
								
									
										9
									
								
								.github/ISSUE_TEMPLATE/feature_request.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								.github/ISSUE_TEMPLATE/feature_request.md
									
									
									
									
										vendored
									
									
								
							@@ -1,11 +1,12 @@
 | 
				
			|||||||
---
 | 
					---
 | 
				
			||||||
name: Feature Request
 | 
					name: Feature Request
 | 
				
			||||||
about: Suggest an idea for this project
 | 
					about: Suggest an idea for this project
 | 
				
			||||||
 | 
					title: ''
 | 
				
			||||||
 | 
					labels: feature
 | 
				
			||||||
 | 
					assignees: ''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
---
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Summary
 | 
					# Summary
 | 
				
			||||||
<!-- Tell us what the suggestion is -->
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Environment
 | 
					<!-- Tell us what the suggestion is -->
 | 
				
			||||||
<!-- Tell us where on the platform it related -->
 | 
					 | 
				
			||||||
<!-- e.g. desktop or mobile version, your browser, your OS -->
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										31
									
								
								.github/ISSUE_TEMPLATE/server-side-bug-report.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								.github/ISSUE_TEMPLATE/server-side-bug-report.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
				
			|||||||
 | 
					---
 | 
				
			||||||
 | 
					name: Server-side Bug Report
 | 
				
			||||||
 | 
					about: Create a report to help us improve
 | 
				
			||||||
 | 
					title: ''
 | 
				
			||||||
 | 
					labels: bug, server-side
 | 
				
			||||||
 | 
					assignees: ''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Summary
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<!-- Tell us what the bug is -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Expected Behavior
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<!--- Tell us what should happen -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Actual Behavior
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<!--- Tell us what happens instead of the expected behavior -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Steps to Reproduce
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1.
 | 
				
			||||||
 | 
					2.
 | 
				
			||||||
 | 
					3.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Environment
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<!-- Tell us where on the platform it happens -->
 | 
				
			||||||
 | 
					<!-- e.g. your Node.js version, your OS -->
 | 
				
			||||||
							
								
								
									
										12
									
								
								.github/ISSUE_TEMPLATE/server-side-feature-request.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								.github/ISSUE_TEMPLATE/server-side-feature-request.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,12 @@
 | 
				
			|||||||
 | 
					---
 | 
				
			||||||
 | 
					name: Server-side Feature Request
 | 
				
			||||||
 | 
					about: Suggest an idea for this project
 | 
				
			||||||
 | 
					title: ''
 | 
				
			||||||
 | 
					labels: feature, server-side
 | 
				
			||||||
 | 
					assignees: ''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Summary
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<!-- Tell us what the suggestion is -->
 | 
				
			||||||
							
								
								
									
										54
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										54
									
								
								CHANGELOG.md
									
									
									
									
									
								
							@@ -1,6 +1,60 @@
 | 
				
			|||||||
ChangeLog
 | 
					ChangeLog
 | 
				
			||||||
=========
 | 
					=========
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					10.82.4
 | 
				
			||||||
 | 
					----------
 | 
				
			||||||
 | 
					* 起動できなくなることがある問題を修正
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					10.82.3
 | 
				
			||||||
 | 
					----------
 | 
				
			||||||
 | 
					* フォロー/ミュート/ブロックデータをエクスポート可能に
 | 
				
			||||||
 | 
					* バグ修正
 | 
				
			||||||
 | 
					* デザインの調整
 | 
				
			||||||
 | 
					* ジョブキューの動作を修正
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					10.82.2
 | 
				
			||||||
 | 
					----------
 | 
				
			||||||
 | 
					* ジョブキューの動作を修正
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					10.82.1
 | 
				
			||||||
 | 
					----------
 | 
				
			||||||
 | 
					* クラスタリング環境でのジョブキューの動作を修正
 | 
				
			||||||
 | 
					* その他の軽微な改善
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					10.82.0
 | 
				
			||||||
 | 
					----------
 | 
				
			||||||
 | 
					* 自分の投稿情報をエクスポートできるように
 | 
				
			||||||
 | 
					* アニメーションする画像を再生しないで表示するオプションを実装
 | 
				
			||||||
 | 
					* 個別に投稿のウォッチ/ウォッチ解除をできるように
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					10.81.0
 | 
				
			||||||
 | 
					----------
 | 
				
			||||||
 | 
					* 動画のサムネイルを作成するように
 | 
				
			||||||
 | 
					* リモートの外部サービス認証情報を表示するように
 | 
				
			||||||
 | 
					* public の Renote/Reply/Quote先 が public以外 だったら、public => homeに
 | 
				
			||||||
 | 
					* ユーザーページから管理者/モデレーターがアカウントのサイレンス/凍結をできるように
 | 
				
			||||||
 | 
					* 凍結されたユーザーをタイムライン等に表示しないように
 | 
				
			||||||
 | 
					* おすすめのアンケートでミュートユーザーのものは表示しないように
 | 
				
			||||||
 | 
					* おすすめのアンケートで凍結済みユーザーのものは表示しないように
 | 
				
			||||||
 | 
					* 画像でないファイルのサムネイルとしてオリジナルファイルを返してしまうのを修正
 | 
				
			||||||
 | 
					* URLプレビューのサムネイルが表示されない場合がある問題を修正
 | 
				
			||||||
 | 
					* ダークモードで読みにくいボタンがあるのを修正
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					10.80.0
 | 
				
			||||||
 | 
					----------
 | 
				
			||||||
 | 
					* サイレンス機能の追加
 | 
				
			||||||
 | 
					* リプライ/メンションされていれば非フォロワーへのフォロワー限定でも参照可能に
 | 
				
			||||||
 | 
					* MFMの解析を強化
 | 
				
			||||||
 | 
					* Misskey以外のインスタンスからMisskeyの投稿を見たときに改行が多い問題を修正
 | 
				
			||||||
 | 
					* Misskey以外のインスタンスからMisskeyの投稿を見たときにメンションのURLが展開されるのを修正
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					10.79.1
 | 
				
			||||||
 | 
					----------
 | 
				
			||||||
 | 
					* jump構文の追加
 | 
				
			||||||
 | 
					* MFMで左回転、往復回転を行えるように
 | 
				
			||||||
 | 
					* MFMに関する制限を若干緩和
 | 
				
			||||||
 | 
					* シンタックスハイライトに関するバグ修正
 | 
				
			||||||
 | 
					
 | 
				
			||||||
10.79.0
 | 
					10.79.0
 | 
				
			||||||
----------
 | 
					----------
 | 
				
			||||||
* 返信するときにCWを維持するかどうか設定できるように
 | 
					* 返信するときにCWを維持するかどうか設定できるように
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -44,3 +44,15 @@ Stands for _**S**ervice**W**orker_.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#### Denyaize
 | 
					#### Denyaize
 | 
				
			||||||
Nyaizeを解除すること
 | 
					Nyaizeを解除すること
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Code style
 | 
				
			||||||
 | 
					### Don't use `export default`
 | 
				
			||||||
 | 
					Bad:
 | 
				
			||||||
 | 
					``` ts
 | 
				
			||||||
 | 
					export default function(foo: string): string {
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Good:
 | 
				
			||||||
 | 
					``` ts
 | 
				
			||||||
 | 
					export function something(foo: string): string {
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -35,7 +35,9 @@ RUN node-gyp configure \
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
FROM base AS runner
 | 
					FROM base AS runner
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RUN apk add --no-cache tini
 | 
					RUN apk add --no-cache \
 | 
				
			||||||
 | 
					    ffmpeg \
 | 
				
			||||||
 | 
					    tini
 | 
				
			||||||
ENTRYPOINT ["/sbin/tini", "--"]
 | 
					ENTRYPOINT ["/sbin/tini", "--"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
COPY --from=builder /misskey/node_modules ./node_modules
 | 
					COPY --from=builder /misskey/node_modules ./node_modules
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								README.md
									
									
									
									
									
								
							@@ -61,6 +61,10 @@ Organize and store your files! Want to post a picture you have already uploaded?
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
...and more! Experience Misskey with your own eyes at [misskey.xyz](https://misskey.xyz) or join one of the [other instances](https://joinmisskey.github.io/) that are available.
 | 
					...and more! Experience Misskey with your own eyes at [misskey.xyz](https://misskey.xyz) or join one of the [other instances](https://joinmisskey.github.io/) that are available.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:new: What's new
 | 
				
			||||||
 | 
					----------------------------------------------------------------
 | 
				
			||||||
 | 
					Please see the [Release notes](./CHANGELOG.md).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
:package: Create your own instance
 | 
					:package: Create your own instance
 | 
				
			||||||
----------------------------------------------------------------
 | 
					----------------------------------------------------------------
 | 
				
			||||||
Please see the [Setup and Installation Guide](./docs/setup.en.md).
 | 
					Please see the [Setup and Installation Guide](./docs/setup.en.md).
 | 
				
			||||||
@@ -85,22 +89,22 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
 | 
				
			|||||||
	</tr>
 | 
						</tr>
 | 
				
			||||||
</table>
 | 
					</table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
:heart: Backers & Sponsors
 | 
					:heart: Backers
 | 
				
			||||||
----------------------------------------------------------------
 | 
					----------------------------------------------------------------
 | 
				
			||||||
<!-- PATREON_START -->
 | 
					<!-- PATREON_START -->
 | 
				
			||||||
<table><tr>
 | 
					<table><tr>
 | 
				
			||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12190916/fb7fa7983c14425f890369535b1506a4/1?token-time=2145916800&token-hash=WeuDzzz24cRXJogyIkU-mxARqkdyms-rcZKbO-GpGjw%3D" alt="weep" width="100"></td>
 | 
					<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12190916/fb7fa7983c14425f890369535b1506a4/1?token-time=2145916800&token-hash=WeuDzzz24cRXJogyIkU-mxARqkdyms-rcZKbO-GpGjw%3D" alt="weep" width="100"></td>
 | 
				
			||||||
<td><img src="https://c8.patreon.com/2/200/12059069" alt="naga_rus" width="100"></td>
 | 
					 | 
				
			||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12731202/0995c46cdcb54153ab5f073f5869b70a/1?token-time=2145916800&token-hash=prtYqPOiSHBulhM7NU0VzMaWx39-9ntdq25b6kafDNA%3D" alt="negao" width="100"></td>
 | 
					<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12731202/0995c46cdcb54153ab5f073f5869b70a/1?token-time=2145916800&token-hash=prtYqPOiSHBulhM7NU0VzMaWx39-9ntdq25b6kafDNA%3D" alt="negao" width="100"></td>
 | 
				
			||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12913507/f7181eacafe8469a93033d85f5969c29/3?token-time=2145916800&token-hash=c8HeVqLtmdgH-gSBJg8i10gmOcwllM87MDHeznl3el0%3D" alt="Melilot" width="100"></td>
 | 
					<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12913507/f7181eacafe8469a93033d85f5969c29/3?token-time=2145916800&token-hash=c8HeVqLtmdgH-gSBJg8i10gmOcwllM87MDHeznl3el0%3D" alt="Melilot" width="100"></td>
 | 
				
			||||||
 | 
					<td><img src="https://c8.patreon.com/2/200/16869916" alt="見当かなみ" width="100"></td>
 | 
				
			||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12999811/5f349fafcce44dd1824a8b1ebbec4564/3?token-time=2145916800&token-hash=LtV2lRi3L2jOWMLwccr9qWYfPrFlzIo2jYZHKzHEb6k%3D" alt="Xeltica" width="100"></td>
 | 
					<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12999811/5f349fafcce44dd1824a8b1ebbec4564/3?token-time=2145916800&token-hash=LtV2lRi3L2jOWMLwccr9qWYfPrFlzIo2jYZHKzHEb6k%3D" alt="Xeltica" width="100"></td>
 | 
				
			||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/3384329/8b713330cb27404ea6e9fac50ff96efe/1?token-time=2145916800&token-hash=Ch3iF81ZGP0LMo894Y9ajpLisgtE91SnxtZE7fxsgrM%3D" alt="べすれい" width="100"></td>
 | 
					<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/3384329/8b713330cb27404ea6e9fac50ff96efe/1?token-time=2145916800&token-hash=Ch3iF81ZGP0LMo894Y9ajpLisgtE91SnxtZE7fxsgrM%3D" alt="べすれい" width="100"></td>
 | 
				
			||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12021162/963128bb8d14476dbd8407943db8f31a/1?token-time=2145916800&token-hash=1FlxS9MEgmNGH_RHUVHbO5hIXB5I1z0lvA33CTvYvjA%3D" alt="gutfuckllc" width="100"></td>
 | 
					<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12021162/963128bb8d14476dbd8407943db8f31a/1?token-time=2145916800&token-hash=1FlxS9MEgmNGH_RHUVHbO5hIXB5I1z0lvA33CTvYvjA%3D" alt="gutfuckllc" width="100"></td>
 | 
				
			||||||
</tr><tr>
 | 
					</tr><tr>
 | 
				
			||||||
<td><a href="https://www.patreon.com/weepjp">weep</a></td>
 | 
					<td><a href="https://www.patreon.com/weepjp">weep</a></td>
 | 
				
			||||||
<td><a href="https://www.patreon.com/user?u=12059069">naga_rus</a></td>
 | 
					 | 
				
			||||||
<td><a href="https://www.patreon.com/negao">negao</a></td>
 | 
					<td><a href="https://www.patreon.com/negao">negao</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/user?u=16869916">見当かなみ</a></td>
 | 
				
			||||||
<td><a href="https://www.patreon.com/Xeltica">Xeltica</a></td>
 | 
					<td><a href="https://www.patreon.com/Xeltica">Xeltica</a></td>
 | 
				
			||||||
<td><a href="https://www.patreon.com/user?u=3384329">べすれい</a></td>
 | 
					<td><a href="https://www.patreon.com/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>
 | 
				
			||||||
@@ -111,20 +115,20 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
 | 
				
			|||||||
<td><img src="https://c8.patreon.com/2/200/16542964" alt="Takumi Sugita" width="100"></td>
 | 
					<td><img src="https://c8.patreon.com/2/200/16542964" alt="Takumi Sugita" width="100"></td>
 | 
				
			||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13039004/509d0c412eb14ae08d6a812a3054f7d6/1?token-time=2145916800&token-hash=2PsbFNw0tnubZzgSXD01R6hIgncfiElG7H7HX2Y3dyo%3D" alt="nemu" width="100"></td>
 | 
					<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13039004/509d0c412eb14ae08d6a812a3054f7d6/1?token-time=2145916800&token-hash=2PsbFNw0tnubZzgSXD01R6hIgncfiElG7H7HX2Y3dyo%3D" alt="nemu" width="100"></td>
 | 
				
			||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/3?token-time=2145916800&token-hash=9JtETp0X8gI280Ne1E8bxn6j4Lw5o2k4mJkICx97V_k%3D" alt="YUKIMOCHI" width="100"></td>
 | 
					<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/3?token-time=2145916800&token-hash=9JtETp0X8gI280Ne1E8bxn6j4Lw5o2k4mJkICx97V_k%3D" alt="YUKIMOCHI" width="100"></td>
 | 
				
			||||||
 | 
					<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/17195955/be45e5e14c3e48b2bee0456c84e19df4/4?token-time=2145916800&token-hash=SbdZeN5SmsuT9stD6v0jN1z0hftg0FmRiCTxysU0Ihw%3D" alt="Damillora" width="100"></td>
 | 
				
			||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/8241184/39e18850e87a449e9c9a71acb3310ebd/3?token-time=2145916800&token-hash=gMq30aylxu5v3G8pRhWR5jeRBbYWEoRKjGbNeiCQz5g%3D" alt="Acid Chicken" width="100"></td>
 | 
					<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/8241184/39e18850e87a449e9c9a71acb3310ebd/3?token-time=2145916800&token-hash=gMq30aylxu5v3G8pRhWR5jeRBbYWEoRKjGbNeiCQz5g%3D" alt="Acid Chicken" width="100"></td>
 | 
				
			||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4389829/9f709180ac714651a70f74a82f3ffdb9/2?token-time=2145916800&token-hash=zcwFxb2zopzWwksKVU1YpfAEjsl4yKT02aQ6yiAFRiQ%3D" alt="natalie" width="100"></td>
 | 
					<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4389829/9f709180ac714651a70f74a82f3ffdb9/2?token-time=2145916800&token-hash=zcwFxb2zopzWwksKVU1YpfAEjsl4yKT02aQ6yiAFRiQ%3D" alt="natalie" width="100"></td>
 | 
				
			||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13034746/c711c7f58e204ecfbc2fd646bc8a4eee/1?token-time=2145916800&token-hash=5T8XcaAf9Zyzfg3QubR06s_kJZkArVEM2dwObrBVAU4%3D" alt="Hiratake" width="100"></td>
 | 
					<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13034746/c711c7f58e204ecfbc2fd646bc8a4eee/1?token-time=2145916800&token-hash=5T8XcaAf9Zyzfg3QubR06s_kJZkArVEM2dwObrBVAU4%3D" alt="Hiratake" width="100"></td>
 | 
				
			||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/10789744/97175095d8f04c0f86225ff47cb98d40/1?token-time=2145916800&token-hash=ubVARikVOg3v7NW6LDhtG-ClE1LTU3I2TJ3js2-5xDs%3D" alt="Naoki Hirayama" width="100"></td>
 | 
					 | 
				
			||||||
</tr><tr>
 | 
					</tr><tr>
 | 
				
			||||||
<td><a href="https://www.patreon.com/mydarkstar">mydarkstar</a></td>
 | 
					<td><a href="https://www.patreon.com/mydarkstar">mydarkstar</a></td>
 | 
				
			||||||
<td><a href="https://www.patreon.com/user?u=12718187">Peter G.</a></td>
 | 
					<td><a href="https://www.patreon.com/user?u=12718187">Peter G.</a></td>
 | 
				
			||||||
<td><a href="https://www.patreon.com/user?u=16542964">Takumi Sugita</a></td>
 | 
					<td><a href="https://www.patreon.com/user?u=16542964">Takumi Sugita</a></td>
 | 
				
			||||||
<td><a href="https://www.patreon.com/user?u=13039004">nemu</a></td>
 | 
					<td><a href="https://www.patreon.com/user?u=13039004">nemu</a></td>
 | 
				
			||||||
<td><a href="https://www.patreon.com/yukimochi">YUKIMOCHI</a></td>
 | 
					<td><a href="https://www.patreon.com/yukimochi">YUKIMOCHI</a></td>
 | 
				
			||||||
 | 
					<td><a href="https://www.patreon.com/damillora">Damillora</a></td>
 | 
				
			||||||
<td><a href="https://www.patreon.com/acid_chicken">Acid Chicken</a></td>
 | 
					<td><a href="https://www.patreon.com/acid_chicken">Acid Chicken</a></td>
 | 
				
			||||||
<td><a href="https://www.patreon.com/user?u=4389829">natalie</a></td>
 | 
					<td><a href="https://www.patreon.com/user?u=4389829">natalie</a></td>
 | 
				
			||||||
<td><a href="https://www.patreon.com/hiratake">Hiratake</a></td>
 | 
					<td><a href="https://www.patreon.com/hiratake">Hiratake</a></td>
 | 
				
			||||||
<td><a href="https://www.patreon.com/spinlock">Naoki Hirayama</a></td>
 | 
					 | 
				
			||||||
</tr></table>
 | 
					</tr></table>
 | 
				
			||||||
<table><tr>
 | 
					<table><tr>
 | 
				
			||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1?token-time=2145916800&token-hash=Ksk_2l3gjPDbnzMUOCSW1E-hdPJsNs2tSR4_RAakRK8%3D" alt="dansup" width="100"></td>
 | 
					<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1?token-time=2145916800&token-hash=Ksk_2l3gjPDbnzMUOCSW1E-hdPJsNs2tSR4_RAakRK8%3D" alt="dansup" width="100"></td>
 | 
				
			||||||
@@ -138,7 +142,7 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
 | 
				
			|||||||
<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>
 | 
				
			||||||
</tr></table>
 | 
					</tr></table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
**Last updated:** Mon, 21 Jan 2019 06:45:06 UTC
 | 
					**Last updated:** Wed, 06 Feb 2019 18:18:05 UTC
 | 
				
			||||||
<!-- PATREON_END -->
 | 
					<!-- PATREON_END -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
:four_leaf_clover: Copyright
 | 
					:four_leaf_clover: Copyright
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,15 +29,15 @@ Please install and setup these softwares:
 | 
				
			|||||||
* [Redis](https://redis.io/)
 | 
					* [Redis](https://redis.io/)
 | 
				
			||||||
  * Redis is optional, but we strongly recommended to install it
 | 
					  * Redis is optional, but we strongly recommended to install it
 | 
				
			||||||
* [Elasticsearch](https://www.elastic.co/) - required to enable the search feature
 | 
					* [Elasticsearch](https://www.elastic.co/) - required to enable the search feature
 | 
				
			||||||
 | 
					* [FFmpeg](https://www.ffmpeg.org/)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
*3.* Setup MongoDB
 | 
					*3.* Setup MongoDB
 | 
				
			||||||
----------------------------------------------------------------
 | 
					----------------------------------------------------------------
 | 
				
			||||||
As root:
 | 
					As root:
 | 
				
			||||||
1. `mongo` Go to the mongo shell
 | 
					1. `mongo` Go to the mongo shell
 | 
				
			||||||
2. `use misskey` Use the misskey database
 | 
					2. `use misskey` Use the misskey database
 | 
				
			||||||
3. `db.users.save( {dummy:"dummy"} )` Write dummy data to initialize the db.
 | 
					3. `db.createUser( { user: "misskey", pwd: "<password>", roles: [ { role: "readWrite", db: "misskey" } ] } )` Create the misskey user.
 | 
				
			||||||
4. `db.createUser( { user: "misskey", pwd: "<password>", roles: [ { role: "readWrite", db: "misskey" } ] } )` Create the misskey user.
 | 
					4. `exit` You're done!
 | 
				
			||||||
5. `exit` You're done !
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
*4.* Install Misskey
 | 
					*4.* Install Misskey
 | 
				
			||||||
----------------------------------------------------------------
 | 
					----------------------------------------------------------------
 | 
				
			||||||
@@ -55,6 +55,11 @@ As root:
 | 
				
			|||||||
*6.* Build Misskey
 | 
					*6.* Build Misskey
 | 
				
			||||||
----------------------------------------------------------------
 | 
					----------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Before build, you need to set `NODE_ENV` to `production`. like this:
 | 
				
			||||||
 | 
					* Linux: `export NODE_ENV=production`
 | 
				
			||||||
 | 
					* Windows (PowerShell): `$env:NODE_ENV="production"`
 | 
				
			||||||
 | 
					* Windows (CMD): `set NODE_ENV=production`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Build misskey with the following:
 | 
					Build misskey with the following:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
`npm run build`
 | 
					`npm run build`
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,15 +29,15 @@ Installez les paquets suivants :
 | 
				
			|||||||
* [Redis](https://redis.io/)
 | 
					* [Redis](https://redis.io/)
 | 
				
			||||||
  * Redis est optionnel mais nous vous recommandons vivement de l'installer
 | 
					  * Redis est optionnel mais nous vous recommandons vivement de l'installer
 | 
				
			||||||
* [Elasticsearch](https://www.elastic.co/) - requis pour pouvoir activer la fonctionnalité de recherche
 | 
					* [Elasticsearch](https://www.elastic.co/) - requis pour pouvoir activer la fonctionnalité de recherche
 | 
				
			||||||
 | 
					* [FFmpeg](https://www.ffmpeg.org/)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
*3.* Paramètrage de MongoDB
 | 
					*3.* Paramètrage de MongoDB
 | 
				
			||||||
----------------------------------------------------------------
 | 
					----------------------------------------------------------------
 | 
				
			||||||
En root :
 | 
					En root :
 | 
				
			||||||
1. `mongo` Ouvrez le shell mongo
 | 
					1. `mongo` Ouvrez le shell mongo
 | 
				
			||||||
2. `use misskey` Utilisez la base de données misskey
 | 
					2. `use misskey` Utilisez la base de données misskey
 | 
				
			||||||
3. `db.users.save( {dummy:"dummy"} )` Écrivez une donnée factice pour initialiser la base de données.
 | 
					3. `db.createUser( { user: "misskey", pwd: "<password>", roles: [ { role: "readWrite", db: "misskey" } ] } )` Créez l'utilisateur misskey.
 | 
				
			||||||
4. `db.createUser( { user: "misskey", pwd: "<password>", roles: [ { role: "readWrite", db: "misskey" } ] } )` Créez l'utilisateur misskey.
 | 
					4. `exit` Vous avez terminé !
 | 
				
			||||||
5. `exit` Vous avez terminé !
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
*4.* Installation de Misskey
 | 
					*4.* Installation de Misskey
 | 
				
			||||||
----------------------------------------------------------------
 | 
					----------------------------------------------------------------
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -32,18 +32,19 @@ adduser --disabled-password --disabled-login misskey
 | 
				
			|||||||
	* 具体的には、Redisをインストールしないと、次の事が出来なくなります:
 | 
						* 具体的には、Redisをインストールしないと、次の事が出来なくなります:
 | 
				
			||||||
		* Misskeyプロセスを複数起動しての負荷分散
 | 
							* Misskeyプロセスを複数起動しての負荷分散
 | 
				
			||||||
		* レートリミット
 | 
							* レートリミット
 | 
				
			||||||
 | 
							* ジョブキュー
 | 
				
			||||||
		* Twitter連携
 | 
							* Twitter連携
 | 
				
			||||||
* [Elasticsearch](https://www.elastic.co/)
 | 
					* [Elasticsearch](https://www.elastic.co/)
 | 
				
			||||||
	* 検索機能を有効にするためにはインストールが必要です。
 | 
						* 検索機能を有効にするためにはインストールが必要です。
 | 
				
			||||||
 | 
					* [FFmpeg](https://www.ffmpeg.org/)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
*3.* MongoDBの設定
 | 
					*3.* MongoDBの設定
 | 
				
			||||||
----------------------------------------------------------------
 | 
					----------------------------------------------------------------
 | 
				
			||||||
ルートで:
 | 
					ルートで:
 | 
				
			||||||
1. `mongo` mongoシェルを起動
 | 
					1. `mongo` mongoシェルを起動
 | 
				
			||||||
2. `use misskey` misskeyデータベースを使用
 | 
					2. `use misskey` misskeyデータベースを使用
 | 
				
			||||||
3. `db.users.save( {dummy:"dummy"} )` ダミーデータを書き込みDBを初期化
 | 
					3. `db.createUser( { user: "misskey", pwd: "<password>", roles: [ { role: "readWrite", db: "misskey" } ] } )` misskeyユーザーを作成
 | 
				
			||||||
4. `db.createUser( { user: "misskey", pwd: "<password>", roles: [ { role: "readWrite", db: "misskey" } ] } )` misskeyユーザーを作成
 | 
					4. `exit` mongoシェルを終了
 | 
				
			||||||
5. `exit` mongoシェルを終了
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
*4.* Misskeyのインストール
 | 
					*4.* Misskeyのインストール
 | 
				
			||||||
----------------------------------------------------------------
 | 
					----------------------------------------------------------------
 | 
				
			||||||
@@ -61,6 +62,11 @@ adduser --disabled-password --disabled-login misskey
 | 
				
			|||||||
*6.* Misskeyのビルド
 | 
					*6.* Misskeyのビルド
 | 
				
			||||||
----------------------------------------------------------------
 | 
					----------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ビルドする前に、`NODE_ENV`を`production`にする必要があります。例:
 | 
				
			||||||
 | 
					* Linux: `export NODE_ENV=production`
 | 
				
			||||||
 | 
					* Windows (PowerShell): `$env:NODE_ENV="production"`
 | 
				
			||||||
 | 
					* Windows (CMD): `set NODE_ENV=production`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
次のコマンドでMisskeyをビルドしてください:
 | 
					次のコマンドでMisskeyをビルドしてください:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
`npm run build`
 | 
					`npm run build`
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										50
									
								
								gulpfile.ts
									
									
									
									
									
								
							
							
						
						
									
										50
									
								
								gulpfile.ts
									
									
									
									
									
								
							@@ -32,14 +32,6 @@ if (isDebug) {
 | 
				
			|||||||
	console.warn(chalk.yellow.bold('         built script will not be compressed.'));
 | 
						console.warn(chalk.yellow.bold('         built script will not be compressed.'));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
gulp.task('build', [
 | 
					 | 
				
			||||||
	'build:ts',
 | 
					 | 
				
			||||||
	'build:copy',
 | 
					 | 
				
			||||||
	'build:client',
 | 
					 | 
				
			||||||
	'locales',
 | 
					 | 
				
			||||||
	'doc'
 | 
					 | 
				
			||||||
]);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
gulp.task('build:ts', () => {
 | 
					gulp.task('build:ts', () => {
 | 
				
			||||||
	const tsProject = ts.createProject('./tsconfig.json');
 | 
						const tsProject = ts.createProject('./tsconfig.json');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -47,6 +39,7 @@ gulp.task('build:ts', () => {
 | 
				
			|||||||
		.src()
 | 
							.src()
 | 
				
			||||||
		.pipe(sourcemaps.init())
 | 
							.pipe(sourcemaps.init())
 | 
				
			||||||
		.pipe(tsProject())
 | 
							.pipe(tsProject())
 | 
				
			||||||
 | 
							.on('error', () => {})
 | 
				
			||||||
		.pipe(sourcemaps.write('.', { includeContent: false, sourceRoot: '../built' }))
 | 
							.pipe(sourcemaps.write('.', { includeContent: false, sourceRoot: '../built' }))
 | 
				
			||||||
		.pipe(gulp.dest('./built/'));
 | 
							.pipe(gulp.dest('./built/'));
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
@@ -55,7 +48,7 @@ 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', gulp.parallel('build:copy:views', () =>
 | 
				
			||||||
	gulp.src([
 | 
						gulp.src([
 | 
				
			||||||
		'./build/Release/crypto_key.node',
 | 
							'./build/Release/crypto_key.node',
 | 
				
			||||||
		'./src/const.json',
 | 
							'./src/const.json',
 | 
				
			||||||
@@ -63,9 +56,7 @@ gulp.task('build:copy', ['build:copy:views'], () =>
 | 
				
			|||||||
		'./src/**/assets/**/*',
 | 
							'./src/**/assets/**/*',
 | 
				
			||||||
		'!./src/client/app/**/assets/**/*'
 | 
							'!./src/client/app/**/assets/**/*'
 | 
				
			||||||
	]).pipe(gulp.dest('./built/'))
 | 
						]).pipe(gulp.dest('./built/'))
 | 
				
			||||||
);
 | 
					));
 | 
				
			||||||
 | 
					 | 
				
			||||||
gulp.task('test', ['mocha']);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
gulp.task('lint', () =>
 | 
					gulp.task('lint', () =>
 | 
				
			||||||
	gulp.src('./src/**/*.ts')
 | 
						gulp.src('./src/**/*.ts')
 | 
				
			||||||
@@ -92,22 +83,15 @@ gulp.task('mocha', () =>
 | 
				
			|||||||
		} as any))
 | 
							} as any))
 | 
				
			||||||
);
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					gulp.task('test', gulp.task('mocha'));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
gulp.task('clean', cb =>
 | 
					gulp.task('clean', cb =>
 | 
				
			||||||
	rimraf('./built', cb)
 | 
						rimraf('./built', cb)
 | 
				
			||||||
);
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
gulp.task('cleanall', ['clean'], cb =>
 | 
					gulp.task('cleanall', gulp.parallel('clean', cb =>
 | 
				
			||||||
	rimraf('./node_modules', cb)
 | 
						rimraf('./node_modules', cb)
 | 
				
			||||||
);
 | 
					));
 | 
				
			||||||
 | 
					 | 
				
			||||||
gulp.task('default', ['build']);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
gulp.task('build:client', [
 | 
					 | 
				
			||||||
	'build:ts',
 | 
					 | 
				
			||||||
	'build:client:script',
 | 
					 | 
				
			||||||
	'build:client:styles',
 | 
					 | 
				
			||||||
	'copy:client'
 | 
					 | 
				
			||||||
]);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
gulp.task('build:client:script', () => {
 | 
					gulp.task('build:client:script', () => {
 | 
				
			||||||
	const client = require('./built/client/meta.json');
 | 
						const client = require('./built/client/meta.json');
 | 
				
			||||||
@@ -129,9 +113,7 @@ gulp.task('build:client:styles', () =>
 | 
				
			|||||||
		.pipe(gulp.dest('./built/client/assets/'))
 | 
							.pipe(gulp.dest('./built/client/assets/'))
 | 
				
			||||||
);
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
gulp.task('copy:client', [
 | 
					gulp.task('copy:client', () =>
 | 
				
			||||||
	'build:client:script'
 | 
					 | 
				
			||||||
], () =>
 | 
					 | 
				
			||||||
		gulp.src([
 | 
							gulp.src([
 | 
				
			||||||
			'./assets/**/*',
 | 
								'./assets/**/*',
 | 
				
			||||||
			'./src/client/assets/**/*',
 | 
								'./src/client/assets/**/*',
 | 
				
			||||||
@@ -156,3 +138,19 @@ gulp.task('doc', () =>
 | 
				
			|||||||
		.pipe((cssnano as any)())
 | 
							.pipe((cssnano as any)())
 | 
				
			||||||
		.pipe(gulp.dest('./built/docs/assets/'))
 | 
							.pipe(gulp.dest('./built/docs/assets/'))
 | 
				
			||||||
);
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					gulp.task('build:client', gulp.parallel(
 | 
				
			||||||
 | 
						'build:client:script',
 | 
				
			||||||
 | 
						'build:client:styles',
 | 
				
			||||||
 | 
						'copy:client'
 | 
				
			||||||
 | 
					));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					gulp.task('build', gulp.parallel(
 | 
				
			||||||
 | 
						'build:ts',
 | 
				
			||||||
 | 
						'build:copy',
 | 
				
			||||||
 | 
						'build:client',
 | 
				
			||||||
 | 
						'locales',
 | 
				
			||||||
 | 
						'doc'
 | 
				
			||||||
 | 
					));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					gulp.task('default', gulp.task('build'));
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -113,6 +113,7 @@ common:
 | 
				
			|||||||
  use-avatar-reversi-stones: "リバーシの石にアバターを使う"
 | 
					  use-avatar-reversi-stones: "リバーシの石にアバターを使う"
 | 
				
			||||||
  verified-user: "公式アカウント"
 | 
					  verified-user: "公式アカウント"
 | 
				
			||||||
  disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
 | 
					  disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
 | 
				
			||||||
 | 
					  disable-showing-animated-images: "アニメーション画像を再生しない"
 | 
				
			||||||
  suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
 | 
					  suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
 | 
				
			||||||
  always-show-nsfw: "常に閲覧注意のメディアを表示する"
 | 
					  always-show-nsfw: "常に閲覧注意のメディアを表示する"
 | 
				
			||||||
  always-mark-nsfw: "常にメディアを閲覧注意として投稿"
 | 
					  always-mark-nsfw: "常にメディアを閲覧注意として投稿"
 | 
				
			||||||
@@ -129,7 +130,7 @@ common:
 | 
				
			|||||||
  show-password: "パスワードを表示する"
 | 
					  show-password: "パスワードを表示する"
 | 
				
			||||||
  do-not-use-in-production: "これは開発ビルドです。本番環境で使用しないでください。"
 | 
					  do-not-use-in-production: "これは開発ビルドです。本番環境で使用しないでください。"
 | 
				
			||||||
  user-suspended: "このユーザーは凍結されています。"
 | 
					  user-suspended: "このユーザーは凍結されています。"
 | 
				
			||||||
  is-remote-user: "このユーザー情報はコピーです。"
 | 
					  is-remote-user: "このユーザー情報は不正確な可能性があります。"
 | 
				
			||||||
  is-remote-post: "この投稿情報はコピーです。"
 | 
					  is-remote-post: "この投稿情報はコピーです。"
 | 
				
			||||||
  view-on-remote: "正確な情報を見る"
 | 
					  view-on-remote: "正確な情報を見る"
 | 
				
			||||||
  renoted-by: "{user}がRenote"
 | 
					  renoted-by: "{user}がRenote"
 | 
				
			||||||
@@ -344,6 +345,8 @@ common/views/components/note-menu.vue:
 | 
				
			|||||||
  copy-link: "リンクをコピー"
 | 
					  copy-link: "リンクをコピー"
 | 
				
			||||||
  favorite: "お気に入り"
 | 
					  favorite: "お気に入り"
 | 
				
			||||||
  unfavorite: "お気に入り解除"
 | 
					  unfavorite: "お気に入り解除"
 | 
				
			||||||
 | 
					  watch: "ウォッチ"
 | 
				
			||||||
 | 
					  unwatch: "ウォッチ解除"
 | 
				
			||||||
  pin: "ピン留め"
 | 
					  pin: "ピン留め"
 | 
				
			||||||
  unpin: "ピン留め解除"
 | 
					  unpin: "ピン留め解除"
 | 
				
			||||||
  delete: "削除"
 | 
					  delete: "削除"
 | 
				
			||||||
@@ -360,6 +363,10 @@ common/views/components/user-menu.vue:
 | 
				
			|||||||
  report-abuse: "スパムを報告"
 | 
					  report-abuse: "スパムを報告"
 | 
				
			||||||
  report-abuse-detail: "どのような迷惑行為を行っていますか?"
 | 
					  report-abuse-detail: "どのような迷惑行為を行っていますか?"
 | 
				
			||||||
  report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
 | 
					  report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
 | 
				
			||||||
 | 
					  silence: "サイレンス"
 | 
				
			||||||
 | 
					  unsilence: "サイレンス解除"
 | 
				
			||||||
 | 
					  suspend: "凍結"
 | 
				
			||||||
 | 
					  unsuspend: "凍結解除"
 | 
				
			||||||
common/views/components/poll.vue:
 | 
					common/views/components/poll.vue:
 | 
				
			||||||
  vote-to: "「{}」に投票する"
 | 
					  vote-to: "「{}」に投票する"
 | 
				
			||||||
  vote-count: "{}票"
 | 
					  vote-count: "{}票"
 | 
				
			||||||
@@ -482,6 +489,7 @@ common/views/components/profile-editor.vue:
 | 
				
			|||||||
  account: "アカウント"
 | 
					  account: "アカウント"
 | 
				
			||||||
  location: "場所"
 | 
					  location: "場所"
 | 
				
			||||||
  description: "自己紹介"
 | 
					  description: "自己紹介"
 | 
				
			||||||
 | 
					  you-can-include-hashtags: "ハッシュタグを含めることができます。"
 | 
				
			||||||
  language: "言語"
 | 
					  language: "言語"
 | 
				
			||||||
  birthday: "誕生日"
 | 
					  birthday: "誕生日"
 | 
				
			||||||
  avatar: "アイコン"
 | 
					  avatar: "アイコン"
 | 
				
			||||||
@@ -501,6 +509,13 @@ common/views/components/profile-editor.vue:
 | 
				
			|||||||
  email-address: "メールアドレス"
 | 
					  email-address: "メールアドレス"
 | 
				
			||||||
  email-verified: "メールアドレスが確認されました"
 | 
					  email-verified: "メールアドレスが確認されました"
 | 
				
			||||||
  email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
 | 
					  email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
 | 
				
			||||||
 | 
					  export: "エクスポート"
 | 
				
			||||||
 | 
					  export-targets:
 | 
				
			||||||
 | 
					    all-notes: "すべての投稿データ"
 | 
				
			||||||
 | 
					    following-list: "フォロー"
 | 
				
			||||||
 | 
					    mute-list: "ミュート"
 | 
				
			||||||
 | 
					    blocking-list: "ブロック"
 | 
				
			||||||
 | 
					  export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
 | 
				
			||||||
common/views/components/user-list-editor.vue:
 | 
					common/views/components/user-list-editor.vue:
 | 
				
			||||||
  users: "ユーザー"
 | 
					  users: "ユーザー"
 | 
				
			||||||
  rename: "リスト名を変更"
 | 
					  rename: "リスト名を変更"
 | 
				
			||||||
@@ -658,9 +673,6 @@ desktop/views/components/drive.vue:
 | 
				
			|||||||
    create-folder: "フォルダーを作成"
 | 
					    create-folder: "フォルダーを作成"
 | 
				
			||||||
    upload: "ファイルをアップロード"
 | 
					    upload: "ファイルをアップロード"
 | 
				
			||||||
    url-upload: "URLからアップロード"
 | 
					    url-upload: "URLからアップロード"
 | 
				
			||||||
desktop/views/components/media-image.vue:
 | 
					 | 
				
			||||||
  sensitive: "閲覧注意"
 | 
					 | 
				
			||||||
  click-to-show: "クリックして表示"
 | 
					 | 
				
			||||||
desktop/views/components/media-video.vue:
 | 
					desktop/views/components/media-video.vue:
 | 
				
			||||||
  sensitive: "閲覧注意"
 | 
					  sensitive: "閲覧注意"
 | 
				
			||||||
  click-to-show: "クリックして表示"
 | 
					  click-to-show: "クリックして表示"
 | 
				
			||||||
@@ -875,6 +887,9 @@ desktop/views/components/settings.2fa.vue:
 | 
				
			|||||||
  success: "設定が完了しました!"
 | 
					  success: "設定が完了しました!"
 | 
				
			||||||
  failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
 | 
					  failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
 | 
				
			||||||
  info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
 | 
					  info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
 | 
				
			||||||
 | 
					common/views/components/media-image.vue:
 | 
				
			||||||
 | 
					  sensitive: "閲覧注意"
 | 
				
			||||||
 | 
					  click-to-show: "クリックして表示"
 | 
				
			||||||
common/views/components/api-settings.vue:
 | 
					common/views/components/api-settings.vue:
 | 
				
			||||||
  intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
 | 
					  intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
 | 
				
			||||||
  caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
 | 
					  caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
 | 
				
			||||||
@@ -992,6 +1007,7 @@ admin/views/index.vue:
 | 
				
			|||||||
  announcements: "お知らせ"
 | 
					  announcements: "お知らせ"
 | 
				
			||||||
  hashtags: "ハッシュタグ"
 | 
					  hashtags: "ハッシュタグ"
 | 
				
			||||||
  abuse: "スパム報告"
 | 
					  abuse: "スパム報告"
 | 
				
			||||||
 | 
					  queue: "ジョブキュー"
 | 
				
			||||||
  back-to-misskey: "Misskeyに戻る"
 | 
					  back-to-misskey: "Misskeyに戻る"
 | 
				
			||||||
admin/views/dashboard.vue:
 | 
					admin/views/dashboard.vue:
 | 
				
			||||||
  dashboard: "ダッシュボード"
 | 
					  dashboard: "ダッシュボード"
 | 
				
			||||||
@@ -1001,6 +1017,9 @@ admin/views/dashboard.vue:
 | 
				
			|||||||
  instances: "インスタンス"
 | 
					  instances: "インスタンス"
 | 
				
			||||||
  this-instance: "このインスタンス"
 | 
					  this-instance: "このインスタンス"
 | 
				
			||||||
  federated: "連合"
 | 
					  federated: "連合"
 | 
				
			||||||
 | 
					admin/views/queue.vue:
 | 
				
			||||||
 | 
					  operation: "操作"
 | 
				
			||||||
 | 
					  remove-all-jobs: "すべてのジョブをクリア"
 | 
				
			||||||
admin/views/abuse.vue:
 | 
					admin/views/abuse.vue:
 | 
				
			||||||
  title: "スパム報告"
 | 
					  title: "スパム報告"
 | 
				
			||||||
  target: "対象"
 | 
					  target: "対象"
 | 
				
			||||||
@@ -1142,6 +1161,8 @@ admin/views/users.vue:
 | 
				
			|||||||
  unsuspend: "凍結の解除"
 | 
					  unsuspend: "凍結の解除"
 | 
				
			||||||
  unsuspend-confirm: "凍結を解除しますか?"
 | 
					  unsuspend-confirm: "凍結を解除しますか?"
 | 
				
			||||||
  unsuspended: "凍結を解除しました"
 | 
					  unsuspended: "凍結を解除しました"
 | 
				
			||||||
 | 
					  make-silence: "サイレンス"
 | 
				
			||||||
 | 
					  unmake-silence: "サイレンスの解除"
 | 
				
			||||||
  verify: "公式アカウントにする"
 | 
					  verify: "公式アカウントにする"
 | 
				
			||||||
  verify-confirm: "公式アカウントにしますか?"
 | 
					  verify-confirm: "公式アカウントにしますか?"
 | 
				
			||||||
  verified: "公式アカウントにしました"
 | 
					  verified: "公式アカウントにしました"
 | 
				
			||||||
@@ -1329,9 +1350,6 @@ mobile/views/components/drive.file-detail.vue:
 | 
				
			|||||||
  nsfw: "閲覧注意"
 | 
					  nsfw: "閲覧注意"
 | 
				
			||||||
  mark-as-sensitive: "閲覧注意に設定"
 | 
					  mark-as-sensitive: "閲覧注意に設定"
 | 
				
			||||||
  unmark-as-sensitive: "閲覧注意を解除"
 | 
					  unmark-as-sensitive: "閲覧注意を解除"
 | 
				
			||||||
mobile/views/components/media-image.vue:
 | 
					 | 
				
			||||||
  sensitive: "閲覧注意"
 | 
					 | 
				
			||||||
  click-to-show: "クリックして表示"
 | 
					 | 
				
			||||||
mobile/views/components/media-video.vue:
 | 
					mobile/views/components/media-video.vue:
 | 
				
			||||||
  sensitive: "閲覧注意"
 | 
					  sensitive: "閲覧注意"
 | 
				
			||||||
  click-to-show: "クリックして表示"
 | 
					  click-to-show: "クリックして表示"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -113,6 +113,7 @@ common:
 | 
				
			|||||||
  use-avatar-reversi-stones: "リバーシの石にアバターを使う"
 | 
					  use-avatar-reversi-stones: "リバーシの石にアバターを使う"
 | 
				
			||||||
  verified-user: "Verifizierter Benutzer"
 | 
					  verified-user: "Verifizierter Benutzer"
 | 
				
			||||||
  disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
 | 
					  disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
 | 
				
			||||||
 | 
					  disable-showing-animated-images: "アニメーション画像を再生しない"
 | 
				
			||||||
  suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
 | 
					  suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
 | 
				
			||||||
  always-show-nsfw: "常に閲覧注意のメディアを表示する"
 | 
					  always-show-nsfw: "常に閲覧注意のメディアを表示する"
 | 
				
			||||||
  always-mark-nsfw: "常にメディアを閲覧注意として投稿"
 | 
					  always-mark-nsfw: "常にメディアを閲覧注意として投稿"
 | 
				
			||||||
@@ -129,7 +130,7 @@ common:
 | 
				
			|||||||
  show-password: "パスワードを表示する"
 | 
					  show-password: "パスワードを表示する"
 | 
				
			||||||
  do-not-use-in-production: "Dies ist eine Entwicklungsversion. Nicht in einer Produktionsumgebung verwenden."
 | 
					  do-not-use-in-production: "Dies ist eine Entwicklungsversion. Nicht in einer Produktionsumgebung verwenden."
 | 
				
			||||||
  user-suspended: "このユーザーは凍結されています。"
 | 
					  user-suspended: "このユーザーは凍結されています。"
 | 
				
			||||||
  is-remote-user: "このユーザー情報はコピーです。"
 | 
					  is-remote-user: "このユーザー情報は不正確な可能性があります。"
 | 
				
			||||||
  is-remote-post: "この投稿情報はコピーです。"
 | 
					  is-remote-post: "この投稿情報はコピーです。"
 | 
				
			||||||
  view-on-remote: "正確な情報を見る"
 | 
					  view-on-remote: "正確な情報を見る"
 | 
				
			||||||
  renoted-by: "{user}がRenote"
 | 
					  renoted-by: "{user}がRenote"
 | 
				
			||||||
@@ -344,6 +345,8 @@ common/views/components/note-menu.vue:
 | 
				
			|||||||
  copy-link: "リンクをコピー"
 | 
					  copy-link: "リンクをコピー"
 | 
				
			||||||
  favorite: "Diese Notiz favorisieren"
 | 
					  favorite: "Diese Notiz favorisieren"
 | 
				
			||||||
  unfavorite: "Aus Favoriten entfernen"
 | 
					  unfavorite: "Aus Favoriten entfernen"
 | 
				
			||||||
 | 
					  watch: "ウォッチ"
 | 
				
			||||||
 | 
					  unwatch: "ウォッチ解除"
 | 
				
			||||||
  pin: "An die Profilseite pinnen"
 | 
					  pin: "An die Profilseite pinnen"
 | 
				
			||||||
  unpin: "ピン留め解除"
 | 
					  unpin: "ピン留め解除"
 | 
				
			||||||
  delete: "Löschen"
 | 
					  delete: "Löschen"
 | 
				
			||||||
@@ -360,6 +363,10 @@ common/views/components/user-menu.vue:
 | 
				
			|||||||
  report-abuse: "スパムを報告"
 | 
					  report-abuse: "スパムを報告"
 | 
				
			||||||
  report-abuse-detail: "どのような迷惑行為を行っていますか?"
 | 
					  report-abuse-detail: "どのような迷惑行為を行っていますか?"
 | 
				
			||||||
  report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
 | 
					  report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
 | 
				
			||||||
 | 
					  silence: "サイレンス"
 | 
				
			||||||
 | 
					  unsilence: "サイレンス解除"
 | 
				
			||||||
 | 
					  suspend: "凍結"
 | 
				
			||||||
 | 
					  unsuspend: "凍結解除"
 | 
				
			||||||
common/views/components/poll.vue:
 | 
					common/views/components/poll.vue:
 | 
				
			||||||
  vote-to: "Stimme für '{}'"
 | 
					  vote-to: "Stimme für '{}'"
 | 
				
			||||||
  vote-count: "{} Stimmen"
 | 
					  vote-count: "{} Stimmen"
 | 
				
			||||||
@@ -482,6 +489,7 @@ common/views/components/profile-editor.vue:
 | 
				
			|||||||
  account: "アカウント"
 | 
					  account: "アカウント"
 | 
				
			||||||
  location: "場所"
 | 
					  location: "場所"
 | 
				
			||||||
  description: "自己紹介"
 | 
					  description: "自己紹介"
 | 
				
			||||||
 | 
					  you-can-include-hashtags: "ハッシュタグを含めることができます。"
 | 
				
			||||||
  language: "言語"
 | 
					  language: "言語"
 | 
				
			||||||
  birthday: "誕生日"
 | 
					  birthday: "誕生日"
 | 
				
			||||||
  avatar: "アイコン"
 | 
					  avatar: "アイコン"
 | 
				
			||||||
@@ -501,6 +509,13 @@ common/views/components/profile-editor.vue:
 | 
				
			|||||||
  email-address: "メールアドレス"
 | 
					  email-address: "メールアドレス"
 | 
				
			||||||
  email-verified: "メールアドレスが確認されました"
 | 
					  email-verified: "メールアドレスが確認されました"
 | 
				
			||||||
  email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
 | 
					  email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
 | 
				
			||||||
 | 
					  export: "エクスポート"
 | 
				
			||||||
 | 
					  export-targets:
 | 
				
			||||||
 | 
					    all-notes: "すべての投稿データ"
 | 
				
			||||||
 | 
					    following-list: "フォロー"
 | 
				
			||||||
 | 
					    mute-list: "ミュート"
 | 
				
			||||||
 | 
					    blocking-list: "ブロック"
 | 
				
			||||||
 | 
					  export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
 | 
				
			||||||
common/views/components/user-list-editor.vue:
 | 
					common/views/components/user-list-editor.vue:
 | 
				
			||||||
  users: "ユーザー"
 | 
					  users: "ユーザー"
 | 
				
			||||||
  rename: "リスト名を変更"
 | 
					  rename: "リスト名を変更"
 | 
				
			||||||
@@ -658,9 +673,6 @@ desktop/views/components/drive.vue:
 | 
				
			|||||||
    create-folder: "Ein Verzeichnis erstellen"
 | 
					    create-folder: "Ein Verzeichnis erstellen"
 | 
				
			||||||
    upload: "Eine Datei hochladen"
 | 
					    upload: "Eine Datei hochladen"
 | 
				
			||||||
    url-upload: "Von einer URL hochladen"
 | 
					    url-upload: "Von einer URL hochladen"
 | 
				
			||||||
desktop/views/components/media-image.vue:
 | 
					 | 
				
			||||||
  sensitive: "閲覧注意"
 | 
					 | 
				
			||||||
  click-to-show: "クリックして表示"
 | 
					 | 
				
			||||||
desktop/views/components/media-video.vue:
 | 
					desktop/views/components/media-video.vue:
 | 
				
			||||||
  sensitive: "閲覧注意"
 | 
					  sensitive: "閲覧注意"
 | 
				
			||||||
  click-to-show: "クリックして表示"
 | 
					  click-to-show: "クリックして表示"
 | 
				
			||||||
@@ -875,6 +887,9 @@ desktop/views/components/settings.2fa.vue:
 | 
				
			|||||||
  success: "設定が完了しました!"
 | 
					  success: "設定が完了しました!"
 | 
				
			||||||
  failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
 | 
					  failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
 | 
				
			||||||
  info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
 | 
					  info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
 | 
				
			||||||
 | 
					common/views/components/media-image.vue:
 | 
				
			||||||
 | 
					  sensitive: "閲覧注意"
 | 
				
			||||||
 | 
					  click-to-show: "クリックして表示"
 | 
				
			||||||
common/views/components/api-settings.vue:
 | 
					common/views/components/api-settings.vue:
 | 
				
			||||||
  intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
 | 
					  intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
 | 
				
			||||||
  caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
 | 
					  caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
 | 
				
			||||||
@@ -992,6 +1007,7 @@ admin/views/index.vue:
 | 
				
			|||||||
  announcements: "お知らせ"
 | 
					  announcements: "お知らせ"
 | 
				
			||||||
  hashtags: "ハッシュタグ"
 | 
					  hashtags: "ハッシュタグ"
 | 
				
			||||||
  abuse: "スパム報告"
 | 
					  abuse: "スパム報告"
 | 
				
			||||||
 | 
					  queue: "ジョブキュー"
 | 
				
			||||||
  back-to-misskey: "Misskeyに戻る"
 | 
					  back-to-misskey: "Misskeyに戻る"
 | 
				
			||||||
admin/views/dashboard.vue:
 | 
					admin/views/dashboard.vue:
 | 
				
			||||||
  dashboard: "ダッシュボード"
 | 
					  dashboard: "ダッシュボード"
 | 
				
			||||||
@@ -1001,6 +1017,9 @@ admin/views/dashboard.vue:
 | 
				
			|||||||
  instances: "インスタンス"
 | 
					  instances: "インスタンス"
 | 
				
			||||||
  this-instance: "このインスタンス"
 | 
					  this-instance: "このインスタンス"
 | 
				
			||||||
  federated: "連合"
 | 
					  federated: "連合"
 | 
				
			||||||
 | 
					admin/views/queue.vue:
 | 
				
			||||||
 | 
					  operation: "操作"
 | 
				
			||||||
 | 
					  remove-all-jobs: "すべてのジョブをクリア"
 | 
				
			||||||
admin/views/abuse.vue:
 | 
					admin/views/abuse.vue:
 | 
				
			||||||
  title: "スパム報告"
 | 
					  title: "スパム報告"
 | 
				
			||||||
  target: "対象"
 | 
					  target: "対象"
 | 
				
			||||||
@@ -1142,6 +1161,8 @@ admin/views/users.vue:
 | 
				
			|||||||
  unsuspend: "凍結の解除"
 | 
					  unsuspend: "凍結の解除"
 | 
				
			||||||
  unsuspend-confirm: "凍結を解除しますか?"
 | 
					  unsuspend-confirm: "凍結を解除しますか?"
 | 
				
			||||||
  unsuspended: "凍結を解除しました"
 | 
					  unsuspended: "凍結を解除しました"
 | 
				
			||||||
 | 
					  make-silence: "サイレンス"
 | 
				
			||||||
 | 
					  unmake-silence: "サイレンスの解除"
 | 
				
			||||||
  verify: "公式アカウントにする"
 | 
					  verify: "公式アカウントにする"
 | 
				
			||||||
  verify-confirm: "公式アカウントにしますか?"
 | 
					  verify-confirm: "公式アカウントにしますか?"
 | 
				
			||||||
  verified: "公式アカウントにしました"
 | 
					  verified: "公式アカウントにしました"
 | 
				
			||||||
@@ -1329,9 +1350,6 @@ mobile/views/components/drive.file-detail.vue:
 | 
				
			|||||||
  nsfw: "閲覧注意"
 | 
					  nsfw: "閲覧注意"
 | 
				
			||||||
  mark-as-sensitive: "閲覧注意に設定"
 | 
					  mark-as-sensitive: "閲覧注意に設定"
 | 
				
			||||||
  unmark-as-sensitive: "閲覧注意を解除"
 | 
					  unmark-as-sensitive: "閲覧注意を解除"
 | 
				
			||||||
mobile/views/components/media-image.vue:
 | 
					 | 
				
			||||||
  sensitive: "閲覧注意"
 | 
					 | 
				
			||||||
  click-to-show: "クリックして表示"
 | 
					 | 
				
			||||||
mobile/views/components/media-video.vue:
 | 
					mobile/views/components/media-video.vue:
 | 
				
			||||||
  sensitive: "閲覧注意"
 | 
					  sensitive: "閲覧注意"
 | 
				
			||||||
  click-to-show: "クリックして表示"
 | 
					  click-to-show: "クリックして表示"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,10 +8,10 @@ common:
 | 
				
			|||||||
  about: "Thank you for finding Misskey. Misskey is a <b>decentralized microblogging platform</b> born on Earth. Since it exists within the Fediverse (a universe where various social media platforms are organized), it is mutually linked with other social media platforms. Why don't you take a short break from the hustle and bustle of the city, and dive into a new Internet?"
 | 
					  about: "Thank you for finding Misskey. Misskey is a <b>decentralized microblogging platform</b> born on Earth. Since it exists within the Fediverse (a universe where various social media platforms are organized), it is mutually linked with other social media platforms. Why don't you take a short break from the hustle and bustle of the city, and dive into a new Internet?"
 | 
				
			||||||
  intro:
 | 
					  intro:
 | 
				
			||||||
    title: "What is Misskey?"
 | 
					    title: "What is Misskey?"
 | 
				
			||||||
    about: "Misskey is an open-source <b>decentralized microblogging service</b>. Sophisticated fully customizable UI, varieties of reactions for posts, free file storage providing an integrated management system and other advanced functions are available. In addition, Misskey connects to a network system called the “Fediverse” enables us to communicate with users on other SNSs. For example, when you post something it will be sent not only to Misskey but also Mastodon and Pleroma. Just imagine that the planet is sending a radio transmission to other planet to communicate."
 | 
					    about: "Misskey is an open-source, <b>decentralized microblogging service</b>. Sophisticated, fully customizable UI, varieties of reactions for posts, free file storage providing an integrated management system and other advanced features are available. In addition, Misskey connects to a network system called the “Fediverse”, that enables us to communicate with users on other SNSs. For example, when you post something, it will be sent not only to Misskey, but also to Mastodon, Osada and Pleroma. Just imagine that the planet is sending a radio transmission to another planet to communicate."
 | 
				
			||||||
    features: "Features"
 | 
					    features: "Features"
 | 
				
			||||||
    rich-contents: "Post"
 | 
					    rich-contents: "Post"
 | 
				
			||||||
    rich-contents-desc: "Just post your idea, hot topics and anything you want to share. You may want to decorate your words, attach your favorite pictures, send files including movies and create a poll - those are the things you can do on Misskey!"
 | 
					    rich-contents-desc: "Just post your idea, hot topics, and anything you want to share. You may want to decorate your words, attach your favorite pictures, send files, including videos, or create a poll - those are some of the things you can do with Misskey!"
 | 
				
			||||||
    reaction: "Reactions"
 | 
					    reaction: "Reactions"
 | 
				
			||||||
    reaction-desc: "Easiest way to tell your emotions. Misskey allows you to add various type of reactions to other’s post. The emotional experience on Misskey will never be on other SNSs which only able to push “likes”."
 | 
					    reaction-desc: "Easiest way to tell your emotions. Misskey allows you to add various type of reactions to other’s post. The emotional experience on Misskey will never be on other SNSs which only able to push “likes”."
 | 
				
			||||||
    ui: "Interface"
 | 
					    ui: "Interface"
 | 
				
			||||||
@@ -113,6 +113,7 @@ common:
 | 
				
			|||||||
  use-avatar-reversi-stones: "Use avatar as a stone in reversi"
 | 
					  use-avatar-reversi-stones: "Use avatar as a stone 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"
 | 
				
			||||||
 | 
					  disable-showing-animated-images: "Do not play animated images"
 | 
				
			||||||
  suggest-recent-hashtags: "Suggest recently used hashtags within the post composition area"
 | 
					  suggest-recent-hashtags: "Suggest recently used hashtags within the post composition area"
 | 
				
			||||||
  always-show-nsfw: "Always show NSFW contents"
 | 
					  always-show-nsfw: "Always show NSFW contents"
 | 
				
			||||||
  always-mark-nsfw: "Always mark posts with media attachments as NSFW"
 | 
					  always-mark-nsfw: "Always mark posts with media attachments as NSFW"
 | 
				
			||||||
@@ -129,7 +130,7 @@ common:
 | 
				
			|||||||
  show-password: "Show Password"
 | 
					  show-password: "Show Password"
 | 
				
			||||||
  do-not-use-in-production: "This is a development build. Do not use in production."
 | 
					  do-not-use-in-production: "This is a development build. Do not use in production."
 | 
				
			||||||
  user-suspended: "This user has been suspended."
 | 
					  user-suspended: "This user has been suspended."
 | 
				
			||||||
  is-remote-user: "This user's information is mirrored."
 | 
					  is-remote-user: "The information about this user may not be entirely complete."
 | 
				
			||||||
  is-remote-post: "These post contents are mirrored."
 | 
					  is-remote-post: "These post contents are mirrored."
 | 
				
			||||||
  view-on-remote: "For completion, view it remotely."
 | 
					  view-on-remote: "For completion, view it remotely."
 | 
				
			||||||
  renoted-by: "Renoted by {user}"
 | 
					  renoted-by: "Renoted by {user}"
 | 
				
			||||||
@@ -344,6 +345,8 @@ common/views/components/note-menu.vue:
 | 
				
			|||||||
  copy-link: "Copy link"
 | 
					  copy-link: "Copy link"
 | 
				
			||||||
  favorite: "Favorite this note"
 | 
					  favorite: "Favorite this note"
 | 
				
			||||||
  unfavorite: "Unfavorite"
 | 
					  unfavorite: "Unfavorite"
 | 
				
			||||||
 | 
					  watch: "Watch"
 | 
				
			||||||
 | 
					  unwatch: "Unwatch"
 | 
				
			||||||
  pin: "Pin to your profile"
 | 
					  pin: "Pin to your profile"
 | 
				
			||||||
  unpin: "Unpin"
 | 
					  unpin: "Unpin"
 | 
				
			||||||
  delete: "Delete"
 | 
					  delete: "Delete"
 | 
				
			||||||
@@ -360,6 +363,10 @@ common/views/components/user-menu.vue:
 | 
				
			|||||||
  report-abuse: "Report abuse"
 | 
					  report-abuse: "Report abuse"
 | 
				
			||||||
  report-abuse-detail: "What kind of nuisance did you encounter?"
 | 
					  report-abuse-detail: "What kind of nuisance did you encounter?"
 | 
				
			||||||
  report-abuse-reported: "The issue has been reported to the administrator. Your cooperation is much appreciated."
 | 
					  report-abuse-reported: "The issue has been reported to the administrator. Your cooperation is much appreciated."
 | 
				
			||||||
 | 
					  silence: "Mute"
 | 
				
			||||||
 | 
					  unsilence: "Unmute"
 | 
				
			||||||
 | 
					  suspend: "Suspend"
 | 
				
			||||||
 | 
					  unsuspend: "Unsuspend"
 | 
				
			||||||
common/views/components/poll.vue:
 | 
					common/views/components/poll.vue:
 | 
				
			||||||
  vote-to: "Vote for '{}'"
 | 
					  vote-to: "Vote for '{}'"
 | 
				
			||||||
  vote-count: "{} votes"
 | 
					  vote-count: "{} votes"
 | 
				
			||||||
@@ -482,6 +489,7 @@ common/views/components/profile-editor.vue:
 | 
				
			|||||||
  account: "Account"
 | 
					  account: "Account"
 | 
				
			||||||
  location: "Location"
 | 
					  location: "Location"
 | 
				
			||||||
  description: "About me"
 | 
					  description: "About me"
 | 
				
			||||||
 | 
					  you-can-include-hashtags: "You can also include hashtags in your profile description."
 | 
				
			||||||
  language: "Language"
 | 
					  language: "Language"
 | 
				
			||||||
  birthday: "Birthday"
 | 
					  birthday: "Birthday"
 | 
				
			||||||
  avatar: "Icon"
 | 
					  avatar: "Icon"
 | 
				
			||||||
@@ -501,6 +509,13 @@ common/views/components/profile-editor.vue:
 | 
				
			|||||||
  email-address: "Email Address"
 | 
					  email-address: "Email Address"
 | 
				
			||||||
  email-verified: "Your email has been verified."
 | 
					  email-verified: "Your email has been verified."
 | 
				
			||||||
  email-not-verified: "Email address is not confirmed. Please check your inbox."
 | 
					  email-not-verified: "Email address is not confirmed. Please check your inbox."
 | 
				
			||||||
 | 
					  export: "Export"
 | 
				
			||||||
 | 
					  export-targets:
 | 
				
			||||||
 | 
					    all-notes: "All posted Notes"
 | 
				
			||||||
 | 
					    following-list: "List of followers"
 | 
				
			||||||
 | 
					    mute-list: "List of muted accounts"
 | 
				
			||||||
 | 
					    blocking-list: "List of blocked accounts"
 | 
				
			||||||
 | 
					  export-requested: "You have requested an export. This may take a while. After the export is complete, the resulting file will be added to the drive."
 | 
				
			||||||
common/views/components/user-list-editor.vue:
 | 
					common/views/components/user-list-editor.vue:
 | 
				
			||||||
  users: "User"
 | 
					  users: "User"
 | 
				
			||||||
  rename: "Rename list"
 | 
					  rename: "Rename list"
 | 
				
			||||||
@@ -658,9 +673,6 @@ desktop/views/components/drive.vue:
 | 
				
			|||||||
    create-folder: "Create a folder"
 | 
					    create-folder: "Create a folder"
 | 
				
			||||||
    upload: "Upload a file"
 | 
					    upload: "Upload a file"
 | 
				
			||||||
    url-upload: "Upload from a URL"
 | 
					    url-upload: "Upload from a URL"
 | 
				
			||||||
desktop/views/components/media-image.vue:
 | 
					 | 
				
			||||||
  sensitive: "NSFW"
 | 
					 | 
				
			||||||
  click-to-show: "Click to show"
 | 
					 | 
				
			||||||
desktop/views/components/media-video.vue:
 | 
					desktop/views/components/media-video.vue:
 | 
				
			||||||
  sensitive: "The content is NSFW"
 | 
					  sensitive: "The content is NSFW"
 | 
				
			||||||
  click-to-show: "Click to show"
 | 
					  click-to-show: "Click to show"
 | 
				
			||||||
@@ -875,6 +887,9 @@ desktop/views/components/settings.2fa.vue:
 | 
				
			|||||||
  success: "Settings saved!"
 | 
					  success: "Settings saved!"
 | 
				
			||||||
  failed: "Failed to setup. Please ensure that the token is correct."
 | 
					  failed: "Failed to setup. Please ensure that the token is correct."
 | 
				
			||||||
  info: "From the next time you sign in to Misskey, the token displayed on your device will be necessary too, as well as the password."
 | 
					  info: "From the next time you sign in to Misskey, the token displayed on your device will be necessary too, as well as the password."
 | 
				
			||||||
 | 
					common/views/components/media-image.vue:
 | 
				
			||||||
 | 
					  sensitive: "NSFW"
 | 
				
			||||||
 | 
					  click-to-show: "Click to show"
 | 
				
			||||||
common/views/components/api-settings.vue:
 | 
					common/views/components/api-settings.vue:
 | 
				
			||||||
  intro: "To access the API, set this token as the key 'i' of request parameters."
 | 
					  intro: "To access the API, set this token as the key 'i' of request parameters."
 | 
				
			||||||
  caution: "Do not enter this token to any apps nor tell this token to others otherwise your account may get compromised."
 | 
					  caution: "Do not enter this token to any apps nor tell this token to others otherwise your account may get compromised."
 | 
				
			||||||
@@ -992,6 +1007,7 @@ admin/views/index.vue:
 | 
				
			|||||||
  announcements: "Announcements"
 | 
					  announcements: "Announcements"
 | 
				
			||||||
  hashtags: "Hashtags"
 | 
					  hashtags: "Hashtags"
 | 
				
			||||||
  abuse: "Abuse"
 | 
					  abuse: "Abuse"
 | 
				
			||||||
 | 
					  queue: "Job Queue"
 | 
				
			||||||
  back-to-misskey: "Back to Misskey"
 | 
					  back-to-misskey: "Back to Misskey"
 | 
				
			||||||
admin/views/dashboard.vue:
 | 
					admin/views/dashboard.vue:
 | 
				
			||||||
  dashboard: "Dashboard"
 | 
					  dashboard: "Dashboard"
 | 
				
			||||||
@@ -1001,6 +1017,9 @@ admin/views/dashboard.vue:
 | 
				
			|||||||
  instances: "Instances"
 | 
					  instances: "Instances"
 | 
				
			||||||
  this-instance: "This instance"
 | 
					  this-instance: "This instance"
 | 
				
			||||||
  federated: "Federated"
 | 
					  federated: "Federated"
 | 
				
			||||||
 | 
					admin/views/queue.vue:
 | 
				
			||||||
 | 
					  operation: "Action(s)"
 | 
				
			||||||
 | 
					  remove-all-jobs: "すべてのジョブをクリア"
 | 
				
			||||||
admin/views/abuse.vue:
 | 
					admin/views/abuse.vue:
 | 
				
			||||||
  title: "Abuse"
 | 
					  title: "Abuse"
 | 
				
			||||||
  target: "Target"
 | 
					  target: "Target"
 | 
				
			||||||
@@ -1012,7 +1031,6 @@ admin/views/instance.vue:
 | 
				
			|||||||
  instance-name: "Instance name"
 | 
					  instance-name: "Instance name"
 | 
				
			||||||
  instance-description: "Instance description"
 | 
					  instance-description: "Instance description"
 | 
				
			||||||
  host: "Host"
 | 
					  host: "Host"
 | 
				
			||||||
  logo-url: "Logo image URL"
 | 
					 | 
				
			||||||
  banner-url: "Banner image URL"
 | 
					  banner-url: "Banner image URL"
 | 
				
			||||||
  error-image-url: "Error image URL"
 | 
					  error-image-url: "Error image URL"
 | 
				
			||||||
  languages: "Language of this instance"
 | 
					  languages: "Language of this instance"
 | 
				
			||||||
@@ -1143,6 +1161,8 @@ admin/views/users.vue:
 | 
				
			|||||||
  unsuspend: "Unsuspend"
 | 
					  unsuspend: "Unsuspend"
 | 
				
			||||||
  unsuspend-confirm: "Are you sure you want to unsuspend this account?"
 | 
					  unsuspend-confirm: "Are you sure you want to unsuspend this account?"
 | 
				
			||||||
  unsuspended: "The user has successfully unsuspended."
 | 
					  unsuspended: "The user has successfully unsuspended."
 | 
				
			||||||
 | 
					  make-silence: "Mute"
 | 
				
			||||||
 | 
					  unmake-silence: "Unmute"
 | 
				
			||||||
  verify: "Verify account"
 | 
					  verify: "Verify account"
 | 
				
			||||||
  verify-confirm: "Do you want this to be a verified account?"
 | 
					  verify-confirm: "Do you want this to be a verified account?"
 | 
				
			||||||
  verified: "The account is now being verified"
 | 
					  verified: "The account is now being verified"
 | 
				
			||||||
@@ -1330,9 +1350,6 @@ mobile/views/components/drive.file-detail.vue:
 | 
				
			|||||||
  nsfw: "NSFW"
 | 
					  nsfw: "NSFW"
 | 
				
			||||||
  mark-as-sensitive: "Mark as 'sensitive'"
 | 
					  mark-as-sensitive: "Mark as 'sensitive'"
 | 
				
			||||||
  unmark-as-sensitive: "Unmark as 'sensitive'"
 | 
					  unmark-as-sensitive: "Unmark as 'sensitive'"
 | 
				
			||||||
mobile/views/components/media-image.vue:
 | 
					 | 
				
			||||||
  sensitive: "NSFW"
 | 
					 | 
				
			||||||
  click-to-show: "Click to show"
 | 
					 | 
				
			||||||
mobile/views/components/media-video.vue:
 | 
					mobile/views/components/media-video.vue:
 | 
				
			||||||
  sensitive: "The content is NSFW"
 | 
					  sensitive: "The content is NSFW"
 | 
				
			||||||
  click-to-show: "Click to show"
 | 
					  click-to-show: "Click to show"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -113,6 +113,7 @@ common:
 | 
				
			|||||||
  use-avatar-reversi-stones: "リバーシの石にアバターを使う"
 | 
					  use-avatar-reversi-stones: "リバーシの石にアバターを使う"
 | 
				
			||||||
  verified-user: "Cuenta verificada"
 | 
					  verified-user: "Cuenta verificada"
 | 
				
			||||||
  disable-animated-mfm: "Desactivar texto animado en una publicación"
 | 
					  disable-animated-mfm: "Desactivar texto animado en una publicación"
 | 
				
			||||||
 | 
					  disable-showing-animated-images: "アニメーション画像を再生しない"
 | 
				
			||||||
  suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
 | 
					  suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
 | 
				
			||||||
  always-show-nsfw: "常に閲覧注意のメディアを表示する"
 | 
					  always-show-nsfw: "常に閲覧注意のメディアを表示する"
 | 
				
			||||||
  always-mark-nsfw: "常にメディアを閲覧注意として投稿"
 | 
					  always-mark-nsfw: "常にメディアを閲覧注意として投稿"
 | 
				
			||||||
@@ -129,7 +130,7 @@ common:
 | 
				
			|||||||
  show-password: "パスワードを表示する"
 | 
					  show-password: "パスワードを表示する"
 | 
				
			||||||
  do-not-use-in-production: "Esto está en desarrollo, no usarlo para producción."
 | 
					  do-not-use-in-production: "Esto está en desarrollo, no usarlo para producción."
 | 
				
			||||||
  user-suspended: "このユーザーは凍結されています。"
 | 
					  user-suspended: "このユーザーは凍結されています。"
 | 
				
			||||||
  is-remote-user: "このユーザー情報はコピーです。"
 | 
					  is-remote-user: "このユーザー情報は不正確な可能性があります。"
 | 
				
			||||||
  is-remote-post: "この投稿情報はコピーです。"
 | 
					  is-remote-post: "この投稿情報はコピーです。"
 | 
				
			||||||
  view-on-remote: "正確な情報を見る"
 | 
					  view-on-remote: "正確な情報を見る"
 | 
				
			||||||
  renoted-by: "{user}がRenote"
 | 
					  renoted-by: "{user}がRenote"
 | 
				
			||||||
@@ -344,6 +345,8 @@ common/views/components/note-menu.vue:
 | 
				
			|||||||
  copy-link: "Copiar enlace"
 | 
					  copy-link: "Copiar enlace"
 | 
				
			||||||
  favorite: "Me gusta esta nota"
 | 
					  favorite: "Me gusta esta nota"
 | 
				
			||||||
  unfavorite: "お気に入り解除"
 | 
					  unfavorite: "お気に入り解除"
 | 
				
			||||||
 | 
					  watch: "ウォッチ"
 | 
				
			||||||
 | 
					  unwatch: "ウォッチ解除"
 | 
				
			||||||
  pin: "Fijar en el perfil"
 | 
					  pin: "Fijar en el perfil"
 | 
				
			||||||
  unpin: "ピン留め解除"
 | 
					  unpin: "ピン留め解除"
 | 
				
			||||||
  delete: "Borrar"
 | 
					  delete: "Borrar"
 | 
				
			||||||
@@ -360,6 +363,10 @@ common/views/components/user-menu.vue:
 | 
				
			|||||||
  report-abuse: "スパムを報告"
 | 
					  report-abuse: "スパムを報告"
 | 
				
			||||||
  report-abuse-detail: "どのような迷惑行為を行っていますか?"
 | 
					  report-abuse-detail: "どのような迷惑行為を行っていますか?"
 | 
				
			||||||
  report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
 | 
					  report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
 | 
				
			||||||
 | 
					  silence: "サイレンス"
 | 
				
			||||||
 | 
					  unsilence: "サイレンス解除"
 | 
				
			||||||
 | 
					  suspend: "凍結"
 | 
				
			||||||
 | 
					  unsuspend: "凍結解除"
 | 
				
			||||||
common/views/components/poll.vue:
 | 
					common/views/components/poll.vue:
 | 
				
			||||||
  vote-to: "'{}' para votar"
 | 
					  vote-to: "'{}' para votar"
 | 
				
			||||||
  vote-count: "{} votos"
 | 
					  vote-count: "{} votos"
 | 
				
			||||||
@@ -482,6 +489,7 @@ common/views/components/profile-editor.vue:
 | 
				
			|||||||
  account: "Cuenta"
 | 
					  account: "Cuenta"
 | 
				
			||||||
  location: "場所"
 | 
					  location: "場所"
 | 
				
			||||||
  description: "自己紹介"
 | 
					  description: "自己紹介"
 | 
				
			||||||
 | 
					  you-can-include-hashtags: "ハッシュタグを含めることができます。"
 | 
				
			||||||
  language: "言語"
 | 
					  language: "言語"
 | 
				
			||||||
  birthday: "誕生日"
 | 
					  birthday: "誕生日"
 | 
				
			||||||
  avatar: "Avatar"
 | 
					  avatar: "Avatar"
 | 
				
			||||||
@@ -501,6 +509,13 @@ common/views/components/profile-editor.vue:
 | 
				
			|||||||
  email-address: "Correo electrónico"
 | 
					  email-address: "Correo electrónico"
 | 
				
			||||||
  email-verified: "メールアドレスが確認されました"
 | 
					  email-verified: "メールアドレスが確認されました"
 | 
				
			||||||
  email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
 | 
					  email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
 | 
				
			||||||
 | 
					  export: "エクスポート"
 | 
				
			||||||
 | 
					  export-targets:
 | 
				
			||||||
 | 
					    all-notes: "すべての投稿データ"
 | 
				
			||||||
 | 
					    following-list: "フォロー"
 | 
				
			||||||
 | 
					    mute-list: "ミュート"
 | 
				
			||||||
 | 
					    blocking-list: "ブロック"
 | 
				
			||||||
 | 
					  export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
 | 
				
			||||||
common/views/components/user-list-editor.vue:
 | 
					common/views/components/user-list-editor.vue:
 | 
				
			||||||
  users: "Usuarios"
 | 
					  users: "Usuarios"
 | 
				
			||||||
  rename: "リスト名を変更"
 | 
					  rename: "リスト名を変更"
 | 
				
			||||||
@@ -658,9 +673,6 @@ desktop/views/components/drive.vue:
 | 
				
			|||||||
    create-folder: "Crear una carpeta"
 | 
					    create-folder: "Crear una carpeta"
 | 
				
			||||||
    upload: "Subir fichero"
 | 
					    upload: "Subir fichero"
 | 
				
			||||||
    url-upload: "Subir desde una URL"
 | 
					    url-upload: "Subir desde una URL"
 | 
				
			||||||
desktop/views/components/media-image.vue:
 | 
					 | 
				
			||||||
  sensitive: "El contenido es NSFW (no seguro para ver en el trabajo, 'not safe for work')"
 | 
					 | 
				
			||||||
  click-to-show: "Click para mostrar"
 | 
					 | 
				
			||||||
desktop/views/components/media-video.vue:
 | 
					desktop/views/components/media-video.vue:
 | 
				
			||||||
  sensitive: "Este contenido no es apropiado para ver en el trabajo"
 | 
					  sensitive: "Este contenido no es apropiado para ver en el trabajo"
 | 
				
			||||||
  click-to-show: "Click para mostrar"
 | 
					  click-to-show: "Click para mostrar"
 | 
				
			||||||
@@ -875,6 +887,9 @@ desktop/views/components/settings.2fa.vue:
 | 
				
			|||||||
  success: "¡Configuraciones guardadas!"
 | 
					  success: "¡Configuraciones guardadas!"
 | 
				
			||||||
  failed: "Error al configurar. Por favor asegúrate de que el token es correcto."
 | 
					  failed: "Error al configurar. Por favor asegúrate de que el token es correcto."
 | 
				
			||||||
  info: "Desde ahora, ingresa el token que se muestra en tu dispositivo adicionalmente a tu contraseña cuando inicies sesión en Misskey"
 | 
					  info: "Desde ahora, ingresa el token que se muestra en tu dispositivo adicionalmente a tu contraseña cuando inicies sesión en Misskey"
 | 
				
			||||||
 | 
					common/views/components/media-image.vue:
 | 
				
			||||||
 | 
					  sensitive: "閲覧注意"
 | 
				
			||||||
 | 
					  click-to-show: "クリックして表示"
 | 
				
			||||||
common/views/components/api-settings.vue:
 | 
					common/views/components/api-settings.vue:
 | 
				
			||||||
  intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
 | 
					  intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
 | 
				
			||||||
  caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
 | 
					  caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
 | 
				
			||||||
@@ -992,6 +1007,7 @@ admin/views/index.vue:
 | 
				
			|||||||
  announcements: "お知らせ"
 | 
					  announcements: "お知らせ"
 | 
				
			||||||
  hashtags: "Hashtags"
 | 
					  hashtags: "Hashtags"
 | 
				
			||||||
  abuse: "スパム報告"
 | 
					  abuse: "スパム報告"
 | 
				
			||||||
 | 
					  queue: "ジョブキュー"
 | 
				
			||||||
  back-to-misskey: "Volver a Misskey"
 | 
					  back-to-misskey: "Volver a Misskey"
 | 
				
			||||||
admin/views/dashboard.vue:
 | 
					admin/views/dashboard.vue:
 | 
				
			||||||
  dashboard: "Panel de Control"
 | 
					  dashboard: "Panel de Control"
 | 
				
			||||||
@@ -1001,6 +1017,9 @@ admin/views/dashboard.vue:
 | 
				
			|||||||
  instances: "Instancias"
 | 
					  instances: "Instancias"
 | 
				
			||||||
  this-instance: "Esta instancia"
 | 
					  this-instance: "Esta instancia"
 | 
				
			||||||
  federated: "連合"
 | 
					  federated: "連合"
 | 
				
			||||||
 | 
					admin/views/queue.vue:
 | 
				
			||||||
 | 
					  operation: "操作"
 | 
				
			||||||
 | 
					  remove-all-jobs: "すべてのジョブをクリア"
 | 
				
			||||||
admin/views/abuse.vue:
 | 
					admin/views/abuse.vue:
 | 
				
			||||||
  title: "スパム報告"
 | 
					  title: "スパム報告"
 | 
				
			||||||
  target: "対象"
 | 
					  target: "対象"
 | 
				
			||||||
@@ -1142,6 +1161,8 @@ admin/views/users.vue:
 | 
				
			|||||||
  unsuspend: "凍結の解除"
 | 
					  unsuspend: "凍結の解除"
 | 
				
			||||||
  unsuspend-confirm: "凍結を解除しますか?"
 | 
					  unsuspend-confirm: "凍結を解除しますか?"
 | 
				
			||||||
  unsuspended: "凍結を解除しました"
 | 
					  unsuspended: "凍結を解除しました"
 | 
				
			||||||
 | 
					  make-silence: "サイレンス"
 | 
				
			||||||
 | 
					  unmake-silence: "サイレンスの解除"
 | 
				
			||||||
  verify: "公式アカウントにする"
 | 
					  verify: "公式アカウントにする"
 | 
				
			||||||
  verify-confirm: "公式アカウントにしますか?"
 | 
					  verify-confirm: "公式アカウントにしますか?"
 | 
				
			||||||
  verified: "公式アカウントにしました"
 | 
					  verified: "公式アカウントにしました"
 | 
				
			||||||
@@ -1329,9 +1350,6 @@ mobile/views/components/drive.file-detail.vue:
 | 
				
			|||||||
  nsfw: "閲覧注意"
 | 
					  nsfw: "閲覧注意"
 | 
				
			||||||
  mark-as-sensitive: "閲覧注意に設定"
 | 
					  mark-as-sensitive: "閲覧注意に設定"
 | 
				
			||||||
  unmark-as-sensitive: "閲覧注意を解除"
 | 
					  unmark-as-sensitive: "閲覧注意を解除"
 | 
				
			||||||
mobile/views/components/media-image.vue:
 | 
					 | 
				
			||||||
  sensitive: "閲覧注意"
 | 
					 | 
				
			||||||
  click-to-show: "クリックして表示"
 | 
					 | 
				
			||||||
mobile/views/components/media-video.vue:
 | 
					mobile/views/components/media-video.vue:
 | 
				
			||||||
  sensitive: "閲覧注意"
 | 
					  sensitive: "閲覧注意"
 | 
				
			||||||
  click-to-show: "クリックして表示"
 | 
					  click-to-show: "クリックして表示"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -113,6 +113,7 @@ common:
 | 
				
			|||||||
  use-avatar-reversi-stones: "Utiliser l’avatar comme pion dans Reversi"
 | 
					  use-avatar-reversi-stones: "Utiliser l’avatar comme pion dans Reversi"
 | 
				
			||||||
  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"
 | 
				
			||||||
 | 
					  disable-showing-animated-images: "アニメーション画像を再生しない"
 | 
				
			||||||
  suggest-recent-hashtags: "Suggérer les hashtags récemment utilisés dans le champs de saisie"
 | 
					  suggest-recent-hashtags: "Suggérer les hashtags récemment utilisés dans le champs de saisie"
 | 
				
			||||||
  always-show-nsfw: "Toujours afficher les contenus sensibles"
 | 
					  always-show-nsfw: "Toujours afficher les contenus sensibles"
 | 
				
			||||||
  always-mark-nsfw: "Toujours marquer les notes ayant des attachements comme sensibles"
 | 
					  always-mark-nsfw: "Toujours marquer les notes ayant des attachements comme sensibles"
 | 
				
			||||||
@@ -129,7 +130,7 @@ common:
 | 
				
			|||||||
  show-password: "Afficher le mot de passe"
 | 
					  show-password: "Afficher le mot de passe"
 | 
				
			||||||
  do-not-use-in-production: "Il s’agit d’une version de développement. Ne pas utiliser dans un environnement de production."
 | 
					  do-not-use-in-production: "Il s’agit d’une version de développement. Ne pas utiliser dans un environnement de production."
 | 
				
			||||||
  user-suspended: "Cet·te utilisateur·trice a été suspendu·e"
 | 
					  user-suspended: "Cet·te utilisateur·trice a été suspendu·e"
 | 
				
			||||||
  is-remote-user: "Ces informations appartiennent à un utilisateur distant."
 | 
					  is-remote-user: "このユーザー情報は不正確な可能性があります。"
 | 
				
			||||||
  is-remote-post: "Ceci est une publication distante."
 | 
					  is-remote-post: "Ceci est une publication distante."
 | 
				
			||||||
  view-on-remote: " Consulter le profil complet"
 | 
					  view-on-remote: " Consulter le profil complet"
 | 
				
			||||||
  renoted-by: "Renoté par {user}"
 | 
					  renoted-by: "Renoté par {user}"
 | 
				
			||||||
@@ -333,7 +334,7 @@ common/views/components/nav.vue:
 | 
				
			|||||||
  stats: "Statistiques"
 | 
					  stats: "Statistiques"
 | 
				
			||||||
  status: "Statut"
 | 
					  status: "Statut"
 | 
				
			||||||
  wiki: "Wiki"
 | 
					  wiki: "Wiki"
 | 
				
			||||||
  donors: "Donateurs"
 | 
					  donors: "Donateur·rice·s"
 | 
				
			||||||
  repository: "Dépôt"
 | 
					  repository: "Dépôt"
 | 
				
			||||||
  develop: "Développeurs"
 | 
					  develop: "Développeurs"
 | 
				
			||||||
  feedback: "Suggestions"
 | 
					  feedback: "Suggestions"
 | 
				
			||||||
@@ -344,6 +345,8 @@ common/views/components/note-menu.vue:
 | 
				
			|||||||
  copy-link: "Copier le lien"
 | 
					  copy-link: "Copier le lien"
 | 
				
			||||||
  favorite: "Mettre cette note en favoris"
 | 
					  favorite: "Mettre cette note en favoris"
 | 
				
			||||||
  unfavorite: "Retirer des favoris"
 | 
					  unfavorite: "Retirer des favoris"
 | 
				
			||||||
 | 
					  watch: "ウォッチ"
 | 
				
			||||||
 | 
					  unwatch: "ウォッチ解除"
 | 
				
			||||||
  pin: "Épingler sur votre profil"
 | 
					  pin: "Épingler sur votre profil"
 | 
				
			||||||
  unpin: "Désépingler"
 | 
					  unpin: "Désépingler"
 | 
				
			||||||
  delete: "Supprimer"
 | 
					  delete: "Supprimer"
 | 
				
			||||||
@@ -360,10 +363,14 @@ common/views/components/user-menu.vue:
 | 
				
			|||||||
  report-abuse: "Signaler un abus"
 | 
					  report-abuse: "Signaler un abus"
 | 
				
			||||||
  report-abuse-detail: "Détail du signalement"
 | 
					  report-abuse-detail: "Détail du signalement"
 | 
				
			||||||
  report-abuse-reported: "Transmit à l’administrateur. Merci de votre collaboration."
 | 
					  report-abuse-reported: "Transmit à l’administrateur. Merci de votre collaboration."
 | 
				
			||||||
 | 
					  silence: "サイレンス"
 | 
				
			||||||
 | 
					  unsilence: "サイレンス解除"
 | 
				
			||||||
 | 
					  suspend: "Suspendre"
 | 
				
			||||||
 | 
					  unsuspend: "凍結解除"
 | 
				
			||||||
common/views/components/poll.vue:
 | 
					common/views/components/poll.vue:
 | 
				
			||||||
  vote-to: "Voter pour '{}'"
 | 
					  vote-to: "Voter pour '{}'"
 | 
				
			||||||
  vote-count: "{} votes"
 | 
					  vote-count: "{} votes"
 | 
				
			||||||
  total-users: "{} utilisateurs ont voté"
 | 
					  total-users: "{} utilisateur·rice·s ont voté"
 | 
				
			||||||
  vote: "Vote"
 | 
					  vote: "Vote"
 | 
				
			||||||
  show-result: "Montrer les résultats"
 | 
					  show-result: "Montrer les résultats"
 | 
				
			||||||
  voted: "Voté"
 | 
					  voted: "Voté"
 | 
				
			||||||
@@ -386,7 +393,7 @@ common/views/components/emoji-picker.vue:
 | 
				
			|||||||
  symbols: "Symboles"
 | 
					  symbols: "Symboles"
 | 
				
			||||||
  flags: "Drapeaux"
 | 
					  flags: "Drapeaux"
 | 
				
			||||||
common/views/components/signin.vue:
 | 
					common/views/components/signin.vue:
 | 
				
			||||||
  username: "Nom d'utilisateur"
 | 
					  username: "Nom d'utilisateur·rice"
 | 
				
			||||||
  password: "Mot de passe"
 | 
					  password: "Mot de passe"
 | 
				
			||||||
  token: "Jeton"
 | 
					  token: "Jeton"
 | 
				
			||||||
  signing-in: "Connexion…"
 | 
					  signing-in: "Connexion…"
 | 
				
			||||||
@@ -399,7 +406,7 @@ common/views/components/signin.vue:
 | 
				
			|||||||
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 <a href=\"{}\">administrateur</a>."
 | 
					  invitation-info: "Si vous n’avez pas de code d’invitation, contactez un <a href=\"{}\">administrateur</a>."
 | 
				
			||||||
  username: "Nom d'utilisateur"
 | 
					  username: "Nom d'utilisateur·rice"
 | 
				
			||||||
  checking: "Vérification…"
 | 
					  checking: "Vérification…"
 | 
				
			||||||
  available: "Disponible"
 | 
					  available: "Disponible"
 | 
				
			||||||
  unavailable: "Non disponible"
 | 
					  unavailable: "Non disponible"
 | 
				
			||||||
@@ -432,7 +439,7 @@ common/views/components/notification-settings.vue:
 | 
				
			|||||||
  mark-as-read-all-unread-notes: "Marquer toutes les notes comme lues"
 | 
					  mark-as-read-all-unread-notes: "Marquer toutes les notes comme lues"
 | 
				
			||||||
  mark-as-read-all-talk-messages: "Marquer toutes les conversations comme lues"
 | 
					  mark-as-read-all-talk-messages: "Marquer toutes les conversations comme lues"
 | 
				
			||||||
  auto-watch: "投稿の自動ウォッチ"
 | 
					  auto-watch: "投稿の自動ウォッチ"
 | 
				
			||||||
  auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。"
 | 
					  auto-watch-desc: "Recevoir automatiquement des notifications à propos des publications auxquelles vous avez réagi ou répondu"
 | 
				
			||||||
common/views/components/integration-settings.vue:
 | 
					common/views/components/integration-settings.vue:
 | 
				
			||||||
  title: "Intégrations"
 | 
					  title: "Intégrations"
 | 
				
			||||||
  connect: "Connecter"
 | 
					  connect: "Connecter"
 | 
				
			||||||
@@ -458,8 +465,8 @@ common/views/components/visibility-chooser.vue:
 | 
				
			|||||||
  public: "Public"
 | 
					  public: "Public"
 | 
				
			||||||
  home: "Accueil"
 | 
					  home: "Accueil"
 | 
				
			||||||
  home-desc: "Publier sur le fil d’Accueil uniquement"
 | 
					  home-desc: "Publier sur le fil d’Accueil uniquement"
 | 
				
			||||||
  followers: "Abonnés"
 | 
					  followers: "Abonné·e·s"
 | 
				
			||||||
  followers-desc: "Publier à vos abonnés uniquement"
 | 
					  followers-desc: "Publier à vos abonné·e·s uniquement"
 | 
				
			||||||
  specified: "Direct"
 | 
					  specified: "Direct"
 | 
				
			||||||
  specified-desc: "Publier uniquement aux utilisateurs mentionnés"
 | 
					  specified-desc: "Publier uniquement aux utilisateurs mentionnés"
 | 
				
			||||||
  local-public: "Local (Public)"
 | 
					  local-public: "Local (Public)"
 | 
				
			||||||
@@ -482,6 +489,7 @@ common/views/components/profile-editor.vue:
 | 
				
			|||||||
  account: "Compte"
 | 
					  account: "Compte"
 | 
				
			||||||
  location: "Lieu"
 | 
					  location: "Lieu"
 | 
				
			||||||
  description: "À propos de moi"
 | 
					  description: "À propos de moi"
 | 
				
			||||||
 | 
					  you-can-include-hashtags: "Vous pouvez également inclure un hashtag sur votre description de profile."
 | 
				
			||||||
  language: "Langue"
 | 
					  language: "Langue"
 | 
				
			||||||
  birthday: "Date de naissance"
 | 
					  birthday: "Date de naissance"
 | 
				
			||||||
  avatar: "Avatar"
 | 
					  avatar: "Avatar"
 | 
				
			||||||
@@ -501,8 +509,15 @@ common/views/components/profile-editor.vue:
 | 
				
			|||||||
  email-address: "Adresse de courrier électronique"
 | 
					  email-address: "Adresse de courrier électronique"
 | 
				
			||||||
  email-verified: "L’adresse du courrier électronique a été vérifiée."
 | 
					  email-verified: "L’adresse du courrier électronique a été vérifiée."
 | 
				
			||||||
  email-not-verified: "Adresse de courriel n’est pas confirmée. Veuillez vérifier votre boite de réception."
 | 
					  email-not-verified: "Adresse de courriel n’est pas confirmée. Veuillez vérifier votre boite de réception."
 | 
				
			||||||
 | 
					  export: "エクスポート"
 | 
				
			||||||
 | 
					  export-targets:
 | 
				
			||||||
 | 
					    all-notes: "すべての投稿データ"
 | 
				
			||||||
 | 
					    following-list: "フォロー"
 | 
				
			||||||
 | 
					    mute-list: "ミュート"
 | 
				
			||||||
 | 
					    blocking-list: "ブロック"
 | 
				
			||||||
 | 
					  export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
 | 
				
			||||||
common/views/components/user-list-editor.vue:
 | 
					common/views/components/user-list-editor.vue:
 | 
				
			||||||
  users: "Utilisateur"
 | 
					  users: "Utilisateur·rice"
 | 
				
			||||||
  rename: "Renommer la liste"
 | 
					  rename: "Renommer la liste"
 | 
				
			||||||
  delete: "Supprimer la liste"
 | 
					  delete: "Supprimer la liste"
 | 
				
			||||||
  remove-user: "Retirer de cette liste"
 | 
					  remove-user: "Retirer de cette liste"
 | 
				
			||||||
@@ -658,23 +673,20 @@ desktop/views/components/drive.vue:
 | 
				
			|||||||
    create-folder: "Créer un dossier"
 | 
					    create-folder: "Créer un dossier"
 | 
				
			||||||
    upload: "Téléverser un fichier"
 | 
					    upload: "Téléverser un fichier"
 | 
				
			||||||
    url-upload: "Téléverser à partir d’une URL"
 | 
					    url-upload: "Téléverser à partir d’une URL"
 | 
				
			||||||
desktop/views/components/media-image.vue:
 | 
					 | 
				
			||||||
  sensitive: "Le contenu est NSFW"
 | 
					 | 
				
			||||||
  click-to-show: "Cliquer pour afficher"
 | 
					 | 
				
			||||||
desktop/views/components/media-video.vue:
 | 
					desktop/views/components/media-video.vue:
 | 
				
			||||||
  sensitive: "Le contenu est NSFW"
 | 
					  sensitive: "Le contenu est NSFW"
 | 
				
			||||||
  click-to-show: "Cliquer pour afficher"
 | 
					  click-to-show: "Cliquer pour afficher"
 | 
				
			||||||
desktop/views/components/followers-window.vue:
 | 
					desktop/views/components/followers-window.vue:
 | 
				
			||||||
  followers: "{} abonnés"
 | 
					  followers: "{} abonné·e·s"
 | 
				
			||||||
desktop/views/components/followers.vue:
 | 
					desktop/views/components/followers.vue:
 | 
				
			||||||
  empty: "Il semble que vous n'avez pas encore d'abonnés."
 | 
					  empty: "Il semble que vous n’avez pas encore d’abonné·e·s."
 | 
				
			||||||
desktop/views/components/following-window.vue:
 | 
					desktop/views/components/following-window.vue:
 | 
				
			||||||
  following: "Suit {}"
 | 
					  following: "Suit {}"
 | 
				
			||||||
desktop/views/components/following.vue:
 | 
					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: "Utilisateur·rice·s recommandé·e·s :"
 | 
				
			||||||
  empty: "Impossible de trouver des utilisateurs à recommander."
 | 
					  empty: "Impossible de trouver des utilisateur·trice·s à recommander."
 | 
				
			||||||
  fetching: "Chargement"
 | 
					  fetching: "Chargement"
 | 
				
			||||||
  refresh: "Plus"
 | 
					  refresh: "Plus"
 | 
				
			||||||
  close: "Fermer"
 | 
					  close: "Fermer"
 | 
				
			||||||
@@ -875,6 +887,9 @@ desktop/views/components/settings.2fa.vue:
 | 
				
			|||||||
  success: "Sauvegarde des paramètres avec succès !"
 | 
					  success: "Sauvegarde des paramètres avec succès !"
 | 
				
			||||||
  failed: "L’opération a échoué. Veuillez vous assurer que le jeton a été saisi correctement."
 | 
					  failed: "L’opération a échoué. Veuillez vous assurer que le jeton a été saisi correctement."
 | 
				
			||||||
  info: "À partir de maintenant, à chaque fois que vous vous connectez entrez votre mot de passe ainsi que le jeton généré sur votre appareil."
 | 
					  info: "À partir de maintenant, à chaque fois que vous vous connectez entrez votre mot de passe ainsi que le jeton généré sur votre appareil."
 | 
				
			||||||
 | 
					common/views/components/media-image.vue:
 | 
				
			||||||
 | 
					  sensitive: "Contenu sensible"
 | 
				
			||||||
 | 
					  click-to-show: "Cliquer pour afficher"
 | 
				
			||||||
common/views/components/api-settings.vue:
 | 
					common/views/components/api-settings.vue:
 | 
				
			||||||
  intro: "Pour accéder à l'API, définissez ce jeton comme la clé de « i » dans les paramètres de requête."
 | 
					  intro: "Pour accéder à l'API, définissez ce jeton comme la clé de « i » dans les paramètres de requête."
 | 
				
			||||||
  caution: "Merci de ne pas introduire ce jeton dans aucune application ou le divulguer à quiconque. Ceci risque de compromettre votre compte."
 | 
					  caution: "Merci de ne pas introduire ce jeton dans aucune application ou le divulguer à quiconque. Ceci risque de compromettre votre compte."
 | 
				
			||||||
@@ -972,7 +987,7 @@ desktop/views/components/user-lists-window.vue:
 | 
				
			|||||||
desktop/views/components/user-preview.vue:
 | 
					desktop/views/components/user-preview.vue:
 | 
				
			||||||
  notes: "Publications"
 | 
					  notes: "Publications"
 | 
				
			||||||
  following: "Abonné à"
 | 
					  following: "Abonné à"
 | 
				
			||||||
  followers: "Abonnés"
 | 
					  followers: "Abonné·e·s"
 | 
				
			||||||
desktop/views/components/users-list.vue:
 | 
					desktop/views/components/users-list.vue:
 | 
				
			||||||
  all: "Tout"
 | 
					  all: "Tout"
 | 
				
			||||||
  iknow: "Vous connaissez"
 | 
					  iknow: "Vous connaissez"
 | 
				
			||||||
@@ -992,6 +1007,7 @@ admin/views/index.vue:
 | 
				
			|||||||
  announcements: "Annonces"
 | 
					  announcements: "Annonces"
 | 
				
			||||||
  hashtags: "Hashtags"
 | 
					  hashtags: "Hashtags"
 | 
				
			||||||
  abuse: "Abus"
 | 
					  abuse: "Abus"
 | 
				
			||||||
 | 
					  queue: "ジョブキュー"
 | 
				
			||||||
  back-to-misskey: "Retour vers Misskey"
 | 
					  back-to-misskey: "Retour vers Misskey"
 | 
				
			||||||
admin/views/dashboard.vue:
 | 
					admin/views/dashboard.vue:
 | 
				
			||||||
  dashboard: "Tableau de bord"
 | 
					  dashboard: "Tableau de bord"
 | 
				
			||||||
@@ -1001,6 +1017,9 @@ admin/views/dashboard.vue:
 | 
				
			|||||||
  instances: "Instances"
 | 
					  instances: "Instances"
 | 
				
			||||||
  this-instance: "Cette instance"
 | 
					  this-instance: "Cette instance"
 | 
				
			||||||
  federated: "Fédérées"
 | 
					  federated: "Fédérées"
 | 
				
			||||||
 | 
					admin/views/queue.vue:
 | 
				
			||||||
 | 
					  operation: "操作"
 | 
				
			||||||
 | 
					  remove-all-jobs: "すべてのジョブをクリア"
 | 
				
			||||||
admin/views/abuse.vue:
 | 
					admin/views/abuse.vue:
 | 
				
			||||||
  title: "Abus"
 | 
					  title: "Abus"
 | 
				
			||||||
  target: "Cible"
 | 
					  target: "Cible"
 | 
				
			||||||
@@ -1134,7 +1153,7 @@ admin/views/users.vue:
 | 
				
			|||||||
  user-not-found: "Utilisateur non trouvé"
 | 
					  user-not-found: "Utilisateur non trouvé"
 | 
				
			||||||
  lookup: "Recherche"
 | 
					  lookup: "Recherche"
 | 
				
			||||||
  reset-password: "Réinitialiser mot de passe"
 | 
					  reset-password: "Réinitialiser mot de passe"
 | 
				
			||||||
  reset-password-confirm: "パスワードをリセットしますか?"
 | 
					  reset-password-confirm: "Souhaitez-vous réinitialiser votre mot de passe ?"
 | 
				
			||||||
  password-updated: "Le mot de passe est « {password} »"
 | 
					  password-updated: "Le mot de passe est « {password} »"
 | 
				
			||||||
  suspend: "Suspendre"
 | 
					  suspend: "Suspendre"
 | 
				
			||||||
  suspend-confirm: "Désirez-vous suspendre ce compte ?"
 | 
					  suspend-confirm: "Désirez-vous suspendre ce compte ?"
 | 
				
			||||||
@@ -1142,6 +1161,8 @@ admin/views/users.vue:
 | 
				
			|||||||
  unsuspend: "Suspension levée"
 | 
					  unsuspend: "Suspension levée"
 | 
				
			||||||
  unsuspend-confirm: "Souhaiteriez-vous ne plus suspendre ce compte ?"
 | 
					  unsuspend-confirm: "Souhaiteriez-vous ne plus suspendre ce compte ?"
 | 
				
			||||||
  unsuspended: "La suspension de l’utilisateur a été levée avec succès"
 | 
					  unsuspended: "La suspension de l’utilisateur a été levée avec succès"
 | 
				
			||||||
 | 
					  make-silence: "サイレンス"
 | 
				
			||||||
 | 
					  unmake-silence: "サイレンスの解除"
 | 
				
			||||||
  verify: "Vérification du compte"
 | 
					  verify: "Vérification du compte"
 | 
				
			||||||
  verify-confirm: "Souhaiteriez-vous rendre votre compte comme étant un compte vérifié ?"
 | 
					  verify-confirm: "Souhaiteriez-vous rendre votre compte comme étant un compte vérifié ?"
 | 
				
			||||||
  verified: "Le compte a été vérifié"
 | 
					  verified: "Le compte a été vérifié"
 | 
				
			||||||
@@ -1244,11 +1265,11 @@ desktop/views/pages/share.vue:
 | 
				
			|||||||
desktop/views/pages/tag.vue:
 | 
					desktop/views/pages/tag.vue:
 | 
				
			||||||
  no-posts-found: "Aucune publication contenant « {q} » n’a été trouvée."
 | 
					  no-posts-found: "Aucune publication contenant « {q} » n’a été trouvée."
 | 
				
			||||||
desktop/views/pages/user-list.users.vue:
 | 
					desktop/views/pages/user-list.users.vue:
 | 
				
			||||||
  users: "Utilisateurs"
 | 
					  users: "Utilisateur·rice·s"
 | 
				
			||||||
  add-user: "Ajouter un utilisateur"
 | 
					  add-user: "Ajouter un utilisateur"
 | 
				
			||||||
  username: "Nom d'utilisateur"
 | 
					  username: "Nom d'utilisateur"
 | 
				
			||||||
desktop/views/pages/user/user.followers-you-know.vue:
 | 
					desktop/views/pages/user/user.followers-you-know.vue:
 | 
				
			||||||
  title: "Abonnés que vous connaissez"
 | 
					  title: "Abonné·e·s que vous connaissez"
 | 
				
			||||||
  loading: "Chargement en cours"
 | 
					  loading: "Chargement en cours"
 | 
				
			||||||
  no-users: "Aucun abonné connu"
 | 
					  no-users: "Aucun abonné connu"
 | 
				
			||||||
desktop/views/pages/user/user.friends.vue:
 | 
					desktop/views/pages/user/user.friends.vue:
 | 
				
			||||||
@@ -1265,7 +1286,7 @@ desktop/views/pages/user/user.profile.vue:
 | 
				
			|||||||
desktop/views/pages/user/user.header.vue:
 | 
					desktop/views/pages/user/user.header.vue:
 | 
				
			||||||
  posts: "Notes"
 | 
					  posts: "Notes"
 | 
				
			||||||
  following: "Suit"
 | 
					  following: "Suit"
 | 
				
			||||||
  followers: "Abonnés"
 | 
					  followers: "Abonné·e·s"
 | 
				
			||||||
  is-bot: "Ce compte est un Bot"
 | 
					  is-bot: "Ce compte est un Bot"
 | 
				
			||||||
  years-old: "{age} ans"
 | 
					  years-old: "{age} ans"
 | 
				
			||||||
  year: "/"
 | 
					  year: "/"
 | 
				
			||||||
@@ -1297,7 +1318,7 @@ desktop/views/widgets/trends.vue:
 | 
				
			|||||||
  refresh: "Afficher d'autres"
 | 
					  refresh: "Afficher d'autres"
 | 
				
			||||||
  nothing: "Rien"
 | 
					  nothing: "Rien"
 | 
				
			||||||
desktop/views/widgets/users.vue:
 | 
					desktop/views/widgets/users.vue:
 | 
				
			||||||
  title: "Utilisateurs"
 | 
					  title: "Utilisateurs·rices"
 | 
				
			||||||
  refresh: "Afficher d'autres"
 | 
					  refresh: "Afficher d'autres"
 | 
				
			||||||
  no-one: "Personne"
 | 
					  no-one: "Personne"
 | 
				
			||||||
mobile/views/components/drive.vue:
 | 
					mobile/views/components/drive.vue:
 | 
				
			||||||
@@ -1329,9 +1350,6 @@ mobile/views/components/drive.file-detail.vue:
 | 
				
			|||||||
  nsfw: "CW"
 | 
					  nsfw: "CW"
 | 
				
			||||||
  mark-as-sensitive: "Marquer comme sensible"
 | 
					  mark-as-sensitive: "Marquer comme sensible"
 | 
				
			||||||
  unmark-as-sensitive: "Ne pas marquer comme sensible"
 | 
					  unmark-as-sensitive: "Ne pas marquer comme sensible"
 | 
				
			||||||
mobile/views/components/media-image.vue:
 | 
					 | 
				
			||||||
  sensitive: "Le contenu est NSFW"
 | 
					 | 
				
			||||||
  click-to-show: "Cliquer pour afficher"
 | 
					 | 
				
			||||||
mobile/views/components/media-video.vue:
 | 
					mobile/views/components/media-video.vue:
 | 
				
			||||||
  sensitive: "Le contenu est NSFW"
 | 
					  sensitive: "Le contenu est NSFW"
 | 
				
			||||||
  click-to-show: "Cliquer pour afficher"
 | 
					  click-to-show: "Cliquer pour afficher"
 | 
				
			||||||
@@ -1343,7 +1361,7 @@ common/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 à"
 | 
					  title: "Abonnez-vous à"
 | 
				
			||||||
  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"
 | 
				
			||||||
@@ -1457,7 +1475,7 @@ mobile/views/pages/search.vue:
 | 
				
			|||||||
mobile/views/pages/selectdrive.vue:
 | 
					mobile/views/pages/selectdrive.vue:
 | 
				
			||||||
  select-file: "Choisissez un fichier"
 | 
					  select-file: "Choisissez un fichier"
 | 
				
			||||||
mobile/views/pages/settings.vue:
 | 
					mobile/views/pages/settings.vue:
 | 
				
			||||||
  signed-in-as: "Connecté en tant que {}"
 | 
					  signed-in-as: "Connecté·e en tant que {}"
 | 
				
			||||||
  design: "Affichage et design"
 | 
					  design: "Affichage et design"
 | 
				
			||||||
  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é"
 | 
				
			||||||
@@ -1502,7 +1520,7 @@ mobile/views/pages/settings.vue:
 | 
				
			|||||||
mobile/views/pages/user.vue:
 | 
					mobile/views/pages/user.vue:
 | 
				
			||||||
  follows-you: "Vous suit"
 | 
					  follows-you: "Vous suit"
 | 
				
			||||||
  following: "Abonnements"
 | 
					  following: "Abonnements"
 | 
				
			||||||
  followers: "Abonnés"
 | 
					  followers: "Abonné·e·s"
 | 
				
			||||||
  notes: "Notes"
 | 
					  notes: "Notes"
 | 
				
			||||||
  overview: "Aperçu"
 | 
					  overview: "Aperçu"
 | 
				
			||||||
  timeline: "Fil d’actualité"
 | 
					  timeline: "Fil d’actualité"
 | 
				
			||||||
@@ -1515,10 +1533,10 @@ mobile/views/pages/user/home.vue:
 | 
				
			|||||||
  keywords: "Mot clés"
 | 
					  keywords: "Mot clés"
 | 
				
			||||||
  domains: "Domaines"
 | 
					  domains: "Domaines"
 | 
				
			||||||
  frequently-replied-users: "Utilisateurs mentionnés souvent"
 | 
					  frequently-replied-users: "Utilisateurs mentionnés souvent"
 | 
				
			||||||
  followers-you-know: "Abonnés que vous connaissez"
 | 
					  followers-you-know: "Abonné·e·s que vous connaissez"
 | 
				
			||||||
  last-used-at: "Dernière connexion il y a"
 | 
					  last-used-at: "Dernière connexion il y a"
 | 
				
			||||||
mobile/views/pages/user/home.followers-you-know.vue:
 | 
					mobile/views/pages/user/home.followers-you-know.vue:
 | 
				
			||||||
  no-users: "Aucun utilisateur connu"
 | 
					  no-users: "Aucun utilisateur·rice connu·e"
 | 
				
			||||||
mobile/views/pages/user/home.friends.vue:
 | 
					mobile/views/pages/user/home.friends.vue:
 | 
				
			||||||
  no-users: "Aucun utilisateur connu"
 | 
					  no-users: "Aucun utilisateur connu"
 | 
				
			||||||
mobile/views/pages/user/home.notes.vue:
 | 
					mobile/views/pages/user/home.notes.vue:
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										5
									
								
								locales/index.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								locales/index.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					type Locale = { [key: string]: string };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					declare const locales: { [lang: string]: Locale };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default locales;
 | 
				
			||||||
@@ -113,6 +113,7 @@ common:
 | 
				
			|||||||
  use-avatar-reversi-stones: "リバーシの石にアバターを使う"
 | 
					  use-avatar-reversi-stones: "リバーシの石にアバターを使う"
 | 
				
			||||||
  verified-user: "公式アカウント"
 | 
					  verified-user: "公式アカウント"
 | 
				
			||||||
  disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
 | 
					  disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
 | 
				
			||||||
 | 
					  disable-showing-animated-images: "アニメーション画像を再生しない"
 | 
				
			||||||
  suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
 | 
					  suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
 | 
				
			||||||
  always-show-nsfw: "常に閲覧注意のメディアを表示する"
 | 
					  always-show-nsfw: "常に閲覧注意のメディアを表示する"
 | 
				
			||||||
  always-mark-nsfw: "常にメディアを閲覧注意として投稿"
 | 
					  always-mark-nsfw: "常にメディアを閲覧注意として投稿"
 | 
				
			||||||
@@ -129,7 +130,7 @@ common:
 | 
				
			|||||||
  show-password: "パスワードを表示する"
 | 
					  show-password: "パスワードを表示する"
 | 
				
			||||||
  do-not-use-in-production: "これは開発ビルドです。本番環境で使用しないでください。"
 | 
					  do-not-use-in-production: "これは開発ビルドです。本番環境で使用しないでください。"
 | 
				
			||||||
  user-suspended: "このユーザーは凍結されています。"
 | 
					  user-suspended: "このユーザーは凍結されています。"
 | 
				
			||||||
  is-remote-user: "このユーザー情報はコピーです。"
 | 
					  is-remote-user: "このユーザー情報は不正確な可能性があります。"
 | 
				
			||||||
  is-remote-post: "この投稿情報はコピーです。"
 | 
					  is-remote-post: "この投稿情報はコピーです。"
 | 
				
			||||||
  view-on-remote: "正確な情報を見る"
 | 
					  view-on-remote: "正確な情報を見る"
 | 
				
			||||||
  renoted-by: "{user}がRenote"
 | 
					  renoted-by: "{user}がRenote"
 | 
				
			||||||
@@ -344,6 +345,8 @@ common/views/components/note-menu.vue:
 | 
				
			|||||||
  copy-link: "リンクをコピー"
 | 
					  copy-link: "リンクをコピー"
 | 
				
			||||||
  favorite: "お気に入り"
 | 
					  favorite: "お気に入り"
 | 
				
			||||||
  unfavorite: "お気に入り解除"
 | 
					  unfavorite: "お気に入り解除"
 | 
				
			||||||
 | 
					  watch: "ウォッチ"
 | 
				
			||||||
 | 
					  unwatch: "ウォッチ解除"
 | 
				
			||||||
  pin: "ピン留め"
 | 
					  pin: "ピン留め"
 | 
				
			||||||
  unpin: "ピン留め解除"
 | 
					  unpin: "ピン留め解除"
 | 
				
			||||||
  delete: "削除"
 | 
					  delete: "削除"
 | 
				
			||||||
@@ -360,6 +363,10 @@ common/views/components/user-menu.vue:
 | 
				
			|||||||
  report-abuse: "スパムを報告"
 | 
					  report-abuse: "スパムを報告"
 | 
				
			||||||
  report-abuse-detail: "どのような迷惑行為を行っていますか?"
 | 
					  report-abuse-detail: "どのような迷惑行為を行っていますか?"
 | 
				
			||||||
  report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
 | 
					  report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
 | 
				
			||||||
 | 
					  silence: "サイレンス"
 | 
				
			||||||
 | 
					  unsilence: "サイレンス解除"
 | 
				
			||||||
 | 
					  suspend: "凍結"
 | 
				
			||||||
 | 
					  unsuspend: "凍結解除"
 | 
				
			||||||
common/views/components/poll.vue:
 | 
					common/views/components/poll.vue:
 | 
				
			||||||
  vote-to: "「{}」に投票する"
 | 
					  vote-to: "「{}」に投票する"
 | 
				
			||||||
  vote-count: "{}票"
 | 
					  vote-count: "{}票"
 | 
				
			||||||
@@ -482,6 +489,7 @@ common/views/components/profile-editor.vue:
 | 
				
			|||||||
  account: "アカウント"
 | 
					  account: "アカウント"
 | 
				
			||||||
  location: "場所"
 | 
					  location: "場所"
 | 
				
			||||||
  description: "自己紹介"
 | 
					  description: "自己紹介"
 | 
				
			||||||
 | 
					  you-can-include-hashtags: "ハッシュタグを含めることができます。"
 | 
				
			||||||
  language: "言語"
 | 
					  language: "言語"
 | 
				
			||||||
  birthday: "誕生日"
 | 
					  birthday: "誕生日"
 | 
				
			||||||
  avatar: "アイコン"
 | 
					  avatar: "アイコン"
 | 
				
			||||||
@@ -501,6 +509,13 @@ common/views/components/profile-editor.vue:
 | 
				
			|||||||
  email-address: "メールアドレス"
 | 
					  email-address: "メールアドレス"
 | 
				
			||||||
  email-verified: "メールアドレスが確認されました"
 | 
					  email-verified: "メールアドレスが確認されました"
 | 
				
			||||||
  email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
 | 
					  email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
 | 
				
			||||||
 | 
					  export: "エクスポート"
 | 
				
			||||||
 | 
					  export-targets:
 | 
				
			||||||
 | 
					    all-notes: "すべての投稿データ"
 | 
				
			||||||
 | 
					    following-list: "フォロー"
 | 
				
			||||||
 | 
					    mute-list: "ミュート"
 | 
				
			||||||
 | 
					    blocking-list: "ブロック"
 | 
				
			||||||
 | 
					  export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
 | 
				
			||||||
common/views/components/user-list-editor.vue:
 | 
					common/views/components/user-list-editor.vue:
 | 
				
			||||||
  users: "ユーザー"
 | 
					  users: "ユーザー"
 | 
				
			||||||
  rename: "リスト名を変更"
 | 
					  rename: "リスト名を変更"
 | 
				
			||||||
@@ -658,9 +673,6 @@ desktop/views/components/drive.vue:
 | 
				
			|||||||
    create-folder: "フォルダーを作成"
 | 
					    create-folder: "フォルダーを作成"
 | 
				
			||||||
    upload: "ファイルをアップロード"
 | 
					    upload: "ファイルをアップロード"
 | 
				
			||||||
    url-upload: "URLからアップロード"
 | 
					    url-upload: "URLからアップロード"
 | 
				
			||||||
desktop/views/components/media-image.vue:
 | 
					 | 
				
			||||||
  sensitive: "閲覧注意"
 | 
					 | 
				
			||||||
  click-to-show: "クリックして表示"
 | 
					 | 
				
			||||||
desktop/views/components/media-video.vue:
 | 
					desktop/views/components/media-video.vue:
 | 
				
			||||||
  sensitive: "閲覧注意"
 | 
					  sensitive: "閲覧注意"
 | 
				
			||||||
  click-to-show: "クリックして表示"
 | 
					  click-to-show: "クリックして表示"
 | 
				
			||||||
@@ -875,6 +887,9 @@ desktop/views/components/settings.2fa.vue:
 | 
				
			|||||||
  success: "設定が完了しました!"
 | 
					  success: "設定が完了しました!"
 | 
				
			||||||
  failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
 | 
					  failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
 | 
				
			||||||
  info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
 | 
					  info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
 | 
				
			||||||
 | 
					common/views/components/media-image.vue:
 | 
				
			||||||
 | 
					  sensitive: "閲覧注意"
 | 
				
			||||||
 | 
					  click-to-show: "クリックして表示"
 | 
				
			||||||
common/views/components/api-settings.vue:
 | 
					common/views/components/api-settings.vue:
 | 
				
			||||||
  intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
 | 
					  intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
 | 
				
			||||||
  caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
 | 
					  caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
 | 
				
			||||||
@@ -992,6 +1007,7 @@ admin/views/index.vue:
 | 
				
			|||||||
  announcements: "お知らせ"
 | 
					  announcements: "お知らせ"
 | 
				
			||||||
  hashtags: "ハッシュタグ"
 | 
					  hashtags: "ハッシュタグ"
 | 
				
			||||||
  abuse: "スパム報告"
 | 
					  abuse: "スパム報告"
 | 
				
			||||||
 | 
					  queue: "ジョブキュー"
 | 
				
			||||||
  back-to-misskey: "Misskeyに戻る"
 | 
					  back-to-misskey: "Misskeyに戻る"
 | 
				
			||||||
admin/views/dashboard.vue:
 | 
					admin/views/dashboard.vue:
 | 
				
			||||||
  dashboard: "ダッシュボード"
 | 
					  dashboard: "ダッシュボード"
 | 
				
			||||||
@@ -1001,6 +1017,9 @@ admin/views/dashboard.vue:
 | 
				
			|||||||
  instances: "インスタンス"
 | 
					  instances: "インスタンス"
 | 
				
			||||||
  this-instance: "このインスタンス"
 | 
					  this-instance: "このインスタンス"
 | 
				
			||||||
  federated: "連合"
 | 
					  federated: "連合"
 | 
				
			||||||
 | 
					admin/views/queue.vue:
 | 
				
			||||||
 | 
					  operation: "操作"
 | 
				
			||||||
 | 
					  remove-all-jobs: "すべてのジョブをクリア"
 | 
				
			||||||
admin/views/abuse.vue:
 | 
					admin/views/abuse.vue:
 | 
				
			||||||
  title: "スパム報告"
 | 
					  title: "スパム報告"
 | 
				
			||||||
  target: "対象"
 | 
					  target: "対象"
 | 
				
			||||||
@@ -1142,6 +1161,8 @@ admin/views/users.vue:
 | 
				
			|||||||
  unsuspend: "凍結の解除"
 | 
					  unsuspend: "凍結の解除"
 | 
				
			||||||
  unsuspend-confirm: "凍結を解除しますか?"
 | 
					  unsuspend-confirm: "凍結を解除しますか?"
 | 
				
			||||||
  unsuspended: "凍結を解除しました"
 | 
					  unsuspended: "凍結を解除しました"
 | 
				
			||||||
 | 
					  make-silence: "サイレンス"
 | 
				
			||||||
 | 
					  unmake-silence: "サイレンスの解除"
 | 
				
			||||||
  verify: "公式アカウントにする"
 | 
					  verify: "公式アカウントにする"
 | 
				
			||||||
  verify-confirm: "公式アカウントにしますか?"
 | 
					  verify-confirm: "公式アカウントにしますか?"
 | 
				
			||||||
  verified: "公式アカウントにしました"
 | 
					  verified: "公式アカウントにしました"
 | 
				
			||||||
@@ -1329,9 +1350,6 @@ mobile/views/components/drive.file-detail.vue:
 | 
				
			|||||||
  nsfw: "閲覧注意"
 | 
					  nsfw: "閲覧注意"
 | 
				
			||||||
  mark-as-sensitive: "閲覧注意に設定"
 | 
					  mark-as-sensitive: "閲覧注意に設定"
 | 
				
			||||||
  unmark-as-sensitive: "閲覧注意を解除"
 | 
					  unmark-as-sensitive: "閲覧注意を解除"
 | 
				
			||||||
mobile/views/components/media-image.vue:
 | 
					 | 
				
			||||||
  sensitive: "閲覧注意"
 | 
					 | 
				
			||||||
  click-to-show: "クリックして表示"
 | 
					 | 
				
			||||||
mobile/views/components/media-video.vue:
 | 
					mobile/views/components/media-video.vue:
 | 
				
			||||||
  sensitive: "閲覧注意"
 | 
					  sensitive: "閲覧注意"
 | 
				
			||||||
  click-to-show: "クリックして表示"
 | 
					  click-to-show: "クリックして表示"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -121,6 +121,7 @@ common:
 | 
				
			|||||||
  use-avatar-reversi-stones: "リバーシの石にアバターを使う"
 | 
					  use-avatar-reversi-stones: "リバーシの石にアバターを使う"
 | 
				
			||||||
  verified-user: "公式アカウント"
 | 
					  verified-user: "公式アカウント"
 | 
				
			||||||
  disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
 | 
					  disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
 | 
				
			||||||
 | 
					  disable-showing-animated-images: "アニメーション画像を再生しない"
 | 
				
			||||||
  suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
 | 
					  suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
 | 
				
			||||||
  always-show-nsfw: "常に閲覧注意のメディアを表示する"
 | 
					  always-show-nsfw: "常に閲覧注意のメディアを表示する"
 | 
				
			||||||
  always-mark-nsfw: "常にメディアを閲覧注意として投稿"
 | 
					  always-mark-nsfw: "常にメディアを閲覧注意として投稿"
 | 
				
			||||||
@@ -138,7 +139,7 @@ common:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  do-not-use-in-production: "これは開発ビルドです。本番環境で使用しないでください。"
 | 
					  do-not-use-in-production: "これは開発ビルドです。本番環境で使用しないでください。"
 | 
				
			||||||
  user-suspended: "このユーザーは凍結されています。"
 | 
					  user-suspended: "このユーザーは凍結されています。"
 | 
				
			||||||
  is-remote-user: "このユーザー情報はコピーです。"
 | 
					  is-remote-user: "このユーザー情報は不正確な可能性があります。"
 | 
				
			||||||
  is-remote-post: "この投稿情報はコピーです。"
 | 
					  is-remote-post: "この投稿情報はコピーです。"
 | 
				
			||||||
  view-on-remote: "正確な情報を見る"
 | 
					  view-on-remote: "正確な情報を見る"
 | 
				
			||||||
  renoted-by: "{user}がRenote"
 | 
					  renoted-by: "{user}がRenote"
 | 
				
			||||||
@@ -374,6 +375,8 @@ common/views/components/note-menu.vue:
 | 
				
			|||||||
  copy-link: "リンクをコピー"
 | 
					  copy-link: "リンクをコピー"
 | 
				
			||||||
  favorite: "お気に入り"
 | 
					  favorite: "お気に入り"
 | 
				
			||||||
  unfavorite: "お気に入り解除"
 | 
					  unfavorite: "お気に入り解除"
 | 
				
			||||||
 | 
					  watch: "ウォッチ"
 | 
				
			||||||
 | 
					  unwatch: "ウォッチ解除"
 | 
				
			||||||
  pin: "ピン留め"
 | 
					  pin: "ピン留め"
 | 
				
			||||||
  unpin: "ピン留め解除"
 | 
					  unpin: "ピン留め解除"
 | 
				
			||||||
  delete: "削除"
 | 
					  delete: "削除"
 | 
				
			||||||
@@ -391,6 +394,10 @@ common/views/components/user-menu.vue:
 | 
				
			|||||||
  report-abuse: "スパムを報告"
 | 
					  report-abuse: "スパムを報告"
 | 
				
			||||||
  report-abuse-detail: "どのような迷惑行為を行っていますか?"
 | 
					  report-abuse-detail: "どのような迷惑行為を行っていますか?"
 | 
				
			||||||
  report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
 | 
					  report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
 | 
				
			||||||
 | 
					  silence: "サイレンス"
 | 
				
			||||||
 | 
					  unsilence: "サイレンス解除"
 | 
				
			||||||
 | 
					  suspend: "凍結"
 | 
				
			||||||
 | 
					  unsuspend: "凍結解除"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
common/views/components/poll.vue:
 | 
					common/views/components/poll.vue:
 | 
				
			||||||
  vote-to: "「{}」に投票する"
 | 
					  vote-to: "「{}」に投票する"
 | 
				
			||||||
@@ -530,6 +537,7 @@ common/views/components/profile-editor.vue:
 | 
				
			|||||||
  account: "アカウント"
 | 
					  account: "アカウント"
 | 
				
			||||||
  location: "場所"
 | 
					  location: "場所"
 | 
				
			||||||
  description: "自己紹介"
 | 
					  description: "自己紹介"
 | 
				
			||||||
 | 
					  you-can-include-hashtags: "ハッシュタグを含めることができます。"
 | 
				
			||||||
  language: "言語"
 | 
					  language: "言語"
 | 
				
			||||||
  birthday: "誕生日"
 | 
					  birthday: "誕生日"
 | 
				
			||||||
  avatar: "アイコン"
 | 
					  avatar: "アイコン"
 | 
				
			||||||
@@ -549,6 +557,13 @@ common/views/components/profile-editor.vue:
 | 
				
			|||||||
  email-address: "メールアドレス"
 | 
					  email-address: "メールアドレス"
 | 
				
			||||||
  email-verified: "メールアドレスが確認されました"
 | 
					  email-verified: "メールアドレスが確認されました"
 | 
				
			||||||
  email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
 | 
					  email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
 | 
				
			||||||
 | 
					  export: "エクスポート"
 | 
				
			||||||
 | 
					  export-targets:
 | 
				
			||||||
 | 
					    all-notes: "すべての投稿データ"
 | 
				
			||||||
 | 
					    following-list: "フォロー"
 | 
				
			||||||
 | 
					    mute-list: "ミュート"
 | 
				
			||||||
 | 
					    blocking-list: "ブロック"
 | 
				
			||||||
 | 
					  export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
common/views/components/user-list-editor.vue:
 | 
					common/views/components/user-list-editor.vue:
 | 
				
			||||||
  users: "ユーザー"
 | 
					  users: "ユーザー"
 | 
				
			||||||
@@ -1118,6 +1133,7 @@ admin/views/index.vue:
 | 
				
			|||||||
  announcements: "お知らせ"
 | 
					  announcements: "お知らせ"
 | 
				
			||||||
  hashtags: "ハッシュタグ"
 | 
					  hashtags: "ハッシュタグ"
 | 
				
			||||||
  abuse: "スパム報告"
 | 
					  abuse: "スパム報告"
 | 
				
			||||||
 | 
					  queue: "ジョブキュー"
 | 
				
			||||||
  back-to-misskey: "Misskeyに戻る"
 | 
					  back-to-misskey: "Misskeyに戻る"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
admin/views/dashboard.vue:
 | 
					admin/views/dashboard.vue:
 | 
				
			||||||
@@ -1129,6 +1145,10 @@ admin/views/dashboard.vue:
 | 
				
			|||||||
  this-instance: "このインスタンス"
 | 
					  this-instance: "このインスタンス"
 | 
				
			||||||
  federated: "連合"
 | 
					  federated: "連合"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					admin/views/queue.vue:
 | 
				
			||||||
 | 
					  operation: "操作"
 | 
				
			||||||
 | 
					  remove-all-jobs: "すべてのジョブをクリア"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
admin/views/abuse.vue:
 | 
					admin/views/abuse.vue:
 | 
				
			||||||
  title: "スパム報告"
 | 
					  title: "スパム報告"
 | 
				
			||||||
  target: "対象"
 | 
					  target: "対象"
 | 
				
			||||||
@@ -1274,6 +1294,8 @@ admin/views/users.vue:
 | 
				
			|||||||
  unsuspend: "凍結の解除"
 | 
					  unsuspend: "凍結の解除"
 | 
				
			||||||
  unsuspend-confirm: "凍結を解除しますか?"
 | 
					  unsuspend-confirm: "凍結を解除しますか?"
 | 
				
			||||||
  unsuspended: "凍結を解除しました"
 | 
					  unsuspended: "凍結を解除しました"
 | 
				
			||||||
 | 
					  make-silence: "サイレンス"
 | 
				
			||||||
 | 
					  unmake-silence: "サイレンスの解除"
 | 
				
			||||||
  verify: "公式アカウントにする"
 | 
					  verify: "公式アカウントにする"
 | 
				
			||||||
  verify-confirm: "公式アカウントにしますか?"
 | 
					  verify-confirm: "公式アカウントにしますか?"
 | 
				
			||||||
  verified: "公式アカウントにしました"
 | 
					  verified: "公式アカウントにしました"
 | 
				
			||||||
@@ -1349,6 +1371,32 @@ admin/views/announcements.vue:
 | 
				
			|||||||
admin/views/hashtags.vue:
 | 
					admin/views/hashtags.vue:
 | 
				
			||||||
  hided-tags: "Hidden Tags"
 | 
					  hided-tags: "Hidden Tags"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					admin/views/federation.vue:
 | 
				
			||||||
 | 
					  federation: "連合"
 | 
				
			||||||
 | 
					  host: "ホスト"
 | 
				
			||||||
 | 
					  notes: "投稿"
 | 
				
			||||||
 | 
					  users: "ユーザー"
 | 
				
			||||||
 | 
					  following: "フォロー中"
 | 
				
			||||||
 | 
					  followers: "フォロワー"
 | 
				
			||||||
 | 
					  status: "ステータス"
 | 
				
			||||||
 | 
					  latest-request-sent-at: "直近のリクエスト送信"
 | 
				
			||||||
 | 
					  latest-request-received-at: "直近のリクエスト受信"
 | 
				
			||||||
 | 
					  lookup: "照会"
 | 
				
			||||||
 | 
					  instances: "インスタンス"
 | 
				
			||||||
 | 
					  instance-not-registered: "そのインスタンスは登録されていません"
 | 
				
			||||||
 | 
					  sort: "ソート"
 | 
				
			||||||
 | 
					  sorts:
 | 
				
			||||||
 | 
					    caughtAtAsc: "登録日時が古い順"
 | 
				
			||||||
 | 
					    caughtAtDesc: "登録日時が新しい順"
 | 
				
			||||||
 | 
					    notesAsc: "投稿が少ない順"
 | 
				
			||||||
 | 
					    notesDesc: "投稿が多い順"
 | 
				
			||||||
 | 
					    usersAsc: "ユーザーが少ない順"
 | 
				
			||||||
 | 
					    usersDesc: "ユーザーが多い順"
 | 
				
			||||||
 | 
					    followingAsc: "フォローが少ない順"
 | 
				
			||||||
 | 
					    followingDesc: "フォローが多い順"
 | 
				
			||||||
 | 
					    followersAsc: "フォロワーが少ない順"
 | 
				
			||||||
 | 
					    followersDesc: "フォロワーが多い順"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
desktop/views/pages/welcome.vue:
 | 
					desktop/views/pages/welcome.vue:
 | 
				
			||||||
  about: "詳しく..."
 | 
					  about: "詳しく..."
 | 
				
			||||||
  gotit: "わかった"
 | 
					  gotit: "わかった"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -113,6 +113,7 @@ common:
 | 
				
			|||||||
  use-avatar-reversi-stones: "リバーシの石にアバターを使う"
 | 
					  use-avatar-reversi-stones: "リバーシの石にアバターを使う"
 | 
				
			||||||
  verified-user: "アメちゃん付きアカウント"
 | 
					  verified-user: "アメちゃん付きアカウント"
 | 
				
			||||||
  disable-animated-mfm: "投稿内のちょろちょろ動いてんのを止める"
 | 
					  disable-animated-mfm: "投稿内のちょろちょろ動いてんのを止める"
 | 
				
			||||||
 | 
					  disable-showing-animated-images: "アニメーション画像を再生しない"
 | 
				
			||||||
  suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
 | 
					  suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
 | 
				
			||||||
  always-show-nsfw: "閲覧注意?見せたらあかん?そんなん知らんわ、見せろや!"
 | 
					  always-show-nsfw: "閲覧注意?見せたらあかん?そんなん知らんわ、見せろや!"
 | 
				
			||||||
  always-mark-nsfw: "わからんからとりあえずメディアは見せたらあかん"
 | 
					  always-mark-nsfw: "わからんからとりあえずメディアは見せたらあかん"
 | 
				
			||||||
@@ -129,7 +130,7 @@ common:
 | 
				
			|||||||
  show-password: "パスワードを表示する"
 | 
					  show-password: "パスワードを表示する"
 | 
				
			||||||
  do-not-use-in-production: "開発ビルドや。本番環境で使わんといて!知らんで!"
 | 
					  do-not-use-in-production: "開発ビルドや。本番環境で使わんといて!知らんで!"
 | 
				
			||||||
  user-suspended: "このユーザーは凍結されています。"
 | 
					  user-suspended: "このユーザーは凍結されています。"
 | 
				
			||||||
  is-remote-user: "このユーザー情報はコピーです。"
 | 
					  is-remote-user: "このユーザー情報は不正確な可能性があります。"
 | 
				
			||||||
  is-remote-post: "この投稿情報はコピーです。"
 | 
					  is-remote-post: "この投稿情報はコピーです。"
 | 
				
			||||||
  view-on-remote: "ちゃんとした情報見せてや!"
 | 
					  view-on-remote: "ちゃんとした情報見せてや!"
 | 
				
			||||||
  renoted-by: "{user}がRenote"
 | 
					  renoted-by: "{user}がRenote"
 | 
				
			||||||
@@ -344,6 +345,8 @@ common/views/components/note-menu.vue:
 | 
				
			|||||||
  copy-link: "リンクをコピー"
 | 
					  copy-link: "リンクをコピー"
 | 
				
			||||||
  favorite: "お気に入り"
 | 
					  favorite: "お気に入り"
 | 
				
			||||||
  unfavorite: "お気に入りやめる"
 | 
					  unfavorite: "お気に入りやめる"
 | 
				
			||||||
 | 
					  watch: "ウォッチ"
 | 
				
			||||||
 | 
					  unwatch: "ウォッチ解除"
 | 
				
			||||||
  pin: "ピン留め"
 | 
					  pin: "ピン留め"
 | 
				
			||||||
  unpin: "ピン留めやめる"
 | 
					  unpin: "ピン留めやめる"
 | 
				
			||||||
  delete: "ほかす"
 | 
					  delete: "ほかす"
 | 
				
			||||||
@@ -360,6 +363,10 @@ common/views/components/user-menu.vue:
 | 
				
			|||||||
  report-abuse: "スパムを報告"
 | 
					  report-abuse: "スパムを報告"
 | 
				
			||||||
  report-abuse-detail: "どのような迷惑行為を行っていますか?"
 | 
					  report-abuse-detail: "どのような迷惑行為を行っていますか?"
 | 
				
			||||||
  report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
 | 
					  report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
 | 
				
			||||||
 | 
					  silence: "サイレンス"
 | 
				
			||||||
 | 
					  unsilence: "サイレンス解除"
 | 
				
			||||||
 | 
					  suspend: "凍結"
 | 
				
			||||||
 | 
					  unsuspend: "凍結解除"
 | 
				
			||||||
common/views/components/poll.vue:
 | 
					common/views/components/poll.vue:
 | 
				
			||||||
  vote-to: "「{}」に投票や!"
 | 
					  vote-to: "「{}」に投票や!"
 | 
				
			||||||
  vote-count: "{}票"
 | 
					  vote-count: "{}票"
 | 
				
			||||||
@@ -482,6 +489,7 @@ common/views/components/profile-editor.vue:
 | 
				
			|||||||
  account: "アカウント"
 | 
					  account: "アカウント"
 | 
				
			||||||
  location: "場所"
 | 
					  location: "場所"
 | 
				
			||||||
  description: "自己紹介"
 | 
					  description: "自己紹介"
 | 
				
			||||||
 | 
					  you-can-include-hashtags: "ハッシュタグを含めることができます。"
 | 
				
			||||||
  language: "言語"
 | 
					  language: "言語"
 | 
				
			||||||
  birthday: "誕生日"
 | 
					  birthday: "誕生日"
 | 
				
			||||||
  avatar: "アイコン"
 | 
					  avatar: "アイコン"
 | 
				
			||||||
@@ -501,6 +509,13 @@ common/views/components/profile-editor.vue:
 | 
				
			|||||||
  email-address: "メールアドレス"
 | 
					  email-address: "メールアドレス"
 | 
				
			||||||
  email-verified: "このメールアドレスOKや!"
 | 
					  email-verified: "このメールアドレスOKや!"
 | 
				
			||||||
  email-not-verified: "メールアドレスが確認されとらん。メールボックスもっぺん見てくれへん?"
 | 
					  email-not-verified: "メールアドレスが確認されとらん。メールボックスもっぺん見てくれへん?"
 | 
				
			||||||
 | 
					  export: "エクスポート"
 | 
				
			||||||
 | 
					  export-targets:
 | 
				
			||||||
 | 
					    all-notes: "すべての投稿データ"
 | 
				
			||||||
 | 
					    following-list: "フォロー"
 | 
				
			||||||
 | 
					    mute-list: "ミュート"
 | 
				
			||||||
 | 
					    blocking-list: "ブロック"
 | 
				
			||||||
 | 
					  export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
 | 
				
			||||||
common/views/components/user-list-editor.vue:
 | 
					common/views/components/user-list-editor.vue:
 | 
				
			||||||
  users: "ユーザー"
 | 
					  users: "ユーザー"
 | 
				
			||||||
  rename: "リスト名を変更"
 | 
					  rename: "リスト名を変更"
 | 
				
			||||||
@@ -658,9 +673,6 @@ desktop/views/components/drive.vue:
 | 
				
			|||||||
    create-folder: "フォルダー作る"
 | 
					    create-folder: "フォルダー作る"
 | 
				
			||||||
    upload: "ファイル上げる"
 | 
					    upload: "ファイル上げる"
 | 
				
			||||||
    url-upload: "URLつこうて上げる"
 | 
					    url-upload: "URLつこうて上げる"
 | 
				
			||||||
desktop/views/components/media-image.vue:
 | 
					 | 
				
			||||||
  sensitive: "ちょっと見せられへんわ"
 | 
					 | 
				
			||||||
  click-to-show: "クリックして見せるで"
 | 
					 | 
				
			||||||
desktop/views/components/media-video.vue:
 | 
					desktop/views/components/media-video.vue:
 | 
				
			||||||
  sensitive: "ちょっと見せられへんわ"
 | 
					  sensitive: "ちょっと見せられへんわ"
 | 
				
			||||||
  click-to-show: "クリックして見せるで"
 | 
					  click-to-show: "クリックして見せるで"
 | 
				
			||||||
@@ -875,6 +887,9 @@ desktop/views/components/settings.2fa.vue:
 | 
				
			|||||||
  success: "設定が完了したで!"
 | 
					  success: "設定が完了したで!"
 | 
				
			||||||
  failed: "なんか設定に失敗したで。トークンを間違えとらんか確認してや。"
 | 
					  failed: "なんか設定に失敗したで。トークンを間違えとらんか確認してや。"
 | 
				
			||||||
  info: "次のサインインからは、パスワードに加えてデバイスに出とるトークンを入力してな。"
 | 
					  info: "次のサインインからは、パスワードに加えてデバイスに出とるトークンを入力してな。"
 | 
				
			||||||
 | 
					common/views/components/media-image.vue:
 | 
				
			||||||
 | 
					  sensitive: "閲覧注意"
 | 
				
			||||||
 | 
					  click-to-show: "クリックして表示"
 | 
				
			||||||
common/views/components/api-settings.vue:
 | 
					common/views/components/api-settings.vue:
 | 
				
			||||||
  intro: "API使うんやったらこのトークンを「i」っちゅうパラメータにくっつけてリクエストできるで。"
 | 
					  intro: "API使うんやったらこのトークンを「i」っちゅうパラメータにくっつけてリクエストできるで。"
 | 
				
			||||||
  caution: "アカウント勝手にいじられるかも知れんから、このトークンは教えたらあかんし、アプリにも書いたらあかんで(これはフリちゃうで)"
 | 
					  caution: "アカウント勝手にいじられるかも知れんから、このトークンは教えたらあかんし、アプリにも書いたらあかんで(これはフリちゃうで)"
 | 
				
			||||||
@@ -992,6 +1007,7 @@ admin/views/index.vue:
 | 
				
			|||||||
  announcements: "知っといてや"
 | 
					  announcements: "知っといてや"
 | 
				
			||||||
  hashtags: "ハッシュタグ"
 | 
					  hashtags: "ハッシュタグ"
 | 
				
			||||||
  abuse: "スパム報告"
 | 
					  abuse: "スパム報告"
 | 
				
			||||||
 | 
					  queue: "ジョブキュー"
 | 
				
			||||||
  back-to-misskey: "Misskeyに戻る"
 | 
					  back-to-misskey: "Misskeyに戻る"
 | 
				
			||||||
admin/views/dashboard.vue:
 | 
					admin/views/dashboard.vue:
 | 
				
			||||||
  dashboard: "ダッシュボード"
 | 
					  dashboard: "ダッシュボード"
 | 
				
			||||||
@@ -1001,6 +1017,9 @@ admin/views/dashboard.vue:
 | 
				
			|||||||
  instances: "インスタンス"
 | 
					  instances: "インスタンス"
 | 
				
			||||||
  this-instance: "ワイのインスタンス"
 | 
					  this-instance: "ワイのインスタンス"
 | 
				
			||||||
  federated: "連合"
 | 
					  federated: "連合"
 | 
				
			||||||
 | 
					admin/views/queue.vue:
 | 
				
			||||||
 | 
					  operation: "操作"
 | 
				
			||||||
 | 
					  remove-all-jobs: "すべてのジョブをクリア"
 | 
				
			||||||
admin/views/abuse.vue:
 | 
					admin/views/abuse.vue:
 | 
				
			||||||
  title: "スパム報告"
 | 
					  title: "スパム報告"
 | 
				
			||||||
  target: "対象"
 | 
					  target: "対象"
 | 
				
			||||||
@@ -1142,6 +1161,8 @@ admin/views/users.vue:
 | 
				
			|||||||
  unsuspend: "凍結の解除"
 | 
					  unsuspend: "凍結の解除"
 | 
				
			||||||
  unsuspend-confirm: "凍結を解除しますか?"
 | 
					  unsuspend-confirm: "凍結を解除しますか?"
 | 
				
			||||||
  unsuspended: "凍結を解除しました"
 | 
					  unsuspended: "凍結を解除しました"
 | 
				
			||||||
 | 
					  make-silence: "サイレンス"
 | 
				
			||||||
 | 
					  unmake-silence: "サイレンスの解除"
 | 
				
			||||||
  verify: "公式アカウントにする"
 | 
					  verify: "公式アカウントにする"
 | 
				
			||||||
  verify-confirm: "公式アカウントにしますか?"
 | 
					  verify-confirm: "公式アカウントにしますか?"
 | 
				
			||||||
  verified: "公式アカウントにしました"
 | 
					  verified: "公式アカウントにしました"
 | 
				
			||||||
@@ -1329,9 +1350,6 @@ mobile/views/components/drive.file-detail.vue:
 | 
				
			|||||||
  nsfw: "ちょっと見せられへんわ"
 | 
					  nsfw: "ちょっと見せられへんわ"
 | 
				
			||||||
  mark-as-sensitive: "見たらあかん感じにしとく"
 | 
					  mark-as-sensitive: "見たらあかん感じにしとく"
 | 
				
			||||||
  unmark-as-sensitive: "やっぱ見せたるわ"
 | 
					  unmark-as-sensitive: "やっぱ見せたるわ"
 | 
				
			||||||
mobile/views/components/media-image.vue:
 | 
					 | 
				
			||||||
  sensitive: "見たらあかんで"
 | 
					 | 
				
			||||||
  click-to-show: "押してみ、見せたるわ"
 | 
					 | 
				
			||||||
mobile/views/components/media-video.vue:
 | 
					mobile/views/components/media-video.vue:
 | 
				
			||||||
  sensitive: "ちょっと見せられへんわ"
 | 
					  sensitive: "ちょっと見せられへんわ"
 | 
				
			||||||
  click-to-show: "押してみ、見せたるわ"
 | 
					  click-to-show: "押してみ、見せたるわ"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -113,6 +113,7 @@ common:
 | 
				
			|||||||
  use-avatar-reversi-stones: "리버시의 돌로 아바타를 사용"
 | 
					  use-avatar-reversi-stones: "리버시의 돌로 아바타를 사용"
 | 
				
			||||||
  verified-user: "공식 계정"
 | 
					  verified-user: "공식 계정"
 | 
				
			||||||
  disable-animated-mfm: "글의 문자 애니메이션을 비활성화"
 | 
					  disable-animated-mfm: "글의 문자 애니메이션을 비활성화"
 | 
				
			||||||
 | 
					  disable-showing-animated-images: "アニメーション画像を再生しない"
 | 
				
			||||||
  suggest-recent-hashtags: "최근 해시태그를 글 작성란에 표시"
 | 
					  suggest-recent-hashtags: "최근 해시태그를 글 작성란에 표시"
 | 
				
			||||||
  always-show-nsfw: "항상 열람주의 미디어를 표시"
 | 
					  always-show-nsfw: "항상 열람주의 미디어를 표시"
 | 
				
			||||||
  always-mark-nsfw: "항상 미디어를 열람주의로 설정하여 게시"
 | 
					  always-mark-nsfw: "항상 미디어를 열람주의로 설정하여 게시"
 | 
				
			||||||
@@ -129,7 +130,7 @@ common:
 | 
				
			|||||||
  show-password: "비밀번호 표시"
 | 
					  show-password: "비밀번호 표시"
 | 
				
			||||||
  do-not-use-in-production: "이것은 개발 빌드입니다. 프로덕션 환경에서 사용하지 마십시오."
 | 
					  do-not-use-in-production: "이것은 개발 빌드입니다. 프로덕션 환경에서 사용하지 마십시오."
 | 
				
			||||||
  user-suspended: "이 사용자는 정지된 상태입니다."
 | 
					  user-suspended: "이 사용자는 정지된 상태입니다."
 | 
				
			||||||
  is-remote-user: "이 유저 정보는 복사본입니다."
 | 
					  is-remote-user: "이 사용자 정보는 정확하지 않을 수 있습니다."
 | 
				
			||||||
  is-remote-post: "이 글 정보는 복사본입니다."
 | 
					  is-remote-post: "이 글 정보는 복사본입니다."
 | 
				
			||||||
  view-on-remote: "정확한 정보 보기"
 | 
					  view-on-remote: "정확한 정보 보기"
 | 
				
			||||||
  renoted-by: "{user}이(가) 리노트"
 | 
					  renoted-by: "{user}이(가) 리노트"
 | 
				
			||||||
@@ -344,6 +345,8 @@ common/views/components/note-menu.vue:
 | 
				
			|||||||
  copy-link: "링크 복사"
 | 
					  copy-link: "링크 복사"
 | 
				
			||||||
  favorite: "이 노트 즐겨찾기"
 | 
					  favorite: "이 노트 즐겨찾기"
 | 
				
			||||||
  unfavorite: "즐겨찾기에서 제거"
 | 
					  unfavorite: "즐겨찾기에서 제거"
 | 
				
			||||||
 | 
					  watch: "ウォッチ"
 | 
				
			||||||
 | 
					  unwatch: "ウォッチ解除"
 | 
				
			||||||
  pin: "프로필에 고정"
 | 
					  pin: "프로필에 고정"
 | 
				
			||||||
  unpin: "프로필에서 고정 해제"
 | 
					  unpin: "프로필에서 고정 해제"
 | 
				
			||||||
  delete: "삭제"
 | 
					  delete: "삭제"
 | 
				
			||||||
@@ -360,6 +363,10 @@ common/views/components/user-menu.vue:
 | 
				
			|||||||
  report-abuse: "스팸 신고"
 | 
					  report-abuse: "스팸 신고"
 | 
				
			||||||
  report-abuse-detail: "어떤 스팸 행위를 하고 있습니까?"
 | 
					  report-abuse-detail: "어떤 스팸 행위를 하고 있습니까?"
 | 
				
			||||||
  report-abuse-reported: "관리자에게 보고되었습니다. 협조해주셔서 감사합니다."
 | 
					  report-abuse-reported: "관리자에게 보고되었습니다. 협조해주셔서 감사합니다."
 | 
				
			||||||
 | 
					  silence: "침묵"
 | 
				
			||||||
 | 
					  unsilence: "침묵 해제"
 | 
				
			||||||
 | 
					  suspend: "정지"
 | 
				
			||||||
 | 
					  unsuspend: "정지 해제"
 | 
				
			||||||
common/views/components/poll.vue:
 | 
					common/views/components/poll.vue:
 | 
				
			||||||
  vote-to: "\"{}\"에 투표하기"
 | 
					  vote-to: "\"{}\"에 투표하기"
 | 
				
			||||||
  vote-count: "{}표"
 | 
					  vote-count: "{}표"
 | 
				
			||||||
@@ -482,6 +489,7 @@ common/views/components/profile-editor.vue:
 | 
				
			|||||||
  account: "계정"
 | 
					  account: "계정"
 | 
				
			||||||
  location: "장소"
 | 
					  location: "장소"
 | 
				
			||||||
  description: "자기소개"
 | 
					  description: "자기소개"
 | 
				
			||||||
 | 
					  you-can-include-hashtags: "해시 태그를 포함할 수 있습니다."
 | 
				
			||||||
  language: "언어"
 | 
					  language: "언어"
 | 
				
			||||||
  birthday: "생일"
 | 
					  birthday: "생일"
 | 
				
			||||||
  avatar: "아바타"
 | 
					  avatar: "아바타"
 | 
				
			||||||
@@ -501,6 +509,13 @@ common/views/components/profile-editor.vue:
 | 
				
			|||||||
  email-address: "메일 주소"
 | 
					  email-address: "메일 주소"
 | 
				
			||||||
  email-verified: "매일 주소가 확인되었습니다"
 | 
					  email-verified: "매일 주소가 확인되었습니다"
 | 
				
			||||||
  email-not-verified: "메일 주소가 확인되지 않았습니다. 받은 편지함을 확인하여 주시기 바랍니다."
 | 
					  email-not-verified: "메일 주소가 확인되지 않았습니다. 받은 편지함을 확인하여 주시기 바랍니다."
 | 
				
			||||||
 | 
					  export: "エクスポート"
 | 
				
			||||||
 | 
					  export-targets:
 | 
				
			||||||
 | 
					    all-notes: "すべての投稿データ"
 | 
				
			||||||
 | 
					    following-list: "フォロー"
 | 
				
			||||||
 | 
					    mute-list: "ミュート"
 | 
				
			||||||
 | 
					    blocking-list: "ブロック"
 | 
				
			||||||
 | 
					  export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
 | 
				
			||||||
common/views/components/user-list-editor.vue:
 | 
					common/views/components/user-list-editor.vue:
 | 
				
			||||||
  users: "사용자"
 | 
					  users: "사용자"
 | 
				
			||||||
  rename: "리스트 이름 바꾸기"
 | 
					  rename: "리스트 이름 바꾸기"
 | 
				
			||||||
@@ -593,7 +608,7 @@ desktop/views/components/calendar.vue:
 | 
				
			|||||||
  title: "{year}년 {month}월"
 | 
					  title: "{year}년 {month}월"
 | 
				
			||||||
  prev: "이전 달"
 | 
					  prev: "이전 달"
 | 
				
			||||||
  next: "다음 달"
 | 
					  next: "다음 달"
 | 
				
			||||||
  go: "클릭 하 여 시간 회귀"
 | 
					  go: "클릭하여 시간역행"
 | 
				
			||||||
desktop/views/components/choose-file-from-drive-window.vue:
 | 
					desktop/views/components/choose-file-from-drive-window.vue:
 | 
				
			||||||
  chosen-files: "{count} 파일 선택중"
 | 
					  chosen-files: "{count} 파일 선택중"
 | 
				
			||||||
  upload: "PC에서 드라이브에 파일을 업로드"
 | 
					  upload: "PC에서 드라이브에 파일을 업로드"
 | 
				
			||||||
@@ -658,9 +673,6 @@ desktop/views/components/drive.vue:
 | 
				
			|||||||
    create-folder: "폴더 만들기"
 | 
					    create-folder: "폴더 만들기"
 | 
				
			||||||
    upload: "파일 업로드"
 | 
					    upload: "파일 업로드"
 | 
				
			||||||
    url-upload: "URL에서 업로드"
 | 
					    url-upload: "URL에서 업로드"
 | 
				
			||||||
desktop/views/components/media-image.vue:
 | 
					 | 
				
			||||||
  sensitive: "열람주의"
 | 
					 | 
				
			||||||
  click-to-show: "클릭하여 표시"
 | 
					 | 
				
			||||||
desktop/views/components/media-video.vue:
 | 
					desktop/views/components/media-video.vue:
 | 
				
			||||||
  sensitive: "열람주의"
 | 
					  sensitive: "열람주의"
 | 
				
			||||||
  click-to-show: "클릭하여 표시"
 | 
					  click-to-show: "클릭하여 표시"
 | 
				
			||||||
@@ -788,8 +800,8 @@ desktop/views/components/settings.vue:
 | 
				
			|||||||
  auto-popout-desc: "창이 열릴 때 팝아웃 (브라우저 밖으로 분리) 이 가능한 경우 자동으로 팝아웃합니다. 이 설정은 브라우저에 저장됩니다."
 | 
					  auto-popout-desc: "창이 열릴 때 팝아웃 (브라우저 밖으로 분리) 이 가능한 경우 자동으로 팝아웃합니다. 이 설정은 브라우저에 저장됩니다."
 | 
				
			||||||
  deck-nav: "덱 내 탐색"
 | 
					  deck-nav: "덱 내 탐색"
 | 
				
			||||||
  deck-nav-desc: "덱을 사용중일 때, 내비게이션이 발생하였을 경우 페이지를 이동하지 않고 일시적으로 임시 칼럼을 생성하도록 합니다."
 | 
					  deck-nav-desc: "덱을 사용중일 때, 내비게이션이 발생하였을 경우 페이지를 이동하지 않고 일시적으로 임시 칼럼을 생성하도록 합니다."
 | 
				
			||||||
  keep-cw: "CW保持"
 | 
					  keep-cw: "CW 유지"
 | 
				
			||||||
  keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。"
 | 
					  keep-cw-desc: "글에 답글을 달 때, 답글할 글에 CW가 설정되어 있는 경우 기본값으로 동일한 CW를 설정하도록 합니다."
 | 
				
			||||||
  deck-default: "덱을 기본 UI로 설정"
 | 
					  deck-default: "덱을 기본 UI로 설정"
 | 
				
			||||||
  display: "디자인 및 표시"
 | 
					  display: "디자인 및 표시"
 | 
				
			||||||
  customize: "홈 커스터마이징"
 | 
					  customize: "홈 커스터마이징"
 | 
				
			||||||
@@ -875,6 +887,9 @@ desktop/views/components/settings.2fa.vue:
 | 
				
			|||||||
  success: "설정이 완료되었습니다!"
 | 
					  success: "설정이 완료되었습니다!"
 | 
				
			||||||
  failed: "설정에 실패했습니다. 토큰이 잘못되었는지 확인해주십시오."
 | 
					  failed: "설정에 실패했습니다. 토큰이 잘못되었는지 확인해주십시오."
 | 
				
			||||||
  info: "다음 로그인부터는 이와 동일하게 비밀번호에 더해 장치에 표시된 토큰을 입력합니다."
 | 
					  info: "다음 로그인부터는 이와 동일하게 비밀번호에 더해 장치에 표시된 토큰을 입력합니다."
 | 
				
			||||||
 | 
					common/views/components/media-image.vue:
 | 
				
			||||||
 | 
					  sensitive: "열람주의"
 | 
				
			||||||
 | 
					  click-to-show: "클릭하여 보기"
 | 
				
			||||||
common/views/components/api-settings.vue:
 | 
					common/views/components/api-settings.vue:
 | 
				
			||||||
  intro: "API를 사용하려면 위의 토큰을 \"i\" 라는 키의 값으로 매개변수를 추가하여 요청합니다."
 | 
					  intro: "API를 사용하려면 위의 토큰을 \"i\" 라는 키의 값으로 매개변수를 추가하여 요청합니다."
 | 
				
			||||||
  caution: "계정을 부정 사용할 가능성이 있으므로, 이 토큰은 제 3자에게 알려주지 마십시오 (앱 등에 붙여넣지 마십시오)."
 | 
					  caution: "계정을 부정 사용할 가능성이 있으므로, 이 토큰은 제 3자에게 알려주지 마십시오 (앱 등에 붙여넣지 마십시오)."
 | 
				
			||||||
@@ -992,6 +1007,7 @@ admin/views/index.vue:
 | 
				
			|||||||
  announcements: "공지사항"
 | 
					  announcements: "공지사항"
 | 
				
			||||||
  hashtags: "해시태그"
 | 
					  hashtags: "해시태그"
 | 
				
			||||||
  abuse: "스팸 신고"
 | 
					  abuse: "스팸 신고"
 | 
				
			||||||
 | 
					  queue: "ジョブキュー"
 | 
				
			||||||
  back-to-misskey: "Misskey로 돌아가기"
 | 
					  back-to-misskey: "Misskey로 돌아가기"
 | 
				
			||||||
admin/views/dashboard.vue:
 | 
					admin/views/dashboard.vue:
 | 
				
			||||||
  dashboard: "대시보드"
 | 
					  dashboard: "대시보드"
 | 
				
			||||||
@@ -1001,6 +1017,9 @@ admin/views/dashboard.vue:
 | 
				
			|||||||
  instances: "인스턴스"
 | 
					  instances: "인스턴스"
 | 
				
			||||||
  this-instance: "이 인스턴스"
 | 
					  this-instance: "이 인스턴스"
 | 
				
			||||||
  federated: "연합"
 | 
					  federated: "연합"
 | 
				
			||||||
 | 
					admin/views/queue.vue:
 | 
				
			||||||
 | 
					  operation: "操作"
 | 
				
			||||||
 | 
					  remove-all-jobs: "すべてのジョブをクリア"
 | 
				
			||||||
admin/views/abuse.vue:
 | 
					admin/views/abuse.vue:
 | 
				
			||||||
  title: "스팸 신고"
 | 
					  title: "스팸 신고"
 | 
				
			||||||
  target: "대상"
 | 
					  target: "대상"
 | 
				
			||||||
@@ -1065,7 +1084,7 @@ admin/views/instance.vue:
 | 
				
			|||||||
  external-user-recommendation-timeout: "타임 아웃"
 | 
					  external-user-recommendation-timeout: "타임 아웃"
 | 
				
			||||||
  external-user-recommendation-timeout-desc: "밀리초 (예: 300000)"
 | 
					  external-user-recommendation-timeout-desc: "밀리초 (예: 300000)"
 | 
				
			||||||
  email-config: "메일 서버 설정"
 | 
					  email-config: "메일 서버 설정"
 | 
				
			||||||
  email-config-info: "메일 주소 확인 혹은 암호 재설정에 사용 됩니다."
 | 
					  email-config-info: "메일 주소 확인 혹은 비밀번호 재설정에 사용 됩니다."
 | 
				
			||||||
  enable-email: "메일 발신 활성화"
 | 
					  enable-email: "메일 발신 활성화"
 | 
				
			||||||
  email: "메일 주소"
 | 
					  email: "메일 주소"
 | 
				
			||||||
  smtp-secure: "SMTP 연결에 암시적으로 SSL/TLS를 사용"
 | 
					  smtp-secure: "SMTP 연결에 암시적으로 SSL/TLS를 사용"
 | 
				
			||||||
@@ -1133,23 +1152,25 @@ admin/views/users.vue:
 | 
				
			|||||||
  username-or-userid: "사용자명 혹은 사용자 ID"
 | 
					  username-or-userid: "사용자명 혹은 사용자 ID"
 | 
				
			||||||
  user-not-found: "사용자를 찾을 수 없습니다"
 | 
					  user-not-found: "사용자를 찾을 수 없습니다"
 | 
				
			||||||
  lookup: "조회"
 | 
					  lookup: "조회"
 | 
				
			||||||
  reset-password: "암호 재설정"
 | 
					  reset-password: "비밀번호 재설정"
 | 
				
			||||||
  reset-password-confirm: "パスワードをリセットしますか?"
 | 
					  reset-password-confirm: "비밀번호를 재설정하시겠습니까?"
 | 
				
			||||||
  password-updated: "암호는 현재 \"{password}\" 입니다"
 | 
					  password-updated: "비밀번호는 현재 \"{password}\" 입니다"
 | 
				
			||||||
  suspend: "정지"
 | 
					  suspend: "정지"
 | 
				
			||||||
  suspend-confirm: "凍結しますか?"
 | 
					  suspend-confirm: "정지하시겠습니까?"
 | 
				
			||||||
  suspended: "정지하였습니다"
 | 
					  suspended: "정지하였습니다"
 | 
				
			||||||
  unsuspend: "정지 해제"
 | 
					  unsuspend: "정지 해제"
 | 
				
			||||||
  unsuspend-confirm: "凍結を解除しますか?"
 | 
					  unsuspend-confirm: "정지를 해제하시겠습니까?"
 | 
				
			||||||
  unsuspended: "정지를 해제하였습니다"
 | 
					  unsuspended: "정지를 해제하였습니다"
 | 
				
			||||||
 | 
					  make-silence: "침묵"
 | 
				
			||||||
 | 
					  unmake-silence: "침묵 해제"
 | 
				
			||||||
  verify: "공식 계정으로 설정"
 | 
					  verify: "공식 계정으로 설정"
 | 
				
			||||||
  verify-confirm: "公式アカウントにしますか?"
 | 
					  verify-confirm: "공식 계정으로 설정하시겠습니까?"
 | 
				
			||||||
  verified: "공식 계정으로 설정하였습니다"
 | 
					  verified: "공식 계정으로 설정하였습니다"
 | 
				
			||||||
  unverify: "공식 계정 해제"
 | 
					  unverify: "공식 계정 해제"
 | 
				
			||||||
  unverify-confirm: "公式アカウントを解除しますか?"
 | 
					  unverify-confirm: "공식 계정을 해제하시겠습니까?"
 | 
				
			||||||
  unverified: "공식 계정을 해제하였습니다"
 | 
					  unverified: "공식 계정을 해제하였습니다"
 | 
				
			||||||
  update-remote-user: "リモートユーザー情報の更新"
 | 
					  update-remote-user: "원격 사용자 정보 갱신"
 | 
				
			||||||
  remote-user-updated: "リモートユーザー情報を更新しました"
 | 
					  remote-user-updated: "원격 사용자 정보를 갱신하였습니다"
 | 
				
			||||||
  users:
 | 
					  users:
 | 
				
			||||||
    title: "사용자"
 | 
					    title: "사용자"
 | 
				
			||||||
    sort:
 | 
					    sort:
 | 
				
			||||||
@@ -1329,9 +1350,6 @@ mobile/views/components/drive.file-detail.vue:
 | 
				
			|||||||
  nsfw: "열람주의"
 | 
					  nsfw: "열람주의"
 | 
				
			||||||
  mark-as-sensitive: "열람주의로 설정"
 | 
					  mark-as-sensitive: "열람주의로 설정"
 | 
				
			||||||
  unmark-as-sensitive: "열람주의 해제"
 | 
					  unmark-as-sensitive: "열람주의 해제"
 | 
				
			||||||
mobile/views/components/media-image.vue:
 | 
					 | 
				
			||||||
  sensitive: "열람주의"
 | 
					 | 
				
			||||||
  click-to-show: "클릭하여 표시"
 | 
					 | 
				
			||||||
mobile/views/components/media-video.vue:
 | 
					mobile/views/components/media-video.vue:
 | 
				
			||||||
  sensitive: "열람주의"
 | 
					  sensitive: "열람주의"
 | 
				
			||||||
  click-to-show: "클릭하여 표시"
 | 
					  click-to-show: "클릭하여 표시"
 | 
				
			||||||
@@ -1476,7 +1494,7 @@ mobile/views/pages/settings.vue:
 | 
				
			|||||||
  notification-position-top: "위"
 | 
					  notification-position-top: "위"
 | 
				
			||||||
  behavior: "동작"
 | 
					  behavior: "동작"
 | 
				
			||||||
  fetch-on-scroll: "스크롤하여 자동으로 불러오기"
 | 
					  fetch-on-scroll: "스크롤하여 자동으로 불러오기"
 | 
				
			||||||
  keep-cw: "CW保持"
 | 
					  keep-cw: "CW 유지"
 | 
				
			||||||
  note-visibility: "게시물의 공개 범위"
 | 
					  note-visibility: "게시물의 공개 범위"
 | 
				
			||||||
  default-note-visibility: "기본 공개 범위"
 | 
					  default-note-visibility: "기본 공개 범위"
 | 
				
			||||||
  remember-note-visibility: "글의 공개 범위를 기억하기"
 | 
					  remember-note-visibility: "글의 공개 범위를 기억하기"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -113,6 +113,7 @@ common:
 | 
				
			|||||||
  use-avatar-reversi-stones: "リバーシの石にアバターを使う"
 | 
					  use-avatar-reversi-stones: "リバーシの石にアバターを使う"
 | 
				
			||||||
  verified-user: "公式アカウント"
 | 
					  verified-user: "公式アカウント"
 | 
				
			||||||
  disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
 | 
					  disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
 | 
				
			||||||
 | 
					  disable-showing-animated-images: "アニメーション画像を再生しない"
 | 
				
			||||||
  suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
 | 
					  suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
 | 
				
			||||||
  always-show-nsfw: "常に閲覧注意のメディアを表示する"
 | 
					  always-show-nsfw: "常に閲覧注意のメディアを表示する"
 | 
				
			||||||
  always-mark-nsfw: "常にメディアを閲覧注意として投稿"
 | 
					  always-mark-nsfw: "常にメディアを閲覧注意として投稿"
 | 
				
			||||||
@@ -129,7 +130,7 @@ common:
 | 
				
			|||||||
  show-password: "パスワードを表示する"
 | 
					  show-password: "パスワードを表示する"
 | 
				
			||||||
  do-not-use-in-production: "これは開発ビルドです。本番環境で使用しないでください。"
 | 
					  do-not-use-in-production: "これは開発ビルドです。本番環境で使用しないでください。"
 | 
				
			||||||
  user-suspended: "このユーザーは凍結されています。"
 | 
					  user-suspended: "このユーザーは凍結されています。"
 | 
				
			||||||
  is-remote-user: "このユーザー情報はコピーです。"
 | 
					  is-remote-user: "このユーザー情報は不正確な可能性があります。"
 | 
				
			||||||
  is-remote-post: "この投稿情報はコピーです。"
 | 
					  is-remote-post: "この投稿情報はコピーです。"
 | 
				
			||||||
  view-on-remote: "正確な情報を見る"
 | 
					  view-on-remote: "正確な情報を見る"
 | 
				
			||||||
  renoted-by: "{user}がRenote"
 | 
					  renoted-by: "{user}がRenote"
 | 
				
			||||||
@@ -344,6 +345,8 @@ common/views/components/note-menu.vue:
 | 
				
			|||||||
  copy-link: "リンクをコピー"
 | 
					  copy-link: "リンクをコピー"
 | 
				
			||||||
  favorite: "Deze notitie toevoegen aan favorieten"
 | 
					  favorite: "Deze notitie toevoegen aan favorieten"
 | 
				
			||||||
  unfavorite: "お気に入り解除"
 | 
					  unfavorite: "お気に入り解除"
 | 
				
			||||||
 | 
					  watch: "ウォッチ"
 | 
				
			||||||
 | 
					  unwatch: "ウォッチ解除"
 | 
				
			||||||
  pin: "Vastmaken aan profielpagina"
 | 
					  pin: "Vastmaken aan profielpagina"
 | 
				
			||||||
  unpin: "ピン留め解除"
 | 
					  unpin: "ピン留め解除"
 | 
				
			||||||
  delete: "削除"
 | 
					  delete: "削除"
 | 
				
			||||||
@@ -360,6 +363,10 @@ common/views/components/user-menu.vue:
 | 
				
			|||||||
  report-abuse: "スパムを報告"
 | 
					  report-abuse: "スパムを報告"
 | 
				
			||||||
  report-abuse-detail: "どのような迷惑行為を行っていますか?"
 | 
					  report-abuse-detail: "どのような迷惑行為を行っていますか?"
 | 
				
			||||||
  report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
 | 
					  report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
 | 
				
			||||||
 | 
					  silence: "サイレンス"
 | 
				
			||||||
 | 
					  unsilence: "サイレンス解除"
 | 
				
			||||||
 | 
					  suspend: "凍結"
 | 
				
			||||||
 | 
					  unsuspend: "凍結解除"
 | 
				
			||||||
common/views/components/poll.vue:
 | 
					common/views/components/poll.vue:
 | 
				
			||||||
  vote-to: "Stemmen op '{}'"
 | 
					  vote-to: "Stemmen op '{}'"
 | 
				
			||||||
  vote-count: "{} stemmen"
 | 
					  vote-count: "{} stemmen"
 | 
				
			||||||
@@ -482,6 +489,7 @@ common/views/components/profile-editor.vue:
 | 
				
			|||||||
  account: "アカウント"
 | 
					  account: "アカウント"
 | 
				
			||||||
  location: "場所"
 | 
					  location: "場所"
 | 
				
			||||||
  description: "自己紹介"
 | 
					  description: "自己紹介"
 | 
				
			||||||
 | 
					  you-can-include-hashtags: "ハッシュタグを含めることができます。"
 | 
				
			||||||
  language: "言語"
 | 
					  language: "言語"
 | 
				
			||||||
  birthday: "誕生日"
 | 
					  birthday: "誕生日"
 | 
				
			||||||
  avatar: "アイコン"
 | 
					  avatar: "アイコン"
 | 
				
			||||||
@@ -501,6 +509,13 @@ common/views/components/profile-editor.vue:
 | 
				
			|||||||
  email-address: "メールアドレス"
 | 
					  email-address: "メールアドレス"
 | 
				
			||||||
  email-verified: "メールアドレスが確認されました"
 | 
					  email-verified: "メールアドレスが確認されました"
 | 
				
			||||||
  email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
 | 
					  email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
 | 
				
			||||||
 | 
					  export: "エクスポート"
 | 
				
			||||||
 | 
					  export-targets:
 | 
				
			||||||
 | 
					    all-notes: "すべての投稿データ"
 | 
				
			||||||
 | 
					    following-list: "フォロー"
 | 
				
			||||||
 | 
					    mute-list: "ミュート"
 | 
				
			||||||
 | 
					    blocking-list: "ブロック"
 | 
				
			||||||
 | 
					  export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
 | 
				
			||||||
common/views/components/user-list-editor.vue:
 | 
					common/views/components/user-list-editor.vue:
 | 
				
			||||||
  users: "ユーザー"
 | 
					  users: "ユーザー"
 | 
				
			||||||
  rename: "リスト名を変更"
 | 
					  rename: "リスト名を変更"
 | 
				
			||||||
@@ -658,9 +673,6 @@ desktop/views/components/drive.vue:
 | 
				
			|||||||
    create-folder: "Map creëren"
 | 
					    create-folder: "Map creëren"
 | 
				
			||||||
    upload: "Bestand uploaden"
 | 
					    upload: "Bestand uploaden"
 | 
				
			||||||
    url-upload: "Uploaden via URL"
 | 
					    url-upload: "Uploaden via URL"
 | 
				
			||||||
desktop/views/components/media-image.vue:
 | 
					 | 
				
			||||||
  sensitive: "閲覧注意"
 | 
					 | 
				
			||||||
  click-to-show: "クリックして表示"
 | 
					 | 
				
			||||||
desktop/views/components/media-video.vue:
 | 
					desktop/views/components/media-video.vue:
 | 
				
			||||||
  sensitive: "閲覧注意"
 | 
					  sensitive: "閲覧注意"
 | 
				
			||||||
  click-to-show: "クリックして表示"
 | 
					  click-to-show: "クリックして表示"
 | 
				
			||||||
@@ -875,6 +887,9 @@ desktop/views/components/settings.2fa.vue:
 | 
				
			|||||||
  success: "Instellen voltooid!"
 | 
					  success: "Instellen voltooid!"
 | 
				
			||||||
  failed: "Instellen mislukt. Zorg ervoor dat de sleutel juist is."
 | 
					  failed: "Instellen mislukt. Zorg ervoor dat de sleutel juist is."
 | 
				
			||||||
  info: "Vanaf nu moet je ook de op je apparaat getoonde sleutel tonen bij het inloggen op Misskey."
 | 
					  info: "Vanaf nu moet je ook de op je apparaat getoonde sleutel tonen bij het inloggen op Misskey."
 | 
				
			||||||
 | 
					common/views/components/media-image.vue:
 | 
				
			||||||
 | 
					  sensitive: "閲覧注意"
 | 
				
			||||||
 | 
					  click-to-show: "クリックして表示"
 | 
				
			||||||
common/views/components/api-settings.vue:
 | 
					common/views/components/api-settings.vue:
 | 
				
			||||||
  intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
 | 
					  intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
 | 
				
			||||||
  caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
 | 
					  caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
 | 
				
			||||||
@@ -992,6 +1007,7 @@ admin/views/index.vue:
 | 
				
			|||||||
  announcements: "お知らせ"
 | 
					  announcements: "お知らせ"
 | 
				
			||||||
  hashtags: "ハッシュタグ"
 | 
					  hashtags: "ハッシュタグ"
 | 
				
			||||||
  abuse: "スパム報告"
 | 
					  abuse: "スパム報告"
 | 
				
			||||||
 | 
					  queue: "ジョブキュー"
 | 
				
			||||||
  back-to-misskey: "Misskeyに戻る"
 | 
					  back-to-misskey: "Misskeyに戻る"
 | 
				
			||||||
admin/views/dashboard.vue:
 | 
					admin/views/dashboard.vue:
 | 
				
			||||||
  dashboard: "ダッシュボード"
 | 
					  dashboard: "ダッシュボード"
 | 
				
			||||||
@@ -1001,6 +1017,9 @@ admin/views/dashboard.vue:
 | 
				
			|||||||
  instances: "インスタンス"
 | 
					  instances: "インスタンス"
 | 
				
			||||||
  this-instance: "このインスタンス"
 | 
					  this-instance: "このインスタンス"
 | 
				
			||||||
  federated: "連合"
 | 
					  federated: "連合"
 | 
				
			||||||
 | 
					admin/views/queue.vue:
 | 
				
			||||||
 | 
					  operation: "操作"
 | 
				
			||||||
 | 
					  remove-all-jobs: "すべてのジョブをクリア"
 | 
				
			||||||
admin/views/abuse.vue:
 | 
					admin/views/abuse.vue:
 | 
				
			||||||
  title: "スパム報告"
 | 
					  title: "スパム報告"
 | 
				
			||||||
  target: "対象"
 | 
					  target: "対象"
 | 
				
			||||||
@@ -1142,6 +1161,8 @@ admin/views/users.vue:
 | 
				
			|||||||
  unsuspend: "凍結の解除"
 | 
					  unsuspend: "凍結の解除"
 | 
				
			||||||
  unsuspend-confirm: "凍結を解除しますか?"
 | 
					  unsuspend-confirm: "凍結を解除しますか?"
 | 
				
			||||||
  unsuspended: "凍結を解除しました"
 | 
					  unsuspended: "凍結を解除しました"
 | 
				
			||||||
 | 
					  make-silence: "サイレンス"
 | 
				
			||||||
 | 
					  unmake-silence: "サイレンスの解除"
 | 
				
			||||||
  verify: "公式アカウントにする"
 | 
					  verify: "公式アカウントにする"
 | 
				
			||||||
  verify-confirm: "公式アカウントにしますか?"
 | 
					  verify-confirm: "公式アカウントにしますか?"
 | 
				
			||||||
  verified: "公式アカウントにしました"
 | 
					  verified: "公式アカウントにしました"
 | 
				
			||||||
@@ -1329,9 +1350,6 @@ mobile/views/components/drive.file-detail.vue:
 | 
				
			|||||||
  nsfw: "閲覧注意"
 | 
					  nsfw: "閲覧注意"
 | 
				
			||||||
  mark-as-sensitive: "閲覧注意に設定"
 | 
					  mark-as-sensitive: "閲覧注意に設定"
 | 
				
			||||||
  unmark-as-sensitive: "閲覧注意を解除"
 | 
					  unmark-as-sensitive: "閲覧注意を解除"
 | 
				
			||||||
mobile/views/components/media-image.vue:
 | 
					 | 
				
			||||||
  sensitive: "閲覧注意"
 | 
					 | 
				
			||||||
  click-to-show: "クリックして表示"
 | 
					 | 
				
			||||||
mobile/views/components/media-video.vue:
 | 
					mobile/views/components/media-video.vue:
 | 
				
			||||||
  sensitive: "閲覧注意"
 | 
					  sensitive: "閲覧注意"
 | 
				
			||||||
  click-to-show: "クリックして表示"
 | 
					  click-to-show: "クリックして表示"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -113,6 +113,7 @@ common:
 | 
				
			|||||||
  use-avatar-reversi-stones: "リバーシの石にアバターを使う"
 | 
					  use-avatar-reversi-stones: "リバーシの石にアバターを使う"
 | 
				
			||||||
  verified-user: "公式アカウント"
 | 
					  verified-user: "公式アカウント"
 | 
				
			||||||
  disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
 | 
					  disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
 | 
				
			||||||
 | 
					  disable-showing-animated-images: "アニメーション画像を再生しない"
 | 
				
			||||||
  suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
 | 
					  suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
 | 
				
			||||||
  always-show-nsfw: "常に閲覧注意のメディアを表示する"
 | 
					  always-show-nsfw: "常に閲覧注意のメディアを表示する"
 | 
				
			||||||
  always-mark-nsfw: "常にメディアを閲覧注意として投稿"
 | 
					  always-mark-nsfw: "常にメディアを閲覧注意として投稿"
 | 
				
			||||||
@@ -129,7 +130,7 @@ common:
 | 
				
			|||||||
  show-password: "パスワードを表示する"
 | 
					  show-password: "パスワードを表示する"
 | 
				
			||||||
  do-not-use-in-production: "これは開発ビルドです。本番環境で使用しないでください。"
 | 
					  do-not-use-in-production: "これは開発ビルドです。本番環境で使用しないでください。"
 | 
				
			||||||
  user-suspended: "このユーザーは凍結されています。"
 | 
					  user-suspended: "このユーザーは凍結されています。"
 | 
				
			||||||
  is-remote-user: "このユーザー情報はコピーです。"
 | 
					  is-remote-user: "このユーザー情報は不正確な可能性があります。"
 | 
				
			||||||
  is-remote-post: "この投稿情報はコピーです。"
 | 
					  is-remote-post: "この投稿情報はコピーです。"
 | 
				
			||||||
  view-on-remote: "正確な情報を見る"
 | 
					  view-on-remote: "正確な情報を見る"
 | 
				
			||||||
  renoted-by: "{user}がRenote"
 | 
					  renoted-by: "{user}がRenote"
 | 
				
			||||||
@@ -344,6 +345,8 @@ common/views/components/note-menu.vue:
 | 
				
			|||||||
  copy-link: "リンクをコピー"
 | 
					  copy-link: "リンクをコピー"
 | 
				
			||||||
  favorite: "Merket som favoritt"
 | 
					  favorite: "Merket som favoritt"
 | 
				
			||||||
  unfavorite: "お気に入り解除"
 | 
					  unfavorite: "お気に入り解除"
 | 
				
			||||||
 | 
					  watch: "ウォッチ"
 | 
				
			||||||
 | 
					  unwatch: "ウォッチ解除"
 | 
				
			||||||
  pin: "Fest til profilen din"
 | 
					  pin: "Fest til profilen din"
 | 
				
			||||||
  unpin: "ピン留め解除"
 | 
					  unpin: "ピン留め解除"
 | 
				
			||||||
  delete: "Slett"
 | 
					  delete: "Slett"
 | 
				
			||||||
@@ -360,6 +363,10 @@ common/views/components/user-menu.vue:
 | 
				
			|||||||
  report-abuse: "スパムを報告"
 | 
					  report-abuse: "スパムを報告"
 | 
				
			||||||
  report-abuse-detail: "どのような迷惑行為を行っていますか?"
 | 
					  report-abuse-detail: "どのような迷惑行為を行っていますか?"
 | 
				
			||||||
  report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
 | 
					  report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
 | 
				
			||||||
 | 
					  silence: "サイレンス"
 | 
				
			||||||
 | 
					  unsilence: "サイレンス解除"
 | 
				
			||||||
 | 
					  suspend: "凍結"
 | 
				
			||||||
 | 
					  unsuspend: "凍結解除"
 | 
				
			||||||
common/views/components/poll.vue:
 | 
					common/views/components/poll.vue:
 | 
				
			||||||
  vote-to: "「{}」に投票する"
 | 
					  vote-to: "「{}」に投票する"
 | 
				
			||||||
  vote-count: "{} stemmer"
 | 
					  vote-count: "{} stemmer"
 | 
				
			||||||
@@ -482,6 +489,7 @@ common/views/components/profile-editor.vue:
 | 
				
			|||||||
  account: "アカウント"
 | 
					  account: "アカウント"
 | 
				
			||||||
  location: "場所"
 | 
					  location: "場所"
 | 
				
			||||||
  description: "自己紹介"
 | 
					  description: "自己紹介"
 | 
				
			||||||
 | 
					  you-can-include-hashtags: "ハッシュタグを含めることができます。"
 | 
				
			||||||
  language: "言語"
 | 
					  language: "言語"
 | 
				
			||||||
  birthday: "誕生日"
 | 
					  birthday: "誕生日"
 | 
				
			||||||
  avatar: "アイコン"
 | 
					  avatar: "アイコン"
 | 
				
			||||||
@@ -501,6 +509,13 @@ common/views/components/profile-editor.vue:
 | 
				
			|||||||
  email-address: "メールアドレス"
 | 
					  email-address: "メールアドレス"
 | 
				
			||||||
  email-verified: "メールアドレスが確認されました"
 | 
					  email-verified: "メールアドレスが確認されました"
 | 
				
			||||||
  email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
 | 
					  email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
 | 
				
			||||||
 | 
					  export: "エクスポート"
 | 
				
			||||||
 | 
					  export-targets:
 | 
				
			||||||
 | 
					    all-notes: "すべての投稿データ"
 | 
				
			||||||
 | 
					    following-list: "フォロー"
 | 
				
			||||||
 | 
					    mute-list: "ミュート"
 | 
				
			||||||
 | 
					    blocking-list: "ブロック"
 | 
				
			||||||
 | 
					  export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
 | 
				
			||||||
common/views/components/user-list-editor.vue:
 | 
					common/views/components/user-list-editor.vue:
 | 
				
			||||||
  users: "ユーザー"
 | 
					  users: "ユーザー"
 | 
				
			||||||
  rename: "リスト名を変更"
 | 
					  rename: "リスト名を変更"
 | 
				
			||||||
@@ -658,9 +673,6 @@ desktop/views/components/drive.vue:
 | 
				
			|||||||
    create-folder: "フォルダーを作成"
 | 
					    create-folder: "フォルダーを作成"
 | 
				
			||||||
    upload: "ファイルをアップロード"
 | 
					    upload: "ファイルをアップロード"
 | 
				
			||||||
    url-upload: "URLからアップロード"
 | 
					    url-upload: "URLからアップロード"
 | 
				
			||||||
desktop/views/components/media-image.vue:
 | 
					 | 
				
			||||||
  sensitive: "NSFW"
 | 
					 | 
				
			||||||
  click-to-show: "クリックして表示"
 | 
					 | 
				
			||||||
desktop/views/components/media-video.vue:
 | 
					desktop/views/components/media-video.vue:
 | 
				
			||||||
  sensitive: "Innholdet er NSFW"
 | 
					  sensitive: "Innholdet er NSFW"
 | 
				
			||||||
  click-to-show: "クリックして表示"
 | 
					  click-to-show: "クリックして表示"
 | 
				
			||||||
@@ -875,6 +887,9 @@ desktop/views/components/settings.2fa.vue:
 | 
				
			|||||||
  success: "設定が完了しました!"
 | 
					  success: "設定が完了しました!"
 | 
				
			||||||
  failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
 | 
					  failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
 | 
				
			||||||
  info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
 | 
					  info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
 | 
				
			||||||
 | 
					common/views/components/media-image.vue:
 | 
				
			||||||
 | 
					  sensitive: "閲覧注意"
 | 
				
			||||||
 | 
					  click-to-show: "クリックして表示"
 | 
				
			||||||
common/views/components/api-settings.vue:
 | 
					common/views/components/api-settings.vue:
 | 
				
			||||||
  intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
 | 
					  intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
 | 
				
			||||||
  caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
 | 
					  caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
 | 
				
			||||||
@@ -992,6 +1007,7 @@ admin/views/index.vue:
 | 
				
			|||||||
  announcements: "お知らせ"
 | 
					  announcements: "お知らせ"
 | 
				
			||||||
  hashtags: "ハッシュタグ"
 | 
					  hashtags: "ハッシュタグ"
 | 
				
			||||||
  abuse: "スパム報告"
 | 
					  abuse: "スパム報告"
 | 
				
			||||||
 | 
					  queue: "ジョブキュー"
 | 
				
			||||||
  back-to-misskey: "Misskeyに戻る"
 | 
					  back-to-misskey: "Misskeyに戻る"
 | 
				
			||||||
admin/views/dashboard.vue:
 | 
					admin/views/dashboard.vue:
 | 
				
			||||||
  dashboard: "ダッシュボード"
 | 
					  dashboard: "ダッシュボード"
 | 
				
			||||||
@@ -1001,6 +1017,9 @@ admin/views/dashboard.vue:
 | 
				
			|||||||
  instances: "インスタンス"
 | 
					  instances: "インスタンス"
 | 
				
			||||||
  this-instance: "このインスタンス"
 | 
					  this-instance: "このインスタンス"
 | 
				
			||||||
  federated: "連合"
 | 
					  federated: "連合"
 | 
				
			||||||
 | 
					admin/views/queue.vue:
 | 
				
			||||||
 | 
					  operation: "操作"
 | 
				
			||||||
 | 
					  remove-all-jobs: "すべてのジョブをクリア"
 | 
				
			||||||
admin/views/abuse.vue:
 | 
					admin/views/abuse.vue:
 | 
				
			||||||
  title: "スパム報告"
 | 
					  title: "スパム報告"
 | 
				
			||||||
  target: "対象"
 | 
					  target: "対象"
 | 
				
			||||||
@@ -1142,6 +1161,8 @@ admin/views/users.vue:
 | 
				
			|||||||
  unsuspend: "凍結の解除"
 | 
					  unsuspend: "凍結の解除"
 | 
				
			||||||
  unsuspend-confirm: "凍結を解除しますか?"
 | 
					  unsuspend-confirm: "凍結を解除しますか?"
 | 
				
			||||||
  unsuspended: "凍結を解除しました"
 | 
					  unsuspended: "凍結を解除しました"
 | 
				
			||||||
 | 
					  make-silence: "サイレンス"
 | 
				
			||||||
 | 
					  unmake-silence: "サイレンスの解除"
 | 
				
			||||||
  verify: "公式アカウントにする"
 | 
					  verify: "公式アカウントにする"
 | 
				
			||||||
  verify-confirm: "公式アカウントにしますか?"
 | 
					  verify-confirm: "公式アカウントにしますか?"
 | 
				
			||||||
  verified: "公式アカウントにしました"
 | 
					  verified: "公式アカウントにしました"
 | 
				
			||||||
@@ -1329,9 +1350,6 @@ mobile/views/components/drive.file-detail.vue:
 | 
				
			|||||||
  nsfw: "NSFW"
 | 
					  nsfw: "NSFW"
 | 
				
			||||||
  mark-as-sensitive: "閲覧注意に設定"
 | 
					  mark-as-sensitive: "閲覧注意に設定"
 | 
				
			||||||
  unmark-as-sensitive: "閲覧注意を解除"
 | 
					  unmark-as-sensitive: "閲覧注意を解除"
 | 
				
			||||||
mobile/views/components/media-image.vue:
 | 
					 | 
				
			||||||
  sensitive: "NSFW"
 | 
					 | 
				
			||||||
  click-to-show: "クリックして表示"
 | 
					 | 
				
			||||||
mobile/views/components/media-video.vue:
 | 
					mobile/views/components/media-video.vue:
 | 
				
			||||||
  sensitive: "Innholdet er NSFW"
 | 
					  sensitive: "Innholdet er NSFW"
 | 
				
			||||||
  click-to-show: "クリックして表示"
 | 
					  click-to-show: "クリックして表示"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,7 +27,7 @@ common:
 | 
				
			|||||||
  do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
 | 
					  do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
 | 
				
			||||||
  load-more: "Załaduj więcej"
 | 
					  load-more: "Załaduj więcej"
 | 
				
			||||||
  enter-password: "Wprowadź Hasło"
 | 
					  enter-password: "Wprowadź Hasło"
 | 
				
			||||||
  2fa: "二段階認証"
 | 
					  2fa: "Uwierzytelnienie dwuetapowe"
 | 
				
			||||||
  got-it: "Rozumiem!"
 | 
					  got-it: "Rozumiem!"
 | 
				
			||||||
  customization-tips:
 | 
					  customization-tips:
 | 
				
			||||||
    title: "Wskazówki o dostosowywaniu"
 | 
					    title: "Wskazówki o dostosowywaniu"
 | 
				
			||||||
@@ -113,6 +113,7 @@ common:
 | 
				
			|||||||
  use-avatar-reversi-stones: "リバーシの石にアバターを使う"
 | 
					  use-avatar-reversi-stones: "リバーシの石にアバターを使う"
 | 
				
			||||||
  verified-user: "Zweryfikowane konto"
 | 
					  verified-user: "Zweryfikowane konto"
 | 
				
			||||||
  disable-animated-mfm: "Wyłącz animowany tekst we wpisach"
 | 
					  disable-animated-mfm: "Wyłącz animowany tekst we wpisach"
 | 
				
			||||||
 | 
					  disable-showing-animated-images: "アニメーション画像を再生しない"
 | 
				
			||||||
  suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
 | 
					  suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
 | 
				
			||||||
  always-show-nsfw: "Zawszę pokazuj zawartość NSFW"
 | 
					  always-show-nsfw: "Zawszę pokazuj zawartość NSFW"
 | 
				
			||||||
  always-mark-nsfw: "Zawsze oznaczaj posty z multimediami jako NSFW"
 | 
					  always-mark-nsfw: "Zawsze oznaczaj posty z multimediami jako NSFW"
 | 
				
			||||||
@@ -129,7 +130,7 @@ common:
 | 
				
			|||||||
  show-password: "Pokaż hasło"
 | 
					  show-password: "Pokaż hasło"
 | 
				
			||||||
  do-not-use-in-production: "これは開発ビルドです。本番環境で使用しないでください。"
 | 
					  do-not-use-in-production: "これは開発ビルドです。本番環境で使用しないでください。"
 | 
				
			||||||
  user-suspended: "このユーザーは凍結されています。"
 | 
					  user-suspended: "このユーザーは凍結されています。"
 | 
				
			||||||
  is-remote-user: "Informacje o użytkowniku są kopiowane."
 | 
					  is-remote-user: "このユーザー情報は不正確な可能性があります。"
 | 
				
			||||||
  is-remote-post: "この投稿情報はコピーです。"
 | 
					  is-remote-post: "この投稿情報はコピーです。"
 | 
				
			||||||
  view-on-remote: "Dla dopełnienia, zobacz to zdalnie."
 | 
					  view-on-remote: "Dla dopełnienia, zobacz to zdalnie."
 | 
				
			||||||
  renoted-by: "{user} udostępnił(a)"
 | 
					  renoted-by: "{user} udostępnił(a)"
 | 
				
			||||||
@@ -344,22 +345,28 @@ common/views/components/note-menu.vue:
 | 
				
			|||||||
  copy-link: "Skopiuj adres"
 | 
					  copy-link: "Skopiuj adres"
 | 
				
			||||||
  favorite: "Dodaj do ulubionych"
 | 
					  favorite: "Dodaj do ulubionych"
 | 
				
			||||||
  unfavorite: "Usuń z ulubionych"
 | 
					  unfavorite: "Usuń z ulubionych"
 | 
				
			||||||
 | 
					  watch: "ウォッチ"
 | 
				
			||||||
 | 
					  unwatch: "ウォッチ解除"
 | 
				
			||||||
  pin: "Przypnij do profilu"
 | 
					  pin: "Przypnij do profilu"
 | 
				
			||||||
  unpin: "Odepnij"
 | 
					  unpin: "Odepnij"
 | 
				
			||||||
  delete: "Usuń"
 | 
					  delete: "Usuń"
 | 
				
			||||||
  delete-confirm: "Czy na pewno chcesz usunąć ten wpis?"
 | 
					  delete-confirm: "Czy na pewno chcesz usunąć ten wpis?"
 | 
				
			||||||
  remote: "Pokaż oryginał"
 | 
					  remote: "Pokaż oryginał"
 | 
				
			||||||
common/views/components/user-menu.vue:
 | 
					common/views/components/user-menu.vue:
 | 
				
			||||||
  mention: "メンション"
 | 
					  mention: "Wspomnij"
 | 
				
			||||||
  mute: "ミュート"
 | 
					  mute: "Wycisz"
 | 
				
			||||||
  unmute: "ミュート解除"
 | 
					  unmute: "Cofnij wyciszenie"
 | 
				
			||||||
  block: "ブロック"
 | 
					  block: "Zablokuj"
 | 
				
			||||||
  unblock: "ブロック解除"
 | 
					  unblock: "Odblokuj"
 | 
				
			||||||
  push-to-list: "リストに追加"
 | 
					  push-to-list: "Dodaj do listy"
 | 
				
			||||||
  select-list: "リストを選択してください"
 | 
					  select-list: "Wybierz listę"
 | 
				
			||||||
  report-abuse: "スパムを報告"
 | 
					  report-abuse: "Zgłoś nadużycie"
 | 
				
			||||||
  report-abuse-detail: "どのような迷惑行為を行っていますか?"
 | 
					  report-abuse-detail: "どのような迷惑行為を行っていますか?"
 | 
				
			||||||
  report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
 | 
					  report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
 | 
				
			||||||
 | 
					  silence: "サイレンス"
 | 
				
			||||||
 | 
					  unsilence: "サイレンス解除"
 | 
				
			||||||
 | 
					  suspend: "凍結"
 | 
				
			||||||
 | 
					  unsuspend: "凍結解除"
 | 
				
			||||||
common/views/components/poll.vue:
 | 
					common/views/components/poll.vue:
 | 
				
			||||||
  vote-to: "Zagłosuj na '{}'"
 | 
					  vote-to: "Zagłosuj na '{}'"
 | 
				
			||||||
  vote-count: "{} głosów"
 | 
					  vote-count: "{} głosów"
 | 
				
			||||||
@@ -391,11 +398,11 @@ common/views/components/signin.vue:
 | 
				
			|||||||
  token: "Token"
 | 
					  token: "Token"
 | 
				
			||||||
  signing-in: "Logowanie…"
 | 
					  signing-in: "Logowanie…"
 | 
				
			||||||
  signin: "Zaloguj"
 | 
					  signin: "Zaloguj"
 | 
				
			||||||
  or: "または"
 | 
					  or: "lub"
 | 
				
			||||||
  signin-with-twitter: "Zaloguj się za pomocą Twittera"
 | 
					  signin-with-twitter: "Zaloguj się za pomocą Twittera"
 | 
				
			||||||
  signin-with-github: "Zaloguj się za pomocą GitHuba"
 | 
					  signin-with-github: "Zaloguj się za pomocą GitHuba"
 | 
				
			||||||
  signin-with-discord: "Zaloguj się za pomocą Discorda"
 | 
					  signin-with-discord: "Zaloguj się za pomocą Discorda"
 | 
				
			||||||
  login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
 | 
					  login-failed: "Logowanie nie powiodło się. Upewnij się, że podałeś prawidłową nazwę użytkownika i hasło."
 | 
				
			||||||
common/views/components/signup.vue:
 | 
					common/views/components/signup.vue:
 | 
				
			||||||
  invitation-code: "Kod zaproszenia"
 | 
					  invitation-code: "Kod zaproszenia"
 | 
				
			||||||
  invitation-info: "招待コードをお持ちでない方は、<a href=\"{}\">管理者</a>までご連絡ください。"
 | 
					  invitation-info: "招待コードをお持ちでない方は、<a href=\"{}\">管理者</a>までご連絡ください。"
 | 
				
			||||||
@@ -468,13 +475,13 @@ common/views/components/visibility-chooser.vue:
 | 
				
			|||||||
  local-followers: "Dla śledzących (tylko lokalnie)"
 | 
					  local-followers: "Dla śledzących (tylko lokalnie)"
 | 
				
			||||||
common/views/components/trends.vue:
 | 
					common/views/components/trends.vue:
 | 
				
			||||||
  count: "{}人が投稿"
 | 
					  count: "{}人が投稿"
 | 
				
			||||||
  empty: "トレンドなし"
 | 
					  empty: "Brak popularnych hashtagów"
 | 
				
			||||||
common/views/components/language-settings.vue:
 | 
					common/views/components/language-settings.vue:
 | 
				
			||||||
  title: "Język"
 | 
					  title: "Język"
 | 
				
			||||||
  pick-language: "Wybierz język"
 | 
					  pick-language: "Wybierz język"
 | 
				
			||||||
  recommended: "Zalecane"
 | 
					  recommended: "Zalecane"
 | 
				
			||||||
  auto: "Automatyczny"
 | 
					  auto: "Automatyczny"
 | 
				
			||||||
  specify-language: "言語を指定"
 | 
					  specify-language: "Wybierz język"
 | 
				
			||||||
  info: "Musisz odświeżyć stronę, aby zmiany zostały uwzględnione."
 | 
					  info: "Musisz odświeżyć stronę, aby zmiany zostały uwzględnione."
 | 
				
			||||||
common/views/components/profile-editor.vue:
 | 
					common/views/components/profile-editor.vue:
 | 
				
			||||||
  title: "Twój profil"
 | 
					  title: "Twój profil"
 | 
				
			||||||
@@ -482,6 +489,7 @@ common/views/components/profile-editor.vue:
 | 
				
			|||||||
  account: "Konto"
 | 
					  account: "Konto"
 | 
				
			||||||
  location: "Lokalizacja"
 | 
					  location: "Lokalizacja"
 | 
				
			||||||
  description: "O mnie"
 | 
					  description: "O mnie"
 | 
				
			||||||
 | 
					  you-can-include-hashtags: "ハッシュタグを含めることができます。"
 | 
				
			||||||
  language: "Język"
 | 
					  language: "Język"
 | 
				
			||||||
  birthday: "Data urodzenia"
 | 
					  birthday: "Data urodzenia"
 | 
				
			||||||
  avatar: "Awatar"
 | 
					  avatar: "Awatar"
 | 
				
			||||||
@@ -499,15 +507,22 @@ common/views/components/profile-editor.vue:
 | 
				
			|||||||
  upload-failed: "Wysyłanie nie powiodło się"
 | 
					  upload-failed: "Wysyłanie nie powiodło się"
 | 
				
			||||||
  email: "Ustawienia e-mail"
 | 
					  email: "Ustawienia e-mail"
 | 
				
			||||||
  email-address: "Adres e-mail"
 | 
					  email-address: "Adres e-mail"
 | 
				
			||||||
  email-verified: "メールアドレスが確認されました"
 | 
					  email-verified: "Twój adres e-mail został zweryfikowany."
 | 
				
			||||||
  email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
 | 
					  email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
 | 
				
			||||||
 | 
					  export: "エクスポート"
 | 
				
			||||||
 | 
					  export-targets:
 | 
				
			||||||
 | 
					    all-notes: "すべての投稿データ"
 | 
				
			||||||
 | 
					    following-list: "フォロー"
 | 
				
			||||||
 | 
					    mute-list: "ミュート"
 | 
				
			||||||
 | 
					    blocking-list: "ブロック"
 | 
				
			||||||
 | 
					  export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
 | 
				
			||||||
common/views/components/user-list-editor.vue:
 | 
					common/views/components/user-list-editor.vue:
 | 
				
			||||||
  users: "Użytkownicy"
 | 
					  users: "Użytkownicy"
 | 
				
			||||||
  rename: "Zmień nazwę listy"
 | 
					  rename: "Zmień nazwę listy"
 | 
				
			||||||
  delete: "Usuń listę"
 | 
					  delete: "Usuń listę"
 | 
				
			||||||
  remove-user: "Usuń z tej listy"
 | 
					  remove-user: "Usuń z tej listy"
 | 
				
			||||||
  delete-are-you-sure: "リスト「$1」を削除しますか?"
 | 
					  delete-are-you-sure: "Usunąć listę \"$1\"?"
 | 
				
			||||||
  deleted: "削除しました"
 | 
					  deleted: "Usunięto"
 | 
				
			||||||
common/views/widgets/broadcast.vue:
 | 
					common/views/widgets/broadcast.vue:
 | 
				
			||||||
  fetching: "Sprawdzanie"
 | 
					  fetching: "Sprawdzanie"
 | 
				
			||||||
  no-broadcasts: "Brak transmisji"
 | 
					  no-broadcasts: "Brak transmisji"
 | 
				
			||||||
@@ -590,7 +605,7 @@ desktop/views/components/activity.vue:
 | 
				
			|||||||
  title: "Aktywność"
 | 
					  title: "Aktywność"
 | 
				
			||||||
  toggle: "Przełącz widok"
 | 
					  toggle: "Przełącz widok"
 | 
				
			||||||
desktop/views/components/calendar.vue:
 | 
					desktop/views/components/calendar.vue:
 | 
				
			||||||
  title: "{year}年 {month}月"
 | 
					  title: "{year} / {month}"
 | 
				
			||||||
  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ść"
 | 
				
			||||||
@@ -658,9 +673,6 @@ desktop/views/components/drive.vue:
 | 
				
			|||||||
    create-folder: "Utwórz katalog"
 | 
					    create-folder: "Utwórz katalog"
 | 
				
			||||||
    upload: "Wyślij plik"
 | 
					    upload: "Wyślij plik"
 | 
				
			||||||
    url-upload: "Wyślij z adresu URL"
 | 
					    url-upload: "Wyślij z adresu URL"
 | 
				
			||||||
desktop/views/components/media-image.vue:
 | 
					 | 
				
			||||||
  sensitive: "To jest zawartość NSFW"
 | 
					 | 
				
			||||||
  click-to-show: "Naciśnij aby wyświetlić"
 | 
					 | 
				
			||||||
desktop/views/components/media-video.vue:
 | 
					desktop/views/components/media-video.vue:
 | 
				
			||||||
  sensitive: "To jest zawartość NSFW"
 | 
					  sensitive: "To jest zawartość NSFW"
 | 
				
			||||||
  click-to-show: "Naciśnij aby wyświetlić"
 | 
					  click-to-show: "Naciśnij aby wyświetlić"
 | 
				
			||||||
@@ -704,7 +716,7 @@ desktop/views/components/note.vue:
 | 
				
			|||||||
  add-reaction: "Dodaj reakcję"
 | 
					  add-reaction: "Dodaj reakcję"
 | 
				
			||||||
  undo-reaction: "リアクション解除"
 | 
					  undo-reaction: "リアクション解除"
 | 
				
			||||||
  detail: "Szczegóły"
 | 
					  detail: "Szczegóły"
 | 
				
			||||||
  private: "この投稿は非公開です"
 | 
					  private: "Ten wpis jest prywatny"
 | 
				
			||||||
  deleted: "この投稿は削除されました"
 | 
					  deleted: "この投稿は削除されました"
 | 
				
			||||||
desktop/views/components/notes.vue:
 | 
					desktop/views/components/notes.vue:
 | 
				
			||||||
  error: "Ładowanie nie powiodło się."
 | 
					  error: "Ładowanie nie powiodło się."
 | 
				
			||||||
@@ -868,13 +880,16 @@ desktop/views/components/settings.2fa.vue:
 | 
				
			|||||||
  enter-password: "Wprowadź hasło"
 | 
					  enter-password: "Wprowadź hasło"
 | 
				
			||||||
  authenticator: "Na początek musisz zainstalować Google Authenticator na swoim urządzeniu:"
 | 
					  authenticator: "Na początek musisz zainstalować Google Authenticator na swoim urządzeniu:"
 | 
				
			||||||
  howtoinstall: "Jak zainstalować"
 | 
					  howtoinstall: "Jak zainstalować"
 | 
				
			||||||
  token: "トークン"
 | 
					  token: "Token"
 | 
				
			||||||
  scan: "Później, zeskanuje ten kod QR:"
 | 
					  scan: "Później, zeskanuje ten kod QR:"
 | 
				
			||||||
  done: "Wprowadź token wyświetlony na Twoim urządzeniu:"
 | 
					  done: "Wprowadź token wyświetlony na Twoim urządzeniu:"
 | 
				
			||||||
  submit: "Wyślij"
 | 
					  submit: "Wyślij"
 | 
				
			||||||
  success: "Pomyślnie ukończono konfigurację!"
 | 
					  success: "Pomyślnie ukończono konfigurację!"
 | 
				
			||||||
  failed: "Nie udało się skonfigurować uwierzytelniania dwuetapowego, upewnij się że wprowadziłeś prawidłowy token."
 | 
					  failed: "Nie udało się skonfigurować uwierzytelniania dwuetapowego, upewnij się że wprowadziłeś prawidłowy token."
 | 
				
			||||||
  info: "Od teraz, wprowadzaj token wyświetlany na urządzeniu przy każdym logowaniu do Misskey."
 | 
					  info: "Od teraz, wprowadzaj token wyświetlany na urządzeniu przy każdym logowaniu do Misskey."
 | 
				
			||||||
 | 
					common/views/components/media-image.vue:
 | 
				
			||||||
 | 
					  sensitive: "閲覧注意"
 | 
				
			||||||
 | 
					  click-to-show: "クリックして表示"
 | 
				
			||||||
common/views/components/api-settings.vue:
 | 
					common/views/components/api-settings.vue:
 | 
				
			||||||
  intro: "Aby uzyskać dostęp do API, ustaw ten token jako klucz 'i' parametrów żądań."
 | 
					  intro: "Aby uzyskać dostęp do API, ustaw ten token jako klucz 'i' parametrów żądań."
 | 
				
			||||||
  caution: "Nie pokazuj tego tokenu osobom trzecim (nie wprowadzaj go nigdzie indziej), aby konto nie trafiło w niepowołane ręce."
 | 
					  caution: "Nie pokazuj tego tokenu osobom trzecim (nie wprowadzaj go nigdzie indziej), aby konto nie trafiło w niepowołane ręce."
 | 
				
			||||||
@@ -992,6 +1007,7 @@ admin/views/index.vue:
 | 
				
			|||||||
  announcements: "Ogłoszenia"
 | 
					  announcements: "Ogłoszenia"
 | 
				
			||||||
  hashtags: "Hashtagi"
 | 
					  hashtags: "Hashtagi"
 | 
				
			||||||
  abuse: "スパム報告"
 | 
					  abuse: "スパム報告"
 | 
				
			||||||
 | 
					  queue: "ジョブキュー"
 | 
				
			||||||
  back-to-misskey: "Misskeyに戻る"
 | 
					  back-to-misskey: "Misskeyに戻る"
 | 
				
			||||||
admin/views/dashboard.vue:
 | 
					admin/views/dashboard.vue:
 | 
				
			||||||
  dashboard: "ダッシュボード"
 | 
					  dashboard: "ダッシュボード"
 | 
				
			||||||
@@ -1001,12 +1017,15 @@ admin/views/dashboard.vue:
 | 
				
			|||||||
  instances: "インスタンス"
 | 
					  instances: "インスタンス"
 | 
				
			||||||
  this-instance: "このインスタンス"
 | 
					  this-instance: "このインスタンス"
 | 
				
			||||||
  federated: "連合"
 | 
					  federated: "連合"
 | 
				
			||||||
 | 
					admin/views/queue.vue:
 | 
				
			||||||
 | 
					  operation: "操作"
 | 
				
			||||||
 | 
					  remove-all-jobs: "すべてのジョブをクリア"
 | 
				
			||||||
admin/views/abuse.vue:
 | 
					admin/views/abuse.vue:
 | 
				
			||||||
  title: "スパム報告"
 | 
					  title: "スパム報告"
 | 
				
			||||||
  target: "対象"
 | 
					  target: "対象"
 | 
				
			||||||
  reporter: "報告者"
 | 
					  reporter: "報告者"
 | 
				
			||||||
  details: "詳細"
 | 
					  details: "詳細"
 | 
				
			||||||
  remove-report: "削除"
 | 
					  remove-report: "Usuń"
 | 
				
			||||||
admin/views/instance.vue:
 | 
					admin/views/instance.vue:
 | 
				
			||||||
  instance: "インスタンス"
 | 
					  instance: "インスタンス"
 | 
				
			||||||
  instance-name: "インスタンス名"
 | 
					  instance-name: "インスタンス名"
 | 
				
			||||||
@@ -1142,6 +1161,8 @@ admin/views/users.vue:
 | 
				
			|||||||
  unsuspend: "凍結の解除"
 | 
					  unsuspend: "凍結の解除"
 | 
				
			||||||
  unsuspend-confirm: "凍結を解除しますか?"
 | 
					  unsuspend-confirm: "凍結を解除しますか?"
 | 
				
			||||||
  unsuspended: "凍結を解除しました"
 | 
					  unsuspended: "凍結を解除しました"
 | 
				
			||||||
 | 
					  make-silence: "サイレンス"
 | 
				
			||||||
 | 
					  unmake-silence: "サイレンスの解除"
 | 
				
			||||||
  verify: "公式アカウントにする"
 | 
					  verify: "公式アカウントにする"
 | 
				
			||||||
  verify-confirm: "公式アカウントにしますか?"
 | 
					  verify-confirm: "公式アカウントにしますか?"
 | 
				
			||||||
  verified: "公式アカウントにしました"
 | 
					  verified: "公式アカウントにしました"
 | 
				
			||||||
@@ -1261,7 +1282,7 @@ desktop/views/pages/user/user.photos.vue:
 | 
				
			|||||||
  no-photos: "Brak zdjęć"
 | 
					  no-photos: "Brak zdjęć"
 | 
				
			||||||
desktop/views/pages/user/user.profile.vue:
 | 
					desktop/views/pages/user/user.profile.vue:
 | 
				
			||||||
  follows-you: "Śledzi Cię"
 | 
					  follows-you: "Śledzi Cię"
 | 
				
			||||||
  menu: "メニュー"
 | 
					  menu: "Menu"
 | 
				
			||||||
desktop/views/pages/user/user.header.vue:
 | 
					desktop/views/pages/user/user.header.vue:
 | 
				
			||||||
  posts: "Wpisy"
 | 
					  posts: "Wpisy"
 | 
				
			||||||
  following: "Śledzeni"
 | 
					  following: "Śledzeni"
 | 
				
			||||||
@@ -1329,9 +1350,6 @@ mobile/views/components/drive.file-detail.vue:
 | 
				
			|||||||
  nsfw: "NSFW"
 | 
					  nsfw: "NSFW"
 | 
				
			||||||
  mark-as-sensitive: "閲覧注意に設定"
 | 
					  mark-as-sensitive: "閲覧注意に設定"
 | 
				
			||||||
  unmark-as-sensitive: "閲覧注意を解除"
 | 
					  unmark-as-sensitive: "閲覧注意を解除"
 | 
				
			||||||
mobile/views/components/media-image.vue:
 | 
					 | 
				
			||||||
  sensitive: "To jest zawartość NSFW"
 | 
					 | 
				
			||||||
  click-to-show: "Naciśnij aby wyświetlić"
 | 
					 | 
				
			||||||
mobile/views/components/media-video.vue:
 | 
					mobile/views/components/media-video.vue:
 | 
				
			||||||
  sensitive: "To jest zawartość NSFW"
 | 
					  sensitive: "To jest zawartość NSFW"
 | 
				
			||||||
  click-to-show: "Naciśnij aby wyświetlić"
 | 
					  click-to-show: "Naciśnij aby wyświetlić"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -113,6 +113,7 @@ common:
 | 
				
			|||||||
  use-avatar-reversi-stones: "リバーシの石にアバターを使う"
 | 
					  use-avatar-reversi-stones: "リバーシの石にアバターを使う"
 | 
				
			||||||
  verified-user: "Conta verificada"
 | 
					  verified-user: "Conta verificada"
 | 
				
			||||||
  disable-animated-mfm: "Desativar texto animado nas publicações"
 | 
					  disable-animated-mfm: "Desativar texto animado nas publicações"
 | 
				
			||||||
 | 
					  disable-showing-animated-images: "アニメーション画像を再生しない"
 | 
				
			||||||
  suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
 | 
					  suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
 | 
				
			||||||
  always-show-nsfw: "常に閲覧注意のメディアを表示する"
 | 
					  always-show-nsfw: "常に閲覧注意のメディアを表示する"
 | 
				
			||||||
  always-mark-nsfw: "常にメディアを閲覧注意として投稿"
 | 
					  always-mark-nsfw: "常にメディアを閲覧注意として投稿"
 | 
				
			||||||
@@ -129,7 +130,7 @@ common:
 | 
				
			|||||||
  show-password: "パスワードを表示する"
 | 
					  show-password: "パスワードを表示する"
 | 
				
			||||||
  do-not-use-in-production: "これは開発ビルドです。本番環境で使用しないでください。"
 | 
					  do-not-use-in-production: "これは開発ビルドです。本番環境で使用しないでください。"
 | 
				
			||||||
  user-suspended: "このユーザーは凍結されています。"
 | 
					  user-suspended: "このユーザーは凍結されています。"
 | 
				
			||||||
  is-remote-user: "このユーザー情報はコピーです。"
 | 
					  is-remote-user: "このユーザー情報は不正確な可能性があります。"
 | 
				
			||||||
  is-remote-post: "この投稿情報はコピーです。"
 | 
					  is-remote-post: "この投稿情報はコピーです。"
 | 
				
			||||||
  view-on-remote: "正確な情報を見る"
 | 
					  view-on-remote: "正確な情報を見る"
 | 
				
			||||||
  renoted-by: "{user}がRenote"
 | 
					  renoted-by: "{user}がRenote"
 | 
				
			||||||
@@ -344,6 +345,8 @@ common/views/components/note-menu.vue:
 | 
				
			|||||||
  copy-link: "リンクをコピー"
 | 
					  copy-link: "リンクをコピー"
 | 
				
			||||||
  favorite: "お気に入り"
 | 
					  favorite: "お気に入り"
 | 
				
			||||||
  unfavorite: "お気に入り解除"
 | 
					  unfavorite: "お気に入り解除"
 | 
				
			||||||
 | 
					  watch: "ウォッチ"
 | 
				
			||||||
 | 
					  unwatch: "ウォッチ解除"
 | 
				
			||||||
  pin: "ピン留め"
 | 
					  pin: "ピン留め"
 | 
				
			||||||
  unpin: "ピン留め解除"
 | 
					  unpin: "ピン留め解除"
 | 
				
			||||||
  delete: "削除"
 | 
					  delete: "削除"
 | 
				
			||||||
@@ -360,6 +363,10 @@ common/views/components/user-menu.vue:
 | 
				
			|||||||
  report-abuse: "スパムを報告"
 | 
					  report-abuse: "スパムを報告"
 | 
				
			||||||
  report-abuse-detail: "どのような迷惑行為を行っていますか?"
 | 
					  report-abuse-detail: "どのような迷惑行為を行っていますか?"
 | 
				
			||||||
  report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
 | 
					  report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
 | 
				
			||||||
 | 
					  silence: "サイレンス"
 | 
				
			||||||
 | 
					  unsilence: "サイレンス解除"
 | 
				
			||||||
 | 
					  suspend: "凍結"
 | 
				
			||||||
 | 
					  unsuspend: "凍結解除"
 | 
				
			||||||
common/views/components/poll.vue:
 | 
					common/views/components/poll.vue:
 | 
				
			||||||
  vote-to: "「{}」に投票する"
 | 
					  vote-to: "「{}」に投票する"
 | 
				
			||||||
  vote-count: "{}票"
 | 
					  vote-count: "{}票"
 | 
				
			||||||
@@ -482,6 +489,7 @@ common/views/components/profile-editor.vue:
 | 
				
			|||||||
  account: "アカウント"
 | 
					  account: "アカウント"
 | 
				
			||||||
  location: "場所"
 | 
					  location: "場所"
 | 
				
			||||||
  description: "自己紹介"
 | 
					  description: "自己紹介"
 | 
				
			||||||
 | 
					  you-can-include-hashtags: "ハッシュタグを含めることができます。"
 | 
				
			||||||
  language: "言語"
 | 
					  language: "言語"
 | 
				
			||||||
  birthday: "誕生日"
 | 
					  birthday: "誕生日"
 | 
				
			||||||
  avatar: "アイコン"
 | 
					  avatar: "アイコン"
 | 
				
			||||||
@@ -501,6 +509,13 @@ common/views/components/profile-editor.vue:
 | 
				
			|||||||
  email-address: "メールアドレス"
 | 
					  email-address: "メールアドレス"
 | 
				
			||||||
  email-verified: "メールアドレスが確認されました"
 | 
					  email-verified: "メールアドレスが確認されました"
 | 
				
			||||||
  email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
 | 
					  email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
 | 
				
			||||||
 | 
					  export: "エクスポート"
 | 
				
			||||||
 | 
					  export-targets:
 | 
				
			||||||
 | 
					    all-notes: "すべての投稿データ"
 | 
				
			||||||
 | 
					    following-list: "フォロー"
 | 
				
			||||||
 | 
					    mute-list: "ミュート"
 | 
				
			||||||
 | 
					    blocking-list: "ブロック"
 | 
				
			||||||
 | 
					  export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
 | 
				
			||||||
common/views/components/user-list-editor.vue:
 | 
					common/views/components/user-list-editor.vue:
 | 
				
			||||||
  users: "ユーザー"
 | 
					  users: "ユーザー"
 | 
				
			||||||
  rename: "リスト名を変更"
 | 
					  rename: "リスト名を変更"
 | 
				
			||||||
@@ -658,9 +673,6 @@ desktop/views/components/drive.vue:
 | 
				
			|||||||
    create-folder: "フォルダーを作成"
 | 
					    create-folder: "フォルダーを作成"
 | 
				
			||||||
    upload: "ファイルをアップロード"
 | 
					    upload: "ファイルをアップロード"
 | 
				
			||||||
    url-upload: "URLからアップロード"
 | 
					    url-upload: "URLからアップロード"
 | 
				
			||||||
desktop/views/components/media-image.vue:
 | 
					 | 
				
			||||||
  sensitive: "閲覧注意"
 | 
					 | 
				
			||||||
  click-to-show: "クリックして表示"
 | 
					 | 
				
			||||||
desktop/views/components/media-video.vue:
 | 
					desktop/views/components/media-video.vue:
 | 
				
			||||||
  sensitive: "閲覧注意"
 | 
					  sensitive: "閲覧注意"
 | 
				
			||||||
  click-to-show: "クリックして表示"
 | 
					  click-to-show: "クリックして表示"
 | 
				
			||||||
@@ -875,6 +887,9 @@ desktop/views/components/settings.2fa.vue:
 | 
				
			|||||||
  success: "設定が完了しました!"
 | 
					  success: "設定が完了しました!"
 | 
				
			||||||
  failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
 | 
					  failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
 | 
				
			||||||
  info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
 | 
					  info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
 | 
				
			||||||
 | 
					common/views/components/media-image.vue:
 | 
				
			||||||
 | 
					  sensitive: "閲覧注意"
 | 
				
			||||||
 | 
					  click-to-show: "クリックして表示"
 | 
				
			||||||
common/views/components/api-settings.vue:
 | 
					common/views/components/api-settings.vue:
 | 
				
			||||||
  intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
 | 
					  intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
 | 
				
			||||||
  caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
 | 
					  caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
 | 
				
			||||||
@@ -992,6 +1007,7 @@ admin/views/index.vue:
 | 
				
			|||||||
  announcements: "お知らせ"
 | 
					  announcements: "お知らせ"
 | 
				
			||||||
  hashtags: "ハッシュタグ"
 | 
					  hashtags: "ハッシュタグ"
 | 
				
			||||||
  abuse: "スパム報告"
 | 
					  abuse: "スパム報告"
 | 
				
			||||||
 | 
					  queue: "ジョブキュー"
 | 
				
			||||||
  back-to-misskey: "Misskeyに戻る"
 | 
					  back-to-misskey: "Misskeyに戻る"
 | 
				
			||||||
admin/views/dashboard.vue:
 | 
					admin/views/dashboard.vue:
 | 
				
			||||||
  dashboard: "ダッシュボード"
 | 
					  dashboard: "ダッシュボード"
 | 
				
			||||||
@@ -1001,6 +1017,9 @@ admin/views/dashboard.vue:
 | 
				
			|||||||
  instances: "インスタンス"
 | 
					  instances: "インスタンス"
 | 
				
			||||||
  this-instance: "このインスタンス"
 | 
					  this-instance: "このインスタンス"
 | 
				
			||||||
  federated: "連合"
 | 
					  federated: "連合"
 | 
				
			||||||
 | 
					admin/views/queue.vue:
 | 
				
			||||||
 | 
					  operation: "操作"
 | 
				
			||||||
 | 
					  remove-all-jobs: "すべてのジョブをクリア"
 | 
				
			||||||
admin/views/abuse.vue:
 | 
					admin/views/abuse.vue:
 | 
				
			||||||
  title: "スパム報告"
 | 
					  title: "スパム報告"
 | 
				
			||||||
  target: "対象"
 | 
					  target: "対象"
 | 
				
			||||||
@@ -1142,6 +1161,8 @@ admin/views/users.vue:
 | 
				
			|||||||
  unsuspend: "凍結の解除"
 | 
					  unsuspend: "凍結の解除"
 | 
				
			||||||
  unsuspend-confirm: "凍結を解除しますか?"
 | 
					  unsuspend-confirm: "凍結を解除しますか?"
 | 
				
			||||||
  unsuspended: "凍結を解除しました"
 | 
					  unsuspended: "凍結を解除しました"
 | 
				
			||||||
 | 
					  make-silence: "サイレンス"
 | 
				
			||||||
 | 
					  unmake-silence: "サイレンスの解除"
 | 
				
			||||||
  verify: "公式アカウントにする"
 | 
					  verify: "公式アカウントにする"
 | 
				
			||||||
  verify-confirm: "公式アカウントにしますか?"
 | 
					  verify-confirm: "公式アカウントにしますか?"
 | 
				
			||||||
  verified: "公式アカウントにしました"
 | 
					  verified: "公式アカウントにしました"
 | 
				
			||||||
@@ -1329,9 +1350,6 @@ mobile/views/components/drive.file-detail.vue:
 | 
				
			|||||||
  nsfw: "閲覧注意"
 | 
					  nsfw: "閲覧注意"
 | 
				
			||||||
  mark-as-sensitive: "閲覧注意に設定"
 | 
					  mark-as-sensitive: "閲覧注意に設定"
 | 
				
			||||||
  unmark-as-sensitive: "閲覧注意を解除"
 | 
					  unmark-as-sensitive: "閲覧注意を解除"
 | 
				
			||||||
mobile/views/components/media-image.vue:
 | 
					 | 
				
			||||||
  sensitive: "閲覧注意"
 | 
					 | 
				
			||||||
  click-to-show: "クリックして表示"
 | 
					 | 
				
			||||||
mobile/views/components/media-video.vue:
 | 
					mobile/views/components/media-video.vue:
 | 
				
			||||||
  sensitive: "閲覧注意"
 | 
					  sensitive: "閲覧注意"
 | 
				
			||||||
  click-to-show: "クリックして表示"
 | 
					  click-to-show: "クリックして表示"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -113,6 +113,7 @@ common:
 | 
				
			|||||||
  use-avatar-reversi-stones: "リバーシの石にアバターを使う"
 | 
					  use-avatar-reversi-stones: "リバーシの石にアバターを使う"
 | 
				
			||||||
  verified-user: "公式アカウント"
 | 
					  verified-user: "公式アカウント"
 | 
				
			||||||
  disable-animated-mfm: "Отключить анимированный текст в постах"
 | 
					  disable-animated-mfm: "Отключить анимированный текст в постах"
 | 
				
			||||||
 | 
					  disable-showing-animated-images: "アニメーション画像を再生しない"
 | 
				
			||||||
  suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
 | 
					  suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
 | 
				
			||||||
  always-show-nsfw: "Всегда показывать NSFW контент"
 | 
					  always-show-nsfw: "Всегда показывать NSFW контент"
 | 
				
			||||||
  always-mark-nsfw: "Всегда помечать посты с медиафайлами как NSFW"
 | 
					  always-mark-nsfw: "Всегда помечать посты с медиафайлами как NSFW"
 | 
				
			||||||
@@ -129,7 +130,7 @@ common:
 | 
				
			|||||||
  show-password: "パスワードを表示する"
 | 
					  show-password: "パスワードを表示する"
 | 
				
			||||||
  do-not-use-in-production: "Эта сборка для разработчиков. Не используйте в продакшне."
 | 
					  do-not-use-in-production: "Эта сборка для разработчиков. Не используйте в продакшне."
 | 
				
			||||||
  user-suspended: "このユーザーは凍結されています。"
 | 
					  user-suspended: "このユーザーは凍結されています。"
 | 
				
			||||||
  is-remote-user: "このユーザー情報はコピーです。"
 | 
					  is-remote-user: "このユーザー情報は不正確な可能性があります。"
 | 
				
			||||||
  is-remote-post: "この投稿情報はコピーです。"
 | 
					  is-remote-post: "この投稿情報はコピーです。"
 | 
				
			||||||
  view-on-remote: "正確な情報を見る"
 | 
					  view-on-remote: "正確な情報を見る"
 | 
				
			||||||
  renoted-by: "{user}がRenote"
 | 
					  renoted-by: "{user}がRenote"
 | 
				
			||||||
@@ -344,6 +345,8 @@ common/views/components/note-menu.vue:
 | 
				
			|||||||
  copy-link: "リンクをコピー"
 | 
					  copy-link: "リンクをコピー"
 | 
				
			||||||
  favorite: "お気に入り"
 | 
					  favorite: "お気に入り"
 | 
				
			||||||
  unfavorite: "お気に入り解除"
 | 
					  unfavorite: "お気に入り解除"
 | 
				
			||||||
 | 
					  watch: "ウォッチ"
 | 
				
			||||||
 | 
					  unwatch: "ウォッチ解除"
 | 
				
			||||||
  pin: "ピン留め"
 | 
					  pin: "ピン留め"
 | 
				
			||||||
  unpin: "ピン留め解除"
 | 
					  unpin: "ピン留め解除"
 | 
				
			||||||
  delete: "削除"
 | 
					  delete: "削除"
 | 
				
			||||||
@@ -360,6 +363,10 @@ common/views/components/user-menu.vue:
 | 
				
			|||||||
  report-abuse: "スパムを報告"
 | 
					  report-abuse: "スパムを報告"
 | 
				
			||||||
  report-abuse-detail: "どのような迷惑行為を行っていますか?"
 | 
					  report-abuse-detail: "どのような迷惑行為を行っていますか?"
 | 
				
			||||||
  report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
 | 
					  report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
 | 
				
			||||||
 | 
					  silence: "サイレンス"
 | 
				
			||||||
 | 
					  unsilence: "サイレンス解除"
 | 
				
			||||||
 | 
					  suspend: "凍結"
 | 
				
			||||||
 | 
					  unsuspend: "凍結解除"
 | 
				
			||||||
common/views/components/poll.vue:
 | 
					common/views/components/poll.vue:
 | 
				
			||||||
  vote-to: "「{}」に投票する"
 | 
					  vote-to: "「{}」に投票する"
 | 
				
			||||||
  vote-count: "{}票"
 | 
					  vote-count: "{}票"
 | 
				
			||||||
@@ -482,6 +489,7 @@ common/views/components/profile-editor.vue:
 | 
				
			|||||||
  account: "アカウント"
 | 
					  account: "アカウント"
 | 
				
			||||||
  location: "場所"
 | 
					  location: "場所"
 | 
				
			||||||
  description: "自己紹介"
 | 
					  description: "自己紹介"
 | 
				
			||||||
 | 
					  you-can-include-hashtags: "ハッシュタグを含めることができます。"
 | 
				
			||||||
  language: "言語"
 | 
					  language: "言語"
 | 
				
			||||||
  birthday: "誕生日"
 | 
					  birthday: "誕生日"
 | 
				
			||||||
  avatar: "アイコン"
 | 
					  avatar: "アイコン"
 | 
				
			||||||
@@ -501,6 +509,13 @@ common/views/components/profile-editor.vue:
 | 
				
			|||||||
  email-address: "メールアドレス"
 | 
					  email-address: "メールアドレス"
 | 
				
			||||||
  email-verified: "メールアドレスが確認されました"
 | 
					  email-verified: "メールアドレスが確認されました"
 | 
				
			||||||
  email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
 | 
					  email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
 | 
				
			||||||
 | 
					  export: "エクスポート"
 | 
				
			||||||
 | 
					  export-targets:
 | 
				
			||||||
 | 
					    all-notes: "すべての投稿データ"
 | 
				
			||||||
 | 
					    following-list: "フォロー"
 | 
				
			||||||
 | 
					    mute-list: "ミュート"
 | 
				
			||||||
 | 
					    blocking-list: "ブロック"
 | 
				
			||||||
 | 
					  export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
 | 
				
			||||||
common/views/components/user-list-editor.vue:
 | 
					common/views/components/user-list-editor.vue:
 | 
				
			||||||
  users: "ユーザー"
 | 
					  users: "ユーザー"
 | 
				
			||||||
  rename: "リスト名を変更"
 | 
					  rename: "リスト名を変更"
 | 
				
			||||||
@@ -658,9 +673,6 @@ desktop/views/components/drive.vue:
 | 
				
			|||||||
    create-folder: "フォルダーを作成"
 | 
					    create-folder: "フォルダーを作成"
 | 
				
			||||||
    upload: "ファイルをアップロード"
 | 
					    upload: "ファイルをアップロード"
 | 
				
			||||||
    url-upload: "URLからアップロード"
 | 
					    url-upload: "URLからアップロード"
 | 
				
			||||||
desktop/views/components/media-image.vue:
 | 
					 | 
				
			||||||
  sensitive: "閲覧注意"
 | 
					 | 
				
			||||||
  click-to-show: "クリックして表示"
 | 
					 | 
				
			||||||
desktop/views/components/media-video.vue:
 | 
					desktop/views/components/media-video.vue:
 | 
				
			||||||
  sensitive: "閲覧注意"
 | 
					  sensitive: "閲覧注意"
 | 
				
			||||||
  click-to-show: "クリックして表示"
 | 
					  click-to-show: "クリックして表示"
 | 
				
			||||||
@@ -875,6 +887,9 @@ desktop/views/components/settings.2fa.vue:
 | 
				
			|||||||
  success: "設定が完了しました!"
 | 
					  success: "設定が完了しました!"
 | 
				
			||||||
  failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
 | 
					  failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
 | 
				
			||||||
  info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
 | 
					  info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
 | 
				
			||||||
 | 
					common/views/components/media-image.vue:
 | 
				
			||||||
 | 
					  sensitive: "閲覧注意"
 | 
				
			||||||
 | 
					  click-to-show: "クリックして表示"
 | 
				
			||||||
common/views/components/api-settings.vue:
 | 
					common/views/components/api-settings.vue:
 | 
				
			||||||
  intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
 | 
					  intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
 | 
				
			||||||
  caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
 | 
					  caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
 | 
				
			||||||
@@ -992,6 +1007,7 @@ admin/views/index.vue:
 | 
				
			|||||||
  announcements: "お知らせ"
 | 
					  announcements: "お知らせ"
 | 
				
			||||||
  hashtags: "ハッシュタグ"
 | 
					  hashtags: "ハッシュタグ"
 | 
				
			||||||
  abuse: "スパム報告"
 | 
					  abuse: "スパム報告"
 | 
				
			||||||
 | 
					  queue: "ジョブキュー"
 | 
				
			||||||
  back-to-misskey: "Misskeyに戻る"
 | 
					  back-to-misskey: "Misskeyに戻る"
 | 
				
			||||||
admin/views/dashboard.vue:
 | 
					admin/views/dashboard.vue:
 | 
				
			||||||
  dashboard: "ダッシュボード"
 | 
					  dashboard: "ダッシュボード"
 | 
				
			||||||
@@ -1001,6 +1017,9 @@ admin/views/dashboard.vue:
 | 
				
			|||||||
  instances: "インスタンス"
 | 
					  instances: "インスタンス"
 | 
				
			||||||
  this-instance: "このインスタンス"
 | 
					  this-instance: "このインスタンス"
 | 
				
			||||||
  federated: "連合"
 | 
					  federated: "連合"
 | 
				
			||||||
 | 
					admin/views/queue.vue:
 | 
				
			||||||
 | 
					  operation: "操作"
 | 
				
			||||||
 | 
					  remove-all-jobs: "すべてのジョブをクリア"
 | 
				
			||||||
admin/views/abuse.vue:
 | 
					admin/views/abuse.vue:
 | 
				
			||||||
  title: "スパム報告"
 | 
					  title: "スパム報告"
 | 
				
			||||||
  target: "対象"
 | 
					  target: "対象"
 | 
				
			||||||
@@ -1142,6 +1161,8 @@ admin/views/users.vue:
 | 
				
			|||||||
  unsuspend: "凍結の解除"
 | 
					  unsuspend: "凍結の解除"
 | 
				
			||||||
  unsuspend-confirm: "凍結を解除しますか?"
 | 
					  unsuspend-confirm: "凍結を解除しますか?"
 | 
				
			||||||
  unsuspended: "凍結を解除しました"
 | 
					  unsuspended: "凍結を解除しました"
 | 
				
			||||||
 | 
					  make-silence: "サイレンス"
 | 
				
			||||||
 | 
					  unmake-silence: "サイレンスの解除"
 | 
				
			||||||
  verify: "公式アカウントにする"
 | 
					  verify: "公式アカウントにする"
 | 
				
			||||||
  verify-confirm: "公式アカウントにしますか?"
 | 
					  verify-confirm: "公式アカウントにしますか?"
 | 
				
			||||||
  verified: "公式アカウントにしました"
 | 
					  verified: "公式アカウントにしました"
 | 
				
			||||||
@@ -1329,9 +1350,6 @@ mobile/views/components/drive.file-detail.vue:
 | 
				
			|||||||
  nsfw: "閲覧注意"
 | 
					  nsfw: "閲覧注意"
 | 
				
			||||||
  mark-as-sensitive: "閲覧注意に設定"
 | 
					  mark-as-sensitive: "閲覧注意に設定"
 | 
				
			||||||
  unmark-as-sensitive: "閲覧注意を解除"
 | 
					  unmark-as-sensitive: "閲覧注意を解除"
 | 
				
			||||||
mobile/views/components/media-image.vue:
 | 
					 | 
				
			||||||
  sensitive: "閲覧注意"
 | 
					 | 
				
			||||||
  click-to-show: "クリックして表示"
 | 
					 | 
				
			||||||
mobile/views/components/media-video.vue:
 | 
					mobile/views/components/media-video.vue:
 | 
				
			||||||
  sensitive: "閲覧注意"
 | 
					  sensitive: "閲覧注意"
 | 
				
			||||||
  click-to-show: "クリックして表示"
 | 
					  click-to-show: "クリックして表示"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,23 +5,23 @@ meta:
 | 
				
			|||||||
common:
 | 
					common:
 | 
				
			||||||
  misskey: "Fediverse中的一颗⭐"
 | 
					  misskey: "Fediverse中的一颗⭐"
 | 
				
			||||||
  about-title: "Fediverse中的一颗⭐"
 | 
					  about-title: "Fediverse中的一颗⭐"
 | 
				
			||||||
  about: "非常感谢您找到了Misskey。 Misskey是出生于地球上的<b>分布式微博SNS</b>。因为她处于Fediverse(由各种SNS组成的宇宙)中,所以她与其他SNS相互连接。想要远离喧嚣的城市,不如深入这个新的互联网来探索一下吧。"
 | 
					  about: "非常感谢您找到了Misskey。 Misskey是诞生于地球的<b>分布式微博SNS</b>。因为她处于Fediverse(由各种SNS组成的宇宙)中,所以她与其他SNS相互连接。想要远离喧嚣的城市,不如深入这个新的互联网来探索一下吧。"
 | 
				
			||||||
  intro:
 | 
					  intro:
 | 
				
			||||||
    title: "什么是 Misskey 呢?"
 | 
					    title: "什么是 Misskey 呢?"
 | 
				
			||||||
    about: "Misskey是开源的<b>分散式微博SNS</b>。复杂的完全可定制的Ui,各种各样的帖子反应,提供集成管理系统和其他先进功能的免费文件存储。此外,称为“Fediverse”的网络系统使我们能够与其他SNS的用户进行通信。比如,如果你张贴一些东西,那么你的帖子不仅会发送给Misskey,还会发送到其他SNS平台。想象一下,正如一颗行星和另一颗行星通过发送微波来进行通信一样。"
 | 
					    about: "Misskey是开源的<b>分散式微博SNS</b>。复杂的完全可定制的Ui,各种各样的帖子反应,提供集成管理系统和其他先进功能的免费文件存储。此外,称为“Fediverse”的网络系统使我们能够与其他SNS的用户进行通信。比如,如果你张贴一些东西,那么你的帖子不仅会发送给Misskey,还会发送到其他SNS平台。想象一下,正如一颗行星和另一颗行星通过电磁波来进行通信一样。"
 | 
				
			||||||
    features: "功能"
 | 
					    features: "功能"
 | 
				
			||||||
    rich-contents: "发布"
 | 
					    rich-contents: "发布"
 | 
				
			||||||
    rich-contents-desc: "请分享您的想法,热门话题,以及任何您想与大家分享的内容。如果有需要的话,您可以使用各种语法来修饰文章,发布问卷调查,或者添加各种您喜欢的图像和视频等文件。"
 | 
					    rich-contents-desc: "请分享您的想法,热门话题,以及任何您想与大家分享的内容。如果有需要的话,您可以使用各种语法来修饰文章,发布问卷调查,或者添加各种您喜欢的图像和视频等文件。"
 | 
				
			||||||
    reaction: "回应"
 | 
					    reaction: "回应"
 | 
				
			||||||
    reaction-desc: "表达情绪的最简单方法。 Misskey允许您向其他帖子添加各种类型的回应。 一旦体验过Misskey的回应功能,就再也不会想回到那些只有点赞功能的其他SNS上了。"
 | 
					    reaction-desc: "这是表达情绪的最简单方法。 Misskey允许您向其他帖子添加各种类型的回应。 一旦体验过Misskey的回应功能,就再也不会想回到那些只有点赞功能的其他SNS上了。"
 | 
				
			||||||
    ui: "交互界面"
 | 
					    ui: "交互界面"
 | 
				
			||||||
    ui-desc: "世界上没有一个UI可以适合每一个人. 所以, Misskey 提供一个可以高度定制的UI交互界面. 您可以通过编辑, 调整布局, 放置可选择的小部件来轻松定制您的专属UI界面。"
 | 
					    ui-desc: "世界上没有一个UI可以适合每一个人. 所以, Misskey 提供一个可以高度定制的UI交互界面. 您可以通过编辑, 调整布局, 放置可选择的小部件来轻松定制您的专属UI界面。"
 | 
				
			||||||
    drive: "Misskey 云盘"
 | 
					    drive: "Misskey 云盘"
 | 
				
			||||||
    drive-desc: "想要发布一张您已经上传过的照片吗? 想要组织,命名和为上传的文件创建文件夹吗? Misskey 云盘是一个最好的解决方案. "
 | 
					    drive-desc: "想要发布一张您已经上传过的照片吗? 想要组织,命名和为上传的文件创建文件夹吗? Misskey 云盘是一个最好的解决方案. "
 | 
				
			||||||
    outro: "进一步深挖 Misskey 的更多功能, 如果您感觉这个功能不适合我, 试试其他例子. 因为 Misskey 是一个分散的 SNS, 这样您就可以很容易找到适合自己的一部分."
 | 
					    outro: "Misskey还有其他更多功能,请亲身体验一下吧。因为 Misskey 是一个分布式的 SNS,如果您感觉某个功能不适合自己,试试其他的吧。祝您玩得开心!"
 | 
				
			||||||
  adblock:
 | 
					  adblock:
 | 
				
			||||||
    detected: "请关闭广告拦截器"
 | 
					    detected: "请关闭广告拦截器"
 | 
				
			||||||
    warning: "<strong>Misskey 不是广告网站</strong>如果您启用广告拦截器, 可能会导致某些功能无法正常使用。"
 | 
					    warning: "<strong>Misskey不会发布广告</strong>如果您启用广告拦截器, 可能会导致某些功能无法正常使用。"
 | 
				
			||||||
  application-authorization: "应用程序授权"
 | 
					  application-authorization: "应用程序授权"
 | 
				
			||||||
  close: "关闭"
 | 
					  close: "关闭"
 | 
				
			||||||
  do-not-copy-paste: "请不要在这里输入或粘贴代码。您帐户可能会受到损害。"
 | 
					  do-not-copy-paste: "请不要在这里输入或粘贴代码。您帐户可能会受到损害。"
 | 
				
			||||||
@@ -30,21 +30,21 @@ common:
 | 
				
			|||||||
  2fa: "双重身份验证"
 | 
					  2fa: "双重身份验证"
 | 
				
			||||||
  got-it: "没问题"
 | 
					  got-it: "没问题"
 | 
				
			||||||
  customization-tips:
 | 
					  customization-tips:
 | 
				
			||||||
    title: "客制化提示"
 | 
					    title: "自定义提示"
 | 
				
			||||||
    paragraph: "<p>主页定制允许您添加或删除, 拖放和重新排列小组件.</p></p>您可以通过<strong><strong>右键</strong>点击</strong>某些小部件来更改显示</p><p>若要删除小部件, 请将其拖到标头为<strong>「垃圾箱」</strong>的区域</p><p>如果您完成了定制过程,单击右上角的「完成」</p>"
 | 
					    paragraph: "<p>主页定制允许您添加或删除, 拖放和重新排列小组件.</p></p>您可以通过<strong><strong>右键</strong>点击</strong>某些小部件来更改显示</p><p>若要删除小部件, 请将其拖到标头为<strong>「垃圾箱」</strong>的区域</p><p>如果您完成了定制过程,单击右上角的「完成」</p>"
 | 
				
			||||||
    gotit: "没问题!"
 | 
					    gotit: "明白了!"
 | 
				
			||||||
  notification:
 | 
					  notification:
 | 
				
			||||||
    file-uploaded: "文件已上传"
 | 
					    file-uploaded: "文件已上传"
 | 
				
			||||||
    message-from: "信息来源 {}:"
 | 
					    message-from: "来自{}的消息:"
 | 
				
			||||||
    reversi-invited: "您已被邀请加入一场游戏"
 | 
					    reversi-invited: "您已被邀请加入一场游戏"
 | 
				
			||||||
    reversi-invited-by: "被邀请 {}:"
 | 
					    reversi-invited-by: "来自{}的邀请"
 | 
				
			||||||
    notified-by: "通知 {}:"
 | 
					    notified-by: "来自{}的通知"
 | 
				
			||||||
    reply-from: "回复 {}:"
 | 
					    reply-from: "来自{}的回复:"
 | 
				
			||||||
    quoted-by: "引用 {}:"
 | 
					    quoted-by: "来自{}的引用:"
 | 
				
			||||||
  time:
 | 
					  time:
 | 
				
			||||||
    unknown: "这是个啥??? 不知道哎"
 | 
					    unknown: "未知"
 | 
				
			||||||
    future: "未来"
 | 
					    future: "未来"
 | 
				
			||||||
    just_now: "现在"
 | 
					    just_now: "刚刚"
 | 
				
			||||||
    seconds_ago: "{}秒前"
 | 
					    seconds_ago: "{}秒前"
 | 
				
			||||||
    minutes_ago: "{}分前"
 | 
					    minutes_ago: "{}分前"
 | 
				
			||||||
    hours_ago: "{}小时前"
 | 
					    hours_ago: "{}小时前"
 | 
				
			||||||
@@ -87,7 +87,7 @@ common:
 | 
				
			|||||||
    public: "公开"
 | 
					    public: "公开"
 | 
				
			||||||
    home: "首页"
 | 
					    home: "首页"
 | 
				
			||||||
    home-desc: "仅发送至首页的时间线"
 | 
					    home-desc: "仅发送至首页的时间线"
 | 
				
			||||||
    followers: "关注者"
 | 
					    followers: "粉丝"
 | 
				
			||||||
    followers-desc: "仅发送至粉丝"
 | 
					    followers-desc: "仅发送至粉丝"
 | 
				
			||||||
    specified: "指定用户"
 | 
					    specified: "指定用户"
 | 
				
			||||||
    specified-desc: "仅发送至指定用户"
 | 
					    specified-desc: "仅发送至指定用户"
 | 
				
			||||||
@@ -95,24 +95,25 @@ common:
 | 
				
			|||||||
    local-home: "首页(仅限本地)"
 | 
					    local-home: "首页(仅限本地)"
 | 
				
			||||||
    local-followers: "关注者(仅限本地)"
 | 
					    local-followers: "关注者(仅限本地)"
 | 
				
			||||||
  note-placeholders:
 | 
					  note-placeholders:
 | 
				
			||||||
    a: "你在干什么??"
 | 
					    a: "现在在做什么?"
 | 
				
			||||||
    b: "发生了什么?"
 | 
					    b: "发生了什么?"
 | 
				
			||||||
    c: "你有什么想法?"
 | 
					    c: "你有什么想法?"
 | 
				
			||||||
    d: "你想要发布些什么吗?"
 | 
					    d: "你想要发布些什么吗?"
 | 
				
			||||||
    e: "写下来吧"
 | 
					    e: "请写下来吧"
 | 
				
			||||||
    f: "等待你的书写..."
 | 
					    f: "等待您的发布..."
 | 
				
			||||||
  search: "搜索"
 | 
					  search: "搜索"
 | 
				
			||||||
  delete: "删除"
 | 
					  delete: "删除"
 | 
				
			||||||
  loading: "正在加载, 等着就好啦"
 | 
					  loading: "正在加载中"
 | 
				
			||||||
  ok: "没问题"
 | 
					  ok: "OK"
 | 
				
			||||||
  update-available-title: "有可用更新"
 | 
					  update-available-title: "有可用更新"
 | 
				
			||||||
  update-available: "新的 Misskey 版本现已发布({newer}。目前版本{current}). 刷新页面以应用更新。"
 | 
					  update-available: "新的 Misskey 版本现已发布({newer}。目前版本{current}). 刷新页面以应用更新。"
 | 
				
			||||||
  my-token-regenerated: "您的 Token 已被重置, 您将自动登出。"
 | 
					  my-token-regenerated: "您的 Token 已被重置, 您将自动登出。"
 | 
				
			||||||
  i-like-sushi: "相比于布丁来说, 我更喜欢寿司。"
 | 
					  i-like-sushi: "相比于布丁来说, 我更喜欢寿司。"
 | 
				
			||||||
  show-reversi-board-labels: "在 Reversi 中显示行和列表签"
 | 
					  show-reversi-board-labels: "在 Reversi 中显示行和列表签"
 | 
				
			||||||
  use-avatar-reversi-stones: "用头像作为 Reversi 中的 “石头”"
 | 
					  use-avatar-reversi-stones: "用头像作为黑白棋的棋子"
 | 
				
			||||||
  verified-user: "认证用户"
 | 
					  verified-user: "认证用户"
 | 
				
			||||||
  disable-animated-mfm: "在帖子中禁用动画文本"
 | 
					  disable-animated-mfm: "在帖子中禁用动画文本"
 | 
				
			||||||
 | 
					  disable-showing-animated-images: "不播放动画"
 | 
				
			||||||
  suggest-recent-hashtags: "在帖子表单上显示最近流行的主题标签"
 | 
					  suggest-recent-hashtags: "在帖子表单上显示最近流行的主题标签"
 | 
				
			||||||
  always-show-nsfw: "总是显示 NSFW 的内容"
 | 
					  always-show-nsfw: "总是显示 NSFW 的内容"
 | 
				
			||||||
  always-mark-nsfw: "总是用 NSFW 来标记附件"
 | 
					  always-mark-nsfw: "总是用 NSFW 来标记附件"
 | 
				
			||||||
@@ -120,7 +121,7 @@ common:
 | 
				
			|||||||
  show-via: "显示 via"
 | 
					  show-via: "显示 via"
 | 
				
			||||||
  reduce-motion: "减弱UI中的动画效果"
 | 
					  reduce-motion: "减弱UI中的动画效果"
 | 
				
			||||||
  this-setting-is-this-device-only: "设置仅在本设备中生效"
 | 
					  this-setting-is-this-device-only: "设置仅在本设备中生效"
 | 
				
			||||||
  use-os-default-emojis: "使用设备系统默认的 emojis"
 | 
					  use-os-default-emojis: "使用设备系统默认的表情符号"
 | 
				
			||||||
  line-width: "线条宽度"
 | 
					  line-width: "线条宽度"
 | 
				
			||||||
  line-width-thin: "细"
 | 
					  line-width-thin: "细"
 | 
				
			||||||
  line-width-normal: "正常"
 | 
					  line-width-normal: "正常"
 | 
				
			||||||
@@ -129,48 +130,48 @@ common:
 | 
				
			|||||||
  show-password: "显示密码"
 | 
					  show-password: "显示密码"
 | 
				
			||||||
  do-not-use-in-production: "这是一个开发者测试版. 请勿在生产环境中使用."
 | 
					  do-not-use-in-production: "这是一个开发者测试版. 请勿在生产环境中使用."
 | 
				
			||||||
  user-suspended: "该用户已被冻结。"
 | 
					  user-suspended: "该用户已被冻结。"
 | 
				
			||||||
  is-remote-user: "该用户的信息已被复制."
 | 
					  is-remote-user: "此用户信息可能不准确。"
 | 
				
			||||||
  is-remote-post: "该投稿已被复制."
 | 
					  is-remote-post: "该投稿已被复制."
 | 
				
			||||||
  view-on-remote: "查看准确的信息"
 | 
					  view-on-remote: "查看准确的信息"
 | 
				
			||||||
  renoted-by: "由 {user} Renote"
 | 
					  renoted-by: "由 {user} Renote"
 | 
				
			||||||
  error:
 | 
					  error:
 | 
				
			||||||
    title: "哦不, 发生了一些问题! :("
 | 
					    title: "出现问题"
 | 
				
			||||||
    retry: "重试"
 | 
					    retry: "重试"
 | 
				
			||||||
  reversi:
 | 
					  reversi:
 | 
				
			||||||
    drawn: "平局"
 | 
					    drawn: "平局"
 | 
				
			||||||
    my-turn: "轮到你了"
 | 
					    my-turn: "轮到你了"
 | 
				
			||||||
    opponent-turn: "轮到对手了"
 | 
					    opponent-turn: "轮到对手了"
 | 
				
			||||||
    turn-of: "{name}转折点"
 | 
					    turn-of: "{name}的回合"
 | 
				
			||||||
    past-turn-of: "轮到{name}的回合了"
 | 
					    past-turn-of: "轮到{name}的回合了"
 | 
				
			||||||
    won: "{name}获胜"
 | 
					    won: "{name}获胜"
 | 
				
			||||||
    black: "黑"
 | 
					    black: "黑"
 | 
				
			||||||
    white: "白"
 | 
					    white: "白"
 | 
				
			||||||
    total: "合计"
 | 
					    total: "总计"
 | 
				
			||||||
    this-turn: "Turn {count}"
 | 
					    this-turn: "{count}回合"
 | 
				
			||||||
  widgets:
 | 
					  widgets:
 | 
				
			||||||
    analog-clock: "指针时钟"
 | 
					    analog-clock: "模拟时钟"
 | 
				
			||||||
    profile: "简介"
 | 
					    profile: "个人资料"
 | 
				
			||||||
    calendar: "日历"
 | 
					    calendar: "日历"
 | 
				
			||||||
    timemachine: "时光机"
 | 
					    timemachine: "日历 (时间机器)"
 | 
				
			||||||
    activity: "动态"
 | 
					    activity: "动态"
 | 
				
			||||||
    rss: "RSS 订阅"
 | 
					    rss: "RSS阅读器"
 | 
				
			||||||
    memo: "便签"
 | 
					    memo: "便签"
 | 
				
			||||||
    trends: "趋势"
 | 
					    trends: "趋势"
 | 
				
			||||||
    photo-stream: "图片轮播"
 | 
					    photo-stream: "照片流"
 | 
				
			||||||
    posts-monitor: "投稿图表"
 | 
					    posts-monitor: "投稿图表"
 | 
				
			||||||
    slideshow: "幻灯片"
 | 
					    slideshow: "幻灯片"
 | 
				
			||||||
    version: "版本"
 | 
					    version: "版本"
 | 
				
			||||||
    broadcast: "广播"
 | 
					    broadcast: "广播"
 | 
				
			||||||
    notifications: "通知"
 | 
					    notifications: "通知"
 | 
				
			||||||
    users: "推荐用户"
 | 
					    users: "推荐用户"
 | 
				
			||||||
    polls: "投票"
 | 
					    polls: "调查问卷"
 | 
				
			||||||
    post-form: "投稿形式"
 | 
					    post-form: "投稿形式"
 | 
				
			||||||
    server: "服务器信息"
 | 
					    server: "服务器信息"
 | 
				
			||||||
    nav: "导航"
 | 
					    nav: "导航"
 | 
				
			||||||
    tips: "提示"
 | 
					    tips: "提示"
 | 
				
			||||||
    hashtags: "标签"
 | 
					    hashtags: "标签"
 | 
				
			||||||
  dev: "构建应用程序失败,请再试一次。"
 | 
					  dev: "构建应用程序失败,请再试一次。"
 | 
				
			||||||
  ai-chan-kawaii: "Ai-chan kawaii!"
 | 
					  ai-chan-kawaii: "小蓝真可爱"
 | 
				
			||||||
  you: "您"
 | 
					  you: "您"
 | 
				
			||||||
auth/views/form.vue:
 | 
					auth/views/form.vue:
 | 
				
			||||||
  share-access: "您要允许<i>{name}</i>来访问您的账户吗?"
 | 
					  share-access: "您要允许<i>{name}</i>来访问您的账户吗?"
 | 
				
			||||||
@@ -178,8 +179,8 @@ auth/views/form.vue:
 | 
				
			|||||||
  account-read: "查看账户信息"
 | 
					  account-read: "查看账户信息"
 | 
				
			||||||
  account-write: "修改账户信息"
 | 
					  account-write: "修改账户信息"
 | 
				
			||||||
  note-write: "投稿。"
 | 
					  note-write: "投稿。"
 | 
				
			||||||
  like-write: "评价投稿。"
 | 
					  like-write: "点赞或取消赞。"
 | 
				
			||||||
  following-write: "关注和不关注。"
 | 
					  following-write: "关注或取消关注。"
 | 
				
			||||||
  drive-read: "查看您的云盘"
 | 
					  drive-read: "查看您的云盘"
 | 
				
			||||||
  drive-write: "上传/删除您云盘中的文件。"
 | 
					  drive-write: "上传/删除您云盘中的文件。"
 | 
				
			||||||
  notification-read: "查看通知。"
 | 
					  notification-read: "查看通知。"
 | 
				
			||||||
@@ -187,7 +188,7 @@ auth/views/form.vue:
 | 
				
			|||||||
  cancel: "取消"
 | 
					  cancel: "取消"
 | 
				
			||||||
  accept: "允许访问。"
 | 
					  accept: "允许访问。"
 | 
				
			||||||
auth/views/index.vue:
 | 
					auth/views/index.vue:
 | 
				
			||||||
  loading: "正在加载, 请耐心等待哦~"
 | 
					  loading: "正在加载中"
 | 
				
			||||||
  denied: "已拒绝应用程序授权。"
 | 
					  denied: "已拒绝应用程序授权。"
 | 
				
			||||||
  denied-paragraph: "这个应用程序将不会访问您的账户"
 | 
					  denied-paragraph: "这个应用程序将不会访问您的账户"
 | 
				
			||||||
  already-authorized: "这个应用程序已授权。"
 | 
					  already-authorized: "这个应用程序已授权。"
 | 
				
			||||||
@@ -201,17 +202,17 @@ common/views/components/games/reversi/reversi.vue:
 | 
				
			|||||||
    waiting-for: "等待 {}"
 | 
					    waiting-for: "等待 {}"
 | 
				
			||||||
    cancel: "取消"
 | 
					    cancel: "取消"
 | 
				
			||||||
common/views/components/games/reversi/reversi.game.vue:
 | 
					common/views/components/games/reversi/reversi.game.vue:
 | 
				
			||||||
  surrender: "投降"
 | 
					  surrender: "认输"
 | 
				
			||||||
  surrendered: "投降"
 | 
					  surrendered: "已认输"
 | 
				
			||||||
  is-llotheo: "石头少的一方获胜"
 | 
					  is-llotheo: "棋子较少一方获胜(LLoTheO规则)"
 | 
				
			||||||
  looped-map: "环状地图"
 | 
					  looped-map: "环形棋盘"
 | 
				
			||||||
  can-put-everywhere: "可以随意放置"
 | 
					  can-put-everywhere: "可以下在任意放置"
 | 
				
			||||||
common/views/components/games/reversi/reversi.index.vue:
 | 
					common/views/components/games/reversi/reversi.index.vue:
 | 
				
			||||||
  title: "Misskey Reversi"
 | 
					  title: "Misskey 黑白棋"
 | 
				
			||||||
  sub-title: "和你的朋友一起玩 Reversi!"
 | 
					  sub-title: "和其他人一起来玩Misskey黑白棋"
 | 
				
			||||||
  invite: "邀请"
 | 
					  invite: "邀请"
 | 
				
			||||||
  rule: "游戏说明"
 | 
					  rule: "游戏说明"
 | 
				
			||||||
  rule-desc: "Reversi是与对方交替地把石头放在板上,把对方的石头夹在自己的颜色上,最终留下的石头多的人获胜。"
 | 
					  rule-desc: "黑白棋是一种棋盘游戏。两人交替在棋盘上落子,并将该棋子和另一个己方棋子之间的对方棋子转换成自己的颜色。最终保留最多棋子的人获胜。"
 | 
				
			||||||
  mode-invite: "邀请"
 | 
					  mode-invite: "邀请"
 | 
				
			||||||
  mode-invite-desc: "邀请指定用户参加游戏"
 | 
					  mode-invite-desc: "邀请指定用户参加游戏"
 | 
				
			||||||
  invitations: "您收到了一则邀请!"
 | 
					  invitations: "您收到了一则邀请!"
 | 
				
			||||||
@@ -219,28 +220,28 @@ common/views/components/games/reversi/reversi.index.vue:
 | 
				
			|||||||
  all-games: "所有游戏"
 | 
					  all-games: "所有游戏"
 | 
				
			||||||
  enter-username: "输入用户名"
 | 
					  enter-username: "输入用户名"
 | 
				
			||||||
  game-state:
 | 
					  game-state:
 | 
				
			||||||
    ended: "完成"
 | 
					    ended: "结束"
 | 
				
			||||||
    playing: "进行中"
 | 
					    playing: "游戏进行中"
 | 
				
			||||||
common/views/components/games/reversi/reversi.room.vue:
 | 
					common/views/components/games/reversi/reversi.room.vue:
 | 
				
			||||||
  settings-of-the-game: "游戏设置"
 | 
					  settings-of-the-game: "游戏设置"
 | 
				
			||||||
  choose-map: "选择一个地图"
 | 
					  choose-map: "棋盘选择"
 | 
				
			||||||
  random: "随机"
 | 
					  random: "随机"
 | 
				
			||||||
  black-or-white: "黑/白"
 | 
					  black-or-white: "黑/白"
 | 
				
			||||||
  black-is: "{}是黑"
 | 
					  black-is: "{}是黑"
 | 
				
			||||||
  rules: "规则"
 | 
					  rules: "规则"
 | 
				
			||||||
  is-llotheo: "较少一方获胜"
 | 
					  is-llotheo: "棋子较少一方获胜(LLoTheO规则)"
 | 
				
			||||||
  looped-map: "环状地图"
 | 
					  looped-map: "环形棋盘"
 | 
				
			||||||
  can-put-everywhere: "可以随意放置"
 | 
					  can-put-everywhere: "可以下在任意放置"
 | 
				
			||||||
  settings-of-the-bot: "机器人设定"
 | 
					  settings-of-the-bot: "机器人设定"
 | 
				
			||||||
  this-game-is-started-soon: "游戏即将在数秒后开始"
 | 
					  this-game-is-started-soon: "游戏即将在数秒后开始"
 | 
				
			||||||
  waiting-for-other: "等待对手准备"
 | 
					  waiting-for-other: "等待对手准备"
 | 
				
			||||||
  waiting-for-me: "等待您的准备"
 | 
					  waiting-for-me: "等待您的准备"
 | 
				
			||||||
  waiting-for-both: "准备中"
 | 
					  waiting-for-both: "准备中"
 | 
				
			||||||
  cancel: "取消"
 | 
					  cancel: "取消"
 | 
				
			||||||
  ready: "准备好啦"
 | 
					  ready: "准备完成"
 | 
				
			||||||
  cancel-ready: "取消准备"
 | 
					  cancel-ready: "取消准备"
 | 
				
			||||||
common/views/components/connect-failed.vue:
 | 
					common/views/components/connect-failed.vue:
 | 
				
			||||||
  title: "无法连接至服务器"
 | 
					  title: "无法连接到服务器"
 | 
				
			||||||
  description: "您的网络连接可能出现了问题, 或是远程服务器暂时不可用. 请稍后{重试}."
 | 
					  description: "您的网络连接可能出现了问题, 或是远程服务器暂时不可用. 请稍后{重试}."
 | 
				
			||||||
  thanks: "感谢您使用 Misskey"
 | 
					  thanks: "感谢您使用 Misskey"
 | 
				
			||||||
  troubleshoot: "故障排除"
 | 
					  troubleshoot: "故障排除"
 | 
				
			||||||
@@ -256,9 +257,9 @@ common/views/components/connect-failed.troubleshooter.vue:
 | 
				
			|||||||
  no-network: "无网络连接"
 | 
					  no-network: "无网络连接"
 | 
				
			||||||
  no-network-desc: "请确保您已连接至互联网"
 | 
					  no-network-desc: "请确保您已连接至互联网"
 | 
				
			||||||
  no-internet: "无网络连接"
 | 
					  no-internet: "无网络连接"
 | 
				
			||||||
  no-internet-desc: "请确保您已连接至互联网"
 | 
					  no-internet-desc: "网络已连接,但无法连接到Internet。 请确保您的PC的Internet连接正常。"
 | 
				
			||||||
  no-server: "无法连接到 Misskey 服务器"
 | 
					  no-server: "无法连接到 Misskey 服务器"
 | 
				
			||||||
  no-server-desc: "您设备与互联网的网络连接正常, 但是无法连接至 Misskey 服务器. 这可能是服务器暂时不可用或正在维护. 请稍后再试."
 | 
					  no-server-desc: "您设备与互联网的网络连接正常,但是无法连接至 Misskey 服务器。这可能是服务器暂时不可用或正在维护,请稍后再试。"
 | 
				
			||||||
  success: "成功连接至 Misskey 服务器"
 | 
					  success: "成功连接至 Misskey 服务器"
 | 
				
			||||||
  success-desc: "看起来我们连接正常. 请刷新网页."
 | 
					  success-desc: "看起来我们连接正常. 请刷新网页."
 | 
				
			||||||
  flush: "清除缓存"
 | 
					  flush: "清除缓存"
 | 
				
			||||||
@@ -268,18 +269,18 @@ common/views/components/media-banner.vue:
 | 
				
			|||||||
  click-to-show: "点击以显示"
 | 
					  click-to-show: "点击以显示"
 | 
				
			||||||
common/views/components/theme.vue:
 | 
					common/views/components/theme.vue:
 | 
				
			||||||
  theme: "主题"
 | 
					  theme: "主题"
 | 
				
			||||||
  light-theme: "主题"
 | 
					  light-theme: "亮色模式使用的主题"
 | 
				
			||||||
  dark-theme: "黑暗模式主题"
 | 
					  dark-theme: "暗色模式使用的主题"
 | 
				
			||||||
  light-themes: "明亮主题"
 | 
					  light-themes: "亮色主题"
 | 
				
			||||||
  dark-themes: "黑暗主题"
 | 
					  dark-themes: "暗色主题"
 | 
				
			||||||
  install-a-theme: "安装一个主题"
 | 
					  install-a-theme: "安装一个主题"
 | 
				
			||||||
  theme-code: "主题代码"
 | 
					  theme-code: "主题代码"
 | 
				
			||||||
  install: "安装"
 | 
					  install: "安装"
 | 
				
			||||||
  installed: "\"{}\" 已被安装"
 | 
					  installed: "\"{}\" 已安装"
 | 
				
			||||||
  create-a-theme: "创建一个主题"
 | 
					  create-a-theme: "创建一个主题"
 | 
				
			||||||
  save-created-theme: "保存主题"
 | 
					  save-created-theme: "保存主题"
 | 
				
			||||||
  primary-color: "原色"
 | 
					  primary-color: "主要颜色"
 | 
				
			||||||
  secondary-color: "合成色"
 | 
					  secondary-color: "次要颜色"
 | 
				
			||||||
  text-color: "文本颜色"
 | 
					  text-color: "文本颜色"
 | 
				
			||||||
  base-theme: "基础主题"
 | 
					  base-theme: "基础主题"
 | 
				
			||||||
  base-theme-light: "亮"
 | 
					  base-theme-light: "亮"
 | 
				
			||||||
@@ -289,7 +290,7 @@ common/views/components/theme.vue:
 | 
				
			|||||||
  preview-created-theme: "预览"
 | 
					  preview-created-theme: "预览"
 | 
				
			||||||
  invalid-theme: "无效主题"
 | 
					  invalid-theme: "无效主题"
 | 
				
			||||||
  already-installed: "这个主题已经被安装。"
 | 
					  already-installed: "这个主题已经被安装。"
 | 
				
			||||||
  saved: "保存"
 | 
					  saved: "已保存"
 | 
				
			||||||
  manage-themes: "主题管理"
 | 
					  manage-themes: "主题管理"
 | 
				
			||||||
  builtin-themes: "标准主题"
 | 
					  builtin-themes: "标准主题"
 | 
				
			||||||
  my-themes: "我的主题"
 | 
					  my-themes: "我的主题"
 | 
				
			||||||
@@ -299,14 +300,14 @@ common/views/components/theme.vue:
 | 
				
			|||||||
  uninstalled: "\"{}\" 已被卸载"
 | 
					  uninstalled: "\"{}\" 已被卸载"
 | 
				
			||||||
  author: "作者"
 | 
					  author: "作者"
 | 
				
			||||||
  desc: "描述"
 | 
					  desc: "描述"
 | 
				
			||||||
  export: "输出"
 | 
					  export: "导出"
 | 
				
			||||||
  import: "输入"
 | 
					  import: "导入"
 | 
				
			||||||
  import-by-code: "或者粘贴代码"
 | 
					  import-by-code: "或者粘贴代码"
 | 
				
			||||||
  theme-name-required: "必须填写主题名称"
 | 
					  theme-name-required: "必须填写主题名称"
 | 
				
			||||||
common/views/components/cw-button.vue:
 | 
					common/views/components/cw-button.vue:
 | 
				
			||||||
  hide: "隐藏"
 | 
					  hide: "隐藏"
 | 
				
			||||||
  show: "查看更多"
 | 
					  show: "查看更多"
 | 
				
			||||||
  chars: "{count} 字"
 | 
					  chars: "{count}个字符"
 | 
				
			||||||
  files: "{count} 个文件"
 | 
					  files: "{count} 个文件"
 | 
				
			||||||
  poll: "调查问卷"
 | 
					  poll: "调查问卷"
 | 
				
			||||||
common/views/components/messaging.vue:
 | 
					common/views/components/messaging.vue:
 | 
				
			||||||
@@ -322,20 +323,20 @@ common/views/components/messaging-room.vue:
 | 
				
			|||||||
common/views/components/messaging-room.form.vue:
 | 
					common/views/components/messaging-room.form.vue:
 | 
				
			||||||
  input-message-here: "在此键入信息"
 | 
					  input-message-here: "在此键入信息"
 | 
				
			||||||
  send: "发送"
 | 
					  send: "发送"
 | 
				
			||||||
  attach-from-local: "从设备中添加文件"
 | 
					  attach-from-local: "从电脑中添加文件"
 | 
				
			||||||
  attach-from-drive: "从云盘中添加文件"
 | 
					  attach-from-drive: "从云盘中添加文件"
 | 
				
			||||||
  only-one-file-attached: "在信息中只允许添加一个附件"
 | 
					  only-one-file-attached: "在信息中只允许添加一个附件"
 | 
				
			||||||
common/views/components/messaging-room.message.vue:
 | 
					common/views/components/messaging-room.message.vue:
 | 
				
			||||||
  is-read: "已阅"
 | 
					  is-read: "已读"
 | 
				
			||||||
  deleted: "这条信息已被删除"
 | 
					  deleted: "此消息已被删除"
 | 
				
			||||||
common/views/components/nav.vue:
 | 
					common/views/components/nav.vue:
 | 
				
			||||||
  about: "关于"
 | 
					  about: "关于 Misskey"
 | 
				
			||||||
  stats: "统计"
 | 
					  stats: "统计"
 | 
				
			||||||
  status: "状态"
 | 
					  status: "状态"
 | 
				
			||||||
  wiki: "百科 (Wiki)"
 | 
					  wiki: "维基百科"
 | 
				
			||||||
  donors: "捐赠者"
 | 
					  donors: "捐赠者"
 | 
				
			||||||
  repository: "源"
 | 
					  repository: "代码库"
 | 
				
			||||||
  develop: "开发者"
 | 
					  develop: "开发人员"
 | 
				
			||||||
  feedback: "反馈"
 | 
					  feedback: "反馈"
 | 
				
			||||||
common/views/components/note-menu.vue:
 | 
					common/views/components/note-menu.vue:
 | 
				
			||||||
  mention: "提到"
 | 
					  mention: "提到"
 | 
				
			||||||
@@ -344,22 +345,28 @@ common/views/components/note-menu.vue:
 | 
				
			|||||||
  copy-link: "复制链接"
 | 
					  copy-link: "复制链接"
 | 
				
			||||||
  favorite: "收藏这个投稿"
 | 
					  favorite: "收藏这个投稿"
 | 
				
			||||||
  unfavorite: "取消收藏"
 | 
					  unfavorite: "取消收藏"
 | 
				
			||||||
 | 
					  watch: "关注"
 | 
				
			||||||
 | 
					  unwatch: "取消关注"
 | 
				
			||||||
  pin: "固定个人资料"
 | 
					  pin: "固定个人资料"
 | 
				
			||||||
  unpin: "解除固定"
 | 
					  unpin: "解除固定"
 | 
				
			||||||
  delete: "删除"
 | 
					  delete: "删除"
 | 
				
			||||||
  delete-confirm: "确定删除这个投稿吗?"
 | 
					  delete-confirm: "确定删除这个投稿吗?"
 | 
				
			||||||
  remote: "显示原始投稿"
 | 
					  remote: "显示原始投稿"
 | 
				
			||||||
common/views/components/user-menu.vue:
 | 
					common/views/components/user-menu.vue:
 | 
				
			||||||
  mention: "提及"
 | 
					  mention: "提到"
 | 
				
			||||||
  mute: "静音"
 | 
					  mute: "免打扰"
 | 
				
			||||||
  unmute: "取消静音"
 | 
					  unmute: "解除免打扰"
 | 
				
			||||||
  block: "屏蔽"
 | 
					  block: "屏蔽"
 | 
				
			||||||
  unblock: "取消屏蔽"
 | 
					  unblock: "取消屏蔽"
 | 
				
			||||||
  push-to-list: "添加至列表"
 | 
					  push-to-list: "添加至列表"
 | 
				
			||||||
  select-list: "请选择一个列表"
 | 
					  select-list: "请选择一个列表"
 | 
				
			||||||
  report-abuse: "举报垃圾邮件"
 | 
					  report-abuse: "举报骚扰"
 | 
				
			||||||
  report-abuse-detail: "做了什么骚扰的行为?"
 | 
					  report-abuse-detail: "做了什么骚扰的行为?"
 | 
				
			||||||
  report-abuse-reported: "已报告给管理员。 非常感谢你的合作。"
 | 
					  report-abuse-reported: "已报告给管理员。 非常感谢你的合作。"
 | 
				
			||||||
 | 
					  silence: "禁言"
 | 
				
			||||||
 | 
					  unsilence: "解除禁言"
 | 
				
			||||||
 | 
					  suspend: "冻结"
 | 
				
			||||||
 | 
					  unsuspend: "解除冻结"
 | 
				
			||||||
common/views/components/poll.vue:
 | 
					common/views/components/poll.vue:
 | 
				
			||||||
  vote-to: "为\"{}\"投票"
 | 
					  vote-to: "为\"{}\"投票"
 | 
				
			||||||
  vote-count: "{}票"
 | 
					  vote-count: "{}票"
 | 
				
			||||||
@@ -374,16 +381,16 @@ common/views/components/poll-editor.vue:
 | 
				
			|||||||
  add: "+添加一个选项"
 | 
					  add: "+添加一个选项"
 | 
				
			||||||
  destroy: "放弃投票"
 | 
					  destroy: "放弃投票"
 | 
				
			||||||
common/views/components/reaction-picker.vue:
 | 
					common/views/components/reaction-picker.vue:
 | 
				
			||||||
  choose-reaction: "选择反应"
 | 
					  choose-reaction: "选择回应"
 | 
				
			||||||
common/views/components/emoji-picker.vue:
 | 
					common/views/components/emoji-picker.vue:
 | 
				
			||||||
  custom-emoji: "自定义 Emoji"
 | 
					  custom-emoji: "自定义表情符号"
 | 
				
			||||||
  people: "人"
 | 
					  people: "人"
 | 
				
			||||||
  animals-and-nature: "动物与自然"
 | 
					  animals-and-nature: "动物与自然"
 | 
				
			||||||
  food-and-drink: "食物与饮品"
 | 
					  food-and-drink: "食物与饮品"
 | 
				
			||||||
  activity: "活动"
 | 
					  activity: "活动"
 | 
				
			||||||
  travel-and-places: "旅行和地点"
 | 
					  travel-and-places: "位置"
 | 
				
			||||||
  objects: "物品"
 | 
					  objects: "物品"
 | 
				
			||||||
  symbols: "标志"
 | 
					  symbols: "符号"
 | 
				
			||||||
  flags: "旗帜"
 | 
					  flags: "旗帜"
 | 
				
			||||||
common/views/components/signin.vue:
 | 
					common/views/components/signin.vue:
 | 
				
			||||||
  username: "用户名"
 | 
					  username: "用户名"
 | 
				
			||||||
@@ -395,7 +402,7 @@ common/views/components/signin.vue:
 | 
				
			|||||||
  signin-with-twitter: "用 Twitter 登录"
 | 
					  signin-with-twitter: "用 Twitter 登录"
 | 
				
			||||||
  signin-with-github: "用 GitHub 登录"
 | 
					  signin-with-github: "用 GitHub 登录"
 | 
				
			||||||
  signin-with-discord: "用 Discord 登录"
 | 
					  signin-with-discord: "用 Discord 登录"
 | 
				
			||||||
  login-failed: "登录失败。请确保您已输入恰当的用户名和密码。"
 | 
					  login-failed: "登录失败。请检查用户名和密码。"
 | 
				
			||||||
common/views/components/signup.vue:
 | 
					common/views/components/signup.vue:
 | 
				
			||||||
  invitation-code: "邀请码"
 | 
					  invitation-code: "邀请码"
 | 
				
			||||||
  invitation-info: "如果您没有邀请码,请联系<a href=\"{}\">管理员</a>。"
 | 
					  invitation-info: "如果您没有邀请码,请联系<a href=\"{}\">管理员</a>。"
 | 
				
			||||||
@@ -404,24 +411,24 @@ common/views/components/signup.vue:
 | 
				
			|||||||
  available: "可用"
 | 
					  available: "可用"
 | 
				
			||||||
  unavailable: "不可用"
 | 
					  unavailable: "不可用"
 | 
				
			||||||
  error: "网络错误"
 | 
					  error: "网络错误"
 | 
				
			||||||
  invalid-format: "可以用字母,数字和_。"
 | 
					  invalid-format: "可使用大小写英文字母、数字和下划线。"
 | 
				
			||||||
  too-short: "不可以留空哦~"
 | 
					  too-short: "请至少输入1个字符!"
 | 
				
			||||||
  too-long: "20字以内。"
 | 
					  too-long: "请不要超过20个字符"
 | 
				
			||||||
  password: "密码"
 | 
					  password: "密码"
 | 
				
			||||||
  password-placeholder: "推荐使用8个字符以上的密码。"
 | 
					  password-placeholder: "推荐使用8个字符以上的密码。"
 | 
				
			||||||
  weak-password: "弱强度密码"
 | 
					  weak-password: "密码强度:弱"
 | 
				
			||||||
  normal-password: "适中强度的密码"
 | 
					  normal-password: "密码强度:中等"
 | 
				
			||||||
  strong-password: "没问题"
 | 
					  strong-password: "密码强度:强"
 | 
				
			||||||
  retype: "重新输入"
 | 
					  retype: "重新输入"
 | 
				
			||||||
  retype-placeholder: "重新键入您的密码"
 | 
					  retype-placeholder: "重新输入您的密码"
 | 
				
			||||||
  password-matched: "确认"
 | 
					  password-matched: "确认"
 | 
				
			||||||
  password-not-matched: "密码不一致"
 | 
					  password-not-matched: "密码不一致"
 | 
				
			||||||
  recaptcha: "认证"
 | 
					  recaptcha: "验证"
 | 
				
			||||||
  create: "创建一个账户"
 | 
					  create: "创建一个账户"
 | 
				
			||||||
  some-error: "由于某种原因,创建帐户失败。请再试一次。"
 | 
					  some-error: "由于某种原因,创建帐户失败。请再试一次。"
 | 
				
			||||||
common/views/components/special-message.vue:
 | 
					common/views/components/special-message.vue:
 | 
				
			||||||
  new-year: "新年快乐哦~"
 | 
					  new-year: "新年快乐哦~"
 | 
				
			||||||
  christmas: "Merry Christmas!"
 | 
					  christmas: "圣诞快乐!"
 | 
				
			||||||
common/views/components/stream-indicator.vue:
 | 
					common/views/components/stream-indicator.vue:
 | 
				
			||||||
  connecting: "连接中"
 | 
					  connecting: "连接中"
 | 
				
			||||||
  reconnecting: "重新连接中"
 | 
					  reconnecting: "重新连接中"
 | 
				
			||||||
@@ -436,8 +443,8 @@ common/views/components/notification-settings.vue:
 | 
				
			|||||||
common/views/components/integration-settings.vue:
 | 
					common/views/components/integration-settings.vue:
 | 
				
			||||||
  title: "服务合作"
 | 
					  title: "服务合作"
 | 
				
			||||||
  connect: "连接"
 | 
					  connect: "连接"
 | 
				
			||||||
  disconnect: "未连接"
 | 
					  disconnect: "断开连接"
 | 
				
			||||||
  connected-to: "您的账号已连接一下社交账号"
 | 
					  connected-to: "您的账号已连接以下社交账号"
 | 
				
			||||||
common/views/components/github-setting.vue:
 | 
					common/views/components/github-setting.vue:
 | 
				
			||||||
  description: "当您用GitHub连接Misskey账户后,您将能够看到有关您自己的信息,并且您将能够使用GitHub登录。"
 | 
					  description: "当您用GitHub连接Misskey账户后,您将能够看到有关您自己的信息,并且您将能够使用GitHub登录。"
 | 
				
			||||||
  connected-to: "此账户已连接GitHub"
 | 
					  connected-to: "此账户已连接GitHub"
 | 
				
			||||||
@@ -451,7 +458,7 @@ common/views/components/discord-setting.vue:
 | 
				
			|||||||
  detail: "详细信息..."
 | 
					  detail: "详细信息..."
 | 
				
			||||||
  reconnect: "重新连接"
 | 
					  reconnect: "重新连接"
 | 
				
			||||||
  connect: "连接您的Discord账户"
 | 
					  connect: "连接您的Discord账户"
 | 
				
			||||||
  disconnect: "未连接"
 | 
					  disconnect: "断开连接"
 | 
				
			||||||
common/views/components/uploader.vue:
 | 
					common/views/components/uploader.vue:
 | 
				
			||||||
  waiting: "等待中"
 | 
					  waiting: "等待中"
 | 
				
			||||||
common/views/components/visibility-chooser.vue:
 | 
					common/views/components/visibility-chooser.vue:
 | 
				
			||||||
@@ -463,50 +470,58 @@ common/views/components/visibility-chooser.vue:
 | 
				
			|||||||
  specified: "直接"
 | 
					  specified: "直接"
 | 
				
			||||||
  specified-desc: "仅发送至指定用户"
 | 
					  specified-desc: "仅发送至指定用户"
 | 
				
			||||||
  local-public: "公开(仅限本地)"
 | 
					  local-public: "公开(仅限本地)"
 | 
				
			||||||
  local-public-desc: "不要发布到公开"
 | 
					  local-public-desc: "不要公开发布"
 | 
				
			||||||
  local-home: "首页(仅限本地)"
 | 
					  local-home: "首页(仅限本地)"
 | 
				
			||||||
  local-followers: "关注者(仅限本地)"
 | 
					  local-followers: "关注者(仅限本地)"
 | 
				
			||||||
common/views/components/trends.vue:
 | 
					common/views/components/trends.vue:
 | 
				
			||||||
  count: "{} 被提到"
 | 
					  count: "{} 被提到"
 | 
				
			||||||
  empty: "没有流行的标签"
 | 
					  empty: "没有趋势"
 | 
				
			||||||
common/views/components/language-settings.vue:
 | 
					common/views/components/language-settings.vue:
 | 
				
			||||||
  title: "显示语言"
 | 
					  title: "显示语言"
 | 
				
			||||||
  pick-language: "选择一个语言"
 | 
					  pick-language: "选择语言"
 | 
				
			||||||
  recommended: "推荐"
 | 
					  recommended: "推荐"
 | 
				
			||||||
  auto: "自动"
 | 
					  auto: "自动"
 | 
				
			||||||
  specify-language: "指定语言"
 | 
					  specify-language: "指定语言"
 | 
				
			||||||
  info: "你需要刷新这个页面来应用更改。"
 | 
					  info: "更改将在刷新页面后生效。"
 | 
				
			||||||
common/views/components/profile-editor.vue:
 | 
					common/views/components/profile-editor.vue:
 | 
				
			||||||
  title: "简况"
 | 
					  title: "个人资料"
 | 
				
			||||||
  name: "名称"
 | 
					  name: "名称"
 | 
				
			||||||
  account: "账户"
 | 
					  account: "账户"
 | 
				
			||||||
  location: "位置"
 | 
					  location: "位置"
 | 
				
			||||||
  description: "关于我"
 | 
					  description: "个人简介"
 | 
				
			||||||
 | 
					  you-can-include-hashtags: "您可以包含一个哈希标签。"
 | 
				
			||||||
  language: "语言"
 | 
					  language: "语言"
 | 
				
			||||||
  birthday: "生日"
 | 
					  birthday: "生日"
 | 
				
			||||||
  avatar: "头像"
 | 
					  avatar: "头像"
 | 
				
			||||||
  banner: "背景"
 | 
					  banner: "横幅背景"
 | 
				
			||||||
  is-cat: "这个账户是 Cat"
 | 
					  is-cat: "这个账户是CAT"
 | 
				
			||||||
  is-bot: "整个账户是机器人"
 | 
					  is-bot: "这个账户是BOT"
 | 
				
			||||||
  is-locked: "关注者请求需要批准"
 | 
					  is-locked: "关注者请求需要批准"
 | 
				
			||||||
  careful-bot: "机器人的关注者请求需要批准"
 | 
					  careful-bot: "BOT的关注者请求需要批准"
 | 
				
			||||||
  auto-accept-followed: "自动同意来自您关注的人的关注申请"
 | 
					  auto-accept-followed: "自动同意来自您关注的人的关注申请"
 | 
				
			||||||
  advanced: "其他选项"
 | 
					  advanced: "其他"
 | 
				
			||||||
  privacy: "隐私"
 | 
					  privacy: "隐私"
 | 
				
			||||||
  save: "保存"
 | 
					  save: "保存"
 | 
				
			||||||
  saved: "更新配置文件成功"
 | 
					  saved: "您的个人资料已保存"
 | 
				
			||||||
  uploading: "正在上传"
 | 
					  uploading: "正在上传"
 | 
				
			||||||
  upload-failed: "上传失败"
 | 
					  upload-failed: "上传失败"
 | 
				
			||||||
  email: "邮件设置"
 | 
					  email: "邮件设置"
 | 
				
			||||||
  email-address: "电子邮件地址"
 | 
					  email-address: "电子邮件地址"
 | 
				
			||||||
  email-verified: "电子邮件地址已验证"
 | 
					  email-verified: "电子邮件地址已验证"
 | 
				
			||||||
  email-not-verified: "电子邮件地址还没有验证哦, 请检查一下收信箱吧~"
 | 
					  email-not-verified: "邮件地址尚未验证。 请检查您的邮箱。"
 | 
				
			||||||
 | 
					  export: "导出"
 | 
				
			||||||
 | 
					  export-targets:
 | 
				
			||||||
 | 
					    all-notes: "すべての投稿データ"
 | 
				
			||||||
 | 
					    following-list: "フォロー"
 | 
				
			||||||
 | 
					    mute-list: "ミュート"
 | 
				
			||||||
 | 
					    blocking-list: "ブロック"
 | 
				
			||||||
 | 
					  export-requested: "导出请求已提交。可能需要花一些时间。导出的文件将保存到网盘中。"
 | 
				
			||||||
common/views/components/user-list-editor.vue:
 | 
					common/views/components/user-list-editor.vue:
 | 
				
			||||||
  users: "用户"
 | 
					  users: "用户"
 | 
				
			||||||
  rename: "重命名列表"
 | 
					  rename: "重命名列表"
 | 
				
			||||||
  delete: "删除列表"
 | 
					  delete: "删除列表"
 | 
				
			||||||
  remove-user: "从此列表中删除"
 | 
					  remove-user: "从此列表中删除"
 | 
				
			||||||
  delete-are-you-sure: "删除列表 \"$1\"?"
 | 
					  delete-are-you-sure: "删除列表“$1”?"
 | 
				
			||||||
  deleted: "已删除"
 | 
					  deleted: "已删除"
 | 
				
			||||||
common/views/widgets/broadcast.vue:
 | 
					common/views/widgets/broadcast.vue:
 | 
				
			||||||
  fetching: "确认中"
 | 
					  fetching: "确认中"
 | 
				
			||||||
@@ -517,9 +532,9 @@ common/views/widgets/calendar.vue:
 | 
				
			|||||||
  year: "{}年"
 | 
					  year: "{}年"
 | 
				
			||||||
  month: "{}月"
 | 
					  month: "{}月"
 | 
				
			||||||
  day: "{}日"
 | 
					  day: "{}日"
 | 
				
			||||||
  today: "今天:"
 | 
					  today: "今天:"
 | 
				
			||||||
  this-month: "本月:"
 | 
					  this-month: "本月:"
 | 
				
			||||||
  this-year: "今年:"
 | 
					  this-year: "今年:"
 | 
				
			||||||
common/views/widgets/photo-stream.vue:
 | 
					common/views/widgets/photo-stream.vue:
 | 
				
			||||||
  title: "图片轮播"
 | 
					  title: "图片轮播"
 | 
				
			||||||
  no-photos: "没有图片"
 | 
					  no-photos: "没有图片"
 | 
				
			||||||
@@ -557,11 +572,11 @@ common/views/widgets/tips.vue:
 | 
				
			|||||||
  tips-line19: "可以在浏览器外部分离多个窗口。"
 | 
					  tips-line19: "可以在浏览器外部分离多个窗口。"
 | 
				
			||||||
  tips-line20: "日历小部件的百分比显示经过的时间百分比。"
 | 
					  tips-line20: "日历小部件的百分比显示经过的时间百分比。"
 | 
				
			||||||
  tips-line21: "您也可以使用API开发机器人。"
 | 
					  tips-line21: "您也可以使用API开发机器人。"
 | 
				
			||||||
  tips-line23: "Ai-chan kawaii!"
 | 
					  tips-line23: "小蓝很可爱"
 | 
				
			||||||
  tips-line24: "Misskey自2014年开始运营。"
 | 
					  tips-line24: "Misskey自2014年开始运营。"
 | 
				
			||||||
  tips-line25: "在与通知功能兼容的浏览器中,您可以在Misskey未打开的情况下接收通知"
 | 
					  tips-line25: "在与通知功能兼容的浏览器中,您可以在Misskey未打开的情况下接收通知"
 | 
				
			||||||
common/views/pages/not-found.vue:
 | 
					common/views/pages/not-found.vue:
 | 
				
			||||||
  page-not-found: "啊喔, 页面走丢了..."
 | 
					  page-not-found: "您要找的网页不存在。"
 | 
				
			||||||
common/views/pages/follow.vue:
 | 
					common/views/pages/follow.vue:
 | 
				
			||||||
  signed-in-as: "用 {}登录"
 | 
					  signed-in-as: "用 {}登录"
 | 
				
			||||||
  following: "正在关注"
 | 
					  following: "正在关注"
 | 
				
			||||||
@@ -583,7 +598,7 @@ desktop:
 | 
				
			|||||||
  invalid-filetype: "不接受此文件类型"
 | 
					  invalid-filetype: "不接受此文件类型"
 | 
				
			||||||
desktop/views/components/activity.chart.vue:
 | 
					desktop/views/components/activity.chart.vue:
 | 
				
			||||||
  total: "黑 ... 总计"
 | 
					  total: "黑 ... 总计"
 | 
				
			||||||
  notes: "蓝 ... Notes"
 | 
					  notes: "蓝 ... 投稿"
 | 
				
			||||||
  replies: "红 ... 回复"
 | 
					  replies: "红 ... 回复"
 | 
				
			||||||
  renotes: "绿 ... 转发"
 | 
					  renotes: "绿 ... 转发"
 | 
				
			||||||
desktop/views/components/activity.vue:
 | 
					desktop/views/components/activity.vue:
 | 
				
			||||||
@@ -591,9 +606,9 @@ desktop/views/components/activity.vue:
 | 
				
			|||||||
  toggle: "切换显示"
 | 
					  toggle: "切换显示"
 | 
				
			||||||
desktop/views/components/calendar.vue:
 | 
					desktop/views/components/calendar.vue:
 | 
				
			||||||
  title: "{year}年{month}月"
 | 
					  title: "{year}年{month}月"
 | 
				
			||||||
  prev: "前一个月"
 | 
					  prev: "上个月"
 | 
				
			||||||
  next: "下一个月"
 | 
					  next: "下个月"
 | 
				
			||||||
  go: "点击已启用时间旅行"
 | 
					  go: "点击按时间浏览"
 | 
				
			||||||
desktop/views/components/choose-file-from-drive-window.vue:
 | 
					desktop/views/components/choose-file-from-drive-window.vue:
 | 
				
			||||||
  chosen-files: "{count}文件已被选择"
 | 
					  chosen-files: "{count}文件已被选择"
 | 
				
			||||||
  upload: "从设备中上传文件"
 | 
					  upload: "从设备中上传文件"
 | 
				
			||||||
@@ -658,9 +673,6 @@ desktop/views/components/drive.vue:
 | 
				
			|||||||
    create-folder: "创建文件夹"
 | 
					    create-folder: "创建文件夹"
 | 
				
			||||||
    upload: "上传文件"
 | 
					    upload: "上传文件"
 | 
				
			||||||
    url-upload: "从URL上传"
 | 
					    url-upload: "从URL上传"
 | 
				
			||||||
desktop/views/components/media-image.vue:
 | 
					 | 
				
			||||||
  sensitive: "阅读注意"
 | 
					 | 
				
			||||||
  click-to-show: "点击以显示"
 | 
					 | 
				
			||||||
desktop/views/components/media-video.vue:
 | 
					desktop/views/components/media-video.vue:
 | 
				
			||||||
  sensitive: "阅读注意"
 | 
					  sensitive: "阅读注意"
 | 
				
			||||||
  click-to-show: "点击以显示"
 | 
					  click-to-show: "点击以显示"
 | 
				
			||||||
@@ -764,7 +776,7 @@ desktop/views/pages/user-following-or-followers.vue:
 | 
				
			|||||||
desktop/views/components/settings-window.vue:
 | 
					desktop/views/components/settings-window.vue:
 | 
				
			||||||
  settings: "设置"
 | 
					  settings: "设置"
 | 
				
			||||||
desktop/views/components/settings.vue:
 | 
					desktop/views/components/settings.vue:
 | 
				
			||||||
  profile: "个人简介"
 | 
					  profile: "个人资料"
 | 
				
			||||||
  notification: "通知"
 | 
					  notification: "通知"
 | 
				
			||||||
  apps: "应用程序"
 | 
					  apps: "应用程序"
 | 
				
			||||||
  tags: "标签"
 | 
					  tags: "标签"
 | 
				
			||||||
@@ -808,7 +820,7 @@ desktop/views/components/settings.vue:
 | 
				
			|||||||
  show-my-renotes: "在时间表中显示Renote"
 | 
					  show-my-renotes: "在时间表中显示Renote"
 | 
				
			||||||
  show-renoted-my-notes: "在时间线上显示我的Renote"
 | 
					  show-renoted-my-notes: "在时间线上显示我的Renote"
 | 
				
			||||||
  show-local-renotes: "在时间线中显示Local Renote(s)"
 | 
					  show-local-renotes: "在时间线中显示Local Renote(s)"
 | 
				
			||||||
  show-maps: "显示地图以显示位置"
 | 
					  show-maps: "自动显示地图"
 | 
				
			||||||
  remain-deleted-note: "继续显示已删除的帖子"
 | 
					  remain-deleted-note: "继续显示已删除的帖子"
 | 
				
			||||||
  deck-column-align: "列对齐设置"
 | 
					  deck-column-align: "列对齐设置"
 | 
				
			||||||
  deck-column-align-center: "中央"
 | 
					  deck-column-align-center: "中央"
 | 
				
			||||||
@@ -875,6 +887,9 @@ desktop/views/components/settings.2fa.vue:
 | 
				
			|||||||
  success: "设置完成"
 | 
					  success: "设置完成"
 | 
				
			||||||
  failed: "设置失败, 请确保您的密钥是正确的。"
 | 
					  failed: "设置失败, 请确保您的密钥是正确的。"
 | 
				
			||||||
  info: "从下次登录Misskey时,您的设备上显示的令牌以及密码也是必需的。"
 | 
					  info: "从下次登录Misskey时,您的设备上显示的令牌以及密码也是必需的。"
 | 
				
			||||||
 | 
					common/views/components/media-image.vue:
 | 
				
			||||||
 | 
					  sensitive: "阅读注意"
 | 
				
			||||||
 | 
					  click-to-show: "点击查看"
 | 
				
			||||||
common/views/components/api-settings.vue:
 | 
					common/views/components/api-settings.vue:
 | 
				
			||||||
  intro: "要访问API,请将此标记设置为请求参数的关键字“i”。"
 | 
					  intro: "要访问API,请将此标记设置为请求参数的关键字“i”。"
 | 
				
			||||||
  caution: "请勿将此令牌输入任何应用,也不要将此令牌告诉其他人,否则您的账户可能会受到损害。"
 | 
					  caution: "请勿将此令牌输入任何应用,也不要将此令牌告诉其他人,否则您的账户可能会受到损害。"
 | 
				
			||||||
@@ -942,7 +957,7 @@ desktop/views/components/ui.header.vue:
 | 
				
			|||||||
  welcome-back: "欢迎回来!"
 | 
					  welcome-back: "欢迎回来!"
 | 
				
			||||||
  adjective: "先生"
 | 
					  adjective: "先生"
 | 
				
			||||||
desktop/views/components/ui.header.account.vue:
 | 
					desktop/views/components/ui.header.account.vue:
 | 
				
			||||||
  profile: "您的个人资料"
 | 
					  profile: "个人资料"
 | 
				
			||||||
  favorites: "最爱"
 | 
					  favorites: "最爱"
 | 
				
			||||||
  lists: "列表"
 | 
					  lists: "列表"
 | 
				
			||||||
  follow-requests: "关注申请"
 | 
					  follow-requests: "关注申请"
 | 
				
			||||||
@@ -992,6 +1007,7 @@ admin/views/index.vue:
 | 
				
			|||||||
  announcements: "公告"
 | 
					  announcements: "公告"
 | 
				
			||||||
  hashtags: "标签"
 | 
					  hashtags: "标签"
 | 
				
			||||||
  abuse: "举报垃圾信息"
 | 
					  abuse: "举报垃圾信息"
 | 
				
			||||||
 | 
					  queue: "ジョブキュー"
 | 
				
			||||||
  back-to-misskey: "返回 Misskey"
 | 
					  back-to-misskey: "返回 Misskey"
 | 
				
			||||||
admin/views/dashboard.vue:
 | 
					admin/views/dashboard.vue:
 | 
				
			||||||
  dashboard: "Dashboard"
 | 
					  dashboard: "Dashboard"
 | 
				
			||||||
@@ -1001,6 +1017,9 @@ admin/views/dashboard.vue:
 | 
				
			|||||||
  instances: "例子"
 | 
					  instances: "例子"
 | 
				
			||||||
  this-instance: "此实例"
 | 
					  this-instance: "此实例"
 | 
				
			||||||
  federated: "联合"
 | 
					  federated: "联合"
 | 
				
			||||||
 | 
					admin/views/queue.vue:
 | 
				
			||||||
 | 
					  operation: "操作"
 | 
				
			||||||
 | 
					  remove-all-jobs: "すべてのジョブをクリア"
 | 
				
			||||||
admin/views/abuse.vue:
 | 
					admin/views/abuse.vue:
 | 
				
			||||||
  title: "举报垃圾信息"
 | 
					  title: "举报垃圾信息"
 | 
				
			||||||
  target: "目标"
 | 
					  target: "目标"
 | 
				
			||||||
@@ -1126,30 +1145,32 @@ admin/views/drive.vue:
 | 
				
			|||||||
  deleted: "已删除"
 | 
					  deleted: "已删除"
 | 
				
			||||||
  mark-as-sensitive: "标记为“敏感”"
 | 
					  mark-as-sensitive: "标记为“敏感”"
 | 
				
			||||||
  unmark-as-sensitive: "取消标记为“敏感”"
 | 
					  unmark-as-sensitive: "取消标记为“敏感”"
 | 
				
			||||||
  marked-as-sensitive: "标记为关注"
 | 
					  marked-as-sensitive: "标记为“敏感”"
 | 
				
			||||||
  unmarked-as-sensitive: "解除关注标记"
 | 
					  unmarked-as-sensitive: "取消标记为“敏感”"
 | 
				
			||||||
admin/views/users.vue:
 | 
					admin/views/users.vue:
 | 
				
			||||||
  operation: "操作"
 | 
					  operation: "操作"
 | 
				
			||||||
  username-or-userid: "用户名或用户ID"
 | 
					  username-or-userid: "用户名或用户ID"
 | 
				
			||||||
  user-not-found: "用户不存在"
 | 
					  user-not-found: "用户不存在"
 | 
				
			||||||
  lookup: "订阅"
 | 
					  lookup: "订阅"
 | 
				
			||||||
  reset-password: "密码重置"
 | 
					  reset-password: "密码重置"
 | 
				
			||||||
  reset-password-confirm: "パスワードをリセットしますか?"
 | 
					  reset-password-confirm: "是否重置密码?"
 | 
				
			||||||
  password-updated: "密码为「{password}」"
 | 
					  password-updated: "密码为「{password}」"
 | 
				
			||||||
  suspend: "被冻结"
 | 
					  suspend: "被冻结"
 | 
				
			||||||
  suspend-confirm: "凍結しますか?"
 | 
					  suspend-confirm: "是否冻结?"
 | 
				
			||||||
  suspended: "成功冻结用户"
 | 
					  suspended: "成功冻结用户"
 | 
				
			||||||
  unsuspend: "已解除冻结"
 | 
					  unsuspend: "已解除冻结"
 | 
				
			||||||
  unsuspend-confirm: "凍結を解除しますか?"
 | 
					  unsuspend-confirm: "是否解除冻结?"
 | 
				
			||||||
  unsuspended: "已成功解除用户冻结"
 | 
					  unsuspended: "已成功解除用户冻结"
 | 
				
			||||||
 | 
					  make-silence: "禁言"
 | 
				
			||||||
 | 
					  unmake-silence: "解除禁言"
 | 
				
			||||||
  verify: "认证用户"
 | 
					  verify: "认证用户"
 | 
				
			||||||
  verify-confirm: "公式アカウントにしますか?"
 | 
					  verify-confirm: "是否官方账号?"
 | 
				
			||||||
  verified: "此账户已被认证"
 | 
					  verified: "此账户已被认证"
 | 
				
			||||||
  unverify: "解除账户认证"
 | 
					  unverify: "解除账户认证"
 | 
				
			||||||
  unverify-confirm: "公式アカウントを解除しますか?"
 | 
					  unverify-confirm: "是否解除官方账号认证?"
 | 
				
			||||||
  unverified: "该帐户未经认证"
 | 
					  unverified: "该帐户未经认证"
 | 
				
			||||||
  update-remote-user: "リモートユーザー情報の更新"
 | 
					  update-remote-user: "更新远程用户信息"
 | 
				
			||||||
  remote-user-updated: "リモートユーザー情報を更新しました"
 | 
					  remote-user-updated: "远程用户信息已更新"
 | 
				
			||||||
  users:
 | 
					  users:
 | 
				
			||||||
    title: "用户"
 | 
					    title: "用户"
 | 
				
			||||||
    sort:
 | 
					    sort:
 | 
				
			||||||
@@ -1178,7 +1199,7 @@ admin/views/moderators.vue:
 | 
				
			|||||||
    title: "注册版主"
 | 
					    title: "注册版主"
 | 
				
			||||||
    add: "注册"
 | 
					    add: "注册"
 | 
				
			||||||
    added: "已注册版主。"
 | 
					    added: "已注册版主。"
 | 
				
			||||||
    remove: "解除"
 | 
					    remove: "取消"
 | 
				
			||||||
    removed: "取消注册版主"
 | 
					    removed: "取消注册版主"
 | 
				
			||||||
admin/views/emoji.vue:
 | 
					admin/views/emoji.vue:
 | 
				
			||||||
  add-emoji:
 | 
					  add-emoji:
 | 
				
			||||||
@@ -1192,12 +1213,12 @@ admin/views/emoji.vue:
 | 
				
			|||||||
    info: "我们建议使用50KB以下的PNG图像。"
 | 
					    info: "我们建议使用50KB以下的PNG图像。"
 | 
				
			||||||
    added: "Emoji 已添加"
 | 
					    added: "Emoji 已添加"
 | 
				
			||||||
  emojis:
 | 
					  emojis:
 | 
				
			||||||
    title: "Emojis"
 | 
					    title: "表情符号列表"
 | 
				
			||||||
    update: "更新"
 | 
					    update: "更新"
 | 
				
			||||||
    remove: "移除"
 | 
					    remove: "移除"
 | 
				
			||||||
  updated: "已更新"
 | 
					  updated: "已更新"
 | 
				
			||||||
  remove-emoji:
 | 
					  remove-emoji:
 | 
				
			||||||
    are-you-sure: "删除 \"%1$s\"?"
 | 
					    are-you-sure: "删除「$1」?"
 | 
				
			||||||
    removed: "已删除"
 | 
					    removed: "已删除"
 | 
				
			||||||
admin/views/announcements.vue:
 | 
					admin/views/announcements.vue:
 | 
				
			||||||
  announcements: "公告"
 | 
					  announcements: "公告"
 | 
				
			||||||
@@ -1208,7 +1229,7 @@ admin/views/announcements.vue:
 | 
				
			|||||||
  text: "内容"
 | 
					  text: "内容"
 | 
				
			||||||
  saved: "已保存"
 | 
					  saved: "已保存"
 | 
				
			||||||
  _remove:
 | 
					  _remove:
 | 
				
			||||||
    are-you-sure: "删除 \"%1$s\"?"
 | 
					    are-you-sure: "删除「$1」?"
 | 
				
			||||||
    removed: "已删除"
 | 
					    removed: "已删除"
 | 
				
			||||||
admin/views/hashtags.vue:
 | 
					admin/views/hashtags.vue:
 | 
				
			||||||
  hided-tags: "隐藏标签"
 | 
					  hided-tags: "隐藏标签"
 | 
				
			||||||
@@ -1249,15 +1270,15 @@ desktop/views/pages/user-list.users.vue:
 | 
				
			|||||||
  username: "用户名"
 | 
					  username: "用户名"
 | 
				
			||||||
desktop/views/pages/user/user.followers-you-know.vue:
 | 
					desktop/views/pages/user/user.followers-you-know.vue:
 | 
				
			||||||
  title: "您可能认识的关注者"
 | 
					  title: "您可能认识的关注者"
 | 
				
			||||||
  loading: "正在加载, 请耐心等待哦~"
 | 
					  loading: "正在加载中"
 | 
				
			||||||
  no-users: "没有你知道的关注者"
 | 
					  no-users: "没有你知道的关注者"
 | 
				
			||||||
desktop/views/pages/user/user.friends.vue:
 | 
					desktop/views/pages/user/user.friends.vue:
 | 
				
			||||||
  title: "活跃用户"
 | 
					  title: "活跃用户"
 | 
				
			||||||
  loading: "正在加载, 等着就好啦"
 | 
					  loading: "正在加载中"
 | 
				
			||||||
  no-users: "没有活跃用户"
 | 
					  no-users: "没有活跃用户"
 | 
				
			||||||
desktop/views/pages/user/user.photos.vue:
 | 
					desktop/views/pages/user/user.photos.vue:
 | 
				
			||||||
  title: "照片"
 | 
					  title: "照片"
 | 
				
			||||||
  loading: "正在加载, 请耐心等待哦~"
 | 
					  loading: "正在加载中"
 | 
				
			||||||
  no-photos: "没有图片"
 | 
					  no-photos: "没有图片"
 | 
				
			||||||
desktop/views/pages/user/user.profile.vue:
 | 
					desktop/views/pages/user/user.profile.vue:
 | 
				
			||||||
  follows-you: "关注您"
 | 
					  follows-you: "关注您"
 | 
				
			||||||
@@ -1308,7 +1329,7 @@ mobile/views/components/drive.vue:
 | 
				
			|||||||
  nothing-in-drive: "云盘上没有任何东西"
 | 
					  nothing-in-drive: "云盘上没有任何东西"
 | 
				
			||||||
  folder-is-empty: "这文件夹是空的"
 | 
					  folder-is-empty: "这文件夹是空的"
 | 
				
			||||||
  prompt: "您想要干什么呢?(请输入数字):<1 → 上传文件 | 2 → 从URL上传文件 | 3 → 创建新文件夹 | 4 → 更改这个文件夹的名称 | 5 → 移动这个文件夹 | 6 → 删除这个文件夹>"
 | 
					  prompt: "您想要干什么呢?(请输入数字):<1 → 上传文件 | 2 → 从URL上传文件 | 3 → 创建新文件夹 | 4 → 更改这个文件夹的名称 | 5 → 移动这个文件夹 | 6 → 删除这个文件夹>"
 | 
				
			||||||
  deletion-alert: "抱歉! 尚未删除文件夹。"
 | 
					  deletion-alert: "抱歉! 删除文件夹功能尚未实现。"
 | 
				
			||||||
  folder-name: "文件夹名称"
 | 
					  folder-name: "文件夹名称"
 | 
				
			||||||
  root-rename-alert: "您目前在root模式; 它无法重命名,因为它不是文件夹。 导航到要重命名的文件夹,然后重试。"
 | 
					  root-rename-alert: "您目前在root模式; 它无法重命名,因为它不是文件夹。 导航到要重命名的文件夹,然后重试。"
 | 
				
			||||||
  root-move-alert: "您目前在root模式; 它无法移动,因为它不是文件夹。 导航到要移动的文件夹,然后重试。"
 | 
					  root-move-alert: "您目前在root模式; 它无法移动,因为它不是文件夹。 导航到要移动的文件夹,然后重试。"
 | 
				
			||||||
@@ -1329,9 +1350,6 @@ mobile/views/components/drive.file-detail.vue:
 | 
				
			|||||||
  nsfw: "阅读注意"
 | 
					  nsfw: "阅读注意"
 | 
				
			||||||
  mark-as-sensitive: "标记为“敏感”"
 | 
					  mark-as-sensitive: "标记为“敏感”"
 | 
				
			||||||
  unmark-as-sensitive: "取消标记为“敏感”"
 | 
					  unmark-as-sensitive: "取消标记为“敏感”"
 | 
				
			||||||
mobile/views/components/media-image.vue:
 | 
					 | 
				
			||||||
  sensitive: "阅读注意"
 | 
					 | 
				
			||||||
  click-to-show: "点击以显示"
 | 
					 | 
				
			||||||
mobile/views/components/media-video.vue:
 | 
					mobile/views/components/media-video.vue:
 | 
				
			||||||
  sensitive: "阅读注意"
 | 
					  sensitive: "阅读注意"
 | 
				
			||||||
  click-to-show: "点击以显示"
 | 
					  click-to-show: "点击以显示"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										101
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										101
									
								
								package.json
									
									
									
									
									
								
							@@ -1,14 +1,18 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	"name": "misskey",
 | 
						"name": "misskey",
 | 
				
			||||||
	"author": "syuilo <i@syuilo.com>",
 | 
						"author": "syuilo <i@syuilo.com>",
 | 
				
			||||||
	"version": "10.79.0",
 | 
						"version": "10.82.4",
 | 
				
			||||||
	"clientVersion": "2.0.13835",
 | 
						"clientVersion": "2.0.14193",
 | 
				
			||||||
	"codename": "nighthike",
 | 
						"codename": "nighthike",
 | 
				
			||||||
	"main": "./built/index.js",
 | 
						"repository": {
 | 
				
			||||||
 | 
							"type": "git",
 | 
				
			||||||
 | 
							"url": "https://github.com/syuilo/misskey.git"
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						"main": "./index.js",
 | 
				
			||||||
	"private": true,
 | 
						"private": true,
 | 
				
			||||||
	"scripts": {
 | 
						"scripts": {
 | 
				
			||||||
		"start": "node ./built",
 | 
							"start": "node ./index.js",
 | 
				
			||||||
		"debug": "DEBUG=misskey:* node ./built",
 | 
							"debug": "DEBUG=misskey:* node ./index.js",
 | 
				
			||||||
		"build": "webpack && gulp build",
 | 
							"build": "webpack && gulp build",
 | 
				
			||||||
		"webpack": "webpack",
 | 
							"webpack": "webpack",
 | 
				
			||||||
		"watch": "webpack --watch",
 | 
							"watch": "webpack --watch",
 | 
				
			||||||
@@ -19,10 +23,13 @@
 | 
				
			|||||||
		"test": "gulp test",
 | 
							"test": "gulp test",
 | 
				
			||||||
		"format": "gulp format"
 | 
							"format": "gulp format"
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
						"resolutions": {
 | 
				
			||||||
 | 
							"terser": "3.14.1"
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
	"dependencies": {
 | 
						"dependencies": {
 | 
				
			||||||
		"@fortawesome/fontawesome-svg-core": "1.2.12",
 | 
							"@fortawesome/fontawesome-svg-core": "1.2.14",
 | 
				
			||||||
		"@fortawesome/free-brands-svg-icons": "5.6.3",
 | 
							"@fortawesome/free-brands-svg-icons": "5.7.1",
 | 
				
			||||||
		"@fortawesome/free-regular-svg-icons": "5.5.0",
 | 
							"@fortawesome/free-regular-svg-icons": "5.7.0",
 | 
				
			||||||
		"@fortawesome/free-solid-svg-icons": "5.6.3",
 | 
							"@fortawesome/free-solid-svg-icons": "5.6.3",
 | 
				
			||||||
		"@fortawesome/vue-fontawesome": "0.1.5",
 | 
							"@fortawesome/vue-fontawesome": "0.1.5",
 | 
				
			||||||
		"@koa/cors": "2.2.3",
 | 
							"@koa/cors": "2.2.3",
 | 
				
			||||||
@@ -31,12 +38,11 @@
 | 
				
			|||||||
		"@types/bcryptjs": "2.4.2",
 | 
							"@types/bcryptjs": "2.4.2",
 | 
				
			||||||
		"@types/chai-http": "3.0.5",
 | 
							"@types/chai-http": "3.0.5",
 | 
				
			||||||
		"@types/dateformat": "3.0.0",
 | 
							"@types/dateformat": "3.0.0",
 | 
				
			||||||
		"@types/debug": "0.0.31",
 | 
					 | 
				
			||||||
		"@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.30",
 | 
							"@types/elasticsearch": "5.0.30",
 | 
				
			||||||
		"@types/file-type": "10.6.0",
 | 
							"@types/file-type": "10.6.0",
 | 
				
			||||||
		"@types/gulp": "3.8.36",
 | 
							"@types/gulp": "4.0.5",
 | 
				
			||||||
		"@types/gulp-mocha": "0.0.32",
 | 
							"@types/gulp-mocha": "0.0.32",
 | 
				
			||||||
		"@types/gulp-rename": "0.0.33",
 | 
							"@types/gulp-rename": "0.0.33",
 | 
				
			||||||
		"@types/gulp-replace": "0.0.31",
 | 
							"@types/gulp-replace": "0.0.31",
 | 
				
			||||||
@@ -45,27 +51,30 @@
 | 
				
			|||||||
		"@types/is-root": "1.0.0",
 | 
							"@types/is-root": "1.0.0",
 | 
				
			||||||
		"@types/is-svg": "3.0.0",
 | 
							"@types/is-svg": "3.0.0",
 | 
				
			||||||
		"@types/is-url": "1.2.28",
 | 
							"@types/is-url": "1.2.28",
 | 
				
			||||||
		"@types/js-yaml": "3.11.4",
 | 
							"@types/js-yaml": "3.12.0",
 | 
				
			||||||
 | 
							"@types/jsdom": "12.2.1",
 | 
				
			||||||
		"@types/katex": "0.5.0",
 | 
							"@types/katex": "0.5.0",
 | 
				
			||||||
		"@types/koa": "2.0.48",
 | 
							"@types/koa": "2.0.48",
 | 
				
			||||||
		"@types/koa-bodyparser": "5.0.2",
 | 
							"@types/koa-bodyparser": "5.0.2",
 | 
				
			||||||
		"@types/koa-compress": "2.0.8",
 | 
							"@types/koa-compress": "2.0.8",
 | 
				
			||||||
 | 
							"@types/koa-cors": "0.0.0",
 | 
				
			||||||
		"@types/koa-favicon": "2.0.19",
 | 
							"@types/koa-favicon": "2.0.19",
 | 
				
			||||||
		"@types/koa-logger": "3.1.1",
 | 
							"@types/koa-logger": "3.1.1",
 | 
				
			||||||
		"@types/koa-mount": "3.0.1",
 | 
							"@types/koa-mount": "3.0.1",
 | 
				
			||||||
		"@types/koa-multer": "1.0.0",
 | 
							"@types/koa-multer": "1.0.0",
 | 
				
			||||||
		"@types/koa-router": "7.0.38",
 | 
							"@types/koa-router": "7.0.39",
 | 
				
			||||||
		"@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": "7.0.1",
 | 
							"@types/minio": "7.0.1",
 | 
				
			||||||
		"@types/mkdirp": "0.5.2",
 | 
							"@types/mkdirp": "0.5.2",
 | 
				
			||||||
		"@types/mocha": "5.2.5",
 | 
							"@types/mocha": "5.2.5",
 | 
				
			||||||
		"@types/mongodb": "3.1.18",
 | 
							"@types/mongodb": "3.1.19",
 | 
				
			||||||
		"@types/ms": "0.7.30",
 | 
							"@types/node": "10.12.21",
 | 
				
			||||||
		"@types/node": "10.12.18",
 | 
					 | 
				
			||||||
		"@types/nodemailer": "4.6.5",
 | 
							"@types/nodemailer": "4.6.5",
 | 
				
			||||||
 | 
							"@types/nprogress": "0.0.29",
 | 
				
			||||||
		"@types/oauth": "0.9.1",
 | 
							"@types/oauth": "0.9.1",
 | 
				
			||||||
 | 
							"@types/parse5": "5.0.0",
 | 
				
			||||||
		"@types/parsimmon": "1.10.0",
 | 
							"@types/parsimmon": "1.10.0",
 | 
				
			||||||
		"@types/portscanner": "2.1.0",
 | 
							"@types/portscanner": "2.1.0",
 | 
				
			||||||
		"@types/pug": "2.0.4",
 | 
							"@types/pug": "2.0.4",
 | 
				
			||||||
@@ -74,54 +83,54 @@
 | 
				
			|||||||
		"@types/redis": "2.8.10",
 | 
							"@types/redis": "2.8.10",
 | 
				
			||||||
		"@types/request": "2.48.1",
 | 
							"@types/request": "2.48.1",
 | 
				
			||||||
		"@types/request-promise-native": "1.0.15",
 | 
							"@types/request-promise-native": "1.0.15",
 | 
				
			||||||
 | 
							"@types/request-stats": "3.0.0",
 | 
				
			||||||
		"@types/rimraf": "2.0.2",
 | 
							"@types/rimraf": "2.0.2",
 | 
				
			||||||
		"@types/seedrandom": "2.4.27",
 | 
							"@types/seedrandom": "2.4.27",
 | 
				
			||||||
		"@types/sharp": "0.21.0",
 | 
							"@types/sharp": "0.21.1",
 | 
				
			||||||
		"@types/showdown": "1.9.2",
 | 
							"@types/showdown": "1.9.2",
 | 
				
			||||||
		"@types/speakeasy": "2.0.3",
 | 
							"@types/speakeasy": "2.0.3",
 | 
				
			||||||
		"@types/systeminformation": "3.23.1",
 | 
							"@types/systeminformation": "3.23.1",
 | 
				
			||||||
		"@types/tinycolor2": "1.4.1",
 | 
							"@types/tinycolor2": "1.4.1",
 | 
				
			||||||
		"@types/tmp": "0.0.33",
 | 
							"@types/tmp": "0.0.33",
 | 
				
			||||||
		"@types/uuid": "3.4.4",
 | 
							"@types/uuid": "3.4.4",
 | 
				
			||||||
		"@types/webpack": "4.4.21",
 | 
							"@types/web-push": "3.3.0",
 | 
				
			||||||
 | 
							"@types/webpack": "4.4.24",
 | 
				
			||||||
		"@types/webpack-stream": "3.2.10",
 | 
							"@types/webpack-stream": "3.2.10",
 | 
				
			||||||
		"@types/websocket": "0.0.40",
 | 
							"@types/websocket": "0.0.40",
 | 
				
			||||||
		"@types/ws": "6.0.1",
 | 
							"@types/ws": "6.0.1",
 | 
				
			||||||
		"animejs": "3.0.1",
 | 
							"animejs": "3.0.1",
 | 
				
			||||||
		"apexcharts": "2.5.1",
 | 
							"apexcharts": "3.2.2",
 | 
				
			||||||
		"autobind-decorator": "2.4.0",
 | 
							"autobind-decorator": "2.4.0",
 | 
				
			||||||
		"autosize": "4.0.2",
 | 
							"autosize": "4.0.2",
 | 
				
			||||||
		"autwh": "0.1.0",
 | 
							"autwh": "0.1.0",
 | 
				
			||||||
		"bcryptjs": "2.4.3",
 | 
							"bcryptjs": "2.4.3",
 | 
				
			||||||
		"bee-queue": "1.2.2",
 | 
							"bee-queue": "1.2.2",
 | 
				
			||||||
		"bootstrap-vue": "2.0.0-rc.11",
 | 
							"bootstrap-vue": "2.0.0-rc.11",
 | 
				
			||||||
		"cafy": "12.0.0",
 | 
							"cafy": "12.1.0",
 | 
				
			||||||
		"chai": "4.2.0",
 | 
							"chai": "4.2.0",
 | 
				
			||||||
		"chai-http": "4.2.1",
 | 
							"chai-http": "4.2.1",
 | 
				
			||||||
		"chalk": "2.4.2",
 | 
							"chalk": "2.4.2",
 | 
				
			||||||
		"commander": "2.19.0",
 | 
							"commander": "2.19.0",
 | 
				
			||||||
		"crc-32": "1.2.0",
 | 
							"crc-32": "1.2.0",
 | 
				
			||||||
		"css-loader": "1.0.1",
 | 
							"css-loader": "2.1.0",
 | 
				
			||||||
		"cssnano": "4.1.8",
 | 
							"cssnano": "4.1.8",
 | 
				
			||||||
		"dateformat": "3.0.3",
 | 
							"dateformat": "3.0.3",
 | 
				
			||||||
		"debug": "4.1.0",
 | 
					 | 
				
			||||||
		"deep-equal": "1.0.1",
 | 
							"deep-equal": "1.0.1",
 | 
				
			||||||
		"deepcopy": "0.6.3",
 | 
							"deepcopy": "0.6.3",
 | 
				
			||||||
		"diskusage": "1.0.0",
 | 
							"diskusage": "1.0.0",
 | 
				
			||||||
		"double-ended-queue": "2.1.0-0",
 | 
							"double-ended-queue": "2.1.0-0",
 | 
				
			||||||
		"elasticsearch": "15.3.0",
 | 
							"elasticsearch": "15.3.1",
 | 
				
			||||||
		"emojilib": "2.4.0",
 | 
							"emojilib": "2.4.0",
 | 
				
			||||||
		"escape-regexp": "0.0.1",
 | 
							"escape-regexp": "0.0.1",
 | 
				
			||||||
		"eslint": "5.12.0",
 | 
							"eslint": "5.12.0",
 | 
				
			||||||
		"eslint-plugin-vue": "5.1.0",
 | 
							"eslint-plugin-vue": "5.1.0",
 | 
				
			||||||
		"eventemitter3": "3.1.0",
 | 
							"eventemitter3": "3.1.0",
 | 
				
			||||||
		"feed": "2.0.2",
 | 
							"feed": "2.0.2",
 | 
				
			||||||
		"file-loader": "2.0.0",
 | 
							"file-type": "10.7.1",
 | 
				
			||||||
		"file-type": "10.7.0",
 | 
					 | 
				
			||||||
		"fuckadblock": "3.2.1",
 | 
							"fuckadblock": "3.2.1",
 | 
				
			||||||
		"gulp": "3.9.1",
 | 
							"gulp": "4.0.0",
 | 
				
			||||||
		"gulp-cssnano": "2.1.3",
 | 
							"gulp-cssnano": "2.1.3",
 | 
				
			||||||
		"gulp-imagemin": "4.1.0",
 | 
							"gulp-imagemin": "5.0.3",
 | 
				
			||||||
		"gulp-mocha": "6.0.0",
 | 
							"gulp-mocha": "6.0.0",
 | 
				
			||||||
		"gulp-rename": "1.4.0",
 | 
							"gulp-rename": "1.4.0",
 | 
				
			||||||
		"gulp-replace": "1.0.0",
 | 
							"gulp-replace": "1.0.0",
 | 
				
			||||||
@@ -131,20 +140,19 @@
 | 
				
			|||||||
		"gulp-typescript": "5.0.0",
 | 
							"gulp-typescript": "5.0.0",
 | 
				
			||||||
		"gulp-uglify": "3.0.1",
 | 
							"gulp-uglify": "3.0.1",
 | 
				
			||||||
		"gulp-util": "3.0.8",
 | 
							"gulp-util": "3.0.8",
 | 
				
			||||||
		"gulp-yaml": "2.0.2",
 | 
							"gulp-yaml": "2.0.3",
 | 
				
			||||||
		"hard-source-webpack-plugin": "0.13.1",
 | 
							"hard-source-webpack-plugin": "0.13.1",
 | 
				
			||||||
		"html-minifier": "3.5.21",
 | 
							"html-minifier": "3.5.21",
 | 
				
			||||||
		"http-signature": "1.2.0",
 | 
							"http-signature": "1.2.0",
 | 
				
			||||||
		"insert-text-at-cursor": "0.1.1",
 | 
							"insert-text-at-cursor": "0.1.1",
 | 
				
			||||||
		"is-root": "2.0.0",
 | 
							"is-root": "2.0.0",
 | 
				
			||||||
		"is-svg": "3.0.0",
 | 
							"is-svg": "3.0.0",
 | 
				
			||||||
		"is-url": "1.2.4",
 | 
					 | 
				
			||||||
		"js-yaml": "3.12.1",
 | 
							"js-yaml": "3.12.1",
 | 
				
			||||||
		"jsdom": "13.1.0",
 | 
							"jsdom": "13.2.0",
 | 
				
			||||||
		"json5": "2.1.0",
 | 
							"json5": "2.1.0",
 | 
				
			||||||
		"json5-loader": "1.0.1",
 | 
							"json5-loader": "1.0.1",
 | 
				
			||||||
		"katex": "0.10.0",
 | 
							"katex": "0.10.0",
 | 
				
			||||||
		"koa": "2.6.2",
 | 
							"koa": "2.7.0",
 | 
				
			||||||
		"koa-bodyparser": "4.2.1",
 | 
							"koa-bodyparser": "4.2.1",
 | 
				
			||||||
		"koa-compress": "3.0.0",
 | 
							"koa-compress": "3.0.0",
 | 
				
			||||||
		"koa-favicon": "2.0.1",
 | 
							"koa-favicon": "2.0.1",
 | 
				
			||||||
@@ -159,12 +167,12 @@
 | 
				
			|||||||
		"langmap": "0.0.16",
 | 
							"langmap": "0.0.16",
 | 
				
			||||||
		"loader-utils": "1.2.3",
 | 
							"loader-utils": "1.2.3",
 | 
				
			||||||
		"lookup-dns-cache": "2.1.0",
 | 
							"lookup-dns-cache": "2.1.0",
 | 
				
			||||||
		"minio": "7.0.3",
 | 
							"minio": "7.0.5",
 | 
				
			||||||
		"mkdirp": "0.5.1",
 | 
							"mkdirp": "0.5.1",
 | 
				
			||||||
		"mocha": "5.2.0",
 | 
							"mocha": "5.2.0",
 | 
				
			||||||
		"moji": "0.5.1",
 | 
							"moji": "0.5.1",
 | 
				
			||||||
		"moment": "2.23.0",
 | 
							"moment": "2.24.0",
 | 
				
			||||||
		"mongodb": "3.1.10",
 | 
							"mongodb": "3.1.13",
 | 
				
			||||||
		"monk": "6.0.6",
 | 
							"monk": "6.0.6",
 | 
				
			||||||
		"ms": "2.1.1",
 | 
							"ms": "2.1.1",
 | 
				
			||||||
		"nan": "2.12.1",
 | 
							"nan": "2.12.1",
 | 
				
			||||||
@@ -179,7 +187,7 @@
 | 
				
			|||||||
		"portscanner": "2.2.0",
 | 
							"portscanner": "2.2.0",
 | 
				
			||||||
		"postcss-loader": "3.0.0",
 | 
							"postcss-loader": "3.0.0",
 | 
				
			||||||
		"prismjs": "1.15.0",
 | 
							"prismjs": "1.15.0",
 | 
				
			||||||
		"progress-bar-webpack-plugin": "1.12.0",
 | 
							"progress-bar-webpack-plugin": "1.12.1",
 | 
				
			||||||
		"promise-any": "0.2.0",
 | 
							"promise-any": "0.2.0",
 | 
				
			||||||
		"promise-limit": "2.7.0",
 | 
							"promise-limit": "2.7.0",
 | 
				
			||||||
		"promise-sequential": "1.1.1",
 | 
							"promise-sequential": "1.1.1",
 | 
				
			||||||
@@ -198,7 +206,7 @@
 | 
				
			|||||||
		"rndstr": "1.0.0",
 | 
							"rndstr": "1.0.0",
 | 
				
			||||||
		"s-age": "1.1.2",
 | 
							"s-age": "1.1.2",
 | 
				
			||||||
		"seedrandom": "2.4.4",
 | 
							"seedrandom": "2.4.4",
 | 
				
			||||||
		"sharp": "0.21.1",
 | 
							"sharp": "0.21.3",
 | 
				
			||||||
		"showdown": "1.9.0",
 | 
							"showdown": "1.9.0",
 | 
				
			||||||
		"showdown-highlightjs-extension": "0.1.2",
 | 
							"showdown-highlightjs-extension": "0.1.2",
 | 
				
			||||||
		"speakeasy": "2.0.0",
 | 
							"speakeasy": "2.0.0",
 | 
				
			||||||
@@ -207,46 +215,47 @@
 | 
				
			|||||||
		"stylus": "0.54.5",
 | 
							"stylus": "0.54.5",
 | 
				
			||||||
		"stylus-loader": "3.0.2",
 | 
							"stylus-loader": "3.0.2",
 | 
				
			||||||
		"summaly": "2.2.0",
 | 
							"summaly": "2.2.0",
 | 
				
			||||||
		"systeminformation": "3.52.2",
 | 
							"systeminformation": "3.54.0",
 | 
				
			||||||
		"syuilo-password-strength": "0.0.1",
 | 
							"syuilo-password-strength": "0.0.1",
 | 
				
			||||||
		"terser-webpack-plugin": "1.2.1",
 | 
							"terser-webpack-plugin": "1.2.2",
 | 
				
			||||||
		"textarea-caret": "3.1.0",
 | 
							"textarea-caret": "3.1.0",
 | 
				
			||||||
		"tinycolor2": "1.4.1",
 | 
							"tinycolor2": "1.4.1",
 | 
				
			||||||
		"tmp": "0.0.33",
 | 
							"tmp": "0.0.33",
 | 
				
			||||||
		"ts-loader": "5.3.3",
 | 
							"ts-loader": "5.3.3",
 | 
				
			||||||
		"ts-node": "7.0.1",
 | 
							"ts-node": "7.0.1",
 | 
				
			||||||
		"tslint": "5.12.0",
 | 
							"tslint": "5.12.1",
 | 
				
			||||||
		"tslint-sonarts": "1.8.0",
 | 
							"tslint-sonarts": "1.9.0",
 | 
				
			||||||
		"typescript": "3.2.4",
 | 
							"typescript": "3.2.4",
 | 
				
			||||||
		"typescript-eslint-parser": "21.0.2",
 | 
							"typescript-eslint-parser": "21.0.2",
 | 
				
			||||||
		"uglify-es": "3.3.9",
 | 
							"uglify-es": "3.3.9",
 | 
				
			||||||
		"url-loader": "1.1.2",
 | 
							"url-loader": "1.1.2",
 | 
				
			||||||
		"uuid": "3.3.2",
 | 
							"uuid": "3.3.2",
 | 
				
			||||||
		"v-animate-css": "0.0.3",
 | 
							"v-animate-css": "0.0.3",
 | 
				
			||||||
		"vue": "2.5.17",
 | 
							"video-thumbnail-generator": "1.1.3",
 | 
				
			||||||
 | 
							"vue": "2.6.3",
 | 
				
			||||||
		"vue-color": "2.7.0",
 | 
							"vue-color": "2.7.0",
 | 
				
			||||||
		"vue-content-loading": "1.5.3",
 | 
							"vue-content-loading": "1.5.3",
 | 
				
			||||||
		"vue-cropperjs": "3.0.0",
 | 
							"vue-cropperjs": "3.0.0",
 | 
				
			||||||
		"vue-i18n": "8.7.0",
 | 
							"vue-i18n": "8.8.0",
 | 
				
			||||||
		"vue-js-modal": "1.3.28",
 | 
							"vue-js-modal": "1.3.28",
 | 
				
			||||||
		"vue-loader": "15.5.1",
 | 
							"vue-loader": "15.6.2",
 | 
				
			||||||
		"vue-marquee-text-component": "1.1.1",
 | 
							"vue-marquee-text-component": "1.1.1",
 | 
				
			||||||
		"vue-prism-component": "1.1.1",
 | 
							"vue-prism-component": "1.1.1",
 | 
				
			||||||
		"vue-router": "3.0.2",
 | 
							"vue-router": "3.0.2",
 | 
				
			||||||
		"vue-sequential-entrance": "1.1.3",
 | 
							"vue-sequential-entrance": "1.1.3",
 | 
				
			||||||
		"vue-style-loader": "4.1.2",
 | 
							"vue-style-loader": "4.1.2",
 | 
				
			||||||
		"vue-svg-inline-loader": "1.2.7",
 | 
							"vue-svg-inline-loader": "1.2.10",
 | 
				
			||||||
		"vue-template-compiler": "2.5.17",
 | 
							"vue-template-compiler": "2.6.3",
 | 
				
			||||||
		"vuedraggable": "2.17.0",
 | 
							"vuedraggable": "2.17.0",
 | 
				
			||||||
		"vuewordcloud": "18.7.11",
 | 
							"vuewordcloud": "18.7.11",
 | 
				
			||||||
		"vuex": "3.0.1",
 | 
							"vuex": "3.1.0",
 | 
				
			||||||
		"vuex-persistedstate": "2.5.4",
 | 
							"vuex-persistedstate": "2.5.4",
 | 
				
			||||||
		"web-push": "3.3.3",
 | 
							"web-push": "3.3.3",
 | 
				
			||||||
		"webfinger.js": "2.7.0",
 | 
							"webfinger.js": "2.7.0",
 | 
				
			||||||
		"webpack": "4.28.4",
 | 
							"webpack": "4.28.4",
 | 
				
			||||||
		"webpack-cli": "3.2.1",
 | 
							"webpack-cli": "3.2.1",
 | 
				
			||||||
		"websocket": "1.0.28",
 | 
							"websocket": "1.0.28",
 | 
				
			||||||
		"ws": "6.1.2",
 | 
							"ws": "6.1.3",
 | 
				
			||||||
		"xev": "2.0.1"
 | 
							"xev": "2.0.1"
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										3
									
								
								src/@types/const.json.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								src/@types/const.json.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					declare module '*/const.json' {
 | 
				
			||||||
 | 
						const copyright: string;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										17
									
								
								src/@types/deepcopy.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								src/@types/deepcopy.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					declare module 'deepcopy';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					declare namespace deepcopy {
 | 
				
			||||||
 | 
						type DeepcopyCustomizerValueType = 'Object';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						type DeepcopyCustomizer<T> = (
 | 
				
			||||||
 | 
							value: T,
 | 
				
			||||||
 | 
							valueType: DeepcopyCustomizerValueType) => T;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						interface DeepcopyOptions<T> {
 | 
				
			||||||
 | 
							customizer: DeepcopyCustomizer<T>;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						export function deepcopy<T>(
 | 
				
			||||||
 | 
							value: T,
 | 
				
			||||||
 | 
							options?: DeepcopyOptions<T> | DeepcopyCustomizer<T>): T;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										7
									
								
								src/@types/escape-regexp.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								src/@types/escape-regexp.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
				
			|||||||
 | 
					declare module 'escape-regexp' {
 | 
				
			||||||
 | 
						function escapeRegExp(str: string): string;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						namespace escapeRegExp {} // Hack
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						export = escapeRegExp;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										75
									
								
								src/@types/http-signature.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								src/@types/http-signature.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,75 @@
 | 
				
			|||||||
 | 
					declare module 'http-signature' {
 | 
				
			||||||
 | 
						import { IncomingMessage, ClientRequest } from 'http';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						interface ISignature {
 | 
				
			||||||
 | 
							keyId: string;
 | 
				
			||||||
 | 
							algorithm: string;
 | 
				
			||||||
 | 
							headers: string[];
 | 
				
			||||||
 | 
							signature: string;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						interface IOptions {
 | 
				
			||||||
 | 
							headers?: string[];
 | 
				
			||||||
 | 
							algorithm?: string;
 | 
				
			||||||
 | 
							strict?: boolean;
 | 
				
			||||||
 | 
							authorizationHeaderName?: string;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						interface IParseRequestOptions extends IOptions {
 | 
				
			||||||
 | 
							clockSkew?: number;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						interface IParsedSignature  {
 | 
				
			||||||
 | 
							scheme: string;
 | 
				
			||||||
 | 
							params: ISignature;
 | 
				
			||||||
 | 
							signingString: string;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						type RequestSignerConstructorOptions =
 | 
				
			||||||
 | 
							IRequestSignerConstructorOptionsFromProperties |
 | 
				
			||||||
 | 
							IRequestSignerConstructorOptionsFromFunction;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						interface IRequestSignerConstructorOptionsFromProperties {
 | 
				
			||||||
 | 
							keyId: string;
 | 
				
			||||||
 | 
							key: string | Buffer;
 | 
				
			||||||
 | 
							algorithm?: string;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						interface IRequestSignerConstructorOptionsFromFunction {
 | 
				
			||||||
 | 
							sign?: (data: string, cb: (err: any, sig: ISignature) => void) => void;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						class RequestSigner {
 | 
				
			||||||
 | 
							constructor(options: RequestSignerConstructorOptions);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							public writeHeader(header: string, value: string): string;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							public writeDateHeader(): string;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							public writeTarget(method: string, path: string): void;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							public sign(cb: (err: any, authz: string) => void): void;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						interface ISignRequestOptions extends IOptions {
 | 
				
			||||||
 | 
							keyId: string;
 | 
				
			||||||
 | 
							key: string;
 | 
				
			||||||
 | 
							httpVersion?: string;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						export function parse(request: IncomingMessage, options?: IParseRequestOptions): IParsedSignature;
 | 
				
			||||||
 | 
						export function parseRequest(request: IncomingMessage, options?: IParseRequestOptions): IParsedSignature;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						export function sign(request: ClientRequest, options: ISignRequestOptions): boolean;
 | 
				
			||||||
 | 
						export function signRequest(request: ClientRequest, options: ISignRequestOptions): boolean;
 | 
				
			||||||
 | 
						export function createSigner(): RequestSigner;
 | 
				
			||||||
 | 
						export function isSigner(obj: any): obj is RequestSigner;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						export function sshKeyToPEM(key: string): string;
 | 
				
			||||||
 | 
						export function sshKeyFingerprint(key: string): string;
 | 
				
			||||||
 | 
						export function pemToRsaSSHKey(pem: string, comment: string): string;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						export function verify(parsedSignature: IParsedSignature, pubkey: string | Buffer): boolean;
 | 
				
			||||||
 | 
						export function verifySignature(parsedSignature: IParsedSignature, pubkey: string | Buffer): boolean;
 | 
				
			||||||
 | 
						export function verifyHMAC(parsedSignature: IParsedSignature, secret: string): boolean;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										7
									
								
								src/@types/is-root.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								src/@types/is-root.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
				
			|||||||
 | 
					declare module 'is-root' {
 | 
				
			||||||
 | 
						function isRoot(): boolean;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						namespace isRoot {} // Hack
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						export = isRoot;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										15
									
								
								src/@types/koa-json-body.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								src/@types/koa-json-body.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
				
			|||||||
 | 
					declare module 'koa-json-body' {
 | 
				
			||||||
 | 
						import { Middleware } from 'koa';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						interface IKoaJsonBodyOptions {
 | 
				
			||||||
 | 
							strict: boolean;
 | 
				
			||||||
 | 
							limit: string;
 | 
				
			||||||
 | 
							fallback: boolean;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						function koaJsonBody(opt?: IKoaJsonBodyOptions): Middleware;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						namespace koaJsonBody {} // Hack
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						export = koaJsonBody;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										14
									
								
								src/@types/koa-slow.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								src/@types/koa-slow.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
				
			|||||||
 | 
					declare module 'koa-slow' {
 | 
				
			||||||
 | 
						import { Middleware } from 'koa';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						interface ISlowOptions {
 | 
				
			||||||
 | 
							url?: RegExp;
 | 
				
			||||||
 | 
							delay?: number;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						function slow(options?: ISlowOptions): Middleware;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						namespace slow { } // Hack
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						export = slow;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										10
									
								
								src/@types/langmap.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/@types/langmap.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					declare module 'langmap' {
 | 
				
			||||||
 | 
						type Lang = {
 | 
				
			||||||
 | 
							nativeName: string;
 | 
				
			||||||
 | 
							englishName: string;
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						const langmap: { [lang: string]: Lang };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						export = langmap;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										17
									
								
								src/@types/lookup-dns-cache.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								src/@types/lookup-dns-cache.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					declare module 'lookup-dns-cache' {
 | 
				
			||||||
 | 
						type IPv4 = 4;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						type IPv6 = 6;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						type Family = IPv4 | IPv6 | undefined;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						interface IRunOptions {
 | 
				
			||||||
 | 
							family?: Family;
 | 
				
			||||||
 | 
							all?: boolean;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						type RunCallback = (error: Error | null, address?: string | string[], family?: Family) => void;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						export function lookup(hostname: string, options: IRunOptions | Family, callback: RunCallback): {} | undefined;
 | 
				
			||||||
 | 
						export function lookup(hostname: string, callback: RunCallback): {} | undefined;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										3
									
								
								src/@types/meta.json.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								src/@types/meta.json.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					declare module '*/meta.json' {
 | 
				
			||||||
 | 
						const version: string;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										12
									
								
								src/@types/ms.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								src/@types/ms.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,12 @@
 | 
				
			|||||||
 | 
					declare module 'ms' {
 | 
				
			||||||
 | 
						interface IMSOptions {
 | 
				
			||||||
 | 
							long: boolean;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						function ms(value: string): number;
 | 
				
			||||||
 | 
						function ms(value: number, options?: IMSOptions): string;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						namespace ms {} // Hack
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						export = ms;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										21
									
								
								src/@types/nested-property.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								src/@types/nested-property.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,21 @@
 | 
				
			|||||||
 | 
					type Obj = { [key: string]: any };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					declare module 'nested-property' {
 | 
				
			||||||
 | 
						interface IHasNestedPropertyOptions {
 | 
				
			||||||
 | 
							own?: boolean;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						interface IIsInNestedPropertyOptions {
 | 
				
			||||||
 | 
							validPath?: boolean;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						export function set<T>(object: T, property: string, value: any): T;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						export function get(object: Obj, property: string): any;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						export function has(object: Obj, property: string, options?: IHasNestedPropertyOptions): boolean;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						export function hasOwn(object: Obj, property: string, options?: IHasNestedPropertyOptions): boolean;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						export function isIn(object: Obj, property: string, objectInPath: Obj, options?: IIsInNestedPropertyOptions): boolean;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										30
									
								
								src/@types/os-utils.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								src/@types/os-utils.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,30 @@
 | 
				
			|||||||
 | 
					declare module 'os-utils' {
 | 
				
			||||||
 | 
						type FreeCommandCallback = (usedmem: number) => void;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						type HarddriveCallback = (total: number, free: number, used: number) => void;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						type GetProcessesCallback = (result: string) => void;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						type CPUCallback = (perc: number) => void;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						export function platform(): NodeJS.Platform;
 | 
				
			||||||
 | 
						export function cpuCount(): number;
 | 
				
			||||||
 | 
						export function sysUptime(): number;
 | 
				
			||||||
 | 
						export function processUptime(): number;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						export function freemem(): number;
 | 
				
			||||||
 | 
						export function totalmem(): number;
 | 
				
			||||||
 | 
						export function freememPercentage(): number;
 | 
				
			||||||
 | 
						export function freeCommand(callback: FreeCommandCallback): void;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						export function harddrive(callback: HarddriveCallback): void;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						export function getProcesses(callback: GetProcessesCallback): void;
 | 
				
			||||||
 | 
						export function getProcesses(nProcess: number, callback: GetProcessesCallback): void;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						export function allLoadavg(): string;
 | 
				
			||||||
 | 
						export function loadavg(_time?: number): number;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						export function cpuFree(callback: CPUCallback): void;
 | 
				
			||||||
 | 
						export function cpuUsage(callback: CPUCallback): void;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										10
									
								
								src/@types/package.json.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/@types/package.json.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					declare module '*/package.json' {
 | 
				
			||||||
 | 
						interface IRepository {
 | 
				
			||||||
 | 
							type: string;
 | 
				
			||||||
 | 
							url: string;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						export const name: string;
 | 
				
			||||||
 | 
						export const version: string;
 | 
				
			||||||
 | 
						export const repository: IRepository;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										7
									
								
								src/@types/promise-any.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								src/@types/promise-any.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
				
			|||||||
 | 
					declare module 'promise-any' {
 | 
				
			||||||
 | 
						function promiseAny<T>(iterable: Iterable<T | PromiseLike<T>>): Promise<T>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						namespace promiseAny {} // Hack
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						export = promiseAny;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										16
									
								
								src/@types/recaptcha-promise.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								src/@types/recaptcha-promise.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
				
			|||||||
 | 
					declare module 'recaptcha-promise' {
 | 
				
			||||||
 | 
						interface IVerifyOptions {
 | 
				
			||||||
 | 
							secret_key?: string;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						interface IVerify {
 | 
				
			||||||
 | 
							(response: string, remoteAddress?: string): Promise<boolean>;
 | 
				
			||||||
 | 
							init(options: IVerifyOptions): IVerify;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						namespace recaptchaPromise {} // Hack
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						const verify: IVerify;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						export = verify;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										65
									
								
								src/@types/webfinger.js.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								src/@types/webfinger.js.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,65 @@
 | 
				
			|||||||
 | 
					declare module 'webfinger.js' {
 | 
				
			||||||
 | 
						interface IWebFingerConstructorConfig {
 | 
				
			||||||
 | 
							tls_only?: boolean;
 | 
				
			||||||
 | 
							webfist_fallback?: boolean;
 | 
				
			||||||
 | 
							uri_fallback?: boolean;
 | 
				
			||||||
 | 
							request_timeout?: number;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						type JRDProperties = { [type: string]: string };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						interface IJRDLink {
 | 
				
			||||||
 | 
							rel: string;
 | 
				
			||||||
 | 
							type?: string;
 | 
				
			||||||
 | 
							href?: string;
 | 
				
			||||||
 | 
							template?: string;
 | 
				
			||||||
 | 
							titles?: { [lang: string]: string };
 | 
				
			||||||
 | 
							properties?: JRDProperties;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						interface IJRD {
 | 
				
			||||||
 | 
							subject?: string;
 | 
				
			||||||
 | 
							expires?: Date;
 | 
				
			||||||
 | 
							aliases?: string[];
 | 
				
			||||||
 | 
							properties?: JRDProperties;
 | 
				
			||||||
 | 
							links?: IJRDLink[];
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						interface IIDXLinks {
 | 
				
			||||||
 | 
					    'avatar': IJRDLink[];
 | 
				
			||||||
 | 
					    'remotestorage': IJRDLink[];
 | 
				
			||||||
 | 
					    'blog': IJRDLink[];
 | 
				
			||||||
 | 
					    'vcard': IJRDLink[];
 | 
				
			||||||
 | 
					    'updates': IJRDLink[];
 | 
				
			||||||
 | 
					    'share': IJRDLink[];
 | 
				
			||||||
 | 
					    'profile': IJRDLink[];
 | 
				
			||||||
 | 
					    'webfist': IJRDLink[];
 | 
				
			||||||
 | 
							'camlistore': IJRDLink[];
 | 
				
			||||||
 | 
							[type: string]: IJRDLink[];
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						interface IIDXProperties {
 | 
				
			||||||
 | 
							'name': string;
 | 
				
			||||||
 | 
							[type: string]: string;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						interface IIDX {
 | 
				
			||||||
 | 
							links: IIDXLinks;
 | 
				
			||||||
 | 
							properties: IIDXProperties;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						interface ILookupCallbackResult {
 | 
				
			||||||
 | 
							object: IJRD;
 | 
				
			||||||
 | 
							json: string;
 | 
				
			||||||
 | 
							idx: IIDX;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						type LookupCallback = (err: Error | string, result?: ILookupCallbackResult) => void;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						export class WebFinger {
 | 
				
			||||||
 | 
							constructor(config?: IWebFingerConstructorConfig);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							public lookup(address: string, cb: LookupCallback): NodeJS.Timeout;
 | 
				
			||||||
 | 
							public lookupLink(address: string, rel: string, cb: IJRDLink): void;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										22
									
								
								src/argv.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								src/argv.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
				
			|||||||
 | 
					import * as program from 'commander';
 | 
				
			||||||
 | 
					import * as pkg from '../package.json';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					program
 | 
				
			||||||
 | 
						.version(pkg.version)
 | 
				
			||||||
 | 
						.option('--no-daemons', 'Disable daemon processes (for debbuging)')
 | 
				
			||||||
 | 
						.option('--disable-clustering', 'Disable clustering')
 | 
				
			||||||
 | 
						.option('--disable-ap-queue', 'Disable creating job queue related to ap')
 | 
				
			||||||
 | 
						.option('--disable-queue', 'Disable job queue processing')
 | 
				
			||||||
 | 
						.option('--only-queue', 'Pocessing job queue only')
 | 
				
			||||||
 | 
						.option('--quiet', 'Suppress all logs')
 | 
				
			||||||
 | 
						.option('--verbose', 'Enable all logs')
 | 
				
			||||||
 | 
						.option('--with-log-time', 'Include timestamp for each logs')
 | 
				
			||||||
 | 
						.option('--slow', 'Delay all requests (for debbuging)')
 | 
				
			||||||
 | 
						.option('--color', 'This option is a dummy for some external program\'s (e.g. forever) issue.')
 | 
				
			||||||
 | 
						.parse(process.argv);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*if (process.env.MK_DISABLE_AP_QUEUE)*/ program.disableApQueue = true;
 | 
				
			||||||
 | 
					if (process.env.MK_DISABLE_QUEUE) program.disableQueue = true;
 | 
				
			||||||
 | 
					if (process.env.MK_ONLY_QUEUE) program.onlyQueue = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export { program };
 | 
				
			||||||
@@ -3,11 +3,14 @@
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import * as moment from 'moment';
 | 
					import * as moment from 'moment';
 | 
				
			||||||
const nestedProperty = require('nested-property');
 | 
					import * as nestedProperty from 'nested-property';
 | 
				
			||||||
import autobind from 'autobind-decorator';
 | 
					import autobind from 'autobind-decorator';
 | 
				
			||||||
import * as mongo from 'mongodb';
 | 
					import * as mongo from 'mongodb';
 | 
				
			||||||
import db from '../db/mongodb';
 | 
					import db from '../db/mongodb';
 | 
				
			||||||
import { ICollection } from 'monk';
 | 
					import { ICollection } from 'monk';
 | 
				
			||||||
 | 
					import Logger from '../misc/logger';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const logger = new Logger('chart');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const utc = moment.utc;
 | 
					const utc = moment.utc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -18,7 +21,7 @@ export type Partial<T> = {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type ArrayValue<T> = {
 | 
					type ArrayValue<T> = {
 | 
				
			||||||
	[P in keyof T]: T[P] extends number ? Array<T[P]> : ArrayValue<T[P]>;
 | 
						[P in keyof T]: T[P] extends number ? T[P][] : ArrayValue<T[P]>;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type Span = 'day' | 'hour';
 | 
					type Span = 'day' | 'hour';
 | 
				
			||||||
@@ -55,17 +58,21 @@ type Log<T extends Obj> = {
 | 
				
			|||||||
/**
 | 
					/**
 | 
				
			||||||
 * 様々なチャートの管理を司るクラス
 | 
					 * 様々なチャートの管理を司るクラス
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
export default abstract class Chart<T> {
 | 
					export default abstract class Chart<T extends Obj> {
 | 
				
			||||||
	protected collection: ICollection<Log<T>>;
 | 
						protected collection: ICollection<Log<T>>;
 | 
				
			||||||
	protected abstract async getTemplate(init: boolean, latest?: T, group?: any): Promise<T>;
 | 
						protected abstract async getTemplate(init: boolean, latest?: T, group?: any): Promise<T>;
 | 
				
			||||||
 | 
						private name: string;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	constructor(name: string, grouped = false) {
 | 
						constructor(name: string, grouped = false) {
 | 
				
			||||||
 | 
							this.name = name;
 | 
				
			||||||
		this.collection = db.get<Log<T>>(`chart.${name}`);
 | 
							this.collection = db.get<Log<T>>(`chart.${name}`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		const keys = {
 | 
							const keys = {
 | 
				
			||||||
			span: -1,
 | 
								span: -1,
 | 
				
			||||||
			date: -1
 | 
								date: -1
 | 
				
			||||||
		} as { [key: string]: 1 | -1; };
 | 
							} as { [key: string]: 1 | -1; };
 | 
				
			||||||
		if (grouped) keys.group = -1;
 | 
							if (grouped) keys.group = -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		this.collection.createIndex(keys, { unique: true });
 | 
							this.collection.createIndex(keys, { unique: true });
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -155,6 +162,8 @@ export default abstract class Chart<T> {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			// 初期ログデータを作成
 | 
								// 初期ログデータを作成
 | 
				
			||||||
			data = await this.getTemplate(true, null, group);
 | 
								data = await this.getTemplate(true, null, group);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								logger.info(`${this.name}: Initial commit created`);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		try {
 | 
							try {
 | 
				
			||||||
@@ -172,7 +181,7 @@ export default abstract class Chart<T> {
 | 
				
			|||||||
			if (e.code === 11000) {
 | 
								if (e.code === 11000) {
 | 
				
			||||||
				log = await this.getLatestLog(span, group);
 | 
									log = await this.getLatestLog(span, group);
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				console.error(e);
 | 
									logger.error(e);
 | 
				
			||||||
				throw e;
 | 
									throw e;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -42,7 +42,7 @@
 | 
				
			|||||||
import Vue from 'vue';
 | 
					import Vue from 'vue';
 | 
				
			||||||
import i18n from '../../i18n';
 | 
					import i18n from '../../i18n';
 | 
				
			||||||
import * as tinycolor from 'tinycolor2';
 | 
					import * as tinycolor from 'tinycolor2';
 | 
				
			||||||
import * as ApexCharts from 'apexcharts';
 | 
					import ApexCharts from 'apexcharts';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const limit = 90;
 | 
					const limit = 90;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,7 +19,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import Vue from 'vue';
 | 
					import Vue from 'vue';
 | 
				
			||||||
import * as ApexCharts from 'apexcharts';
 | 
					import ApexCharts from 'apexcharts';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default Vue.extend({
 | 
					export default Vue.extend({
 | 
				
			||||||
	props: ['connection'],
 | 
						props: ['connection'],
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -124,7 +124,7 @@ export default Vue.extend({
 | 
				
			|||||||
			this.meta = meta;
 | 
								this.meta = meta;
 | 
				
			||||||
		});
 | 
							});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		this.$root.api('instances', {
 | 
							this.$root.api('federation/instances', {
 | 
				
			||||||
			sort: '+notes'
 | 
								sort: '+notes'
 | 
				
			||||||
		}).then(instances => {
 | 
							}).then(instances => {
 | 
				
			||||||
			for (const i of instances) {
 | 
								for (const i of instances) {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										170
									
								
								src/client/app/admin/views/federation.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										170
									
								
								src/client/app/admin/views/federation.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,170 @@
 | 
				
			|||||||
 | 
					<template>
 | 
				
			||||||
 | 
					<div>
 | 
				
			||||||
 | 
						<ui-card>
 | 
				
			||||||
 | 
							<div slot="title"><fa :icon="faTerminal"/> {{ $t('federation') }}</div>
 | 
				
			||||||
 | 
							<section class="fit-top">
 | 
				
			||||||
 | 
								<ui-input class="target" v-model="target" type="text" @enter="showInstance">
 | 
				
			||||||
 | 
									<span>{{ $t('host') }}</span>
 | 
				
			||||||
 | 
								</ui-input>
 | 
				
			||||||
 | 
								<ui-button @click="showInstance"><fa :icon="faSearch"/> {{ $t('lookup') }}</ui-button>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								<div class="instance" v-if="instance">
 | 
				
			||||||
 | 
									<ui-input :value="instance.host" type="text" readonly>
 | 
				
			||||||
 | 
										<span>{{ $t('host') }}</span>
 | 
				
			||||||
 | 
									</ui-input>
 | 
				
			||||||
 | 
									<ui-horizon-group inputs>
 | 
				
			||||||
 | 
										<ui-input :value="instance.notesCount | number" type="text" readonly>
 | 
				
			||||||
 | 
											<span>{{ $t('notes') }}</span>
 | 
				
			||||||
 | 
										</ui-input>
 | 
				
			||||||
 | 
										<ui-input :value="instance.usersCount | number" type="text" readonly>
 | 
				
			||||||
 | 
											<span>{{ $t('users') }}</span>
 | 
				
			||||||
 | 
										</ui-input>
 | 
				
			||||||
 | 
									</ui-horizon-group>
 | 
				
			||||||
 | 
									<ui-horizon-group inputs>
 | 
				
			||||||
 | 
										<ui-input :value="instance.followingCount | number" type="text" readonly>
 | 
				
			||||||
 | 
											<span>{{ $t('following') }}</span>
 | 
				
			||||||
 | 
										</ui-input>
 | 
				
			||||||
 | 
										<ui-input :value="instance.followersCount | number" type="text" readonly>
 | 
				
			||||||
 | 
											<span>{{ $t('followers') }}</span>
 | 
				
			||||||
 | 
										</ui-input>
 | 
				
			||||||
 | 
									</ui-horizon-group>
 | 
				
			||||||
 | 
									<ui-horizon-group inputs>
 | 
				
			||||||
 | 
										<ui-input :value="instance.latestRequestSentAt" type="text" readonly>
 | 
				
			||||||
 | 
											<span>{{ $t('latest-request-sent-at') }}</span>
 | 
				
			||||||
 | 
										</ui-input>
 | 
				
			||||||
 | 
										<ui-input :value="instance.latestStatus" type="text" readonly>
 | 
				
			||||||
 | 
											<span>{{ $t('status') }}</span>
 | 
				
			||||||
 | 
										</ui-input>
 | 
				
			||||||
 | 
									</ui-horizon-group>
 | 
				
			||||||
 | 
									<ui-input :value="instance.latestRequestReceivedAt" type="text" readonly>
 | 
				
			||||||
 | 
										<span>{{ $t('latest-request-received-at') }}</span>
 | 
				
			||||||
 | 
									</ui-input>
 | 
				
			||||||
 | 
								</div>
 | 
				
			||||||
 | 
							</section>
 | 
				
			||||||
 | 
						</ui-card>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						<ui-card>
 | 
				
			||||||
 | 
							<div slot="title"><fa :icon="faUsers"/> {{ $t('instances') }}</div>
 | 
				
			||||||
 | 
							<section class="fit-top">
 | 
				
			||||||
 | 
								<ui-horizon-group inputs>
 | 
				
			||||||
 | 
									<ui-select v-model="sort">
 | 
				
			||||||
 | 
										<span slot="label">{{ $t('sort') }}</span>
 | 
				
			||||||
 | 
										<option value="-caughtAt">{{ $t('sorts.caughtAtAsc') }}</option>
 | 
				
			||||||
 | 
										<option value="+caughtAt">{{ $t('sorts.caughtAtDesc') }}</option>
 | 
				
			||||||
 | 
										<option value="-notes">{{ $t('sorts.notesAsc') }}</option>
 | 
				
			||||||
 | 
										<option value="+notes">{{ $t('sorts.notesDesc') }}</option>
 | 
				
			||||||
 | 
										<option value="-users">{{ $t('sorts.usersAsc') }}</option>
 | 
				
			||||||
 | 
										<option value="+users">{{ $t('sorts.usersDesc') }}</option>
 | 
				
			||||||
 | 
										<option value="-following">{{ $t('sorts.followingAsc') }}</option>
 | 
				
			||||||
 | 
										<option value="+following">{{ $t('sorts.followingDesc') }}</option>
 | 
				
			||||||
 | 
										<option value="-followers">{{ $t('sorts.followersAsc') }}</option>
 | 
				
			||||||
 | 
										<option value="+followers">{{ $t('sorts.followersDesc') }}</option>
 | 
				
			||||||
 | 
									</ui-select>
 | 
				
			||||||
 | 
								</ui-horizon-group>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								<div class="instances">
 | 
				
			||||||
 | 
									<header>
 | 
				
			||||||
 | 
										<span>{{ $t('host') }}</span>
 | 
				
			||||||
 | 
										<span>{{ $t('notes') }}</span>
 | 
				
			||||||
 | 
										<span>{{ $t('users') }}</span>
 | 
				
			||||||
 | 
										<span>{{ $t('following') }}</span>
 | 
				
			||||||
 | 
										<span>{{ $t('followers') }}</span>
 | 
				
			||||||
 | 
										<span>{{ $t('status') }}</span>
 | 
				
			||||||
 | 
									</header>
 | 
				
			||||||
 | 
									<div v-for="instance in instances">
 | 
				
			||||||
 | 
										<span>{{ instance.host }}</span>
 | 
				
			||||||
 | 
										<span>{{ instance.notesCount | number }}</span>
 | 
				
			||||||
 | 
										<span>{{ instance.usersCount | number }}</span>
 | 
				
			||||||
 | 
										<span>{{ instance.followingCount | number }}</span>
 | 
				
			||||||
 | 
										<span>{{ instance.followersCount | number }}</span>
 | 
				
			||||||
 | 
										<span>{{ instance.latestStatus }}</span>
 | 
				
			||||||
 | 
									</div>
 | 
				
			||||||
 | 
								</div>
 | 
				
			||||||
 | 
							</section>
 | 
				
			||||||
 | 
						</ui-card>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script lang="ts">
 | 
				
			||||||
 | 
					import Vue from 'vue';
 | 
				
			||||||
 | 
					import i18n from '../../i18n';
 | 
				
			||||||
 | 
					import { faGlobe, faTerminal, faSearch } from '@fortawesome/free-solid-svg-icons';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default Vue.extend({
 | 
				
			||||||
 | 
						i18n: i18n('admin/views/federation.vue'),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						data() {
 | 
				
			||||||
 | 
							return {
 | 
				
			||||||
 | 
								instance: null,
 | 
				
			||||||
 | 
								target: null,
 | 
				
			||||||
 | 
								sort: '+caughtAt',
 | 
				
			||||||
 | 
								limit: 50,
 | 
				
			||||||
 | 
								instances: [],
 | 
				
			||||||
 | 
								faGlobe, faTerminal, faSearch
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						watch: {
 | 
				
			||||||
 | 
							sort() {
 | 
				
			||||||
 | 
								this.instances = [];
 | 
				
			||||||
 | 
								this.fetchInstances();
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						mounted() {
 | 
				
			||||||
 | 
							this.fetchInstances();
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						methods: {
 | 
				
			||||||
 | 
							showInstance() {
 | 
				
			||||||
 | 
								this.$root.api('federation/show-instance', {
 | 
				
			||||||
 | 
									host: this.target
 | 
				
			||||||
 | 
								}).then(instance => {
 | 
				
			||||||
 | 
									if (instance == null) {
 | 
				
			||||||
 | 
										this.$root.dialog({
 | 
				
			||||||
 | 
											type: 'error',
 | 
				
			||||||
 | 
											text: this.$t('instance-not-registered')
 | 
				
			||||||
 | 
										});
 | 
				
			||||||
 | 
									} else {
 | 
				
			||||||
 | 
										this.instance = instance;
 | 
				
			||||||
 | 
										this.target = '';
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								});
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							fetchInstances() {
 | 
				
			||||||
 | 
								this.$root.api('federation/instances', {
 | 
				
			||||||
 | 
									sort: this.sort
 | 
				
			||||||
 | 
								}).then(instances => {
 | 
				
			||||||
 | 
									this.instances = instances;
 | 
				
			||||||
 | 
								});
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style lang="stylus" scoped>
 | 
				
			||||||
 | 
					.target
 | 
				
			||||||
 | 
						margin-bottom 16px !important
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.instances
 | 
				
			||||||
 | 
						width 100%
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						> header
 | 
				
			||||||
 | 
							display flex
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							> *
 | 
				
			||||||
 | 
								color var(--text)
 | 
				
			||||||
 | 
								font-weight bold
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						> div
 | 
				
			||||||
 | 
							display flex
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						> * > *
 | 
				
			||||||
 | 
							flex 1
 | 
				
			||||||
 | 
							overflow auto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							&:first-child
 | 
				
			||||||
 | 
								min-width 200px
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
@@ -20,10 +20,11 @@
 | 
				
			|||||||
		<ul>
 | 
							<ul>
 | 
				
			||||||
			<li @click="nav('dashboard')" :class="{ active: page == 'dashboard' }"><fa icon="home" fixed-width/>{{ $t('dashboard') }}</li>
 | 
								<li @click="nav('dashboard')" :class="{ active: page == 'dashboard' }"><fa icon="home" fixed-width/>{{ $t('dashboard') }}</li>
 | 
				
			||||||
			<li @click="nav('instance')" :class="{ active: page == 'instance' }"><fa icon="cog" fixed-width/>{{ $t('instance') }}</li>
 | 
								<li @click="nav('instance')" :class="{ active: page == 'instance' }"><fa icon="cog" fixed-width/>{{ $t('instance') }}</li>
 | 
				
			||||||
 | 
								<li @click="nav('queue')" :class="{ active: page == 'queue' }"><fa :icon="faTasks" fixed-width/>{{ $t('queue') }}</li>
 | 
				
			||||||
			<li @click="nav('moderators')" :class="{ active: page == 'moderators' }"><fa :icon="faHeadset" fixed-width/>{{ $t('moderators') }}</li>
 | 
								<li @click="nav('moderators')" :class="{ active: page == 'moderators' }"><fa :icon="faHeadset" fixed-width/>{{ $t('moderators') }}</li>
 | 
				
			||||||
			<li @click="nav('users')" :class="{ active: page == 'users' }"><fa icon="users" fixed-width/>{{ $t('users') }}</li>
 | 
								<li @click="nav('users')" :class="{ active: page == 'users' }"><fa icon="users" fixed-width/>{{ $t('users') }}</li>
 | 
				
			||||||
			<li @click="nav('drive')" :class="{ active: page == 'drive' }"><fa icon="cloud" fixed-width/>{{ $t('@.drive') }}</li>
 | 
								<li @click="nav('drive')" :class="{ active: page == 'drive' }"><fa icon="cloud" fixed-width/>{{ $t('@.drive') }}</li>
 | 
				
			||||||
			<!-- <li @click="nav('federation')" :class="{ active: page == 'federation' }"><fa :icon="faShareAlt" fixed-width/>{{ $t('federation') }}</li> -->
 | 
								<li @click="nav('federation')" :class="{ active: page == 'federation' }"><fa :icon="faGlobe" fixed-width/>{{ $t('federation') }}</li>
 | 
				
			||||||
			<li @click="nav('emoji')" :class="{ active: page == 'emoji' }"><fa :icon="faGrin" fixed-width/>{{ $t('emoji') }}</li>
 | 
								<li @click="nav('emoji')" :class="{ active: page == 'emoji' }"><fa :icon="faGrin" fixed-width/>{{ $t('emoji') }}</li>
 | 
				
			||||||
			<li @click="nav('announcements')" :class="{ active: page == 'announcements' }"><fa icon="broadcast-tower" fixed-width/>{{ $t('announcements') }}</li>
 | 
								<li @click="nav('announcements')" :class="{ active: page == 'announcements' }"><fa icon="broadcast-tower" fixed-width/>{{ $t('announcements') }}</li>
 | 
				
			||||||
			<li @click="nav('hashtags')" :class="{ active: page == 'hashtags' }"><fa icon="hashtag" fixed-width/>{{ $t('hashtags') }}</li>
 | 
								<li @click="nav('hashtags')" :class="{ active: page == 'hashtags' }"><fa icon="hashtag" fixed-width/>{{ $t('hashtags') }}</li>
 | 
				
			||||||
@@ -40,12 +41,14 @@
 | 
				
			|||||||
		<div class="page">
 | 
							<div class="page">
 | 
				
			||||||
			<div v-if="page == 'dashboard'"><x-dashboard/></div>
 | 
								<div v-if="page == 'dashboard'"><x-dashboard/></div>
 | 
				
			||||||
			<div v-if="page == 'instance'"><x-instance/></div>
 | 
								<div v-if="page == 'instance'"><x-instance/></div>
 | 
				
			||||||
 | 
								<div v-if="page == 'queue'"><x-queue/></div>
 | 
				
			||||||
			<div v-if="page == 'moderators'"><x-moderators/></div>
 | 
								<div v-if="page == 'moderators'"><x-moderators/></div>
 | 
				
			||||||
			<div v-if="page == 'users'"><x-users/></div>
 | 
								<div v-if="page == 'users'"><x-users/></div>
 | 
				
			||||||
			<div v-if="page == 'emoji'"><x-emoji/></div>
 | 
								<div v-if="page == 'emoji'"><x-emoji/></div>
 | 
				
			||||||
			<div v-if="page == 'announcements'"><x-announcements/></div>
 | 
								<div v-if="page == 'announcements'"><x-announcements/></div>
 | 
				
			||||||
			<div v-if="page == 'hashtags'"><x-hashtags/></div>
 | 
								<div v-if="page == 'hashtags'"><x-hashtags/></div>
 | 
				
			||||||
			<div v-if="page == 'drive'"><x-drive/></div>
 | 
								<div v-if="page == 'drive'"><x-drive/></div>
 | 
				
			||||||
 | 
								<div v-if="page == 'federation'"><x-federation/></div>
 | 
				
			||||||
			<div v-if="page == 'abuse'"><x-abuse/></div>
 | 
								<div v-if="page == 'abuse'"><x-abuse/></div>
 | 
				
			||||||
		</div>
 | 
							</div>
 | 
				
			||||||
	</main>
 | 
						</main>
 | 
				
			||||||
@@ -58,6 +61,7 @@ import i18n from '../../i18n';
 | 
				
			|||||||
import { version } from '../../config';
 | 
					import { version } from '../../config';
 | 
				
			||||||
import XDashboard from "./dashboard.vue";
 | 
					import XDashboard from "./dashboard.vue";
 | 
				
			||||||
import XInstance from "./instance.vue";
 | 
					import XInstance from "./instance.vue";
 | 
				
			||||||
 | 
					import XQueue from "./queue.vue";
 | 
				
			||||||
import XModerators from "./moderators.vue";
 | 
					import XModerators from "./moderators.vue";
 | 
				
			||||||
import XEmoji from "./emoji.vue";
 | 
					import XEmoji from "./emoji.vue";
 | 
				
			||||||
import XAnnouncements from "./announcements.vue";
 | 
					import XAnnouncements from "./announcements.vue";
 | 
				
			||||||
@@ -65,7 +69,9 @@ import XHashtags from "./hashtags.vue";
 | 
				
			|||||||
import XUsers from "./users.vue";
 | 
					import XUsers from "./users.vue";
 | 
				
			||||||
import XDrive from "./drive.vue";
 | 
					import XDrive from "./drive.vue";
 | 
				
			||||||
import XAbuse from "./abuse.vue";
 | 
					import XAbuse from "./abuse.vue";
 | 
				
			||||||
import { faHeadset, faArrowLeft, faShareAlt, faExclamationCircle } from '@fortawesome/free-solid-svg-icons';
 | 
					import XFederation from "./federation.vue";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { faHeadset, faArrowLeft, faGlobe, faExclamationCircle, faTasks } from '@fortawesome/free-solid-svg-icons';
 | 
				
			||||||
import { faGrin } from '@fortawesome/free-regular-svg-icons';
 | 
					import { faGrin } from '@fortawesome/free-regular-svg-icons';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Detect the user agent
 | 
					// Detect the user agent
 | 
				
			||||||
@@ -77,6 +83,7 @@ export default Vue.extend({
 | 
				
			|||||||
	components: {
 | 
						components: {
 | 
				
			||||||
		XDashboard,
 | 
							XDashboard,
 | 
				
			||||||
		XInstance,
 | 
							XInstance,
 | 
				
			||||||
 | 
							XQueue,
 | 
				
			||||||
		XModerators,
 | 
							XModerators,
 | 
				
			||||||
		XEmoji,
 | 
							XEmoji,
 | 
				
			||||||
		XAnnouncements,
 | 
							XAnnouncements,
 | 
				
			||||||
@@ -84,6 +91,7 @@ export default Vue.extend({
 | 
				
			|||||||
		XUsers,
 | 
							XUsers,
 | 
				
			||||||
		XDrive,
 | 
							XDrive,
 | 
				
			||||||
		XAbuse,
 | 
							XAbuse,
 | 
				
			||||||
 | 
							XFederation,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	provide: {
 | 
						provide: {
 | 
				
			||||||
		isMobile
 | 
							isMobile
 | 
				
			||||||
@@ -97,8 +105,9 @@ export default Vue.extend({
 | 
				
			|||||||
			faGrin,
 | 
								faGrin,
 | 
				
			||||||
			faArrowLeft,
 | 
								faArrowLeft,
 | 
				
			||||||
			faHeadset,
 | 
								faHeadset,
 | 
				
			||||||
			faShareAlt,
 | 
								faGlobe,
 | 
				
			||||||
			faExclamationCircle
 | 
								faExclamationCircle,
 | 
				
			||||||
 | 
								faTasks
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	methods: {
 | 
						methods: {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										43
									
								
								src/client/app/admin/views/queue.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								src/client/app/admin/views/queue.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,43 @@
 | 
				
			|||||||
 | 
					<template>
 | 
				
			||||||
 | 
					<div>
 | 
				
			||||||
 | 
						<ui-card>
 | 
				
			||||||
 | 
							<div slot="title">{{ $t('operation') }}</div>
 | 
				
			||||||
 | 
							<section>
 | 
				
			||||||
 | 
								<ui-button @click="removeAllJobs">{{ $t('remove-all-jobs') }}</ui-button>
 | 
				
			||||||
 | 
							</section>
 | 
				
			||||||
 | 
						</ui-card>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script lang="ts">
 | 
				
			||||||
 | 
					import Vue from 'vue';
 | 
				
			||||||
 | 
					import i18n from '../../i18n';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default Vue.extend({
 | 
				
			||||||
 | 
						i18n: i18n('admin/views/queue.vue'),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						data() {
 | 
				
			||||||
 | 
							return {
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						methods: {
 | 
				
			||||||
 | 
							async removeAllJobs() {
 | 
				
			||||||
 | 
								const process = async () => {
 | 
				
			||||||
 | 
									await this.$root.api('admin/queue/clear');
 | 
				
			||||||
 | 
									this.$root.dialog({
 | 
				
			||||||
 | 
										type: 'success',
 | 
				
			||||||
 | 
										splash: true
 | 
				
			||||||
 | 
									});
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								await process().catch(e => {
 | 
				
			||||||
 | 
									this.$root.dialog({
 | 
				
			||||||
 | 
										type: 'error',
 | 
				
			||||||
 | 
										text: e.toString()
 | 
				
			||||||
 | 
									});
 | 
				
			||||||
 | 
								});
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
@@ -12,6 +12,7 @@
 | 
				
			|||||||
			<span class="is-admin" v-if="user.isAdmin">admin</span>
 | 
								<span class="is-admin" v-if="user.isAdmin">admin</span>
 | 
				
			||||||
			<span class="is-moderator" v-if="user.isModerator">moderator</span>
 | 
								<span class="is-moderator" v-if="user.isModerator">moderator</span>
 | 
				
			||||||
			<span class="is-verified" v-if="user.isVerified" :title="$t('@.verified-user')"><fa icon="star"/></span>
 | 
								<span class="is-verified" v-if="user.isVerified" :title="$t('@.verified-user')"><fa icon="star"/></span>
 | 
				
			||||||
 | 
								<span class="is-silenced" v-if="user.isSilenced" :title="$t('@.silenced-user')"><fa :icon="faMicrophoneSlash"/></span>
 | 
				
			||||||
			<span class="is-suspended" v-if="user.isSuspended" :title="$t('@.suspended-user')"><fa :icon="faSnowflake"/></span>
 | 
								<span class="is-suspended" v-if="user.isSuspended" :title="$t('@.suspended-user')"><fa :icon="faSnowflake"/></span>
 | 
				
			||||||
		</header>
 | 
							</header>
 | 
				
			||||||
		<div>
 | 
							<div>
 | 
				
			||||||
@@ -27,6 +28,7 @@
 | 
				
			|||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import Vue from 'vue';
 | 
					import Vue from 'vue';
 | 
				
			||||||
import i18n from '../../i18n';
 | 
					import i18n from '../../i18n';
 | 
				
			||||||
 | 
					import { faMicrophoneSlash } from '@fortawesome/free-solid-svg-icons';
 | 
				
			||||||
import { faSnowflake } from '@fortawesome/free-regular-svg-icons';
 | 
					import { faSnowflake } from '@fortawesome/free-regular-svg-icons';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default Vue.extend({
 | 
					export default Vue.extend({
 | 
				
			||||||
@@ -34,7 +36,7 @@ export default Vue.extend({
 | 
				
			|||||||
	props: ['user'],
 | 
						props: ['user'],
 | 
				
			||||||
	data() {
 | 
						data() {
 | 
				
			||||||
		return {
 | 
							return {
 | 
				
			||||||
			faSnowflake
 | 
								faSnowflake, faMicrophoneSlash
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
@@ -76,6 +78,7 @@ export default Vue.extend({
 | 
				
			|||||||
				color var(--noteHeaderAdminFg)
 | 
									color var(--noteHeaderAdminFg)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			> .is-verified
 | 
								> .is-verified
 | 
				
			||||||
 | 
								> .is-silenced
 | 
				
			||||||
			> .is-suspended
 | 
								> .is-suspended
 | 
				
			||||||
				margin 0 0 0 .5em
 | 
									margin 0 0 0 .5em
 | 
				
			||||||
				color #4dabf7
 | 
									color #4dabf7
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,7 +3,7 @@
 | 
				
			|||||||
	<ui-card>
 | 
						<ui-card>
 | 
				
			||||||
		<div slot="title"><fa :icon="faTerminal"/> {{ $t('operation') }}</div>
 | 
							<div slot="title"><fa :icon="faTerminal"/> {{ $t('operation') }}</div>
 | 
				
			||||||
		<section class="fit-top">
 | 
							<section class="fit-top">
 | 
				
			||||||
			<ui-input class="target" v-model="target" type="text">
 | 
								<ui-input class="target" v-model="target" type="text" @enter="showUser">
 | 
				
			||||||
				<span>{{ $t('username-or-userid') }}</span>
 | 
									<span>{{ $t('username-or-userid') }}</span>
 | 
				
			||||||
			</ui-input>
 | 
								</ui-input>
 | 
				
			||||||
			<ui-button @click="showUser"><fa :icon="faSearch"/> {{ $t('lookup') }}</ui-button>
 | 
								<ui-button @click="showUser"><fa :icon="faSearch"/> {{ $t('lookup') }}</ui-button>
 | 
				
			||||||
@@ -16,6 +16,10 @@
 | 
				
			|||||||
						<ui-button @click="verifyUser" :disabled="verifying"><fa :icon="faCertificate"/> {{ $t('verify') }}</ui-button>
 | 
											<ui-button @click="verifyUser" :disabled="verifying"><fa :icon="faCertificate"/> {{ $t('verify') }}</ui-button>
 | 
				
			||||||
						<ui-button @click="unverifyUser" :disabled="unverifying">{{ $t('unverify') }}</ui-button>
 | 
											<ui-button @click="unverifyUser" :disabled="unverifying">{{ $t('unverify') }}</ui-button>
 | 
				
			||||||
					</ui-horizon-group>
 | 
										</ui-horizon-group>
 | 
				
			||||||
 | 
										<ui-horizon-group>
 | 
				
			||||||
 | 
											<ui-button @click="silenceUser"><fa :icon="faMicrophoneSlash"/> {{ $t('make-silence') }}</ui-button>
 | 
				
			||||||
 | 
											<ui-button @click="unsilenceUser">{{ $t('unmake-silence') }}</ui-button>
 | 
				
			||||||
 | 
										</ui-horizon-group>
 | 
				
			||||||
					<ui-horizon-group>
 | 
										<ui-horizon-group>
 | 
				
			||||||
						<ui-button @click="suspendUser" :disabled="suspending"><fa :icon="faSnowflake"/> {{ $t('suspend') }}</ui-button>
 | 
											<ui-button @click="suspendUser" :disabled="suspending"><fa :icon="faSnowflake"/> {{ $t('suspend') }}</ui-button>
 | 
				
			||||||
						<ui-button @click="unsuspendUser" :disabled="unsuspending">{{ $t('unsuspend') }}</ui-button>
 | 
											<ui-button @click="unsuspendUser" :disabled="unsuspending">{{ $t('unsuspend') }}</ui-button>
 | 
				
			||||||
@@ -66,7 +70,7 @@
 | 
				
			|||||||
import Vue from 'vue';
 | 
					import Vue from 'vue';
 | 
				
			||||||
import i18n from '../../i18n';
 | 
					import i18n from '../../i18n';
 | 
				
			||||||
import parseAcct from "../../../../misc/acct/parse";
 | 
					import parseAcct from "../../../../misc/acct/parse";
 | 
				
			||||||
import { faCertificate, faUsers, faTerminal, faSearch, faKey, faSync } from '@fortawesome/free-solid-svg-icons';
 | 
					import { faCertificate, faUsers, faTerminal, faSearch, faKey, faSync, faMicrophoneSlash } from '@fortawesome/free-solid-svg-icons';
 | 
				
			||||||
import { faSnowflake } from '@fortawesome/free-regular-svg-icons';
 | 
					import { faSnowflake } from '@fortawesome/free-regular-svg-icons';
 | 
				
			||||||
import XUser from './users.user.vue';
 | 
					import XUser from './users.user.vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -90,7 +94,7 @@ export default Vue.extend({
 | 
				
			|||||||
			offset: 0,
 | 
								offset: 0,
 | 
				
			||||||
			users: [],
 | 
								users: [],
 | 
				
			||||||
			existMore: false,
 | 
								existMore: false,
 | 
				
			||||||
			faTerminal, faCertificate, faUsers, faSnowflake, faSearch, faKey, faSync
 | 
								faTerminal, faCertificate, faUsers, faSnowflake, faSearch, faKey, faSync, faMicrophoneSlash
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -120,22 +124,23 @@ export default Vue.extend({
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	methods: {
 | 
						methods: {
 | 
				
			||||||
		/** テキストエリアのユーザーを解決する */
 | 
							/** テキストエリアのユーザーを解決する */
 | 
				
			||||||
		async fetchUser() {
 | 
							fetchUser() {
 | 
				
			||||||
			try {
 | 
								return new Promise((res) => {
 | 
				
			||||||
				return await this.$root.api('users/show', this.target.startsWith('@') ? parseAcct(this.target) : { userId: this.target });
 | 
									const usernamePromise = this.$root.api('users/show', parseAcct(this.target));
 | 
				
			||||||
			} catch (e) {
 | 
									const idPromise = this.$root.api('users/show', { userId: this.target });
 | 
				
			||||||
				if (e == 'user not found') {
 | 
					
 | 
				
			||||||
					this.$root.dialog({
 | 
									usernamePromise.then(res);
 | 
				
			||||||
						type: 'error',
 | 
									idPromise.then(res);
 | 
				
			||||||
						text: this.$t('user-not-found')
 | 
					
 | 
				
			||||||
					});
 | 
									idPromise.catch(e => {
 | 
				
			||||||
				} else {
 | 
										if (e == 'user not found') {
 | 
				
			||||||
					this.$root.dialog({
 | 
											this.$root.dialog({
 | 
				
			||||||
						type: 'error',
 | 
												type: 'error',
 | 
				
			||||||
						text: e.toString()
 | 
												text: this.$t('user-not-found')
 | 
				
			||||||
					});
 | 
											});
 | 
				
			||||||
				}
 | 
										}
 | 
				
			||||||
			}
 | 
									});
 | 
				
			||||||
 | 
								});
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/** テキストエリアから処理対象ユーザーを設定する */
 | 
							/** テキストエリアから処理対象ユーザーを設定する */
 | 
				
			||||||
@@ -216,6 +221,44 @@ export default Vue.extend({
 | 
				
			|||||||
			this.refreshUser();
 | 
								this.refreshUser();
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							async silenceUser() {
 | 
				
			||||||
 | 
								const process = async () => {
 | 
				
			||||||
 | 
									await this.$root.api('admin/silence-user', { userId: this.user._id });
 | 
				
			||||||
 | 
									this.$root.dialog({
 | 
				
			||||||
 | 
										type: 'success',
 | 
				
			||||||
 | 
										splash: true
 | 
				
			||||||
 | 
									});
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								await process().catch(e => {
 | 
				
			||||||
 | 
									this.$root.dialog({
 | 
				
			||||||
 | 
										type: 'error',
 | 
				
			||||||
 | 
										text: e.toString()
 | 
				
			||||||
 | 
									});
 | 
				
			||||||
 | 
								});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								this.refreshUser();
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							async unsilenceUser() {
 | 
				
			||||||
 | 
								const process = async () => {
 | 
				
			||||||
 | 
									await this.$root.api('admin/unsilence-user', { userId: this.user._id });
 | 
				
			||||||
 | 
									this.$root.dialog({
 | 
				
			||||||
 | 
										type: 'success',
 | 
				
			||||||
 | 
										splash: true
 | 
				
			||||||
 | 
									});
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								await process().catch(e => {
 | 
				
			||||||
 | 
									this.$root.dialog({
 | 
				
			||||||
 | 
										type: 'error',
 | 
				
			||||||
 | 
										text: e.toString()
 | 
				
			||||||
 | 
									});
 | 
				
			||||||
 | 
								});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								this.refreshUser();
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		async suspendUser() {
 | 
							async suspendUser() {
 | 
				
			||||||
			if (!await this.getConfirmed(this.$t('suspend-confirm'))) return;
 | 
								if (!await this.getConfirmed(this.$t('suspend-confirm'))) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -31,3 +31,11 @@
 | 
				
			|||||||
	0% { transform: rotate(0deg); }
 | 
						0% { transform: rotate(0deg); }
 | 
				
			||||||
	100% { transform: rotate(360deg); }
 | 
						100% { transform: rotate(360deg); }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@keyframes jump {
 | 
				
			||||||
 | 
						0% { transform: translateY(0); }
 | 
				
			||||||
 | 
						25% { transform: translateY(-16px); }
 | 
				
			||||||
 | 
						50% { transform: translateY(0); }
 | 
				
			||||||
 | 
						75% { transform: translateY(-8px); }
 | 
				
			||||||
 | 
						100% { transform: translateY(0); }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -62,23 +62,26 @@
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (settings && settings.device.lang &&
 | 
						if (settings && settings.device.lang &&
 | 
				
			||||||
		langs.includes(settings.device.lang)) {
 | 
							langs.includes(settings.device.lang))
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
		lang = settings.device.lang;
 | 
							lang = settings.device.lang;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	window.lang = lang;
 | 
						localStorage.setItem('lang', lang);
 | 
				
			||||||
	//#endregion
 | 
						//#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	let locale = localStorage.getItem('locale');
 | 
						//#region Fetch locale data
 | 
				
			||||||
 | 
						const cachedLocale = localStorage.getItem('locale');
 | 
				
			||||||
	const localeKey = localStorage.getItem('localeKey');
 | 
						const localeKey = localStorage.getItem('localeKey');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (locale == null || localeKey != `${ver}.${lang}`) {
 | 
						if (cachedLocale == null || localeKey != `${ver}.${lang}`) {
 | 
				
			||||||
		const locale = await fetch(`/assets/locales/${lang}.json?ver=${ver}`)
 | 
							const locale = await fetch(`/assets/locales/${lang}.json?ver=${ver}`)
 | 
				
			||||||
			.then(response => response.json());
 | 
								.then(response => response.json());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			localStorage.setItem('locale', JSON.stringify(locale));
 | 
							localStorage.setItem('locale', JSON.stringify(locale));
 | 
				
			||||||
			localStorage.setItem('localeKey', `${ver}.${lang}`);
 | 
							localStorage.setItem('localeKey', `${ver}.${lang}`);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						//#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Detect the user agent
 | 
						// Detect the user agent
 | 
				
			||||||
	const ua = navigator.userAgent.toLowerCase();
 | 
						const ua = navigator.userAgent.toLowerCase();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
// スクリプトサイズがデカい
 | 
					// スクリプトサイズがデカい
 | 
				
			||||||
//const crypto = require('crypto');
 | 
					//import * as crypto from 'crypto';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default (data: ArrayBuffer) => {
 | 
					export default (data: ArrayBuffer) => {
 | 
				
			||||||
	//const buf = new Buffer(data);
 | 
						//const buf = new Buffer(data);
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										9
									
								
								src/client/app/common/scripts/get-static-image-url.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								src/client/app/common/scripts/get-static-image-url.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					import { url as instanceUrl } from '../../config';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export function getStaticImageUrl(url: string): string {
 | 
				
			||||||
 | 
						const u = new URL(url);
 | 
				
			||||||
 | 
						const dummy = `${u.host}${u.pathname}`;	// 拡張子がないとキャッシュしてくれないCDNがあるので
 | 
				
			||||||
 | 
						let result = `${instanceUrl}/proxy/${dummy}?url=${encodeURIComponent(u.href)}`;
 | 
				
			||||||
 | 
						result += '&static=1';
 | 
				
			||||||
 | 
						return result;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
const NProgress = require('nprogress');
 | 
					import * as NProgress from 'nprogress';
 | 
				
			||||||
NProgress.configure({
 | 
					NProgress.configure({
 | 
				
			||||||
	trickleSpeed: 500,
 | 
						trickleSpeed: 500,
 | 
				
			||||||
	showSpinner: false
 | 
						showSpinner: false
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
import parse from '../../../../mfm/parse';
 | 
					import { parse } from '../../../../mfm/parse';
 | 
				
			||||||
import { sum, unique } from '../../../../prelude/array';
 | 
					import { sum, unique } from '../../../../prelude/array';
 | 
				
			||||||
import shouldMuteNote from './should-mute-note';
 | 
					import shouldMuteNote from './should-mute-note';
 | 
				
			||||||
import MkNoteMenu from '../views/components/note-menu.vue';
 | 
					import MkNoteMenu from '../views/components/note-menu.vue';
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,6 +15,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import Vue from 'vue';
 | 
					import Vue from 'vue';
 | 
				
			||||||
 | 
					import { getStaticImageUrl } from '../../../common/scripts/get-static-image-url';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default Vue.extend({
 | 
					export default Vue.extend({
 | 
				
			||||||
	props: {
 | 
						props: {
 | 
				
			||||||
@@ -47,6 +48,11 @@ export default Vue.extend({
 | 
				
			|||||||
				borderRadius: this.$store.state.settings.circleIcons ? '100%' : null
 | 
									borderRadius: this.$store.state.settings.circleIcons ? '100%' : null
 | 
				
			||||||
			};
 | 
								};
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
							url(): string {
 | 
				
			||||||
 | 
								return this.$store.state.device.disableShowingAnimatedImages
 | 
				
			||||||
 | 
									? getStaticImageUrl(this.user.avatarUrl)
 | 
				
			||||||
 | 
									: this.user.avatarUrl;
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
		icon(): any {
 | 
							icon(): any {
 | 
				
			||||||
			return {
 | 
								return {
 | 
				
			||||||
				backgroundColor: this.lightmode
 | 
									backgroundColor: this.lightmode
 | 
				
			||||||
@@ -54,7 +60,7 @@ export default Vue.extend({
 | 
				
			|||||||
					: this.user.avatarColor && this.user.avatarColor.length == 3
 | 
										: this.user.avatarColor && this.user.avatarColor.length == 3
 | 
				
			||||||
						? `rgb(${this.user.avatarColor.join(',')})`
 | 
											? `rgb(${this.user.avatarColor.join(',')})`
 | 
				
			||||||
						: null,
 | 
											: null,
 | 
				
			||||||
				backgroundImage: this.lightmode ? null : `url(${this.user.avatarUrl})`,
 | 
									backgroundImage: this.lightmode ? null : `url(${this.url})`,
 | 
				
			||||||
				borderRadius: this.$store.state.settings.circleIcons ? '100%' : null
 | 
									borderRadius: this.$store.state.settings.circleIcons ? '100%' : null
 | 
				
			||||||
			};
 | 
								};
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,11 +1,11 @@
 | 
				
			|||||||
<template>
 | 
					<template>
 | 
				
			||||||
<prism :inline="inline" :language="lang">{{ code }}</prism>
 | 
					<prism :inline="inline" :language="lang || 'js'">{{ code }}</prism>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import Vue from 'vue';
 | 
					import Vue from 'vue';
 | 
				
			||||||
import 'prismjs';
 | 
					import 'prismjs';
 | 
				
			||||||
import 'prismjs/themes/prism.css';
 | 
					import 'prismjs/themes/prism-okaidia.css';
 | 
				
			||||||
import Prism from 'vue-prism-component';
 | 
					import Prism from 'vue-prism-component';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default Vue.extend({
 | 
					export default Vue.extend({
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,7 +18,7 @@
 | 
				
			|||||||
import Vue from 'vue';
 | 
					import Vue from 'vue';
 | 
				
			||||||
import i18n from '../../../i18n';
 | 
					import i18n from '../../../i18n';
 | 
				
			||||||
import * as tinycolor from 'tinycolor2';
 | 
					import * as tinycolor from 'tinycolor2';
 | 
				
			||||||
import * as ApexCharts from 'apexcharts';
 | 
					import ApexCharts from 'apexcharts';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default Vue.extend({
 | 
					export default Vue.extend({
 | 
				
			||||||
	i18n: i18n('common/views/components/drive-settings.vue'),
 | 
						i18n: i18n('common/views/components/drive-settings.vue'),
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,6 +9,7 @@
 | 
				
			|||||||
import Vue from 'vue';
 | 
					import Vue from 'vue';
 | 
				
			||||||
// スクリプトサイズがデカい
 | 
					// スクリプトサイズがデカい
 | 
				
			||||||
//import { lib } from 'emojilib';
 | 
					//import { lib } from 'emojilib';
 | 
				
			||||||
 | 
					import { getStaticImageUrl } from '../../../common/scripts/get-static-image-url';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default Vue.extend({
 | 
					export default Vue.extend({
 | 
				
			||||||
	props: {
 | 
						props: {
 | 
				
			||||||
@@ -54,7 +55,9 @@ export default Vue.extend({
 | 
				
			|||||||
			const customEmoji = this.customEmojis.find(x => x.name == this.name);
 | 
								const customEmoji = this.customEmojis.find(x => x.name == this.name);
 | 
				
			||||||
			if (customEmoji) {
 | 
								if (customEmoji) {
 | 
				
			||||||
				this.customEmoji = customEmoji;
 | 
									this.customEmoji = customEmoji;
 | 
				
			||||||
				this.url = customEmoji.url;
 | 
									this.url = this.$store.state.device.disableShowingAnimatedImages
 | 
				
			||||||
 | 
										? getStaticImageUrl(customEmoji.url)
 | 
				
			||||||
 | 
										: customEmoji.url;
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				//const emoji = lib[this.name];
 | 
									//const emoji = lib[this.name];
 | 
				
			||||||
				//if (emoji) {
 | 
									//if (emoji) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,6 +11,7 @@
 | 
				
			|||||||
			:title="media.name"
 | 
								:title="media.name"
 | 
				
			||||||
			controls
 | 
								controls
 | 
				
			||||||
			ref="audio"
 | 
								ref="audio"
 | 
				
			||||||
 | 
								@volumechange="volumechange"
 | 
				
			||||||
			preload="metadata" />
 | 
								preload="metadata" />
 | 
				
			||||||
	</div>
 | 
						</div>
 | 
				
			||||||
	<a class="download" v-else
 | 
						<a class="download" v-else
 | 
				
			||||||
@@ -40,7 +41,17 @@ export default Vue.extend({
 | 
				
			|||||||
		return {
 | 
							return {
 | 
				
			||||||
			hide: true
 | 
								hide: true
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
	}
 | 
						},
 | 
				
			||||||
 | 
						mounted() {
 | 
				
			||||||
 | 
							const audioTag = this.$refs.audio as HTMLAudioElement;
 | 
				
			||||||
 | 
							audioTag.volume = this.$store.state.device.mediaVolume;
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						methods: {
 | 
				
			||||||
 | 
							volumechange() {
 | 
				
			||||||
 | 
								const audioTag = this.$refs.audio as HTMLAudioElement;
 | 
				
			||||||
 | 
								this.$store.commit('device/set', { key: 'mediaVolume', value: audioTag.volume });
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,6 +17,7 @@
 | 
				
			|||||||
import Vue from 'vue';
 | 
					import Vue from 'vue';
 | 
				
			||||||
import i18n from '../../../i18n';
 | 
					import i18n from '../../../i18n';
 | 
				
			||||||
import ImageViewer from './image-viewer.vue';
 | 
					import ImageViewer from './image-viewer.vue';
 | 
				
			||||||
 | 
					import { getStaticImageUrl } from '../../../common/scripts/get-static-image-url';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default Vue.extend({
 | 
					export default Vue.extend({
 | 
				
			||||||
	i18n: i18n('common/views/components/media-image.vue'),
 | 
						i18n: i18n('common/views/components/media-image.vue'),
 | 
				
			||||||
@@ -36,7 +37,11 @@ export default Vue.extend({
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	computed: {
 | 
						computed: {
 | 
				
			||||||
		style(): any {
 | 
							style(): any {
 | 
				
			||||||
			let url = `url(${this.image.thumbnailUrl})`;
 | 
								let url = `url(${
 | 
				
			||||||
 | 
									this.$store.state.device.disableShowingAnimatedImages
 | 
				
			||||||
 | 
										? getStaticImageUrl(this.image.thumbnailUrl)
 | 
				
			||||||
 | 
										: this.image.thumbnailUrl
 | 
				
			||||||
 | 
								})`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (this.$store.state.device.loadRemoteMedia || this.$store.state.device.lightmode) {
 | 
								if (this.$store.state.device.loadRemoteMedia || this.$store.state.device.lightmode) {
 | 
				
			||||||
				url = null;
 | 
									url = null;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -34,7 +34,7 @@
 | 
				
			|||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import Vue from 'vue';
 | 
					import Vue from 'vue';
 | 
				
			||||||
import i18n from '../../../i18n';
 | 
					import i18n from '../../../i18n';
 | 
				
			||||||
import parse from '../../../../../mfm/parse';
 | 
					import { parse } from '../../../../../mfm/parse';
 | 
				
			||||||
import { unique } from '../../../../../prelude/array';
 | 
					import { unique } from '../../../../../prelude/array';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default Vue.extend({
 | 
					export default Vue.extend({
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -420,7 +420,7 @@ export default Vue.extend({
 | 
				
			|||||||
		margin 0
 | 
							margin 0
 | 
				
			||||||
		padding 16px
 | 
							padding 16px
 | 
				
			||||||
		text-align center
 | 
							text-align center
 | 
				
			||||||
		color #aaa
 | 
							color var(--text)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		> [data-icon]
 | 
							> [data-icon]
 | 
				
			||||||
			margin-right 4px
 | 
								margin-right 4px
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
import Vue, { VNode } from 'vue';
 | 
					import Vue, { VNode } from 'vue';
 | 
				
			||||||
import { length } from 'stringz';
 | 
					import { length } from 'stringz';
 | 
				
			||||||
import { MfmForest } from '../../../../../mfm/parser';
 | 
					import { MfmForest } from '../../../../../mfm/types';
 | 
				
			||||||
import parse from '../../../../../mfm/parse';
 | 
					import { parse, parsePlain } from '../../../../../mfm/parse';
 | 
				
			||||||
import MkUrl from './url.vue';
 | 
					import MkUrl from './url.vue';
 | 
				
			||||||
import MkMention from './mention.vue';
 | 
					import MkMention from './mention.vue';
 | 
				
			||||||
import { concat, sum } from '../../../../../prelude/array';
 | 
					import { concat, sum } from '../../../../../prelude/array';
 | 
				
			||||||
@@ -46,7 +46,7 @@ export default Vue.component('misskey-flavored-markdown', {
 | 
				
			|||||||
	render(createElement) {
 | 
						render(createElement) {
 | 
				
			||||||
		if (this.text == null || this.text == '') return;
 | 
							if (this.text == null || this.text == '') return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		const ast = parse(this.text, this.plainText);
 | 
							const ast = (this.plainText ? parsePlain : parse)(this.text);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		let bigCount = 0;
 | 
							let bigCount = 0;
 | 
				
			||||||
		let motionCount = 0;
 | 
							let motionCount = 0;
 | 
				
			||||||
@@ -84,7 +84,7 @@ export default Vue.component('misskey-flavored-markdown', {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
				case 'big': {
 | 
									case 'big': {
 | 
				
			||||||
					bigCount++;
 | 
										bigCount++;
 | 
				
			||||||
					const isLong = sumTextsLength(token.children) > 10 || countNodesF(token.children) > 5;
 | 
										const isLong = sumTextsLength(token.children) > 15 || countNodesF(token.children) > 5;
 | 
				
			||||||
					const isMany = bigCount > 3;
 | 
										const isMany = bigCount > 3;
 | 
				
			||||||
					return (createElement as any)('strong', {
 | 
										return (createElement as any)('strong', {
 | 
				
			||||||
						attrs: {
 | 
											attrs: {
 | 
				
			||||||
@@ -98,7 +98,11 @@ export default Vue.component('misskey-flavored-markdown', {
 | 
				
			|||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				case 'small': {
 | 
									case 'small': {
 | 
				
			||||||
					return [createElement('small', genEl(token.children))];
 | 
										return [createElement('small', {
 | 
				
			||||||
 | 
											attrs: {
 | 
				
			||||||
 | 
												style: 'opacity: 0.7;'
 | 
				
			||||||
 | 
											},
 | 
				
			||||||
 | 
										}, genEl(token.children))];
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				case 'center': {
 | 
									case 'center': {
 | 
				
			||||||
@@ -111,8 +115,8 @@ export default Vue.component('misskey-flavored-markdown', {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
				case 'motion': {
 | 
									case 'motion': {
 | 
				
			||||||
					motionCount++;
 | 
										motionCount++;
 | 
				
			||||||
					const isLong = sumTextsLength(token.children) > 10 || countNodesF(token.children) > 5;
 | 
										const isLong = sumTextsLength(token.children) > 15 || countNodesF(token.children) > 5;
 | 
				
			||||||
					const isMany = motionCount > 3;
 | 
										const isMany = motionCount > 5;
 | 
				
			||||||
					return (createElement as any)('span', {
 | 
										return (createElement as any)('span', {
 | 
				
			||||||
						attrs: {
 | 
											attrs: {
 | 
				
			||||||
							style: 'display: inline-block;'
 | 
												style: 'display: inline-block;'
 | 
				
			||||||
@@ -126,11 +130,29 @@ export default Vue.component('misskey-flavored-markdown', {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
				case 'spin': {
 | 
									case 'spin': {
 | 
				
			||||||
					motionCount++;
 | 
										motionCount++;
 | 
				
			||||||
					const isLong = sumTextsLength(token.children) > 5 || countNodesF(token.children) > 3;
 | 
										const isLong = sumTextsLength(token.children) > 10 || countNodesF(token.children) > 5;
 | 
				
			||||||
					const isMany = motionCount > 3;
 | 
										const isMany = motionCount > 5;
 | 
				
			||||||
 | 
										const direction =
 | 
				
			||||||
 | 
											token.node.props.attr == 'left' ? 'reverse' :
 | 
				
			||||||
 | 
											token.node.props.attr == 'alternate' ? 'alternate' :
 | 
				
			||||||
 | 
											'normal';
 | 
				
			||||||
 | 
										const style = (this.$store.state.settings.disableAnimatedMfm || isLong || isMany)
 | 
				
			||||||
 | 
											? ''
 | 
				
			||||||
 | 
											: `animation: spin 1.5s linear infinite; animation-direction: ${direction};`;
 | 
				
			||||||
					return (createElement as any)('span', {
 | 
										return (createElement as any)('span', {
 | 
				
			||||||
						attrs: {
 | 
											attrs: {
 | 
				
			||||||
							style: (this.$store.state.settings.disableAnimatedMfm || isLong || isMany) ? 'display: inline-block;' : 'display: inline-block; animation: spin 1.5s linear infinite;'
 | 
												style: 'display: inline-block;' + style
 | 
				
			||||||
 | 
											},
 | 
				
			||||||
 | 
										}, genEl(token.children));
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									case 'jump': {
 | 
				
			||||||
 | 
										motionCount++;
 | 
				
			||||||
 | 
										const isLong = sumTextsLength(token.children) > 30 || countNodesF(token.children) > 5;
 | 
				
			||||||
 | 
										const isMany = motionCount > 5;
 | 
				
			||||||
 | 
										return (createElement as any)('span', {
 | 
				
			||||||
 | 
											attrs: {
 | 
				
			||||||
 | 
												style: (this.$store.state.settings.disableAnimatedMfm || isLong || isMany) ? 'display: inline-block;' : 'display: inline-block; animation: jump 0.75s linear infinite;'
 | 
				
			||||||
						},
 | 
											},
 | 
				
			||||||
					}, genEl(token.children));
 | 
										}, genEl(token.children));
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -30,4 +30,7 @@ export default Vue.extend({
 | 
				
			|||||||
		color var(--mfmQuote)
 | 
							color var(--mfmQuote)
 | 
				
			||||||
		border-left solid 3px var(--mfmQuoteLine)
 | 
							border-left solid 3px var(--mfmQuoteLine)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						>>> pre code
 | 
				
			||||||
 | 
							font-size 80%
 | 
				
			||||||
 | 
					
 | 
				
			||||||
</style>
 | 
					</style>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,73 +10,91 @@ import i18n from '../../../i18n';
 | 
				
			|||||||
import { url } from '../../../config';
 | 
					import { url } from '../../../config';
 | 
				
			||||||
import copyToClipboard from '../../../common/scripts/copy-to-clipboard';
 | 
					import copyToClipboard from '../../../common/scripts/copy-to-clipboard';
 | 
				
			||||||
import { concat, intersperse } from '../../../../../prelude/array';
 | 
					import { concat, intersperse } from '../../../../../prelude/array';
 | 
				
			||||||
import { faCopy } from '@fortawesome/free-regular-svg-icons';
 | 
					import { faCopy, faEye, faEyeSlash } from '@fortawesome/free-regular-svg-icons';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default Vue.extend({
 | 
					export default Vue.extend({
 | 
				
			||||||
	i18n: i18n('common/views/components/note-menu.vue'),
 | 
						i18n: i18n('common/views/components/note-menu.vue'),
 | 
				
			||||||
	props: ['note', 'source'],
 | 
						props: ['note', 'source'],
 | 
				
			||||||
 | 
						data() {
 | 
				
			||||||
 | 
							return {
 | 
				
			||||||
 | 
								isFavorited: false,
 | 
				
			||||||
 | 
								isWatching: false
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
	computed: {
 | 
						computed: {
 | 
				
			||||||
		items(): any[] {
 | 
							items(): any[] {
 | 
				
			||||||
			return concat(intersperse([null], [
 | 
								return [{
 | 
				
			||||||
				[
 | 
									icon: 'at',
 | 
				
			||||||
					[{
 | 
									text: this.$t('mention'),
 | 
				
			||||||
						icon: 'at',
 | 
									action: this.mention
 | 
				
			||||||
						text: this.$t('mention'),
 | 
								}, null, {
 | 
				
			||||||
						action: this.mention
 | 
									icon: 'info-circle',
 | 
				
			||||||
					}]
 | 
									text: this.$t('detail'),
 | 
				
			||||||
				],
 | 
									action: this.detail
 | 
				
			||||||
				[
 | 
								}, {
 | 
				
			||||||
					[{
 | 
									icon: faCopy,
 | 
				
			||||||
						icon: 'info-circle',
 | 
									text: this.$t('copy-content'),
 | 
				
			||||||
						text: this.$t('detail'),
 | 
									action: this.copyContent
 | 
				
			||||||
						action: this.detail
 | 
								}, {
 | 
				
			||||||
					}], [{
 | 
									icon: 'link',
 | 
				
			||||||
						icon: faCopy,
 | 
									text: this.$t('copy-link'),
 | 
				
			||||||
						text: this.$t('copy-content'),
 | 
									action: this.copyLink
 | 
				
			||||||
						action: this.copyContent
 | 
								}, this.note.uri ? {
 | 
				
			||||||
					}], [{
 | 
									icon: 'external-link-square-alt',
 | 
				
			||||||
						icon: 'link',
 | 
									text: this.$t('remote'),
 | 
				
			||||||
						text: this.$t('copy-link'),
 | 
									action: () => {
 | 
				
			||||||
						action: this.copyLink
 | 
										window.open(this.note.uri, '_blank');
 | 
				
			||||||
					}], this.note.uri ? [{
 | 
									}
 | 
				
			||||||
						icon: 'external-link-square-alt',
 | 
								} : undefined,
 | 
				
			||||||
						text: this.$t('remote'),
 | 
								null,
 | 
				
			||||||
						action: () => {
 | 
								this.isFavorited ? {
 | 
				
			||||||
							window.open(this.note.uri, '_blank');
 | 
									icon: 'star',
 | 
				
			||||||
						}
 | 
									text: this.$t('unfavorite'),
 | 
				
			||||||
					}] : []
 | 
									action: () => this.toggleFavorite(false)
 | 
				
			||||||
				],
 | 
								} : {
 | 
				
			||||||
				[
 | 
									icon: 'star',
 | 
				
			||||||
					this.note.isFavorited ? [{
 | 
									text: this.$t('favorite'),
 | 
				
			||||||
						icon: 'star',
 | 
									action: () => this.toggleFavorite(true)
 | 
				
			||||||
						text: this.$t('unfavorite'),
 | 
								},
 | 
				
			||||||
						action: this.unfavorite
 | 
								this.note.userId != this.$store.state.i.id ? this.isWatching ? {
 | 
				
			||||||
					}] : [{
 | 
									icon: faEyeSlash,
 | 
				
			||||||
						icon: 'star',
 | 
									text: this.$t('unwatch'),
 | 
				
			||||||
						text: this.$t('favorite'),
 | 
									action: () => this.toggleWatch(false)
 | 
				
			||||||
						action: this.favorite
 | 
								} : {
 | 
				
			||||||
					}], this.note.userId == this.$store.state.i.id ? [
 | 
									icon: faEye,
 | 
				
			||||||
						(this.$store.state.i.pinnedNoteIds || []).includes(this.note.id) ? {
 | 
									text: this.$t('watch'),
 | 
				
			||||||
							icon: 'thumbtack',
 | 
									action: () => this.toggleWatch(true)
 | 
				
			||||||
							text: this.$t('unpin'),
 | 
								} : undefined,
 | 
				
			||||||
							action: this.unpin
 | 
								this.note.userId == this.$store.state.i.id ? (this.$store.state.i.pinnedNoteIds || []).includes(this.note.id) ? {
 | 
				
			||||||
						} : {
 | 
									icon: 'thumbtack',
 | 
				
			||||||
								icon: 'thumbtack',
 | 
									text: this.$t('unpin'),
 | 
				
			||||||
								text: this.$t('pin'),
 | 
									action: () => this.togglePin(false)
 | 
				
			||||||
								action: this.pin
 | 
								} : {
 | 
				
			||||||
							}
 | 
									icon: 'thumbtack',
 | 
				
			||||||
					] : []
 | 
									text: this.$t('pin'),
 | 
				
			||||||
				], [
 | 
									action: () => this.togglePin(true)
 | 
				
			||||||
					this.note.userId == this.$store.state.i.id || this.$store.state.i.isAdmin || this.$store.state.i.isModerator ? [{
 | 
								} : undefined,
 | 
				
			||||||
						icon: ['far', 'trash-alt'],
 | 
								...(this.note.userId == this.$store.state.i.id || this.$store.state.i.isAdmin || this.$store.state.i.isModerator ? [
 | 
				
			||||||
						text: this.$t('delete'),
 | 
									null, {
 | 
				
			||||||
						action: this.del
 | 
										icon: ['far', 'trash-alt'],
 | 
				
			||||||
					}] : []
 | 
										text: this.$t('delete'),
 | 
				
			||||||
				]
 | 
										action: this.del
 | 
				
			||||||
			].map(concat).filter(x => x.length > 0)));
 | 
									}]
 | 
				
			||||||
 | 
									: []
 | 
				
			||||||
 | 
								)]
 | 
				
			||||||
 | 
								.filter(x => x !== undefined)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						created() {
 | 
				
			||||||
 | 
							this.$root.api('notes/state', {
 | 
				
			||||||
 | 
								noteId: this.note.id
 | 
				
			||||||
 | 
							}).then(state => {
 | 
				
			||||||
 | 
								this.isFavorited = state.isFavorited;
 | 
				
			||||||
 | 
								this.isWatching = state.isWatching;
 | 
				
			||||||
 | 
							});
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	methods: {
 | 
						methods: {
 | 
				
			||||||
		mention() {
 | 
							mention() {
 | 
				
			||||||
			this.$post({ mention: this.note.user });
 | 
								this.$post({ mention: this.note.user });
 | 
				
			||||||
@@ -102,8 +120,8 @@ export default Vue.extend({
 | 
				
			|||||||
			});
 | 
								});
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		pin() {
 | 
							togglePin(pin: boolean) {
 | 
				
			||||||
			this.$root.api('i/pin', {
 | 
								this.$root.api(pin ? 'i/pin' : 'i/unpin', {
 | 
				
			||||||
				noteId: this.note.id
 | 
									noteId: this.note.id
 | 
				
			||||||
			}).then(() => {
 | 
								}).then(() => {
 | 
				
			||||||
				this.$root.dialog({
 | 
									this.$root.dialog({
 | 
				
			||||||
@@ -114,14 +132,6 @@ export default Vue.extend({
 | 
				
			|||||||
			});
 | 
								});
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		unpin() {
 | 
					 | 
				
			||||||
			this.$root.api('i/unpin', {
 | 
					 | 
				
			||||||
				noteId: this.note.id
 | 
					 | 
				
			||||||
			}).then(() => {
 | 
					 | 
				
			||||||
				this.destroyDom();
 | 
					 | 
				
			||||||
			});
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		del() {
 | 
							del() {
 | 
				
			||||||
			this.$root.dialog({
 | 
								this.$root.dialog({
 | 
				
			||||||
				type: 'warning',
 | 
									type: 'warning',
 | 
				
			||||||
@@ -138,8 +148,8 @@ export default Vue.extend({
 | 
				
			|||||||
			});
 | 
								});
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		favorite() {
 | 
							toggleFavorite(favorite: boolean) {
 | 
				
			||||||
			this.$root.api('notes/favorites/create', {
 | 
								this.$root.api(favorite ? 'notes/favorites/create' : 'notes/favorites/delete', {
 | 
				
			||||||
				noteId: this.note.id
 | 
									noteId: this.note.id
 | 
				
			||||||
			}).then(() => {
 | 
								}).then(() => {
 | 
				
			||||||
				this.$root.dialog({
 | 
									this.$root.dialog({
 | 
				
			||||||
@@ -150,8 +160,8 @@ export default Vue.extend({
 | 
				
			|||||||
			});
 | 
								});
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		unfavorite() {
 | 
							toggleWatch(watch: boolean) {
 | 
				
			||||||
			this.$root.api('notes/favorites/delete', {
 | 
								this.$root.api(watch ? 'notes/watching/create' : 'notes/watching/delete', {
 | 
				
			||||||
				noteId: this.note.id
 | 
									noteId: this.note.id
 | 
				
			||||||
			}).then(() => {
 | 
								}).then(() => {
 | 
				
			||||||
				this.$root.dialog({
 | 
									this.$root.dialog({
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -30,6 +30,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			<ui-textarea v-model="description" :max="500">
 | 
								<ui-textarea v-model="description" :max="500">
 | 
				
			||||||
				<span>{{ $t('description') }}</span>
 | 
									<span>{{ $t('description') }}</span>
 | 
				
			||||||
 | 
									<span slot="desc">{{ $t('you-can-include-hashtags') }}</span>
 | 
				
			||||||
			</ui-textarea>
 | 
								</ui-textarea>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			<ui-select v-model="lang">
 | 
								<ui-select v-model="lang">
 | 
				
			||||||
@@ -86,6 +87,20 @@
 | 
				
			|||||||
			<ui-button @click="updateEmail()">{{ $t('save') }}</ui-button>
 | 
								<ui-button @click="updateEmail()">{{ $t('save') }}</ui-button>
 | 
				
			||||||
		</div>
 | 
							</div>
 | 
				
			||||||
	</section>
 | 
						</section>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						<section>
 | 
				
			||||||
 | 
							<header>{{ $t('export') }}</header>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							<div>
 | 
				
			||||||
 | 
								<ui-select v-model="exportTarget">
 | 
				
			||||||
 | 
									<option value="notes">{{ $t('export-targets.all-notes') }}</option>
 | 
				
			||||||
 | 
									<option value="following">{{ $t('export-targets.following-list') }}</option>
 | 
				
			||||||
 | 
									<option value="mute">{{ $t('export-targets.mute-list') }}</option>
 | 
				
			||||||
 | 
									<option value="blocking">{{ $t('export-targets.blocking-list') }}</option>
 | 
				
			||||||
 | 
								</ui-select>
 | 
				
			||||||
 | 
								<ui-button @click="doExport()"><fa :icon="faDownload"/> {{ $t('export') }}</ui-button>
 | 
				
			||||||
 | 
							</div>
 | 
				
			||||||
 | 
						</section>
 | 
				
			||||||
</ui-card>
 | 
					</ui-card>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -96,6 +111,7 @@ import { apiUrl, host } from '../../../config';
 | 
				
			|||||||
import { toUnicode } from 'punycode';
 | 
					import { toUnicode } from 'punycode';
 | 
				
			||||||
import langmap from 'langmap';
 | 
					import langmap from 'langmap';
 | 
				
			||||||
import { unique } from '../../../../../prelude/array';
 | 
					import { unique } from '../../../../../prelude/array';
 | 
				
			||||||
 | 
					import { faDownload } from '@fortawesome/free-solid-svg-icons';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default Vue.extend({
 | 
					export default Vue.extend({
 | 
				
			||||||
	i18n: i18n('common/views/components/profile-editor.vue'),
 | 
						i18n: i18n('common/views/components/profile-editor.vue'),
 | 
				
			||||||
@@ -122,7 +138,9 @@ export default Vue.extend({
 | 
				
			|||||||
			autoAcceptFollowed: false,
 | 
								autoAcceptFollowed: false,
 | 
				
			||||||
			saving: false,
 | 
								saving: false,
 | 
				
			||||||
			avatarUploading: false,
 | 
								avatarUploading: false,
 | 
				
			||||||
			bannerUploading: false
 | 
								bannerUploading: false,
 | 
				
			||||||
 | 
								exportTarget: 'notes',
 | 
				
			||||||
 | 
								faDownload
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -251,6 +269,20 @@ export default Vue.extend({
 | 
				
			|||||||
					email: this.email == '' ? null : this.email
 | 
										email: this.email == '' ? null : this.email
 | 
				
			||||||
				});
 | 
									});
 | 
				
			||||||
			});
 | 
								});
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							doExport() {
 | 
				
			||||||
 | 
								this.$root.api(
 | 
				
			||||||
 | 
									this.exportTarget == 'notes' ? 'i/export-notes' :
 | 
				
			||||||
 | 
									this.exportTarget == 'following' ? 'i/export-following' :
 | 
				
			||||||
 | 
									this.exportTarget == 'mute' ? 'i/export-mute' :
 | 
				
			||||||
 | 
									this.exportTarget == 'blocking' ? 'i/export-blocking' :
 | 
				
			||||||
 | 
									null, {});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								this.$root.dialog({
 | 
				
			||||||
 | 
									type: 'info',
 | 
				
			||||||
 | 
									text: this.$t('export-requested')
 | 
				
			||||||
 | 
								});
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,147 @@
 | 
				
			|||||||
 | 
					<template>
 | 
				
			||||||
 | 
					<span
 | 
				
			||||||
 | 
						class="reaction"
 | 
				
			||||||
 | 
						:class="{ reacted: note.myReaction == reaction }"
 | 
				
			||||||
 | 
						@click="toggleReaction(reaction)"
 | 
				
			||||||
 | 
						v-if="count > 0"
 | 
				
			||||||
 | 
						v-particle="!isMe"
 | 
				
			||||||
 | 
					>
 | 
				
			||||||
 | 
						<mk-reaction-icon :reaction="reaction" ref="icon"/>
 | 
				
			||||||
 | 
						<span>{{ count }}</span>
 | 
				
			||||||
 | 
					</span>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script lang="ts">
 | 
				
			||||||
 | 
					import Vue from 'vue';
 | 
				
			||||||
 | 
					import Icon from './reaction-icon.vue';
 | 
				
			||||||
 | 
					import anime from 'animejs';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default Vue.extend({
 | 
				
			||||||
 | 
						props: {
 | 
				
			||||||
 | 
							reaction: {
 | 
				
			||||||
 | 
								type: String,
 | 
				
			||||||
 | 
								required: true,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							count: {
 | 
				
			||||||
 | 
								type: Number,
 | 
				
			||||||
 | 
								required: true,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							note: {
 | 
				
			||||||
 | 
								type: Object,
 | 
				
			||||||
 | 
								required: true,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							canToggle: {
 | 
				
			||||||
 | 
								type: Boolean,
 | 
				
			||||||
 | 
								required: false,
 | 
				
			||||||
 | 
								default: true,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						computed: {
 | 
				
			||||||
 | 
							isMe(): boolean {
 | 
				
			||||||
 | 
								return this.$store.getters.isSignedIn && this.$store.state.i.id === this.note.userId;
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						watch: {
 | 
				
			||||||
 | 
							count() {
 | 
				
			||||||
 | 
								this.anime();
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						methods: {
 | 
				
			||||||
 | 
							toggleReaction() {
 | 
				
			||||||
 | 
								if (this.isMe) return;
 | 
				
			||||||
 | 
								if (!this.canToggle) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								const oldReaction = this.note.myReaction;
 | 
				
			||||||
 | 
								if (oldReaction) {
 | 
				
			||||||
 | 
									this.$root.api('notes/reactions/delete', {
 | 
				
			||||||
 | 
										noteId: this.note.id
 | 
				
			||||||
 | 
									}).then(() => {
 | 
				
			||||||
 | 
										if (oldReaction !== this.reaction) {
 | 
				
			||||||
 | 
											this.$root.api('notes/reactions/create', {
 | 
				
			||||||
 | 
												noteId: this.note.id,
 | 
				
			||||||
 | 
												reaction: this.reaction
 | 
				
			||||||
 | 
											});
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									});
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									this.$root.api('notes/reactions/create', {
 | 
				
			||||||
 | 
										noteId: this.note.id,
 | 
				
			||||||
 | 
										reaction: this.reaction
 | 
				
			||||||
 | 
									});
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							anime() {
 | 
				
			||||||
 | 
								if (this.$store.state.device.reduceMotion) return;
 | 
				
			||||||
 | 
								if (document.hidden) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								this.$nextTick(() => {
 | 
				
			||||||
 | 
									const rect = this.$refs.icon.$el.getBoundingClientRect();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									const x = rect.left;
 | 
				
			||||||
 | 
									const y = rect.top;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									const icon = new Icon({
 | 
				
			||||||
 | 
										parent: this,
 | 
				
			||||||
 | 
										propsData: {
 | 
				
			||||||
 | 
											reaction: this.reaction
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}).$mount();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									icon.$el.style.position = 'absolute';
 | 
				
			||||||
 | 
									icon.$el.style.zIndex = 100;
 | 
				
			||||||
 | 
									icon.$el.style.top = (y + window.scrollY) + 'px';
 | 
				
			||||||
 | 
									icon.$el.style.left = (x + window.scrollX) + 'px';
 | 
				
			||||||
 | 
									icon.$el.style.fontSize = window.getComputedStyle(this.$refs.icon.$el).fontSize;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									document.body.appendChild(icon.$el);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									anime({
 | 
				
			||||||
 | 
										targets: icon.$el,
 | 
				
			||||||
 | 
										opacity: [1, 0],
 | 
				
			||||||
 | 
										translateY: [0, -64],
 | 
				
			||||||
 | 
										duration: 1000,
 | 
				
			||||||
 | 
										easing: 'linear',
 | 
				
			||||||
 | 
										complete: () => {
 | 
				
			||||||
 | 
											icon.destroyDom();
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									});
 | 
				
			||||||
 | 
								});
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style lang="stylus" scoped>
 | 
				
			||||||
 | 
					.reaction
 | 
				
			||||||
 | 
						display inline-block
 | 
				
			||||||
 | 
						height 32px
 | 
				
			||||||
 | 
						margin 2px
 | 
				
			||||||
 | 
						padding 0 6px
 | 
				
			||||||
 | 
						border-radius 4px
 | 
				
			||||||
 | 
						cursor pointer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						*
 | 
				
			||||||
 | 
							user-select none
 | 
				
			||||||
 | 
							pointer-events none
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						&.reacted
 | 
				
			||||||
 | 
							background var(--primary)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							> span
 | 
				
			||||||
 | 
								color var(--primaryForeground)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						&:not(.reacted)
 | 
				
			||||||
 | 
							background var(--reactionViewerButtonBg)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							&:hover
 | 
				
			||||||
 | 
								background var(--reactionViewerButtonHoverBg)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						> .mk-reaction-icon
 | 
				
			||||||
 | 
							font-size 1.4em
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						> span
 | 
				
			||||||
 | 
							font-size 1.1em
 | 
				
			||||||
 | 
							line-height 32px
 | 
				
			||||||
 | 
							vertical-align middle
 | 
				
			||||||
 | 
							color var(--text)
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
@@ -1,139 +1,37 @@
 | 
				
			|||||||
<template>
 | 
					<template>
 | 
				
			||||||
<div class="mk-reactions-viewer" :class="{ isMe }">
 | 
					<div class="mk-reactions-viewer" :class="{ isMe }">
 | 
				
			||||||
	<template v-if="reactions">
 | 
						<x-reaction v-for="(count, reaction) in reactions" :reaction="reaction" :count="count" :note="note" :key="reaction"/>
 | 
				
			||||||
		<span :class="{ reacted: note.myReaction == 'like' }" @click="toggleReaction('like')" v-if="reactions.like" v-particle="!isMe"><mk-reaction-icon reaction="like" ref="like"/><span>{{ reactions.like }}</span></span>
 | 
					 | 
				
			||||||
		<span :class="{ reacted: note.myReaction == 'love' }" @click="toggleReaction('love')" v-if="reactions.love" v-particle="!isMe"><mk-reaction-icon reaction="love" ref="love"/><span>{{ reactions.love }}</span></span>
 | 
					 | 
				
			||||||
		<span :class="{ reacted: note.myReaction == 'laugh' }" @click="toggleReaction('laugh')" v-if="reactions.laugh" v-particle="!isMe"><mk-reaction-icon reaction="laugh" ref="laugh"/><span>{{ reactions.laugh }}</span></span>
 | 
					 | 
				
			||||||
		<span :class="{ reacted: note.myReaction == 'hmm' }" @click="toggleReaction('hmm')" v-if="reactions.hmm" v-particle="!isMe"><mk-reaction-icon reaction="hmm" ref="hmm"/><span>{{ reactions.hmm }}</span></span>
 | 
					 | 
				
			||||||
		<span :class="{ reacted: note.myReaction == 'surprise' }" @click="toggleReaction('surprise')" v-if="reactions.surprise" v-particle="!isMe"><mk-reaction-icon reaction="surprise" ref="surprise"/><span>{{ reactions.surprise }}</span></span>
 | 
					 | 
				
			||||||
		<span :class="{ reacted: note.myReaction == 'congrats' }" @click="toggleReaction('congrats')" v-if="reactions.congrats" v-particle="!isMe"><mk-reaction-icon reaction="congrats" ref="congrats"/><span>{{ reactions.congrats }}</span></span>
 | 
					 | 
				
			||||||
		<span :class="{ reacted: note.myReaction == 'angry' }" @click="toggleReaction('angry')" v-if="reactions.angry" v-particle="!isMe"><mk-reaction-icon reaction="angry" ref="angry"/><span>{{ reactions.angry }}</span></span>
 | 
					 | 
				
			||||||
		<span :class="{ reacted: note.myReaction == 'confused' }" @click="toggleReaction('confused')" v-if="reactions.confused" v-particle="!isMe"><mk-reaction-icon reaction="confused" ref="confused"/><span>{{ reactions.confused }}</span></span>
 | 
					 | 
				
			||||||
		<span :class="{ reacted: note.myReaction == 'rip' }" @click="toggleReaction('rip')" v-if="reactions.rip" v-particle="!isMe"><mk-reaction-icon reaction="rip" ref="rip"/><span>{{ reactions.rip }}</span></span>
 | 
					 | 
				
			||||||
		<span :class="{ reacted: note.myReaction == 'pudding' }" @click="toggleReaction('pudding')" v-if="reactions.pudding" v-particle="!isMe"><mk-reaction-icon reaction="pudding" ref="pudding"/><span>{{ reactions.pudding }}</span></span>
 | 
					 | 
				
			||||||
	</template>
 | 
					 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import Vue from 'vue';
 | 
					import Vue from 'vue';
 | 
				
			||||||
import Icon from './reaction-icon.vue';
 | 
					import XReaction from './reactions-viewer.reaction.vue';
 | 
				
			||||||
import anime from 'animejs';
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default Vue.extend({
 | 
					export default Vue.extend({
 | 
				
			||||||
 | 
						components: {
 | 
				
			||||||
 | 
							XReaction
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
	props: {
 | 
						props: {
 | 
				
			||||||
		note: {
 | 
							note: {
 | 
				
			||||||
			type: Object,
 | 
								type: Object,
 | 
				
			||||||
			required: true
 | 
								required: true
 | 
				
			||||||
		}
 | 
							},
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	computed: {
 | 
						computed: {
 | 
				
			||||||
		reactions(): any {
 | 
							reactions(): any {
 | 
				
			||||||
			return this.note.reactionCounts;
 | 
								return this.note.reactionCounts;
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		isMe(): boolean {
 | 
							isMe(): boolean {
 | 
				
			||||||
			return this.$store.getters.isSignedIn && (this.$store.state.i.id === this.note.userId);
 | 
								return this.$store.getters.isSignedIn && this.$store.state.i.id === this.note.userId;
 | 
				
			||||||
		}
 | 
							},
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	watch: {
 | 
					 | 
				
			||||||
		'reactions.like'() {
 | 
					 | 
				
			||||||
			this.anime('like');
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		'reactions.love'() {
 | 
					 | 
				
			||||||
			this.anime('love');
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		'reactions.laugh'() {
 | 
					 | 
				
			||||||
			this.anime('laugh');
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		'reactions.hmm'() {
 | 
					 | 
				
			||||||
			this.anime('hmm');
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		'reactions.surprise'() {
 | 
					 | 
				
			||||||
			this.anime('surprise');
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		'reactions.congrats'() {
 | 
					 | 
				
			||||||
			this.anime('congrats');
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		'reactions.angry'() {
 | 
					 | 
				
			||||||
			this.anime('angry');
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		'reactions.confused'() {
 | 
					 | 
				
			||||||
			this.anime('confused');
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		'reactions.rip'() {
 | 
					 | 
				
			||||||
			this.anime('rip');
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		'reactions.pudding'() {
 | 
					 | 
				
			||||||
			this.anime('pudding');
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
	methods: {
 | 
					 | 
				
			||||||
		toggleReaction(reaction: string) {
 | 
					 | 
				
			||||||
			if (this.isMe) return;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			const oldReaction = this.note.myReaction;
 | 
					 | 
				
			||||||
			if (oldReaction) {
 | 
					 | 
				
			||||||
				this.$root.api('notes/reactions/delete', {
 | 
					 | 
				
			||||||
					noteId: this.note.id
 | 
					 | 
				
			||||||
				}).then(() => {
 | 
					 | 
				
			||||||
					if (oldReaction !== reaction) {
 | 
					 | 
				
			||||||
						this.$root.api('notes/reactions/create', {
 | 
					 | 
				
			||||||
							noteId: this.note.id,
 | 
					 | 
				
			||||||
							reaction: reaction
 | 
					 | 
				
			||||||
						});
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				});
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				this.$root.api('notes/reactions/create', {
 | 
					 | 
				
			||||||
					noteId: this.note.id,
 | 
					 | 
				
			||||||
					reaction: reaction
 | 
					 | 
				
			||||||
				});
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		anime(reaction: string) {
 | 
					 | 
				
			||||||
			if (this.$store.state.device.reduceMotion) return;
 | 
					 | 
				
			||||||
			if (document.hidden) return;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			this.$nextTick(() => {
 | 
					 | 
				
			||||||
				const rect = this.$refs[reaction].$el.getBoundingClientRect();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				const x = rect.left;
 | 
					 | 
				
			||||||
				const y = rect.top;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				const icon = new Icon({
 | 
					 | 
				
			||||||
					parent: this,
 | 
					 | 
				
			||||||
					propsData: {
 | 
					 | 
				
			||||||
						reaction: reaction
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}).$mount();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				icon.$el.style.position = 'absolute';
 | 
					 | 
				
			||||||
				icon.$el.style.zIndex = 100;
 | 
					 | 
				
			||||||
				icon.$el.style.top = (y + window.scrollY) + 'px';
 | 
					 | 
				
			||||||
				icon.$el.style.left = (x + window.scrollX) + 'px';
 | 
					 | 
				
			||||||
				icon.$el.style.fontSize = window.getComputedStyle(this.$refs[reaction].$el).fontSize;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				document.body.appendChild(icon.$el);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				anime({
 | 
					 | 
				
			||||||
					targets: icon.$el,
 | 
					 | 
				
			||||||
					opacity: [1, 0],
 | 
					 | 
				
			||||||
					translateY: [0, -64],
 | 
					 | 
				
			||||||
					duration: 1000,
 | 
					 | 
				
			||||||
					easing: 'linear',
 | 
					 | 
				
			||||||
					complete: () => {
 | 
					 | 
				
			||||||
						icon.destroyDom();
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				});
 | 
					 | 
				
			||||||
			});
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<style lang="stylus" scoped>
 | 
					<style lang="stylus" scoped>
 | 
				
			||||||
.mk-reactions-viewer
 | 
					.mk-reactions-viewer
 | 
				
			||||||
	margin 6px 0
 | 
						margin: 4px -2px
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	&:empty
 | 
						&:empty
 | 
				
			||||||
		display none
 | 
							display none
 | 
				
			||||||
@@ -144,38 +42,4 @@ export default Vue.extend({
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			&:hover
 | 
								&:hover
 | 
				
			||||||
				background var(--reactionViewerButtonBg) !important
 | 
									background var(--reactionViewerButtonBg) !important
 | 
				
			||||||
 | 
					 | 
				
			||||||
	> span
 | 
					 | 
				
			||||||
		display inline-block
 | 
					 | 
				
			||||||
		height 32px
 | 
					 | 
				
			||||||
		margin-right 6px
 | 
					 | 
				
			||||||
		padding 0 6px
 | 
					 | 
				
			||||||
		border-radius 4px
 | 
					 | 
				
			||||||
		cursor pointer
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		*
 | 
					 | 
				
			||||||
			user-select none
 | 
					 | 
				
			||||||
			pointer-events none
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		&.reacted
 | 
					 | 
				
			||||||
			background var(--primary)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			> span
 | 
					 | 
				
			||||||
				color var(--primaryForeground)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		&:not(.reacted)
 | 
					 | 
				
			||||||
			background var(--reactionViewerButtonBg)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			&:hover
 | 
					 | 
				
			||||||
				background var(--reactionViewerButtonHoverBg)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		> .mk-reaction-icon
 | 
					 | 
				
			||||||
			font-size 1.4em
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		> span
 | 
					 | 
				
			||||||
			font-size 1.1em
 | 
					 | 
				
			||||||
			line-height 32px
 | 
					 | 
				
			||||||
			vertical-align middle
 | 
					 | 
				
			||||||
			color var(--text)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
</style>
 | 
					</style>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -74,7 +74,7 @@ export default Vue.extend({
 | 
				
			|||||||
		margin 0
 | 
							margin 0
 | 
				
			||||||
		padding 16px
 | 
							padding 16px
 | 
				
			||||||
		text-align center
 | 
							text-align center
 | 
				
			||||||
		color #aaa
 | 
							color var(--text)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		> [data-icon]
 | 
							> [data-icon]
 | 
				
			||||||
			margin-right 4px
 | 
								margin-right 4px
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -184,6 +184,12 @@ export default Vue.extend({
 | 
				
			|||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		});
 | 
							});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							this.$on('keydown', (e: KeyboardEvent) => {
 | 
				
			||||||
 | 
								if (e.code == 'Enter') {
 | 
				
			||||||
 | 
									this.$emit('enter');
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							});
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	methods: {
 | 
						methods: {
 | 
				
			||||||
		focus() {
 | 
							focus() {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -119,11 +119,11 @@ export default Vue.extend({
 | 
				
			|||||||
		font-size 16px
 | 
							font-size 16px
 | 
				
			||||||
		cursor pointer
 | 
							cursor pointer
 | 
				
			||||||
		transition inherit
 | 
							transition inherit
 | 
				
			||||||
 | 
							color var(--text)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		> span
 | 
							> span
 | 
				
			||||||
			display block
 | 
								display block
 | 
				
			||||||
			line-height 20px
 | 
								line-height 20px
 | 
				
			||||||
			color var(--text)
 | 
					 | 
				
			||||||
			transition inherit
 | 
								transition inherit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		> p
 | 
							> p
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -69,6 +69,7 @@ export default Vue.extend({
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
					const data = new FormData();
 | 
										const data = new FormData();
 | 
				
			||||||
					data.append('i', this.$store.state.i.token);
 | 
										data.append('i', this.$store.state.i.token);
 | 
				
			||||||
 | 
										data.append('force', 'true');
 | 
				
			||||||
					data.append('file', file);
 | 
										data.append('file', file);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					if (folder) data.append('folderId', folder);
 | 
										if (folder) data.append('folderId', folder);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,7 +9,7 @@
 | 
				
			|||||||
</div>
 | 
					</div>
 | 
				
			||||||
<div v-else class="mk-url-preview">
 | 
					<div v-else class="mk-url-preview">
 | 
				
			||||||
	<a :class="{ mini, compact }" :href="url" target="_blank" :title="url" v-if="!fetching">
 | 
						<a :class="{ mini, compact }" :href="url" target="_blank" :title="url" v-if="!fetching">
 | 
				
			||||||
		<div class="thumbnail" v-if="thumbnail" :style="`background-image: url(${thumbnail})`"></div>
 | 
							<div class="thumbnail" v-if="thumbnail" :style="`background-image: url('${thumbnail}')`"></div>
 | 
				
			||||||
		<article>
 | 
							<article>
 | 
				
			||||||
			<header>
 | 
								<header>
 | 
				
			||||||
				<h1 :title="title">{{ title }}</h1>
 | 
									<h1 :title="title">{{ title }}</h1>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,7 +8,8 @@
 | 
				
			|||||||
import Vue from 'vue';
 | 
					import Vue from 'vue';
 | 
				
			||||||
import i18n from '../../../i18n';
 | 
					import i18n from '../../../i18n';
 | 
				
			||||||
import copyToClipboard from '../../../common/scripts/copy-to-clipboard';
 | 
					import copyToClipboard from '../../../common/scripts/copy-to-clipboard';
 | 
				
			||||||
import { faExclamationCircle } from '@fortawesome/free-solid-svg-icons';
 | 
					import { faExclamationCircle, faMicrophoneSlash } from '@fortawesome/free-solid-svg-icons';
 | 
				
			||||||
 | 
					import { faSnowflake } from '@fortawesome/free-regular-svg-icons';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default Vue.extend({
 | 
					export default Vue.extend({
 | 
				
			||||||
	i18n: i18n('common/views/components/user-menu.vue'),
 | 
						i18n: i18n('common/views/components/user-menu.vue'),
 | 
				
			||||||
@@ -40,6 +41,18 @@ export default Vue.extend({
 | 
				
			|||||||
			action: this.reportAbuse
 | 
								action: this.reportAbuse
 | 
				
			||||||
		}];
 | 
							}];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (this.$store.getters.isSignedIn && (this.$store.state.i.isAdmin || this.$store.state.i.isModerator)) {
 | 
				
			||||||
 | 
								menu = menu.concat([null, {
 | 
				
			||||||
 | 
									icon: faMicrophoneSlash,
 | 
				
			||||||
 | 
									text: this.user.isSilenced ? this.$t('unsilence') : this.$t('silence'),
 | 
				
			||||||
 | 
									action: this.toggleSilence
 | 
				
			||||||
 | 
								}, {
 | 
				
			||||||
 | 
									icon: faSnowflake,
 | 
				
			||||||
 | 
									text: this.user.isSuspended ? this.$t('unsuspend') : this.$t('suspend'),
 | 
				
			||||||
 | 
									action: this.toggleSuspend
 | 
				
			||||||
 | 
								}]);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return {
 | 
							return {
 | 
				
			||||||
			items: menu
 | 
								items: menu
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
@@ -148,6 +161,40 @@ export default Vue.extend({
 | 
				
			|||||||
					text: e
 | 
										text: e
 | 
				
			||||||
				});
 | 
									});
 | 
				
			||||||
			});
 | 
								});
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							toggleSilence() {
 | 
				
			||||||
 | 
								this.$root.api(this.user.isSilenced ? 'admin/unsilence-user' : 'admin/silence-user', {
 | 
				
			||||||
 | 
									userId: this.user.id
 | 
				
			||||||
 | 
								}).then(() => {
 | 
				
			||||||
 | 
									this.user.isSilenced = !this.user.isSilenced;
 | 
				
			||||||
 | 
									this.$root.dialog({
 | 
				
			||||||
 | 
										type: 'success',
 | 
				
			||||||
 | 
										splash: true
 | 
				
			||||||
 | 
									});
 | 
				
			||||||
 | 
								}, e => {
 | 
				
			||||||
 | 
									this.$root.dialog({
 | 
				
			||||||
 | 
										type: 'error',
 | 
				
			||||||
 | 
										text: e
 | 
				
			||||||
 | 
									});
 | 
				
			||||||
 | 
								});
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							toggleSuspend() {
 | 
				
			||||||
 | 
								this.$root.api(this.user.isSuspended ? 'admin/unsuspend-user' : 'admin/suspend-user', {
 | 
				
			||||||
 | 
									userId: this.user.id
 | 
				
			||||||
 | 
								}).then(() => {
 | 
				
			||||||
 | 
									this.user.isSuspended = !this.user.isSuspended;
 | 
				
			||||||
 | 
									this.$root.dialog({
 | 
				
			||||||
 | 
										type: 'success',
 | 
				
			||||||
 | 
										splash: true
 | 
				
			||||||
 | 
									});
 | 
				
			||||||
 | 
								}, e => {
 | 
				
			||||||
 | 
									this.$root.dialog({
 | 
				
			||||||
 | 
										type: 'error',
 | 
				
			||||||
 | 
										text: e
 | 
				
			||||||
 | 
									});
 | 
				
			||||||
 | 
								});
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,9 +5,9 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		<p :class="$style.fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
 | 
							<p :class="$style.fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
 | 
				
			||||||
		<div :class="$style.stream" v-if="!fetching && images.length > 0">
 | 
							<div :class="$style.stream" v-if="!fetching && images.length > 0">
 | 
				
			||||||
			<div v-for="image in images"
 | 
								<div v-for="(image, i) in images" :key="i"
 | 
				
			||||||
				:class="$style.img"
 | 
									:class="$style.img"
 | 
				
			||||||
				:style="`background-image: url(${image.thumbnailUrl || image.url})`"
 | 
									:style="`background-image: url(${thumbnail(image)})`"
 | 
				
			||||||
				draggable="true"
 | 
									draggable="true"
 | 
				
			||||||
				@dragstart="onDragstart(image, $event)"
 | 
									@dragstart="onDragstart(image, $event)"
 | 
				
			||||||
			></div>
 | 
								></div>
 | 
				
			||||||
@@ -20,6 +20,7 @@
 | 
				
			|||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import define from '../../../common/define-widget';
 | 
					import define from '../../../common/define-widget';
 | 
				
			||||||
import i18n from '../../../i18n';
 | 
					import i18n from '../../../i18n';
 | 
				
			||||||
 | 
					import { getStaticImageUrl } from '../../scripts/get-static-image-url';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default define({
 | 
					export default define({
 | 
				
			||||||
	name: 'photo-stream',
 | 
						name: 'photo-stream',
 | 
				
			||||||
@@ -77,6 +78,12 @@ export default define({
 | 
				
			|||||||
			e.dataTransfer.effectAllowed = 'move';
 | 
								e.dataTransfer.effectAllowed = 'move';
 | 
				
			||||||
			e.dataTransfer.setData('mk_drive_file', JSON.stringify(file));
 | 
								e.dataTransfer.setData('mk_drive_file', JSON.stringify(file));
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							thumbnail(image: any): string {
 | 
				
			||||||
 | 
								return this.$store.state.device.disableShowingAnimatedImages
 | 
				
			||||||
 | 
									? getStaticImageUrl(image.thumbnailUrl)
 | 
				
			||||||
 | 
									: image.thumbnailUrl;
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
@@ -110,7 +117,7 @@ export default define({
 | 
				
			|||||||
	margin 0
 | 
						margin 0
 | 
				
			||||||
	padding 16px
 | 
						padding 16px
 | 
				
			||||||
	text-align center
 | 
						text-align center
 | 
				
			||||||
	color #aaa
 | 
						color var(--text)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	> [data-icon]
 | 
						> [data-icon]
 | 
				
			||||||
		margin-right 4px
 | 
							margin-right 4px
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -86,7 +86,7 @@ export default define({
 | 
				
			|||||||
			margin 0
 | 
								margin 0
 | 
				
			||||||
			padding 16px
 | 
								padding 16px
 | 
				
			||||||
			text-align center
 | 
								text-align center
 | 
				
			||||||
			color #aaa
 | 
								color var(--text)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			> [data-icon]
 | 
								> [data-icon]
 | 
				
			||||||
				margin-right 4px
 | 
									margin-right 4px
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -88,7 +88,7 @@ export default define({
 | 
				
			|||||||
	margin 0
 | 
						margin 0
 | 
				
			||||||
	padding 16px
 | 
						padding 16px
 | 
				
			||||||
	text-align center
 | 
						text-align center
 | 
				
			||||||
	color #aaa
 | 
						color var(--text)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	> [data-icon]
 | 
						> [data-icon]
 | 
				
			||||||
		margin-right 4px
 | 
							margin-right 4px
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,4 @@
 | 
				
			|||||||
declare const _LANGS_: string[];
 | 
					declare const _LANGS_: string[];
 | 
				
			||||||
declare const _THEME_COLOR_: string;
 | 
					 | 
				
			||||||
declare const _COPYRIGHT_: string;
 | 
					declare const _COPYRIGHT_: string;
 | 
				
			||||||
declare const _VERSION_: string;
 | 
					declare const _VERSION_: string;
 | 
				
			||||||
declare const _CLIENT_VERSION_: string;
 | 
					declare const _CLIENT_VERSION_: string;
 | 
				
			||||||
@@ -13,7 +12,7 @@ export const hostname = address.hostname;
 | 
				
			|||||||
export const url = address.origin;
 | 
					export const url = address.origin;
 | 
				
			||||||
export const apiUrl = url + '/api';
 | 
					export const apiUrl = url + '/api';
 | 
				
			||||||
export const wsUrl = url.replace('http://', 'ws://').replace('https://', 'wss://') + '/streaming';
 | 
					export const wsUrl = url.replace('http://', 'ws://').replace('https://', 'wss://') + '/streaming';
 | 
				
			||||||
export const lang = window.lang;
 | 
					export const lang = localStorage.getItem('lang') || window.lang; // windowは後方互換性のため
 | 
				
			||||||
export const langs = _LANGS_;
 | 
					export const langs = _LANGS_;
 | 
				
			||||||
export const locale = JSON.parse(localStorage.getItem('locale'));
 | 
					export const locale = JSON.parse(localStorage.getItem('locale'));
 | 
				
			||||||
export const copyright = _COPYRIGHT_;
 | 
					export const copyright = _COPYRIGHT_;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -78,7 +78,7 @@ export default Vue.extend({
 | 
				
			|||||||
	margin 0
 | 
						margin 0
 | 
				
			||||||
	padding 16px
 | 
						padding 16px
 | 
				
			||||||
	text-align center
 | 
						text-align center
 | 
				
			||||||
	color #aaa
 | 
						color var(--text)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	> [data-icon]
 | 
						> [data-icon]
 | 
				
			||||||
		margin-right 4px
 | 
							margin-right 4px
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -30,13 +30,13 @@
 | 
				
			|||||||
				<x-folder v-for="folder in folders" :key="folder.id" class="folder" :folder="folder"/>
 | 
									<x-folder v-for="folder in folders" :key="folder.id" class="folder" :folder="folder"/>
 | 
				
			||||||
				<!-- SEE: https://stackoverflow.com/questions/18744164/flex-box-align-last-row-to-grid -->
 | 
									<!-- SEE: https://stackoverflow.com/questions/18744164/flex-box-align-last-row-to-grid -->
 | 
				
			||||||
				<div class="padding" v-for="n in 16"></div>
 | 
									<div class="padding" v-for="n in 16"></div>
 | 
				
			||||||
				<button v-if="moreFolders">{{ $t('@.load-more') }}</button>
 | 
									<ui-button v-if="moreFolders">{{ $t('@.load-more') }}</ui-button>
 | 
				
			||||||
			</div>
 | 
								</div>
 | 
				
			||||||
			<div class="files" ref="filesContainer" v-if="files.length > 0">
 | 
								<div class="files" ref="filesContainer" v-if="files.length > 0">
 | 
				
			||||||
				<x-file v-for="file in files" :key="file.id" class="file" :file="file"/>
 | 
									<x-file v-for="file in files" :key="file.id" class="file" :file="file"/>
 | 
				
			||||||
				<!-- SEE: https://stackoverflow.com/questions/18744164/flex-box-align-last-row-to-grid -->
 | 
									<!-- SEE: https://stackoverflow.com/questions/18744164/flex-box-align-last-row-to-grid -->
 | 
				
			||||||
				<div class="padding" v-for="n in 16"></div>
 | 
									<div class="padding" v-for="n in 16"></div>
 | 
				
			||||||
				<button v-if="moreFiles" @click="fetchMoreFiles">{{ $t('@.load-more') }}</button>
 | 
									<ui-button v-if="moreFiles" @click="fetchMoreFiles">{{ $t('@.load-more') }}</ui-button>
 | 
				
			||||||
			</div>
 | 
								</div>
 | 
				
			||||||
			<div class="empty" v-if="files.length == 0 && folders.length == 0 && !fetching">
 | 
								<div class="empty" v-if="files.length == 0 && folders.length == 0 && !fetching">
 | 
				
			||||||
				<p v-if="draghover">{{ $t('empty-draghover') }}</p>
 | 
									<p v-if="draghover">{{ $t('empty-draghover') }}</p>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -120,13 +120,13 @@ export default Vue.extend({
 | 
				
			|||||||
		margin 0
 | 
							margin 0
 | 
				
			||||||
		padding 16px
 | 
							padding 16px
 | 
				
			||||||
		text-align center
 | 
							text-align center
 | 
				
			||||||
		color #aaa
 | 
							color var(--text)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	> .fetching
 | 
						> .fetching
 | 
				
			||||||
		margin 0
 | 
							margin 0
 | 
				
			||||||
		padding 16px
 | 
							padding 16px
 | 
				
			||||||
		text-align center
 | 
							text-align center
 | 
				
			||||||
		color #aaa
 | 
							color var(--text)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		> [data-icon]
 | 
							> [data-icon]
 | 
				
			||||||
			margin-right 4px
 | 
								margin-right 4px
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
<template>
 | 
					<template>
 | 
				
			||||||
<div class="mk-media-video-dialog">
 | 
					<div class="mk-media-video-dialog">
 | 
				
			||||||
	<div class="bg" @click="close"></div>
 | 
						<div class="bg" @click="close"></div>
 | 
				
			||||||
	<video :src="video.url" :title="video.name" controls autoplay ref="video"/>
 | 
						<video :src="video.url" :title="video.name" controls autoplay ref="video" @volumechange="volumechange"/>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -18,8 +18,9 @@ export default Vue.extend({
 | 
				
			|||||||
			duration: 100,
 | 
								duration: 100,
 | 
				
			||||||
			easing: 'linear'
 | 
								easing: 'linear'
 | 
				
			||||||
		});
 | 
							});
 | 
				
			||||||
		const videoTag = this.$refs.video as HTMLVideoElement
 | 
							const videoTag = this.$refs.video as HTMLVideoElement;
 | 
				
			||||||
		if (this.start) videoTag.currentTime = this.start
 | 
							if (this.start) videoTag.currentTime = this.start
 | 
				
			||||||
 | 
							videoTag.volume = this.$store.state.device.mediaVolume;
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	methods: {
 | 
						methods: {
 | 
				
			||||||
		close() {
 | 
							close() {
 | 
				
			||||||
@@ -30,7 +31,11 @@ export default Vue.extend({
 | 
				
			|||||||
				easing: 'linear',
 | 
									easing: 'linear',
 | 
				
			||||||
				complete: () => this.destroyDom()
 | 
									complete: () => this.destroyDom()
 | 
				
			||||||
			});
 | 
								});
 | 
				
			||||||
		}
 | 
							},
 | 
				
			||||||
 | 
							volumechange() {
 | 
				
			||||||
 | 
								const videoTag = this.$refs.video as HTMLVideoElement;
 | 
				
			||||||
 | 
								this.$store.commit('device/set', { key: 'mediaVolume', value: videoTag.volume });
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -41,7 +41,7 @@ export default Vue.extend({
 | 
				
			|||||||
	computed: {
 | 
						computed: {
 | 
				
			||||||
		imageStyle(): any {
 | 
							imageStyle(): any {
 | 
				
			||||||
			return {
 | 
								return {
 | 
				
			||||||
				'background-image': null // TODO `url(${this.video.thumbnailUrl})`
 | 
									'background-image': `url(${this.video.thumbnailUrl})`
 | 
				
			||||||
			};
 | 
								};
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -49,6 +49,7 @@ export default Vue.extend({
 | 
				
			|||||||
<style lang="stylus" scoped>
 | 
					<style lang="stylus" scoped>
 | 
				
			||||||
.qiziqtywpuaucsgarwajitwaakggnisj
 | 
					.qiziqtywpuaucsgarwajitwaakggnisj
 | 
				
			||||||
	display flex
 | 
						display flex
 | 
				
			||||||
 | 
						overflow hidden
 | 
				
			||||||
	font-size 0.9em
 | 
						font-size 0.9em
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	> .avatar
 | 
						> .avatar
 | 
				
			||||||
 
 | 
				
			|||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user