Compare commits

...

273 Commits

Author SHA1 Message Date
4c3dccfc0b 2.10.0 2018-05-18 15:32:11 +09:00
1075e3a005 透過画像のレンダリングを改善 2018-05-18 15:31:28 +09:00
dad8fff12d Fix ui 2018-05-18 14:41:44 +09:00
a6a175ede1 🎨 2018-05-18 14:31:30 +09:00
a01607fd97 ✌️ 2018-05-18 12:21:53 +09:00
345084a764 2.9.1 2018-05-18 12:08:26 +09:00
27582319fa Catch error 2018-05-18 12:08:05 +09:00
44bb99259c Merge pull request #1597 from mei23/mei-doc1
Fix can't convert i18n docs
2018-05-18 11:29:24 +09:00
9b0e83d971 Fix can't convert i18n docs 2018-05-18 11:00:50 +09:00
db882ebb6f Update appveyor.yml 2018-05-18 11:00:38 +09:00
c501bf4e16 Update appveyor.yml 2018-05-18 10:53:39 +09:00
c0eb873feb Create appveyor.yml 2018-05-18 10:41:49 +09:00
0926c92245 2.9.0 2018-05-18 09:52:10 +09:00
e880d7da6c 🎨 2018-05-18 09:49:28 +09:00
6ad90ecfa8 🎨 2018-05-18 09:40:57 +09:00
fbd51f0079 ✌️ 2018-05-18 09:21:19 +09:00
60b60fda8d Update package.json 2018-05-18 07:19:13 +09:00
612db86141 Delete api.ts 2018-05-18 07:14:43 +09:00
49911d15d3 Update .travis.yml 2018-05-18 06:40:38 +09:00
8a1aa08200 Update .travis.yml 2018-05-18 06:40:15 +09:00
64bd853b07 Merge branch 'master' of https://github.com/syuilo/misskey 2018-05-18 06:37:33 +09:00
e7890eb6b9 Use Promise 2018-05-18 06:37:25 +09:00
b59db33435 Merge pull request #1596 from syuilo/l10n_master
New Crowdin translations
2018-05-18 06:34:58 +09:00
ef5a4bc078 New translations ja.yml (Korean) 2018-05-18 06:30:56 +09:00
f662319bf1 New translations ja.yml (Polish) 2018-05-18 06:30:54 +09:00
83277ccbaf New translations ja.yml (Chinese Simplified) 2018-05-18 06:30:52 +09:00
bf1a4a4be3 New translations ja.yml (Italian) 2018-05-18 06:30:51 +09:00
7bd39f44a7 New translations ja.yml (Russian) 2018-05-18 06:30:49 +09:00
0b5ac1daec New translations ja.yml (English) 2018-05-18 06:30:47 +09:00
3f86bf6557 New translations ja.yml (Spanish) 2018-05-18 06:30:46 +09:00
a251c9a1a7 New translations ja.yml (German) 2018-05-18 06:30:44 +09:00
c696666b32 New translations ja.yml (French) 2018-05-18 06:30:42 +09:00
a8ade110e6 Improve renoting in mobile 2018-05-18 06:27:27 +09:00
f5cad1b142 Merge branch 'master' of https://github.com/syuilo/misskey 2018-05-18 06:15:28 +09:00
b247852bf8 Merge pull request #1595 from syuilo/l10n_master
New Crowdin translations
2018-05-18 06:15:07 +09:00
c5feafb893 Fix test 2018-05-18 06:14:33 +09:00
99e6769f48 New translations ja.yml (Polish) 2018-05-18 06:10:48 +09:00
c78e75db78 New translations ja.yml (Polish) 2018-05-18 06:01:24 +09:00
d90292eb0c New translations ja.yml (English) 2018-05-18 06:01:22 +09:00
c972869688 New translations ja.yml (English) 2018-05-18 05:52:22 +09:00
409967a17f Merge pull request #1594 from syuilo/l10n_master
New Crowdin translations
2018-05-18 05:33:50 +09:00
ed848c986c New translations ja.yml (Korean) 2018-05-18 05:31:41 +09:00
d6cbfa5b06 New translations ja.yml (Polish) 2018-05-18 05:31:39 +09:00
d032e89f48 New translations ja.yml (Chinese Simplified) 2018-05-18 05:31:38 +09:00
c6c58daaef New translations ja.yml (Italian) 2018-05-18 05:31:36 +09:00
f9c1923fa8 New translations ja.yml (Russian) 2018-05-18 05:31:34 +09:00
dc36113c06 New translations ja.yml (English) 2018-05-18 05:31:33 +09:00
f4a5ef8292 New translations ja.yml (Spanish) 2018-05-18 05:31:31 +09:00
f221c4da64 New translations ja.yml (German) 2018-05-18 05:31:29 +09:00
b1716a1dda New translations ja.yml (French) 2018-05-18 05:31:27 +09:00
b25a8ef5d4 Merge pull request #1592 from syuilo/l10n_master
New Crowdin translations
2018-05-18 05:23:22 +09:00
4317e76104 Merge pull request #1593 from m4sk1n/moari18n
moar i18n
2018-05-18 05:22:06 +09:00
1529a2eded moar i18n
Signed-off-by: Marcin Mikołajczak <me@m4sk.in>
2018-05-17 20:18:47 +02:00
893bac8b3b New translations ja.yml (German) 2018-05-18 01:01:41 +09:00
605700b98e 2.8.0 2018-05-17 23:54:47 +09:00
4ad51672c1 Fix bug 2018-05-17 23:53:55 +09:00
89a58dc596 添付されたメディアのURLは省略して表示するように 2018-05-17 23:38:35 +09:00
e1672e539b 🎨 2018-05-17 23:18:24 +09:00
518f6e9677 🎨 2018-05-17 23:10:53 +09:00
1e61ea1591 2.7.1 2018-05-17 19:38:50 +09:00
90a4fe471d ✌️ 2018-05-17 19:38:20 +09:00
b2368b04db 2.7.0 2018-05-17 18:33:56 +09:00
d253df4574 ✌️ 2018-05-17 18:18:45 +09:00
cf0351225f Update dependencies 🚀 2018-05-17 17:01:07 +09:00
a1692ebc7c モバイル版のウィジェット復活 2018-05-17 16:24:01 +09:00
5c38084af5 ✌️ 2018-05-17 15:41:07 +09:00
a090d6e820 Merge pull request #1586 from syuilo/l10n_master
New Crowdin translations
2018-05-17 15:29:25 +09:00
12cd3714e0 Merge branch 'master' into l10n_master 2018-05-17 15:29:18 +09:00
e08b2a9481 oops 2018-05-17 15:25:41 +09:00
b452ad2fb5 New translations ja.yml (Korean) 2018-05-17 12:52:36 +09:00
fa43a70019 New translations ja.yml (Polish) 2018-05-17 12:52:34 +09:00
5861f6da5d New translations ja.yml (Chinese Simplified) 2018-05-17 12:52:33 +09:00
c56d5a2154 New translations ja.yml (Italian) 2018-05-17 12:52:31 +09:00
e03fcfe297 New translations ja.yml (Russian) 2018-05-17 12:52:29 +09:00
6ab00d5249 New translations ja.yml (English) 2018-05-17 12:52:28 +09:00
15c726ff24 New translations ja.yml (Spanish) 2018-05-17 12:52:26 +09:00
377a920c24 New translations ja.yml (German) 2018-05-17 12:52:25 +09:00
7d6766a514 New translations ja.yml (French) 2018-05-17 12:52:23 +09:00
23d452b99e Merge pull request #1587 from m4sk1n/typo
fix typo
2018-05-17 12:45:33 +09:00
6fb112d000 Remove needless plugin 2018-05-17 12:44:55 +09:00
14f7ff13ec #491 2018-05-17 09:28:31 +09:00
05dd381502 Merge pull request #1589 from rinsuki/fix/1428
fix #1428
2018-05-17 08:16:10 +09:00
859c0c3491 fix #1428 2018-05-17 08:14:30 +09:00
8b00648295 Merge pull request #1588 from rinsuki/fix/yarn-lock-ignore
add yarn.lock to gitignore
2018-05-17 07:57:48 +09:00
829b4012e6 Merge branch 'master' into fix/yarn-lock-ignore 2018-05-17 07:52:24 +09:00
1d49cb475d add yarn.lock to gitignore 2018-05-17 07:49:43 +09:00
4ff6ec7767 New translations ja.yml (German) 2018-05-17 04:01:41 +09:00
98fff94f89 New translations ja.yml (German) 2018-05-17 03:54:54 +09:00
3063bb7ac1 New translations ja.yml (German) 2018-05-17 03:41:00 +09:00
a0fa5666c6 New translations ja.yml (German) 2018-05-17 03:31:33 +09:00
f9cd25c424 fix typo
Signed-off-by: Marcin Mikołajczak <me@m4sk.in>
2018-05-16 16:35:07 +02:00
161bce1a42 Update deliver.ts 2018-05-16 17:30:00 +09:00
66437f31c0 Save remote user's endpoints 2018-05-16 17:06:12 +09:00
34186cf45f ✌️ 2018-05-16 17:04:39 +09:00
f59209aaa3 Fix bug 2018-05-16 16:50:36 +09:00
2b542ee337 New translations ja.yml (Polish) 2018-05-16 13:31:02 +09:00
dac56eb677 New translations ja.yml (German) 2018-05-16 10:11:07 +09:00
7069623c9a New translations ja.yml (English) 2018-05-16 10:01:12 +09:00
6699081ad0 New translations ja.yml (German) 2018-05-16 10:01:10 +09:00
b6a8a80ff4 New translations ja.yml (German) 2018-05-16 09:51:16 +09:00
5db472f552 New translations ja.yml (German) 2018-05-16 09:41:11 +09:00
bb75e2cc59 New translations ja.yml (Korean) 2018-05-16 08:31:31 +09:00
14a8301e1f New translations ja.yml (Polish) 2018-05-16 08:31:29 +09:00
f7ca7e127a New translations ja.yml (Chinese Simplified) 2018-05-16 08:31:28 +09:00
394066b271 New translations ja.yml (Italian) 2018-05-16 08:31:26 +09:00
c99418250e New translations ja.yml (Russian) 2018-05-16 08:31:24 +09:00
7be1e1cf74 New translations ja.yml (English) 2018-05-16 08:31:23 +09:00
97a08558de New translations ja.yml (Spanish) 2018-05-16 08:31:21 +09:00
117a40cbf1 New translations ja.yml (German) 2018-05-16 08:31:20 +09:00
a149487a3e New translations ja.yml (French) 2018-05-16 08:31:18 +09:00
1992b08dcf Merge pull request #1585 from syuilo/l10n_master
New Crowdin translations
2018-05-16 08:22:39 +09:00
c773f207d2 Merge branch 'master' of https://github.com/syuilo/misskey 2018-05-16 08:22:10 +09:00
e127341228 i18n 2018-05-16 08:22:07 +09:00
dd8f43d85e New translations ja.yml (English) 2018-05-16 08:21:48 +09:00
4e0f34ce1d Update README.md 2018-05-16 08:16:40 +09:00
eb5543aae3 Update README.md 2018-05-16 08:10:01 +09:00
2c3059fcbf Merge pull request #1584 from syuilo/l10n_master
New Crowdin translations
2018-05-16 08:04:39 +09:00
49c4c007bc New translations ja.yml (Korean) 2018-05-16 08:02:30 +09:00
f14acd70b7 New translations ja.yml (Polish) 2018-05-16 08:02:28 +09:00
a9e085dc39 New translations ja.yml (Chinese Simplified) 2018-05-16 08:02:27 +09:00
b783d6bab4 New translations ja.yml (Italian) 2018-05-16 08:02:25 +09:00
dfc9693a0e New translations ja.yml (Russian) 2018-05-16 08:02:23 +09:00
c039498e8b New translations ja.yml (English) 2018-05-16 08:02:22 +09:00
d5e567a8e3 New translations ja.yml (Spanish) 2018-05-16 08:02:20 +09:00
f3f8451184 New translations ja.yml (German) 2018-05-16 08:02:19 +09:00
3e8f319821 New translations ja.yml (French) 2018-05-16 08:02:17 +09:00
b03ccead4b Update Crowdin configuration file 2018-05-16 08:01:55 +09:00
c54e4672e8 Merge pull request #1583 from saper/validate-url
Validate Misskey URL
2018-05-16 07:47:22 +09:00
b92377097c Validate Misskey URL 2018-05-16 00:46:38 +02:00
fcc59f877c Merge pull request #1582 from saper/exit-on-config-error
Stop webpack on URL error, otherwise gulp continues
2018-05-16 07:36:22 +09:00
87ef08cf7a Stop webpack on URL error, otherwise gulp continues
$ webpack && gulp build
「dont.know.yet」は、正しいURLではありません。先頭に http:// または https:// をつけ忘れてないかなど確認してください。
[00:28:15] Requiring external module ts-node/register
/**
node-macaddress: Unkown os.platform(), defaulting to `unix'.
Error: Cannot find module './built/client/meta.json'
    at Function.Module._resolveFilename (module.js:543:15)
    at Function.Module._load (module.js:470:25)
    at Module.require (module.js:593:17)
    at require (internal/module.js:11:18)
/**
 * Config loader
    at Object.<anonymous> (/usr/home/saper/sw/misskey/gulpfile.ts:24:16)
    at Module._compile (module.js:649:30)
    at Module.m._compile (/usr/home/saper/sw/misskey/node_modules/ts-node/src/index.ts:402:23)
    at Module._extensions..js (module.js:660:10)
    at Object.require.extensions.(anonymous function) [as .ts] (/usr/home/saper/sw/misskey/node_modules/ts-node/src/index.ts:405:12)
    at Module.load (module.js:561:32)
error Command failed with exit code 1.
2018-05-16 00:34:39 +02:00
3d19d4ae52 Merge pull request #1581 from saper/delete_array
Use delete[] after new[]
2018-05-16 07:23:13 +09:00
7d881427d4 Use delete[] after new[]
gmake: Wejście do katalogu '/usr/home/saper/sw/misskey/build'
  CXX(target) Release/obj.target/crypto_key/src/crypto_key.o
../src/crypto_key.cc:25:3: warning: 'delete' applied to a pointer that was allocated with 'new[]'; did you mean 'delete[]'?
      [-Wmismatched-new-delete]
                delete sourceBuf;
                ^
                      []
../src/crypto_key.cc:18:25: note: allocated with 'new[]' here
        const auto sourceBuf = new char[sourceLength];
                               ^
../src/crypto_key.cc:32:2: warning: 'delete' applied to a pointer that was allocated with 'new[]'; did you mean 'delete[]'?
      [-Wmismatched-new-delete]
        delete sourceBuf;
        ^
              []
../src/crypto_key.cc:18:25: note: allocated with 'new[]' here
        const auto sourceBuf = new char[sourceLength];
                               ^
2 warnings generated.
2018-05-16 00:21:54 +02:00
87862ba18b Merge pull request #1580 from marihachi/marihachi-patch-1
update license tip
2018-05-14 19:04:18 +09:00
3853255638 update license tip 2018-05-14 18:58:47 +09:00
12c624fa58 2.6.2 2018-05-14 14:16:56 +09:00
97c4758de2 Use _id instead of createdAt to improve performance 2018-05-14 13:58:44 +09:00
f20c08f0f7 Fix bug 2018-05-14 13:54:18 +09:00
1641d6bce2 Update add-file.ts 2018-05-14 12:47:33 +09:00
f5d2cb5c61 Improve performance 2018-05-14 09:24:49 +09:00
26941f62c6 2.6.1 2018-05-14 09:15:49 +09:00
06461bb9ee NoteのuserIdに対してインデックスを張るように 2018-05-14 09:15:43 +09:00
9f4624283d Disable prev/next 2018-05-14 09:01:37 +09:00
d4b696d03a Fix bug 2018-05-13 17:00:34 +09:00
219fdecc50 Fix bug 2018-05-13 16:52:47 +09:00
7af9ad9869 Better error handling 2018-05-13 16:26:11 +09:00
a858dd4453 2.6.0 2018-05-13 03:17:09 +09:00
f47377d181 ✌️ 2018-05-13 03:16:31 +09:00
bc197bc958 Add index 2018-05-13 03:13:55 +09:00
1836dd7312 Merge branch 'master' of https://github.com/syuilo/misskey 2018-05-13 03:08:33 +09:00
b844a8e9d5 Add note 2018-05-13 03:08:00 +09:00
a4ed163b62 Merge pull request #1576 from mei23/mei-preview
Fix url preview
2018-05-10 06:36:19 +09:00
f40e1ff0cc Fix cause error in case preview has data URI 2018-05-10 01:08:33 +09:00
d261fdbbc0 Fix can't preview some url 2018-05-09 20:14:34 +09:00
6b0a42af27 Merge pull request #1575 from mei23/mei-listlm
Fix list load-more is not working
2018-05-09 05:15:51 +09:00
107d9fd2c8 Fix list load-more is not working 2018-05-09 04:56:07 +09:00
4116b9eaf2 Provide originalNotesCount and originalUsersCount 2018-05-08 07:19:23 +09:00
ecd71ef5ff Fix bug 2018-05-08 07:08:02 +09:00
058602352c Fix #1574 2018-05-08 07:03:06 +09:00
59c39fab13 Update setup.ja.md 2018-05-08 04:04:18 +09:00
ab4f97ff20 2.5.0 2018-05-07 18:22:44 +09:00
79640d6861 Fix bug 2018-05-07 18:20:15 +09:00
d305c7e401 Fix 2018-05-07 17:45:21 +09:00
8afaca36d9 Better text parsing 2018-05-07 17:19:00 +09:00
9950fafff7 oops 2018-05-07 17:15:20 +09:00
0d9857db63 2.5.0-beta1 2018-05-07 17:05:17 +09:00
10c932876d Better banner redering 2018-05-07 17:05:05 +09:00
d5d7a527a0 Fix #1569 2018-05-07 16:53:56 +09:00
9eb8595130 Fix ui 2018-05-07 16:39:00 +09:00
8c46e5b3d9 投稿のレンダリングを改善 2018-05-07 16:31:33 +09:00
73bd877993 Merge branch 'master' of https://github.com/syuilo/misskey 2018-05-07 16:25:21 +09:00
de6cbf8a22 リモートアカウントの投稿に対しての返信にはメンションを付けるように 2018-05-07 16:25:06 +09:00
89f618d732 Update i18n.ts 2018-05-07 05:22:06 +09:00
4955df3911 oops 2018-05-07 04:26:45 +09:00
6785f50a1f 良い感じに 2018-05-07 04:08:39 +09:00
a549327170 Merge branch 'master' of https://github.com/syuilo/misskey 2018-05-07 03:19:27 +09:00
1f018d87f2 メンションを処理 2018-05-07 03:19:24 +09:00
769ee734fa Merge pull request #1572 from ha-dai/patch1
Fix typo.
2018-05-07 03:09:45 +09:00
6419185228 fix typo 2018-05-07 03:05:00 +09:00
b77cbeca22 #1427 2018-05-07 02:54:14 +09:00
4cce10a7d7 Fix glitch 2018-05-07 01:43:51 +09:00
1a6fd7d72e Fix ui glitch 2018-05-06 21:13:21 +09:00
97ce939a73 Fix 2018-05-06 18:19:17 +09:00
3f2a7a561e アイコンのレンダリングを改善 2018-05-06 18:04:37 +09:00
332af15e3c Fix 2018-05-06 17:37:50 +09:00
fe184ce84a Fix 2018-05-06 17:36:47 +09:00
661c7f45ba Merge pull request #1570 from m4sk1n/master
i18n: Improve Polish translation
2018-05-06 16:52:50 +09:00
01c0545409 i18n: Improve Polish translation
Signed-off-by: Marcin Mikołajczak <me@m4sk.in>
2018-05-06 09:48:53 +02:00
c6492d3d58 誰もフォローしていないときはローカルタイムラインを表示するように 2018-05-06 14:35:28 +09:00
638a2ab684 2.3.1 2018-05-06 02:08:40 +09:00
650f79d0fd Fix bugs 2018-05-06 02:08:27 +09:00
a64817cea1 2.3.0 2018-05-06 01:47:25 +09:00
c32c3c1370 Fix bug 2018-05-06 01:46:35 +09:00
29ad7ab0cf Provide prev and next note link 2018-05-06 01:43:53 +09:00
11716fa9d3 Provide og:type 2018-05-06 01:37:32 +09:00
210f11ffd8 Update theme color 🎨 2018-05-06 01:35:17 +09:00
814751d76a Merge branch 'master' of https://github.com/syuilo/misskey 2018-05-06 01:34:51 +09:00
440cf139bb メタ情報をレンダリングするように 2018-05-06 01:34:48 +09:00
276d8ffc66 Update README.md 2018-05-05 02:46:23 +09:00
d9cdc1f079 2.2.0 2018-05-04 18:32:13 +09:00
414c600356 ファイルのURLを保存するように 2018-05-04 18:32:03 +09:00
e37c19fdcd 2.1.4 2018-05-04 18:02:17 +09:00
d69b919961 oops 2018-05-04 18:02:09 +09:00
1311db8060 2.1.3 2018-05-04 18:00:02 +09:00
ed9e7520f1 Fix bug 2018-05-04 17:59:51 +09:00
8fe6da0cad 2.1.2 2018-05-04 17:41:12 +09:00
b8eac630ed 🍕 2018-05-04 17:40:50 +09:00
a5b9d7eb3b oops 2018-05-04 17:38:34 +09:00
06c453c3bc ✌️ 2018-05-04 17:27:14 +09:00
97b7567770 ✌️ 2018-05-04 17:20:40 +09:00
34345ea8a7 oops 2018-05-04 17:08:41 +09:00
fc166b7bee oops 2018-05-04 16:56:23 +09:00
cf3112c7c0 ✌️ 2018-05-04 16:48:18 +09:00
e7dd74a443 ✌️ 2018-05-04 16:37:15 +09:00
b5acf15877 2.0.0 2018-05-04 16:27:03 +09:00
f62603fd9d ドライブのファイルにユーザー情報を非正規化 2018-05-04 15:30:56 +09:00
d000b9e7cd ✌️ 2018-05-04 15:17:00 +09:00
0e1f858dfd ✌️ 2018-05-04 15:15:17 +09:00
bcf28282f6 ✌️ 2018-05-04 15:07:02 +09:00
abfbb068d7 ✌️ 2018-05-04 13:24:08 +09:00
9643a87320 Fix 2018-05-04 13:23:55 +09:00
b3817240b8 Merge pull request #1568 from m4sk1n/master
i18n: Add Polish translation
2018-05-04 12:10:24 +09:00
8d53f8639e i18n: Add Polish translation
Signed-off-by: Marcin Mikołajczak <me@m4sk.in>
2018-05-04 00:28:07 +02:00
f850283147 Merge branch 'master' of github.com:syuilo/misskey 2018-05-04 02:49:46 +09:00
27f90b61e6 1.7.0 2018-05-04 00:20:31 +09:00
c9a57fe8fe 投稿やメッセージなどに添付されていないドライブのファイルをすべて削除するツールを実装 2018-05-04 00:08:42 +09:00
9516f2fa63 Fix bug 2018-05-03 23:32:46 +09:00
7be88b7816 1.6.0 2018-05-03 20:51:50 +09:00
faabb039a5 ✌️ 2018-05-03 20:12:08 +09:00
15e4cf1243 サムネイルを予め生成するように 2018-05-03 20:03:14 +09:00
75764e59e1 oops 2018-05-03 19:49:04 +09:00
f664cf09c0 Update cafy to 8.0.0 🚀 2018-05-02 18:06:16 +09:00
0c3e9dd5e0 oops 2018-04-30 14:05:16 +09:00
0bc7d28f58 🎨 2018-04-30 11:59:58 +09:00
17bb34941b 1.5.0 2018-04-29 22:10:10 +09:00
04cd3377ee oops 2018-04-29 22:04:51 +09:00
326bd5e094 oops 2018-04-29 21:41:48 +09:00
987799e9db Refactor 2018-04-29 21:37:51 +09:00
19c846afaf 🎨 2018-04-29 21:35:18 +09:00
ea9265b30b Fix bug 2018-04-29 21:28:45 +09:00
0516353afd Disable http2
Use https instead
2018-04-29 21:21:32 +09:00
5f1b726bab 1.4.0 2018-04-29 18:17:33 +09:00
ed130ca82c Fix bug 2018-04-29 18:16:02 +09:00
9f22f924f1 ✌️ 2018-04-29 17:55:57 +09:00
a8083eb52b バグ修正など 2018-04-29 17:54:50 +09:00
665afccb45 ✌️ 2018-04-29 17:22:45 +09:00
372bfaceda リファクタリングなど 2018-04-29 17:17:15 +09:00
1625b37b44 Merge pull request #1559 from syuilo/visibility
Implement Visibility
2018-04-29 09:30:00 +09:00
72c1352acf wip 2018-04-29 09:29:39 +09:00
2f2a945905 wip 2018-04-29 09:19:05 +09:00
9870e73069 wip 2018-04-29 09:00:41 +09:00
f2874d778a wip 2018-04-29 08:51:17 +09:00
e9940c9221 wip 2018-04-29 07:01:47 +09:00
7797a0746a wip 2018-04-29 05:28:34 +09:00
6df010a71e wip 2018-04-29 04:51:19 +09:00
671c5e7c12 wip 2018-04-29 04:44:58 +09:00
ec4ed8fb2d wip 2018-04-29 04:30:51 +09:00
34786130b7 ✌️ 2018-04-28 17:29:46 +09:00
6cb520cd2c oops 2018-04-28 17:27:41 +09:00
47ce59d555 wip 2018-04-28 17:25:56 +09:00
985a105930 1.3.0 2018-04-28 12:05:39 +09:00
52560dd986 🎨 2018-04-28 12:04:31 +09:00
de81502fdf 🎨 2018-04-28 12:00:58 +09:00
51876bac62 🎨 2018-04-28 10:59:37 +09:00
a5b994259e Fix bug 2018-04-28 10:27:53 +09:00
c85c825bad 🎨 2018-04-28 10:27:43 +09:00
c512c07630 Merge branch 'master' of github.com:syuilo/misskey 2017-12-07 17:23:12 +09:00
105623e398 Merge branch 'master' of github.com:syuilo/misskey 2017-11-30 13:24:41 +09:00
6c75bc6d51 Merge branch 'master' of github.com:syuilo/misskey 2017-11-27 03:41:47 +09:00
a068741d05 Merge branch 'master' of https://github.com/syuilo/misskey 2017-11-06 13:37:48 +09:00
4e83106853 Merge branch 'master' of https://github.com/syuilo/misskey 2017-11-02 13:58:47 +09:00
0b688a909e Merge branch 'master' of https://github.com/syuilo/misskey 2017-10-26 15:05:20 +09:00
fabcad6db9 Merge branch 'master' of https://github.com/syuilo/misskey 2017-10-25 16:24:16 +09:00
316 changed files with 7878 additions and 3629 deletions

1
.gitignore vendored
View File

@ -10,3 +10,4 @@ npm-debug.log
run.bat
api-docs.json
package-lock.json
yarn.lock

View File

@ -7,7 +7,7 @@ notifications:
language: node_js
node_js:
- 9.8.0
- 10.1.0
env:
- CXX=g++-4.8 NODE_ENV=production
@ -22,19 +22,14 @@ addons:
cache:
directories:
# パッケージをキャッシュすると本来は動かないはずなのに動いてしまう
# 場合があり危険なのでキャッシュはしない:
#- node_modules
- node_modules
services:
- mongodb
- redis-server
before_script:
# Travisはproduction環境なので(10行目により)、
# npm install しただけでは devDependencies はインストールされないので、
# --only=dev オプションを付けてそれらもインストールされるようにする:
- npm install --only=dev
- npm install
# 設定ファイルを配置
- cp ./.travis/default.yml ./.config

View File

@ -25,7 +25,7 @@ ultimately sophisticated new type of mini-blog based SNS.
* Real time contents
* ActivityPub compatible
and more! You can touch with your own eyes at https://misskey.xyz/.
and more! You can touch with your own eyes at [misskey.xyz](https://misskey.xyz).
:package: Create your instance
----------------------------------------------------------------
@ -36,7 +36,9 @@ please see [Setup and installation guide](./docs/setup.en.md).
----------------------------------------------------------------
**[PR](https://github.com/syuilo/misskey/pulls)s welcome!**
If you want to translate Misskey, please see [Translation guide](./docs/translate.en.md).
If you want to...
* i18n ... please see [Translation guide](./docs/translate.en.md).
* l10n ... please visit https://crowdin.com/project/misskey
:heart: Backers & Sponsors
----------------------------------------------------------------
@ -52,9 +54,9 @@ If you want to translate Misskey, please see [Translation guide](./docs/translat
[List of all contributors](https://github.com/syuilo/misskey/graphs/contributors)
### :earth_americas: Translators
| ![][mirro-san-icon] | ![][Conan-kun-icon] |
|:-:|:-:|
| [Mirro][mirro-san-link]<br>English, French | [Asriel][Conan-kun-link]<br>English, French |
| ![][mirro-san-icon] | ![][Conan-kun-icon] | ![][m4sk1n-icon] |
|:-:|:-:|:-:|
| [Mirro][mirro-san-link]<br>English, French | [Asriel][Conan-kun-link]<br>English, French | [Marcin Mikołajczak][m4sk1n-link]<br>Polish |
:four_leaf_clover: Copyright
----------------------------------------------------------------
@ -100,4 +102,5 @@ Misskey is an open-source software licensed under [GNU AGPLv3](LICENSE).
[mirro-san-icon]: https://avatars1.githubusercontent.com/u/17948612?s=70&v=4
[Conan-kun-link]: https://github.com/Conan-kun
[Conan-kun-icon]: https://avatars3.githubusercontent.com/u/30003708?s=70&v=4
[m4sk1n-link]: https://github.com/m4sk1n
[m4sk1n-icon]: https://avatars3.githubusercontent.com/u/21127288?s=70&v=4

41
appveyor.yml Normal file
View File

@ -0,0 +1,41 @@
# appveyor file
# http://www.appveyor.com/docs/appveyor-yml
environment:
matrix:
- nodejs_version: 10.1.0
cache:
- node_modules
build: off
install:
# Update Node.js
# 標準で入っている Node.js を更新します (2014/11/13 時点では、v0.10.32 が標準)
- ps: Update-NodeJsInstallation (Get-NodeJsLatestBuild $env:nodejs_version)
- node --version
# Update NPM
- npm install -g npm
- npm --version
# Update node-gyp
# 必須! node-gyp のバージョンを上げないと、ネイティブモジュールのコンパイルに失敗します
- npm install -g node-gyp
- npm install
init:
# git clone の際の改行を変換しないようにします
- git config --global core.autocrlf false
before_test:
# 設定ファイルを配置
- cp ./.travis/default.yml ./.config
- cp ./.travis/test.yml ./.config
- npm run build
test_script:
- npm test

View File

@ -0,0 +1,101 @@
const chalk = require('chalk');
const log = require('single-line-log').stdout;
const sequential = require('promise-sequential');
const { default: DriveFile, DriveFileChunk } = require('../built/models/drive-file');
const { default: DriveFileThumbnail, DriveFileThumbnailChunk } = require('../built/models/drive-file-thumbnail');
const { default: User } = require('../built/models/user');
const q = {
'metadata._user.host': {
$ne: null
}
};
async function main() {
const promiseGens = [];
const count = await DriveFile.count(q);
let prev;
for (let i = 0; i < count; i++) {
promiseGens.push(() => {
const promise = new Promise(async (res, rej) => {
const file = await DriveFile.findOne(prev ? Object.assign({
_id: { $lt: prev._id }
}, q) : q, {
sort: {
_id: -1
}
});
prev = file;
function skip() {
res([i, file, false]);
}
if (file == null) return skip();
log(chalk`{gray ${i}} scanning {bold ${file._id}} ${file.filename} ...`);
const attachingUsersCount = await User.count({
$or: [{
avatarId: file._id
}, {
bannerId: file._id
}]
}, { limit: 1 });
if (attachingUsersCount !== 0) return skip();
Promise.all([
// チャンクをすべて削除
DriveFileChunk.remove({
files_id: file._id
}),
DriveFile.update({ _id: file._id }, {
$set: {
'metadata.deletedAt': new Date(),
'metadata.isExpired': true
}
})
]).then(async () => {
res([i, file, true]);
//#region サムネイルもあれば削除
const thumbnail = await DriveFileThumbnail.findOne({
'metadata.originalId': file._id
});
if (thumbnail) {
DriveFileThumbnailChunk.remove({
files_id: thumbnail._id
});
DriveFileThumbnail.remove({ _id: thumbnail._id });
}
//#endregion
});
});
promise.then(([i, file, deleted]) => {
if (deleted) {
log(chalk`{gray ${i}} {red deleted: {bold ${file._id}} ${file.filename}}`);
} else {
log(chalk`{gray ${i}} {green skipped: {bold ${file._id}} ${file.filename}}`);
}
log.clear();
console.log();
});
return promise;
});
}
return await sequential(promiseGens);
}
main().then(() => {
console.log('ALL DONE');
}).catch(console.error);

View File

@ -0,0 +1,80 @@
const chalk = require('chalk');
const log = require('single-line-log').stdout;
const sequential = require('promise-sequential');
const { default: DriveFile, deleteDriveFile } = require('../built/models/drive-file');
const { default: Note } = require('../built/models/note');
const { default: MessagingMessage } = require('../built/models/messaging-message');
const { default: User } = require('../built/models/user');
async function main() {
const promiseGens = [];
const count = await DriveFile.count({});
let prev;
for (let i = 0; i < count; i++) {
promiseGens.push(() => {
const promise = new Promise(async (res, rej) => {
const file = await DriveFile.findOne(prev ? {
_id: { $lt: prev._id }
} : {}, {
sort: {
_id: -1
}
});
prev = file;
function skip() {
res([i, file, false]);
}
if (file == null) return skip();
log(chalk`{gray ${i}} scanning {bold ${file._id}} ${file.filename} ...`);
const attachingUsersCount = await User.count({
$or: [{
avatarId: file._id
}, {
bannerId: file._id
}]
}, { limit: 1 });
if (attachingUsersCount !== 0) return skip();
const attachingNotesCount = await Note.count({
mediaIds: file._id
}, { limit: 1 });
if (attachingNotesCount !== 0) return skip();
const attachingMessagesCount = await MessagingMessage.count({
fileId: file._id
}, { limit: 1 });
if (attachingMessagesCount !== 0) return skip();
deleteDriveFile(file).then(() => {
res([i, file, true]);
}).catch(rej);
});
promise.then(([i, file, deleted]) => {
if (deleted) {
log(chalk`{gray ${i}} {red deleted: {bold ${file._id}} ${file.filename}}`);
} else {
log(chalk`{gray ${i}} {green skipped: {bold ${file._id}} ${file.filename}}`);
}
log.clear();
console.log();
});
return promise;
});
}
return await sequential(promiseGens);
}
main().then(() => {
console.log('done');
}).catch(console.error);

View File

@ -18,7 +18,11 @@ const form = [{
}, {
type: 'input',
name: 'url',
message: 'URL you want to run Misskey:'
message: 'URL you want to run Misskey:',
validate: function(wannabeurl) {
return wannabeurl.match('^http\(s?\)://') ? true :
'URL needs to start with http:// or https://';
}
}, {
type: 'input',
name: 'port',

3
crowdin.yml Normal file
View File

@ -0,0 +1,3 @@
files:
- source: /locales/ja.yml
translation: /locales/%two_letters_code%.yml

View File

@ -67,3 +67,15 @@ web-push generate-vapid-keys
1. `git reset --hard && git pull origin master`
2. `npm install`
3. `npm run build`
## メモリが足りなくてビルドできない場合
Misskeyの(クライアントの)ビルドには、目安として8GBくらいのメモリを必要とします。
VPSなどでビルドする時は、もしかしたらメモリが足りなくなる可能性があります。
そうなった場合、もしVPSではなくあなたのPCが十分なメモリを搭載しているなら、あなたのPC上でビルドし、生成されたファイルをVPSにFTPでアップロードする方法を採ることができます。
1. あなたのPC上にMisskeyをインストールする
2. 設定ファイルを用意する。設定ファイルは、サーバーに合わせた設定にします。
3. npm run webpack
4. built/client をサーバーにアップロードする
5. サーバー上で、npm run gulp
6. 完了

View File

@ -20,6 +20,7 @@ import * as replace from 'gulp-replace';
import * as htmlmin from 'gulp-htmlmin';
const uglifyes = require('uglify-es');
import locales from './locales';
import { fa } from './src/build/fa';
const client = require('./built/client/meta.json');
import config from './src/config';
@ -59,9 +60,15 @@ gulp.task('build:ts', () => {
.pipe(gulp.dest('./built/'));
});
gulp.task('build:copy', () =>
gulp.task('build:copy:views', () =>
gulp.src('./src/server/web/views/**/*').pipe(gulp.dest('./built/server/web/views'))
);
gulp.task('build:copy', ['build:copy:views'], () =>
gulp.src([
'./build/Release/crypto_key.node',
'./src/const.json',
'./src/server/web/views/**/*',
'./src/**/assets/**/*',
'!./src/client/app/**/assets/**/*'
]).pipe(gulp.dest('./built/'))
@ -116,6 +123,7 @@ gulp.task('build:client:script', () =>
.pipe(replace('VERSION', JSON.stringify(client.version)))
.pipe(replace('API', JSON.stringify(config.api_url)))
.pipe(replace('ENV', JSON.stringify(env)))
.pipe(replace('LANGS', JSON.stringify(Object.keys(locales))))
.pipe(isProduction ? uglify({
toplevel: true
} as any) : gutil.noop())

596
locales/de.yml Normal file
View File

@ -0,0 +1,596 @@
---
common:
misskey: "Teile alles mit anderen mithilfe von Misskey"
time:
unknown: "Unbekannt"
future: "Zukunft"
just_now: "Gerade eben"
seconds_ago: "vor {0} Sekunde{0:n}"
minutes_ago: "vor {0} Minuten"
hours_ago: "vor {0} Stunden"
days_ago: "vor {0} Tag{0:en}"
weeks_ago: "vor {0} Woche{0:n}"
months_ago: "vor {0} Monat{0:en}"
years_ago: "vor {} Jahr{0:en}"
weekday-short:
sunday: "So"
monday: "Mo"
tuesday: "Di"
wednesday: "Mi"
thursday: "Do"
friday: "Fr"
saturday: "Sa"
reactions:
like: "Gefällt mir"
love: "Lieben"
laugh: "Lachen"
hmm: "Hmm...?"
surprise: "Wow"
congrats: "Glückwunsch!"
angry: "Wütend"
confused: "Verwirrt"
pudding: "Pudding"
delete: "Löschen"
loading: "Laden"
ok: "OK"
update-available: "Eine neue Version von Misskey ist verfügbar ({newer}, aktuell ist {current}). Lade die Seite neu um die aktuelle Version zu laden"
my-token-regenerated: "Dein Token wurde generiert. Du wirst jetzt abgemeldet."
common/views/components/connect-failed.vue:
title: "Verbindung zum Server ist fehlgeschlagen"
description: "Es gibt entweder ein Problem mit deiner Internetverbindung, der Server ist nicht erreichbar oder wird gerade gewartet. Bitte versuche es später noch einmal."
thanks: "Vielen Dank für das nutzen von Misskey."
troubleshoot: "Problembehandlung"
common/views/components/connect-failed.troubleshooter.vue:
title: "Problembehandlung"
network: "Netzwerkverbindung"
checking-network: "Prüfen der Netzwerkverbindung"
internet: "Internetverbindung"
checking-internet: "Internetverbindung wird getestet"
server: "Serververbindung"
checking-server: "Überprüfung der Server-Verbindung"
finding: "Nach dem Problem suchen"
no-network: "Keine Netzwerkverbindung"
no-network-desc: "Bitte stelle sicher, dass du mit dem Internet verbunden bist."
no-internet: "Keine Internetverbindung"
no-internet-desc: "Bitte vergewissere dich, dass du mit dem Internet verbunden bist."
no-server: "Verbindung mit dem Server nicht möglich"
no-server-desc: "Die Internetverbindung scheint in Ordnung zu sein, aber eine Verbindung mit dem Misskey Server konnte nicht hergestellt werden. Möglicherweise ist dieser zur Zeit offline oder in der Wartung, bitte versuche es später noch einmal."
success: "Erfolgreich mit dem Misskey Server verbunden"
success-desc: "Die Verbindung scheint zu funktionieren. Bitte lade die Seite neu."
flush: "Cache leeren"
set-version: "Version angeben"
common/views/components/messaging.vue:
search-user: "Einen Nutzer suchen"
you: "Du"
no-history: "Keine Chronik"
common/views/components/messaging-room.vue:
empty: "Keine Unterhaltungen"
more: "Mehr"
no-history: "Keine weitere Chronik vorhanden"
resize-form: "Ziehen um die Größe zu verändern"
new-message: "Neue Nachricht"
common/views/components/messaging-room.form.vue:
input-message-here: "Nachricht hier eingeben"
send: "Senden"
attach-from-local: "Wähle Dateien von deinem PC aus"
attach-from-drive: "Wähle Dateien von deinem Speicher aus"
common/views/components/messaging-room.message.vue:
is-read: "Gelesen"
deleted: "Diese Nachricht wurde gelöscht"
common/views/components/nav.vue:
about: "Über"
stats: "Statistiken"
status: "Status"
wiki: "Wiki"
donors: "Spender"
repository: "Projektarchiv"
develop: "Entwickler"
feedback: "Feedback"
common/views/components/note-menu.vue:
favorite: "Diese Anmerkung favorisieren"
pin: "An die Profilseite pinnen"
remote: "Auf Quelle anzeigen"
common/views/components/poll.vue:
vote-to: "Stimme für '{}'"
vote-count: "{} Stimmen"
total-users: "{} Nutzer haben abgestimmt"
vote: "Abstimmen"
show-result: "Zeige Ergebnis"
voted: "Abgestimmt"
common/views/components/poll-editor.vue:
no-only-one-choice: "Du musst zwei oder mehr Entscheidungen angeben"
choice-n: "Auswahl {}"
remove: "Diese Auswahl entfernen"
add: "+ Eine Auswahl hinzufügen"
destroy: "Diese Abstimmung löschen"
common/views/components/reaction-picker.vue:
choose-reaction: "Wähle eine Reaktion aus"
common/views/components/signin.vue:
username: "Benutzername"
password: "Passwort"
token: "Token"
signing-in: "Melde an..."
signin: "Anmelden"
common/views/components/signup.vue:
username: "Benutzername"
checking: "Überprüfung..."
available: "Verfügbar"
unavailable: "Nicht verfügbar"
error: "Verbindungsfehler"
invalid-format: "Benutze nur Buchstaben, Zahlen und _"
too-short: "Bitte mindestens ein Zeichen eingeben"
too-long: "Bitte maximal 20 Zeichen verwenden"
password: "Passwort"
password-placeholder: "Wir empfehlen mindestens 8 Zeichen"
weak-password: "Schwaches Passwort"
normal-password: "Faires Passwort"
strong-password: "Schwaches Passwort"
retype: "Wiederholen"
retype-placeholder: "Bitte das Passwort erneut eingeben"
password-matched: "OK"
password-not-matched: "Stimmt nicht überein"
recaptcha: "Captcha"
create: "Account erstellen"
some-error: "Die Anmeldung konnte aufgrund eines Fehler nicht abgeschlossen werden. Bitte versuche es erneut."
common/views/components/special-message.vue:
new-year: "Frohes neues Jahr!"
christmas: "Frohe Weihnachten!"
common/views/components/stream-indicator.vue:
connecting: "Verbindung wird hergestellt"
reconnecting: "Erneut verbinden"
connected: "Verbindung hergestellt"
common/views/components/twitter-setting.vue:
description: "お使いのTwitterアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでTwitterアカウント情報が表示されるようになったり、Twitterを用いた便利なサインインを利用できるようになります。"
connected-to: "次のTwitterアカウントに接続されています"
detail: "Mehr..."
reconnect: "Erneut verbinden"
connect: "Mit Twitter verbinden"
disconnect: "Trennen"
common/views/components/uploader.vue:
waiting: "待機中"
common/views/widgets/broadcast.vue:
fetching: "確認中"
no-broadcasts: "お知らせはありません"
have-a-nice-day: "良い一日を!"
next: "次"
common/views/widgets/donation.vue:
title: "寄付のお願い"
text: "Misskeyの運営にはドメイン、サーバー等のコストが掛かります。Misskeyは広告を掲載したりしないため、収入を皆様からの寄付に頼っています。もしご興味があれば、{}までご連絡ください。ご協力ありがとうございます。"
common/views/widgets/photo-stream.vue:
title: "フォトストリーム"
no-photos: "写真はありません"
common/views/widgets/server.vue:
title: "サーバー情報"
toggle: "表示を切り替え"
desktop/views/components/activity.vue:
title: "アクティビティ"
toggle: "表示を切り替え"
desktop/views/components/calendar.vue:
title: "{1}年 {2}月"
prev: "前の月"
next: "次の月"
go: "クリックして時間遡行"
desktop/views/components/drive-window.vue:
used: "使用中"
drive: "ドライブ"
desktop/views/components/drive.file.vue:
avatar: "アイコン"
banner: "バナー"
contextmenu:
rename: "名前を変更"
copy-url: "URLをコピー"
download: "ダウンロード"
else-files: "その他..."
set-as-avatar: "アイコンに設定"
set-as-banner: "バナーに設定"
open-in-app: "アプリで開く"
add-app: "アプリを追加"
rename-file: "ファイル名の変更"
input-new-file-name: "新しいファイル名を入力してください"
copied: "コピー完了"
copied-url-to-clipboard: "URLをクリップボードにコピーしました"
desktop/views/components/drive.folder.vue:
unable-to-process: "操作を完了できません"
circular-reference-detected: "移動先のフォルダーは、移動するフォルダーのサブフォルダーです。"
unhandled-error: "不明なエラー"
contextmenu:
move-to-this-folder: "このフォルダへ移動"
show-in-new-window: "新しいウィンドウで表示"
rename: "名前を変更"
rename-folder: "フォルダ名の変更"
input-new-folder-name: "新しいフォルダ名を入力してください"
desktop/views/components/drive.nav-folder.vue:
drive: "ドライブ"
desktop/views/components/drive.vue:
search: "検索"
load-more: "もっと読み込む"
empty-draghover: "Herzlich Willkommen!"
empty-drive: "Dein Speicher ist leer"
empty-drive-description: "Du kannst rechts klicken und \"Datei hochladen\" auswählen oder eine Datei per Drag and Drop auf das Fenster ziehen."
empty-folder: "Dieser Ordner ist leer"
unable-to-process: "Der Vorgang konnte nicht beendet werden"
circular-reference-detected: "Das Zielverzeichnis ist ein Unterverzeichnis des Verzeichnisses welches du verschieben möchtest"
unhandled-error: "Unbekannter Fehler"
url-upload: "Von einer URL hochladen"
url-of-file: "URL der Datei, welche du hochladen möchtest"
url-upload-requested: "Upload angefordert"
may-take-time: "Es kann eine Weile dauern, bis der Upload fertiggestellt ist."
create-folder: "Ein Verzeichnis erstellen"
folder-name: "Ordnername"
contextmenu:
create-folder: "Ein Verzeichnis erstellen"
upload: "Eine Datei hochladen"
url-upload: "Von einer URL hochladen"
desktop/views/components/home.vue:
done: "完了"
add-widget: "ウィジェットを追加:"
profile: "プロフィール"
calendar: "カレンダー"
timemachine: "カレンダー(タイムマシン)"
activity: "アクティビティ"
rss: "RSSリーダー"
trends: "トレンド"
photostream: "フォトストリーム"
slideshow: "スライドショー"
version: "バージョン"
broadcast: "ブロードキャスト"
notifications: "通知"
users: "おすすめユーザー"
polls: "投票"
post-form: "投稿フォーム"
messaging: "メッセージ"
channel: "チャンネル"
access-log: "アクセスログ"
server: "サーバー情報"
donation: "寄付のお願い"
nav: "ナビゲーション"
tips: "ヒント"
add: "追加"
desktop/views/components/messaging-window.vue:
title: "Nachrichten"
desktop/views/components/notes.note.vue:
reposted-by: "Auch geteilt von"
reply: "Antworten"
renote: "Anmerken"
add-reaction: "Eine Reaktion hinzufügen"
detail: "Zeige Details"
desktop/views/components/notifications.vue:
more: "Mehr"
empty: "Keine Benachrichtigungen"
desktop/views/components/post-form.vue:
note-placeholder: "Was ist bei dir los?"
reply-placeholder: "Antworte auf diese Anmerkung..."
quote-placeholder: "Zitiere diese Anmerkung..."
note: "Post"
reply: "Antworten"
renote: "Anmerkung"
posted: "Gepostet!"
replied: "Geantwortet!"
reposted: "Weitergesagt!"
note-failed: "Anmerkung fehlgeschlagen"
reply-failed: "Antwort fehlgeschlagen"
renote-failed: "Anmerkung fehlgeschlagen"
posting: "Posting"
attach-media-from-local: "Medien von deinem PC hinzufügen"
attach-media-from-drive: "Medien von deinem Speicher hinzufügen"
attach-cancel: "Hinzufügen abbrechen"
insert-a-kao: "v(‘ω’)v"
create-poll: "Eine Abstimmung erstellen"
text-remain: "{} Zeichen verbleibend"
desktop/views/components/post-form-window.vue:
note: "Neue Notiz"
reply: "Antworten"
attaches: "{} Medien hinzugefügt"
uploading-media: "Lade {} Medien hoch"
desktop/views/components/renote-form.vue:
quote: "Zitieren..."
cancel: "Abbrechen"
renote: "Anmerkung"
reposting: "しています..."
success: "Renoteしました"
failure: "Renoteに失敗しました"
desktop/views/components/renote-form-window.vue:
title: "この投稿をRenoteしますか"
desktop/views/components/settings.vue:
profile: "プロフィール"
notification: "通知"
apps: "アプリ"
mute: "ミュート"
drive: "ドライブ"
security: "セキュリティ"
signin: "サインイン履歴"
password: "パスワード"
2fa: "二段階認証"
other: "その他"
license: "ライセンス"
desktop/views/components/settings.2fa.vue:
intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。"
detail: "詳細..."
url: "https://www.google.co.jp/intl/ja/landing/2step/"
caution: "登録したデバイスを紛失するなどした場合、Misskeyにサインインできなくなりますのでご注意ください。"
register: "デバイスを登録する"
already-registered: "既に設定は完了しています。"
unregister: "設定を解除"
unregistered: "二段階認証が無効になりました。"
enter-password: "パスワードを入力してください"
authenticator: "まず、Google Authenticatorをお使いのデバイスにインストールします:"
howtoinstall: "インストール方法はこちら"
scan: "次に、表示されているQRコードをスキャンします:"
done: "お使いのデバイスに表示されているトークンを入力して完了します:"
submit: "完了"
success: "設定が完了しました!"
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
desktop/views/components/settings.api.vue:
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
regenerate-token: "トークンを再生成"
token: "Token:"
enter-password: "パスワードを入力してください"
desktop/views/components/settings.app.vue:
no-apps: "連携しているアプリケーションはありません"
desktop/views/components/settings.mute.vue:
no-users: "ミュートしているユーザーはいません"
desktop/views/components/settings.password.vue:
reset: "パスワードを変更する"
enter-current-password: "現在のパスワードを入力してください"
enter-new-password: "新しいパスワードを入力してください"
enter-new-password-again: "もう一度新しいパスワードを入力してください"
not-match: "新しいパスワードが一致しません"
changed: "パスワードを変更しました"
desktop/views/components/settings.profile.vue:
avatar: "アイコン"
choice-avatar: "画像を選択"
name: "名前"
location: "場所"
description: "自己紹介"
birthday: "誕生日"
save: "Profil aktualisieren"
desktop/views/components/timeline.vue:
home: "Home"
local: "Lokal"
global: "Global"
list: "Listen"
desktop/views/components/ui.header.account.vue:
profile: "Dein Profil"
drive: "Speicher"
favorites: "Favoriten"
lists: "Listen"
customize: "Anpassen"
settings: "Einstellungen"
signout: "Ausloggen"
dark: "Verdunkeln"
desktop/views/components/ui.header.nav.vue:
home: "Home"
messaging: "Nachrichten"
game: "Spielen"
desktop/views/components/ui.header.notifications.vue:
title: "Benachrichtigungen"
desktop/views/components/ui.header.post.vue:
post: "Einen neuen Post erstellen"
desktop/views/components/ui.header.search.vue:
placeholder: "Suchen"
desktop/views/components/user-lists-window.vue:
create-list: "リストを作成"
desktop/views/components/user-preview.vue:
notes: "投稿"
following: "フォロー"
followers: "フォロワー"
desktop/views/components/users-list.vue:
all: "すべて"
iknow: "知り合い"
load-more: "もっと"
fetching: "読み込んでいます"
desktop/views/pages/note.vue:
prev: "Vorheriger Kommentar"
next: "Nächster Kommentar"
desktop/views/pages/selectdrive.vue:
title: "Wähle Datei(en) aus"
ok: "OK"
cancel: "Abbrechen"
upload: "PCからドライブにファイルをアップロード"
desktop/views/pages/user/user.followers-you-know.vue:
title: "知り合いのフォロワー"
loading: "読み込み中"
no-users: "知り合いのフォロワーはいません"
desktop/views/pages/user/user.friends.vue:
title: "よく話すユーザー"
loading: "読み込み中"
no-users: "よく話すユーザーはいません"
desktop/views/pages/user/user.header.vue:
is-suspended: "このユーザーは凍結されています。"
is-remote: "このユーザーはリモートユーザーです。"
view-remote: "正確な情報を見る"
desktop/views/pages/user/user.home.vue:
last-used-at: "最終アクセス"
desktop/views/pages/user/user.photos.vue:
title: "フォト"
loading: "読み込み中"
no-photos: "写真はありません"
desktop/views/pages/user/user.profile.vue:
follows-you: "フォローされています"
stalk: "ストークする"
stalking: "ストーキングしています"
unstalk: "ストーク解除"
mute: "ミュートする"
muted: "ミュートしています"
unmute: "ミュート解除"
desktop/views/widgets/messaging.vue:
title: "メッセージ"
desktop/views/widgets/notifications.vue:
title: "通知"
settings: "通知の設定"
desktop/views/widgets/polls.vue:
title: "投票"
refresh: "他を見る"
nothing: "ありません!"
desktop/views/widgets/post-form.vue:
title: "投稿"
note: "投稿"
placeholder: "いまどうしてる?"
desktop/views/widgets/trends.vue:
title: "トレンド"
refresh: "他を見る"
nothing: "ありません!"
desktop/views/widgets/users.vue:
title: "おすすめユーザー"
refresh: "他を見る"
no-one: "いません!"
desktop/views/widgets/channel.vue:
title: "チャンネル"
settings: "ウィジェットの設定"
get-started: "右上の歯車をクリックして受信するチャンネルを指定してください"
mobile/views/components/drive.vue:
drive: "ドライブ"
used: "使用中"
folder-count: "フォルダ"
count-separator: "、"
file-count: "ファイル"
load-more: "もっと読み込む"
nothing-in-drive: "ドライブには何もありません"
folder-is-empty: "このフォルダは空です"
mobile/views/components/drive-file-chooser.vue:
select-file: "ファイルを選択"
mobile/views/components/drive-folder-chooser.vue:
select-folder: "フォルダーを選択"
mobile/views/components/drive.file-detail.vue:
download: "ダウンロード"
rename: "名前を変更"
move: "移動"
hash: "ハッシュ (md5)"
exif: "EXIF"
mobile/views/components/follow-button.vue:
follow: "フォロー"
unfollow: "フォロー解除"
mobile/views/components/note.vue:
reposted-by: "{}がRenote"
mobile/views/components/note-detail.vue:
reply: "返信"
reaction: "リアクション"
mobile/views/components/notifications.vue:
more: "もっと見る"
empty: "ありません!"
mobile/views/components/post-form.vue:
submit: "投稿"
reply: "返信"
renote: "Renote"
renote-placeholder: "この投稿を引用... (オプション)"
reply-placeholder: "この投稿への返信..."
note-placeholder: "いまどうしてる?"
mobile/views/components/sub-note-content.vue:
media-count: "{}個のメディア"
poll: "投票"
mobile/views/components/timeline.vue:
empty: "投稿がありません"
load-more: "もっと"
mobile/views/components/ui.nav.vue:
home: "ホーム"
notifications: "通知"
messaging: "メッセージ"
search: "検索"
drive: "ドライブ"
settings: "設定"
about: "Misskeyについて"
mobile/views/components/user-timeline.vue:
no-notes: "このユーザーは投稿していないようです。"
no-notes-with-media: "メディア付き投稿はありません。"
load-more: "もっと"
mobile/views/components/users-list.vue:
all: "すべて"
known: "知り合い"
load-more: "もっと"
mobile/views/pages/drive.vue:
drive: "ドライブ"
mobile/views/pages/followers.vue:
followers-of: "{}のフォロワー"
mobile/views/pages/following.vue:
following-of: "{}のフォロー"
mobile/views/pages/home.vue:
timeline: "タイムライン"
mobile/views/pages/messaging.vue:
messaging: "メッセージ"
mobile/views/pages/messaging-room.vue:
messaging: "メッセージ"
mobile/views/pages/note.vue:
title: "投稿"
prev: "前の投稿"
next: "次の投稿"
mobile/views/pages/notifications.vue:
notifications: "通知"
read-all: "すべての通知を既読にしますか?"
mobile/views/pages/profile-setting.vue:
title: "プロフィール設定"
will-be-published: "これらのプロフィールは公開されます。"
name: "名前"
location: "場所"
description: "自己紹介"
birthday: "誕生日"
avatar: "アイコン"
banner: "バナー"
avatar-saved: "アイコンを保存しました"
banner-saved: "バナーを保存しました"
set-avatar: "アイコンを選択する"
set-banner: "バナーを選択する"
save: "保存"
saved: "プロフィールを保存しました"
mobile/views/pages/search.vue:
search: "検索"
empty: "「{}」に関する投稿は見つかりませんでした。"
mobile/views/pages/selectdrive.vue:
select-file: "ファイルを選択"
mobile/views/pages/settings.vue:
signed-in-as: "{}としてサインイン中"
profile: "プロフィール"
twitter: "Twitter連携"
signin-history: "サインイン履歴"
settings: "設定"
signout: "サインアウト"
mobile/views/pages/user.vue:
follows-you: "フォローされています"
following: "フォロー"
followers: "フォロワー"
notes: "投稿"
overview: "概要"
timeline: "タイムライン"
media: "メディア"
is-suspended: "このユーザーは凍結されています。"
is-remote: "このユーザーはリモートユーザーです。"
view-remote: "正確な情報を見る"
mobile/views/pages/user/home.vue:
recent-notes: "最近の投稿"
images: "画像"
activity: "アクティビティ"
keywords: "キーワード"
domains: "頻出ドメイン"
frequently-replied-users: "よく会話するユーザー"
followers-you-know: "知り合いのフォロワー"
last-used-at: "最終ログイン"
mobile/views/pages/user/home.followers-you-know.vue:
loading: "読み込み中"
no-users: "知り合いのユーザーはいません"
mobile/views/pages/user/home.friends.vue:
loading: "読み込み中"
no-users: "よく会話するユーザーはいません"
mobile/views/pages/user/home.notes.vue:
loading: "読み込み中"
no-notes: "投稿はありません"
mobile/views/pages/user/home.photos.vue:
loading: "読み込み中"
no-photos: "写真はありません"
docs:
edit-this-page-on-github: "間違いや改善点を見つけましたか?"
edit-this-page-on-github-link: "このページをGitHubで編集"
api:
entities:
properties: "プロパティ"
endpoints:
params: "パラメータ"
res: "レスポンス"
props:
name: "名前"
type: "型"
optional: "オプション"
description: "説明"
yes: "はい"
no: "いいえ"

View File

@ -1,6 +1,9 @@
---
meta:
lang: "English"
divider: " "
common:
misskey: "Share everything with others using Misskey."
time:
unknown: "unknown"
future: "future"
@ -12,7 +15,6 @@ common:
weeks_ago: "{}week(s) ago"
months_ago: "{}month(s) ago"
years_ago: "{}year(s) ago"
weekday-short:
sunday: "S"
monday: "M"
@ -20,8 +22,7 @@ common:
wednesday: "W"
thursday: "T"
friday: "F"
satruday: "S"
saturday: ""
reactions:
like: "Like"
love: "Love"
@ -32,19 +33,16 @@ common:
angry: "Angry"
confused: "Confused"
pudding: "Pudding"
delete: "Delete"
loading: "Loading"
ok: "OK"
update-available: "A new version of Misskey is now available({newer}, current is {current}). Reload the page to apply the update."
my-token-regenerated: "Your token has been generated. You will now get logged out."
common/views/components/connect-failed.vue:
title: "Unable to connect to the server"
description: "There is a problem either with your internet connection, or the server may be down or under maintenance. Please {try again} later."
thanks: "Thank you for using Misskey."
troubleshoot: "Troubleshoot"
common/views/components/connect-failed.troubleshooter.vue:
title: "Troubleshooting"
network: "Network connection"
@ -64,29 +62,24 @@ common/views/components/connect-failed.troubleshooter.vue:
success-desc: "It seems to be able to connect. Please reload the page."
flush: "Clean cache"
set-version: "Specify version"
common/views/components/messaging.vue:
search-user: "Find an user"
you: "You"
no-history: "No history"
common/views/components/messaging-room.vue:
empty: "No conversations"
more: "More"
no-history: "There is no more history"
resize-form: "Drag to resize"
new-message: "New message"
common/views/components/messaging-room.form.vue:
input-message-here: "Enter message here"
send: "Send"
attach-from-local: "Attach files from your pc"
attach-from-drive: "Attach files from your Drive"
common/views/components/messaging-room.message.vue:
is-read: "Read"
deleted: "This message has been deleted"
common/views/components/nav.vue:
about: "About"
stats: "Stats"
@ -96,12 +89,10 @@ common/views/components/nav.vue:
repository: "Repository"
develop: "Developers"
feedback: "Feedback"
common/views/components/note-menu.vue:
favorite: "Favorite this note"
pin: "Pin to profile page"
remote: "Show on origin"
common/views/components/poll.vue:
vote-to: "Vote for '{}'"
vote-count: "{} votes"
@ -109,24 +100,20 @@ common/views/components/poll.vue:
vote: "Vote"
show-result: "Show results"
voted: "Voted"
common/views/components/poll-editor.vue:
no-only-one-choice: "You need to enter two or more choices."
choice-n: "Choice {}"
remove: "Remove this choice"
add: "+ Add a choice"
destroy: "Destroy this poll"
common/views/components/reaction-picker.vue:
choose-reaction: "Choose a reaction"
common/views/components/signin.vue:
username: "Username"
password: "Password"
token: "Token"
signing-in: "Signing in..."
signin: "Sign in"
common/views/components/signup.vue:
username: "Username"
checking: "Checking..."
@ -148,16 +135,13 @@ common/views/components/signup.vue:
recaptcha: "Verify"
create: "Create an Account"
some-error: "Account creation failed for some reason. Please try again."
common/views/components/special-message.vue:
new-year: "Happy New Year!"
christmas: "Merry Christmas!"
common/views/components/stream-indicator.vue:
connecting: "Connecting"
reconnecting: "Reconnecting"
connected: "Connected"
common/views/components/twitter-setting.vue:
description: "If you connect your Twitter account to your Misskey account, you will be able to see your Twitter account information on your profile and you can sign-in using Twitter."
connected-to: "You are connected to this Twitter account"
@ -165,42 +149,33 @@ common/views/components/twitter-setting.vue:
reconnect: "Reconnect"
connect: "Link your twitter account"
disconnect: "Disconnect"
common/views/components/uploader.vue:
waiting: "Waiting"
common/views/widgets/broadcast.vue:
fetching: "Fetching"
no-broadcasts: "No broadcasts"
have-a-nice-day: "Have a nice day!"
next: "Next"
common/views/widgets/donation.vue:
title: "Donation"
text: "To keep Misskey up and running we spend money for our domain name, servers and so on.. We don't get any money from it, and we would really appreciate it if you could donate. If you're interested contact {}. Thank you for your contribution!"
common/views/widgets/photo-stream.vue:
title: "Photostream"
no-photos: "No photos"
common/views/widgets/server.vue:
title: "Server info"
toggle: "Toggle views"
desktop/views/components/activity.vue:
title: "Activity"
toggle: "Toggle views"
desktop/views/components/calendar.vue:
title: "{1} / {2}"
prev: "Previous month"
next: "Next month"
go: "Click to naviguate"
desktop/views/components/drive-window.vue:
used: "used"
drive: "Drive"
desktop/views/components/drive.file.vue:
avatar: "Avatar"
banner: "Banner"
@ -217,7 +192,6 @@ desktop/views/components/drive.file.vue:
input-new-file-name: "Enter new name"
copied: "Copied"
copied-url-to-clipboard: "Copied URL to clipboard"
desktop/views/components/drive.folder.vue:
unable-to-process: "The operation could not be completed."
circular-reference-detected: "The destination folder is a subfolder of the folder you wish to move."
@ -228,10 +202,8 @@ desktop/views/components/drive.folder.vue:
rename: "Rename"
rename-folder: "Rename folder"
input-new-folder-name: "Enter new name"
desktop/views/components/drive.nav-folder.vue:
drive: "Drive"
desktop/views/components/drive.vue:
search: "Search"
load-more: "Load more"
@ -252,21 +224,42 @@ desktop/views/components/drive.vue:
create-folder: "Create a folder"
upload: "Upload a file"
url-upload: "Upload from a URL"
desktop/views/components/home.vue:
done: "Submit"
add-widget: "Add widget:"
profile: "Profile"
calendar: "Calendar"
timemachine: "Calendar (Time Machine)"
activity: "Activity"
rss: "RSS reader"
trends: "Trends"
photostream: "Photostream"
slideshow: "Slideshow"
version: "Version"
broadcast: "Broadcast"
notifications: "Notifications"
users: "Recommended users"
polls: "Polls"
post-form: "投稿フォーム"
messaging: "Messaging"
channel: "Channel"
access-log: "Access log"
server: "Server info"
donation: "Donation"
nav: "Navigation"
tips: "Tips"
add: "Add"
desktop/views/components/messaging-window.vue:
title: "Messaging"
desktop/views/components/notes.note.vue:
reposted-by: "Reposted by {}"
reply: "Reply"
renote: "Renote"
add-reaction: "Add a reaction"
detail: "Show detail"
desktop/views/components/notifications.vue:
more: "More"
empty: "No notifications"
desktop/views/components/post-form.vue:
note-placeholder: "What's happening?"
reply-placeholder: "Reply to this note..."
@ -287,13 +280,11 @@ desktop/views/components/post-form.vue:
insert-a-kao: "v(‘ω’)v"
create-poll: "Create a poll"
text-remain: "{} chars remaining"
desktop/views/components/post-form-window.vue:
note: "New note"
reply: "Reply"
attaches: "{} media attached"
uploading-media: "Uploading {} media"
desktop/views/components/renote-form.vue:
quote: "Quote..."
cancel: "Cancel"
@ -301,10 +292,8 @@ desktop/views/components/renote-form.vue:
reposting: "Reposting..."
success: "Reposted!"
failure: "Failed to Renote"
desktop/views/components/renote-form-window.vue:
title: "Are you sure you want to renote this note?"
desktop/views/components/settings.vue:
profile: "Profile"
notification: "Notification"
@ -312,11 +301,11 @@ desktop/views/components/settings.vue:
mute: "Mute"
drive: "Drive"
security: "Security"
signin: "Sign in history"
password: "Password"
2fa: "Two-factor authentication"
other: "Other"
license: "License"
desktop/views/components/settings.2fa.vue:
intro: "If you set up 2-step verification, you will need not only a password at sign-in but also a pre-registered physical device (such as your smartphone), which will improve security. "
detail: "See details..."
@ -335,20 +324,17 @@ desktop/views/components/settings.2fa.vue:
success: "Setup completed successfully!"
failed: "Failed to setup. please ensure that the token is correct."
info: "From now on, enter the token that is displayed on your device in addition to your password when signing-in to Misskey."
desktop/views/components/settings.api.vue:
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
caution: "Please do not show this token to third parties (do not enter it somewhere else other than here) otherwise your account could get compromised."
regeneration-of-token: "In the unlikely event that this token leaks out you can regenerate it."
regenerate-token: "Regenerate the token"
token: "Token:"
enter-password: "Please enter the password"
desktop/views/components/settings.app.vue:
no-apps: "No authorized apps"
desktop/views/components/settings.mute.vue:
no-users: "No muted users"
desktop/views/components/settings.password.vue:
reset: "Change your password"
enter-current-password: "Enter the current password"
@ -356,7 +342,6 @@ desktop/views/components/settings.password.vue:
enter-new-password-again: "Enter the new password again"
not-match: "New password doesn't match"
changed: "Password updated successfully"
desktop/views/components/settings.profile.vue:
avatar: "Avatar"
choice-avatar: "Choose an image"
@ -365,7 +350,11 @@ desktop/views/components/settings.profile.vue:
description: "Description"
birthday: "Birthday"
save: "Update profile"
desktop/views/components/timeline.vue:
home: "Home"
local: "Local"
global: "Global"
list: "Lists"
desktop/views/components/ui.header.account.vue:
profile: "Your profile"
drive: "Drive"
@ -375,54 +364,53 @@ desktop/views/components/ui.header.account.vue:
settings: "Settings"
signout: "Sign out"
dark: "Fall in dark"
desktop/views/components/ui.header.nav.vue:
home: "Home"
messaging: "Messages"
game: "Game"
game: "Play Othello"
desktop/views/components/ui.header.notifications.vue:
title: "Notifications"
desktop/views/components/ui.header.post.vue:
post: "Compose new Post"
desktop/views/components/ui.header.search.vue:
placeholder: "Search"
desktop/views/components/user-lists-window.vue:
create-list: "Create list"
desktop/views/components/user-preview.vue:
notes: "Posts"
following: "Following"
followers: "Followers"
desktop/views/components/users-list.vue:
all: "All"
iknow: "You know"
load-more: "More"
fetching: "Loading…"
desktop/views/pages/note.vue:
prev: "Previous note"
next: "Next note"
desktop/views/pages/selectdrive.vue:
title: "Choose file(s)"
ok: "OK"
cancel: "Cancel"
upload: "Upload files from you PC"
desktop/views/pages/user/user.followers-you-know.vue:
title: "Followers you know"
loading: "Loading"
no-users: "No users"
desktop/views/pages/user/user.friends.vue:
title: "Frequently replied"
loading: "Loading"
no-users: "No users"
desktop/views/pages/user/user.header.vue:
is-suspended: "This account has been suspended."
is-remote: "This user is a remote user, so the information is not accurate. "
view-remote: "See accurate information"
desktop/views/pages/user/user.home.vue:
last-used-at: "Last active: "
desktop/views/pages/user/user.photos.vue:
title: "Photos"
loading: "Loading"
no-photos: "No photos"
desktop/views/pages/user/user.profile.vue:
follows-you: "Follows you"
stalk: "Stalk"
@ -431,39 +419,31 @@ desktop/views/pages/user/user.profile.vue:
mute: "Mute"
muted: "Muting"
unmute: "Unmute"
desktop/views/widgets/messaging.vue:
title: "Messaging"
desktop/views/widgets/notifications.vue:
title: "Notifications"
settings: "Settings"
desktop/views/widgets/polls.vue:
title: "Polls"
refresh: "Show others"
nothing: "Nothing"
desktop/views/widgets/post-form.vue:
title: "Post"
note: "Post"
placeholder: "What's happening?"
desktop/views/widgets/trends.vue:
title: "Trend"
refresh: "Show others"
nothing: "Nothing"
desktop/views/widgets/users.vue:
title: "Recommended users"
refresh: "Show others"
no-one: "No one"
desktop/views/widgets/channel.vue:
title: "Channel"
settings: "Widget settings"
get-started: "Please click the cog in the upper right corner to specify a channel"
mobile/views/components/drive.vue:
drive: "Drive"
used: "used"
@ -473,94 +453,75 @@ mobile/views/components/drive.vue:
load-more: "Load more"
nothing-in-drive: "Nothing"
folder-is-empty: "This folder is empty"
mobile/views/components/drive-file-chooser.vue:
select-file: "Choose a file"
mobile/views/components/drive-folder-chooser.vue:
select-folder: "Choose a folder"
mobile/views/components/drive.file-detail.vue:
download: "Download"
rename: "Rename"
move: "Move"
hash: "Hash (md5)"
exif: "EXIF"
mobile/views/components/follow-button.vue:
follow: "Follow"
unfollow: "Unfollow"
mobile/views/components/note.vue:
reposted-by: "Renoted by {}"
mobile/views/components/note-detail.vue:
reply: "Reply"
reaction: "Reaction"
mobile/views/components/notifications.vue:
more: "More"
empty: "No notifications"
mobile/views/components/post-form.vue:
submit: "Post"
reply: "返信"
renote: "Renote"
renote-placeholder: "この投稿を引用... (オプション)"
reply-placeholder: "Reply to this note..."
note-placeholder: "What's happening?"
mobile/views/components/sub-note-content.vue:
media-count: "{} media"
poll: "Poll"
mobile/views/components/timeline.vue:
empty: "No notes"
load-more: "More"
mobile/views/components/ui.nav.vue:
home: "Home"
notifications: "Notifications"
messaging: "Messages"
search: "Search"
drive: "Drive"
settings: "Settings"
about: "About Misskey"
search: "Search"
mobile/views/components/user-timeline.vue:
no-notes: "It seems this user hasn't posted yet"
no-notes-with-media: "There is no notes with attached media"
load-more: "More"
mobile/views/components/users-list.vue:
all: "All"
known: "You know"
load-more: "More"
mobile/views/pages/drive.vue:
drive: "Drive"
mobile/views/pages/followers.vue:
followers-of: "Followers of {}"
mobile/views/pages/following.vue:
following-of: "Following of {}"
mobile/views/pages/home.vue:
timeline: "Timeline"
mobile/views/pages/messaging.vue:
messaging: "Messaging"
mobile/views/pages/messaging-room.vue:
messaging: "Messaging"
mobile/views/pages/note.vue:
title: "Post"
prev: "Previous note"
next: "Next note"
mobile/views/pages/notifications.vue:
notifications: "Notifications"
read-all: "Are you sure you want to mark all unread notifications as read?"
mobile/views/pages/profile-setting.vue:
title: "Profile settings"
will-be-published: "These profile settings will be updated."
@ -576,22 +537,18 @@ mobile/views/pages/profile-setting.vue:
set-banner: "Choose a banner"
save: "Save"
saved: "Profile updated successfully"
mobile/views/pages/search.vue:
search: "Search"
empty: "No posts were found for '{}'"
mobile/views/pages/selectdrive.vue:
select-file: "Choose a file"
mobile/views/pages/settings.vue:
signed-in-as: "Signed in as {}"
profile: "Profile"
twitter-integration: "Twitter integration"
twitter: "Twitter integration"
signin-history: "Sign in history"
settings: "Settings"
signout: "Sign out"
mobile/views/pages/user.vue:
follows-you: "Follows you"
following: "Following"
@ -603,7 +560,6 @@ mobile/views/pages/user.vue:
is-suspended: "This account has been suspended."
is-remote: "This user is a remote user, so the information is not accurate. "
view-remote: "See accurate information"
mobile/views/pages/user/home.vue:
recent-notes: "Recent notes"
images: "Images"
@ -613,27 +569,21 @@ mobile/views/pages/user/home.vue:
frequently-replied-users: "Frequently talking users"
followers-you-know: "Followers you know"
last-used-at: "Last active:"
mobile/views/pages/user/home.followers-you-know.vue:
loading: "Loading"
no-users: "No users"
mobile/views/pages/user/home.friends.vue:
loading: "Loading"
no-users: "No users"
mobile/views/pages/user/home.notes.vue:
loading: "Loading"
no-notes: "No notes"
mobile/views/pages/user/home.photos.vue:
loading: "Loading"
no-photos: "No photos"
docs:
edit-this-page-on-github: "Did you find an error or do you want to contribute to the documentation? "
edit-this-page-on-github-link: "Edit this page on Github!"
api:
entities:
properties: "Properties"

596
locales/es.yml Normal file
View File

@ -0,0 +1,596 @@
---
common:
misskey: "Misskeyで皆と共有しよう。"
time:
unknown: "なぞのじかん"
future: "未来"
just_now: "たった今"
seconds_ago: "{}秒前"
minutes_ago: "{}分前"
hours_ago: "{}時間前"
days_ago: "{}日前"
weeks_ago: "{}週間前"
months_ago: "{}ヶ月前"
years_ago: "{}年前"
weekday-short:
sunday: "日"
monday: "月"
tuesday: "火"
wednesday: "水"
thursday: "木"
friday: "金"
saturday: "土"
reactions:
like: "いいね"
love: "しゅき"
laugh: "笑"
hmm: "ふぅ~む"
surprise: "わお"
congrats: "おめでとう"
angry: "おこ"
confused: "こまこまのこまり"
pudding: "Pudding"
delete: "削除"
loading: "読み込み中"
ok: "わかった"
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
common/views/components/connect-failed.vue:
title: "サーバーに接続できません"
description: "インターネット回線に問題があるか、サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから{再度お試し}ください。"
thanks: "いつもMisskeyをご利用いただきありがとうございます。"
troubleshoot: "トラブルシュート"
common/views/components/connect-failed.troubleshooter.vue:
title: "トラブルシューティング"
network: "ネットワーク接続"
checking-network: "ネットワーク接続を確認中"
internet: "インターネット接続"
checking-internet: "インターネット接続を確認中"
server: "サーバー接続"
checking-server: "サーバー接続を確認中"
finding: "問題を調べています"
no-network: "ネットワークに接続されていません"
no-network-desc: "お使いのPCのネットワーク接続が正常か確認してください。"
no-internet: "インターネットに接続されていません"
no-internet-desc: "ネットワークには接続されていますが、インターネットには接続されていないようです。お使いのPCのインターネット接続が正常か確認してください。"
no-server: "Misskeyのサーバーに接続できません"
no-server-desc: "お使いのPCのインターネット接続は正常ですが、Misskeyのサーバーには接続できませんでした。サーバーがダウンまたはメンテナンスしている可能性があるので、しばらくしてから再度御アクセスください。"
success: "Misskeyのサーバーに接続できました"
success-desc: "正常に接続できるようです。ページを再度読み込みしてください。"
flush: "キャッシュの削除"
set-version: "バージョン指定"
common/views/components/messaging.vue:
search-user: "ユーザーを探す"
you: "あなた"
no-history: "履歴はありません"
common/views/components/messaging-room.vue:
empty: "このユーザーと話したことはありません"
more: "もっと読む"
no-history: "これより過去の履歴はありません"
resize-form: "ドラッグしてフォームの広さを調整"
new-message: "新しいメッセージがあります"
common/views/components/messaging-room.form.vue:
input-message-here: "ここにメッセージを入力"
send: "送信"
attach-from-local: "PCからファイルを添付する"
attach-from-drive: "ドライブからファイルを添付する"
common/views/components/messaging-room.message.vue:
is-read: "既読"
deleted: "このメッセージは削除されました"
common/views/components/nav.vue:
about: "Misskeyについて"
stats: "統計"
status: "ステータス"
wiki: "Wiki"
donors: "ドナー"
repository: "リポジトリ"
develop: "開発者"
feedback: "フィードバック"
common/views/components/note-menu.vue:
favorite: "お気に入り"
pin: "ピン留め"
remote: "投稿元で見る"
common/views/components/poll.vue:
vote-to: "「{}」に投票する"
vote-count: "{}票"
total-users: "{}人が投票"
vote: "投票する"
show-result: "結果を見る"
voted: "投票済み"
common/views/components/poll-editor.vue:
no-only-one-choice: "投票には、選択肢が最低2つ必要です"
choice-n: "選択肢{}"
remove: "この選択肢を削除"
add: "+選択肢を追加"
destroy: "投票を破棄"
common/views/components/reaction-picker.vue:
choose-reaction: "リアクションを選択"
common/views/components/signin.vue:
username: "ユーザー名"
password: "パスワード"
token: "トークン"
signing-in: "やってます..."
signin: "サインイン"
common/views/components/signup.vue:
username: "ユーザー名"
checking: "確認しています..."
available: "利用できます"
unavailable: "既に利用されています"
error: "通信エラー"
invalid-format: "a~z、A~Z、0~9、_が使えます"
too-short: "1文字以上でお願いします"
too-long: "20文字以内でお願いします"
password: "パスワード"
password-placeholder: "8文字以上を推奨します"
weak-password: "弱いパスワード"
normal-password: "まあまあのパスワード"
strong-password: "強いパスワード"
retype: "再入力"
retype-placeholder: "確認のため再入力してください"
password-matched: "確認されました"
password-not-matched: "一致していません"
recaptcha: "認証"
create: "アカウント作成"
some-error: "何らかの原因によりアカウントの作成に失敗しました。再度お試しください。"
common/views/components/special-message.vue:
new-year: "Happy New Year!"
christmas: "Merry Christmas!"
common/views/components/stream-indicator.vue:
connecting: "接続中"
reconnecting: "再接続中"
connected: "接続完了"
common/views/components/twitter-setting.vue:
description: "お使いのTwitterアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでTwitterアカウント情報が表示されるようになったり、Twitterを用いた便利なサインインを利用できるようになります。"
connected-to: "次のTwitterアカウントに接続されています"
detail: "詳細..."
reconnect: "再接続する"
connect: "Twitterと接続する"
disconnect: "切断する"
common/views/components/uploader.vue:
waiting: "待機中"
common/views/widgets/broadcast.vue:
fetching: "確認中"
no-broadcasts: "お知らせはありません"
have-a-nice-day: "良い一日を!"
next: "次"
common/views/widgets/donation.vue:
title: "寄付のお願い"
text: "Misskeyの運営にはドメイン、サーバー等のコストが掛かります。Misskeyは広告を掲載したりしないため、収入を皆様からの寄付に頼っています。もしご興味があれば、{}までご連絡ください。ご協力ありがとうございます。"
common/views/widgets/photo-stream.vue:
title: "フォトストリーム"
no-photos: "写真はありません"
common/views/widgets/server.vue:
title: "サーバー情報"
toggle: "表示を切り替え"
desktop/views/components/activity.vue:
title: "アクティビティ"
toggle: "表示を切り替え"
desktop/views/components/calendar.vue:
title: "{1}年 {2}月"
prev: "前の月"
next: "次の月"
go: "クリックして時間遡行"
desktop/views/components/drive-window.vue:
used: "使用中"
drive: "ドライブ"
desktop/views/components/drive.file.vue:
avatar: "アイコン"
banner: "バナー"
contextmenu:
rename: "名前を変更"
copy-url: "URLをコピー"
download: "ダウンロード"
else-files: "その他..."
set-as-avatar: "アイコンに設定"
set-as-banner: "バナーに設定"
open-in-app: "アプリで開く"
add-app: "アプリを追加"
rename-file: "ファイル名の変更"
input-new-file-name: "新しいファイル名を入力してください"
copied: "コピー完了"
copied-url-to-clipboard: "URLをクリップボードにコピーしました"
desktop/views/components/drive.folder.vue:
unable-to-process: "操作を完了できません"
circular-reference-detected: "移動先のフォルダーは、移動するフォルダーのサブフォルダーです。"
unhandled-error: "不明なエラー"
contextmenu:
move-to-this-folder: "このフォルダへ移動"
show-in-new-window: "新しいウィンドウで表示"
rename: "名前を変更"
rename-folder: "フォルダ名の変更"
input-new-folder-name: "新しいフォルダ名を入力してください"
desktop/views/components/drive.nav-folder.vue:
drive: "ドライブ"
desktop/views/components/drive.vue:
search: "検索"
load-more: "もっと読み込む"
empty-draghover: "ドロップですか?いいですよ、ボクはカワイイですからね"
empty-drive: "ドライブには何もありません。"
empty-drive-description: "右クリックして「ファイルをアップロード」を選んだり、ファイルをドラッグ&ドロップすることでもアップロードできます。"
empty-folder: "このフォルダーは空です"
unable-to-process: "操作を完了できません"
circular-reference-detected: "移動先のフォルダーは、移動するフォルダーのサブフォルダーです。"
unhandled-error: "不明なエラー"
url-upload: "URLアップロード"
url-of-file: "アップロードしたいファイルのURL"
url-upload-requested: "アップロードをリクエストしました"
may-take-time: "アップロードが完了するまで時間がかかる場合があります。"
create-folder: "フォルダー作成"
folder-name: "フォルダー名"
contextmenu:
create-folder: "フォルダーを作成"
upload: "ファイルをアップロード"
url-upload: "URLからアップロード"
desktop/views/components/home.vue:
done: "完了"
add-widget: "ウィジェットを追加:"
profile: "プロフィール"
calendar: "カレンダー"
timemachine: "カレンダー(タイムマシン)"
activity: "アクティビティ"
rss: "RSSリーダー"
trends: "トレンド"
photostream: "フォトストリーム"
slideshow: "スライドショー"
version: "バージョン"
broadcast: "ブロードキャスト"
notifications: "通知"
users: "おすすめユーザー"
polls: "投票"
post-form: "投稿フォーム"
messaging: "メッセージ"
channel: "チャンネル"
access-log: "アクセスログ"
server: "サーバー情報"
donation: "寄付のお願い"
nav: "ナビゲーション"
tips: "ヒント"
add: "追加"
desktop/views/components/messaging-window.vue:
title: "メッセージ"
desktop/views/components/notes.note.vue:
reposted-by: "{}がRenote"
reply: "返信"
renote: "Renote"
add-reaction: "リアクション"
detail: "詳細"
desktop/views/components/notifications.vue:
more: "もっと見る"
empty: "ありません!"
desktop/views/components/post-form.vue:
note-placeholder: "いまどうしてる?"
reply-placeholder: "この投稿への返信..."
quote-placeholder: "この投稿を引用..."
note: "投稿"
reply: "返信"
renote: "Renote"
posted: "投稿しました!"
replied: "返信しました!"
reposted: "Renoteしました"
note-failed: "投稿に失敗しました"
reply-failed: "返信に失敗しました"
renote-failed: "Renoteに失敗しました"
posting: "投稿中"
attach-media-from-local: "PCからメディアを添付"
attach-media-from-drive: "ドライブからメディアを添付"
attach-cancel: "添付取り消し"
insert-a-kao: "v(‘ω’)v"
create-poll: "投票を作成"
text-remain: "残り{}文字"
desktop/views/components/post-form-window.vue:
note: "新規投稿"
reply: "返信"
attaches: "添付: {}メディア"
uploading-media: "{}個のメディアをアップロード中"
desktop/views/components/renote-form.vue:
quote: "引用する..."
cancel: "キャンセル"
renote: "Renote"
reposting: "しています..."
success: "Renoteしました"
failure: "Renoteに失敗しました"
desktop/views/components/renote-form-window.vue:
title: "この投稿をRenoteしますか"
desktop/views/components/settings.vue:
profile: "プロフィール"
notification: "通知"
apps: "アプリ"
mute: "ミュート"
drive: "ドライブ"
security: "セキュリティ"
signin: "サインイン履歴"
password: "パスワード"
2fa: "二段階認証"
other: "その他"
license: "ライセンス"
desktop/views/components/settings.2fa.vue:
intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。"
detail: "詳細..."
url: "https://www.google.co.jp/intl/ja/landing/2step/"
caution: "登録したデバイスを紛失するなどした場合、Misskeyにサインインできなくなりますのでご注意ください。"
register: "デバイスを登録する"
already-registered: "既に設定は完了しています。"
unregister: "設定を解除"
unregistered: "二段階認証が無効になりました。"
enter-password: "パスワードを入力してください"
authenticator: "まず、Google Authenticatorをお使いのデバイスにインストールします:"
howtoinstall: "インストール方法はこちら"
scan: "次に、表示されているQRコードをスキャンします:"
done: "お使いのデバイスに表示されているトークンを入力して完了します:"
submit: "完了"
success: "設定が完了しました!"
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
desktop/views/components/settings.api.vue:
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
regenerate-token: "トークンを再生成"
token: "Token:"
enter-password: "パスワードを入力してください"
desktop/views/components/settings.app.vue:
no-apps: "連携しているアプリケーションはありません"
desktop/views/components/settings.mute.vue:
no-users: "ミュートしているユーザーはいません"
desktop/views/components/settings.password.vue:
reset: "パスワードを変更する"
enter-current-password: "現在のパスワードを入力してください"
enter-new-password: "新しいパスワードを入力してください"
enter-new-password-again: "もう一度新しいパスワードを入力してください"
not-match: "新しいパスワードが一致しません"
changed: "パスワードを変更しました"
desktop/views/components/settings.profile.vue:
avatar: "アイコン"
choice-avatar: "画像を選択"
name: "名前"
location: "場所"
description: "自己紹介"
birthday: "誕生日"
save: "保存"
desktop/views/components/timeline.vue:
home: "ホーム"
local: "ローカル"
global: "グローバル"
list: "リスト"
desktop/views/components/ui.header.account.vue:
profile: "プロフィール"
drive: "ドライブ"
favorites: "お気に入り"
lists: "リスト"
customize: "カスタマイズ"
settings: "設定"
signout: "サインアウト"
dark: "闇に飲まれる"
desktop/views/components/ui.header.nav.vue:
home: "ホーム"
messaging: "メッセージ"
game: "ゲーム"
desktop/views/components/ui.header.notifications.vue:
title: "通知"
desktop/views/components/ui.header.post.vue:
post: "新規投稿"
desktop/views/components/ui.header.search.vue:
placeholder: "検索"
desktop/views/components/user-lists-window.vue:
create-list: "リストを作成"
desktop/views/components/user-preview.vue:
notes: "投稿"
following: "フォロー"
followers: "フォロワー"
desktop/views/components/users-list.vue:
all: "すべて"
iknow: "知り合い"
load-more: "もっと"
fetching: "読み込んでいます"
desktop/views/pages/note.vue:
prev: "前の投稿"
next: "次の投稿"
desktop/views/pages/selectdrive.vue:
title: "ファイルを選択してください"
ok: "決定"
cancel: "キャンセル"
upload: "PCからドライブにファイルをアップロード"
desktop/views/pages/user/user.followers-you-know.vue:
title: "知り合いのフォロワー"
loading: "読み込み中"
no-users: "知り合いのフォロワーはいません"
desktop/views/pages/user/user.friends.vue:
title: "よく話すユーザー"
loading: "読み込み中"
no-users: "よく話すユーザーはいません"
desktop/views/pages/user/user.header.vue:
is-suspended: "このユーザーは凍結されています。"
is-remote: "このユーザーはリモートユーザーです。"
view-remote: "正確な情報を見る"
desktop/views/pages/user/user.home.vue:
last-used-at: "最終アクセス"
desktop/views/pages/user/user.photos.vue:
title: "フォト"
loading: "読み込み中"
no-photos: "写真はありません"
desktop/views/pages/user/user.profile.vue:
follows-you: "フォローされています"
stalk: "ストークする"
stalking: "ストーキングしています"
unstalk: "ストーク解除"
mute: "ミュートする"
muted: "ミュートしています"
unmute: "ミュート解除"
desktop/views/widgets/messaging.vue:
title: "メッセージ"
desktop/views/widgets/notifications.vue:
title: "通知"
settings: "通知の設定"
desktop/views/widgets/polls.vue:
title: "投票"
refresh: "他を見る"
nothing: "ありません!"
desktop/views/widgets/post-form.vue:
title: "投稿"
note: "投稿"
placeholder: "いまどうしてる?"
desktop/views/widgets/trends.vue:
title: "トレンド"
refresh: "他を見る"
nothing: "ありません!"
desktop/views/widgets/users.vue:
title: "おすすめユーザー"
refresh: "他を見る"
no-one: "いません!"
desktop/views/widgets/channel.vue:
title: "チャンネル"
settings: "ウィジェットの設定"
get-started: "右上の歯車をクリックして受信するチャンネルを指定してください"
mobile/views/components/drive.vue:
drive: "ドライブ"
used: "使用中"
folder-count: "フォルダ"
count-separator: "、"
file-count: "ファイル"
load-more: "もっと読み込む"
nothing-in-drive: "ドライブには何もありません"
folder-is-empty: "このフォルダは空です"
mobile/views/components/drive-file-chooser.vue:
select-file: "ファイルを選択"
mobile/views/components/drive-folder-chooser.vue:
select-folder: "フォルダーを選択"
mobile/views/components/drive.file-detail.vue:
download: "ダウンロード"
rename: "名前を変更"
move: "移動"
hash: "ハッシュ (md5)"
exif: "EXIF"
mobile/views/components/follow-button.vue:
follow: "フォロー"
unfollow: "フォロー解除"
mobile/views/components/note.vue:
reposted-by: "{}がRenote"
mobile/views/components/note-detail.vue:
reply: "返信"
reaction: "リアクション"
mobile/views/components/notifications.vue:
more: "もっと見る"
empty: "ありません!"
mobile/views/components/post-form.vue:
submit: "投稿"
reply: "返信"
renote: "Renote"
renote-placeholder: "この投稿を引用... (オプション)"
reply-placeholder: "この投稿への返信..."
note-placeholder: "いまどうしてる?"
mobile/views/components/sub-note-content.vue:
media-count: "{}個のメディア"
poll: "投票"
mobile/views/components/timeline.vue:
empty: "投稿がありません"
load-more: "もっと"
mobile/views/components/ui.nav.vue:
home: "ホーム"
notifications: "通知"
messaging: "メッセージ"
search: "検索"
drive: "ドライブ"
settings: "設定"
about: "Misskeyについて"
mobile/views/components/user-timeline.vue:
no-notes: "このユーザーは投稿していないようです。"
no-notes-with-media: "メディア付き投稿はありません。"
load-more: "もっと"
mobile/views/components/users-list.vue:
all: "すべて"
known: "知り合い"
load-more: "もっと"
mobile/views/pages/drive.vue:
drive: "ドライブ"
mobile/views/pages/followers.vue:
followers-of: "{}のフォロワー"
mobile/views/pages/following.vue:
following-of: "{}のフォロー"
mobile/views/pages/home.vue:
timeline: "タイムライン"
mobile/views/pages/messaging.vue:
messaging: "メッセージ"
mobile/views/pages/messaging-room.vue:
messaging: "メッセージ"
mobile/views/pages/note.vue:
title: "投稿"
prev: "前の投稿"
next: "次の投稿"
mobile/views/pages/notifications.vue:
notifications: "通知"
read-all: "すべての通知を既読にしますか?"
mobile/views/pages/profile-setting.vue:
title: "プロフィール設定"
will-be-published: "これらのプロフィールは公開されます。"
name: "名前"
location: "場所"
description: "自己紹介"
birthday: "誕生日"
avatar: "アイコン"
banner: "バナー"
avatar-saved: "アイコンを保存しました"
banner-saved: "バナーを保存しました"
set-avatar: "アイコンを選択する"
set-banner: "バナーを選択する"
save: "保存"
saved: "プロフィールを保存しました"
mobile/views/pages/search.vue:
search: "検索"
empty: "「{}」に関する投稿は見つかりませんでした。"
mobile/views/pages/selectdrive.vue:
select-file: "ファイルを選択"
mobile/views/pages/settings.vue:
signed-in-as: "{}としてサインイン中"
profile: "プロフィール"
twitter: "Twitter連携"
signin-history: "サインイン履歴"
settings: "設定"
signout: "サインアウト"
mobile/views/pages/user.vue:
follows-you: "フォローされています"
following: "フォロー"
followers: "フォロワー"
notes: "投稿"
overview: "概要"
timeline: "タイムライン"
media: "メディア"
is-suspended: "このユーザーは凍結されています。"
is-remote: "このユーザーはリモートユーザーです。"
view-remote: "正確な情報を見る"
mobile/views/pages/user/home.vue:
recent-notes: "最近の投稿"
images: "画像"
activity: "アクティビティ"
keywords: "キーワード"
domains: "頻出ドメイン"
frequently-replied-users: "よく会話するユーザー"
followers-you-know: "知り合いのフォロワー"
last-used-at: "最終ログイン"
mobile/views/pages/user/home.followers-you-know.vue:
loading: "読み込み中"
no-users: "知り合いのユーザーはいません"
mobile/views/pages/user/home.friends.vue:
loading: "読み込み中"
no-users: "よく会話するユーザーはいません"
mobile/views/pages/user/home.notes.vue:
loading: "読み込み中"
no-notes: "投稿はありません"
mobile/views/pages/user/home.photos.vue:
loading: "読み込み中"
no-photos: "写真はありません"
docs:
edit-this-page-on-github: "間違いや改善点を見つけましたか?"
edit-this-page-on-github-link: "このページをGitHubで編集"
api:
entities:
properties: "プロパティ"
endpoints:
params: "パラメータ"
res: "レスポンス"
props:
name: "名前"
type: "型"
optional: "オプション"
description: "説明"
yes: "はい"
no: "いいえ"

View File

@ -1,6 +1,6 @@
---
common:
misskey: "Partagez avec les autres en utilisant Misskey"
time:
unknown: "inconnu"
future: "future"
@ -12,7 +12,6 @@ common:
weeks_ago: "Il y a{}semaines(s)"
months_ago: "Il y a {}mois"
years_ago: "Il y a {}an(s)"
weekday-short:
sunday: "D"
monday: "L"
@ -20,8 +19,7 @@ common:
wednesday: "M"
thursday: "J"
friday: "V"
satruday: "S"
saturday: ""
reactions:
like: "Aime"
love: "Adore"
@ -32,19 +30,16 @@ common:
angry: "En Colère"
confused: "Confus"
pudding: "Pudding"
delete: "Supprimer"
loading: "Chargement"
ok: "OK"
update-available: "Une nouvelle version de Misskey est disponible({newer}, version actuelle: {current}). Recharger la page pour appliquer la mise à jour."
my-token-regenerated: "Votre token vient d'être généré, vous allez maintenant être déconnecté."
common/views/components/connect-failed.vue:
title: "Impossible de se connecter au server."
description: "Il y a soit un problème avec votre connexion internet, soit le serveur est hors-ligne ou en maintenance. Veuillez {ressayer} plus tard."
thanks: "On vous remercie d'utiliser Misskey."
troubleshoot: "dépanner"
common/views/components/connect-failed.troubleshooter.vue:
title: "Dépannage"
network: "Connexion au réseau"
@ -64,29 +59,24 @@ common/views/components/connect-failed.troubleshooter.vue:
success-desc: "La connexion au serveur a été reussie. Veuillez recharger la page."
flush: "キャッシュの削除"
set-version: "バージョン指定"
common/views/components/messaging.vue:
search-user: "Trouver un utilisateur"
you: "Vous"
no-history: "Pas d'historique"
common/views/components/messaging-room.vue:
empty: "Pas de conversations"
more: "Voir Plus"
no-history: "Il n'y a pas plus d'historique"
resize-form: "Faites glisser pour redimensionner"
new-message: "Nouveau message"
common/views/components/messaging-room.form.vue:
input-message-here: "Tapez ici votre message"
send: "Envoyer"
attach-from-local: "Joindre un fichier depuis votre PC"
attach-from-drive: "Joindre un fichier depuis votre Drive"
common/views/components/messaging-room.message.vue:
is-read: "Lu"
deleted: "Ce message a été supprimé"
common/views/components/nav.vue:
about: "À propos"
stats: "Stats"
@ -96,12 +86,10 @@ common/views/components/nav.vue:
repository: "Repo"
develop: "Développeurs"
feedback: "フィードバック"
common/views/components/note-menu.vue:
favorite: "Favorite this note"
pin: "Épingler sur votre profile"
remote: "投稿元で見る"
common/views/components/poll.vue:
vote-to: "Voter pour '{}'"
vote-count: "{} votes"
@ -109,24 +97,20 @@ common/views/components/poll.vue:
vote: "Vote"
show-result: "Montrer les résultats"
voted: "Voté"
common/views/components/poll-editor.vue:
no-only-one-choice: "Vous devez entrer au moins deux choix"
choice-n: "Choix {}"
remove: "Supprimer ce choix"
add: "+ Ajouter un choix"
destroy: "Supprimer ce sondage"
common/views/components/reaction-picker.vue:
choose-reaction: "Choisissez votre réaction"
common/views/components/signin.vue:
username: "Nom d'utilisateur"
password: "Mot de passe"
token: "Token"
signing-in: "Connexion...."
signin: "Se connecter"
common/views/components/signup.vue:
username: "Nom d'utilisateur"
checking: "Vérification"
@ -148,16 +132,13 @@ common/views/components/signup.vue:
recaptcha: "Vérifier"
create: "Créer un compte"
some-error: "La création de compte a échoué. Veuillez ressayer."
common/views/components/special-message.vue:
new-year: "Bonne année!"
christmas: "Joyeux Noël!"
common/views/components/stream-indicator.vue:
connecting: "Connexion en cours"
reconnecting: "Re-connexion en cours"
connected: "Connecté"
common/views/components/twitter-setting.vue:
description: "Si vous liez votre compte Twitter à votre compte Misskey, vous verrez ensuite votre compte Twitter s'afficher sur votre profile, vous aurez aussi la possibilité de vous connecter à Misskey en utilisant votre compte Twitter."
connected-to: "Vous êtes connecté à ce compte"
@ -165,42 +146,33 @@ common/views/components/twitter-setting.vue:
reconnect: "Reconnecter"
connect: "Lier votre compte Twitter"
disconnect: "Deconnecter"
common/views/components/uploader.vue:
waiting: "En attente"
common/views/widgets/broadcast.vue:
fetching: "Récuperation"
no-broadcasts: "No broadcasts"
have-a-nice-day: "Passez une bonne journée!"
next: "Suivant"
common/views/widgets/donation.vue:
title: "Dons"
text: "Toutes les depences pour couvrir les frais de Misskey sortent directement de notre poche. Nous ne recevons pas d'argent, si vous pouvez nous faire dons d'argent, on vous serait eternellement reconnaissant. Si vous êtes intéressés veuilles contacter {}. Merci pour votre contribution!"
common/views/widgets/photo-stream.vue:
title: "Flux de photo"
no-photos: "Pas de photos"
common/views/widgets/server.vue:
title: "Info sur le serveur"
toggle: "Afficher les vues"
desktop/views/components/activity.vue:
title: "Activitié"
toggle: "Afficher les vues"
desktop/views/components/calendar.vue:
title: "{1} / {2}"
prev: "Mois dernier"
next: "Mois prochain"
go: "Cliquer pour naviguer"
desktop/views/components/drive-window.vue:
used: "utilisé"
drive: "Drive"
desktop/views/components/drive.file.vue:
avatar: "Avatar"
banner: "Bannière"
@ -217,7 +189,6 @@ desktop/views/components/drive.file.vue:
input-new-file-name: "Entrer un nouveau nom"
copied: "Copied"
copied-url-to-clipboard: "L'URL a été copié dans le presse-papier"
desktop/views/components/drive.folder.vue:
unable-to-process: "L'opération n'a pas pu être complétée"
circular-reference-detected: "Le dossier de destination est un sous-dossier du dossier que vous souhaitez déplacer."
@ -228,10 +199,8 @@ desktop/views/components/drive.folder.vue:
rename: "Renommer"
rename-folder: "Renommer le dossier"
input-new-folder-name: "Entrer un nouveau nom"
desktop/views/components/drive.nav-folder.vue:
drive: "Drive"
desktop/views/components/drive.vue:
search: "Rechercher"
load-more: "Afficher plus"
@ -252,21 +221,42 @@ desktop/views/components/drive.vue:
create-folder: "Créer un dossier"
upload: "Uploader un fichier"
url-upload: "Uploader d'un URL"
desktop/views/components/home.vue:
done: "完了"
add-widget: "ウィジェットを追加:"
profile: "プロフィール"
calendar: "カレンダー"
timemachine: "カレンダー(タイムマシン)"
activity: "アクティビティ"
rss: "RSSリーダー"
trends: "トレンド"
photostream: "フォトストリーム"
slideshow: "スライドショー"
version: "バージョン"
broadcast: "ブロードキャスト"
notifications: "通知"
users: "おすすめユーザー"
polls: "投票"
post-form: "投稿フォーム"
messaging: "メッセージ"
channel: "チャンネル"
access-log: "アクセスログ"
server: "サーバー情報"
donation: "寄付のお願い"
nav: "ナビゲーション"
tips: "ヒント"
add: "追加"
desktop/views/components/messaging-window.vue:
title: "Messagerie"
desktop/views/components/notes.note.vue:
reposted-by: "Reposté par {}"
reply: "Répondre"
renote: "Renote"
add-reaction: "Ajouter votre reaction"
detail: "Afficher les détails"
desktop/views/components/notifications.vue:
more: "Plus"
empty: "Pas de notifications"
desktop/views/components/post-form.vue:
note-placeholder: "Qu'est-ce qui se passe?"
reply-placeholder: "Répondre à cette note"
@ -287,13 +277,11 @@ desktop/views/components/post-form.vue:
insert-a-kao: "v(‘ω’)v"
create-poll: "Créer un sondage"
text-remain: "{} charactères restants"
desktop/views/components/post-form-window.vue:
note: "Nouvelle note"
reply: "Répondre"
attaches: "{} media joint(s)"
uploading-media: "Upload du media {}"
desktop/views/components/renote-form.vue:
quote: "Citer..."
cancel: "Annuler"
@ -301,10 +289,8 @@ desktop/views/components/renote-form.vue:
reposting: "Repost en cours..."
success: "Reposté!"
failure: "La renote a échoué"
desktop/views/components/renote-form-window.vue:
title: "Êtes vous sûr de vouloir renote cette note?"
desktop/views/components/settings.vue:
profile: "Profil"
notification: "Notification"
@ -312,11 +298,11 @@ desktop/views/components/settings.vue:
mute: "Mettre en sourdine"
drive: "Drive"
security: "Sécurité"
signin: "サインイン履歴"
password: "Mot de Passe"
2fa: "Vérification en deux étapes"
other: "Autres"
license: "License"
desktop/views/components/settings.2fa.vue:
intro: "Si vous configurez la vérication en deux étapes vous aurez non seulement besoin de votre mot de passe mais aussi un appareil déjà pré-enregistré(tel que votre smartphone) ce qui ameliora grandement la sécurité de votre compte."
detail: "Voir les détails..."
@ -335,20 +321,17 @@ desktop/views/components/settings.2fa.vue:
success: "L'operation a été complétée avec succès!"
failed: "L'operation a échoué. Veuillez vous assurer que le token a été entrer correctement."
info: "À partir de maintenant, à chaque fois que vous vous connecter entrez votre mot de passe ainsi que le token généré sur votre appareil."
desktop/views/components/settings.api.vue:
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
regenerate-token: "Regenerer le token"
token: "Token:"
enter-password: "Veuillez entrer le mot de passe"
desktop/views/components/settings.app.vue:
no-apps: "Aucune application authorisée"
desktop/views/components/settings.mute.vue:
no-users: "Aucun utilisateurs mis en sourdine"
desktop/views/components/settings.password.vue:
reset: "Changer votre mot de passe"
enter-current-password: "Entrez votre mot de passe actuel"
@ -356,7 +339,6 @@ desktop/views/components/settings.password.vue:
enter-new-password-again: "Entrez à nouveau le nouveau mot de passe"
not-match: "Le nouveau mot de passe ne correspond pas."
changed: "Mot de passe modifié avec succès"
desktop/views/components/settings.profile.vue:
avatar: "Avatar"
choice-avatar: "Choose an image"
@ -365,7 +347,11 @@ desktop/views/components/settings.profile.vue:
description: "Description"
birthday: "Date de naissance"
save: "Mettre à jour le profil"
desktop/views/components/timeline.vue:
home: "ホーム"
local: "ローカル"
global: "グローバル"
list: "リスト"
desktop/views/components/ui.header.account.vue:
profile: "Votre profil"
drive: "Drive"
@ -375,54 +361,53 @@ desktop/views/components/ui.header.account.vue:
settings: "Réglages"
signout: "Déconnexion"
dark: "Fall in dark"
desktop/views/components/ui.header.nav.vue:
home: "Accueil"
messaging: "Messages"
game: "Jeux"
desktop/views/components/ui.header.notifications.vue:
title: "Notifications"
desktop/views/components/ui.header.post.vue:
post: "Composer un nouveau post"
desktop/views/components/ui.header.search.vue:
placeholder: "Chercher"
desktop/views/components/user-lists-window.vue:
create-list: "リストを作成"
desktop/views/components/user-preview.vue:
notes: "投稿"
following: "フォロー"
followers: "フォロワー"
desktop/views/components/users-list.vue:
all: "すべて"
iknow: "知り合い"
load-more: "もっと"
fetching: "読み込んでいます"
desktop/views/pages/note.vue:
prev: "Note précédente"
next: "Note suivante"
desktop/views/pages/selectdrive.vue:
title: "Choisir fichier(s)"
ok: "OK"
cancel: "Annuler"
upload: "Uploader un ou plusieurs fichier(s) depuis votre PC"
desktop/views/pages/user/user.followers-you-know.vue:
title: "Abonnés que vous connaissez"
loading: "Chargement en cours"
no-users: "Pas d'utilisateurs"
desktop/views/pages/user/user.friends.vue:
title: "Personnes qui répondent le plus"
loading: "Chargement en cours"
no-users: "Pas d'utilisateurs"
desktop/views/pages/user/user.header.vue:
is-suspended: "This account has been suspended."
is-remote: "Cet utilisateur n'est pas un utilisateur de Misskey. Certaines informations peuvent être erronées "
view-remote: "Voir les informations détaillées"
desktop/views/pages/user/user.home.vue:
last-used-at: "Last used at"
desktop/views/pages/user/user.photos.vue:
title: "Photos"
loading: "Chargement en cours"
no-photos: "Pas de photos"
desktop/views/pages/user/user.profile.vue:
follows-you: "Vous suis"
stalk: "ストークする"
@ -431,39 +416,31 @@ desktop/views/pages/user/user.profile.vue:
mute: "Mettre en sourdine"
muted: "Muting"
unmute: "Enlever la sourdine"
desktop/views/widgets/messaging.vue:
title: "Messagerie"
desktop/views/widgets/notifications.vue:
title: "Notifications"
settings: "Réglages"
desktop/views/widgets/polls.vue:
title: "Sondages"
refresh: "Afficher d'autres"
nothing: "Rien"
desktop/views/widgets/post-form.vue:
title: "Post"
note: "Post"
placeholder: "Qu'est-ce qu'il se passe?"
desktop/views/widgets/trends.vue:
title: "Tendances"
refresh: "Afficher d'autres"
nothing: "Rien"
desktop/views/widgets/users.vue:
title: "Utilisateurs"
refresh: "Afficher d'autres"
no-one: "Personne"
desktop/views/widgets/channel.vue:
title: "Cannal"
settings: "Réglages des widgets"
get-started: "Veuillez cliquer sur la dent en haute à droite pour choisir un channel"
mobile/views/components/drive.vue:
drive: "Drive"
used: "utilisé"
@ -473,94 +450,75 @@ mobile/views/components/drive.vue:
load-more: "Charger plus"
nothing-in-drive: "Rien"
folder-is-empty: "Ce dossier est vide"
mobile/views/components/drive-file-chooser.vue:
select-file: "Choisissez un fichier"
mobile/views/components/drive-folder-chooser.vue:
select-folder: "Choisissez un dossier"
mobile/views/components/drive.file-detail.vue:
download: "Télécharger"
rename: "Renommer"
move: "Déplacer"
hash: "Hash (md5)"
exif: "EXIF"
mobile/views/components/follow-button.vue:
follow: "Suivre"
unfollow: "Ne plus suivre"
mobile/views/components/note.vue:
reposted-by: "Renoté par {}"
mobile/views/components/note-detail.vue:
reply: "Répondre"
reaction: "Réaction"
mobile/views/components/notifications.vue:
more: "Plus"
empty: "Pas de notifications"
mobile/views/components/post-form.vue:
submit: "Poster"
reply: "返信"
renote: "Renote"
renote-placeholder: "この投稿を引用... (オプション)"
reply-placeholder: "Répondre à cette note"
note-placeholder: "Qu'est-ce qu'il se passe?"
mobile/views/components/sub-note-content.vue:
media-count: "{} media"
poll: "Sondage"
mobile/views/components/timeline.vue:
empty: "Pas de notes"
load-more: "Afficher plus"
mobile/views/components/ui.nav.vue:
home: "Accueil"
notifications: "Notifications"
messaging: "Messages"
search: "Rechercher"
drive: "Drive"
settings: "Réglages"
about: "À propose de Misskey"
search: "Rechercher"
mobile/views/components/user-timeline.vue:
no-notes: "Cette utilisateur semble n'avoir rien poster pour le moment"
no-notes-with-media: "Aucune notes avec des médias"
load-more: "Afficher Plus"
mobile/views/components/users-list.vue:
all: "Tout"
known: "Vous connaissez"
load-more: "Afficher plus"
mobile/views/pages/drive.vue:
drive: "Drive"
mobile/views/pages/followers.vue:
followers-of: "Abonnés de {}"
mobile/views/pages/following.vue:
following-of: "Abonnements de {}"
mobile/views/pages/home.vue:
timeline: "Fil d'actualité"
mobile/views/pages/messaging.vue:
messaging: "Messagerie"
mobile/views/pages/messaging-room.vue:
messaging: "Messagerie"
mobile/views/pages/note.vue:
title: "Post"
prev: "Note précedante"
next: "Note suivante"
mobile/views/pages/notifications.vue:
notifications: "Notifications"
read-all: "Êtes vous sûr de vouloir marqués toutes les notifications non-lus en tant que lus?"
mobile/views/pages/profile-setting.vue:
title: "Réglages du profiles"
will-be-published: "Ces profiles vont être publier"
@ -576,22 +534,18 @@ mobile/views/pages/profile-setting.vue:
set-banner: "Choisir une bannière"
save: "Sauvegarder"
saved: "Profil mis à jour avec succès"
mobile/views/pages/search.vue:
search: "Chercher"
empty: "Aucun message trouvé pour '{}' "
mobile/views/pages/selectdrive.vue:
select-file: "Choisissez un fichier"
mobile/views/pages/settings.vue:
signed-in-as: "Connecté en tant que {}"
profile: "Profile"
twitter-integration: "Twitter integration"
twitter: "Twitter連携"
signin-history: "Historique de connexion"
settings: "Réglages"
signout: "Déconnexion"
mobile/views/pages/user.vue:
follows-you: "vous suit"
following: "Abonnements"
@ -603,7 +557,6 @@ mobile/views/pages/user.vue:
is-suspended: "This account has been suspended."
is-remote: "Cet utilisateur n'est pas un utilisateur de Misskey. Certaines informations peuvent être erronées "
view-remote: "Voir les informations détaillées"
mobile/views/pages/user/home.vue:
recent-notes: "Notes récentes"
images: "Images"
@ -613,27 +566,21 @@ mobile/views/pages/user/home.vue:
frequently-replied-users: "Utilisateurs qui interagissent souvent"
followers-you-know: "Abonnés que vous connaissez"
last-used-at: "Dernière connexion il y a"
mobile/views/pages/user/home.followers-you-know.vue:
loading: "Chargement"
no-users: "Pas d'utilisateurs"
mobile/views/pages/user/home.friends.vue:
loading: "Chargement"
no-users: "Pass d'utilisateurs"
mobile/views/pages/user/home.notes.vue:
loading: "Chargement"
no-notes: "Pas de notes"
mobile/views/pages/user/home.photos.vue:
loading: "Chargement"
no-photos: "Pas de photos"
docs:
edit-this-page-on-github: "Vous avez trouvé une erreur ou vous voulez contribuer à la documentation?"
edit-this-page-on-github-link: "Modifiez cette page sur github!"
api:
entities:
properties: "Propriétés"

View File

@ -11,9 +11,11 @@ const loadLang = lang => yaml.safeLoad(
const native = loadLang('ja');
const langs = {
'de': loadLang('de'),
'en': loadLang('en'),
'fr': loadLang('fr'),
'ja': native
'ja': native,
'pl': loadLang('pl')
};
Object.entries(langs).map(([, locale]) => {

596
locales/it.yml Normal file
View File

@ -0,0 +1,596 @@
---
common:
misskey: "Misskeyで皆と共有しよう。"
time:
unknown: "なぞのじかん"
future: "未来"
just_now: "たった今"
seconds_ago: "{}秒前"
minutes_ago: "{}分前"
hours_ago: "{}時間前"
days_ago: "{}日前"
weeks_ago: "{}週間前"
months_ago: "{}ヶ月前"
years_ago: "{}年前"
weekday-short:
sunday: "日"
monday: "月"
tuesday: "火"
wednesday: "水"
thursday: "木"
friday: "金"
saturday: "土"
reactions:
like: "いいね"
love: "しゅき"
laugh: "笑"
hmm: "ふぅ~む"
surprise: "わお"
congrats: "おめでとう"
angry: "おこ"
confused: "こまこまのこまり"
pudding: "Pudding"
delete: "削除"
loading: "読み込み中"
ok: "わかった"
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
common/views/components/connect-failed.vue:
title: "サーバーに接続できません"
description: "インターネット回線に問題があるか、サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから{再度お試し}ください。"
thanks: "いつもMisskeyをご利用いただきありがとうございます。"
troubleshoot: "トラブルシュート"
common/views/components/connect-failed.troubleshooter.vue:
title: "トラブルシューティング"
network: "ネットワーク接続"
checking-network: "ネットワーク接続を確認中"
internet: "インターネット接続"
checking-internet: "インターネット接続を確認中"
server: "サーバー接続"
checking-server: "サーバー接続を確認中"
finding: "問題を調べています"
no-network: "ネットワークに接続されていません"
no-network-desc: "お使いのPCのネットワーク接続が正常か確認してください。"
no-internet: "インターネットに接続されていません"
no-internet-desc: "ネットワークには接続されていますが、インターネットには接続されていないようです。お使いのPCのインターネット接続が正常か確認してください。"
no-server: "Misskeyのサーバーに接続できません"
no-server-desc: "お使いのPCのインターネット接続は正常ですが、Misskeyのサーバーには接続できませんでした。サーバーがダウンまたはメンテナンスしている可能性があるので、しばらくしてから再度御アクセスください。"
success: "Misskeyのサーバーに接続できました"
success-desc: "正常に接続できるようです。ページを再度読み込みしてください。"
flush: "キャッシュの削除"
set-version: "バージョン指定"
common/views/components/messaging.vue:
search-user: "ユーザーを探す"
you: "あなた"
no-history: "履歴はありません"
common/views/components/messaging-room.vue:
empty: "このユーザーと話したことはありません"
more: "もっと読む"
no-history: "これより過去の履歴はありません"
resize-form: "ドラッグしてフォームの広さを調整"
new-message: "新しいメッセージがあります"
common/views/components/messaging-room.form.vue:
input-message-here: "ここにメッセージを入力"
send: "送信"
attach-from-local: "PCからファイルを添付する"
attach-from-drive: "ドライブからファイルを添付する"
common/views/components/messaging-room.message.vue:
is-read: "既読"
deleted: "このメッセージは削除されました"
common/views/components/nav.vue:
about: "Misskeyについて"
stats: "統計"
status: "ステータス"
wiki: "Wiki"
donors: "ドナー"
repository: "リポジトリ"
develop: "開発者"
feedback: "フィードバック"
common/views/components/note-menu.vue:
favorite: "お気に入り"
pin: "ピン留め"
remote: "投稿元で見る"
common/views/components/poll.vue:
vote-to: "「{}」に投票する"
vote-count: "{}票"
total-users: "{}人が投票"
vote: "投票する"
show-result: "結果を見る"
voted: "投票済み"
common/views/components/poll-editor.vue:
no-only-one-choice: "投票には、選択肢が最低2つ必要です"
choice-n: "選択肢{}"
remove: "この選択肢を削除"
add: "+選択肢を追加"
destroy: "投票を破棄"
common/views/components/reaction-picker.vue:
choose-reaction: "リアクションを選択"
common/views/components/signin.vue:
username: "ユーザー名"
password: "パスワード"
token: "トークン"
signing-in: "やってます..."
signin: "サインイン"
common/views/components/signup.vue:
username: "ユーザー名"
checking: "確認しています..."
available: "利用できます"
unavailable: "既に利用されています"
error: "通信エラー"
invalid-format: "a~z、A~Z、0~9、_が使えます"
too-short: "1文字以上でお願いします"
too-long: "20文字以内でお願いします"
password: "パスワード"
password-placeholder: "8文字以上を推奨します"
weak-password: "弱いパスワード"
normal-password: "まあまあのパスワード"
strong-password: "強いパスワード"
retype: "再入力"
retype-placeholder: "確認のため再入力してください"
password-matched: "確認されました"
password-not-matched: "一致していません"
recaptcha: "認証"
create: "アカウント作成"
some-error: "何らかの原因によりアカウントの作成に失敗しました。再度お試しください。"
common/views/components/special-message.vue:
new-year: "Happy New Year!"
christmas: "Merry Christmas!"
common/views/components/stream-indicator.vue:
connecting: "接続中"
reconnecting: "再接続中"
connected: "接続完了"
common/views/components/twitter-setting.vue:
description: "お使いのTwitterアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでTwitterアカウント情報が表示されるようになったり、Twitterを用いた便利なサインインを利用できるようになります。"
connected-to: "次のTwitterアカウントに接続されています"
detail: "詳細..."
reconnect: "再接続する"
connect: "Twitterと接続する"
disconnect: "切断する"
common/views/components/uploader.vue:
waiting: "待機中"
common/views/widgets/broadcast.vue:
fetching: "確認中"
no-broadcasts: "お知らせはありません"
have-a-nice-day: "良い一日を!"
next: "次"
common/views/widgets/donation.vue:
title: "寄付のお願い"
text: "Misskeyの運営にはドメイン、サーバー等のコストが掛かります。Misskeyは広告を掲載したりしないため、収入を皆様からの寄付に頼っています。もしご興味があれば、{}までご連絡ください。ご協力ありがとうございます。"
common/views/widgets/photo-stream.vue:
title: "フォトストリーム"
no-photos: "写真はありません"
common/views/widgets/server.vue:
title: "サーバー情報"
toggle: "表示を切り替え"
desktop/views/components/activity.vue:
title: "アクティビティ"
toggle: "表示を切り替え"
desktop/views/components/calendar.vue:
title: "{1}年 {2}月"
prev: "前の月"
next: "次の月"
go: "クリックして時間遡行"
desktop/views/components/drive-window.vue:
used: "使用中"
drive: "ドライブ"
desktop/views/components/drive.file.vue:
avatar: "アイコン"
banner: "バナー"
contextmenu:
rename: "名前を変更"
copy-url: "URLをコピー"
download: "ダウンロード"
else-files: "その他..."
set-as-avatar: "アイコンに設定"
set-as-banner: "バナーに設定"
open-in-app: "アプリで開く"
add-app: "アプリを追加"
rename-file: "ファイル名の変更"
input-new-file-name: "新しいファイル名を入力してください"
copied: "コピー完了"
copied-url-to-clipboard: "URLをクリップボードにコピーしました"
desktop/views/components/drive.folder.vue:
unable-to-process: "操作を完了できません"
circular-reference-detected: "移動先のフォルダーは、移動するフォルダーのサブフォルダーです。"
unhandled-error: "不明なエラー"
contextmenu:
move-to-this-folder: "このフォルダへ移動"
show-in-new-window: "新しいウィンドウで表示"
rename: "名前を変更"
rename-folder: "フォルダ名の変更"
input-new-folder-name: "新しいフォルダ名を入力してください"
desktop/views/components/drive.nav-folder.vue:
drive: "ドライブ"
desktop/views/components/drive.vue:
search: "検索"
load-more: "もっと読み込む"
empty-draghover: "ドロップですか?いいですよ、ボクはカワイイですからね"
empty-drive: "ドライブには何もありません。"
empty-drive-description: "右クリックして「ファイルをアップロード」を選んだり、ファイルをドラッグ&ドロップすることでもアップロードできます。"
empty-folder: "このフォルダーは空です"
unable-to-process: "操作を完了できません"
circular-reference-detected: "移動先のフォルダーは、移動するフォルダーのサブフォルダーです。"
unhandled-error: "不明なエラー"
url-upload: "URLアップロード"
url-of-file: "アップロードしたいファイルのURL"
url-upload-requested: "アップロードをリクエストしました"
may-take-time: "アップロードが完了するまで時間がかかる場合があります。"
create-folder: "フォルダー作成"
folder-name: "フォルダー名"
contextmenu:
create-folder: "フォルダーを作成"
upload: "ファイルをアップロード"
url-upload: "URLからアップロード"
desktop/views/components/home.vue:
done: "完了"
add-widget: "ウィジェットを追加:"
profile: "プロフィール"
calendar: "カレンダー"
timemachine: "カレンダー(タイムマシン)"
activity: "アクティビティ"
rss: "RSSリーダー"
trends: "トレンド"
photostream: "フォトストリーム"
slideshow: "スライドショー"
version: "バージョン"
broadcast: "ブロードキャスト"
notifications: "通知"
users: "おすすめユーザー"
polls: "投票"
post-form: "投稿フォーム"
messaging: "メッセージ"
channel: "チャンネル"
access-log: "アクセスログ"
server: "サーバー情報"
donation: "寄付のお願い"
nav: "ナビゲーション"
tips: "ヒント"
add: "追加"
desktop/views/components/messaging-window.vue:
title: "メッセージ"
desktop/views/components/notes.note.vue:
reposted-by: "{}がRenote"
reply: "返信"
renote: "Renote"
add-reaction: "リアクション"
detail: "詳細"
desktop/views/components/notifications.vue:
more: "もっと見る"
empty: "ありません!"
desktop/views/components/post-form.vue:
note-placeholder: "いまどうしてる?"
reply-placeholder: "この投稿への返信..."
quote-placeholder: "この投稿を引用..."
note: "投稿"
reply: "返信"
renote: "Renote"
posted: "投稿しました!"
replied: "返信しました!"
reposted: "Renoteしました"
note-failed: "投稿に失敗しました"
reply-failed: "返信に失敗しました"
renote-failed: "Renoteに失敗しました"
posting: "投稿中"
attach-media-from-local: "PCからメディアを添付"
attach-media-from-drive: "ドライブからメディアを添付"
attach-cancel: "添付取り消し"
insert-a-kao: "v(‘ω’)v"
create-poll: "投票を作成"
text-remain: "残り{}文字"
desktop/views/components/post-form-window.vue:
note: "新規投稿"
reply: "返信"
attaches: "添付: {}メディア"
uploading-media: "{}個のメディアをアップロード中"
desktop/views/components/renote-form.vue:
quote: "引用する..."
cancel: "キャンセル"
renote: "Renote"
reposting: "しています..."
success: "Renoteしました"
failure: "Renoteに失敗しました"
desktop/views/components/renote-form-window.vue:
title: "この投稿をRenoteしますか"
desktop/views/components/settings.vue:
profile: "プロフィール"
notification: "通知"
apps: "アプリ"
mute: "ミュート"
drive: "ドライブ"
security: "セキュリティ"
signin: "サインイン履歴"
password: "パスワード"
2fa: "二段階認証"
other: "その他"
license: "ライセンス"
desktop/views/components/settings.2fa.vue:
intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。"
detail: "詳細..."
url: "https://www.google.co.jp/intl/ja/landing/2step/"
caution: "登録したデバイスを紛失するなどした場合、Misskeyにサインインできなくなりますのでご注意ください。"
register: "デバイスを登録する"
already-registered: "既に設定は完了しています。"
unregister: "設定を解除"
unregistered: "二段階認証が無効になりました。"
enter-password: "パスワードを入力してください"
authenticator: "まず、Google Authenticatorをお使いのデバイスにインストールします:"
howtoinstall: "インストール方法はこちら"
scan: "次に、表示されているQRコードをスキャンします:"
done: "お使いのデバイスに表示されているトークンを入力して完了します:"
submit: "完了"
success: "設定が完了しました!"
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
desktop/views/components/settings.api.vue:
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
regenerate-token: "トークンを再生成"
token: "Token:"
enter-password: "パスワードを入力してください"
desktop/views/components/settings.app.vue:
no-apps: "連携しているアプリケーションはありません"
desktop/views/components/settings.mute.vue:
no-users: "ミュートしているユーザーはいません"
desktop/views/components/settings.password.vue:
reset: "パスワードを変更する"
enter-current-password: "現在のパスワードを入力してください"
enter-new-password: "新しいパスワードを入力してください"
enter-new-password-again: "もう一度新しいパスワードを入力してください"
not-match: "新しいパスワードが一致しません"
changed: "パスワードを変更しました"
desktop/views/components/settings.profile.vue:
avatar: "アイコン"
choice-avatar: "画像を選択"
name: "名前"
location: "場所"
description: "自己紹介"
birthday: "誕生日"
save: "保存"
desktop/views/components/timeline.vue:
home: "ホーム"
local: "ローカル"
global: "グローバル"
list: "リスト"
desktop/views/components/ui.header.account.vue:
profile: "プロフィール"
drive: "ドライブ"
favorites: "お気に入り"
lists: "リスト"
customize: "カスタマイズ"
settings: "設定"
signout: "サインアウト"
dark: "闇に飲まれる"
desktop/views/components/ui.header.nav.vue:
home: "ホーム"
messaging: "メッセージ"
game: "ゲーム"
desktop/views/components/ui.header.notifications.vue:
title: "通知"
desktop/views/components/ui.header.post.vue:
post: "新規投稿"
desktop/views/components/ui.header.search.vue:
placeholder: "検索"
desktop/views/components/user-lists-window.vue:
create-list: "リストを作成"
desktop/views/components/user-preview.vue:
notes: "投稿"
following: "フォロー"
followers: "フォロワー"
desktop/views/components/users-list.vue:
all: "すべて"
iknow: "知り合い"
load-more: "もっと"
fetching: "読み込んでいます"
desktop/views/pages/note.vue:
prev: "前の投稿"
next: "次の投稿"
desktop/views/pages/selectdrive.vue:
title: "ファイルを選択してください"
ok: "決定"
cancel: "キャンセル"
upload: "PCからドライブにファイルをアップロード"
desktop/views/pages/user/user.followers-you-know.vue:
title: "知り合いのフォロワー"
loading: "読み込み中"
no-users: "知り合いのフォロワーはいません"
desktop/views/pages/user/user.friends.vue:
title: "よく話すユーザー"
loading: "読み込み中"
no-users: "よく話すユーザーはいません"
desktop/views/pages/user/user.header.vue:
is-suspended: "このユーザーは凍結されています。"
is-remote: "このユーザーはリモートユーザーです。"
view-remote: "正確な情報を見る"
desktop/views/pages/user/user.home.vue:
last-used-at: "最終アクセス"
desktop/views/pages/user/user.photos.vue:
title: "フォト"
loading: "読み込み中"
no-photos: "写真はありません"
desktop/views/pages/user/user.profile.vue:
follows-you: "フォローされています"
stalk: "ストークする"
stalking: "ストーキングしています"
unstalk: "ストーク解除"
mute: "ミュートする"
muted: "ミュートしています"
unmute: "ミュート解除"
desktop/views/widgets/messaging.vue:
title: "メッセージ"
desktop/views/widgets/notifications.vue:
title: "通知"
settings: "通知の設定"
desktop/views/widgets/polls.vue:
title: "投票"
refresh: "他を見る"
nothing: "ありません!"
desktop/views/widgets/post-form.vue:
title: "投稿"
note: "投稿"
placeholder: "いまどうしてる?"
desktop/views/widgets/trends.vue:
title: "トレンド"
refresh: "他を見る"
nothing: "ありません!"
desktop/views/widgets/users.vue:
title: "おすすめユーザー"
refresh: "他を見る"
no-one: "いません!"
desktop/views/widgets/channel.vue:
title: "チャンネル"
settings: "ウィジェットの設定"
get-started: "右上の歯車をクリックして受信するチャンネルを指定してください"
mobile/views/components/drive.vue:
drive: "ドライブ"
used: "使用中"
folder-count: "フォルダ"
count-separator: "、"
file-count: "ファイル"
load-more: "もっと読み込む"
nothing-in-drive: "ドライブには何もありません"
folder-is-empty: "このフォルダは空です"
mobile/views/components/drive-file-chooser.vue:
select-file: "ファイルを選択"
mobile/views/components/drive-folder-chooser.vue:
select-folder: "フォルダーを選択"
mobile/views/components/drive.file-detail.vue:
download: "ダウンロード"
rename: "名前を変更"
move: "移動"
hash: "ハッシュ (md5)"
exif: "EXIF"
mobile/views/components/follow-button.vue:
follow: "フォロー"
unfollow: "フォロー解除"
mobile/views/components/note.vue:
reposted-by: "{}がRenote"
mobile/views/components/note-detail.vue:
reply: "返信"
reaction: "リアクション"
mobile/views/components/notifications.vue:
more: "もっと見る"
empty: "ありません!"
mobile/views/components/post-form.vue:
submit: "投稿"
reply: "返信"
renote: "Renote"
renote-placeholder: "この投稿を引用... (オプション)"
reply-placeholder: "この投稿への返信..."
note-placeholder: "いまどうしてる?"
mobile/views/components/sub-note-content.vue:
media-count: "{}個のメディア"
poll: "投票"
mobile/views/components/timeline.vue:
empty: "投稿がありません"
load-more: "もっと"
mobile/views/components/ui.nav.vue:
home: "ホーム"
notifications: "通知"
messaging: "メッセージ"
search: "検索"
drive: "ドライブ"
settings: "設定"
about: "Misskeyについて"
mobile/views/components/user-timeline.vue:
no-notes: "このユーザーは投稿していないようです。"
no-notes-with-media: "メディア付き投稿はありません。"
load-more: "もっと"
mobile/views/components/users-list.vue:
all: "すべて"
known: "知り合い"
load-more: "もっと"
mobile/views/pages/drive.vue:
drive: "ドライブ"
mobile/views/pages/followers.vue:
followers-of: "{}のフォロワー"
mobile/views/pages/following.vue:
following-of: "{}のフォロー"
mobile/views/pages/home.vue:
timeline: "タイムライン"
mobile/views/pages/messaging.vue:
messaging: "メッセージ"
mobile/views/pages/messaging-room.vue:
messaging: "メッセージ"
mobile/views/pages/note.vue:
title: "投稿"
prev: "前の投稿"
next: "次の投稿"
mobile/views/pages/notifications.vue:
notifications: "通知"
read-all: "すべての通知を既読にしますか?"
mobile/views/pages/profile-setting.vue:
title: "プロフィール設定"
will-be-published: "これらのプロフィールは公開されます。"
name: "名前"
location: "場所"
description: "自己紹介"
birthday: "誕生日"
avatar: "アイコン"
banner: "バナー"
avatar-saved: "アイコンを保存しました"
banner-saved: "バナーを保存しました"
set-avatar: "アイコンを選択する"
set-banner: "バナーを選択する"
save: "保存"
saved: "プロフィールを保存しました"
mobile/views/pages/search.vue:
search: "検索"
empty: "「{}」に関する投稿は見つかりませんでした。"
mobile/views/pages/selectdrive.vue:
select-file: "ファイルを選択"
mobile/views/pages/settings.vue:
signed-in-as: "{}としてサインイン中"
profile: "プロフィール"
twitter: "Twitter連携"
signin-history: "サインイン履歴"
settings: "設定"
signout: "サインアウト"
mobile/views/pages/user.vue:
follows-you: "フォローされています"
following: "フォロー"
followers: "フォロワー"
notes: "投稿"
overview: "概要"
timeline: "タイムライン"
media: "メディア"
is-suspended: "このユーザーは凍結されています。"
is-remote: "このユーザーはリモートユーザーです。"
view-remote: "正確な情報を見る"
mobile/views/pages/user/home.vue:
recent-notes: "最近の投稿"
images: "画像"
activity: "アクティビティ"
keywords: "キーワード"
domains: "頻出ドメイン"
frequently-replied-users: "よく会話するユーザー"
followers-you-know: "知り合いのフォロワー"
last-used-at: "最終ログイン"
mobile/views/pages/user/home.followers-you-know.vue:
loading: "読み込み中"
no-users: "知り合いのユーザーはいません"
mobile/views/pages/user/home.friends.vue:
loading: "読み込み中"
no-users: "よく会話するユーザーはいません"
mobile/views/pages/user/home.notes.vue:
loading: "読み込み中"
no-notes: "投稿はありません"
mobile/views/pages/user/home.photos.vue:
loading: "読み込み中"
no-photos: "写真はありません"
docs:
edit-this-page-on-github: "間違いや改善点を見つけましたか?"
edit-this-page-on-github-link: "このページをGitHubで編集"
api:
entities:
properties: "プロパティ"
endpoints:
params: "パラメータ"
res: "レスポンス"
props:
name: "名前"
type: "型"
optional: "オプション"
description: "説明"
yes: "はい"
no: "いいえ"

View File

@ -1,3 +1,7 @@
meta:
lang: "日本語"
divider: ""
common:
misskey: "Misskeyで皆と共有しよう。"
@ -20,7 +24,7 @@ common:
wednesday: "水"
thursday: "木"
friday: "金"
satruday: "土"
saturday: "土"
reactions:
like: "いいね"
@ -253,6 +257,32 @@ desktop/views/components/drive.vue:
upload: "ファイルをアップロード"
url-upload: "URLからアップロード"
desktop/views/components/home.vue:
done: "完了"
add-widget: "ウィジェットを追加:"
profile: "プロフィール"
calendar: "カレンダー"
timemachine: "カレンダー(タイムマシン)"
activity: "アクティビティ"
rss: "RSSリーダー"
trends: "トレンド"
photostream: "フォトストリーム"
slideshow: "スライドショー"
version: "バージョン"
broadcast: "ブロードキャスト"
notifications: "通知"
users: "おすすめユーザー"
polls: "投票"
post-form: "投稿フォーム"
messaging: "メッセージ"
channel: "チャンネル"
access-log: "アクセスログ"
server: "サーバー情報"
donation: "寄付のお願い"
nav: "ナビゲーション"
tips: "ヒント"
add: "追加"
desktop/views/components/messaging-window.vue:
title: "メッセージ"
@ -312,6 +342,7 @@ desktop/views/components/settings.vue:
mute: "ミュート"
drive: "ドライブ"
security: "セキュリティ"
signin: "サインイン履歴"
password: "パスワード"
2fa: "二段階認証"
other: "その他"
@ -341,6 +372,7 @@ desktop/views/components/settings.api.vue:
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
regenerate-token: "トークンを再生成"
token: "Token:"
enter-password: "パスワードを入力してください"
desktop/views/components/settings.app.vue:
@ -366,6 +398,12 @@ desktop/views/components/settings.profile.vue:
birthday: "誕生日"
save: "保存"
desktop/views/components/timeline.vue:
home: "ホーム"
local: "ローカル"
global: "グローバル"
list: "リスト"
desktop/views/components/ui.header.account.vue:
profile: "プロフィール"
drive: "ドライブ"
@ -390,6 +428,20 @@ desktop/views/components/ui.header.post.vue:
desktop/views/components/ui.header.search.vue:
placeholder: "検索"
desktop/views/components/user-lists-window.vue:
create-list: "リストを作成"
desktop/views/components/user-preview.vue:
notes: "投稿"
following: "フォロー"
followers: "フォロワー"
desktop/views/components/users-list.vue:
all: "すべて"
iknow: "知り合い"
load-more: "もっと"
fetching: "読み込んでいます"
desktop/views/pages/note.vue:
prev: "前の投稿"
next: "次の投稿"
@ -504,6 +556,9 @@ mobile/views/components/notifications.vue:
mobile/views/components/post-form.vue:
submit: "投稿"
reply: "返信"
renote: "Renote"
renote-placeholder: "この投稿を引用... (オプション)"
reply-placeholder: "この投稿への返信..."
note-placeholder: "いまどうしてる?"

596
locales/ko.yml Normal file
View File

@ -0,0 +1,596 @@
---
common:
misskey: "Misskeyで皆と共有しよう。"
time:
unknown: "なぞのじかん"
future: "未来"
just_now: "たった今"
seconds_ago: "{}秒前"
minutes_ago: "{}分前"
hours_ago: "{}時間前"
days_ago: "{}日前"
weeks_ago: "{}週間前"
months_ago: "{}ヶ月前"
years_ago: "{}年前"
weekday-short:
sunday: "日"
monday: "月"
tuesday: "火"
wednesday: "水"
thursday: "木"
friday: "金"
saturday: "土"
reactions:
like: "いいね"
love: "しゅき"
laugh: "笑"
hmm: "ふぅ~む"
surprise: "わお"
congrats: "おめでとう"
angry: "おこ"
confused: "こまこまのこまり"
pudding: "Pudding"
delete: "削除"
loading: "読み込み中"
ok: "わかった"
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
common/views/components/connect-failed.vue:
title: "サーバーに接続できません"
description: "インターネット回線に問題があるか、サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから{再度お試し}ください。"
thanks: "いつもMisskeyをご利用いただきありがとうございます。"
troubleshoot: "トラブルシュート"
common/views/components/connect-failed.troubleshooter.vue:
title: "トラブルシューティング"
network: "ネットワーク接続"
checking-network: "ネットワーク接続を確認中"
internet: "インターネット接続"
checking-internet: "インターネット接続を確認中"
server: "サーバー接続"
checking-server: "サーバー接続を確認中"
finding: "問題を調べています"
no-network: "ネットワークに接続されていません"
no-network-desc: "お使いのPCのネットワーク接続が正常か確認してください。"
no-internet: "インターネットに接続されていません"
no-internet-desc: "ネットワークには接続されていますが、インターネットには接続されていないようです。お使いのPCのインターネット接続が正常か確認してください。"
no-server: "Misskeyのサーバーに接続できません"
no-server-desc: "お使いのPCのインターネット接続は正常ですが、Misskeyのサーバーには接続できませんでした。サーバーがダウンまたはメンテナンスしている可能性があるので、しばらくしてから再度御アクセスください。"
success: "Misskeyのサーバーに接続できました"
success-desc: "正常に接続できるようです。ページを再度読み込みしてください。"
flush: "キャッシュの削除"
set-version: "バージョン指定"
common/views/components/messaging.vue:
search-user: "ユーザーを探す"
you: "あなた"
no-history: "履歴はありません"
common/views/components/messaging-room.vue:
empty: "このユーザーと話したことはありません"
more: "もっと読む"
no-history: "これより過去の履歴はありません"
resize-form: "ドラッグしてフォームの広さを調整"
new-message: "新しいメッセージがあります"
common/views/components/messaging-room.form.vue:
input-message-here: "ここにメッセージを入力"
send: "送信"
attach-from-local: "PCからファイルを添付する"
attach-from-drive: "ドライブからファイルを添付する"
common/views/components/messaging-room.message.vue:
is-read: "既読"
deleted: "このメッセージは削除されました"
common/views/components/nav.vue:
about: "Misskeyについて"
stats: "統計"
status: "ステータス"
wiki: "Wiki"
donors: "ドナー"
repository: "リポジトリ"
develop: "開発者"
feedback: "フィードバック"
common/views/components/note-menu.vue:
favorite: "お気に入り"
pin: "ピン留め"
remote: "投稿元で見る"
common/views/components/poll.vue:
vote-to: "「{}」に投票する"
vote-count: "{}票"
total-users: "{}人が投票"
vote: "投票する"
show-result: "結果を見る"
voted: "投票済み"
common/views/components/poll-editor.vue:
no-only-one-choice: "投票には、選択肢が最低2つ必要です"
choice-n: "選択肢{}"
remove: "この選択肢を削除"
add: "+選択肢を追加"
destroy: "投票を破棄"
common/views/components/reaction-picker.vue:
choose-reaction: "リアクションを選択"
common/views/components/signin.vue:
username: "ユーザー名"
password: "パスワード"
token: "トークン"
signing-in: "やってます..."
signin: "サインイン"
common/views/components/signup.vue:
username: "ユーザー名"
checking: "確認しています..."
available: "利用できます"
unavailable: "既に利用されています"
error: "通信エラー"
invalid-format: "a~z、A~Z、0~9、_が使えます"
too-short: "1文字以上でお願いします"
too-long: "20文字以内でお願いします"
password: "パスワード"
password-placeholder: "8文字以上を推奨します"
weak-password: "弱いパスワード"
normal-password: "まあまあのパスワード"
strong-password: "強いパスワード"
retype: "再入力"
retype-placeholder: "確認のため再入力してください"
password-matched: "確認されました"
password-not-matched: "一致していません"
recaptcha: "認証"
create: "アカウント作成"
some-error: "何らかの原因によりアカウントの作成に失敗しました。再度お試しください。"
common/views/components/special-message.vue:
new-year: "Happy New Year!"
christmas: "Merry Christmas!"
common/views/components/stream-indicator.vue:
connecting: "接続中"
reconnecting: "再接続中"
connected: "接続完了"
common/views/components/twitter-setting.vue:
description: "お使いのTwitterアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでTwitterアカウント情報が表示されるようになったり、Twitterを用いた便利なサインインを利用できるようになります。"
connected-to: "次のTwitterアカウントに接続されています"
detail: "詳細..."
reconnect: "再接続する"
connect: "Twitterと接続する"
disconnect: "切断する"
common/views/components/uploader.vue:
waiting: "待機中"
common/views/widgets/broadcast.vue:
fetching: "確認中"
no-broadcasts: "お知らせはありません"
have-a-nice-day: "良い一日を!"
next: "次"
common/views/widgets/donation.vue:
title: "寄付のお願い"
text: "Misskeyの運営にはドメイン、サーバー等のコストが掛かります。Misskeyは広告を掲載したりしないため、収入を皆様からの寄付に頼っています。もしご興味があれば、{}までご連絡ください。ご協力ありがとうございます。"
common/views/widgets/photo-stream.vue:
title: "フォトストリーム"
no-photos: "写真はありません"
common/views/widgets/server.vue:
title: "サーバー情報"
toggle: "表示を切り替え"
desktop/views/components/activity.vue:
title: "アクティビティ"
toggle: "表示を切り替え"
desktop/views/components/calendar.vue:
title: "{1}年 {2}月"
prev: "前の月"
next: "次の月"
go: "クリックして時間遡行"
desktop/views/components/drive-window.vue:
used: "使用中"
drive: "ドライブ"
desktop/views/components/drive.file.vue:
avatar: "アイコン"
banner: "バナー"
contextmenu:
rename: "名前を変更"
copy-url: "URLをコピー"
download: "ダウンロード"
else-files: "その他..."
set-as-avatar: "アイコンに設定"
set-as-banner: "バナーに設定"
open-in-app: "アプリで開く"
add-app: "アプリを追加"
rename-file: "ファイル名の変更"
input-new-file-name: "新しいファイル名を入力してください"
copied: "コピー完了"
copied-url-to-clipboard: "URLをクリップボードにコピーしました"
desktop/views/components/drive.folder.vue:
unable-to-process: "操作を完了できません"
circular-reference-detected: "移動先のフォルダーは、移動するフォルダーのサブフォルダーです。"
unhandled-error: "不明なエラー"
contextmenu:
move-to-this-folder: "このフォルダへ移動"
show-in-new-window: "新しいウィンドウで表示"
rename: "名前を変更"
rename-folder: "フォルダ名の変更"
input-new-folder-name: "新しいフォルダ名を入力してください"
desktop/views/components/drive.nav-folder.vue:
drive: "ドライブ"
desktop/views/components/drive.vue:
search: "検索"
load-more: "もっと読み込む"
empty-draghover: "ドロップですか?いいですよ、ボクはカワイイですからね"
empty-drive: "ドライブには何もありません。"
empty-drive-description: "右クリックして「ファイルをアップロード」を選んだり、ファイルをドラッグ&ドロップすることでもアップロードできます。"
empty-folder: "このフォルダーは空です"
unable-to-process: "操作を完了できません"
circular-reference-detected: "移動先のフォルダーは、移動するフォルダーのサブフォルダーです。"
unhandled-error: "不明なエラー"
url-upload: "URLアップロード"
url-of-file: "アップロードしたいファイルのURL"
url-upload-requested: "アップロードをリクエストしました"
may-take-time: "アップロードが完了するまで時間がかかる場合があります。"
create-folder: "フォルダー作成"
folder-name: "フォルダー名"
contextmenu:
create-folder: "フォルダーを作成"
upload: "ファイルをアップロード"
url-upload: "URLからアップロード"
desktop/views/components/home.vue:
done: "完了"
add-widget: "ウィジェットを追加:"
profile: "プロフィール"
calendar: "カレンダー"
timemachine: "カレンダー(タイムマシン)"
activity: "アクティビティ"
rss: "RSSリーダー"
trends: "トレンド"
photostream: "フォトストリーム"
slideshow: "スライドショー"
version: "バージョン"
broadcast: "ブロードキャスト"
notifications: "通知"
users: "おすすめユーザー"
polls: "投票"
post-form: "投稿フォーム"
messaging: "メッセージ"
channel: "チャンネル"
access-log: "アクセスログ"
server: "サーバー情報"
donation: "寄付のお願い"
nav: "ナビゲーション"
tips: "ヒント"
add: "追加"
desktop/views/components/messaging-window.vue:
title: "メッセージ"
desktop/views/components/notes.note.vue:
reposted-by: "{}がRenote"
reply: "返信"
renote: "Renote"
add-reaction: "リアクション"
detail: "詳細"
desktop/views/components/notifications.vue:
more: "もっと見る"
empty: "ありません!"
desktop/views/components/post-form.vue:
note-placeholder: "いまどうしてる?"
reply-placeholder: "この投稿への返信..."
quote-placeholder: "この投稿を引用..."
note: "投稿"
reply: "返信"
renote: "Renote"
posted: "投稿しました!"
replied: "返信しました!"
reposted: "Renoteしました"
note-failed: "投稿に失敗しました"
reply-failed: "返信に失敗しました"
renote-failed: "Renoteに失敗しました"
posting: "投稿中"
attach-media-from-local: "PCからメディアを添付"
attach-media-from-drive: "ドライブからメディアを添付"
attach-cancel: "添付取り消し"
insert-a-kao: "v(‘ω’)v"
create-poll: "投票を作成"
text-remain: "残り{}文字"
desktop/views/components/post-form-window.vue:
note: "新規投稿"
reply: "返信"
attaches: "添付: {}メディア"
uploading-media: "{}個のメディアをアップロード中"
desktop/views/components/renote-form.vue:
quote: "引用する..."
cancel: "キャンセル"
renote: "Renote"
reposting: "しています..."
success: "Renoteしました"
failure: "Renoteに失敗しました"
desktop/views/components/renote-form-window.vue:
title: "この投稿をRenoteしますか"
desktop/views/components/settings.vue:
profile: "プロフィール"
notification: "通知"
apps: "アプリ"
mute: "ミュート"
drive: "ドライブ"
security: "セキュリティ"
signin: "サインイン履歴"
password: "パスワード"
2fa: "二段階認証"
other: "その他"
license: "ライセンス"
desktop/views/components/settings.2fa.vue:
intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。"
detail: "詳細..."
url: "https://www.google.co.jp/intl/ja/landing/2step/"
caution: "登録したデバイスを紛失するなどした場合、Misskeyにサインインできなくなりますのでご注意ください。"
register: "デバイスを登録する"
already-registered: "既に設定は完了しています。"
unregister: "設定を解除"
unregistered: "二段階認証が無効になりました。"
enter-password: "パスワードを入力してください"
authenticator: "まず、Google Authenticatorをお使いのデバイスにインストールします:"
howtoinstall: "インストール方法はこちら"
scan: "次に、表示されているQRコードをスキャンします:"
done: "お使いのデバイスに表示されているトークンを入力して完了します:"
submit: "完了"
success: "設定が完了しました!"
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
desktop/views/components/settings.api.vue:
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
regenerate-token: "トークンを再生成"
token: "Token:"
enter-password: "パスワードを入力してください"
desktop/views/components/settings.app.vue:
no-apps: "連携しているアプリケーションはありません"
desktop/views/components/settings.mute.vue:
no-users: "ミュートしているユーザーはいません"
desktop/views/components/settings.password.vue:
reset: "パスワードを変更する"
enter-current-password: "現在のパスワードを入力してください"
enter-new-password: "新しいパスワードを入力してください"
enter-new-password-again: "もう一度新しいパスワードを入力してください"
not-match: "新しいパスワードが一致しません"
changed: "パスワードを変更しました"
desktop/views/components/settings.profile.vue:
avatar: "アイコン"
choice-avatar: "画像を選択"
name: "名前"
location: "場所"
description: "自己紹介"
birthday: "誕生日"
save: "保存"
desktop/views/components/timeline.vue:
home: "ホーム"
local: "ローカル"
global: "グローバル"
list: "リスト"
desktop/views/components/ui.header.account.vue:
profile: "プロフィール"
drive: "ドライブ"
favorites: "お気に入り"
lists: "リスト"
customize: "カスタマイズ"
settings: "設定"
signout: "サインアウト"
dark: "闇に飲まれる"
desktop/views/components/ui.header.nav.vue:
home: "ホーム"
messaging: "メッセージ"
game: "ゲーム"
desktop/views/components/ui.header.notifications.vue:
title: "通知"
desktop/views/components/ui.header.post.vue:
post: "新規投稿"
desktop/views/components/ui.header.search.vue:
placeholder: "検索"
desktop/views/components/user-lists-window.vue:
create-list: "リストを作成"
desktop/views/components/user-preview.vue:
notes: "投稿"
following: "フォロー"
followers: "フォロワー"
desktop/views/components/users-list.vue:
all: "すべて"
iknow: "知り合い"
load-more: "もっと"
fetching: "読み込んでいます"
desktop/views/pages/note.vue:
prev: "前の投稿"
next: "次の投稿"
desktop/views/pages/selectdrive.vue:
title: "ファイルを選択してください"
ok: "決定"
cancel: "キャンセル"
upload: "PCからドライブにファイルをアップロード"
desktop/views/pages/user/user.followers-you-know.vue:
title: "知り合いのフォロワー"
loading: "読み込み中"
no-users: "知り合いのフォロワーはいません"
desktop/views/pages/user/user.friends.vue:
title: "よく話すユーザー"
loading: "読み込み中"
no-users: "よく話すユーザーはいません"
desktop/views/pages/user/user.header.vue:
is-suspended: "このユーザーは凍結されています。"
is-remote: "このユーザーはリモートユーザーです。"
view-remote: "正確な情報を見る"
desktop/views/pages/user/user.home.vue:
last-used-at: "最終アクセス"
desktop/views/pages/user/user.photos.vue:
title: "フォト"
loading: "読み込み中"
no-photos: "写真はありません"
desktop/views/pages/user/user.profile.vue:
follows-you: "フォローされています"
stalk: "ストークする"
stalking: "ストーキングしています"
unstalk: "ストーク解除"
mute: "ミュートする"
muted: "ミュートしています"
unmute: "ミュート解除"
desktop/views/widgets/messaging.vue:
title: "メッセージ"
desktop/views/widgets/notifications.vue:
title: "通知"
settings: "通知の設定"
desktop/views/widgets/polls.vue:
title: "投票"
refresh: "他を見る"
nothing: "ありません!"
desktop/views/widgets/post-form.vue:
title: "投稿"
note: "投稿"
placeholder: "いまどうしてる?"
desktop/views/widgets/trends.vue:
title: "トレンド"
refresh: "他を見る"
nothing: "ありません!"
desktop/views/widgets/users.vue:
title: "おすすめユーザー"
refresh: "他を見る"
no-one: "いません!"
desktop/views/widgets/channel.vue:
title: "チャンネル"
settings: "ウィジェットの設定"
get-started: "右上の歯車をクリックして受信するチャンネルを指定してください"
mobile/views/components/drive.vue:
drive: "ドライブ"
used: "使用中"
folder-count: "フォルダ"
count-separator: "、"
file-count: "ファイル"
load-more: "もっと読み込む"
nothing-in-drive: "ドライブには何もありません"
folder-is-empty: "このフォルダは空です"
mobile/views/components/drive-file-chooser.vue:
select-file: "ファイルを選択"
mobile/views/components/drive-folder-chooser.vue:
select-folder: "フォルダーを選択"
mobile/views/components/drive.file-detail.vue:
download: "ダウンロード"
rename: "名前を変更"
move: "移動"
hash: "ハッシュ (md5)"
exif: "EXIF"
mobile/views/components/follow-button.vue:
follow: "フォロー"
unfollow: "フォロー解除"
mobile/views/components/note.vue:
reposted-by: "{}がRenote"
mobile/views/components/note-detail.vue:
reply: "返信"
reaction: "リアクション"
mobile/views/components/notifications.vue:
more: "もっと見る"
empty: "ありません!"
mobile/views/components/post-form.vue:
submit: "投稿"
reply: "返信"
renote: "Renote"
renote-placeholder: "この投稿を引用... (オプション)"
reply-placeholder: "この投稿への返信..."
note-placeholder: "いまどうしてる?"
mobile/views/components/sub-note-content.vue:
media-count: "{}個のメディア"
poll: "投票"
mobile/views/components/timeline.vue:
empty: "投稿がありません"
load-more: "もっと"
mobile/views/components/ui.nav.vue:
home: "ホーム"
notifications: "通知"
messaging: "メッセージ"
search: "検索"
drive: "ドライブ"
settings: "設定"
about: "Misskeyについて"
mobile/views/components/user-timeline.vue:
no-notes: "このユーザーは投稿していないようです。"
no-notes-with-media: "メディア付き投稿はありません。"
load-more: "もっと"
mobile/views/components/users-list.vue:
all: "すべて"
known: "知り合い"
load-more: "もっと"
mobile/views/pages/drive.vue:
drive: "ドライブ"
mobile/views/pages/followers.vue:
followers-of: "{}のフォロワー"
mobile/views/pages/following.vue:
following-of: "{}のフォロー"
mobile/views/pages/home.vue:
timeline: "タイムライン"
mobile/views/pages/messaging.vue:
messaging: "メッセージ"
mobile/views/pages/messaging-room.vue:
messaging: "メッセージ"
mobile/views/pages/note.vue:
title: "投稿"
prev: "前の投稿"
next: "次の投稿"
mobile/views/pages/notifications.vue:
notifications: "通知"
read-all: "すべての通知を既読にしますか?"
mobile/views/pages/profile-setting.vue:
title: "プロフィール設定"
will-be-published: "これらのプロフィールは公開されます。"
name: "名前"
location: "場所"
description: "自己紹介"
birthday: "誕生日"
avatar: "アイコン"
banner: "バナー"
avatar-saved: "アイコンを保存しました"
banner-saved: "バナーを保存しました"
set-avatar: "アイコンを選択する"
set-banner: "バナーを選択する"
save: "保存"
saved: "プロフィールを保存しました"
mobile/views/pages/search.vue:
search: "検索"
empty: "「{}」に関する投稿は見つかりませんでした。"
mobile/views/pages/selectdrive.vue:
select-file: "ファイルを選択"
mobile/views/pages/settings.vue:
signed-in-as: "{}としてサインイン中"
profile: "プロフィール"
twitter: "Twitter連携"
signin-history: "サインイン履歴"
settings: "設定"
signout: "サインアウト"
mobile/views/pages/user.vue:
follows-you: "フォローされています"
following: "フォロー"
followers: "フォロワー"
notes: "投稿"
overview: "概要"
timeline: "タイムライン"
media: "メディア"
is-suspended: "このユーザーは凍結されています。"
is-remote: "このユーザーはリモートユーザーです。"
view-remote: "正確な情報を見る"
mobile/views/pages/user/home.vue:
recent-notes: "最近の投稿"
images: "画像"
activity: "アクティビティ"
keywords: "キーワード"
domains: "頻出ドメイン"
frequently-replied-users: "よく会話するユーザー"
followers-you-know: "知り合いのフォロワー"
last-used-at: "最終ログイン"
mobile/views/pages/user/home.followers-you-know.vue:
loading: "読み込み中"
no-users: "知り合いのユーザーはいません"
mobile/views/pages/user/home.friends.vue:
loading: "読み込み中"
no-users: "よく会話するユーザーはいません"
mobile/views/pages/user/home.notes.vue:
loading: "読み込み中"
no-notes: "投稿はありません"
mobile/views/pages/user/home.photos.vue:
loading: "読み込み中"
no-photos: "写真はありません"
docs:
edit-this-page-on-github: "間違いや改善点を見つけましたか?"
edit-this-page-on-github-link: "このページをGitHubで編集"
api:
entities:
properties: "プロパティ"
endpoints:
params: "パラメータ"
res: "レスポンス"
props:
name: "名前"
type: "型"
optional: "オプション"
description: "説明"
yes: "はい"
no: "いいえ"

596
locales/pl.yml Normal file
View File

@ -0,0 +1,596 @@
---
common:
misskey: "Dziel się zawartością z innymi korzystając z Misskey."
time:
unknown: "nieznany"
future: "w przyszłości"
just_now: "teraz"
seconds_ago: "{} sek. temu"
minutes_ago: "{} min. temu"
hours_ago: "{} godz. temu"
days_ago: "{} dni temu"
weeks_ago: "{} tyg. temu"
months_ago: "{} mies. temu"
years_ago: "{} lat temu"
weekday-short:
sunday: "N"
monday: "Pn"
tuesday: "W"
wednesday: "Ś"
thursday: "C"
friday: "P"
saturday: "S"
reactions:
like: "Lubię"
love: "Kocham"
laugh: "Śmieszne"
hmm: "Hmm…?"
surprise: "Wow"
congrats: "Gratuluję!"
angry: "Wściekły"
confused: "Zmieszany"
pudding: "Pudding"
delete: "Usuń"
loading: "Ładowanie"
ok: "OK"
update-available: "Nowa wersja Misskey jest dostępna ({newer}, obecna to {current}). Odśwież stronę, aby zastosować aktualizację."
my-token-regenerated: "Twój token został wygenerowany. Zostaniesz wylogowany."
common/views/components/connect-failed.vue:
title: "Nie udało się połączyć z serwerem"
description: "Wystąpił problem z Twoim połączeniem z Internetem, lub z serwerem. {Spróbuj ponownie} wkrótce."
thanks: "Dziękujemy za korzystanie z Misskey."
troubleshoot: "Rozwiązywanie problemów"
common/views/components/connect-failed.troubleshooter.vue:
title: "Rozwiązywanie problemów"
network: "Połączenie z siecią"
checking-network: "Sprawdzanie połączenia sieciowego"
internet: "Połączenie z Internetem"
checking-internet: "Sprawdzanie połączenia z Internetem"
server: "Połączenie z serwerem"
checking-server: "Sprawdzanie połączenia z serwerem"
finding: "Wyszukiwanie problemu"
no-network: "Brak połączenia z siecią"
no-network-desc: "Upewnij się, że jesteś połączony z siecią."
no-internet: "Brak połączenia z Internetem"
no-internet-desc: "Upewnij się, że jesteś połączony z Internetem."
no-server: "Nie udało się połączyć z serwerem"
no-server-desc: "Połączenie sieciowe działa, ale nie udało się połączyć z serwerem Misskey. Możliwe że serwer nie działa lub trwają prace konserwacyjne, spróbuj ponownie później."
success: "Pomyślnie połączono z serwerem Misskey"
success-desc: "Wygląda na to, że udało się połączyć. Odśwież stronę."
flush: "Wyczyść pamięć podręczną"
set-version: "Określ wersję"
common/views/components/messaging.vue:
search-user: "Znajdź użytkownika"
you: "Ty"
no-history: "Brak historii"
common/views/components/messaging-room.vue:
empty: "Brak konwersacji"
more: "Więcej"
no-history: "Brak dalszej historii"
resize-form: "Przeciągnij aby zmienić rozmiar"
new-message: "Nowa wiadomość"
common/views/components/messaging-room.form.vue:
input-message-here: "Wprowadź wiadomość tutaj"
send: "Wyślij"
attach-from-local: "Załącz pliki z komputera"
attach-from-drive: "Załącz pliki z dysku"
common/views/components/messaging-room.message.vue:
is-read: "Przeczytano"
deleted: "Wiadomość została usunięta"
common/views/components/nav.vue:
about: "O stronie"
stats: "Statystyki"
status: "Stan"
wiki: "Wiki"
donors: "Sponsorzy"
repository: "Repozytorium"
develop: "Autorzy"
feedback: "Podziel się opinią"
common/views/components/note-menu.vue:
favorite: "Dodaj do ulubionych"
pin: "Przypnij do profilu"
remote: "投稿元で見る"
common/views/components/poll.vue:
vote-to: "Zagłosuj na '{}'"
vote-count: "{} głosów"
total-users: "{} głosujących"
vote: "Zagłosuj"
show-result: "Pokaż wyniki"
voted: "Zagłosowano"
common/views/components/poll-editor.vue:
no-only-one-choice: "Musisz wprowadzić dwie lub więcej opcji."
choice-n: "Opcja {}"
remove: "Usuń tą opcję"
add: "+ Dodaj opcję"
destroy: "Usuń ankietę"
common/views/components/reaction-picker.vue:
choose-reaction: "Wybierz reakcję"
common/views/components/signin.vue:
username: "Nazwa użytkownika"
password: "Hasło"
token: "Token"
signing-in: "Logowanie…"
signin: "Zaloguj"
common/views/components/signup.vue:
username: "Nazwa użytkownika"
checking: "Sprawdzanie…"
available: "Dostępna"
unavailable: "Niedostępna"
error: "Błąd sieci"
invalid-format: "Może zawierać litery, cyfry i myślniki."
too-short: "Wprowadź przynajmniej jeden znak"
too-long: "Nazwa nie może zawierać więcej niż 20 znaków"
password: "Hasło"
password-placeholder: "Zalecamy korzystanie z hasła zawierającego przynajmniej 8 znaków."
weak-password: "Słabe"
normal-password: "Średnie"
strong-password: "Silne"
retype: "Powtórz hasło"
retype-placeholder: "Potwierdź hasło"
password-matched: "OK"
password-not-matched: "Hasła nie zgadzają się"
recaptcha: "Weryfikacja"
create: "Utwórz konto"
some-error: "Nie udało się utworzyć konta. Spróbuj ponownie."
common/views/components/special-message.vue:
new-year: "Szczęśliwego nowego roku!"
christmas: "Wesołych świąt!"
common/views/components/stream-indicator.vue:
connecting: "Łączenie"
reconnecting: "Ponowne łączenie"
connected: "Połączono"
common/views/components/twitter-setting.vue:
description: "Jeżeli połączysz konto Twittera z kontem Misskey, informacje z Twittera będą widoczne na Twoim profilu i będziesz mógł logować się z użyciem Twittera."
connected-to: "Jesteś połączony z tym kontem Twittera"
detail: "Szczegóły…"
reconnect: "Połącz ponownie"
connect: "Połącz z kontem Twittera"
disconnect: "Rozłącz"
common/views/components/uploader.vue:
waiting: "Oczekiwanie"
common/views/widgets/broadcast.vue:
fetching: "Sprawdzanie"
no-broadcasts: "Brak transmisji"
have-a-nice-day: "Miłego dnia!"
next: "Dalej"
common/views/widgets/donation.vue:
title: "Dotacje"
text: "Aby utrzymywać Misskey, płacimy za domenę, serwery i nie tylko… Nie zarabiamy na tym, więc byłoby nam miło, gdybyśmy uzyskali od Ciebie dotację. Jeżeli jesteś zainteresowany, skontaktuj się z {}. Dziękujemy za wsparcie!"
common/views/widgets/photo-stream.vue:
title: "Photostream"
no-photos: "Brak zdjęć"
common/views/widgets/server.vue:
title: "Informacje o serwerze"
toggle: "Przełącz widok"
desktop/views/components/activity.vue:
title: "Aktywność"
toggle: "Przełącz widok"
desktop/views/components/calendar.vue:
title: "{1} / {2}"
prev: "Poprzedni miesiąc"
next: "Następny miesiąc"
go: "Naciśnij, aby przejść"
desktop/views/components/drive-window.vue:
used: "wykorzystane"
drive: "Dysk"
desktop/views/components/drive.file.vue:
avatar: "Awatar"
banner: "Baner"
contextmenu:
rename: "Zmień nazwę"
copy-url: "Skopiuj adres"
download: "Pobierz"
else-files: "Inne"
set-as-avatar: "Ustaw jako awatar"
set-as-banner: "Ustaw jako baner"
open-in-app: "Otwórz w aplikacji"
add-app: "Dodaj aplikację"
rename-file: "Zmień nazwę pliku"
input-new-file-name: "Wprowadź nową nazwę"
copied: "Skopiowano"
copied-url-to-clipboard: "Skopiowano adres do schowka"
desktop/views/components/drive.folder.vue:
unable-to-process: "Nie udało się ukończyć działania."
circular-reference-detected: "Docelowy katalog znajduje się w katalogu, który chcesz przenieść."
unhandled-error: "Nieznany błąd"
contextmenu:
move-to-this-folder: "Przenieś do tego katalogu"
show-in-new-window: "Otwórz w nowym oknie"
rename: "Zmień nazwę"
rename-folder: "Zmień nazwę katalogu"
input-new-folder-name: "Wprowadź nową nazwę"
desktop/views/components/drive.nav-folder.vue:
drive: "Dysk"
desktop/views/components/drive.vue:
search: "Szukaj"
load-more: "Załaduj więcej"
empty-draghover: "ドロップですか?いいですよ、ボクはカワイイですからね"
empty-drive: "Twój dysk jest pusty"
empty-drive-description: "Możesz wysłać plik klikając prawym przyciskiem myszy i wybierając \"Wyślij plik\" lub przeciągnąć plik i upuścić w tym oknie."
empty-folder: "Ten katalog jest posty"
unable-to-process: "Nie udało się dokończyć działania."
circular-reference-detected: "Ten katalog znajduje się w katalogu, który chcesz przenieść."
unhandled-error: "Nieznany błąd"
url-upload: "Wyślij z adresu"
url-of-file: "Adres URL pliku, który chcesz wysłać"
url-upload-requested: "Zaplanowano wysyłanie"
may-take-time: "Może trochę potrwać, zanim wysyłanie zostanie ukończone."
create-folder: "Utwórz katalog"
folder-name: "Nazwa katalogu"
contextmenu:
create-folder: "Utwórz katalog"
upload: "Wyślij plik"
url-upload: "Wyślij z adresu URL"
desktop/views/components/home.vue:
done: "Wyślij"
add-widget: "Dodaj widżet:"
profile: "Profil"
calendar: "Kalendarz"
timemachine: "Kalendarz (wehikuł czasu)"
activity: "Aktywność"
rss: "Czytnik RSS"
trends: "Na czasie"
photostream: "Photostream"
slideshow: "Pokaz slajdów"
version: "Wersja"
broadcast: "ブロードキャスト"
notifications: "Powiadomienia"
users: "Polecani użytkownicy"
polls: "Ankiety"
post-form: "投稿フォーム"
messaging: "Wiadomości"
channel: "Kanał"
access-log: "アクセスログ"
server: "Informacje o serwerze"
donation: "Dotacje"
nav: "Nawigacja"
tips: "Wskazówki"
add: "Dodaj"
desktop/views/components/messaging-window.vue:
title: "Wiadomości"
desktop/views/components/notes.note.vue:
reposted-by: "Udostępniono przez {}"
reply: "Odpowiedz"
renote: "Przeredaguj"
add-reaction: "Dodaj reakcję"
detail: "Pokaż szczegóły"
desktop/views/components/notifications.vue:
more: "Więcej"
empty: "Brak powiadomień"
desktop/views/components/post-form.vue:
note-placeholder: "Co się dzieje?"
reply-placeholder: "Odpowiedz na ten wpis…"
quote-placeholder: "Zacytuj ten wpis…"
note: "Wyślij"
reply: "Odpowiedz"
renote: "Przeredaguj"
posted: "Opublikowano!"
replied: "Odpowiedziano!"
reposted: "Udostępniono!"
note-failed: "Nie udało się wysłać"
reply-failed: "Nie udało się odpowiedzieć"
renote-failed: "Nie udało się przeredagować"
posting: "Wysyłanie"
attach-media-from-local: "Załącz zawartość multimedialną z komputera"
attach-media-from-drive: "Załącz zawartość multimedialną z dysku"
attach-cancel: "Usuń załącznik"
insert-a-kao: "v(‘ω’)v"
create-poll: "Utwórz ankietę"
text-remain: "pozostałe znaki: {}"
desktop/views/components/post-form-window.vue:
note: "Nowy wpis"
reply: "Odpowiedz"
attaches: "{} załączników multimedialnych"
uploading-media: "Wysyłanie {} treści multimedialnych"
desktop/views/components/renote-form.vue:
quote: "Cytuj…"
cancel: "Anuluj"
renote: "Przeredaguj"
reposting: "Udostępnianie…"
success: "Udostępniono!"
failure: "Nie udało się przeredagować"
desktop/views/components/renote-form-window.vue:
title: "Czy na pewno chcesz przeredagować ten wpis?"
desktop/views/components/settings.vue:
profile: "Profil"
notification: "Powiadomienia"
apps: "Aplikacje"
mute: "Wyciszanie"
drive: "Dysk"
security: "Bezpieczeństwo"
signin: "Historia logowań"
password: "Hasło"
2fa: "Uwierzytelnianie dwuetapowe"
other: "Inne"
license: "Licencja"
desktop/views/components/settings.2fa.vue:
intro: "Jeżeli skonfigurujesz uwierzytelnianie dwuetapowe, aby zablokować się będziesz potrzebować (oprócz hasła) kodu ze skonfigurowanego urządzenia (np. smartfonu), co zwiększy bezpieczeństwo."
detail: "Zobacz szczegóły…"
url: "https://www.google.com/landing/2step/"
caution: "Jeżeli stracisz dostęp do urządzenia, nie będziesz mógł logować się do Misskey!"
register: "Zarejestruj urządzenie"
already-registered: "Urządzenie jest już zarejestrowane"
unregister: "Wyłącz"
unregistered: "Wyłączono uwierzytelnianie dwuetapowe."
enter-password: "Wprowadź hasło"
authenticator: "Na początek musisz zainstalować Google Authenticator na swoim urządzeniu:"
howtoinstall: "Jak zainstalować"
scan: "Później, zeskanuje ten kod QR:"
done: "Wprowadź token wyświetlony na Twoim urządzeniu:"
submit: "Wyślij"
success: "Pomyślnie ukończono konfigurację!"
failed: "Nie udało się skonfigurować uwierzytelniania dwuetapowego, upewnij się że wprowadziłeś prawidłowy token."
info: "Od teraz, wprowadzaj token wyświetlany na urządzeniu przy każdym logowaniu do Misskey."
desktop/views/components/settings.api.vue:
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
caution: "Nie pokazuj tego tokenu osobom trzecim (nie wprowadzaj go nigdzie indziej), aby konto nie trafiło w niepowołane ręce."
regeneration-of-token: "W przypadku wycieku tokenu, możesz wygenerować nowy."
regenerate-token: "Wygeneruj nowy token"
token: "Token:"
enter-password: "Wprowadź hasło"
desktop/views/components/settings.app.vue:
no-apps: "Brak zautoryzowanych aplikacji"
desktop/views/components/settings.mute.vue:
no-users: "Brak wyciszonych użytkowników"
desktop/views/components/settings.password.vue:
reset: "Zmień hasło"
enter-current-password: "Wprowadź obecne hasło"
enter-new-password: "Wprowadź nowe hasło"
enter-new-password-again: "Wprowadź ponownie nowe hasło"
not-match: "Nowe hasła nie pasują do siebie"
changed: "Pomyślnie zmieniono hasło"
desktop/views/components/settings.profile.vue:
avatar: "Awatar"
choice-avatar: "Wybierz obraz"
name: "Nazwa"
location: "Lokalizacja"
description: "Opis"
birthday: "Data urodzenia"
save: "Aktualizuj profil"
desktop/views/components/timeline.vue:
home: "Strona główna"
local: "Lokalne"
global: "Globalne"
list: "Listy"
desktop/views/components/ui.header.account.vue:
profile: "Twój profil"
drive: "Dysk"
favorites: "Ulubione"
lists: "Listy"
customize: "Dostosuj"
settings: "Ustawienia"
signout: "Wyloguj się"
dark: "Sprowadź ciemność"
desktop/views/components/ui.header.nav.vue:
home: "Strona główna"
messaging: "Wiadomości"
game: "Gra"
desktop/views/components/ui.header.notifications.vue:
title: "Powiadomienia"
desktop/views/components/ui.header.post.vue:
post: "Utwórz nowy wpis"
desktop/views/components/ui.header.search.vue:
placeholder: "Szukaj"
desktop/views/components/user-lists-window.vue:
create-list: "Utwórz listę"
desktop/views/components/user-preview.vue:
notes: "Wpisy"
following: "Śledzeni"
followers: "Śledzący"
desktop/views/components/users-list.vue:
all: "Wszyscy"
iknow: "Znasz"
load-more: "Więcej"
fetching: "Ładowanie…"
desktop/views/pages/note.vue:
prev: "Poprzedni wpis"
next: "Następny wpis"
desktop/views/pages/selectdrive.vue:
title: "Wybierz plik(i)"
ok: "OK"
cancel: "Anuluj"
upload: "Wyślij pliki z Twojego komputera"
desktop/views/pages/user/user.followers-you-know.vue:
title: "Śledzący których znasz"
loading: "Ładowanie"
no-users: "Brak użytkowników"
desktop/views/pages/user/user.friends.vue:
title: "Najbardziej aktywni"
loading: "Ładowanie"
no-users: "Brak użytkowników"
desktop/views/pages/user/user.header.vue:
is-suspended: "To konto zostało zawieszone."
is-remote: "To jest użytkownik zdalnej instancji, informacje mogą nie być w pełni dokładne."
view-remote: "Wyświetl dokładne informacje"
desktop/views/pages/user/user.home.vue:
last-used-at: "Ostatnio aktywny: "
desktop/views/pages/user/user.photos.vue:
title: "Zdjęcia"
loading: "Ładowanie"
no-photos: "Brak zdjęć"
desktop/views/pages/user/user.profile.vue:
follows-you: "Śledzi Cię"
stalk: "Stalkuj"
stalking: "Stalkujesz"
unstalk: "Przestań stalkować"
mute: "Wycisz"
muted: "Wyciszyłeś"
unmute: "Cofnij wyciszenie"
desktop/views/widgets/messaging.vue:
title: "Wiadomości"
desktop/views/widgets/notifications.vue:
title: "Powiadomienia"
settings: "Ustawienia"
desktop/views/widgets/polls.vue:
title: "Ankiety"
refresh: "Pokaż inne"
nothing: "Pusto"
desktop/views/widgets/post-form.vue:
title: "Wpis"
note: "Wpis"
placeholder: "Co się dzieje?"
desktop/views/widgets/trends.vue:
title: "Na czasie"
refresh: "Pokaż inne"
nothing: "Pusto"
desktop/views/widgets/users.vue:
title: "Polecani użytkownicy"
refresh: "Pokaż innych"
no-one: "Pusto"
desktop/views/widgets/channel.vue:
title: "Kanał"
settings: "Ustawienia widżetu"
get-started: "右上の歯車をクリックして受信するチャンネルを指定してください"
mobile/views/components/drive.vue:
drive: "Dysk"
used: "użyto"
folder-count: "Katalog(i)"
count-separator: ", "
file-count: "Plik(i)"
load-more: "Załaduj więcej"
nothing-in-drive: "Pusto"
folder-is-empty: "Ten katalog jest pusty"
mobile/views/components/drive-file-chooser.vue:
select-file: "Wybierz plik"
mobile/views/components/drive-folder-chooser.vue:
select-folder: "Wybierz katalog"
mobile/views/components/drive.file-detail.vue:
download: "Pobierz"
rename: "Zmień nazwę"
move: "Przenieś"
hash: "Hash (md5)"
exif: "EXIF"
mobile/views/components/follow-button.vue:
follow: "Śledź"
unfollow: "Przestań śledzić"
mobile/views/components/note.vue:
reposted-by: "Udostępniono przez {}"
mobile/views/components/note-detail.vue:
reply: "Odpowiedz"
reaction: "Reakcja"
mobile/views/components/notifications.vue:
more: "Więcej"
empty: "Brak powiadomień"
mobile/views/components/post-form.vue:
submit: "Wyślij"
reply: "返信"
renote: "Renote"
renote-placeholder: "この投稿を引用... (オプション)"
reply-placeholder: "Odpowiedź na ten wpis…"
note-placeholder: "Co się dzieje?"
mobile/views/components/sub-note-content.vue:
media-count: "{} zawartości multimedialnej"
poll: "Ankieta"
mobile/views/components/timeline.vue:
empty: "Brak wpisów"
load-more: "Więcej"
mobile/views/components/ui.nav.vue:
home: "Strona główna"
notifications: "Powiadomienia"
messaging: "Wiadomości"
search: "Szukaj"
drive: "Dysk"
settings: "Ustawienia"
about: "O Misskey"
mobile/views/components/user-timeline.vue:
no-notes: "Wygląda na to, że ten użytkownik nie opublikował jeszcze niczego"
no-notes-with-media: "Brak wpisów z zawartością multimedialną"
load-more: "Więcej"
mobile/views/components/users-list.vue:
all: "Wszyscy"
known: "Znasz"
load-more: "Więcej"
mobile/views/pages/drive.vue:
drive: "Dysk"
mobile/views/pages/followers.vue:
followers-of: "Śledzący {}"
mobile/views/pages/following.vue:
following-of: "Śledzeni przez {}"
mobile/views/pages/home.vue:
timeline: "Oś czasu"
mobile/views/pages/messaging.vue:
messaging: "Wiadomości"
mobile/views/pages/messaging-room.vue:
messaging: "Wiadomości"
mobile/views/pages/note.vue:
title: "Wyślij"
prev: "Poprzedni wpis"
next: "Następny wpis"
mobile/views/pages/notifications.vue:
notifications: "Powiadomienia"
read-all: "Czy na pewno chcesz oznaczyć wszystkie powiadomienia jako przeczytane?"
mobile/views/pages/profile-setting.vue:
title: "Ustawienia profilu"
will-be-published: "Te ustawienia profilu zostaną zaktualizowane."
name: "Nazwa"
location: "Lokalizacja"
description: "Opis"
birthday: "Data urodzenia"
avatar: "Awatar"
banner: "Baner"
avatar-saved: "Pomyślnie zaktualizowano awatar"
banner-saved: "Pomyślnie zaktualizowano baner"
set-avatar: "Wybierz awatar"
set-banner: "Wybierz baner"
save: "Zapisz"
saved: "Pomyślnie zaktualizowano profil"
mobile/views/pages/search.vue:
search: "Szukaj"
empty: "Nie znaleziono wpisów zawierających '{}'"
mobile/views/pages/selectdrive.vue:
select-file: "Wybierz plik"
mobile/views/pages/settings.vue:
signed-in-as: "Zalogowany jako {}"
profile: "Profil"
twitter: "Połączenie z Twitterem"
signin-history: "Historia logowań"
settings: "Ustawienia"
signout: "Wyloguj"
mobile/views/pages/user.vue:
follows-you: "Śledzi Cię"
following: "Śledzeni"
followers: "Śledzący"
notes: "Wpisy"
overview: "Przegląd"
timeline: "Oś czasu"
media: "Zawartość multimedialna"
is-suspended: "To konto zostało zablokowane"
is-remote: "To jest użytkownik zdalnej instancji, informacje mogą nie być w pełni dokładne."
view-remote: "Wyświetl dokładne informacje"
mobile/views/pages/user/home.vue:
recent-notes: "Ostatnie wpisy"
images: "Zdjęcia"
activity: "Aktywność"
keywords: "Słowa kluczowe"
domains: "Domeny"
frequently-replied-users: "Często aktywni użytkownicy"
followers-you-know: "Śledzący których znasz"
last-used-at: "Ostatnio aktywny:"
mobile/views/pages/user/home.followers-you-know.vue:
loading: "Ładowanie"
no-users: "Brak użytkowników"
mobile/views/pages/user/home.friends.vue:
loading: "Ładowanie"
no-users: "Brak użytkowników"
mobile/views/pages/user/home.notes.vue:
loading: "Ładowanie"
no-notes: "Brak wpisów"
mobile/views/pages/user/home.photos.vue:
loading: "Ładowanie"
no-photos: "Brak zdjęć"
docs:
edit-this-page-on-github: "Znalazłeś błąd lub chcesz pomóc w tworzeniu dokumentacji?"
edit-this-page-on-github-link: "Edytuj stronę na GitHubie!"
api:
entities:
properties: "Właściwości"
endpoints:
params: "Parametry"
res: "Odpowiedź"
props:
name: "Nazwa"
type: "Rodzaj"
optional: "Nieobowiązkowy"
description: "Opis"
yes: "Tak"
no: "Nie"

596
locales/ru.yml Normal file
View File

@ -0,0 +1,596 @@
---
common:
misskey: "Misskeyで皆と共有しよう。"
time:
unknown: "なぞのじかん"
future: "未来"
just_now: "たった今"
seconds_ago: "{}秒前"
minutes_ago: "{}分前"
hours_ago: "{}時間前"
days_ago: "{}日前"
weeks_ago: "{}週間前"
months_ago: "{}ヶ月前"
years_ago: "{}年前"
weekday-short:
sunday: "日"
monday: "月"
tuesday: "火"
wednesday: "水"
thursday: "木"
friday: "金"
saturday: "土"
reactions:
like: "いいね"
love: "しゅき"
laugh: "笑"
hmm: "ふぅ~む"
surprise: "わお"
congrats: "おめでとう"
angry: "おこ"
confused: "こまこまのこまり"
pudding: "Pudding"
delete: "削除"
loading: "読み込み中"
ok: "わかった"
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
common/views/components/connect-failed.vue:
title: "サーバーに接続できません"
description: "インターネット回線に問題があるか、サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから{再度お試し}ください。"
thanks: "いつもMisskeyをご利用いただきありがとうございます。"
troubleshoot: "トラブルシュート"
common/views/components/connect-failed.troubleshooter.vue:
title: "トラブルシューティング"
network: "ネットワーク接続"
checking-network: "ネットワーク接続を確認中"
internet: "インターネット接続"
checking-internet: "インターネット接続を確認中"
server: "サーバー接続"
checking-server: "サーバー接続を確認中"
finding: "問題を調べています"
no-network: "ネットワークに接続されていません"
no-network-desc: "お使いのPCのネットワーク接続が正常か確認してください。"
no-internet: "インターネットに接続されていません"
no-internet-desc: "ネットワークには接続されていますが、インターネットには接続されていないようです。お使いのPCのインターネット接続が正常か確認してください。"
no-server: "Misskeyのサーバーに接続できません"
no-server-desc: "お使いのPCのインターネット接続は正常ですが、Misskeyのサーバーには接続できませんでした。サーバーがダウンまたはメンテナンスしている可能性があるので、しばらくしてから再度御アクセスください。"
success: "Misskeyのサーバーに接続できました"
success-desc: "正常に接続できるようです。ページを再度読み込みしてください。"
flush: "キャッシュの削除"
set-version: "バージョン指定"
common/views/components/messaging.vue:
search-user: "ユーザーを探す"
you: "あなた"
no-history: "履歴はありません"
common/views/components/messaging-room.vue:
empty: "このユーザーと話したことはありません"
more: "もっと読む"
no-history: "これより過去の履歴はありません"
resize-form: "ドラッグしてフォームの広さを調整"
new-message: "新しいメッセージがあります"
common/views/components/messaging-room.form.vue:
input-message-here: "ここにメッセージを入力"
send: "送信"
attach-from-local: "PCからファイルを添付する"
attach-from-drive: "ドライブからファイルを添付する"
common/views/components/messaging-room.message.vue:
is-read: "既読"
deleted: "このメッセージは削除されました"
common/views/components/nav.vue:
about: "Misskeyについて"
stats: "統計"
status: "ステータス"
wiki: "Wiki"
donors: "ドナー"
repository: "リポジトリ"
develop: "開発者"
feedback: "フィードバック"
common/views/components/note-menu.vue:
favorite: "お気に入り"
pin: "ピン留め"
remote: "投稿元で見る"
common/views/components/poll.vue:
vote-to: "「{}」に投票する"
vote-count: "{}票"
total-users: "{}人が投票"
vote: "投票する"
show-result: "結果を見る"
voted: "投票済み"
common/views/components/poll-editor.vue:
no-only-one-choice: "投票には、選択肢が最低2つ必要です"
choice-n: "選択肢{}"
remove: "この選択肢を削除"
add: "+選択肢を追加"
destroy: "投票を破棄"
common/views/components/reaction-picker.vue:
choose-reaction: "リアクションを選択"
common/views/components/signin.vue:
username: "ユーザー名"
password: "パスワード"
token: "トークン"
signing-in: "やってます..."
signin: "サインイン"
common/views/components/signup.vue:
username: "ユーザー名"
checking: "確認しています..."
available: "利用できます"
unavailable: "既に利用されています"
error: "通信エラー"
invalid-format: "a~z、A~Z、0~9、_が使えます"
too-short: "1文字以上でお願いします"
too-long: "20文字以内でお願いします"
password: "パスワード"
password-placeholder: "8文字以上を推奨します"
weak-password: "弱いパスワード"
normal-password: "まあまあのパスワード"
strong-password: "強いパスワード"
retype: "再入力"
retype-placeholder: "確認のため再入力してください"
password-matched: "確認されました"
password-not-matched: "一致していません"
recaptcha: "認証"
create: "アカウント作成"
some-error: "何らかの原因によりアカウントの作成に失敗しました。再度お試しください。"
common/views/components/special-message.vue:
new-year: "Happy New Year!"
christmas: "Merry Christmas!"
common/views/components/stream-indicator.vue:
connecting: "接続中"
reconnecting: "再接続中"
connected: "接続完了"
common/views/components/twitter-setting.vue:
description: "お使いのTwitterアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでTwitterアカウント情報が表示されるようになったり、Twitterを用いた便利なサインインを利用できるようになります。"
connected-to: "次のTwitterアカウントに接続されています"
detail: "詳細..."
reconnect: "再接続する"
connect: "Twitterと接続する"
disconnect: "切断する"
common/views/components/uploader.vue:
waiting: "待機中"
common/views/widgets/broadcast.vue:
fetching: "確認中"
no-broadcasts: "お知らせはありません"
have-a-nice-day: "良い一日を!"
next: "次"
common/views/widgets/donation.vue:
title: "寄付のお願い"
text: "Misskeyの運営にはドメイン、サーバー等のコストが掛かります。Misskeyは広告を掲載したりしないため、収入を皆様からの寄付に頼っています。もしご興味があれば、{}までご連絡ください。ご協力ありがとうございます。"
common/views/widgets/photo-stream.vue:
title: "フォトストリーム"
no-photos: "写真はありません"
common/views/widgets/server.vue:
title: "サーバー情報"
toggle: "表示を切り替え"
desktop/views/components/activity.vue:
title: "アクティビティ"
toggle: "表示を切り替え"
desktop/views/components/calendar.vue:
title: "{1}年 {2}月"
prev: "前の月"
next: "次の月"
go: "クリックして時間遡行"
desktop/views/components/drive-window.vue:
used: "使用中"
drive: "ドライブ"
desktop/views/components/drive.file.vue:
avatar: "アイコン"
banner: "バナー"
contextmenu:
rename: "名前を変更"
copy-url: "URLをコピー"
download: "ダウンロード"
else-files: "その他..."
set-as-avatar: "アイコンに設定"
set-as-banner: "バナーに設定"
open-in-app: "アプリで開く"
add-app: "アプリを追加"
rename-file: "ファイル名の変更"
input-new-file-name: "新しいファイル名を入力してください"
copied: "コピー完了"
copied-url-to-clipboard: "URLをクリップボードにコピーしました"
desktop/views/components/drive.folder.vue:
unable-to-process: "操作を完了できません"
circular-reference-detected: "移動先のフォルダーは、移動するフォルダーのサブフォルダーです。"
unhandled-error: "不明なエラー"
contextmenu:
move-to-this-folder: "このフォルダへ移動"
show-in-new-window: "新しいウィンドウで表示"
rename: "名前を変更"
rename-folder: "フォルダ名の変更"
input-new-folder-name: "新しいフォルダ名を入力してください"
desktop/views/components/drive.nav-folder.vue:
drive: "ドライブ"
desktop/views/components/drive.vue:
search: "検索"
load-more: "もっと読み込む"
empty-draghover: "ドロップですか?いいですよ、ボクはカワイイですからね"
empty-drive: "ドライブには何もありません。"
empty-drive-description: "右クリックして「ファイルをアップロード」を選んだり、ファイルをドラッグ&ドロップすることでもアップロードできます。"
empty-folder: "このフォルダーは空です"
unable-to-process: "操作を完了できません"
circular-reference-detected: "移動先のフォルダーは、移動するフォルダーのサブフォルダーです。"
unhandled-error: "不明なエラー"
url-upload: "URLアップロード"
url-of-file: "アップロードしたいファイルのURL"
url-upload-requested: "アップロードをリクエストしました"
may-take-time: "アップロードが完了するまで時間がかかる場合があります。"
create-folder: "フォルダー作成"
folder-name: "フォルダー名"
contextmenu:
create-folder: "フォルダーを作成"
upload: "ファイルをアップロード"
url-upload: "URLからアップロード"
desktop/views/components/home.vue:
done: "完了"
add-widget: "ウィジェットを追加:"
profile: "プロフィール"
calendar: "カレンダー"
timemachine: "カレンダー(タイムマシン)"
activity: "アクティビティ"
rss: "RSSリーダー"
trends: "トレンド"
photostream: "フォトストリーム"
slideshow: "スライドショー"
version: "バージョン"
broadcast: "ブロードキャスト"
notifications: "通知"
users: "おすすめユーザー"
polls: "投票"
post-form: "投稿フォーム"
messaging: "メッセージ"
channel: "チャンネル"
access-log: "アクセスログ"
server: "サーバー情報"
donation: "寄付のお願い"
nav: "ナビゲーション"
tips: "ヒント"
add: "追加"
desktop/views/components/messaging-window.vue:
title: "メッセージ"
desktop/views/components/notes.note.vue:
reposted-by: "{}がRenote"
reply: "返信"
renote: "Renote"
add-reaction: "リアクション"
detail: "詳細"
desktop/views/components/notifications.vue:
more: "もっと見る"
empty: "ありません!"
desktop/views/components/post-form.vue:
note-placeholder: "いまどうしてる?"
reply-placeholder: "この投稿への返信..."
quote-placeholder: "この投稿を引用..."
note: "投稿"
reply: "返信"
renote: "Renote"
posted: "投稿しました!"
replied: "返信しました!"
reposted: "Renoteしました"
note-failed: "投稿に失敗しました"
reply-failed: "返信に失敗しました"
renote-failed: "Renoteに失敗しました"
posting: "投稿中"
attach-media-from-local: "PCからメディアを添付"
attach-media-from-drive: "ドライブからメディアを添付"
attach-cancel: "添付取り消し"
insert-a-kao: "v(‘ω’)v"
create-poll: "投票を作成"
text-remain: "残り{}文字"
desktop/views/components/post-form-window.vue:
note: "新規投稿"
reply: "返信"
attaches: "添付: {}メディア"
uploading-media: "{}個のメディアをアップロード中"
desktop/views/components/renote-form.vue:
quote: "引用する..."
cancel: "キャンセル"
renote: "Renote"
reposting: "しています..."
success: "Renoteしました"
failure: "Renoteに失敗しました"
desktop/views/components/renote-form-window.vue:
title: "この投稿をRenoteしますか"
desktop/views/components/settings.vue:
profile: "プロフィール"
notification: "通知"
apps: "アプリ"
mute: "ミュート"
drive: "ドライブ"
security: "セキュリティ"
signin: "サインイン履歴"
password: "パスワード"
2fa: "二段階認証"
other: "その他"
license: "ライセンス"
desktop/views/components/settings.2fa.vue:
intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。"
detail: "詳細..."
url: "https://www.google.co.jp/intl/ja/landing/2step/"
caution: "登録したデバイスを紛失するなどした場合、Misskeyにサインインできなくなりますのでご注意ください。"
register: "デバイスを登録する"
already-registered: "既に設定は完了しています。"
unregister: "設定を解除"
unregistered: "二段階認証が無効になりました。"
enter-password: "パスワードを入力してください"
authenticator: "まず、Google Authenticatorをお使いのデバイスにインストールします:"
howtoinstall: "インストール方法はこちら"
scan: "次に、表示されているQRコードをスキャンします:"
done: "お使いのデバイスに表示されているトークンを入力して完了します:"
submit: "完了"
success: "設定が完了しました!"
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
desktop/views/components/settings.api.vue:
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
regenerate-token: "トークンを再生成"
token: "Token:"
enter-password: "パスワードを入力してください"
desktop/views/components/settings.app.vue:
no-apps: "連携しているアプリケーションはありません"
desktop/views/components/settings.mute.vue:
no-users: "ミュートしているユーザーはいません"
desktop/views/components/settings.password.vue:
reset: "パスワードを変更する"
enter-current-password: "現在のパスワードを入力してください"
enter-new-password: "新しいパスワードを入力してください"
enter-new-password-again: "もう一度新しいパスワードを入力してください"
not-match: "新しいパスワードが一致しません"
changed: "パスワードを変更しました"
desktop/views/components/settings.profile.vue:
avatar: "アイコン"
choice-avatar: "画像を選択"
name: "名前"
location: "場所"
description: "自己紹介"
birthday: "誕生日"
save: "保存"
desktop/views/components/timeline.vue:
home: "ホーム"
local: "ローカル"
global: "グローバル"
list: "リスト"
desktop/views/components/ui.header.account.vue:
profile: "プロフィール"
drive: "ドライブ"
favorites: "お気に入り"
lists: "リスト"
customize: "カスタマイズ"
settings: "設定"
signout: "サインアウト"
dark: "闇に飲まれる"
desktop/views/components/ui.header.nav.vue:
home: "ホーム"
messaging: "メッセージ"
game: "ゲーム"
desktop/views/components/ui.header.notifications.vue:
title: "通知"
desktop/views/components/ui.header.post.vue:
post: "新規投稿"
desktop/views/components/ui.header.search.vue:
placeholder: "検索"
desktop/views/components/user-lists-window.vue:
create-list: "リストを作成"
desktop/views/components/user-preview.vue:
notes: "投稿"
following: "フォロー"
followers: "フォロワー"
desktop/views/components/users-list.vue:
all: "すべて"
iknow: "知り合い"
load-more: "もっと"
fetching: "読み込んでいます"
desktop/views/pages/note.vue:
prev: "前の投稿"
next: "次の投稿"
desktop/views/pages/selectdrive.vue:
title: "ファイルを選択してください"
ok: "決定"
cancel: "キャンセル"
upload: "PCからドライブにファイルをアップロード"
desktop/views/pages/user/user.followers-you-know.vue:
title: "知り合いのフォロワー"
loading: "読み込み中"
no-users: "知り合いのフォロワーはいません"
desktop/views/pages/user/user.friends.vue:
title: "よく話すユーザー"
loading: "読み込み中"
no-users: "よく話すユーザーはいません"
desktop/views/pages/user/user.header.vue:
is-suspended: "このユーザーは凍結されています。"
is-remote: "このユーザーはリモートユーザーです。"
view-remote: "正確な情報を見る"
desktop/views/pages/user/user.home.vue:
last-used-at: "最終アクセス"
desktop/views/pages/user/user.photos.vue:
title: "フォト"
loading: "読み込み中"
no-photos: "写真はありません"
desktop/views/pages/user/user.profile.vue:
follows-you: "フォローされています"
stalk: "ストークする"
stalking: "ストーキングしています"
unstalk: "ストーク解除"
mute: "ミュートする"
muted: "ミュートしています"
unmute: "ミュート解除"
desktop/views/widgets/messaging.vue:
title: "メッセージ"
desktop/views/widgets/notifications.vue:
title: "通知"
settings: "通知の設定"
desktop/views/widgets/polls.vue:
title: "投票"
refresh: "他を見る"
nothing: "ありません!"
desktop/views/widgets/post-form.vue:
title: "投稿"
note: "投稿"
placeholder: "いまどうしてる?"
desktop/views/widgets/trends.vue:
title: "トレンド"
refresh: "他を見る"
nothing: "ありません!"
desktop/views/widgets/users.vue:
title: "おすすめユーザー"
refresh: "他を見る"
no-one: "いません!"
desktop/views/widgets/channel.vue:
title: "チャンネル"
settings: "ウィジェットの設定"
get-started: "右上の歯車をクリックして受信するチャンネルを指定してください"
mobile/views/components/drive.vue:
drive: "ドライブ"
used: "使用中"
folder-count: "フォルダ"
count-separator: "、"
file-count: "ファイル"
load-more: "もっと読み込む"
nothing-in-drive: "ドライブには何もありません"
folder-is-empty: "このフォルダは空です"
mobile/views/components/drive-file-chooser.vue:
select-file: "ファイルを選択"
mobile/views/components/drive-folder-chooser.vue:
select-folder: "フォルダーを選択"
mobile/views/components/drive.file-detail.vue:
download: "ダウンロード"
rename: "名前を変更"
move: "移動"
hash: "ハッシュ (md5)"
exif: "EXIF"
mobile/views/components/follow-button.vue:
follow: "フォロー"
unfollow: "フォロー解除"
mobile/views/components/note.vue:
reposted-by: "{}がRenote"
mobile/views/components/note-detail.vue:
reply: "返信"
reaction: "リアクション"
mobile/views/components/notifications.vue:
more: "もっと見る"
empty: "ありません!"
mobile/views/components/post-form.vue:
submit: "投稿"
reply: "返信"
renote: "Renote"
renote-placeholder: "この投稿を引用... (オプション)"
reply-placeholder: "この投稿への返信..."
note-placeholder: "いまどうしてる?"
mobile/views/components/sub-note-content.vue:
media-count: "{}個のメディア"
poll: "投票"
mobile/views/components/timeline.vue:
empty: "投稿がありません"
load-more: "もっと"
mobile/views/components/ui.nav.vue:
home: "ホーム"
notifications: "通知"
messaging: "メッセージ"
search: "検索"
drive: "ドライブ"
settings: "設定"
about: "Misskeyについて"
mobile/views/components/user-timeline.vue:
no-notes: "このユーザーは投稿していないようです。"
no-notes-with-media: "メディア付き投稿はありません。"
load-more: "もっと"
mobile/views/components/users-list.vue:
all: "すべて"
known: "知り合い"
load-more: "もっと"
mobile/views/pages/drive.vue:
drive: "ドライブ"
mobile/views/pages/followers.vue:
followers-of: "{}のフォロワー"
mobile/views/pages/following.vue:
following-of: "{}のフォロー"
mobile/views/pages/home.vue:
timeline: "タイムライン"
mobile/views/pages/messaging.vue:
messaging: "メッセージ"
mobile/views/pages/messaging-room.vue:
messaging: "メッセージ"
mobile/views/pages/note.vue:
title: "投稿"
prev: "前の投稿"
next: "次の投稿"
mobile/views/pages/notifications.vue:
notifications: "通知"
read-all: "すべての通知を既読にしますか?"
mobile/views/pages/profile-setting.vue:
title: "プロフィール設定"
will-be-published: "これらのプロフィールは公開されます。"
name: "名前"
location: "場所"
description: "自己紹介"
birthday: "誕生日"
avatar: "アイコン"
banner: "バナー"
avatar-saved: "アイコンを保存しました"
banner-saved: "バナーを保存しました"
set-avatar: "アイコンを選択する"
set-banner: "バナーを選択する"
save: "保存"
saved: "プロフィールを保存しました"
mobile/views/pages/search.vue:
search: "検索"
empty: "「{}」に関する投稿は見つかりませんでした。"
mobile/views/pages/selectdrive.vue:
select-file: "ファイルを選択"
mobile/views/pages/settings.vue:
signed-in-as: "{}としてサインイン中"
profile: "プロフィール"
twitter: "Twitter連携"
signin-history: "サインイン履歴"
settings: "設定"
signout: "サインアウト"
mobile/views/pages/user.vue:
follows-you: "フォローされています"
following: "フォロー"
followers: "フォロワー"
notes: "投稿"
overview: "概要"
timeline: "タイムライン"
media: "メディア"
is-suspended: "このユーザーは凍結されています。"
is-remote: "このユーザーはリモートユーザーです。"
view-remote: "正確な情報を見る"
mobile/views/pages/user/home.vue:
recent-notes: "最近の投稿"
images: "画像"
activity: "アクティビティ"
keywords: "キーワード"
domains: "頻出ドメイン"
frequently-replied-users: "よく会話するユーザー"
followers-you-know: "知り合いのフォロワー"
last-used-at: "最終ログイン"
mobile/views/pages/user/home.followers-you-know.vue:
loading: "読み込み中"
no-users: "知り合いのユーザーはいません"
mobile/views/pages/user/home.friends.vue:
loading: "読み込み中"
no-users: "よく会話するユーザーはいません"
mobile/views/pages/user/home.notes.vue:
loading: "読み込み中"
no-notes: "投稿はありません"
mobile/views/pages/user/home.photos.vue:
loading: "読み込み中"
no-photos: "写真はありません"
docs:
edit-this-page-on-github: "間違いや改善点を見つけましたか?"
edit-this-page-on-github-link: "このページをGitHubで編集"
api:
entities:
properties: "プロパティ"
endpoints:
params: "パラメータ"
res: "レスポンス"
props:
name: "名前"
type: "型"
optional: "オプション"
description: "説明"
yes: "はい"
no: "いいえ"

596
locales/zh.yml Normal file
View File

@ -0,0 +1,596 @@
---
common:
misskey: "Misskeyで皆と共有しよう。"
time:
unknown: "なぞのじかん"
future: "未来"
just_now: "たった今"
seconds_ago: "{}秒前"
minutes_ago: "{}分前"
hours_ago: "{}時間前"
days_ago: "{}日前"
weeks_ago: "{}週間前"
months_ago: "{}ヶ月前"
years_ago: "{}年前"
weekday-short:
sunday: "日"
monday: "月"
tuesday: "火"
wednesday: "水"
thursday: "木"
friday: "金"
saturday: "土"
reactions:
like: "いいね"
love: "しゅき"
laugh: "笑"
hmm: "ふぅ~む"
surprise: "わお"
congrats: "おめでとう"
angry: "おこ"
confused: "こまこまのこまり"
pudding: "Pudding"
delete: "削除"
loading: "読み込み中"
ok: "わかった"
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
common/views/components/connect-failed.vue:
title: "サーバーに接続できません"
description: "インターネット回線に問題があるか、サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから{再度お試し}ください。"
thanks: "いつもMisskeyをご利用いただきありがとうございます。"
troubleshoot: "トラブルシュート"
common/views/components/connect-failed.troubleshooter.vue:
title: "トラブルシューティング"
network: "ネットワーク接続"
checking-network: "ネットワーク接続を確認中"
internet: "インターネット接続"
checking-internet: "インターネット接続を確認中"
server: "サーバー接続"
checking-server: "サーバー接続を確認中"
finding: "問題を調べています"
no-network: "ネットワークに接続されていません"
no-network-desc: "お使いのPCのネットワーク接続が正常か確認してください。"
no-internet: "インターネットに接続されていません"
no-internet-desc: "ネットワークには接続されていますが、インターネットには接続されていないようです。お使いのPCのインターネット接続が正常か確認してください。"
no-server: "Misskeyのサーバーに接続できません"
no-server-desc: "お使いのPCのインターネット接続は正常ですが、Misskeyのサーバーには接続できませんでした。サーバーがダウンまたはメンテナンスしている可能性があるので、しばらくしてから再度御アクセスください。"
success: "Misskeyのサーバーに接続できました"
success-desc: "正常に接続できるようです。ページを再度読み込みしてください。"
flush: "キャッシュの削除"
set-version: "バージョン指定"
common/views/components/messaging.vue:
search-user: "ユーザーを探す"
you: "あなた"
no-history: "履歴はありません"
common/views/components/messaging-room.vue:
empty: "このユーザーと話したことはありません"
more: "もっと読む"
no-history: "これより過去の履歴はありません"
resize-form: "ドラッグしてフォームの広さを調整"
new-message: "新しいメッセージがあります"
common/views/components/messaging-room.form.vue:
input-message-here: "ここにメッセージを入力"
send: "送信"
attach-from-local: "PCからファイルを添付する"
attach-from-drive: "ドライブからファイルを添付する"
common/views/components/messaging-room.message.vue:
is-read: "既読"
deleted: "このメッセージは削除されました"
common/views/components/nav.vue:
about: "Misskeyについて"
stats: "統計"
status: "ステータス"
wiki: "Wiki"
donors: "ドナー"
repository: "リポジトリ"
develop: "開発者"
feedback: "フィードバック"
common/views/components/note-menu.vue:
favorite: "お気に入り"
pin: "ピン留め"
remote: "投稿元で見る"
common/views/components/poll.vue:
vote-to: "「{}」に投票する"
vote-count: "{}票"
total-users: "{}人が投票"
vote: "投票する"
show-result: "結果を見る"
voted: "投票済み"
common/views/components/poll-editor.vue:
no-only-one-choice: "投票には、選択肢が最低2つ必要です"
choice-n: "選択肢{}"
remove: "この選択肢を削除"
add: "+選択肢を追加"
destroy: "投票を破棄"
common/views/components/reaction-picker.vue:
choose-reaction: "リアクションを選択"
common/views/components/signin.vue:
username: "ユーザー名"
password: "パスワード"
token: "トークン"
signing-in: "やってます..."
signin: "サインイン"
common/views/components/signup.vue:
username: "ユーザー名"
checking: "確認しています..."
available: "利用できます"
unavailable: "既に利用されています"
error: "通信エラー"
invalid-format: "a~z、A~Z、0~9、_が使えます"
too-short: "1文字以上でお願いします"
too-long: "20文字以内でお願いします"
password: "パスワード"
password-placeholder: "8文字以上を推奨します"
weak-password: "弱いパスワード"
normal-password: "まあまあのパスワード"
strong-password: "強いパスワード"
retype: "再入力"
retype-placeholder: "確認のため再入力してください"
password-matched: "確認されました"
password-not-matched: "一致していません"
recaptcha: "認証"
create: "アカウント作成"
some-error: "何らかの原因によりアカウントの作成に失敗しました。再度お試しください。"
common/views/components/special-message.vue:
new-year: "Happy New Year!"
christmas: "Merry Christmas!"
common/views/components/stream-indicator.vue:
connecting: "接続中"
reconnecting: "再接続中"
connected: "接続完了"
common/views/components/twitter-setting.vue:
description: "お使いのTwitterアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでTwitterアカウント情報が表示されるようになったり、Twitterを用いた便利なサインインを利用できるようになります。"
connected-to: "次のTwitterアカウントに接続されています"
detail: "詳細..."
reconnect: "再接続する"
connect: "Twitterと接続する"
disconnect: "切断する"
common/views/components/uploader.vue:
waiting: "待機中"
common/views/widgets/broadcast.vue:
fetching: "確認中"
no-broadcasts: "お知らせはありません"
have-a-nice-day: "良い一日を!"
next: "次"
common/views/widgets/donation.vue:
title: "寄付のお願い"
text: "Misskeyの運営にはドメイン、サーバー等のコストが掛かります。Misskeyは広告を掲載したりしないため、収入を皆様からの寄付に頼っています。もしご興味があれば、{}までご連絡ください。ご協力ありがとうございます。"
common/views/widgets/photo-stream.vue:
title: "フォトストリーム"
no-photos: "写真はありません"
common/views/widgets/server.vue:
title: "サーバー情報"
toggle: "表示を切り替え"
desktop/views/components/activity.vue:
title: "アクティビティ"
toggle: "表示を切り替え"
desktop/views/components/calendar.vue:
title: "{1}年 {2}月"
prev: "前の月"
next: "次の月"
go: "クリックして時間遡行"
desktop/views/components/drive-window.vue:
used: "使用中"
drive: "ドライブ"
desktop/views/components/drive.file.vue:
avatar: "アイコン"
banner: "バナー"
contextmenu:
rename: "名前を変更"
copy-url: "URLをコピー"
download: "ダウンロード"
else-files: "その他..."
set-as-avatar: "アイコンに設定"
set-as-banner: "バナーに設定"
open-in-app: "アプリで開く"
add-app: "アプリを追加"
rename-file: "ファイル名の変更"
input-new-file-name: "新しいファイル名を入力してください"
copied: "コピー完了"
copied-url-to-clipboard: "URLをクリップボードにコピーしました"
desktop/views/components/drive.folder.vue:
unable-to-process: "操作を完了できません"
circular-reference-detected: "移動先のフォルダーは、移動するフォルダーのサブフォルダーです。"
unhandled-error: "不明なエラー"
contextmenu:
move-to-this-folder: "このフォルダへ移動"
show-in-new-window: "新しいウィンドウで表示"
rename: "名前を変更"
rename-folder: "フォルダ名の変更"
input-new-folder-name: "新しいフォルダ名を入力してください"
desktop/views/components/drive.nav-folder.vue:
drive: "ドライブ"
desktop/views/components/drive.vue:
search: "検索"
load-more: "もっと読み込む"
empty-draghover: "ドロップですか?いいですよ、ボクはカワイイですからね"
empty-drive: "ドライブには何もありません。"
empty-drive-description: "右クリックして「ファイルをアップロード」を選んだり、ファイルをドラッグ&ドロップすることでもアップロードできます。"
empty-folder: "このフォルダーは空です"
unable-to-process: "操作を完了できません"
circular-reference-detected: "移動先のフォルダーは、移動するフォルダーのサブフォルダーです。"
unhandled-error: "不明なエラー"
url-upload: "URLアップロード"
url-of-file: "アップロードしたいファイルのURL"
url-upload-requested: "アップロードをリクエストしました"
may-take-time: "アップロードが完了するまで時間がかかる場合があります。"
create-folder: "フォルダー作成"
folder-name: "フォルダー名"
contextmenu:
create-folder: "フォルダーを作成"
upload: "ファイルをアップロード"
url-upload: "URLからアップロード"
desktop/views/components/home.vue:
done: "完了"
add-widget: "ウィジェットを追加:"
profile: "プロフィール"
calendar: "カレンダー"
timemachine: "カレンダー(タイムマシン)"
activity: "アクティビティ"
rss: "RSSリーダー"
trends: "トレンド"
photostream: "フォトストリーム"
slideshow: "スライドショー"
version: "バージョン"
broadcast: "ブロードキャスト"
notifications: "通知"
users: "おすすめユーザー"
polls: "投票"
post-form: "投稿フォーム"
messaging: "メッセージ"
channel: "チャンネル"
access-log: "アクセスログ"
server: "サーバー情報"
donation: "寄付のお願い"
nav: "ナビゲーション"
tips: "ヒント"
add: "追加"
desktop/views/components/messaging-window.vue:
title: "メッセージ"
desktop/views/components/notes.note.vue:
reposted-by: "{}がRenote"
reply: "返信"
renote: "Renote"
add-reaction: "リアクション"
detail: "詳細"
desktop/views/components/notifications.vue:
more: "もっと見る"
empty: "ありません!"
desktop/views/components/post-form.vue:
note-placeholder: "いまどうしてる?"
reply-placeholder: "この投稿への返信..."
quote-placeholder: "この投稿を引用..."
note: "投稿"
reply: "返信"
renote: "Renote"
posted: "投稿しました!"
replied: "返信しました!"
reposted: "Renoteしました"
note-failed: "投稿に失敗しました"
reply-failed: "返信に失敗しました"
renote-failed: "Renoteに失敗しました"
posting: "投稿中"
attach-media-from-local: "PCからメディアを添付"
attach-media-from-drive: "ドライブからメディアを添付"
attach-cancel: "添付取り消し"
insert-a-kao: "v(‘ω’)v"
create-poll: "投票を作成"
text-remain: "残り{}文字"
desktop/views/components/post-form-window.vue:
note: "新規投稿"
reply: "返信"
attaches: "添付: {}メディア"
uploading-media: "{}個のメディアをアップロード中"
desktop/views/components/renote-form.vue:
quote: "引用する..."
cancel: "キャンセル"
renote: "Renote"
reposting: "しています..."
success: "Renoteしました"
failure: "Renoteに失敗しました"
desktop/views/components/renote-form-window.vue:
title: "この投稿をRenoteしますか"
desktop/views/components/settings.vue:
profile: "プロフィール"
notification: "通知"
apps: "アプリ"
mute: "ミュート"
drive: "ドライブ"
security: "セキュリティ"
signin: "サインイン履歴"
password: "パスワード"
2fa: "二段階認証"
other: "その他"
license: "ライセンス"
desktop/views/components/settings.2fa.vue:
intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。"
detail: "詳細..."
url: "https://www.google.co.jp/intl/ja/landing/2step/"
caution: "登録したデバイスを紛失するなどした場合、Misskeyにサインインできなくなりますのでご注意ください。"
register: "デバイスを登録する"
already-registered: "既に設定は完了しています。"
unregister: "設定を解除"
unregistered: "二段階認証が無効になりました。"
enter-password: "パスワードを入力してください"
authenticator: "まず、Google Authenticatorをお使いのデバイスにインストールします:"
howtoinstall: "インストール方法はこちら"
scan: "次に、表示されているQRコードをスキャンします:"
done: "お使いのデバイスに表示されているトークンを入力して完了します:"
submit: "完了"
success: "設定が完了しました!"
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
desktop/views/components/settings.api.vue:
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
regenerate-token: "トークンを再生成"
token: "Token:"
enter-password: "パスワードを入力してください"
desktop/views/components/settings.app.vue:
no-apps: "連携しているアプリケーションはありません"
desktop/views/components/settings.mute.vue:
no-users: "ミュートしているユーザーはいません"
desktop/views/components/settings.password.vue:
reset: "パスワードを変更する"
enter-current-password: "現在のパスワードを入力してください"
enter-new-password: "新しいパスワードを入力してください"
enter-new-password-again: "もう一度新しいパスワードを入力してください"
not-match: "新しいパスワードが一致しません"
changed: "パスワードを変更しました"
desktop/views/components/settings.profile.vue:
avatar: "アイコン"
choice-avatar: "画像を選択"
name: "名前"
location: "場所"
description: "自己紹介"
birthday: "誕生日"
save: "保存"
desktop/views/components/timeline.vue:
home: "ホーム"
local: "ローカル"
global: "グローバル"
list: "リスト"
desktop/views/components/ui.header.account.vue:
profile: "プロフィール"
drive: "ドライブ"
favorites: "お気に入り"
lists: "リスト"
customize: "カスタマイズ"
settings: "設定"
signout: "サインアウト"
dark: "闇に飲まれる"
desktop/views/components/ui.header.nav.vue:
home: "ホーム"
messaging: "メッセージ"
game: "ゲーム"
desktop/views/components/ui.header.notifications.vue:
title: "通知"
desktop/views/components/ui.header.post.vue:
post: "新規投稿"
desktop/views/components/ui.header.search.vue:
placeholder: "検索"
desktop/views/components/user-lists-window.vue:
create-list: "リストを作成"
desktop/views/components/user-preview.vue:
notes: "投稿"
following: "フォロー"
followers: "フォロワー"
desktop/views/components/users-list.vue:
all: "すべて"
iknow: "知り合い"
load-more: "もっと"
fetching: "読み込んでいます"
desktop/views/pages/note.vue:
prev: "前の投稿"
next: "次の投稿"
desktop/views/pages/selectdrive.vue:
title: "ファイルを選択してください"
ok: "決定"
cancel: "キャンセル"
upload: "PCからドライブにファイルをアップロード"
desktop/views/pages/user/user.followers-you-know.vue:
title: "知り合いのフォロワー"
loading: "読み込み中"
no-users: "知り合いのフォロワーはいません"
desktop/views/pages/user/user.friends.vue:
title: "よく話すユーザー"
loading: "読み込み中"
no-users: "よく話すユーザーはいません"
desktop/views/pages/user/user.header.vue:
is-suspended: "このユーザーは凍結されています。"
is-remote: "このユーザーはリモートユーザーです。"
view-remote: "正確な情報を見る"
desktop/views/pages/user/user.home.vue:
last-used-at: "最終アクセス"
desktop/views/pages/user/user.photos.vue:
title: "フォト"
loading: "読み込み中"
no-photos: "写真はありません"
desktop/views/pages/user/user.profile.vue:
follows-you: "フォローされています"
stalk: "ストークする"
stalking: "ストーキングしています"
unstalk: "ストーク解除"
mute: "ミュートする"
muted: "ミュートしています"
unmute: "ミュート解除"
desktop/views/widgets/messaging.vue:
title: "メッセージ"
desktop/views/widgets/notifications.vue:
title: "通知"
settings: "通知の設定"
desktop/views/widgets/polls.vue:
title: "投票"
refresh: "他を見る"
nothing: "ありません!"
desktop/views/widgets/post-form.vue:
title: "投稿"
note: "投稿"
placeholder: "いまどうしてる?"
desktop/views/widgets/trends.vue:
title: "トレンド"
refresh: "他を見る"
nothing: "ありません!"
desktop/views/widgets/users.vue:
title: "おすすめユーザー"
refresh: "他を見る"
no-one: "いません!"
desktop/views/widgets/channel.vue:
title: "チャンネル"
settings: "ウィジェットの設定"
get-started: "右上の歯車をクリックして受信するチャンネルを指定してください"
mobile/views/components/drive.vue:
drive: "ドライブ"
used: "使用中"
folder-count: "フォルダ"
count-separator: "、"
file-count: "ファイル"
load-more: "もっと読み込む"
nothing-in-drive: "ドライブには何もありません"
folder-is-empty: "このフォルダは空です"
mobile/views/components/drive-file-chooser.vue:
select-file: "ファイルを選択"
mobile/views/components/drive-folder-chooser.vue:
select-folder: "フォルダーを選択"
mobile/views/components/drive.file-detail.vue:
download: "ダウンロード"
rename: "名前を変更"
move: "移動"
hash: "ハッシュ (md5)"
exif: "EXIF"
mobile/views/components/follow-button.vue:
follow: "フォロー"
unfollow: "フォロー解除"
mobile/views/components/note.vue:
reposted-by: "{}がRenote"
mobile/views/components/note-detail.vue:
reply: "返信"
reaction: "リアクション"
mobile/views/components/notifications.vue:
more: "もっと見る"
empty: "ありません!"
mobile/views/components/post-form.vue:
submit: "投稿"
reply: "返信"
renote: "Renote"
renote-placeholder: "この投稿を引用... (オプション)"
reply-placeholder: "この投稿への返信..."
note-placeholder: "いまどうしてる?"
mobile/views/components/sub-note-content.vue:
media-count: "{}個のメディア"
poll: "投票"
mobile/views/components/timeline.vue:
empty: "投稿がありません"
load-more: "もっと"
mobile/views/components/ui.nav.vue:
home: "ホーム"
notifications: "通知"
messaging: "メッセージ"
search: "検索"
drive: "ドライブ"
settings: "設定"
about: "Misskeyについて"
mobile/views/components/user-timeline.vue:
no-notes: "このユーザーは投稿していないようです。"
no-notes-with-media: "メディア付き投稿はありません。"
load-more: "もっと"
mobile/views/components/users-list.vue:
all: "すべて"
known: "知り合い"
load-more: "もっと"
mobile/views/pages/drive.vue:
drive: "ドライブ"
mobile/views/pages/followers.vue:
followers-of: "{}のフォロワー"
mobile/views/pages/following.vue:
following-of: "{}のフォロー"
mobile/views/pages/home.vue:
timeline: "タイムライン"
mobile/views/pages/messaging.vue:
messaging: "メッセージ"
mobile/views/pages/messaging-room.vue:
messaging: "メッセージ"
mobile/views/pages/note.vue:
title: "投稿"
prev: "前の投稿"
next: "次の投稿"
mobile/views/pages/notifications.vue:
notifications: "通知"
read-all: "すべての通知を既読にしますか?"
mobile/views/pages/profile-setting.vue:
title: "プロフィール設定"
will-be-published: "これらのプロフィールは公開されます。"
name: "名前"
location: "場所"
description: "自己紹介"
birthday: "誕生日"
avatar: "アイコン"
banner: "バナー"
avatar-saved: "アイコンを保存しました"
banner-saved: "バナーを保存しました"
set-avatar: "アイコンを選択する"
set-banner: "バナーを選択する"
save: "保存"
saved: "プロフィールを保存しました"
mobile/views/pages/search.vue:
search: "検索"
empty: "「{}」に関する投稿は見つかりませんでした。"
mobile/views/pages/selectdrive.vue:
select-file: "ファイルを選択"
mobile/views/pages/settings.vue:
signed-in-as: "{}としてサインイン中"
profile: "プロフィール"
twitter: "Twitter連携"
signin-history: "サインイン履歴"
settings: "設定"
signout: "サインアウト"
mobile/views/pages/user.vue:
follows-you: "フォローされています"
following: "フォロー"
followers: "フォロワー"
notes: "投稿"
overview: "概要"
timeline: "タイムライン"
media: "メディア"
is-suspended: "このユーザーは凍結されています。"
is-remote: "このユーザーはリモートユーザーです。"
view-remote: "正確な情報を見る"
mobile/views/pages/user/home.vue:
recent-notes: "最近の投稿"
images: "画像"
activity: "アクティビティ"
keywords: "キーワード"
domains: "頻出ドメイン"
frequently-replied-users: "よく会話するユーザー"
followers-you-know: "知り合いのフォロワー"
last-used-at: "最終ログイン"
mobile/views/pages/user/home.followers-you-know.vue:
loading: "読み込み中"
no-users: "知り合いのユーザーはいません"
mobile/views/pages/user/home.friends.vue:
loading: "読み込み中"
no-users: "よく会話するユーザーはいません"
mobile/views/pages/user/home.notes.vue:
loading: "読み込み中"
no-notes: "投稿はありません"
mobile/views/pages/user/home.photos.vue:
loading: "読み込み中"
no-photos: "写真はありません"
docs:
edit-this-page-on-github: "間違いや改善点を見つけましたか?"
edit-this-page-on-github-link: "このページをGitHubで編集"
api:
entities:
properties: "プロパティ"
endpoints:
params: "パラメータ"
res: "レスポンス"
props:
name: "名前"
type: "型"
optional: "オプション"
description: "説明"
yes: "はい"
no: "いいえ"

57
migration/2.0.0.js Normal file
View File

@ -0,0 +1,57 @@
// for Node.js interpret
const chalk = require('chalk');
const sequential = require('promise-sequential');
const { default: User } = require('../built/models/user');
const { default: DriveFile } = require('../built/models/drive-file');
async function main() {
const promiseGens = [];
const count = await DriveFile.count({});
let prev;
for (let i = 0; i < count; i++) {
promiseGens.push(() => {
const promise = new Promise(async (res, rej) => {
const file = await DriveFile.findOne(prev ? {
_id: { $gt: prev._id }
} : {}, {
sort: {
_id: 1
}
});
prev = file;
const user = await User.findOne({ _id: file.metadata.userId });
DriveFile.update({
_id: file._id
}, {
$set: {
'metadata._user': {
host: user.host
}
}
}).then(() => {
res([i, file]);
}).catch(rej);
});
promise.then(([i, file]) => {
console.log(chalk`{gray ${i}} {green done: {bold ${file._id}} ${file.filename}}`);
});
return promise;
});
}
return await sequential(promiseGens);
}
main().then(() => {
console.log('ALL DONE');
}).catch(console.error);

71
migration/2.4.0.js Normal file
View File

@ -0,0 +1,71 @@
// for Node.js interpret
const chalk = require('chalk');
const sequential = require('promise-sequential');
const { default: User } = require('../built/models/user');
const { default: DriveFile } = require('../built/models/drive-file');
async function main() {
const promiseGens = [];
const count = await User.count({});
let prev;
for (let i = 0; i < count; i++) {
promiseGens.push(() => {
const promise = new Promise(async (res, rej) => {
const user = await User.findOne(prev ? {
_id: { $gt: prev._id }
} : {}, {
sort: {
_id: 1
}
});
prev = user;
const set = {};
if (user.avatarId != null) {
const file = await DriveFile.findOne({ _id: user.avatarId });
if (file && file.metadata.properties.avgColor) {
set.avatarColor = file.metadata.properties.avgColor;
}
}
if (user.bannerId != null) {
const file = await DriveFile.findOne({ _id: user.bannerId });
if (file && file.metadata.properties.avgColor) {
set.bannerColor = file.metadata.properties.avgColor;
}
}
if (Object.keys(set).length === 0) return res([i, user]);
User.update({
_id: user._id
}, {
$set: set
}).then(() => {
res([i, user]);
}).catch(rej);
});
promise.then(([i, user]) => {
console.log(chalk`{gray ${i}} {green done: {bold ${user._id}} @${user.username}}`);
});
return promise;
});
}
return await sequential(promiseGens);
}
main().then(() => {
console.log('ALL DONE');
}).catch(console.error);

View File

@ -1,49 +0,0 @@
// for Node.js interpret
const { default: User } = require('../built/models/user');
const { default: Following } = require('../built/models/following');
const { default: zip } = require('@prezzemolo/zip')
const migrate = async (following) => {
const follower = await User.findOne({ _id: following.followerId });
const followee = await User.findOne({ _id: following.followeeId });
const result = await Following.update(following._id, {
$set: {
stalk: true,
_follower: {
host: follower.host,
inbox: follower.host != null ? follower.inbox : undefined
},
_followee: {
host: followee.host,
inbox: followee.host != null ? followee.inbox : undefined
}
}
});
return result.ok === 1;
}
async function main() {
const count = await Following.count({});
const dop = Number.parseInt(process.argv[2]) || 5
const idop = ((count - (count % dop)) / dop) + 1
return zip(
1,
async (time) => {
console.log(`${time} / ${idop}`)
const doc = await Following.find({}, {
limit: dop, skip: time * dop
})
return Promise.all(doc.map(migrate))
},
idop
).then(a => {
const rv = []
a.forEach(e => rv.push(...e))
return rv
})
}
main().then(console.dir).catch(console.error)

View File

@ -1,8 +1,8 @@
{
"name": "misskey",
"author": "syuilo <i@syuilo.com>",
"version": "1.2.0",
"clientVersion": "1.0.5133",
"version": "2.10.0",
"clientVersion": "1.0.5406",
"codename": "nighthike",
"main": "./built/index.js",
"private": true,
@ -31,13 +31,11 @@
"@prezzemolo/rap": "0.1.2",
"@prezzemolo/zip": "0.0.3",
"@types/bcryptjs": "2.4.1",
"@types/chai": "4.1.3",
"@types/chai-http": "3.0.4",
"@types/debug": "0.0.30",
"@types/deep-equal": "1.0.1",
"@types/elasticsearch": "5.0.22",
"@types/elasticsearch": "5.0.23",
"@types/eventemitter3": "2.0.2",
"@types/gm": "1.17.33",
"@types/gm": "1.18.0",
"@types/gulp": "3.8.36",
"@types/gulp-htmlmin": "1.3.32",
"@types/gulp-mocha": "0.0.32",
@ -58,16 +56,18 @@
"@types/koa-multer": "1.0.0",
"@types/koa-router": "7.0.28",
"@types/koa-send": "4.1.1",
"@types/koa-views": "2.0.3",
"@types/koa__cors": "2.2.2",
"@types/kue": "0.11.8",
"@types/license-checker": "15.0.0",
"@types/mkdirp": "0.5.2",
"@types/mocha": "5.2.0",
"@types/mongodb": "3.0.15",
"@types/mongodb": "3.0.18",
"@types/monk": "6.0.0",
"@types/ms": "0.7.30",
"@types/node": "9.6.6",
"@types/node": "10.1.0",
"@types/nopt": "3.0.29",
"@types/parse5": "3.0.0",
"@types/pug": "2.0.4",
"@types/qrcode": "0.8.1",
"@types/ratelimiter": "2.1.28",
@ -76,21 +76,20 @@
"@types/request-promise-native": "1.0.14",
"@types/rimraf": "2.0.2",
"@types/seedrandom": "2.4.27",
"@types/single-line-log": "1.1.0",
"@types/speakeasy": "2.0.2",
"@types/tmp": "0.0.33",
"@types/uuid": "3.4.3",
"@types/webpack": "4.1.4",
"@types/webpack": "4.1.7",
"@types/webpack-stream": "3.2.10",
"@types/websocket": "0.0.38",
"@types/ws": "4.0.2",
"@types/websocket": "0.0.39",
"@types/ws": "5.1.1",
"animejs": "2.2.0",
"autosize": "4.0.1",
"autosize": "4.0.2",
"autwh": "0.1.0",
"bcryptjs": "2.4.3",
"bootstrap-vue": "2.0.0-rc.6",
"cafy": "7.0.1",
"chai": "4.1.2",
"chai-http": "4.0.0",
"cafy": "8.0.0",
"chalk": "2.4.1",
"crc-32": "1.2.0",
"css-loader": "0.28.11",
@ -98,9 +97,9 @@
"deep-equal": "1.0.1",
"deepcopy": "0.6.3",
"diskusage": "0.2.4",
"dompurify": "1.0.3",
"dompurify": "1.0.4",
"elasticsearch": "14.2.2",
"element-ui": "2.3.6",
"element-ui": "2.3.8",
"emojilib": "2.2.12",
"escape-regexp": "0.0.1",
"eslint": "4.19.1",
@ -108,7 +107,7 @@
"eventemitter3": "3.1.0",
"exif-js": "2.3.0",
"file-loader": "1.1.11",
"file-type": "7.6.0",
"file-type": "8.0.0",
"fuckadblock": "3.2.1",
"gm": "1.23.1",
"gulp": "3.9.1",
@ -117,15 +116,15 @@
"gulp-imagemin": "4.1.0",
"gulp-mocha": "5.0.0",
"gulp-pug": "4.0.1",
"gulp-rename": "1.2.2",
"gulp-replace": "0.6.1",
"gulp-rename": "1.2.3",
"gulp-replace": "1.0.0",
"gulp-sourcemaps": "2.6.4",
"gulp-stylus": "2.7.0",
"gulp-tslint": "8.1.3",
"gulp-typescript": "4.0.2",
"gulp-uglify": "3.0.0",
"gulp-util": "3.0.8",
"hard-source-webpack-plugin": "0.6.4",
"hard-source-webpack-plugin": "0.6.7",
"highlight.js": "9.12.0",
"html-minifier": "3.5.15",
"http-signature": "1.2.0",
@ -133,7 +132,7 @@
"is-root": "2.0.0",
"is-url": "1.2.4",
"js-yaml": "3.11.0",
"jsdom": "11.9.0",
"jsdom": "11.10.0",
"koa": "2.5.1",
"koa-bodyparser": "4.2.0",
"koa-compress": "3.0.0",
@ -145,15 +144,16 @@
"koa-router": "7.4.0",
"koa-send": "4.1.3",
"koa-slow": "2.1.0",
"koa-views": "6.1.4",
"kue": "0.11.6",
"license-checker": "18.0.0",
"license-checker": "19.0.0",
"loader-utils": "1.1.0",
"mecab-async": "0.1.2",
"mkdirp": "0.5.1",
"mocha": "5.1.1",
"moji": "0.5.1",
"mongodb": "3.0.7",
"monk": "6.0.5",
"mongodb": "3.0.8",
"monk": "6.0.6",
"ms": "2.1.1",
"nan": "2.10.0",
"node-sass": "4.9.0",
@ -163,8 +163,10 @@
"object-assign-deep": "0.4.0",
"on-build-webpack": "0.1.0",
"os-utils": "0.0.14",
"parse5": "4.0.0",
"progress-bar-webpack-plugin": "1.11.0",
"prominence": "0.2.0",
"promise-sequential": "1.1.1",
"pug": "2.0.3",
"punycode": "2.1.0",
"qrcode": "1.2.0",
@ -172,13 +174,14 @@
"recaptcha-promise": "0.1.3",
"reconnecting-websocket": "3.2.2",
"redis": "2.8.0",
"request": "2.85.0",
"request": "2.86.0",
"request-promise-native": "1.0.5",
"rimraf": "2.6.2",
"rndstr": "1.0.0",
"s-age": "1.1.2",
"sass-loader": "7.0.1",
"seedrandom": "2.4.3",
"single-line-log": "1.1.2",
"speakeasy": "2.0.0",
"style-loader": "0.21.0",
"stylus": "0.54.5",
@ -189,9 +192,9 @@
"tcp-port-used": "0.1.2",
"textarea-caret": "3.1.0",
"tmp": "0.0.33",
"ts-loader": "4.2.0",
"ts-node": "6.0.1",
"tslint": "5.9.1",
"ts-loader": "4.3.0",
"ts-node": "6.0.3",
"tslint": "5.10.0",
"typescript": "2.8.3",
"typescript-eslint-parser": "15.0.0",
"uglify-es": "3.3.9",
@ -202,16 +205,15 @@
"vue-cropperjs": "2.2.0",
"vue-js-modal": "1.3.13",
"vue-json-tree-view": "2.1.4",
"vue-loader": "15.0.3",
"vue-loader": "15.0.11",
"vue-router": "3.0.1",
"vue-template-compiler": "2.5.16",
"vuedraggable": "2.16.0",
"vuex": "3.0.1",
"web-push": "3.3.0",
"web-push": "3.3.1",
"webfinger.js": "2.6.6",
"webpack": "4.6.0",
"webpack-cli": "2.0.15",
"webpack-replace-loader": "1.3.0",
"webpack": "4.8.3",
"webpack-cli": "2.1.3",
"websocket": "1.0.26",
"ws": "5.1.1",
"xev": "2.0.0"

View File

@ -7,10 +7,7 @@ import * as regular from '@fortawesome/fontawesome-free-regular';
import * as solid from '@fortawesome/fontawesome-free-solid';
import * as brands from '@fortawesome/fontawesome-free-brands';
// Add icons
fontawesome.library.add(regular);
fontawesome.library.add(solid);
fontawesome.library.add(brands);
fontawesome.library.add(regular, solid, brands);
export const pattern = /%fa:(.+?)%/g;

View File

@ -7,7 +7,7 @@ import locale from '../../locales';
export default class Replacer {
private lang: string;
public pattern = /%i18n:([a-z_\-@\.\!]+?)%/g;
public pattern = /%i18n:([a-z0-9_\-\.\/\|\!]+?)%/g;
constructor(lang: string) {
this.lang = lang;
@ -53,23 +53,20 @@ export default class Replacer {
}
}
public replacement(ctx, match, key) {
const client = '/src/client/app/';
let name = null;
public replacement(match, key) {
let path = null;
const shouldEscape = key[0] == '!';
if (shouldEscape) {
key = key.substr(1);
}
if (key[0] == '@') {
name = ctx.src.substr(ctx.src.indexOf(client) + client.length);
key = key.substr(1);
if (key.indexOf('|') != -1) {
path = key.split('|')[0];
key = key.split('|')[1];
}
if (ctx && ctx.lang) this.lang = ctx.lang;
const txt = this.get(name, key);
const txt = this.get(path, key);
return shouldEscape
? txt.replace(/'/g, '\\x27').replace(/"/g, '\\x22')

View File

@ -8,8 +8,8 @@ export const isNotAnId = x => !isAnId(x);
* ID
*/
export default class ID extends Query<mongo.ObjectID> {
constructor(...args) {
super(...args);
constructor() {
super();
this.transform = v => {
if (isAnId(v) && !mongo.ObjectID.prototype.isPrototypeOf(v)) {
@ -19,7 +19,7 @@ export default class ID extends Query<mongo.ObjectID> {
}
};
this.pushValidator(v => {
this.push(v => {
if (!mongo.ObjectID.prototype.isPrototypeOf(v) && isNotAnId(v)) {
return new Error('must-be-an-id');
}

View File

@ -94,13 +94,13 @@ export default Vue.extend({
margin 0 auto -38px auto
border solid 5px #fff
border-radius 100%
box-shadow 0 2px 2px rgba(0, 0, 0, 0.1)
box-shadow 0 2px 2px rgba(#000, 0.1)
> .app
padding 44px 16px 0 16px
color #555
background #eee
box-shadow 0 2px 2px rgba(0, 0, 0, 0.1) inset
box-shadow 0 2px 2px rgba(#000, 0.1) inset
&:after
content ''

View File

@ -94,7 +94,7 @@ export default Vue.extend({
margin 0 auto
text-align center
background #fff
box-shadow 0px 4px 16px rgba(0, 0, 0, 0.2)
box-shadow 0px 4px 16px rgba(#000, 0.2)
> .fetching
margin 0

View File

@ -1,3 +1,5 @@
block vars
doctype html
!= '\n<!-- Thank you for using Misskey! @syuilo -->\n'
@ -9,9 +11,17 @@ html
meta(name='application-name' content='Misskey')
meta(name='theme-color' content=themeColor)
meta(name='referrer' content='origin')
meta(property='og:site_name' content='Misskey')
link(rel='manifest' href='/manifest.json')
title Misskey
title
block title
| Misskey
block desc
meta(name='description' content='A SNS')
block meta
style
include ./../../../built/client/assets/init.css

View File

@ -32,7 +32,7 @@
// Detect the user language
// Note: The default language is Japanese
let lang = navigator.language.split('-')[0];
if (!/^(en|ja)$/.test(lang)) lang = 'ja';
if (!LANGS.includes(lang)) lang = 'en';
if (localStorage.getItem('lang')) lang = localStorage.getItem('lang');
// Detect the user agent

View File

@ -18,61 +18,65 @@ export default function<T extends object>(data: {
default: false
}
},
computed: {
id(): string {
return this.widget.id;
},
props(): T {
return this.widget.data;
}
},
data() {
return {
props: data.props ? data.props() : {} as T,
bakedOldProps: null,
preventSave: false
bakedOldProps: null
};
},
created() {
if (this.props) {
Object.keys(this.props).forEach(prop => {
if (this.widget.data.hasOwnProperty(prop)) {
this.props[prop] = this.widget.data[prop];
}
});
}
this.mergeProps();
this.$watch('props', () => {
this.mergeProps();
});
this.bakeProps();
},
this.$watch('props', newProps => {
if (this.preventSave) {
this.preventSave = false;
this.bakeProps();
return;
methods: {
bakeProps() {
this.bakedOldProps = JSON.stringify(this.props);
},
mergeProps() {
if (data.props) {
const defaultProps = data.props();
Object.keys(defaultProps).forEach(prop => {
if (!this.props.hasOwnProperty(prop)) {
Vue.set(this.props, prop, defaultProps[prop]);
}
});
}
if (this.bakedOldProps == JSON.stringify(newProps)) return;
},
save() {
if (this.bakedOldProps == JSON.stringify(this.props)) return;
this.bakeProps();
if (this.isMobile) {
(this as any).api('i/update_mobile_home', {
id: this.id,
data: newProps
}).then(() => {
(this as any).os.i.clientSettings.mobileHome.find(w => w.id == this.id).data = newProps;
data: this.props
});
} else {
(this as any).api('i/update_home', {
id: this.id,
data: newProps
}).then(() => {
(this as any).os.i.clientSettings.home.find(w => w.id == this.id).data = newProps;
data: this.props
});
}
}, {
deep: true
});
},
methods: {
bakeProps() {
this.bakedOldProps = JSON.stringify(this.props);
}
}
});

View File

@ -0,0 +1,16 @@
export default function(note) {
if (note.text == null) return true;
let txt = note.text;
if (note.media) {
note.media.forEach(file => {
txt = txt.replace(file.url, '');
if (file.src) txt = txt.replace(file.src, '');
});
if (txt == '') return true;
}
return false;
}

View File

@ -1,4 +1,4 @@
import MiOS from '../mios';
import MiOS from '../../mios';
import { version as current } from '../../config';
export default async function(mios: MiOS, force = false, silent = false) {

View File

@ -1,5 +1,5 @@
import Stream from './stream';
import MiOS from '../../mios';
import MiOS from '../../../mios';
/**
* Channel stream connection

View File

@ -1,6 +1,6 @@
import Stream from './stream';
import StreamManager from './stream-manager';
import MiOS from '../../mios';
import MiOS from '../../../mios';
/**
* Drive stream connection

View File

@ -1,6 +1,6 @@
import Stream from './stream';
import StreamManager from './stream-manager';
import MiOS from '../../mios';
import MiOS from '../../../mios';
/**
* Global timeline stream connection

View File

@ -2,7 +2,7 @@ import * as merge from 'object-assign-deep';
import Stream from './stream';
import StreamManager from './stream-manager';
import MiOS from '../../mios';
import MiOS from '../../../mios';
/**
* Home stream connection
@ -25,10 +25,42 @@ export class HomeStream extends Stream {
console.log('I updated:', i);
}
merge(me, i);
// キャッシュ更新
os.bakeMe();
});
this.on('clientSettingUpdated', x => {
os.store.commit('settings/set', {
key: x.key,
value: x.value
});
});
this.on('home_updated', x => {
if (x.home) {
os.store.commit('settings/setHome', x.home);
} else {
os.store.commit('settings/setHomeWidget', {
id: x.id,
data: x.data
});
}
});
this.on('mobile_home_updated', x => {
if (x.home) {
os.store.commit('settings/setMobileHome', x.home);
} else {
os.store.commit('settings/setMobileHomeWidget', {
id: x.id,
data: x.data
});
}
});
// トークンが再生成されたとき
// このままではAPIが利用できないので強制的にサインアウトさせる
// このままではMisskeyが利用できないので強制的にサインアウトさせる
this.on('my_token_regenerated', () => {
alert('%i18n:!common.my-token-regenerated%');
os.signout();

View File

@ -1,6 +1,6 @@
import Stream from './stream';
import StreamManager from './stream-manager';
import MiOS from '../../mios';
import MiOS from '../../../mios';
/**
* Local timeline stream connection

View File

@ -1,6 +1,6 @@
import Stream from './stream';
import StreamManager from './stream-manager';
import MiOS from '../../mios';
import MiOS from '../../../mios';
/**
* Messaging index stream connection

View File

@ -1,5 +1,5 @@
import Stream from './stream';
import MiOS from '../../mios';
import MiOS from '../../../mios';
/**
* Messaging stream connection

View File

@ -1,5 +1,5 @@
import Stream from './stream';
import MiOS from '../../mios';
import MiOS from '../../../mios';
export class OthelloGameStream extends Stream {
constructor(os: MiOS, me, game) {

View File

@ -1,6 +1,6 @@
import StreamManager from './stream-manager';
import Stream from './stream';
import MiOS from '../../mios';
import MiOS from '../../../mios';
export class OthelloStream extends Stream {
constructor(os: MiOS, me) {

View File

@ -1,6 +1,6 @@
import Stream from './stream';
import StreamManager from './stream-manager';
import MiOS from '../../mios';
import MiOS from '../../../mios';
/**
* Server stream connection

View File

@ -2,7 +2,7 @@ import { EventEmitter } from 'eventemitter3';
import * as uuid from 'uuid';
import * as ReconnectingWebsocket from 'reconnecting-websocket';
import { wsUrl } from '../../../config';
import MiOS from '../../mios';
import MiOS from '../../../mios';
/**
* Misskey stream connection

View File

@ -0,0 +1,19 @@
<template>
<span class="mk-acct">
<span class="name">@{{ user.username }}</span>
<span class="host" v-if="user.host">@{{ user.host }}</span>
</span>
</template>
<script lang="ts">
import Vue from 'vue';
export default Vue.extend({
props: ['user']
});
</script>
<style lang="stylus" scoped>
.mk-acct
> .host
opacity 0.5
</style>

View File

@ -234,7 +234,7 @@ export default Vue.extend({
margin-top calc(1em + 8px)
overflow hidden
background #fff
border solid 1px rgba(0, 0, 0, 0.1)
border solid 1px rgba(#000, 0.1)
border-radius 4px
transition top 0.1s ease, left 0.1s ease
@ -253,7 +253,7 @@ export default Vue.extend({
white-space nowrap
overflow hidden
font-size 0.9em
color rgba(0, 0, 0, 0.8)
color rgba(#000, 0.8)
cursor default
&, *
@ -285,10 +285,10 @@ export default Vue.extend({
.name
margin 0 8px 0 0
color rgba(0, 0, 0, 0.8)
color rgba(#000, 0.8)
.username
color rgba(0, 0, 0, 0.3)
color rgba(#000, 0.3)
> .emojis > li
@ -298,10 +298,10 @@ export default Vue.extend({
width 24px
.name
color rgba(0, 0, 0, 0.8)
color rgba(#000, 0.8)
.alias
margin 0 0 0 8px
color rgba(0, 0, 0, 0.3)
color rgba(#000, 0.3)
</style>

View File

@ -0,0 +1,42 @@
<template>
<router-link class="mk-avatar" :to="user | userPage" :title="user | acct" :target="target" :style="style" v-if="disablePreview"></router-link>
<router-link class="mk-avatar" :to="user | userPage" :title="user | acct" :target="target" :style="style" v-else v-user-preview="user.id"></router-link>
</template>
<script lang="ts">
import Vue from 'vue';
export default Vue.extend({
props: {
user: {
type: Object,
required: true
},
target: {
required: false,
default: null
},
disablePreview: {
required: false,
default: false
}
},
computed: {
style(): any {
return {
backgroundColor: this.user.avatarColor && this.user.avatarColor.length == 3 ? `rgb(${ this.user.avatarColor.join(',') })` : null,
backgroundImage: `url(${ this.user.avatarUrl }?thumbnail)`,
borderRadius: (this as any).clientSettings.circleIcons ? '100%' : null
};
}
}
});
</script>
<style lang="stylus" scoped>
.mk-avatar
display inline-block
vertical-align bottom
background-size cover
background-position center center
transition border-radius 1s ease
</style>

View File

@ -3,6 +3,8 @@ import Vue from 'vue';
import signin from './signin.vue';
import signup from './signup.vue';
import forkit from './forkit.vue';
import acct from './acct.vue';
import avatar from './avatar.vue';
import nav from './nav.vue';
import noteHtml from './note-html';
import poll from './poll.vue';
@ -28,6 +30,8 @@ import welcomeTimeline from './welcome-timeline.vue';
Vue.component('mk-signin', signin);
Vue.component('mk-signup', signup);
Vue.component('mk-forkit', forkit);
Vue.component('mk-acct', acct);
Vue.component('mk-avatar', avatar);
Vue.component('mk-nav', nav);
Vue.component('mk-note-html', noteHtml);
Vue.component('mk-poll', poll);

View File

@ -2,7 +2,7 @@
<div class="mk-media-list" :data-count="mediaList.length">
<template v-for="media in mediaList">
<mk-media-video :video="media" :key="media.id" v-if="media.type.startsWith('video')" :inline-playable="mediaList.length === 1"/>
<mk-media-image :image="media" :key="media.id" v-else />
<mk-media-image :image="media" :key="media.id" v-else :raw="raw"/>
</template>
</div>
</template>
@ -11,7 +11,14 @@
import Vue from 'vue';
export default Vue.extend({
props: ['mediaList'],
props: {
mediaList: {
required: true
},
raw: {
default: false
}
}
});
</script>
@ -23,7 +30,7 @@ export default Vue.extend({
@media (max-width 500px)
height 192px
&[data-count="1"]
grid-template-rows 1fr
&[data-count="2"]
@ -40,7 +47,7 @@ export default Vue.extend({
&[data-count="4"]
grid-template-columns 1fr 1fr
grid-template-rows 1fr 1fr
:nth-child(1)
grid-column 1 / 2
grid-row 1 / 2
@ -53,5 +60,5 @@ export default Vue.extend({
:nth-child(4)
grid-column 2 / 3
grid-row 2 / 3
</style>

View File

@ -1,8 +1,6 @@
<template>
<div class="message" :data-is-me="isMe">
<router-link class="avatar-anchor" :to="message.user | userPage" :title="message.user | acct" target="_blank">
<img class="avatar" :src="`${message.user.avatarUrl}?thumbnail&size=80`" alt=""/>
</router-link>
<mk-avatar class="avatar" :user="message.user" target="_blank"/>
<div class="content">
<div class="balloon" :data-no-text="message.text == null">
<p class="read" v-if="isMe && message.isRead">%i18n:@is-read%</p>
@ -67,20 +65,14 @@ export default Vue.extend({
padding 10px 12px 10px 12px
background-color transparent
> .avatar-anchor
> .avatar
display block
position absolute
top 10px
> .avatar
display block
min-width 54px
min-height 54px
max-width 54px
max-height 54px
margin 0
border-radius 8px
transition all 0.1s ease
width 54px
height 54px
border-radius 8px
transition all 0.1s ease
> .content
@ -134,7 +126,7 @@ export default Vue.extend({
bottom -4px
left -12px
margin 0
color rgba(0, 0, 0, 0.5)
color rgba(#000, 0.5)
font-size 11px
> .content
@ -146,7 +138,7 @@ export default Vue.extend({
overflow hidden
overflow-wrap break-word
font-size 1em
color rgba(0, 0, 0, 0.5)
color rgba(#000, 0.5)
> .text
display block
@ -155,7 +147,7 @@ export default Vue.extend({
overflow hidden
overflow-wrap break-word
font-size 1em
color rgba(0, 0, 0, 0.8)
color rgba(#000, 0.8)
& + .file
> a
@ -195,13 +187,13 @@ export default Vue.extend({
display block
margin 2px 0 0 0
font-size 10px
color rgba(0, 0, 0, 0.4)
color rgba(#000, 0.4)
> [data-fa]
margin-left 4px
&:not([data-is-me])
> .avatar-anchor
> .avatar
left 12px
> .content
@ -225,7 +217,7 @@ export default Vue.extend({
text-align left
&[data-is-me]
> .avatar-anchor
> .avatar
right 12px
> .content

View File

@ -256,7 +256,7 @@ export default Vue.extend({
padding 16px 8px 8px 8px
text-align center
font-size 0.8em
color rgba(0, 0, 0, 0.4)
color rgba(#000, 0.4)
[data-fa]
margin-right 4px
@ -267,7 +267,7 @@ export default Vue.extend({
padding 16px 8px 8px 8px
text-align center
font-size 0.8em
color rgba(0, 0, 0, 0.4)
color rgba(#000, 0.4)
[data-fa]
margin-right 4px
@ -278,7 +278,7 @@ export default Vue.extend({
padding 16px
text-align center
font-size 0.8em
color rgba(0, 0, 0, 0.4)
color rgba(#000, 0.4)
[data-fa]
margin-right 4px
@ -289,14 +289,14 @@ export default Vue.extend({
padding 0 12px
line-height 24px
color #fff
background rgba(0, 0, 0, 0.3)
background rgba(#000, 0.3)
border-radius 12px
&:hover
background rgba(0, 0, 0, 0.4)
background rgba(#000, 0.4)
&:active
background rgba(0, 0, 0, 0.5)
background rgba(#000, 0.5)
&.fetching
cursor wait
@ -322,7 +322,7 @@ export default Vue.extend({
left 0
right 0
margin 0 auto
background rgba(0, 0, 0, 0.1)
background rgba(#000, 0.1)
> span
display inline-block
@ -330,7 +330,7 @@ export default Vue.extend({
padding 0 16px
//font-weight bold
line-height 32px
color rgba(0, 0, 0, 0.3)
color rgba(#000, 0.3)
background #fff
> footer

View File

@ -13,7 +13,7 @@
@click="navigate(user)"
tabindex="-1"
>
<img class="avatar" :src="`${user.avatarUrl}?thumbnail&size=32`" alt=""/>
<mk-avatar class="avatar" :user="user"/>
<span class="name">{{ user | userName }}</span>
<span class="username">@{{ user | acct }}</span>
</li>
@ -31,7 +31,7 @@
:key="message.id"
>
<div>
<img class="avatar" :src="`${isMe(message) ? message.recipient.avatarUrl : message.user.avatarUrl}?thumbnail&size=64`" alt=""/>
<mk-avatar class="avatar" :user="isMe(message) ? message.recipient : message.user"/>
<header>
<span class="name">{{ isMe(message) ? message.recipient : message.user | userName }}</span>
<span class="username">@{{ isMe(message) ? message.recipient : message.user | acct }}</span>
@ -205,7 +205,7 @@ root(isDark)
z-index 1
width 100%
background #fff
box-shadow 0 0px 2px rgba(0, 0, 0, 0.2)
box-shadow 0 0px 2px rgba(#000, 0.2)
> .form
padding 8px
@ -279,7 +279,7 @@ root(isDark)
vertical-align top
white-space nowrap
overflow hidden
color rgba(0, 0, 0, 0.8)
color rgba(#000, 0.8)
text-decoration none
transition none
cursor pointer
@ -318,11 +318,11 @@ root(isDark)
margin 0 8px 0 0
/*font-weight bold*/
font-weight normal
color rgba(0, 0, 0, 0.8)
color rgba(#000, 0.8)
.username
font-weight normal
color rgba(0, 0, 0, 0.3)
color rgba(#000, 0.3)
> .history
@ -383,17 +383,17 @@ root(isDark)
overflow hidden
text-overflow ellipsis
font-size 1em
color isDark ? #fff : rgba(0, 0, 0, 0.9)
color isDark ? #fff : rgba(#000, 0.9)
font-weight bold
transition all 0.1s ease
> .username
margin 0 8px
color isDark ? #606984 : rgba(0, 0, 0, 0.5)
color isDark ? #606984 : rgba(#000, 0.5)
> .mk-time
margin 0 0 0 auto
color isDark ? #606984 : rgba(0, 0, 0, 0.5)
color isDark ? #606984 : rgba(#000, 0.5)
font-size 80%
> .avatar
@ -413,10 +413,10 @@ root(isDark)
overflow hidden
overflow-wrap break-word
font-size 1.1em
color isDark ? #fff : rgba(0, 0, 0, 0.8)
color isDark ? #fff : rgba(#000, 0.8)
.me
color isDark ? rgba(#fff, 0.7) : rgba(0, 0, 0, 0.4)
color isDark ? rgba(#fff, 0.7) : rgba(#000, 0.4)
> .image
display block

View File

@ -105,7 +105,7 @@ $border-color = rgba(27, 31, 35, 0.15)
z-index 10000
width 100%
height 100%
background rgba(0, 0, 0, 0.1)
background rgba(#000, 0.1)
opacity 0
> .popover

View File

@ -31,7 +31,7 @@
<section v-if="invitations.length > 0">
<h2>対局の招待があります:</h2>
<div class="invitation" v-for="i in invitations" tabindex="-1" @click="accept(i)">
<img :src="`${i.parent.avatarUrl}?thumbnail&size=32`" alt="">
<mk-avatar class="avatar" :user="i.parent"/>
<span class="name"><b>{{ i.parent.name }}</b></span>
<span class="username">@{{ i.parent.username }}</span>
<mk-time :time="i.createdAt"/>
@ -40,8 +40,8 @@
<section v-if="myGames.length > 0">
<h2>自分の対局</h2>
<a class="game" v-for="g in myGames" tabindex="-1" @click.prevent="go(g)" :href="`/othello/${g.id}`">
<img :src="`${g.user1.avatarUrl}?thumbnail&size=32`" alt="">
<img :src="`${g.user2.avatarUrl}?thumbnail&size=32`" alt="">
<mk-avatar class="avatar" :user="g.user1"/>
<mk-avatar class="avatar" :user="g.user2"/>
<span><b>{{ g.user1.name }}</b> vs <b>{{ g.user2.name }}</b></span>
<span class="state">{{ g.isEnded ? '終了' : '進行中' }}</span>
</a>
@ -49,8 +49,8 @@
<section v-if="games.length > 0">
<h2>みんなの対局</h2>
<a class="game" v-for="g in games" tabindex="-1" @click.prevent="go(g)" :href="`/othello/${g.id}`">
<img :src="`${g.user1.avatarUrl}?thumbnail&size=32`" alt="">
<img :src="`${g.user2.avatarUrl}?thumbnail&size=32`" alt="">
<mk-avatar class="avatar" :user="g.user1"/>
<mk-avatar class="avatar" :user="g.user2"/>
<span><b>{{ g.user1.name }}</b> vs <b>{{ g.user2.name }}</b></span>
<span class="state">{{ g.isEnded ? '終了' : '進行中' }}</span>
</a>
@ -271,8 +271,9 @@ export default Vue.extend({
&:active
background #eee
> img
vertical-align bottom
> .avatar
width 32px
height 32px
border-radius 100%
> span
@ -301,8 +302,9 @@ export default Vue.extend({
&:active
background #eee
> img
vertical-align bottom
> .avatar
width 32px
height 32px
border-radius 100%
> span

View File

@ -88,10 +88,10 @@ root(isDark)
cursor pointer
&:hover
background rgba(0, 0, 0, 0.05)
background rgba(#000, 0.05)
&:active
background rgba(0, 0, 0, 0.1)
background rgba(#000, 0.1)
> .backdrop
position absolute

View File

@ -91,7 +91,7 @@ export default Vue.extend({
width 100%
line-height 44px
font-size 1em
color rgba(0, 0, 0, 0.7)
color rgba(#000, 0.7)
background #fff
outline none
border solid 1px #eee
@ -117,7 +117,7 @@ export default Vue.extend({
margin -6px 0 0 0
width 100%
font-size 1.2em
color rgba(0, 0, 0, 0.5)
color rgba(#000, 0.5)
outline none
border none
border-radius 0

View File

@ -234,13 +234,13 @@ export default Vue.extend({
color #333 !important
background #fff !important
outline none
border solid 1px rgba(0, 0, 0, 0.1)
border solid 1px rgba(#000, 0.1)
border-radius 4px
box-shadow 0 0 0 114514px #fff inset
transition all .3s ease
&:hover
border-color rgba(0, 0, 0, 0.2)
border-color rgba(#000, 0.2)
transition all .1s ease
&:focus

View File

@ -73,7 +73,7 @@ export default Vue.extend({
padding 6px 12px
font-size 0.9em
color #fff
background rgba(0, 0, 0, 0.8)
background rgba(#000, 0.8)
border-radius 4px
> p

View File

@ -45,7 +45,7 @@ export default Vue.extend({
} else if (url.hostname == 'youtu.be') {
this.youtubeId = url.pathname;
} else {
fetch('/url?url=' + this.url).then(res => {
fetch('/url?url=' + encodeURIComponent(this.url)).then(res => {
res.json().then(info => {
this.title = info.title;
this.description = info.description;
@ -126,16 +126,21 @@ root(isDark)
line-height 16px
vertical-align top
@media (max-width 500px)
font-size 8px
border none
@media (max-width 700px)
> .thumbnail
width 70px
position relative
width 100%
height 100px
& + article
left 70px
width calc(100% - 70px)
left 0
width 100%
@media (max-width 500px)
font-size 8px
> .thumbnail
height 70px
> article
padding 8px

View File

@ -0,0 +1,223 @@
<template>
<div class="mk-visibility-chooser">
<div class="backdrop" ref="backdrop" @click="close"></div>
<div class="popover" :class="{ compact }" ref="popover">
<div @click="choose('public')" :class="{ active: v == 'public' }">
<div>%fa:globe%</div>
<div>
<span>公開</span>
</div>
</div>
<div @click="choose('home')" :class="{ active: v == 'home' }">
<div>%fa:home%</div>
<div>
<span>ホーム</span>
<span>ホームタイムラインにのみ公開</span>
</div>
</div>
<div @click="choose('followers')" :class="{ active: v == 'followers' }">
<div>%fa:unlock%</div>
<div>
<span>フォロワー</span>
<span>自分のフォロワーにのみ公開</span>
</div>
</div>
<div @click="choose('specified')" :class="{ active: v == 'specified' }">
<div>%fa:envelope%</div>
<div>
<span>ダイレクト</span>
<span>指定したユーザーにのみ公開</span>
</div>
</div>
<div @click="choose('private')" :class="{ active: v == 'private' }">
<div>%fa:lock%</div>
<div>
<span>非公開</span>
</div>
</div>
</div>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import * as anime from 'animejs';
export default Vue.extend({
props: ['source', 'compact', 'v'],
mounted() {
this.$nextTick(() => {
const popover = this.$refs.popover as any;
const rect = this.source.getBoundingClientRect();
const width = popover.offsetWidth;
const height = popover.offsetHeight;
let left;
let top;
if (this.compact) {
const x = rect.left + window.pageXOffset + (this.source.offsetWidth / 2);
const y = rect.top + window.pageYOffset + (this.source.offsetHeight / 2);
left = (x - (width / 2));
top = (y - (height / 2));
} else {
const x = rect.left + window.pageXOffset + (this.source.offsetWidth / 2);
const y = rect.top + window.pageYOffset + this.source.offsetHeight;
left = (x - (width / 2));
top = y;
}
if (left + width > window.innerWidth) {
left = window.innerWidth - width;
}
popover.style.left = left + 'px';
popover.style.top = top + 'px';
anime({
targets: this.$refs.backdrop,
opacity: 1,
duration: 100,
easing: 'linear'
});
anime({
targets: this.$refs.popover,
opacity: 1,
scale: [0.5, 1],
duration: 500
});
});
},
methods: {
choose(visibility) {
this.$emit('chosen', visibility);
this.$destroy();
},
close() {
(this.$refs.backdrop as any).style.pointerEvents = 'none';
anime({
targets: this.$refs.backdrop,
opacity: 0,
duration: 200,
easing: 'linear'
});
(this.$refs.popover as any).style.pointerEvents = 'none';
anime({
targets: this.$refs.popover,
opacity: 0,
scale: 0.5,
duration: 200,
easing: 'easeInBack',
complete: () => this.$destroy()
});
}
}
});
</script>
<style lang="stylus" scoped>
@import '~const.styl'
$border-color = rgba(27, 31, 35, 0.15)
root(isDark)
position initial
> .backdrop
position fixed
top 0
left 0
z-index 10000
width 100%
height 100%
background isDark ? rgba(#000, 0.4) : rgba(#000, 0.1)
opacity 0
> .popover
$bgcolor = isDark ? #2c303c : #fff
position absolute
z-index 10001
width 240px
padding 8px 0
background $bgcolor
border 1px solid $border-color
border-radius 4px
box-shadow 0 3px 12px rgba(27, 31, 35, 0.15)
transform scale(0.5)
opacity 0
$balloon-size = 10px
&:not(.compact)
margin-top $balloon-size
transform-origin center -($balloon-size)
&:before
content ""
display block
position absolute
top -($balloon-size * 2)
left s('calc(50% - %s)', $balloon-size)
border-top solid $balloon-size transparent
border-left solid $balloon-size transparent
border-right solid $balloon-size transparent
border-bottom solid $balloon-size $border-color
&:after
content ""
display block
position absolute
top -($balloon-size * 2) + 1.5px
left s('calc(50% - %s)', $balloon-size)
border-top solid $balloon-size transparent
border-left solid $balloon-size transparent
border-right solid $balloon-size transparent
border-bottom solid $balloon-size $bgcolor
> div
display flex
padding 8px 14px
font-size 12px
color isDark ? #fff : #666
cursor pointer
&:hover
background isDark ? #252731 : #eee
&:active
background isDark ? #21242b : #ddd
&.active
color $theme-color-foreground
background $theme-color
> *
user-select none
pointer-events none
> *:first-child
display flex
justify-content center
align-items center
margin-right 10px
> *:last-child
flex 1 1 auto
> span:first-child
display block
font-weight bold
> span:last-child:not(:first-child)
opacity 0.6
.mk-visibility-chooser[data-darkmode]
root(true)
.mk-visibility-chooser:not([data-darkmode])
root(false)
</style>

View File

@ -1,9 +1,7 @@
<template>
<div class="mk-welcome-timeline">
<div v-for="note in notes">
<router-link class="avatar-anchor" :to="note.user | userPage" v-user-preview="note.user.id">
<img class="avatar" :src="`${note.user.avatarUrl}?thumbnail&size=96`" alt="avatar"/>
</router-link>
<mk-avatar class="avatar" :user="note.user" target="_blank"/>
<div class="body">
<header>
<router-link class="name" :to="note.user | userPage" v-user-preview="note.user.id">{{ note.user | userName }}</router-link>
@ -62,25 +60,22 @@ export default Vue.extend({
overflow-wrap break-word
font-size .9em
color #4C4C4C
border-bottom 1px solid rgba(0, 0, 0, 0.05)
border-bottom 1px solid rgba(#000, 0.05)
&:after
content ""
display block
clear both
> .avatar-anchor
> .avatar
display block
float left
position -webkit-sticky
position sticky
top 16px
> img
display block
width 42px
height 42px
border-radius 6px
width 42px
height 42px
border-radius 6px
> .body
float right

View File

@ -61,6 +61,7 @@ export default define({
} else {
this.props.design++;
}
this.save();
}
}
});
@ -78,7 +79,7 @@ export default define({
color #555
&:nth-child(odd)
background rgba(0, 0, 0, 0.025)
background rgba(#000, 0.025)
> b
margin-right 4px

View File

@ -68,6 +68,7 @@ export default define({
} else {
this.props.design++;
}
this.save();
}
}
});

View File

@ -1,37 +1,37 @@
<template>
<div class="mkw-calendar"
:data-melt="props.design == 1"
:data-special="special"
:data-mobile="isMobile"
>
<div class="calendar" :data-is-holiday="isHoliday">
<p class="month-and-year">
<span class="year">{{ year }}</span>
<span class="month">{{ month }}</span>
</p>
<p class="day">{{ day }}</p>
<p class="week-day">{{ weekDay }}曜日</p>
</div>
<div class="info">
<div>
<p>今日:<b>{{ dayP.toFixed(1) }}%</b></p>
<div class="meter">
<div class="val" :style="{ width: `${dayP}%` }"></div>
<div class="mkw-calendar" :data-special="special" :data-mobile="isMobile">
<mk-widget-container :naked="props.design == 1" :show-header="false">
<div class="mkw-calendar--body">
<div class="calendar" :data-is-holiday="isHoliday">
<p class="month-and-year">
<span class="year">{{ year }}</span>
<span class="month">{{ month }}</span>
</p>
<p class="day">{{ day }}</p>
<p class="week-day">{{ weekDay }}曜日</p>
</div>
<div class="info">
<div>
<p>今日:<b>{{ dayP.toFixed(1) }}%</b></p>
<div class="meter">
<div class="val" :style="{ width: `${dayP}%` }"></div>
</div>
</div>
<div>
<p>今月:<b>{{ monthP.toFixed(1) }}%</b></p>
<div class="meter">
<div class="val" :style="{ width: `${monthP}%` }"></div>
</div>
</div>
<div>
<p>今年:<b>{{ yearP.toFixed(1) }}%</b></p>
<div class="meter">
<div class="val" :style="{ width: `${yearP}%` }"></div>
</div>
</div>
</div>
</div>
<div>
<p>今月:<b>{{ monthP.toFixed(1) }}%</b></p>
<div class="meter">
<div class="val" :style="{ width: `${monthP}%` }"></div>
</div>
</div>
<div>
<p>今年:<b>{{ yearP.toFixed(1) }}%</b></p>
<div class="meter">
<div class="val" :style="{ width: `${yearP}%` }"></div>
</div>
</div>
</div>
</mk-widget-container>
</div>
</template>
@ -73,6 +73,7 @@ export default define({
} else {
this.props.design++;
}
this.save();
},
tick() {
const now = new Date();
@ -110,93 +111,82 @@ export default define({
@import '~const.styl'
root(isDark)
padding 16px 0
color isDark ? #c5ced6 :#777
background isDark ? #282C37 : #fff
border solid 1px rgba(0, 0, 0, 0.075)
border-radius 6px
&[data-special='on-new-years-day']
border-color #ef95a0
&[data-melt]
background transparent
border none
.mkw-calendar--body
padding 16px 0
color isDark ? #c5ced6 : #777
&[data-mobile]
border none
border-radius 8px
box-shadow 0 0 0 1px rgba(0, 0, 0, 0.2)
&:after
content ""
display block
clear both
&:after
content ""
display block
clear both
> .calendar
float left
width 60%
text-align center
> .calendar
float left
width 60%
text-align center
&[data-is-holiday]
> .day
color #ef95a0
> p
margin 0
line-height 18px
font-size 14px
> span
margin 0 4px
> .day
margin 10px 0
line-height 32px
font-size 28px
> .info
display block
float left
width 40%
padding 0 16px 0 0
> div
margin-bottom 8px
&:last-child
margin-bottom 4px
&[data-is-holiday]
> .day
color #ef95a0
> p
margin 0 0 2px 0
font-size 12px
margin 0
line-height 18px
color isDark ? #7a8692 : #888
font-size 14px
> b
margin-left 2px
> span
margin 0 4px
> .meter
width 100%
overflow hidden
background isDark ? #1c1f25 : #eee
border-radius 8px
> .day
margin 10px 0
line-height 32px
font-size 28px
> .val
height 4px
background $theme-color
> .info
display block
float left
width 40%
padding 0 16px 0 0
&:nth-child(1)
> .meter > .val
background #f7796c
> div
margin-bottom 8px
&:nth-child(2)
> .meter > .val
background #a1de41
&:last-child
margin-bottom 4px
&:nth-child(3)
> .meter > .val
background #41ddde
> p
margin 0 0 2px 0
font-size 12px
line-height 18px
color isDark ? #7a8692 : #888
> b
margin-left 2px
> .meter
width 100%
overflow hidden
background isDark ? #1c1f25 : #eee
border-radius 8px
> .val
height 4px
background $theme-color
&:nth-child(1)
> .meter > .val
background #f7796c
&:nth-child(2)
> .meter > .val
background #a1de41
&:nth-child(3)
> .meter > .val
background #41ddde
.mkw-calendar[data-darkmode]
root(true)

View File

@ -46,7 +46,7 @@ root(isDark)
border none
background #ead8bb
border-radius 8px
box-shadow 0 0 0 1px rgba(0, 0, 0, 0.2)
box-shadow 0 0 0 1px rgba(#000, 0.2)
> article
> h1

View File

@ -59,6 +59,8 @@ export default define({
} else {
this.props.design++;
}
this.save();
}
}
});

View File

@ -1,10 +1,10 @@
<template>
<div class="mkw-rss" :data-mobile="isMobile">
<div class="mkw-rss">
<mk-widget-container :show-header="!props.compact">
<template slot="header">%fa:rss-square%RSS</template>
<button slot="func" title="設定" @click="setting">%fa:cog%</button>
<div class="mkw-rss--body">
<div class="mkw-rss--body" :data-mobile="isMobile">
<p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p>
<div class="feed" v-else>
<a v-for="item in items" :href="item.link" target="_blank">{{ item.title }}</a>
@ -40,6 +40,7 @@ export default define({
methods: {
func() {
this.props.compact = !this.props.compact;
this.save();
},
fetch() {
fetch(`https://api.rss2json.com/v1/api.json?rss_url=${this.url}`, {
@ -84,15 +85,17 @@ root(isDark)
margin-right 4px
&[data-mobile]
background isDark ? #21242f : #f3f3f3
.feed
padding 0
font-size 1em
> a
padding 8px 16px
border-bottom none
&:nth-child(even)
background rgba(0, 0, 0, 0.05)
background isDark ? rgba(#000, 0.05) : rgba(#fff, 0.7)
.mkw-rss[data-darkmode]
root(true)

View File

@ -56,7 +56,7 @@ root(isDark)
> text
font-size 0.15px
fill isDark ? rgba(#fff, 0.6) : rgba(0, 0, 0, 0.6)
fill isDark ? rgba(#fff, 0.6) : rgba(#000, 0.6)
svg[data-darkmode]
root(true)

View File

@ -68,6 +68,7 @@ export default define({
} else {
this.props.view++;
}
this.save();
},
func() {
if (this.props.design == 2) {
@ -75,6 +76,7 @@ export default define({
} else {
this.props.design++;
}
this.save();
}
}
});

View File

@ -64,6 +64,7 @@ export default define({
} else {
this.props.size++;
}
this.save();
this.applySize();
},
@ -111,6 +112,7 @@ export default define({
choose() {
(this as any).apis.chooseDriveFolder().then(folder => {
this.props.folder = folder ? folder.id : null;
this.save();
this.fetch();
});
}
@ -122,13 +124,13 @@ export default define({
.mkw-slideshow
overflow hidden
background #fff
border solid 1px rgba(0, 0, 0, 0.075)
border solid 1px rgba(#000, 0.075)
border-radius 6px
&[data-mobile]
border none
border-radius 8px
box-shadow 0 0 0 1px rgba(0, 0, 0, 0.2)
box-shadow 0 0 0 1px rgba(#000, 0.2)
> div
width 100%

View File

@ -17,7 +17,7 @@ const tips = [
'ドライブでファイルをドラッグしてフォルダ移動できます',
'ドライブでフォルダをドラッグしてフォルダ移動できます',
'ホームは設定からカスタマイズできます',
'MisskeyはMIT Licenseです',
'MisskeyはAGPLv3です',
'タイムマシンウィジェットを利用すると、簡単に過去のタイムラインに遡れます',
'投稿の ... をクリックして、投稿をユーザーページにピン留めできます',
'ドライブの容量は(デフォルトで)1GBです',

View File

@ -1,4 +1,4 @@
import OS from '../../common/mios';
import OS from '../../mios';
import { apiUrl } from '../../config';
import CropWindow from '../views/components/crop-window.vue';
import ProgressDialog from '../views/components/progress-dialog.vue';

View File

@ -1,4 +1,4 @@
import OS from '../../common/mios';
import OS from '../../mios';
import { apiUrl } from '../../config';
import CropWindow from '../views/components/crop-window.vue';
import ProgressDialog from '../views/components/progress-dialog.vue';

View File

@ -61,6 +61,6 @@ svg
&.day
&:hover
fill rgba(0, 0, 0, 0.05)
fill rgba(#000, 0.05)
</style>

View File

@ -64,7 +64,7 @@ export default Vue.extend({
'%i18n:!common.weekday-short.wednesday%',
'%i18n:!common.weekday-short.thursday%',
'%i18n:!common.weekday-short.friday%',
'%i18n:!common.weekday-short.satruday%'
'%i18n:!common.weekday-short.saturday%'
]
};
},
@ -136,7 +136,7 @@ export default Vue.extend({
root(isDark)
color isDark ? #c5ced6 : #777
background isDark ? #282C37 : #fff
border solid 1px rgba(0, 0, 0, 0.075)
border solid 1px rgba(#000, 0.075)
border-radius 6px
&[data-melt]
@ -152,7 +152,7 @@ root(isDark)
font-size 0.9em
font-weight bold
color #888
box-shadow 0 1px rgba(0, 0, 0, 0.07)
box-shadow 0 1px rgba(#000, 0.07)
> [data-fa]
margin-right 4px
@ -214,10 +214,10 @@ root(isDark)
border-radius 6px
&:hover > div
background rgba(0, 0, 0, 0.025)
background rgba(#000, 0.025)
&:active > div
background rgba(0, 0, 0, 0.05)
background rgba(#000, 0.05)
&[data-is-donichi]
color #ef95a0
@ -233,10 +233,10 @@ root(isDark)
font-weight bold
> div
background rgba(0, 0, 0, 0.025)
background rgba(#000, 0.025)
&:active > div
background rgba(0, 0, 0, 0.05)
background rgba(#000, 0.05)
&[data-today]
> div

View File

@ -106,7 +106,7 @@ root(isDark)
width $width
background isDark ? #282c37 :#fff
border-radius 0 4px 4px 4px
box-shadow 2px 2px 8px rgba(0, 0, 0, 0.2)
box-shadow 2px 2px 8px rgba(#000, 0.2)
transition visibility 0s linear 0.2s
.menu[data-darkmode]

View File

@ -68,7 +68,7 @@ root(isDark)
font-size 0.8em
background isDark ? #282c37 : #fff
border-radius 0 4px 4px 4px
box-shadow 2px 2px 8px rgba(0, 0, 0, 0.2)
box-shadow 2px 2px 8px rgba(#000, 0.2)
opacity 0
.context-menu[data-darkmode]

View File

@ -102,7 +102,7 @@ export default Vue.extend({
left 0
width 100%
height 100%
background rgba(0, 0, 0, 0.7)
background rgba(#000, 0.7)
opacity 0
pointer-events none

View File

@ -50,7 +50,7 @@ export default Vue.extend({
return `${this.file.name}\n${this.file.type} ${Vue.filter('bytes')(this.file.datasize)}`;
},
background(): string {
return this.file.properties.avgColor
return this.file.properties.avgColor && this.file.properties.avgColor.length == 3
? `rgb(${this.file.properties.avgColor.join(',')})`
: 'transparent';
}
@ -129,7 +129,7 @@ export default Vue.extend({
},
onThumbnailLoaded() {
if (this.file.properties.avgColor) {
if (this.file.properties.avgColor && this.file.properties.avgColor.length == 3) {
anime({
targets: this.$refs.thumbnail,
backgroundColor: `rgba(${this.file.properties.avgColor.join(',')}, 0)`,
@ -195,7 +195,7 @@ root(isDark)
cursor pointer
&:hover
background rgba(0, 0, 0, 0.05)
background rgba(#000, 0.05)
> .label
&:before
@ -203,7 +203,7 @@ root(isDark)
background #0b65a5
&:active
background rgba(0, 0, 0, 0.1)
background rgba(#000, 0.1)
> .label
&:before

View File

@ -587,7 +587,7 @@ root(isDark)
font-size 0.9em
color isDark ? #d2d9dc : #555
background isDark ? #282c37 : #fff
box-shadow 0 1px 0 rgba(0, 0, 0, 0.05)
box-shadow 0 1px 0 rgba(#000, 0.05)
&, *
user-select none
@ -733,7 +733,7 @@ root(isDark)
display inline-block
position absolute
top 0
background-color rgba(0, 0, 0, 0.3)
background-color rgba(#000, 0.3)
border-radius 100%
animation sk-bounce 2.0s infinite ease-in-out

View File

@ -14,7 +14,7 @@
display inline-block
width 18px
height 18px
background-color rgba(0, 0, 0, 0.3)
background-color rgba(#000, 0.3)
border-radius 100%
animation bounce 1.4s infinite ease-in-out both

View File

@ -3,9 +3,7 @@
<p class="title">気になるユーザーをフォロー:</p>
<div class="users" v-if="!fetching && users.length > 0">
<div class="user" v-for="user in users" :key="user.id">
<router-link class="avatar-anchor" :to="user | userPage">
<img class="avatar" :src="`${user.avatarUrl}?thumbnail&size=42`" alt="" v-user-preview="user.id"/>
</router-link>
<mk-avatar class="avatar" :user="user" target="_blank"/>
<div class="body">
<router-link class="name" :to="user | userPage" v-user-preview="user.id">{{ user | userName }}</router-link>
<p class="username">@{{ user | acct }}</p>
@ -86,18 +84,13 @@ export default Vue.extend({
display block
clear both
> .avatar-anchor
> .avatar
display block
float left
margin 0 12px 0 0
> .avatar
display block
width 42px
height 42px
margin 0
border-radius 8px
vertical-align bottom
width 42px
height 42px
border-radius 8px
> .body
float left

View File

@ -1,34 +1,34 @@
<template>
<div class="mk-home" :data-customize="customize">
<div class="customize" v-if="customize">
<router-link to="/">%fa:check%完了</router-link>
<router-link to="/">%fa:check%%i18n:@done%</router-link>
<div>
<div class="adder">
<p>ウィジェットを追加:</p>
<p>%i18n:@add-widget%</p>
<select v-model="widgetAdderSelected">
<option value="profile">プロフィール</option>
<option value="calendar">カレンダー</option>
<option value="timemachine">カレンダー(タイムマシン)</option>
<option value="activity">アクティビティ</option>
<option value="rss">RSSリーダー</option>
<option value="trends">トレンド</option>
<option value="photo-stream">フォトストリーム</option>
<option value="slideshow">スライドショー</option>
<option value="version">バージョン</option>
<option value="broadcast">ブロードキャスト</option>
<option value="notifications">通知</option>
<option value="users">おすすめユーザー</option>
<option value="polls">投票</option>
<option value="post-form">投稿フォーム</option>
<option value="messaging">メッセージ</option>
<option value="channel">チャンネル</option>
<option value="access-log">アクセスログ</option>
<option value="server">サーバー情報</option>
<option value="donation">寄付のお願い</option>
<option value="nav">ナビゲーション</option>
<option value="tips">ヒント</option>
<option value="profile">%i18n:@profile%</option>
<option value="calendar">%i18n:@calendar%</option>
<option value="timemachine">%i18n:@timemachine%</option>
<option value="activity">%i18n:@activity%</option>
<option value="rss">%i18n:@rss%</option>
<option value="trends">%i18n:@trends%</option>
<option value="photo-stream">%i18n:@photo-stream%</option>
<option value="slideshow">%i18n:@slideshow%</option>
<option value="version">%i18n:@version%</option>
<option value="broadcast">%i18n:@broadcast%</option>
<option value="notifications">%i18n:@notifications%</option>
<option value="users">%i18n:@users%</option>
<option value="polls">%i18n:@polls%</option>
<option value="post-form">%i18n:@post-form%</option>
<option value="messaging">%i18n:@messaging%</option>
<option value="channel">%i18n:@channel%</option>
<option value="access-log">%i18n:@access-log%</option>
<option value="server">%i18n:@server%</option>
<option value="donation">%i18n:@donation%</option>
<option value="nav">%i18n:@nav%</option>
<option value="tips">%i18n:@tips%</option>
</select>
<button @click="addWidget">追加</button>
<button @click="addWidget">%i18n:@add%</button>
</div>
<div class="trash">
<x-draggable v-model="trash" :options="{ group: 'x' }" @add="onTrash"></x-draggable>
@ -53,7 +53,7 @@
<div class="main">
<a @click="hint">カスタマイズのヒント</a>
<div>
<mk-post-form v-if="os.i.clientSettings.showPostFormOnTopOfTl"/>
<mk-post-form v-if="clientSettings.showPostFormOnTopOfTl"/>
<mk-timeline ref="tl" @loaded="onTlLoaded"/>
</div>
</div>
@ -63,7 +63,7 @@
<component v-for="widget in widgets[place]" :is="`mkw-${widget.name}`" :key="widget.id" :ref="widget.id" :widget="widget" @chosen="warp"/>
</div>
<div class="main">
<mk-post-form v-if="os.i.clientSettings.showPostFormOnTopOfTl"/>
<mk-post-form v-if="clientSettings.showPostFormOnTopOfTl"/>
<mk-timeline ref="tl" @loaded="onTlLoaded" v-if="mode == 'timeline'"/>
<mk-mentions @loaded="onTlLoaded" v-if="mode == 'mentions'"/>
</div>
@ -81,6 +81,7 @@ export default Vue.extend({
components: {
XDraggable
},
props: {
customize: {
type: Boolean,
@ -91,61 +92,43 @@ export default Vue.extend({
default: 'timeline'
}
},
data() {
return {
connection: null,
connectionId: null,
widgetAdderSelected: null,
trash: [],
widgets: {
left: [],
right: []
}
trash: []
};
},
computed: {
home: {
get(): any[] {
//#region 互換性のため
(this as any).os.i.clientSettings.home.forEach(w => {
if (w.name == 'rss-reader') w.name = 'rss';
if (w.name == 'user-recommendation') w.name = 'users';
if (w.name == 'recommended-polls') w.name = 'polls';
});
//#endregion
return (this as any).os.i.clientSettings.home;
},
set(value) {
(this as any).os.i.clientSettings.home = value;
}
home(): any[] {
return this.$store.state.settings.data.home;
},
left(): any[] {
return this.home.filter(w => w.place == 'left');
},
right(): any[] {
return this.home.filter(w => w.place == 'right');
},
widgets(): any {
return {
left: this.left,
right: this.right
};
}
},
created() {
this.widgets.left = this.left;
this.widgets.right = this.right;
this.$watch('os.i.clientSettings', i => {
this.widgets.left = this.left;
this.widgets.right = this.right;
}, {
deep: true
});
},
mounted() {
this.connection = (this as any).os.stream.getConnection();
this.connectionId = (this as any).os.stream.use();
this.connection.on('home_updated', this.onHomeUpdated);
},
beforeDestroy() {
this.connection.off('home_updated', this.onHomeUpdated);
(this as any).os.stream.dispose(this.connectionId);
},
methods: {
hint() {
(this as any).apis.dialog({
@ -159,56 +142,44 @@ export default Vue.extend({
}]
});
},
onTlLoaded() {
this.$emit('loaded');
},
onHomeUpdated(data) {
if (data.home) {
(this as any).os.i.clientSettings.home = data.home;
this.widgets.left = data.home.filter(w => w.place == 'left');
this.widgets.right = data.home.filter(w => w.place == 'right');
} else {
const w = (this as any).os.i.clientSettings.home.find(w => w.id == data.id);
if (w != null) {
w.data = data.data;
this.$refs[w.id][0].preventSave = true;
this.$refs[w.id][0].props = w.data;
this.widgets.left = (this as any).os.i.clientSettings.home.filter(w => w.place == 'left');
this.widgets.right = (this as any).os.i.clientSettings.home.filter(w => w.place == 'right');
}
}
},
onWidgetContextmenu(widgetId) {
const w = (this.$refs[widgetId] as any)[0];
if (w.func) w.func();
},
onWidgetSort() {
this.saveHome();
},
onTrash(evt) {
this.saveHome();
},
addWidget() {
const widget = {
this.$store.dispatch('settings/addHomeWidget', {
name: this.widgetAdderSelected,
id: uuid(),
place: 'left',
data: {}
};
this.widgets.left.unshift(widget);
this.saveHome();
});
},
saveHome() {
const left = this.widgets.left;
const right = this.widgets.right;
this.home = left.concat(right);
this.$store.commit('settings/setHome', left.concat(right));
left.forEach(w => w.place = 'left');
right.forEach(w => w.place = 'right');
(this as any).api('i/update_home', {
home: this.home
});
},
warp(date) {
(this.$refs.tl as any).warp(date);
}
@ -251,7 +222,7 @@ root(isDark)
height 48px
color isDark ? #fff : #000
background isDark ? #313543 : #f7f7f7
box-shadow 0 1px 1px rgba(0, 0, 0, 0.075)
box-shadow 0 1px 1px rgba(#000, 0.075)
> a
display block
@ -279,7 +250,7 @@ root(isDark)
> div
display flex
margin 0 auto
max-width 1200px - 32px
max-width 1220px - 32px
> div
width 50%
@ -310,7 +281,7 @@ root(isDark)
display flex
justify-content center
margin 0 auto
max-width 1200px
max-width 1220px
> *
.customize-container

View File

@ -52,7 +52,7 @@ export default Vue.extend({
left 0
width 100%
height 100%
background rgba(0, 0, 0, 0.7)
background rgba(#000, 0.7)
> img
position fixed

View File

@ -14,12 +14,20 @@ import Vue from 'vue';
import MkMediaImageDialog from './media-image-dialog.vue';
export default Vue.extend({
props: ['image'],
props: {
image: {
type: Object,
required: true
},
raw: {
default: false
}
},
computed: {
style(): any {
return {
'background-color': this.image.properties.avgColor ? `rgb(${this.image.properties.avgColor.join(',')})` : 'transparent',
'background-image': `url(${this.image.url}?thumbnail&size=512)`
'background-color': this.image.properties.avgColor && this.image.properties.avgColor.length == 3 ? `rgb(${this.image.properties.avgColor.join(',')})` : 'transparent',
'background-image': this.raw ? `url(${this.image.url})` : `url(${this.image.url}?thumbnail&size=512)`
};
}
},

View File

@ -54,7 +54,7 @@ export default Vue.extend({
left 0
width 100%
height 100%
background rgba(0, 0, 0, 0.7)
background rgba(#000, 0.7)
> video
position fixed

View File

@ -52,6 +52,7 @@ export default Vue.extend({
width 100%
height 100%
border-radius 4px
.mk-media-video-thumbnail
display flex
justify-content center

View File

@ -85,7 +85,7 @@ export default Vue.extend({
.mk-mentions
background #fff
border solid 1px rgba(0, 0, 0, 0.075)
border solid 1px rgba(#000, 0.075)
border-radius 6px
> header

View File

@ -1,13 +1,11 @@
<template>
<div class="sub" :title="title">
<router-link class="avatar-anchor" :to="note.user | userPage">
<img class="avatar" :src="`${note.user.avatarUrl}?thumbnail&size=64`" alt="avatar" v-user-preview="note.userId"/>
</router-link>
<mk-avatar class="avatar" :user="note.user"/>
<div class="main">
<header>
<div class="left">
<router-link class="name" :to="note.user | userPage" v-user-preview="note.userId">{{ note.user | userName }}</router-link>
<span class="username">@{{ note.user | acct }}</span>
<span class="username"><mk-acct :user="note.user"/></span>
</div>
<div class="right">
<router-link class="time" :to="note | notePage">
@ -17,6 +15,7 @@
</header>
<div class="body">
<div class="text">
<span v-if="note.isHidden" style="opacity: 0.5">(この投稿は非公開です)</span>
<mk-note-html v-if="note.text" :text="note.text" :i="os.i"/>
</div>
<div class="media" v-if="note.mediaIds.length > 0">
@ -56,18 +55,13 @@ root(isDark)
> .main > footer > button
color #888
> .avatar-anchor
> .avatar
display block
float left
margin 0 16px 0 0
> .avatar
display block
width 44px
height 44px
margin 0
border-radius 4px
vertical-align bottom
width 44px
height 44px
border-radius 4px
> .main
float left

View File

@ -18,31 +18,28 @@
</div>
<div class="renote" v-if="isRenote">
<p>
<router-link class="avatar-anchor" :to="note.user | userPage" v-user-preview="note.userId">
<img class="avatar" :src="`${note.user.avatarUrl}?thumbnail&size=32`" alt="avatar"/>
</router-link>
<mk-avatar class="avatar" :user="note.user"/>
%fa:retweet%
<router-link class="name" :href="note.user | userPage">{{ note.user | userName }}</router-link>
がRenote
</p>
</div>
<article>
<router-link class="avatar-anchor" :to="p.user | userPage">
<img class="avatar" :src="`${p.user.avatarUrl}?thumbnail&size=64`" alt="avatar" v-user-preview="p.user.id"/>
</router-link>
<mk-avatar class="avatar" :user="p.user"/>
<header>
<router-link class="name" :to="p.user | userPage" v-user-preview="p.user.id">{{ p.user | userName }}</router-link>
<span class="username">@{{ p.user | acct }}</span>
<span class="username"><mk-acct :user="p.user"/></span>
<router-link class="time" :to="p | notePage">
<mk-time :time="p.createdAt"/>
</router-link>
</header>
<div class="body">
<div class="text">
<span v-if="p.isHidden" style="opacity: 0.5">(この投稿は非公開です)</span>
<mk-note-html v-if="p.text" :text="p.text" :i="os.i"/>
</div>
<div class="media" v-if="p.media.length > 0">
<mk-media-list :media-list="p.media"/>
<mk-media-list :media-list="p.media" :raw="true"/>
</div>
<mk-poll v-if="p.poll" :note="p"/>
<mk-url-preview v-for="url in urls" :url="url" :key="url"/>
@ -158,7 +155,7 @@ export default Vue.extend({
// Draw map
if (this.p.geo) {
const shouldShowMap = (this as any).os.isSignedIn ? (this as any).os.i.clientSettings.showMaps : true;
const shouldShowMap = (this as any).os.isSignedIn ? (this as any).clientSettings.showMaps : true;
if (shouldShowMap) {
(this as any).os.getGoogleMaps().then(maps => {
const uluru = new maps.LatLng(this.p.geo.coordinates[1], this.p.geo.coordinates[0]);
@ -217,12 +214,12 @@ export default Vue.extend({
@import '~const.styl'
root(isDark)
margin 0
margin 0 auto
padding 0
overflow hidden
text-align left
background isDark ? #282C37 : #fff
border solid 1px rgba(0, 0, 0, 0.1)
border solid 1px rgba(#000, 0.1)
border-radius 8px
> .read-more
@ -241,13 +238,13 @@ root(isDark)
border-radius 6px 6px 0 0
&:hover
background #f6f6f6
background isDark ? #2e3440 : #f6f6f6
&:active
background #f0f0f0
background isDark ? #21242b : #f0f0f0
&:disabled
color #ccc
color isDark ? #21242b : #ccc
> .context
> *
@ -261,17 +258,12 @@ root(isDark)
margin 0
padding 16px 32px
.avatar-anchor
.avatar
display inline-block
.avatar
vertical-align bottom
min-width 28px
min-height 28px
max-width 28px
max-height 28px
margin 0 8px 0 0
border-radius 6px
width 28px
height 28px
margin 0 8px 0 0
border-radius 6px
[data-fa]
margin-right 4px
@ -294,21 +286,13 @@ root(isDark)
clear both
&:hover
> .main > footer > button
color #888
> footer > button
color isDark ? #707b97 : #888
> .avatar-anchor
display block
> .avatar
width 60px
height 60px
> .avatar
display block
width 60px
height 60px
margin 0
border-radius 8px
vertical-align bottom
border-radius 8px
> header
position absolute
@ -340,7 +324,7 @@ root(isDark)
top 0
right 32px
font-size 1em
color #c0c0c0
color isDark ? #606984 : #c0c0c0
> .body
padding 8px 0
@ -415,11 +399,11 @@ root(isDark)
background transparent
border none
font-size 1em
color #ddd
color isDark ? #606984 : #ccc
cursor pointer
&:hover
color #666
color isDark ? #9198af : #666
> .count
display inline

View File

@ -1,12 +1,10 @@
<template>
<div class="mk-note-preview" :title="title">
<router-link class="avatar-anchor" :to="note.user | userPage">
<img class="avatar" :src="`${note.user.avatarUrl}?thumbnail&size=64`" alt="avatar" v-user-preview="note.userId"/>
</router-link>
<mk-avatar class="avatar" :user="note.user"/>
<div class="main">
<header>
<router-link class="name" :to="note.user | userPage" v-user-preview="note.userId">{{ note.user | userName }}</router-link>
<span class="username">@{{ note.user | acct }}</span>
<span class="username"><mk-acct :user="note.user"/></span>
<router-link class="time" :to="note | notePage">
<mk-time :time="note.createdAt"/>
</router-link>
@ -41,18 +39,13 @@ root(isDark)
display block
clear both
> .avatar-anchor
> .avatar
display block
float left
margin 0 16px 0 0
> .avatar
display block
width 52px
height 52px
margin 0
border-radius 8px
vertical-align bottom
width 52px
height 52px
border-radius 8px
> .main
float left
@ -60,22 +53,26 @@ root(isDark)
> header
display flex
align-items baseline
white-space nowrap
> .name
margin 0 .5em 0 0
padding 0
overflow hidden
color isDark ? #fff : #607073
font-size 1em
font-weight bold
text-decoration none
white-space normal
text-overflow ellipsis
&:hover
text-decoration underline
> .username
margin 0 .5em 0 0
overflow hidden
text-overflow ellipsis
color isDark ? #606984 : #d1d8da
> .time

View File

@ -1,15 +1,22 @@
<template>
<div class="sub" :title="title">
<router-link class="avatar-anchor" :to="note.user | userPage">
<img class="avatar" :src="`${note.user.avatarUrl}?thumbnail&size=64`" alt="avatar" v-user-preview="note.userId"/>
</router-link>
<mk-avatar class="avatar" :user="note.user"/>
<div class="main">
<header>
<router-link class="name" :to="note.user | userPage" v-user-preview="note.userId">{{ note.user | userName }}</router-link>
<span class="username">@{{ note.user | acct }}</span>
<router-link class="created-at" :to="note | notePage">
<mk-time :time="note.createdAt"/>
</router-link>
<span class="username"><mk-acct :user="note.user"/></span>
<div class="info">
<span class="mobile" v-if="note.viaMobile">%fa:mobile-alt%</span>
<router-link class="created-at" :to="note | notePage">
<mk-time :time="note.createdAt"/>
</router-link>
<span class="visibility" v-if="note.visibility != 'public'">
<template v-if="note.visibility == 'home'">%fa:home%</template>
<template v-if="note.visibility == 'followers'">%fa:unlock%</template>
<template v-if="note.visibility == 'specified'">%fa:envelope%</template>
<template v-if="note.visibility == 'private'">%fa:lock%</template>
</span>
</div>
</header>
<div class="body">
<mk-sub-note-content class="text" :note="note"/>
@ -35,26 +42,22 @@ export default Vue.extend({
<style lang="stylus" scoped>
root(isDark)
margin 0
padding 16px
padding 16px 32px
font-size 0.9em
background isDark ? #21242d : #fcfcfc
&:after
content ""
display block
clear both
> .avatar-anchor
> .avatar
display block
float left
margin 0 14px 0 0
> .avatar
display block
width 52px
height 52px
margin 0
border-radius 8px
vertical-align bottom
width 52px
height 52px
border-radius 8px
> .main
float left
@ -62,6 +65,7 @@ root(isDark)
> header
display flex
align-items baseline
margin-bottom 2px
white-space nowrap
line-height 21px
@ -84,9 +88,18 @@ root(isDark)
margin 0 .5em 0 0
color isDark ? #606984 : #d1d8da
> .created-at
> .info
margin-left auto
color isDark ? #606984 : #b2b8bb
font-size 0.9em
> *
color isDark ? #606984 : #b2b8bb
> .mobile
margin-right 6px
> .visibility
margin-left 6px
> .body
max-height 128px

View File

@ -1,12 +1,10 @@
<template>
<div class="note" tabindex="-1" :title="title" @keydown="onKeydown">
<div class="reply-to" v-if="p.reply && (!os.isSignedIn || os.i.clientSettings.showReplyTarget)">
<div class="reply-to" v-if="p.reply && (!os.isSignedIn || clientSettings.showReplyTarget)">
<x-sub :note="p.reply"/>
</div>
<div class="renote" v-if="isRenote">
<router-link class="avatar-anchor" :to="note.user | userPage" v-user-preview="note.userId">
<img class="avatar" :src="`${note.user.avatarUrl}?thumbnail&size=32`" alt="avatar"/>
</router-link>
<mk-avatar class="avatar" :user="note.user"/>
%fa:retweet%
<span>{{ '%i18n:!@reposted-by%'.substr(0, '%i18n:!@reposted-by%'.indexOf('{')) }}</span>
<a class="name" :href="note.user | userPage" v-user-preview="note.userId">{{ note.user | userName }}</a>
@ -14,20 +12,24 @@
<mk-time :time="note.createdAt"/>
</div>
<article>
<router-link class="avatar-anchor" :to="p.user | userPage">
<img class="avatar" :src="`${p.user.avatarUrl}?thumbnail&size=64`" alt="avatar" v-user-preview="p.user.id"/>
</router-link>
<mk-avatar class="avatar" :user="p.user"/>
<div class="main">
<header>
<router-link class="name" :to="p.user | userPage" v-user-preview="p.user.id">{{ p.user | userName }}</router-link>
<span class="is-bot" v-if="p.user.host === null && p.user.isBot">bot</span>
<span class="username">@{{ p.user | acct }}</span>
<span class="username"><mk-acct :user="p.user"/></span>
<div class="info">
<span class="app" v-if="p.app">via <b>{{ p.app.name }}</b></span>
<span class="mobile" v-if="p.viaMobile">%fa:mobile-alt%</span>
<router-link class="created-at" :to="p | notePage">
<mk-time :time="p.createdAt"/>
</router-link>
<span class="visibility" v-if="p.visibility != 'public'">
<template v-if="p.visibility == 'home'">%fa:home%</template>
<template v-if="p.visibility == 'followers'">%fa:unlock%</template>
<template v-if="p.visibility == 'specified'">%fa:envelope%</template>
<template v-if="p.visibility == 'private'">%fa:lock%</template>
</span>
</div>
</header>
<div class="body">
@ -40,8 +42,9 @@
</p>
<div class="content" v-show="p.cw == null || showContent">
<div class="text">
<span v-if="p.isHidden" style="opacity: 0.5">(この投稿は非公開です)</span>
<a class="reply" v-if="p.reply">%fa:reply%</a>
<mk-note-html v-if="p.text" :text="p.text" :i="os.i" :class="$style.text"/>
<mk-note-html v-if="p.text && !canHideText(p)" :text="p.text" :i="os.i" :class="$style.text"/>
<a class="rp" v-if="p.renote">RP:</a>
</div>
<div class="media" v-if="p.media.length > 0">
@ -91,6 +94,7 @@
<script lang="ts">
import Vue from 'vue';
import dateStringify from '../../../common/scripts/date-stringify';
import canHideText from '../../../common/scripts/can-hide-text';
import parse from '../../../../../text/parse';
import MkPostFormWindow from './post-form-window.vue';
@ -127,16 +131,17 @@ export default Vue.extend({
},
computed: {
isRenote(): boolean {
return (this.note.renote &&
this.note.text == null &&
this.note.mediaIds.length == 0 &&
this.note.poll == null);
},
p(): any {
return this.isRenote ? this.note.renote : this.note;
},
reactionsCount(): number {
return this.p.reactionCounts
? Object.keys(this.p.reactionCounts)
@ -144,9 +149,11 @@ export default Vue.extend({
.reduce((a, b) => a + b)
: 0;
},
title(): string {
return dateStringify(this.p.createdAt);
},
urls(): string[] {
if (this.p.text) {
const ast = parse(this.p.text);
@ -175,7 +182,7 @@ export default Vue.extend({
// Draw map
if (this.p.geo) {
const shouldShowMap = (this as any).os.isSignedIn ? (this as any).os.i.clientSettings.showMaps : true;
const shouldShowMap = (this as any).os.isSignedIn ? (this as any).clientSettings.showMaps : true;
if (shouldShowMap) {
(this as any).os.getGoogleMaps().then(maps => {
const uluru = new maps.LatLng(this.p.geo.coordinates[1], this.p.geo.coordinates[0]);
@ -202,6 +209,8 @@ export default Vue.extend({
},
methods: {
canHideText,
capture(withHandler = false) {
if ((this as any).os.isSignedIn) {
this.connection.send({
@ -211,6 +220,7 @@ export default Vue.extend({
if (withHandler) this.connection.on('note-updated', this.onStreamNoteUpdated);
}
},
decapture(withHandler = false) {
if ((this as any).os.isSignedIn) {
this.connection.send({
@ -220,9 +230,11 @@ export default Vue.extend({
if (withHandler) this.connection.off('note-updated', this.onStreamNoteUpdated);
}
},
onStreamConnected() {
this.capture();
},
onStreamNoteUpdated(data) {
const note = data.note;
if (note.id == this.note.id) {
@ -231,28 +243,33 @@ export default Vue.extend({
this.note.renote = note;
}
},
reply() {
(this as any).os.new(MkPostFormWindow, {
reply: this.p
});
},
renote() {
(this as any).os.new(MkRenoteFormWindow, {
note: this.p
});
},
react() {
(this as any).os.new(MkReactionPicker, {
source: this.$refs.reactButton,
note: this.p
});
},
menu() {
(this as any).os.new(MkNoteMenu, {
source: this.$refs.menuButton,
note: this.p
});
},
onKeydown(e) {
let shouldBeCancel = true;
@ -330,21 +347,19 @@ root(isDark)
> .renote
display flex
align-items baseline
align-items center
padding 16px 32px
line-height 28px
white-space pre
color #9dbb00
background isDark ? linear-gradient(to bottom, #314027 0%, #282c37 100%) : linear-gradient(to bottom, #edfde2 0%, #fff 100%)
.avatar-anchor
.avatar
display inline-block
.avatar
vertical-align bottom
width 28px
height 28px
margin 0 8px 0 0
border-radius 6px
width 28px
height 28px
margin 0 8px 0 0
border-radius 6px
[data-fa]
margin-right 4px
@ -371,13 +386,6 @@ root(isDark)
& + article
padding-top 8px
> .reply-to
padding 0 16px
background rgba(0, 0, 0, 0.0125)
> .mk-note-preview
background transparent
> article
padding 28px 32px 18px 32px
@ -390,29 +398,24 @@ root(isDark)
> .main > footer > button
color isDark ? #707b97 : #888
> .avatar-anchor
> .avatar
display block
float left
margin 0 16px 10px 0
width 58px
height 58px
border-radius 8px
//position -webkit-sticky
//position sticky
//top 74px
> .avatar
display block
width 58px
height 58px
margin 0
border-radius 8px
vertical-align bottom
> .main
float left
width calc(100% - 74px)
> header
display flex
align-items center
align-items baseline
margin-bottom 4px
white-space nowrap
@ -448,18 +451,19 @@ root(isDark)
margin-left auto
font-size 0.9em
> *
color isDark ? #606984 : #c0c0c0
> .mobile
margin-right 8px
color isDark ? #606984 : #ccc
> .app
margin-right 8px
padding-right 8px
color #ccc
border-right solid 1px #eaeaea
> .created-at
color isDark ? #606984 : #c0c0c0
> .visibility
margin-left 8px
> .body
@ -613,7 +617,7 @@ root(isDark)
> .detail
padding-top 4px
background rgba(0, 0, 0, 0.0125)
background rgba(#000, 0.0125)
.note[data-darkmode]
root(true)

View File

@ -121,13 +121,13 @@ export default Vue.extend({
const isMyNote = note.userId == (this as any).os.i.id;
const isPureRenote = note.renoteId != null && note.text == null && note.mediaIds.length == 0 && note.poll == null;
if ((this as any).os.i.clientSettings.showMyRenotes === false) {
if ((this as any).clientSettings.showMyRenotes === false) {
if (isMyNote && isPureRenote) {
return;
}
}
if ((this as any).os.i.clientSettings.showRenotedMyNotes === false) {
if ((this as any).clientSettings.showRenotedMyNotes === false) {
if (isPureRenote && (note.renote.userId == (this as any).os.i.id)) {
return;
}
@ -156,7 +156,7 @@ export default Vue.extend({
this.notes = this.notes.slice(0, displayLimit);
}
} else {
this.queue.unshift(note);
this.queue.push(note);
}
},
@ -199,7 +199,7 @@ export default Vue.extend({
this.clearNotification();
}
if ((this as any).os.i.clientSettings.fetchOnScroll !== false) {
if ((this as any).clientSettings.fetchOnScroll !== false) {
const current = window.scrollY + window.innerHeight;
if (current > document.body.offsetHeight - 8) this.loadMore();
}

View File

@ -6,9 +6,7 @@
<div class="notification" :class="notification.type" :key="notification.id">
<mk-time :time="notification.createdAt"/>
<template v-if="notification.type == 'reaction'">
<router-link class="avatar-anchor" :to="notification.user | userPage" v-user-preview="notification.user.id">
<img class="avatar" :src="`${notification.user.avatarUrl}?thumbnail&size=48`" alt="avatar"/>
</router-link>
<mk-avatar class="avatar" :user="notification.user"/>
<div class="text">
<p>
<mk-reaction-icon :reaction="notification.reaction"/>
@ -20,9 +18,7 @@
</div>
</template>
<template v-if="notification.type == 'renote'">
<router-link class="avatar-anchor" :to="notification.note.user | userPage" v-user-preview="notification.note.userId">
<img class="avatar" :src="`${notification.note.user.avatarUrl}?thumbnail&size=48`" alt="avatar"/>
</router-link>
<mk-avatar class="avatar" :user="notification.note.user"/>
<div class="text">
<p>%fa:retweet%
<router-link :to="notification.note.user | userPage" v-user-preview="notification.note.userId">{{ notification.note.user | userName }}</router-link>
@ -33,9 +29,7 @@
</div>
</template>
<template v-if="notification.type == 'quote'">
<router-link class="avatar-anchor" :to="notification.note.user | userPage" v-user-preview="notification.note.userId">
<img class="avatar" :src="`${notification.note.user.avatarUrl}?thumbnail&size=48`" alt="avatar"/>
</router-link>
<mk-avatar class="avatar" :user="notification.note.user"/>
<div class="text">
<p>%fa:quote-left%
<router-link :to="notification.note.user | userPage" v-user-preview="notification.note.userId">{{ notification.note.user | userName }}</router-link>
@ -44,9 +38,7 @@
</div>
</template>
<template v-if="notification.type == 'follow'">
<router-link class="avatar-anchor" :to="notification.user | userPage" v-user-preview="notification.user.id">
<img class="avatar" :src="`${notification.user.avatarUrl}?thumbnail&size=48`" alt="avatar"/>
</router-link>
<mk-avatar class="avatar" :user="notification.user"/>
<div class="text">
<p>%fa:user-plus%
<router-link :to="notification.user | userPage" v-user-preview="notification.user.id">{{ notification.user | userName }}</router-link>
@ -54,9 +46,7 @@
</div>
</template>
<template v-if="notification.type == 'reply'">
<router-link class="avatar-anchor" :to="notification.note.user | userPage" v-user-preview="notification.note.userId">
<img class="avatar" :src="`${notification.note.user.avatarUrl}?thumbnail&size=48`" alt="avatar"/>
</router-link>
<mk-avatar class="avatar" :user="notification.note.user"/>
<div class="text">
<p>%fa:reply%
<router-link :to="notification.note.user | userPage" v-user-preview="notification.note.userId">{{ notification.note.user | userName }}</router-link>
@ -65,9 +55,7 @@
</div>
</template>
<template v-if="notification.type == 'mention'">
<router-link class="avatar-anchor" :to="notification.note.user | userPage" v-user-preview="notification.note.userId">
<img class="avatar" :src="`${notification.note.user.avatarUrl}?thumbnail&size=48`" alt="avatar"/>
</router-link>
<mk-avatar class="avatar" :user="notification.note.user"/>
<div class="text">
<p>%fa:at%
<router-link :to="notification.note.user | userPage" v-user-preview="notification.note.userId">{{ notification.note.user | userName }}</router-link>
@ -76,9 +64,7 @@
</div>
</template>
<template v-if="notification.type == 'poll_vote'">
<router-link class="avatar-anchor" :to="notification.user | userPage" v-user-preview="notification.user.id">
<img class="avatar" :src="`${notification.user.avatarUrl}?thumbnail&size=48`" alt="avatar"/>
</router-link>
<mk-avatar class="avatar" :user="notification.user"/>
<div class="text">
<p>%fa:chart-pie%<a :href="notification.user | userPage" v-user-preview="notification.user.id">{{ notification.user | userName }}</a></p>
<router-link class="note-ref" :to="notification.note | notePage">
@ -204,7 +190,7 @@ root(isDark)
padding 16px
overflow-wrap break-word
font-size 0.9em
border-bottom solid 1px isDark ? #1c2023 : rgba(0, 0, 0, 0.05)
border-bottom solid 1px isDark ? #1c2023 : rgba(#000, 0.05)
&:last-child
border-bottom none
@ -215,7 +201,7 @@ root(isDark)
top 16px
right 12px
vertical-align top
color isDark ? #606984 : rgba(0, 0, 0, 0.6)
color isDark ? #606984 : rgba(#000, 0.6)
font-size small
&:after
@ -223,20 +209,15 @@ root(isDark)
display block
clear both
> .avatar-anchor
> .avatar
display block
float left
position -webkit-sticky
position sticky
top 16px
> img
display block
min-width 36px
min-height 36px
max-width 36px
max-height 36px
border-radius 6px
width 36px
height 36px
border-radius 6px
> .text
float right
@ -250,10 +231,10 @@ root(isDark)
margin-right 4px
.note-preview
color isDark ? #c2cad4 : rgba(0, 0, 0, 0.7)
color isDark ? #c2cad4 : rgba(#000, 0.7)
.note-ref
color isDark ? #c2cad4 : rgba(0, 0, 0, 0.7)
color isDark ? #c2cad4 : rgba(#000, 0.7)
[data-fa]
font-size 1em
@ -282,7 +263,7 @@ root(isDark)
font-size 0.8em
color isDark ? #666b79 : #aaa
background isDark ? #242731 : #fdfdfd
border-bottom solid 1px isDark ? #1c2023 : rgba(0, 0, 0, 0.05)
border-bottom solid 1px isDark ? #1c2023 : rgba(#000, 0.05)
span
margin 0 16px
@ -295,13 +276,13 @@ root(isDark)
width 100%
padding 16px
color #555
border-top solid 1px rgba(0, 0, 0, 0.05)
border-top solid 1px rgba(#000, 0.05)
&:hover
background rgba(0, 0, 0, 0.025)
background rgba(#000, 0.025)
&:active
background rgba(0, 0, 0, 0.05)
background rgba(#000, 0.05)
&.fetching
cursor wait

View File

@ -6,6 +6,10 @@
@drop.stop="onDrop"
>
<div class="content">
<div v-if="visibility == 'specified'" class="visibleUsers">
<span v-for="u in visibleUsers">{{ u | userName }}<a @click="removeVisibleUser(u)">[x]</a></span>
<a @click="addVisibleUser">+ユーザーを追加</a>
</div>
<input v-show="useCw" v-model="cw" placeholder="内容への注釈 (オプション)">
<textarea :class="{ with: (files.length != 0 || poll) }"
ref="text" v-model="text" :disabled="posting"
@ -30,7 +34,8 @@
<button class="poll" title="%i18n:@create-poll%" @click="poll = true">%fa:chart-pie%</button>
<button class="poll" title="内容を隠す" @click="useCw = !useCw">%fa:eye-slash%</button>
<button class="geo" title="位置情報を添付する" @click="geo ? removeGeo() : setGeo()">%fa:map-marker-alt%</button>
<p class="text-count" :class="{ over: text.length > 1000 }">{{ '%i18n:!@text-remain%'.replace('{}', 1000 - text.length) }}</p>
<button class="visibility" title="公開範囲" @click="setVisibility" ref="visibilityButton">%fa:lock%</button>
<p class="text-count" :class="{ over: text.length > 1000 }">{{ 1000 - text.length }}</p>
<button :class="{ posting }" class="submit" :disabled="!canPost" @click="post">
{{ posting ? '%i18n:!@posting%' : submitText }}<mk-ellipsis v-if="posting"/>
</button>
@ -43,10 +48,12 @@
import Vue from 'vue';
import * as XDraggable from 'vuedraggable';
import getKao from '../../../common/scripts/get-kao';
import MkVisibilityChooser from '../../../common/views/components/visibility-chooser.vue';
export default Vue.extend({
components: {
XDraggable
XDraggable,
MkVisibilityChooser
},
props: ['reply', 'renote'],
@ -61,6 +68,8 @@ export default Vue.extend({
useCw: false,
cw: null,
geo: null,
visibility: 'public',
visibleUsers: [],
autocomplete: null,
draghover: false
};
@ -96,21 +105,11 @@ export default Vue.extend({
}
},
watch: {
text() {
this.saveDraft();
},
poll() {
this.saveDraft();
},
files() {
this.saveDraft();
}
},
mounted() {
if (this.reply && this.reply.user.host != null) {
this.text = `@${this.reply.user.username}@${this.reply.user.host} `;
}
this.$nextTick(() => {
// 書きかけの投稿を復元
const draft = JSON.parse(localStorage.getItem('drafts') || '{}')[this.draftId];
@ -125,10 +124,18 @@ export default Vue.extend({
}
this.$emit('change-attached-media', this.files);
}
this.$nextTick(() => this.watch());
});
},
methods: {
watch() {
this.$watch('text', () => this.saveDraft());
this.$watch('poll', () => this.saveDraft());
this.$watch('files', () => this.saveDraft());
},
focus() {
(this.$refs.text as any).focus();
},
@ -246,6 +253,32 @@ export default Vue.extend({
this.$emit('geo-dettached');
},
setVisibility() {
const w = (this as any).os.new(MkVisibilityChooser, {
source: this.$refs.visibilityButton,
v: this.visibility
});
w.$once('chosen', v => {
this.visibility = v;
});
},
addVisibleUser() {
(this as any).apis.input({
title: 'ユーザー名を入力してください'
}).then(username => {
(this as any).api('users/show', {
username
}).then(user => {
this.visibleUsers.push(user);
});
});
},
removeVisibleUser(user) {
this.visibleUsers = this.visibleUsers.filter(u => u != user);
},
post() {
this.posting = true;
@ -256,6 +289,8 @@ export default Vue.extend({
renoteId: this.renote ? this.renote.id : undefined,
poll: this.poll ? (this.$refs.poll as any).get() : undefined,
cw: this.useCw ? this.cw || '' : undefined,
visibility: this.visibility,
visibleUserIds: this.visibility == 'specified' ? this.visibleUsers.map(u => u.id) : undefined,
geo: this.geo ? {
coordinates: [this.geo.longitude, this.geo.latitude],
altitude: this.geo.altitude,
@ -328,7 +363,6 @@ root(isDark)
clear both
> .content
> input
> textarea
display block
@ -381,6 +415,14 @@ root(isDark)
border-bottom solid 1px rgba($theme-color, 0.1) !important
border-radius 4px 4px 0 0
> .visibleUsers
margin-bottom 8px
font-size 14px
> span
margin-right 16px
color isDark ? #fff : #666
> .medias
margin 0
padding 0
@ -450,19 +492,6 @@ root(isDark)
input[type='file']
display none
.text-count
pointer-events none
display block
position absolute
bottom 16px
right 138px
margin 0
line-height 40px
color rgba($theme-color, 0.5)
&.over
color #ec3828
.submit
display block
position absolute
@ -527,11 +556,25 @@ root(isDark)
from {background-position: 0 0;}
to {background-position: -64px 32px;}
> .text-count
pointer-events none
display block
position absolute
bottom 16px
right 138px
margin 0
line-height 40px
color rgba($theme-color, 0.5)
&.over
color #ec3828
> .upload
> .drive
> .kao
> .poll
> .geo
> .visibility
display inline-block
cursor pointer
padding 0
@ -553,7 +596,7 @@ root(isDark)
color rgba($theme-color, 0.6)
background isDark ? transparent : linear-gradient(to bottom, lighten($theme-color, 80%) 0%, lighten($theme-color, 90%) 100%)
border-color rgba($theme-color, 0.5)
box-shadow 0 2px 4px rgba(0, 0, 0, 0.15) inset
box-shadow 0 2px 4px rgba(#000, 0.15) inset
&:focus
&:after

View File

@ -1,6 +1,6 @@
<template>
<div class="root api">
<p>Token: <code>{{ os.i.token }}</code></p>
<p>%i18n:@token% <code>{{ os.i.token }}</code></p>
<p>%i18n:@intro%</p>
<div class="ui info warn"><p>%fa:exclamation-triangle%%i18n:@caution%</p></div>
<p>%i18n:@regeneration-of-token%</p>

View File

@ -20,7 +20,7 @@
<section class="web" v-show="page == 'web'">
<h1>動作</h1>
<mk-switch v-model="os.i.clientSettings.fetchOnScroll" @change="onChangeFetchOnScroll" text="スクロールで自動読み込み">
<mk-switch v-model="clientSettings.fetchOnScroll" @change="onChangeFetchOnScroll" text="スクロールで自動読み込み">
<span>ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます</span>
</mk-switch>
<mk-switch v-model="autoPopout" text="ウィンドウの自動ポップアウト">
@ -41,13 +41,14 @@
</div>
<div class="div">
<mk-switch v-model="darkmode" text="ダークモード"/>
<mk-switch v-model="os.i.clientSettings.gradientWindowHeader" @change="onChangeGradientWindowHeader" text="ウィンドウのタイトルバーにグラデーションを使用"/>
<mk-switch v-model="clientSettings.circleIcons" @change="onChangeCircleIcons" text="円形のアイコンを使用"/>
<mk-switch v-model="clientSettings.gradientWindowHeader" @change="onChangeGradientWindowHeader" text="ウィンドウのタイトルバーにグラデーションを使用"/>
</div>
<mk-switch v-model="os.i.clientSettings.showPostFormOnTopOfTl" @change="onChangeShowPostFormOnTopOfTl" text="タイムライン上部に投稿フォームを表示する"/>
<mk-switch v-model="os.i.clientSettings.showReplyTarget" @change="onChangeShowReplyTarget" text="リプライ先を表示する"/>
<mk-switch v-model="os.i.clientSettings.showMyRenotes" @change="onChangeShowMyRenotes" text="自分の行ったRenoteをタイムラインに表示する"/>
<mk-switch v-model="os.i.clientSettings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes" text="Renoteされた自分の投稿をタイムラインに表示する"/>
<mk-switch v-model="os.i.clientSettings.showMaps" @change="onChangeShowMaps" text="マップの自動展開">
<mk-switch v-model="clientSettings.showPostFormOnTopOfTl" @change="onChangeShowPostFormOnTopOfTl" text="タイムライン上部に投稿フォームを表示する"/>
<mk-switch v-model="clientSettings.showReplyTarget" @change="onChangeShowReplyTarget" text="リプライ先を表示する"/>
<mk-switch v-model="clientSettings.showMyRenotes" @change="onChangeShowMyRenotes" text="自分の行ったRenoteをタイムラインに表示する"/>
<mk-switch v-model="clientSettings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes" text="Renoteされた自分の投稿をタイムラインに表示する"/>
<mk-switch v-model="clientSettings.showMaps" @change="onChangeShowMaps" text="マップの自動展開">
<span>位置情報が添付された投稿のマップを自動的に展開します</span>
</mk-switch>
</section>
@ -69,7 +70,7 @@
<section class="web" v-show="page == 'web'">
<h1>モバイル</h1>
<mk-switch v-model="os.i.clientSettings.disableViaMobile" @change="onChangeDisableViaMobile" text="モバイルからの投稿フラグを付けない"/>
<mk-switch v-model="clientSettings.disableViaMobile" @change="onChangeDisableViaMobile" text="モバイルからの投稿フラグを付けない"/>
</section>
<section class="web" v-show="page == 'web'">
@ -79,9 +80,11 @@
<el-option label="自動" value=""/>
</el-option-group>
<el-option-group label="言語を指定">
<el-option label="ja-JP" value="ja"/>
<el-option label="en-US" value="en"/>
<el-option label="ja" value="ja"/>
<el-option label="en" value="en"/>
<el-option label="fr" value="fr"/>
<el-option label="pl" value="pl"/>
<el-option label="de" value="de"/>
</el-option-group>
</el-select>
<div class="none ui info">
@ -98,7 +101,7 @@
</section>
<section class="notification" v-show="page == 'notification'">
<h1>通知</h1>
<h1>%i18n:@notification%</h1>
<mk-switch v-model="os.i.settings.autoWatch" @change="onChangeAutoWatch" text="投稿の自動ウォッチ">
<span>リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。</span>
</mk-switch>
@ -115,7 +118,7 @@
</section>
<section class="apps" v-show="page == 'apps'">
<h1>アプリケーション</h1>
<h1>%i18n:@apps%</h1>
<x-apps/>
</section>
@ -135,7 +138,7 @@
</section>
<section class="signin" v-show="page == 'security'">
<h1>サインイン履歴</h1>
<h1>%i18n:@signin%</h1>
<x-signins/>
</section>
@ -297,8 +300,8 @@ export default Vue.extend({
this.$emit('done');
},
onChangeFetchOnScroll(v) {
(this as any).api('i/update_client_setting', {
name: 'fetchOnScroll',
this.$store.dispatch('settings/set', {
key: 'fetchOnScroll',
value: v
});
},
@ -308,50 +311,56 @@ export default Vue.extend({
});
},
onChangeDark(v) {
(this as any).api('i/update_client_setting', {
name: 'dark',
this.$store.dispatch('settings/set', {
key: 'dark',
value: v
});
},
onChangeShowPostFormOnTopOfTl(v) {
(this as any).api('i/update_client_setting', {
name: 'showPostFormOnTopOfTl',
this.$store.dispatch('settings/set', {
key: 'showPostFormOnTopOfTl',
value: v
});
},
onChangeShowReplyTarget(v) {
(this as any).api('i/update_client_setting', {
name: 'showReplyTarget',
this.$store.dispatch('settings/set', {
key: 'showReplyTarget',
value: v
});
},
onChangeShowMyRenotes(v) {
(this as any).api('i/update_client_setting', {
name: 'showMyRenotes',
this.$store.dispatch('settings/set', {
key: 'showMyRenotes',
value: v
});
},
onChangeShowRenotedMyNotes(v) {
(this as any).api('i/update_client_setting', {
name: 'showRenotedMyNotes',
this.$store.dispatch('settings/set', {
key: 'showRenotedMyNotes',
value: v
});
},
onChangeShowMaps(v) {
(this as any).api('i/update_client_setting', {
name: 'showMaps',
this.$store.dispatch('settings/set', {
key: 'showMaps',
value: v
});
},
onChangeCircleIcons(v) {
this.$store.dispatch('settings/set', {
key: 'circleIcons',
value: v
});
},
onChangeGradientWindowHeader(v) {
(this as any).api('i/update_client_setting', {
name: 'gradientWindowHeader',
this.$store.dispatch('settings/set', {
key: 'gradientWindowHeader',
value: v
});
},
onChangeDisableViaMobile(v) {
(this as any).api('i/update_client_setting', {
name: 'disableViaMobile',
this.$store.dispatch('settings/set', {
key: 'disableViaMobile',
value: v
});
},

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