Compare commits

..

582 Commits

Author SHA1 Message Date
syuilo
792632d726 3.0.1 2018-06-16 15:23:44 +09:00
syuilo
9cac293efc #1708 2018-06-16 15:23:03 +09:00
syuilo
cd8bfca29c npm install --only=dev するのが既存のドキュメントと互換性が無いため戻す 2018-06-16 13:10:17 +09:00
syuilo
b5b437b878 ✌️ 2018-06-16 12:43:58 +09:00
syuilo
cc2947063a add lock file 2018-06-16 12:42:59 +09:00
syuilo
2864a9027f save-exact=true 2018-06-16 12:02:38 +09:00
syuilo
e11f547308 #1715 2018-06-16 10:40:53 +09:00
syuilo
f164661ef2 2.42.0 2018-06-16 07:40:39 +09:00
syuilo
c9d993b838 ✌️ 2018-06-16 07:40:07 +09:00
syuilo
65f35dc9f4 ✌️ 2018-06-16 07:31:35 +09:00
syuilo
b600d462c1 ✌️ 2018-06-16 07:13:45 +09:00
syuilo
fa5a82c9ab ✌️ 2018-06-16 07:06:58 +09:00
syuilo
7c596be638 2.41.1 2018-06-15 19:58:15 +09:00
syuilo
07265f594b ✌️ 2018-06-15 19:58:04 +09:00
syuilo
392cb1ba89 2.41.0 2018-06-15 19:57:13 +09:00
syuilo
e6f33e997f 🎨 2018-06-15 19:56:18 +09:00
syuilo
a44387f250 ✌️ 2018-06-15 13:58:09 +09:00
syuilo
b1b1b7592b ✌️ 2018-06-15 13:08:56 +09:00
syuilo
ca668898f4 2.40.1 2018-06-15 09:57:06 +09:00
syuilo
fcd437c89f Fix bug 2018-06-15 09:56:59 +09:00
syuilo
7f7d7edc7f 2.40.0 2018-06-15 09:53:53 +09:00
syuilo
bd827f946a ドライブのファイルの削除を実装 2018-06-15 09:53:30 +09:00
syuilo
ad8aa1c179 Fix 2018-06-15 09:33:25 +09:00
syuilo
3ebaf83ce0 2.39.0 2018-06-15 08:00:14 +09:00
syuilo
39b1978ff3 Merge pull request #1713 from syuilo/without-vue-material
Without vue material
2018-06-15 07:58:58 +09:00
syuilo
bddff17e5e wip 2018-06-15 07:58:27 +09:00
syuilo
0ac9120064 wip 2018-06-15 07:56:56 +09:00
syuilo
d90f75425f wip 2018-06-14 21:38:39 +09:00
syuilo
dec7d537dc wip 2018-06-14 20:23:50 +09:00
syuilo
11e95ea092 wip 2018-06-14 18:57:54 +09:00
syuilo
c5e9b69eb3 wip 2018-06-14 18:53:02 +09:00
syuilo
120c11b181 wip 2018-06-14 16:48:49 +09:00
syuilo
a1ae832129 wip 2018-06-14 14:52:37 +09:00
syuilo
3a4833818f wip 2018-06-14 09:51:55 +09:00
syuilo
8814fc9c9c wip 2018-06-14 07:22:50 +09:00
syuilo
e6e02ece89 wip 2018-06-14 06:29:01 +09:00
syuilo
9059c149dd 2.38.3 2018-06-13 05:40:27 +09:00
syuilo
7d8e70b2ac Fix bug 2018-06-13 05:40:12 +09:00
syuilo
89105f5641 2.38.2 2018-06-13 05:25:27 +09:00
syuilo
1813d17b4c Fix bug 2018-06-13 05:24:44 +09:00
syuilo
ce27b36fd0 Fix bug 2018-06-13 05:21:55 +09:00
syuilo
e635a87628 2.38.1 2018-06-13 05:16:53 +09:00
syuilo
80c52433cc Fix bug 2018-06-13 05:15:26 +09:00
syuilo
1472f0b141 Fix #1712 2018-06-13 05:11:55 +09:00
syuilo
4d914f5c0a 2.38.0 2018-06-12 19:07:36 +09:00
syuilo
0318f7344f Fix bug 2018-06-12 19:05:40 +09:00
syuilo
413fbb3d0c モバイルでもハッシュタグを検索できるように 2018-06-12 19:03:57 +09:00
syuilo
8bc47baf4f #1710 2018-06-12 18:54:36 +09:00
syuilo
e3f6d42a47 Fix bug 2018-06-12 11:38:44 +09:00
syuilo
8230935fd3 🎨 2018-06-12 11:27:35 +09:00
syuilo
f968d05ea0 2.37.7 2018-06-12 09:10:52 +09:00
syuilo
d6e5dc2167 Fix bugs 2018-06-12 09:10:34 +09:00
syuilo
460147fea2 2.37.6 2018-06-12 08:59:36 +09:00
syuilo
cea44834bb Improve usability 2018-06-12 08:58:50 +09:00
syuilo
1af50fd7b8 冗長なハッシュタグの表示を無くした 2018-06-12 08:43:48 +09:00
syuilo
b18013025f 🎨 2018-06-12 08:09:27 +09:00
syuilo
399eb60809 2.37.5 2018-06-12 02:47:17 +09:00
syuilo
ed67e3506b ✌️ 2018-06-12 02:46:54 +09:00
syuilo
d8ff37fc45 ✌️ 2018-06-12 02:28:28 +09:00
syuilo
2fcc3bb1ea 2.37.4 2018-06-12 02:19:00 +09:00
syuilo
2e680c3d1e Fix bug 2018-06-12 02:18:29 +09:00
syuilo
af0a0ef41b Merge branch 'master' of https://github.com/syuilo/misskey 2018-06-12 02:03:26 +09:00
syuilo
bbfccb0bbf 🎨 2018-06-12 02:03:18 +09:00
syuilo
c89eb5d69f Merge pull request #1705 from syuilo/l10n_master
New Crowdin translations
2018-06-12 02:03:06 +09:00
syuilo
ebde84214e Improve hashtag trend detection 2018-06-12 02:00:05 +09:00
syuilo
03fbae7b6d 変数調整 2018-06-12 01:51:51 +09:00
syuilo
f90e9596d4 Fix bug 2018-06-12 01:48:29 +09:00
syuilo
944f9524e2 Fix bug 2018-06-12 01:45:58 +09:00
syuilo
c61050244e 変数調整 2018-06-12 01:43:56 +09:00
syuilo
90337adbbc Improve hashtag trend detection 2018-06-12 01:41:17 +09:00
syuilo
7b67e41c5b New translations ja.yml (Polish) 2018-06-11 19:22:16 +09:00
syuilo
91db24fcfc 2.37.3 2018-06-11 14:16:46 +09:00
syuilo
bb53db905f ✌️ 2018-06-11 14:16:21 +09:00
syuilo
0e9a1efe46 Merge pull request #1704 from syuilo/l10n_master
New Crowdin translations
2018-06-11 14:11:33 +09:00
syuilo
289cd3e200 New translations ja.yml (English) 2018-06-11 14:10:47 +09:00
syuilo
e0f847e539 ✌️ 2018-06-11 14:06:23 +09:00
syuilo
c2842b486e New translations ja.yml (Portuguese) 2018-06-11 13:51:15 +09:00
syuilo
7235ade42f New translations ja.yml (Korean) 2018-06-11 13:51:13 +09:00
syuilo
850be2df1d New translations ja.yml (Polish) 2018-06-11 13:51:11 +09:00
syuilo
d504501440 New translations ja.yml (Chinese Simplified) 2018-06-11 13:51:09 +09:00
syuilo
208392f12c New translations ja.yml (Italian) 2018-06-11 13:51:07 +09:00
syuilo
0fe036c640 New translations ja.yml (Russian) 2018-06-11 13:51:05 +09:00
syuilo
a40c41f0b0 New translations ja.yml (English) 2018-06-11 13:51:03 +09:00
syuilo
4affa5b710 New translations ja.yml (Spanish) 2018-06-11 13:51:01 +09:00
syuilo
4eb574d991 New translations ja.yml (German) 2018-06-11 13:50:59 +09:00
syuilo
2c1577ea24 New translations ja.yml (French) 2018-06-11 13:50:56 +09:00
syuilo
b87e7e50b6 Clean up 2018-06-11 13:49:53 +09:00
syuilo
36215d50bd 2.37.2 2018-06-11 13:48:07 +09:00
syuilo
5ff1245d0c Merge pull request #1703 from syuilo/l10n_master
New Crowdin translations
2018-06-11 13:47:42 +09:00
syuilo
ebd189fb27 🍕 2018-06-11 13:46:23 +09:00
syuilo
6f724827bd ✌️ 2018-06-11 13:45:32 +09:00
syuilo
b6a0982012 New translations ja.yml (English) 2018-06-11 13:00:50 +09:00
syuilo
c3e375e8a5 ✌️ 2018-06-11 12:52:47 +09:00
syuilo
302409fd83 New translations ja.yml (Portuguese) 2018-06-11 11:51:04 +09:00
syuilo
a2046461c1 New translations ja.yml (Korean) 2018-06-11 11:51:03 +09:00
syuilo
6660c34120 New translations ja.yml (Polish) 2018-06-11 11:51:01 +09:00
syuilo
b88ccf0ddd New translations ja.yml (Chinese Simplified) 2018-06-11 11:50:58 +09:00
syuilo
b898bbf94c New translations ja.yml (Italian) 2018-06-11 11:50:57 +09:00
syuilo
787e89eb95 New translations ja.yml (Russian) 2018-06-11 11:50:55 +09:00
syuilo
1022c2c438 New translations ja.yml (English) 2018-06-11 11:50:53 +09:00
syuilo
ba21c62ed4 New translations ja.yml (Spanish) 2018-06-11 11:50:51 +09:00
syuilo
bfe66c919b New translations ja.yml (German) 2018-06-11 11:50:49 +09:00
syuilo
3dacf7f661 New translations ja.yml (French) 2018-06-11 11:50:47 +09:00
syuilo
c0a3ae2612 2.37.1 2018-06-11 11:45:27 +09:00
syuilo
da612ef789 ✌️ 2018-06-11 11:45:10 +09:00
syuilo
df9cb7cf6e 2.37.0 2018-06-11 11:44:26 +09:00
syuilo
9c1a26110e Merge pull request #1697 from syuilo/l10n_master
New Crowdin translations
2018-06-11 11:43:58 +09:00
syuilo
0883d18a6c New translations ja.yml (English) 2018-06-11 11:41:56 +09:00
syuilo
c7246c61a5 New translations ja.yml (Portuguese) 2018-06-11 11:31:01 +09:00
syuilo
c5a1431fc0 New translations ja.yml (Korean) 2018-06-11 11:30:59 +09:00
syuilo
f0118a0dff New translations ja.yml (Polish) 2018-06-11 11:30:57 +09:00
syuilo
cffe96e46f New translations ja.yml (Chinese Simplified) 2018-06-11 11:30:55 +09:00
syuilo
a9256578f0 New translations ja.yml (Italian) 2018-06-11 11:30:53 +09:00
syuilo
05ed202904 New translations ja.yml (Russian) 2018-06-11 11:30:51 +09:00
syuilo
963b63389a New translations ja.yml (English) 2018-06-11 11:30:50 +09:00
syuilo
e04706dc74 New translations ja.yml (Spanish) 2018-06-11 11:30:47 +09:00
syuilo
04d4ce5ce1 New translations ja.yml (German) 2018-06-11 11:30:46 +09:00
syuilo
24cf3730fa New translations ja.yml (French) 2018-06-11 11:30:44 +09:00
syuilo
0700be86e2 Merge pull request #1702 from syuilo/hashtags-stats
Hashtags stats
2018-06-11 11:27:55 +09:00
syuilo
7cca509eb3 ✌️ 2018-06-11 11:27:21 +09:00
syuilo
7d7193cb63 ✌️ 2018-06-11 11:24:29 +09:00
syuilo
1cf10d05ff Merge pull request #1698 from syuilo/cleanup-dependencies
🆙 move some packages to devDependencies that non required by server
2018-06-11 09:40:04 +09:00
syuilo
2ec25a7729 wip 2018-06-11 09:11:32 +09:00
syuilo
2a9065a61e New translations ja.yml (French) 2018-06-11 08:20:56 +09:00
otofune
7518e30dcf 🆙 move some packages to devDependencies that non required by server
presumed by:
- move-to-devdependencies.fish
```fish
set targets (ls src | grep -v client | xargs -I'%' echo "src/%")
alias from_import="git grep 'import ' $targets | grep -v 'from \'\.' | grep -v 'from \"\.' | cut -d: -f2 | cut -d\; -f1 | rev | cut -d' ' -f1 | rev | cut -d\' -f2 | sort | uniq | grep -v '^readline\$' | grep -v '^zlib\$' | grep -v '^os\$' | grep -v '^http\$' | grep -v '^fs\$' | grep -v '^events\$' | grep -v '^crypto\$' | grep -v '^child_process\$' | grep -v '^cluster\$'`"
alias from_require="git grep 'require(' $targets | grep -v '(\'\.' | cut -d= -f2 | grep -v '__dirname' | grep require | cut -d' ' -f2 | cut -d')' -f1 | cut -d'(' -f2 | cut -d'\'' -f2 | sort | uniq | grep -v '^readline\$' | grep -v '^zlib\$' | grep -v '^os\$' | grep -v '^http\$' | grep -v '^fs\$' | grep -v '^events\$' | grep -v '^crypto\$' | grep -v '^child_process\$' | grep -v '^cluster\$'"
from_import | xargs npm uninstall --save-dev
from_require | xargs npm uninstall --save-dev
from_import | xargs npm install --save
from_require | xargs npm install --save
git show HEAD:require | node revert-pinning-dependencies.js
```
- revert-pinning-dependencies.js
```js
const readFromStdin = () => new Promise((resolve, reject) => {
  const chunks = []

  process.stdin.setEncoding('utf8')

  process.stdin.on('readable', () => {
    const chunk = process.stdin.read()
    if (chunk == null) return
    chunks.push(chunk)
  })

  process.stdin.on('end', () => {
    return resolve(chunks.join('\n'))
  })
})

async function main () {
  const fs = require('fs')

  const raw = await readFromStdin()
  const head = JSON.parse(raw)
  const now = JSON.parse(fs.readFileSync('package.json'))

  Object.keys(now.dependencies).forEach(key => {
    now.dependencies[key] = head.dependencies[key]
  })

  fs.writeFileSync('package.json', JSON.stringify(now,null,'\t'))
}

main().catch(console.error)
```
2018-06-11 08:08:52 +09:00
syuilo
dc3c80e3ce wip 2018-06-11 06:48:25 +09:00
syuilo
a25f61f6be New translations ja.yml (Polish) 2018-06-11 05:41:06 +09:00
syuilo
e70fb71a04 Update example.yml 2018-06-11 02:18:00 +09:00
syuilo
f499630c2b 2.36.1 2018-06-11 01:28:45 +09:00
syuilo
43319a8588 Merge pull request #1694 from syuilo/l10n_master
New Crowdin translations
2018-06-11 01:21:52 +09:00
syuilo
d62b943c5d New translations ja.yml (English) 2018-06-11 01:21:03 +09:00
syuilo
8baddf2ea3 Fix #1695 2018-06-11 01:14:29 +09:00
syuilo
600482660b タグは最大100文字までにした 2018-06-11 01:12:37 +09:00
syuilo
72ab5c143e Revert "✌️"
This reverts commit 96ab0e7b4c.
2018-06-11 01:07:34 +09:00
syuilo
96ab0e7b4c ✌️ 2018-06-11 00:27:16 +09:00
syuilo
b60903e2b4 🍕 2018-06-11 00:24:03 +09:00
syuilo
b4f4d3f267 New translations ja.yml (Portuguese) 2018-06-10 12:51:00 +09:00
syuilo
6e017c86e8 New translations ja.yml (Korean) 2018-06-10 12:50:58 +09:00
syuilo
afcfc2dca5 New translations ja.yml (Polish) 2018-06-10 12:50:57 +09:00
syuilo
59e22a12a9 New translations ja.yml (Chinese Simplified) 2018-06-10 12:50:55 +09:00
syuilo
b740ac3e01 New translations ja.yml (Italian) 2018-06-10 12:50:53 +09:00
syuilo
9719f0df03 New translations ja.yml (Russian) 2018-06-10 12:50:51 +09:00
syuilo
d4be599538 New translations ja.yml (English) 2018-06-10 12:50:49 +09:00
syuilo
f88195c90a New translations ja.yml (Spanish) 2018-06-10 12:50:47 +09:00
syuilo
3b33f7e752 New translations ja.yml (German) 2018-06-10 12:50:46 +09:00
syuilo
67a37294f7 New translations ja.yml (French) 2018-06-10 12:50:43 +09:00
syuilo
fd88955696 ✌️ 2018-06-10 12:36:48 +09:00
syuilo
9d248dbb5a 🎨 2018-06-10 12:29:19 +09:00
syuilo
20ec4104c6 2.36.0 2018-06-10 12:22:48 +09:00
syuilo
6c232d116d Merge pull request #1692 from syuilo/l10n_master
New Crowdin translations
2018-06-10 12:22:28 +09:00
syuilo
2ef78bcd40 🍕 2018-06-10 12:21:44 +09:00
syuilo
94ce658ab9 ハッシュタグ検索を実装 2018-06-10 12:19:19 +09:00
syuilo
d8cf4cd341 New translations ja.yml (Polish) 2018-06-10 10:30:48 +09:00
syuilo
0360337df9 2.35.3 2018-06-10 08:42:29 +09:00
syuilo
119d38ea08 Fix bug 2018-06-10 08:41:57 +09:00
syuilo
bee77afb7f Fix bug 2018-06-10 08:34:46 +09:00
syuilo
16d4b16872 Revert "✌️"
This reverts commit 951b2346ab.
2018-06-10 08:21:48 +09:00
syuilo
951b2346ab ✌️ 2018-06-10 08:15:05 +09:00
syuilo
b29ff0e94b ✌️ 2018-06-10 08:03:02 +09:00
syuilo
c8dd8341ca 2.35.2 2018-06-10 03:58:12 +09:00
syuilo
8bcf44bc16 ✌️ 2018-06-10 03:55:51 +09:00
syuilo
50b37a8420 oops 2018-06-10 03:48:38 +09:00
syuilo
22df795733 Fix bug 2018-06-10 03:47:09 +09:00
syuilo
7e3bf06db1 2.35.1 2018-06-10 03:31:42 +09:00
syuilo
6630ca595c 🎨 2018-06-10 03:31:13 +09:00
syuilo
5d01e19ce7 Fix bug 2018-06-10 03:27:10 +09:00
syuilo
56df89f8dd 2.35.0 2018-06-10 01:22:44 +09:00
syuilo
13de984ce3 Merge pull request #1688 from syuilo/l10n_master
New Crowdin translations
2018-06-10 01:21:55 +09:00
syuilo
15fc0e30d7 New translations ja.yml (English) 2018-06-10 01:21:19 +09:00
syuilo
4289c11185 New translations ja.yml (German) 2018-06-10 01:21:17 +09:00
syuilo
a3f564e702 New translations ja.yml (Portuguese) 2018-06-10 01:11:33 +09:00
syuilo
f6734a0c98 New translations ja.yml (Korean) 2018-06-10 01:11:32 +09:00
syuilo
72fb416239 New translations ja.yml (Polish) 2018-06-10 01:11:30 +09:00
syuilo
833f5b09d2 New translations ja.yml (Chinese Simplified) 2018-06-10 01:11:28 +09:00
syuilo
b21b21f30a New translations ja.yml (Italian) 2018-06-10 01:11:26 +09:00
syuilo
2f77a3f6d2 New translations ja.yml (Russian) 2018-06-10 01:11:25 +09:00
syuilo
0bda655452 New translations ja.yml (English) 2018-06-10 01:11:23 +09:00
syuilo
4f80bb7031 New translations ja.yml (Spanish) 2018-06-10 01:11:21 +09:00
syuilo
fbe7b3cc9b New translations ja.yml (German) 2018-06-10 01:11:18 +09:00
syuilo
8402f0abd7 New translations ja.yml (French) 2018-06-10 01:11:16 +09:00
syuilo
149b2ee5a7 Update sentences 2018-06-10 01:04:31 +09:00
syuilo
f9d5af0600 MissketDeck: Implement media view tl 2018-06-10 01:01:28 +09:00
syuilo
72c4ccaee8 Clean up dependencies 2018-06-10 00:41:57 +09:00
syuilo
92999dcaf2 Update gitignore 2018-06-10 00:39:30 +09:00
syuilo
5bbd318518 Update message 2018-06-09 23:52:11 +09:00
syuilo
8807894890 Fix bug 2018-06-09 22:25:15 +09:00
syuilo
63b7820717 New translations ja.yml (German) 2018-06-09 20:41:00 +09:00
syuilo
9e7e2d6977 New translations ja.yml (German) 2018-06-09 20:31:00 +09:00
syuilo
89e4c280ae New translations ja.yml (German) 2018-06-09 20:20:56 +09:00
syuilo
b6c9f29be4 New translations ja.yml (German) 2018-06-09 20:11:27 +09:00
syuilo
74cbbc84ed New translations ja.yml (English) 2018-06-09 20:00:53 +09:00
syuilo
ead4197670 New translations ja.yml (German) 2018-06-09 20:00:51 +09:00
syuilo
4fc69ccdc8 New translations ja.yml (German) 2018-06-09 19:51:04 +09:00
syuilo
f556cb44b9 New translations ja.yml (German) 2018-06-09 19:40:57 +09:00
syuilo
45b540d375 New translations ja.yml (Polish) 2018-06-09 12:00:47 +09:00
syuilo
af2d36a3c9 2.34.3 2018-06-09 11:41:22 +09:00
syuilo
42a4f92cfa Fix #1125 2018-06-09 11:40:42 +09:00
syuilo
ccb9ed3489 🎨 2018-06-09 11:29:50 +09:00
syuilo
773b2aa3d1 2.34.2 2018-06-09 10:16:29 +09:00
syuilo
30d5b8d65b 🎨 2018-06-09 10:15:45 +09:00
syuilo
763676a18c ✌️ 2018-06-09 10:12:03 +09:00
syuilo
e166ad6780 Better init screen 2018-06-09 10:06:27 +09:00
syuilo
034c96d070 Merge branch 'master' of https://github.com/syuilo/misskey 2018-06-09 08:38:33 +09:00
syuilo
f34f8d304c Improve performance 2018-06-09 08:38:30 +09:00
syuilo
944000c05c Update README.md 2018-06-09 06:52:33 +09:00
syuilo
e2503cdb47 New translations ja.yml (English) 2018-06-09 06:31:45 +09:00
syuilo
52db63bca2 2.34.1 2018-06-09 06:28:22 +09:00
syuilo
55dfd9e2a1 Merge pull request #1687 from syuilo/l10n_master
New Crowdin translations
2018-06-09 06:27:57 +09:00
syuilo
d193cbf2b7 ✌️ 2018-06-09 06:27:12 +09:00
syuilo
bdec56a543 ✌️ 2018-06-09 06:25:41 +09:00
syuilo
e0a6d9740c ✌️ 2018-06-09 06:21:13 +09:00
syuilo
0ce9c057e1 Fix chart rendering 2018-06-09 06:04:41 +09:00
syuilo
12a2fdbc20 New translations ja.yml (Portuguese) 2018-06-09 04:21:28 +09:00
syuilo
57c294bc89 New translations ja.yml (Korean) 2018-06-09 04:21:26 +09:00
syuilo
9758757805 New translations ja.yml (Polish) 2018-06-09 04:21:25 +09:00
syuilo
f9350fa35f New translations ja.yml (Chinese Simplified) 2018-06-09 04:21:22 +09:00
syuilo
e120da4ecd New translations ja.yml (Italian) 2018-06-09 04:21:20 +09:00
syuilo
328a10b70c New translations ja.yml (Russian) 2018-06-09 04:21:18 +09:00
syuilo
1ed97c8deb New translations ja.yml (English) 2018-06-09 04:21:17 +09:00
syuilo
91b970e2aa New translations ja.yml (Spanish) 2018-06-09 04:21:15 +09:00
syuilo
99af1bb479 New translations ja.yml (German) 2018-06-09 04:21:13 +09:00
syuilo
11ddcbdee3 New translations ja.yml (French) 2018-06-09 04:21:11 +09:00
syuilo
6e8a1086d8 2.34.0 2018-06-09 04:15:18 +09:00
syuilo
c78945436e #1686 2018-06-09 04:14:26 +09:00
syuilo
6eff8fde74 サーバーの統計情報をメモリに記憶するようにするなど 2018-06-09 01:45:25 +09:00
syuilo
726d5a177e Merge pull request #1685 from 2vg/patch-1
fix: when text is null, bug can pass validation.
2018-06-08 22:04:22 +09:00
momf
33495b5cb3 fix: "or" operator. 2018-06-08 22:04:07 +09:00
syuilo
fe159a13a9 2.33.2 2018-06-08 22:03:24 +09:00
syuilo
22a1dc0566 Better log 2018-06-08 22:03:14 +09:00
momf
02e6b732e9 fix: when text is null, bug can pass validation.
fixed. (maybe?)
2018-06-08 22:00:18 +09:00
syuilo
cc6fa135ac 2.33.1 2018-06-08 21:50:41 +09:00
syuilo
5747732156 Fix 2018-06-08 21:50:31 +09:00
syuilo
581d1617d8 2.33.0 2018-06-08 21:39:24 +09:00
syuilo
6152fd20bf Improve deck 2018-06-08 21:37:20 +09:00
syuilo
19300ca65c Add new cli tool 2018-06-08 21:22:13 +09:00
syuilo
2f3d744e19 🎨 2018-06-08 21:17:48 +09:00
syuilo
724e812972 Refactor 2018-06-08 20:57:02 +09:00
syuilo
9a6246fd4e New: Zen mode 2018-06-08 20:34:44 +09:00
syuilo
34f44de59c Update README.md 2018-06-08 13:14:30 +09:00
syuilo
16e446c121 2.32.0 2018-06-08 11:47:33 +09:00
syuilo
8f232a9da9 Merge branch 'master' of https://github.com/syuilo/misskey 2018-06-08 11:46:48 +09:00
syuilo
ebeb7f8578 ✌️ 2018-06-08 11:46:45 +09:00
syuilo
f790673068 Merge pull request #1684 from syuilo/l10n_master
New Crowdin translations
2018-06-08 11:17:44 +09:00
syuilo
335ab5ab54 Merge branch 'master' of https://github.com/syuilo/misskey 2018-06-08 11:17:30 +09:00
syuilo
00e0d6ce2c Improve usability 2018-06-08 11:17:22 +09:00
syuilo
414fb6d303 New translations ja.yml (French) 2018-06-08 10:41:25 +09:00
syuilo
9c35a12211 New translations ja.yml (French) 2018-06-08 10:12:39 +09:00
syuilo
bb4fe5174f Update README.md 2018-06-08 09:08:09 +09:00
syuilo
3ffd6ff5a2 2.31.0 2018-06-08 08:39:04 +09:00
syuilo
b05feb5bf7 MisskeyDeck: ドラッグでカラムを入れ替えられるように 2018-06-08 08:38:32 +09:00
syuilo
fa171f237d 2.30.2 2018-06-08 08:06:19 +09:00
syuilo
f2ccb684eb 🎨 2018-06-08 08:05:25 +09:00
syuilo
ffea6522ac Merge pull request #1683 from syuilo/l10n_master
New Crowdin translations
2018-06-08 07:44:17 +09:00
syuilo
3d40a7df00 ✌️ 2018-06-08 07:43:12 +09:00
syuilo
638c41476b New translations ja.yml (German) 2018-06-08 07:40:48 +09:00
syuilo
c6d3088374 Merge pull request #1682 from syuilo/l10n_master
New Crowdin translations
2018-06-08 07:26:58 +09:00
syuilo
0f93be9dd4 New translations ja.yml (German) 2018-06-08 07:01:06 +09:00
syuilo
f59982c9c5 New translations ja.yml (German) 2018-06-08 06:51:25 +09:00
syuilo
dff67a5e54 New translations ja.yml (German) 2018-06-08 06:41:05 +09:00
syuilo
6adcc3b2ed New translations ja.yml (German) 2018-06-08 06:31:09 +09:00
syuilo
877ed3663c New translations ja.yml (German) 2018-06-08 06:21:24 +09:00
syuilo
6000a82917 New translations ja.yml (German) 2018-06-08 06:11:02 +09:00
syuilo
6805f9b3e0 New translations ja.yml (German) 2018-06-08 06:01:10 +09:00
syuilo
1366c785f9 Update README.md 2018-06-08 05:54:42 +09:00
syuilo
70540b4500 New translations ja.yml (German) 2018-06-08 05:51:01 +09:00
syuilo
0967f23b6e 2.30.1 2018-06-08 05:49:19 +09:00
syuilo
1f7d66169c Merge pull request #1681 from syuilo/l10n_master
New Crowdin translations
2018-06-08 05:48:51 +09:00
syuilo
af501f5eeb Fix bug 2018-06-08 05:48:27 +09:00
syuilo
60be60c923 New translations ja.yml (German) 2018-06-08 05:41:56 +09:00
syuilo
48746101e0 New translations ja.yml (Polish) 2018-06-08 05:20:55 +09:00
syuilo
af9c5c6ab7 typo 2018-06-08 05:07:19 +09:00
syuilo
602284d38c 2.30.0 2018-06-08 05:04:56 +09:00
syuilo
26898142c2 Merge pull request #1680 from syuilo/l10n_master
New Crowdin translations
2018-06-08 05:04:32 +09:00
syuilo
b0a8d7abe9 ✌️ 2018-06-08 05:04:21 +09:00
syuilo
dc2b266b75 New translations ja.yml (English) 2018-06-08 04:52:14 +09:00
syuilo
07bbd9506a 🎨 2018-06-08 04:46:31 +09:00
syuilo
14bb218287 New translations ja.yml (English) 2018-06-08 04:41:42 +09:00
syuilo
29f238c929 New translations ja.yml (Portuguese) 2018-06-08 04:39:44 +09:00
syuilo
a39a1d4fa5 New translations ja.yml (Korean) 2018-06-08 04:39:41 +09:00
syuilo
15117c63f5 New translations ja.yml (Polish) 2018-06-08 04:39:39 +09:00
syuilo
507ffb6fc6 New translations ja.yml (Chinese Simplified) 2018-06-08 04:39:38 +09:00
syuilo
6b2e0164cf New translations ja.yml (Italian) 2018-06-08 04:39:36 +09:00
syuilo
02e06eb1de New translations ja.yml (Russian) 2018-06-08 04:39:33 +09:00
syuilo
1b50f78733 New translations ja.yml (English) 2018-06-08 04:39:31 +09:00
syuilo
ead629407c New translations ja.yml (Spanish) 2018-06-08 04:39:29 +09:00
syuilo
0abbc9e7dd New translations ja.yml (German) 2018-06-08 04:39:26 +09:00
syuilo
37681e859e New translations ja.yml (French) 2018-06-08 04:39:24 +09:00
syuilo
caabdc68f3 MisskeyDeck: スタックしたカラムを上下移動できるように 2018-06-08 04:34:15 +09:00
syuilo
9e97eaf24d New translations ja.yml (English) 2018-06-08 04:31:03 +09:00
syuilo
4cd06a789b New translations ja.yml (Portuguese) 2018-06-08 04:22:10 +09:00
syuilo
a3ffd968de New translations ja.yml (Korean) 2018-06-08 04:22:08 +09:00
syuilo
0cf40563aa New translations ja.yml (Polish) 2018-06-08 04:22:06 +09:00
syuilo
3e7e7f864b New translations ja.yml (Chinese Simplified) 2018-06-08 04:22:03 +09:00
syuilo
6ae415e36a New translations ja.yml (Italian) 2018-06-08 04:22:01 +09:00
syuilo
6cefa3ae26 New translations ja.yml (Russian) 2018-06-08 04:21:59 +09:00
syuilo
70de3af3ea New translations ja.yml (English) 2018-06-08 04:21:57 +09:00
syuilo
66ed814527 New translations ja.yml (Spanish) 2018-06-08 04:21:55 +09:00
syuilo
e12cc3b7a8 New translations ja.yml (German) 2018-06-08 04:21:53 +09:00
syuilo
93ea19d7ad New translations ja.yml (French) 2018-06-08 04:21:51 +09:00
syuilo
79d592b431 MisskeyDeck: カラムをスタックできるように 2018-06-08 04:21:06 +09:00
syuilo
c9c3a0be82 New translations ja.yml (Polish) 2018-06-08 03:55:30 +09:00
syuilo
f04be199dd New translations ja.yml (French) 2018-06-07 22:21:47 +09:00
syuilo
f36cb1cc66 New translations ja.yml (French) 2018-06-07 22:12:09 +09:00
syuilo
a5597e3df9 New translations ja.yml (French) 2018-06-07 21:26:16 +09:00
syuilo
7f4c28053e New translations ja.yml (French) 2018-06-07 21:12:53 +09:00
syuilo
ea24043b22 New translations ja.yml (English) 2018-06-07 08:50:51 +09:00
syuilo
44ef60c8a2 2.29.1 2018-06-07 08:48:22 +09:00
syuilo
bd68ff2cf3 Merge pull request #1679 from syuilo/l10n_master
New Crowdin translations
2018-06-07 08:47:37 +09:00
syuilo
0e8a592b26 ✌️ 2018-06-07 08:41:58 +09:00
syuilo
d3b51bf94a ✌️ 2018-06-07 08:29:46 +09:00
syuilo
cc137ee1cc New translations ja.yml (Portuguese) 2018-06-07 06:21:37 +09:00
syuilo
c088482cef New translations ja.yml (Korean) 2018-06-07 06:21:35 +09:00
syuilo
70e3febe0a New translations ja.yml (Polish) 2018-06-07 06:21:33 +09:00
syuilo
f500cce293 New translations ja.yml (Chinese Simplified) 2018-06-07 06:21:31 +09:00
syuilo
c6b836b7be New translations ja.yml (Italian) 2018-06-07 06:21:29 +09:00
syuilo
15485da1bb New translations ja.yml (Russian) 2018-06-07 06:21:27 +09:00
syuilo
7195f55a44 New translations ja.yml (English) 2018-06-07 06:21:25 +09:00
syuilo
176f8803eb New translations ja.yml (Spanish) 2018-06-07 06:21:24 +09:00
syuilo
5a3a925a3c New translations ja.yml (German) 2018-06-07 06:21:21 +09:00
syuilo
29bfb9d19b New translations ja.yml (French) 2018-06-07 06:21:19 +09:00
syuilo
86b0dfdd33 2.29.0 2018-06-07 06:16:11 +09:00
syuilo
ab04f2fce0 ✌️ 2018-06-07 06:15:57 +09:00
syuilo
be9f836b21 やった 2018-06-07 06:13:57 +09:00
syuilo
818bc96aab 2.28.0 2018-06-07 05:15:05 +09:00
syuilo
14d12c21f2 nanka iroiro 2018-06-07 05:14:37 +09:00
syuilo
aa5250a37c New translations ja.yml (Polish) 2018-06-07 04:51:24 +09:00
syuilo
2053a041e5 Fix 2018-06-07 04:33:39 +09:00
syuilo
0534a0a41e ✌️ 2018-06-07 04:31:49 +09:00
syuilo
d2f9a99beb New translations ja.yml (French) 2018-06-07 04:01:46 +09:00
syuilo
9625047dc3 New translations ja.yml (French) 2018-06-07 03:51:34 +09:00
syuilo
d6b18ce536 New translations ja.yml (French) 2018-06-07 03:41:20 +09:00
syuilo
df00af1dfa New translations ja.yml (French) 2018-06-07 03:14:30 +09:00
syuilo
3570ec0430 New translations ja.yml (French) 2018-06-07 03:06:29 +09:00
syuilo
a111b014f8 New translations ja.yml (French) 2018-06-07 02:53:46 +09:00
syuilo
50eebe834a New translations ja.yml (French) 2018-06-07 02:41:46 +09:00
syuilo
f965e9f218 New translations ja.yml (French) 2018-06-07 02:34:06 +09:00
syuilo
0ac5fdab49 2.27.3 2018-06-07 02:07:00 +09:00
syuilo
39099909bf Fix firefox 2018-06-07 02:06:32 +09:00
syuilo
999ce8e366 Improve scroll performance 2018-06-07 01:52:03 +09:00
syuilo
8678e30cc8 2.27.2 2018-06-07 01:45:04 +09:00
syuilo
8a59e9d9c8 Merge pull request #1677 from syuilo/l10n_master
New Crowdin translations
2018-06-07 01:44:26 +09:00
syuilo
dddace9d6a New translations ja.yml (English) 2018-06-07 01:42:12 +09:00
syuilo
388cb7db3a ✌️ 2018-06-07 01:41:05 +09:00
syuilo
46b74b3e1c New translations ja.yml (Portuguese) 2018-06-07 01:22:17 +09:00
syuilo
d53e80c88a New translations ja.yml (Korean) 2018-06-07 01:22:14 +09:00
syuilo
d8a8f36676 New translations ja.yml (Polish) 2018-06-07 01:22:12 +09:00
syuilo
dafdbbf552 New translations ja.yml (Chinese Simplified) 2018-06-07 01:22:10 +09:00
syuilo
52bc52293b New translations ja.yml (Italian) 2018-06-07 01:22:08 +09:00
syuilo
0733aefb64 New translations ja.yml (Russian) 2018-06-07 01:22:06 +09:00
syuilo
aac6dec5da New translations ja.yml (English) 2018-06-07 01:22:03 +09:00
syuilo
d44c59ea3e New translations ja.yml (Spanish) 2018-06-07 01:22:01 +09:00
syuilo
9b3c3881c4 New translations ja.yml (German) 2018-06-07 01:21:59 +09:00
syuilo
cdd722dca0 New translations ja.yml (French) 2018-06-07 01:21:57 +09:00
syuilo
9ad7a80496 i18n 2018-06-07 01:17:29 +09:00
syuilo
b85597b15d Fix glitch 2018-06-07 01:00:38 +09:00
syuilo
ebb98d975b ✌️ 2018-06-07 00:53:31 +09:00
syuilo
c1b320710b 2.27.1 2018-06-06 19:37:15 +09:00
syuilo
1201794bef Revert "fix: validate post's text with Ctrl+Enter on PC."
This reverts commit fac6868305.
2018-06-06 19:34:25 +09:00
syuilo
dc58c9bd2f 2.27.0 2018-06-06 19:24:34 +09:00
syuilo
9787da7240 Merge branch 'master' of https://github.com/syuilo/misskey 2018-06-06 19:22:48 +09:00
syuilo
b0f989dbac Deckにウィジェットを置けるように 2018-06-06 19:22:45 +09:00
syuilo
a0ec6b8ea7 Merge pull request #1678 from 2vg/patch-2
fix: validate post's text with Ctrl+Enter on PC.
2018-06-06 09:50:17 +09:00
momf
fac6868305 fix: validate post's text with Ctrl+Enter on PC. 2018-06-06 09:46:33 +09:00
syuilo
ed8fa59639 Update README.md 2018-06-06 05:39:05 +09:00
syuilo
e8edda01a9 2.26.2 2018-06-06 05:29:45 +09:00
syuilo
380a369eca oops 2018-06-06 05:29:31 +09:00
syuilo
781fffee42 2.26.1 2018-06-06 05:18:46 +09:00
syuilo
69b5de3346 wip 2018-06-06 05:18:08 +09:00
syuilo
0d8c83f27c wip 2018-06-06 04:00:48 +09:00
syuilo
8ca58de2ba wip 2018-06-06 03:12:06 +09:00
syuilo
d8cd24fab0 wip 2018-06-06 03:03:56 +09:00
syuilo
f918081168 wip 2018-06-06 02:48:26 +09:00
syuilo
f88fb9bc1d wip 2018-06-06 01:54:36 +09:00
syuilo
062fbd7d27 wip 2018-06-06 01:54:24 +09:00
syuilo
6b6af008d0 New translations ja.yml (Portuguese) 2018-06-05 23:23:22 +09:00
syuilo
4d35def548 New translations ja.yml (Korean) 2018-06-05 23:23:20 +09:00
syuilo
b369d6bd5c New translations ja.yml (Polish) 2018-06-05 23:23:17 +09:00
syuilo
63dfe2726c New translations ja.yml (Chinese Simplified) 2018-06-05 23:23:15 +09:00
syuilo
1002d29cc2 New translations ja.yml (Italian) 2018-06-05 23:23:13 +09:00
syuilo
868240666a New translations ja.yml (Russian) 2018-06-05 23:23:11 +09:00
syuilo
02a88fdc9c New translations ja.yml (English) 2018-06-05 23:23:08 +09:00
syuilo
bc4adf7107 New translations ja.yml (Spanish) 2018-06-05 23:23:06 +09:00
syuilo
bd67785802 New translations ja.yml (German) 2018-06-05 23:23:03 +09:00
syuilo
68c90e8ebe New translations ja.yml (French) 2018-06-05 23:23:01 +09:00
syuilo
64519a9fd4 2.26.0 2018-06-05 23:22:37 +09:00
syuilo
d21da0211c Merge pull request #1676 from syuilo/deck
Deck (wip)
2018-06-05 23:21:53 +09:00
syuilo
2e919b788f wip 2018-06-05 23:19:04 +09:00
syuilo
2d2056f2bd Merge pull request #1675 from 2vg/patch-1
fix: validate post's text on mobile client.
2018-06-05 23:03:26 +09:00
momf
334dabc1de fix: validate post's text on mobile client. 2018-06-05 23:00:03 +09:00
syuilo
dfa2c951d6 wip 2018-06-05 22:54:03 +09:00
syuilo
e28d1c7569 wip 2018-06-05 21:44:02 +09:00
syuilo
9ce0f96de3 wip 2018-06-05 21:36:21 +09:00
syuilo
a408b19bbe Update README.md 2018-06-05 15:09:21 +09:00
syuilo
f9a17b8021 Merge pull request #1674 from syuilo/l10n_master
New Crowdin translations
2018-06-04 23:22:34 +09:00
syuilo
5eeb200913 New translations ja.yml (English) 2018-06-04 20:07:56 +09:00
syuilo
f87981eeee 2.25.2 2018-06-04 19:59:07 +09:00
syuilo
761ae807db Fix bug 2018-06-03 19:53:57 +09:00
syuilo
643a0e6b13 New translations ja.yml (Portuguese) 2018-06-03 19:41:36 +09:00
syuilo
e7e5f76e9e New translations ja.yml (Korean) 2018-06-03 19:41:34 +09:00
syuilo
247acd81a9 New translations ja.yml (Polish) 2018-06-03 19:41:32 +09:00
syuilo
a2457a6ac4 New translations ja.yml (Chinese Simplified) 2018-06-03 19:41:30 +09:00
syuilo
af7a320493 New translations ja.yml (Italian) 2018-06-03 19:41:28 +09:00
syuilo
4dd8b7e85d New translations ja.yml (Russian) 2018-06-03 19:41:26 +09:00
syuilo
3a4392af40 New translations ja.yml (English) 2018-06-03 19:41:23 +09:00
syuilo
44f70f0009 New translations ja.yml (Spanish) 2018-06-03 19:41:20 +09:00
syuilo
238c4cf181 New translations ja.yml (German) 2018-06-03 19:41:18 +09:00
syuilo
9171c49d85 New translations ja.yml (French) 2018-06-03 19:41:16 +09:00
syuilo
5e967e24ff ✌️ 2018-06-03 19:39:02 +09:00
syuilo
70ac07d60e 🎨 2018-06-03 07:34:34 +09:00
syuilo
81ee670dc2 New translations ja.yml (Polish) 2018-06-03 05:32:01 +09:00
syuilo
faf215685b New translations ja.yml (Polish) 2018-06-03 05:21:18 +09:00
syuilo
255c07d1ab 2.25.1 2018-06-03 04:51:58 +09:00
syuilo
83e9711274 New translations ja.yml (English) 2018-06-02 23:02:02 +09:00
syuilo
0aa9201770 2.25.0 2018-06-02 19:23:17 +09:00
syuilo
534e43f72d Fix bug 2018-06-02 19:19:58 +09:00
syuilo
8f50080647 Merge pull request #1673 from syuilo/l10n_master
New Crowdin translations
2018-06-02 17:05:18 +09:00
syuilo
cdc70875e5 New translations ja.yml (English) 2018-06-02 16:51:10 +09:00
syuilo
e6962d6fab New translations ja.yml (English) 2018-06-02 16:41:22 +09:00
syuilo
3703563939 New translations ja.yml (Portuguese) 2018-06-02 16:31:39 +09:00
syuilo
e81b145735 New translations ja.yml (Korean) 2018-06-02 16:31:37 +09:00
syuilo
7f4145ee56 New translations ja.yml (Polish) 2018-06-02 16:31:35 +09:00
syuilo
3967cf40b3 New translations ja.yml (Chinese Simplified) 2018-06-02 16:31:33 +09:00
syuilo
84b0d56c4c New translations ja.yml (Italian) 2018-06-02 16:31:32 +09:00
syuilo
e081d8d4ca New translations ja.yml (Russian) 2018-06-02 16:31:30 +09:00
syuilo
b6ad7149d8 New translations ja.yml (English) 2018-06-02 16:31:28 +09:00
syuilo
0f36f60cb4 New translations ja.yml (Spanish) 2018-06-02 16:31:26 +09:00
syuilo
1284eef9e2 New translations ja.yml (German) 2018-06-02 16:31:24 +09:00
syuilo
dec264ee6a New translations ja.yml (French) 2018-06-02 16:31:22 +09:00
syuilo
e25e1d88d6 Merge pull request #1671 from syuilo/locked-account
Locked account
2018-06-02 16:28:08 +09:00
syuilo
60a7f7f146 wip 2018-06-02 16:27:24 +09:00
syuilo
897f7a031d wip 2018-06-02 16:13:32 +09:00
syuilo
4feff8835c wip 2018-06-02 16:01:32 +09:00
syuilo
8dfd892b71 wip 2018-06-02 15:51:43 +09:00
syuilo
9e8cfd76c8 wip 2018-06-02 13:40:28 +09:00
syuilo
a6a4bb6599 wip 2018-06-02 13:36:29 +09:00
syuilo
5ca8a0d886 wip 2018-06-02 13:34:53 +09:00
syuilo
6840496791 wip 2018-06-02 13:14:54 +09:00
syuilo
0128831649 wip 2018-06-02 13:11:28 +09:00
syuilo
56fa24e401 wip 2018-06-02 12:58:56 +09:00
syuilo
e011870a60 Merge pull request #1672 from Angristan/patch-1
Update build docs
2018-06-02 03:54:10 +09:00
Angristan
8d78ee08c1 Cover multiple cases 2018-06-01 20:52:47 +02:00
Angristan
2752319e50 Update build docs
Fix #1474
2018-06-01 20:24:30 +02:00
syuilo
a26c19cbd2 wip 2018-06-02 00:51:20 +09:00
syuilo
f14571dc42 wip 2018-06-02 00:38:31 +09:00
syuilo
484d17f53f wip 2018-06-02 00:15:17 +09:00
syuilo
924119651a Merge branch 'master' into locked-account 2018-06-01 23:37:19 +09:00
syuilo
c6d49dacbc Merge pull request #1670 from syuilo/l10n_master
New Crowdin translations
2018-06-01 23:36:22 +09:00
syuilo
0be790fa31 wip 2018-06-01 21:55:27 +09:00
syuilo
b7f6eb8290 New translations ja.yml (English) 2018-06-01 16:29:25 +09:00
syuilo
f1bda0b2e1 New translations ja.yml (English) 2018-06-01 16:12:22 +09:00
syuilo
bae44b4708 wip 2018-06-01 01:12:02 +09:00
syuilo
35115607bc wip 2018-06-01 00:42:37 +09:00
syuilo
51255bb446 wip 2018-05-31 22:56:02 +09:00
syuilo
bd758a156e wip 2018-05-31 18:34:15 +09:00
syuilo
51929fb607 typo 2018-05-31 18:11:28 +09:00
syuilo
9599a31239 wip 2018-05-31 18:08:47 +09:00
syuilo
9fdb125960 Merge pull request #1668 from syuilo/l10n_master
New Crowdin translations
2018-05-31 17:38:49 +09:00
syuilo
534c0a6001 New translations ja.yml (English) 2018-05-31 17:31:23 +09:00
syuilo
58bfcfda91 New translations ja.yml (English) 2018-05-31 17:21:36 +09:00
syuilo
8d0802f05d New translations ja.yml (English) 2018-05-31 17:12:41 +09:00
syuilo
5cd8c5d229 New translations ja.yml (English) 2018-05-31 17:02:48 +09:00
syuilo
fa3c4436d9 New translations ja.yml (English) 2018-05-31 16:52:27 +09:00
syuilo
d32d95918c 🎨 2018-05-31 16:44:11 +09:00
syuilo
34899757d5 New translations ja.yml (English) 2018-05-31 16:41:32 +09:00
syuilo
111dbdcd7f Fix 2018-05-31 16:38:05 +09:00
syuilo
0c38509f1c New translations ja.yml (Polish) 2018-05-31 04:21:47 +09:00
syuilo
652aa1f69b New translations ja.yml (German) 2018-05-31 00:33:22 +09:00
syuilo
dc380c38da New translations ja.yml (German) 2018-05-31 00:23:33 +09:00
syuilo
8555e04f50 New translations ja.yml (German) 2018-05-31 00:13:36 +09:00
syuilo
c23bbf81f1 2.24.3 2018-05-30 23:08:26 +09:00
syuilo
7dd7de8ff6 Update endpoints.ts 2018-05-30 23:05:24 +09:00
syuilo
2ca8bafde3 Merge pull request #1664 from syuilo/l10n_master
New Crowdin translations
2018-05-30 22:08:38 +09:00
syuilo
79f6c3f1ca New translations ja.yml (Portuguese) 2018-05-30 21:23:17 +09:00
syuilo
fce0b315cf New translations ja.yml (Korean) 2018-05-30 21:23:14 +09:00
syuilo
56c7a8f2e4 New translations ja.yml (Polish) 2018-05-30 21:23:10 +09:00
syuilo
5ef2f157f2 New translations ja.yml (Chinese Simplified) 2018-05-30 21:23:08 +09:00
syuilo
738afbe475 New translations ja.yml (Italian) 2018-05-30 21:23:06 +09:00
syuilo
791a81a4c7 New translations ja.yml (Russian) 2018-05-30 21:23:03 +09:00
syuilo
aa82d7a2c9 New translations ja.yml (English) 2018-05-30 21:23:01 +09:00
syuilo
f57d2e54d2 New translations ja.yml (Spanish) 2018-05-30 21:22:58 +09:00
syuilo
fea1a2e51b New translations ja.yml (German) 2018-05-30 21:22:55 +09:00
syuilo
bda5347f1e New translations ja.yml (French) 2018-05-30 21:22:53 +09:00
syuilo
98d9c37922 Merge pull request #1665 from m4sk1n/patch-1
fix typo
2018-05-30 21:21:59 +09:00
syuilo
e3bde41a25 New translations ja.yml (Polish) 2018-05-30 21:14:46 +09:00
Marcin Mikołajczak
5fb2f7749d fix typo 2018-05-30 12:13:51 +00:00
syuilo
a56bdf2372 New translations ja.yml (Polish) 2018-05-30 21:05:48 +09:00
syuilo
9d991df32f New translations ja.yml (English) 2018-05-30 21:05:45 +09:00
syuilo
c4a3f89d1c New translations ja.yml (English) 2018-05-30 20:51:48 +09:00
syuilo
ea223bab51 Fix bug 2018-05-30 18:13:20 +09:00
syuilo
dd94392317 2.24.2 2018-05-30 05:02:56 +09:00
syuilo
baa2845916 Merge pull request #1663 from syuilo/l10n_master
New Crowdin translations
2018-05-30 05:02:17 +09:00
syuilo
97ae4ea13e New translations ja.yml (English) 2018-05-30 05:00:58 +09:00
syuilo
d1c5f0c70f New translations ja.yml (Portuguese) 2018-05-30 04:51:38 +09:00
syuilo
95bff3005f New translations ja.yml (Korean) 2018-05-30 04:51:36 +09:00
syuilo
c0b06496b1 New translations ja.yml (Polish) 2018-05-30 04:51:34 +09:00
syuilo
2105e1f259 New translations ja.yml (Chinese Simplified) 2018-05-30 04:51:32 +09:00
syuilo
e546414c2f New translations ja.yml (Italian) 2018-05-30 04:51:30 +09:00
syuilo
1f4660a930 New translations ja.yml (Russian) 2018-05-30 04:51:28 +09:00
syuilo
a2165c2e01 New translations ja.yml (English) 2018-05-30 04:51:26 +09:00
syuilo
1af920739f New translations ja.yml (Spanish) 2018-05-30 04:51:24 +09:00
syuilo
868e8228f0 New translations ja.yml (German) 2018-05-30 04:51:22 +09:00
syuilo
2bbc74560d New translations ja.yml (French) 2018-05-30 04:51:20 +09:00
syuilo
5d2caa456d 🎨 2018-05-30 04:46:50 +09:00
syuilo
9069a99a15 wip 2018-05-30 04:45:27 +09:00
syuilo
fa56a44d85 🎨 2018-05-30 04:07:23 +09:00
syuilo
248acaee75 2.24.1 2018-05-30 00:16:03 +09:00
syuilo
ef75f12abe Fix bug 2018-05-30 00:15:32 +09:00
syuilo
854814c226 2.24.0 2018-05-29 23:57:25 +09:00
syuilo
b6a322f447 Merge branch 'master' of https://github.com/syuilo/misskey 2018-05-29 23:56:52 +09:00
syuilo
161b9602f4 Fix bug 2018-05-29 23:56:44 +09:00
syuilo
62669bff07 Merge pull request #1662 from syuilo/l10n_master
New Crowdin translations
2018-05-29 23:55:19 +09:00
syuilo
02bd299714 New translations ja.yml (English) 2018-05-29 23:52:22 +09:00
syuilo
f71dabfbfa New translations ja.yml (Portuguese) 2018-05-29 23:45:17 +09:00
syuilo
8d31cedafc New translations ja.yml (Korean) 2018-05-29 23:45:11 +09:00
syuilo
a88d6c1c47 New translations ja.yml (Polish) 2018-05-29 23:45:09 +09:00
syuilo
d35a13fc0b New translations ja.yml (Chinese Simplified) 2018-05-29 23:45:05 +09:00
syuilo
8e4029c1cd New translations ja.yml (Italian) 2018-05-29 23:44:59 +09:00
syuilo
9a9f852540 New translations ja.yml (Russian) 2018-05-29 23:44:57 +09:00
syuilo
c66497a4de New translations ja.yml (English) 2018-05-29 23:44:55 +09:00
syuilo
1f9ecbf0be New translations ja.yml (Spanish) 2018-05-29 23:44:53 +09:00
syuilo
423a6f7013 New translations ja.yml (German) 2018-05-29 23:44:51 +09:00
syuilo
ef0ca38362 New translations ja.yml (French) 2018-05-29 23:44:48 +09:00
syuilo
ae9bfd69b0 Add analog clock widget 2018-05-29 23:13:39 +09:00
syuilo
3d231c3456 Fix 2018-05-29 22:56:05 +09:00
syuilo
95d0d0047a 時計をSVG化 2018-05-29 22:43:03 +09:00
syuilo
d05aee19f2 2.23.2 2018-05-29 21:46:30 +09:00
syuilo
125765faa6 Fix bug 2018-05-29 21:46:02 +09:00
syuilo
70c0b1d8c0 🎨 2018-05-29 19:13:49 +09:00
syuilo
72e8660ae3 🎨 2018-05-29 19:03:03 +09:00
syuilo
2127bf32c2 2.23.1 2018-05-29 17:11:48 +09:00
syuilo
2b9acc239e Fix bug 2018-05-29 17:10:59 +09:00
syuilo
47a6188097 2.23.0 2018-05-29 15:43:24 +09:00
syuilo
8abce1469a Merge pull request #1661 from syuilo/l10n_master
New Crowdin translations
2018-05-29 15:43:01 +09:00
syuilo
8a2bee2136 New translations ja.yml (Portuguese) 2018-05-29 15:42:20 +09:00
syuilo
e7a532f0cc New translations ja.yml (Korean) 2018-05-29 15:42:17 +09:00
syuilo
2cb1678577 New translations ja.yml (Polish) 2018-05-29 15:42:15 +09:00
syuilo
d249bc6575 New translations ja.yml (Chinese Simplified) 2018-05-29 15:42:13 +09:00
syuilo
e409b45873 New translations ja.yml (Italian) 2018-05-29 15:42:10 +09:00
syuilo
f2d26c1909 New translations ja.yml (Russian) 2018-05-29 15:42:08 +09:00
syuilo
898e3d7138 New translations ja.yml (English) 2018-05-29 15:42:06 +09:00
syuilo
78cc0f7b6f New translations ja.yml (Spanish) 2018-05-29 15:42:04 +09:00
syuilo
b14ca6a464 New translations ja.yml (German) 2018-05-29 15:42:02 +09:00
syuilo
4691c1259a New translations ja.yml (French) 2018-05-29 15:42:00 +09:00
syuilo
69f07cb015 Fix bug 2018-05-29 15:41:49 +09:00
syuilo
a426f4c7bd nanka iroiro 2018-05-29 15:38:48 +09:00
syuilo
3430a2d093 New translations ja.yml (English) 2018-05-29 15:31:19 +09:00
syuilo
4ecc8c799d 🎨 2018-05-29 15:21:03 +09:00
syuilo
fa02a58fc4 New translations ja.yml (Portuguese) 2018-05-29 14:51:25 +09:00
syuilo
2905d172b8 New translations ja.yml (Korean) 2018-05-29 14:51:23 +09:00
syuilo
5f6e5e4c8b New translations ja.yml (Polish) 2018-05-29 14:51:21 +09:00
syuilo
d68c2a0170 New translations ja.yml (Chinese Simplified) 2018-05-29 14:51:19 +09:00
syuilo
76c7ad5e24 New translations ja.yml (Italian) 2018-05-29 14:51:17 +09:00
syuilo
1cf65a0145 New translations ja.yml (Russian) 2018-05-29 14:51:16 +09:00
syuilo
0c8602f1d5 New translations ja.yml (English) 2018-05-29 14:51:14 +09:00
syuilo
2dc4990804 New translations ja.yml (Spanish) 2018-05-29 14:51:12 +09:00
syuilo
47ecd2e900 New translations ja.yml (German) 2018-05-29 14:51:10 +09:00
syuilo
01d8e9cf4e New translations ja.yml (French) 2018-05-29 14:51:08 +09:00
syuilo
da52f980c4 ✌️ 2018-05-29 14:42:29 +09:00
syuilo
366b7ef946 🎨 2018-05-29 14:22:15 +09:00
syuilo
0e7c0fd528 2.22.3 2018-05-29 13:22:29 +09:00
syuilo
fb28b238cf Add workaround for Safari bug 2018-05-29 13:21:38 +09:00
syuilo
b375bbc75c 2.22.2 2018-05-29 11:53:59 +09:00
syuilo
74ebd6e4a0 Merge branch 'master' of https://github.com/syuilo/misskey 2018-05-29 11:53:35 +09:00
syuilo
72f2b92d4f ✌️ 2018-05-29 11:53:28 +09:00
syuilo
178eeec041 Merge pull request #1660 from syuilo/l10n_master
New Crowdin translations
2018-05-29 11:53:03 +09:00
syuilo
7ff950b5e3 New translations ja.yml (English) 2018-05-29 11:50:50 +09:00
syuilo
11409b723e 🎨 2018-05-29 11:45:01 +09:00
syuilo
a59c8b4f57 New translations ja.yml (Portuguese) 2018-05-29 11:41:13 +09:00
syuilo
690e273257 New translations ja.yml (Korean) 2018-05-29 11:41:11 +09:00
syuilo
0133a1ba97 New translations ja.yml (Polish) 2018-05-29 11:41:09 +09:00
syuilo
809b0e67a6 New translations ja.yml (Chinese Simplified) 2018-05-29 11:41:08 +09:00
syuilo
a702271efd New translations ja.yml (Italian) 2018-05-29 11:41:06 +09:00
syuilo
ec4f8ddd3e New translations ja.yml (Russian) 2018-05-29 11:41:04 +09:00
syuilo
839f66c82f New translations ja.yml (English) 2018-05-29 11:41:02 +09:00
syuilo
9ae2775452 New translations ja.yml (Spanish) 2018-05-29 11:41:00 +09:00
syuilo
c9818358ee New translations ja.yml (German) 2018-05-29 11:40:58 +09:00
syuilo
6e3a88ffcb New translations ja.yml (French) 2018-05-29 11:40:56 +09:00
syuilo
4c54d68fad Darken 2018-05-29 11:38:24 +09:00
syuilo
c351ba7820 Fix 2018-05-29 11:36:45 +09:00
syuilo
3c2d72f611 Fix bug 2018-05-29 11:32:55 +09:00
syuilo
f557407589 Fix bug 2018-05-29 11:29:02 +09:00
syuilo
a0a4ce4dd9 Fix bug 2018-05-29 11:25:28 +09:00
229 changed files with 21815 additions and 3302 deletions

View File

@@ -1,3 +1,9 @@
# インスタンス名
name:
# インスタンスの紹介
description:
# サーバーのメンテナ情報
maintainer:
# メンテナの名前
@@ -55,3 +61,7 @@ twitter:
# インテグレーション用アプリのコンシューマーシークレット
consumer_secret:
# true にすると、リモートのファイルをキャッシュしなくなります(直リンクします)。
# ストレージ容量を節約することができますが、「リモートメディアを表示しない」設定をオンにしているユーザーは、リモートの画像などは見えなくなります。
preventCache: false

1
.gitattributes vendored
View File

@@ -1,3 +1,4 @@
*.svg -diff -text
*.psd -diff -text
*.ai -diff -text
yarn.lock -diff -text

2
.gitignore vendored
View File

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

1
.npmrc
View File

@@ -1 +1,2 @@
package-lock = false
save-exact=true

11
CHANGELOG.md Normal file
View File

@@ -0,0 +1,11 @@
ChangeLog
=========
3.0.0
-----
### Migration
起動する前に、`node cli/recount-stats`してください。
Please run `node cli/recount-stats` before launch.

View File

@@ -12,17 +12,21 @@
> Lead Maintainer: [syuilo][syuilo-link]
**[Misskey](https://misskey.xyz)** is a completely open source,
ultimately sophisticated new type of mini-blog based SNS.
ultimately sophisticated professional microblogging software.
<a href="https://www.patreon.com/syuilo"><img src="https://c5.patreon.com/external/logo/become_a_patron_button@2x.png" alt="Become a Patron!" width="160" /></a>
![](https://c10.patreonusercontent.com/3/e30%3D/patreon-posts/RsKWEDEKf8D_wYDQWAbex9CSb-1DnXW1nfqfLvuys5ROj2k0VF6_luuzHMTyf95n.png?token-time=1529539200&token-hash=RmcSP0947mw5o2-B6g1L6aU_OoDXANe198kLU6HMO30%3D)
:sparkles: Features
----------------------------------------------------------------
* Reactions
* User lists
* Customizable column view (known as MisskeyDeck)
* and widgets!
* Private messages
* Mute
* Real time contents
* Streaming
* ActivityPub compatible
and more! You can see it with your own eyes at [misskey.xyz](https://misskey.xyz).
@@ -45,18 +49,9 @@ If you want to...
[![Backers][backers-image]][support-url]
[![Sponsors][sponsors-image]][support-url]
:mortar_board: Notable contributors
----------------------------------------------------------------
| ![syuilo][syuilo-icon] | ![Morisawa Aya][ayamorisawa-icon] | ![otofune][otofune-icon] | ![akihikodaki][akihikodaki-icon] | ![tamaina][tamaina-icon] | ![rinsuki][rinsuki-icon] |
|:-:|:-:|:-:|:-:|:-:|:-:|
| [syuilo][syuilo-link]<br>Owner | [Aya Morisawa][ayamorisawa-link]<br>Collaborator | [otofune][otofune-link]<br>Collaborator | [akihikodaki][akihikodaki-link] | [tamaina][tamaina-link] | [rinsuki][rinsuki-link] |
[List of all contributors](https://github.com/syuilo/misskey/graphs/contributors)
### :earth_americas: Translators
| ![][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 |
| ![][ooo-icon] |
|:-:|
| [ooo][ooo-link] |
:four_leaf_clover: Copyright
----------------------------------------------------------------
@@ -84,23 +79,8 @@ Misskey is an open-source software licensed under [GNU AGPLv3](LICENSE).
[sponsors-image]: https://opencollective.com/misskey/sponsors.svg
[support-url]: https://opencollective.com/misskey#support
<!-- Contributors Info -->
[syuilo-link]: https://syuilo.com
[syuilo-icon]: https://avatars2.githubusercontent.com/u/4439005?v=3&s=70
[ayamorisawa-link]: https://github.com/ayamorisawa
[ayamorisawa-icon]: https://avatars0.githubusercontent.com/u/10798641?v=3&s=70
[otofune-link]: https://github.com/otofune
[otofune-icon]: https://avatars0.githubusercontent.com/u/15062473?v=3&s=70
[akihikodaki-link]: https://github.com/akihikodaki
[akihikodaki-icon]: https://avatars2.githubusercontent.com/u/17036990?s=70&v=4
[rinsuki-link]: https://github.com/rinsuki
[rinsuki-icon]: https://avatars0.githubusercontent.com/u/6533808?s=70&v=4
[tamaina-link]: https://github.com/tamaina
[tamaina-icon]: https://avatars1.githubusercontent.com/u/7973572?s=70&v=4
[mirro-san-link]: https://github.com/mirro-san
[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
[ooo-link]: https://www.patreon.com/user/creators?u=11601413
[ooo-icon]: https://c10.patreonusercontent.com/3/eyJ2IjoiMSIsInciOjIwMH0%3D/patreon-media/user/11601413/20cb15f209924302b399b99d3c98b850?token-time=2145916800&token-hash=IO31nK6VZCMWBWU2VAk2c824BX2QZ4DNPKyHHZXS0iw%3D

42
cli/recount-stats.js Normal file
View File

@@ -0,0 +1,42 @@
const { default: Note } = require('../built/models/note');
const { default: Meta } = require('../built/models/meta');
const { default: User } = require('../built/models/user');
async function main() {
const meta = await Meta.findOne({});
const notesCount = await Note.count();
const usersCount = await User.count();
const originalNotesCount = await Note.count({
'_user.host': null
});
const originalUsersCount = await User.count({
host: null
});
const stats = {
notesCount,
usersCount,
originalNotesCount,
originalUsersCount
};
if (meta) {
await Meta.update({}, {
$set: {
stats
}
});
} else {
await Meta.insert({
stats
});
}
}
main().then(() => {
console.log('done');
}).catch(console.error);

View File

@@ -3,16 +3,21 @@ const User = require('../built/models/user').default;
const args = process.argv.slice(2);
const userId = new mongo.ObjectID(args[0]);
const user = args[0];
console.log(`Suspending ${userId}...`);
const q = user.startsWith('@') ? {
username: user.split('@')[1],
host: user.split('@')[2] || null
} : { _id: new mongo.ObjectID(user) };
User.update({ _id: userId }, {
console.log(`Suspending ${user}...`);
User.update(q, {
$set: {
isSuspended: true
}
}).then(() => {
console.log(`Suspended ${userId}`);
console.log(`Suspended ${user}`);
}, e => {
console.error(e);
});

12
cli/update-remote-user.js Normal file
View File

@@ -0,0 +1,12 @@
const updatePerson = require('../built/remote/activitypub/models/person').updatePerson;
const args = process.argv.slice(2);
const user = args[0];
console.log(`Updating ${user}...`);
updatePerson(user).then(() => {
console.log(`Updated ${user}`);
}, e => {
console.error(e);
});

View File

@@ -47,7 +47,14 @@ You need to generate config file via `npm run config` command.
*5.* Build Misskey
----------------------------------------------------------------
We need to use `node-gyp` to build the `crypto` module.
Build misskey with the following:
`npm run build`
If you're on Debian, you will need to install the `build-essential` package.
If you're still encountering errors about some modules, use node-gyp:
1. `npm install -g node-gyp`
2. `node-gyp configure`

View File

@@ -36,38 +36,57 @@ common:
confused: "Verwirrt"
pudding: "Pudding"
note-placeholders:
a: "今どうしてる?"
b: "何かありましたか?"
c: "何をお考えですか?"
d: "言いたいことは?"
e: "ここに書いてください"
f: "あなたが書くのを待っています..."
a: "Was machst du gerade?"
b: "Was ist so passiert?"
c: "Was geht dir durch den Kopf?"
d: "Willst du etwas sagen?"
e: "Schreib hier etwas!"
f: "Warte darauf, das du schreibst."
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."
widgets:
profile: "プロフィール"
calendar: "カレンダー"
timemachine: "カレンダー(タイムマシン)"
activity: "アクティビティ"
rss: "RSSリーダー"
memo: "メモ"
trends: "トレンド"
photo-stream: "フォトストリーム"
slideshow: "スライドショー"
version: "バージョン"
analog-clock: "Analoge Uhr"
profile: "Profil"
calendar: "Kalender"
timemachine: "Kalender (Zeitmaschiene)"
activity: "Aktivitäten"
rss: "RSS Leser"
memo: "Notizen"
trends: "Trends"
photo-stream: "Bilder"
posts-monitor: "投稿チャート"
slideshow: "Diashow"
version: "Version"
broadcast: "ブロードキャスト"
notifications: "通知"
users: "おすすめユーザー"
polls: "投票"
post-form: "投稿フォーム"
messaging: "メッセージ"
server: "サーバー情報"
donation: "寄付のお願い"
nav: "ナビゲーション"
tips: "ヒント"
notifications: "Benachrichtigungen"
users: "Empfohlene Benutzer"
polls: "アンケート"
post-form: "Beitragsform"
messaging: "Nachrichten"
server: "Server-Info"
donation: "Spenden"
nav: "Navigation"
tips: "Tipps"
hashtags: "ハッシュタグ"
deck:
widgets: "Widget hinzufügen:"
home: "Startseite"
local: "Lokal"
global: "Global"
notifications: "Mitteilungen"
list: "Listen"
swap-left: "Nach links"
swap-right: "Nach rechts"
swap-up: "Nach oben"
swap-down: "Nach unten"
remove: "Spalte löschen"
add-column: "Eine Spalte hinzufügen"
rename: "Umbenennen"
stack-left: "Nach links schichten"
pop-right: "右に出す"
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."
@@ -122,8 +141,8 @@ common/views/components/nav.vue:
common/views/components/note-menu.vue:
favorite: "Diese Anmerkung favorisieren"
pin: "An die Profilseite pinnen"
delete: "削除"
delete-confirm: "この投稿を削除しますか?"
delete: "Löschen"
delete-confirm: "Diesen Post löschen?"
remote: "Auf Quelle anzeigen"
common/views/components/poll.vue:
vote-to: "Stimme für '{}'"
@@ -184,14 +203,14 @@ common/views/components/twitter-setting.vue:
common/views/components/uploader.vue:
waiting: "Warten"
common/views/components/visibility-chooser.vue:
public: "公開"
home: "ホーム"
home-desc: "ホームタイムラインにのみ公開"
followers: "フォロワー"
followers-desc: "自分のフォロワーにのみ公開"
specified: "ダイレクト"
specified-desc: "指定したユーザーにのみ公開"
private: "非公開"
public: "Öffentlich"
home: "Home"
home-desc: "Nur auf die Startseite posten"
followers: "Folgende"
followers-desc: "Nur für diejenigen sichtbar, die dir folgen"
specified: "Direkt"
specified-desc: "Poste nur für bestimmte Benutzer"
private: "Privat"
common/views/widgets/broadcast.vue:
fetching: "Laden"
no-broadcasts: "Keine Broadcasts"
@@ -203,13 +222,19 @@ common/views/widgets/donation.vue:
common/views/widgets/photo-stream.vue:
title: "Fotostream"
no-photos: "Keine Fotos"
common/views/widgets/posts-monitor.vue:
title: "投稿チャート"
toggle: "表示を切り替え"
common/views/widgets/hashtags.vue:
title: "ハッシュタグ"
count: "{}人が投稿"
common/views/widgets/server.vue:
title: "Serverinformationen"
toggle: "Sicht umschalten"
common/views/widgets/memo.vue:
title: "メモ"
memo: "ここに書いて!"
save: "保存"
title: "Notizen"
memo: "Schreib hier!"
save: "Speichern"
desktop/views/components/activity.chart.vue:
total: "Schwarz ... komplett"
notes: "Blau ... Hinweise"
@@ -247,30 +272,30 @@ desktop/views/components/drive.file.vue:
rename: "Umbenennen"
copy-url: "URL kopieren"
download: "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をクリップボードにコピーしました"
else-files: "Anderes…"
set-as-avatar: "Als Avatar festlegen"
set-as-banner: "Setze als Banner"
open-in-app: "In der App öffnen"
add-app: "App hinzufügen"
rename-file: "Datei umbennen"
input-new-file-name: "Geben Sie den neuen Dateinamen an"
copied: "Kopieren erfolgreich"
copied-url-to-clipboard: "URL wurde in die Zwischenablage kopiert"
desktop/views/components/drive.folder.vue:
unable-to-process: "操作を完了できません"
circular-reference-detected: "移動先のフォルダーは、移動するフォルダーのサブフォルダーです。"
unhandled-error: "不明なエラー"
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"
contextmenu:
move-to-this-folder: "このフォルダへ移動"
show-in-new-window: "新しいウィンドウで表示"
rename: "名前を変更"
rename-folder: "フォルダ名の変更"
input-new-folder-name: "新しいフォルダ名を入力してください"
move-to-this-folder: "Verschiebe in diesen Ordner"
show-in-new-window: "In einem neuen Fenster anzeigen"
rename: "Umbenennen"
rename-folder: "Ordner umbenennen"
input-new-folder-name: "Namen für neuen Ordner eingeben"
desktop/views/components/drive.nav-folder.vue:
drive: "ドライブ"
drive: "Laufwerk"
desktop/views/components/drive.vue:
search: "検索"
load-more: "もっと読み込む"
search: "Suchen"
load-more: "Mehr laden"
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."
@@ -289,27 +314,29 @@ desktop/views/components/drive.vue:
upload: "Eine Datei hochladen"
url-upload: "Von einer URL hochladen"
desktop/views/components/follow-button.vue:
unfollow: "フォロー解除"
follow: "フォローする"
following: "Folge ich"
follow: "Folgen"
request-pending: "Ausstehend"
follow-request: "Follower-Anfragen"
desktop/views/components/followers-window.vue:
followers: "{} のフォロワー"
desktop/views/components/followers.vue:
empty: "フォロワーはいないようです。"
empty: "Dir scheint niemand zu folgen."
desktop/views/components/following-window.vue:
following: "{} のフォロー"
desktop/views/components/following.vue:
empty: "フォロー中のユーザーはいないようです。"
empty: "Du folgst niemanden"
desktop/views/components/friends-maker.vue:
title: "気になるユーザーをフォロー:"
empty: "おすすめのユーザーは見つかりませんでした。"
fetching: "読み込んでいます"
refresh: "もっと見る"
close: "閉じる"
title: "Wem folgen?"
empty: "Der ausgewählte Benutzer konnte nicht gefunden werden."
fetching: "Lade…"
refresh: "Mehr"
close: "Schließen"
desktop/views/components/game-window.vue:
game: "オセロ"
game: "Othello"
desktop/views/components/home.vue:
done: "完了"
add-widget: "ウィジェットを追加:"
done: "Verbunden"
add-widget: "Widget hinzufügen:"
add: "Hinzufügen"
desktop/views/input-dialog.vue:
cancel: "Abbrechen"
@@ -320,23 +347,20 @@ desktop/views/components/messaging-window.vue:
title: "Nachrichten"
desktop/views/components/note-detail.vue:
more: "Lade weitere Konversationen"
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
reposted-by: "{}がRenote"
private: "Dieser Post ist privat"
deleted: "Dieser Beitrag wurde entfernt"
reposted-by: "Repostet von {}"
location: "Ort"
renote: "Anmerkung"
add-reaction: "Reaktion hinzufügen"
desktop/views/components/note-detail.sub.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/components/notes.note.vue:
reposted-by: "Auch geteilt von"
reply: "Antworten"
renote: "Anmerken"
add-reaction: "Eine Reaktion hinzufügen"
detail: "Zeige Details"
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
private: "Dieser Beitrag ist eine privat"
deleted: "Dieser Beitrag wurde entfernt"
desktop/views/components/notes.vue:
error: "Laden fehlgeschlagen."
retry: "Erneut versuchen"
@@ -346,7 +370,7 @@ desktop/views/components/notifications.vue:
desktop/views/components/post-form.vue:
reply-placeholder: "Antworte auf diese Anmerkung..."
quote-placeholder: "Zitiere diese Anmerkung..."
submit: "投稿"
submit: "Beitragsform"
reply: "Antworten"
renote: "Anmerkung"
posted: "Gepostet!"
@@ -377,56 +401,56 @@ desktop/views/components/renote-form.vue:
success: "Weitergesagt!"
failure: "Weitersagen fehlgeschlagen"
desktop/views/components/renote-form-window.vue:
title: "この投稿をRenoteしますか"
title: "Bist du dir sicher, dass du das reposten willst?"
desktop/views/components/settings-window.vue:
settings: "設定"
settings: "Experimentelles"
desktop/views/components/settings.vue:
profile: "プロフィール"
notification: "通知"
apps: "アプリ"
mute: "ミュート"
drive: "ドライブ"
security: "セキュリティ"
profile: "Profil"
notification: "Mitteilungen"
apps: "In App öffnen"
mute: "Stummschalten"
drive: "Dateien vom Drive anfügen"
security: "Sicherheit"
signin: "サインイン履歴"
password: "パスワード"
2fa: "二段階認証"
other: "その他"
license: "ライセンス"
behaviour: "動作"
fetch-on-scroll: "スクロールで自動読み込み"
fetch-on-scroll-desc: "ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。"
auto-popout: "ウィンドウの自動ポップアウト"
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
advanced: "詳細設定"
api-via-stream: "ストリームを経由したAPIリクエスト"
api-via-stream-desc: "この設定をオンにすると、websocket接続を経由してAPIリクエストが行われます(パフォーマンス向上が期待できます)。オフにすると、ネイティブの fetch APIが利用されます。この設定はこのデバイスのみ有効です。"
display: "デザインと表示"
customize: "ホームをカスタマイズ"
dark-mode: "ダークモード"
circle-icons: "円形のアイコンを使用"
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
password: "Passwort"
2fa: "Zwei-Faktor-Authentifizierung"
other: "Anderes"
license: "Lizenz"
behaviour: "Verhalten"
fetch-on-scroll: "Aktualisieren beim scrollen"
fetch-on-scroll-desc: "Wenn du runterscrollst empfängt die Seite automatisch zusätzliche Inhalte."
auto-popout: "Automatische Pop-out Fenster"
auto-popout-desc: "Pop-out ein offenes Fenster wenn möglich. Diese Einstellung wird im Browser gespeichert."
advanced: "Erweiterte Einstellungen"
api-via-stream: "API-Anfrage via stream"
api-via-stream-desc: "API-Anfrage über WebSocket statt native Aktualisierungs-API (für bessere Leistung). Diese Einstellung wird im Browser gespeichert."
display: "Erscheinungsbild und Anzeige"
customize: "Startseite anpassen"
dark-mode: "Nacht Modus"
circle-icons: "Kreisförmige Icons"
gradient-window-header: "Übergang in Fensterköpfen"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
show-maps: "マップの自動展開"
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
sound: "サウンド"
enable-sounds: "サウンドを有効にする"
enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。"
volume: "ボリューム"
test: "テスト"
mobile: "モバイル"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
language: "言語"
pick-language: "言語を選択"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
show-reply-target: "Zeige Antworten"
show-my-renotes: "Zeige meine Reposts auf der Zeitleiste"
show-renoted-my-notes: "Zeige meine Reposts, die geteilt wurden, auf der Zeitleiste"
show-maps: "Karte anzeigen"
show-maps-desc: "Zeige den Standort zu diesem Beitrag automatisch an."
sound: "Ton"
enable-sounds: "Ton aktivieren"
enable-sounds-desc: "Spiel einen Ton ab beim Erhalten eines Beitrags bzw. einer Nachricht. Diese Einstellung wird im Browser gespeichert."
volume: "Lautstärke"
test: "Test"
mobile: "Mobil"
disable-via-mobile: "Diesen Beitrag nicht mit 'vom Handy' absenden"
language: "Sprache"
pick-language: "Sprache auswählen"
recommended: "Empfohlen"
auto: "Automatisch"
specify-language: "Sprache auswählen"
language-desc: "変更はページの再度読み込み後に反映されます。"
cache: "キャッシュ"
clean-cache: "クリーンアップ"
cache-warn: "クリーンアップを行うと、ブラウザに記憶されたアカウント情報のキャッシュ、書きかけの投稿・返信・メッセージ、およびその他のデータ(設定情報含む)が削除されます。クリーンアップを行った後はページを再度読み込みする必要があります。"
cache-warn: "Der Cache deines Benutzerkontos (Info, Beiträge, Antworten, Direktnachrichten, Einstellungen), die lokal im Browser gespeichert sind werden gelöscht.\nDu musst die Seite aktualisieren nachdem du aufgeräumt hast."
cache-cleared: "キャッシュを削除しました"
cache-cleared-desc: "ページを再度読み込みしてください。"
auto-watch: "投稿の自動ウォッチ"
@@ -435,9 +459,9 @@ desktop/views/components/settings.vue:
operator: "このサーバーの運営者"
update: "Misskey Update"
version: "バージョン:"
latest-version: "最新のバージョン:"
update-checking: "アップデートを確認中"
do-update: "アップデートを確認"
latest-version: "Neuste Version:"
update-checking: "Suche nach Updates"
do-update: "Suche nach Updates"
update-settings: "詳細設定"
prevent-update: "アップデートを延期する(非推奨)"
prevent-update-desc: "この設定をオンにしてもアップデートが反映される場合があります。この設定はこのデバイスのみ有効です。"
@@ -449,20 +473,20 @@ desktop/views/components/settings.vue:
debug-mode: "デバッグモードを有効にする"
debug-mode-desc: "この設定はブラウザに記憶されます。"
experimental: "実験的機能を有効にする"
experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。"
tools: "ツール"
task-manager: "タスクマネージャ"
experimental-desc: "Experimentelle Funktionen können die Stabilität von Misskey beeinträchtigen. Diese Einstellung wird im Browser gespeichert."
tools: "Werkzeuge"
task-manager: "Taskmanager"
third-parties: "サードパーティ"
desktop/views/components/settings.2fa.vue:
intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。"
detail: "詳細..."
url: "https://www.google.co.jp/intl/ja/landing/2step/"
url: "https://www.google.de/intl/de/landing/2step/"
caution: "登録したデバイスを紛失するなどした場合、Misskeyにサインインできなくなりますのでご注意ください。"
register: "デバイスを登録する"
already-registered: "既に設定は完了しています。"
unregister: "設定を解除"
unregistered: "二段階認証が無効になりました。"
enter-password: "パスワードを入力してください"
register: "Ein Gerät registrieren"
already-registered: "Das Gerät wurde bereits registriert"
unregister: "Abschalten"
unregistered: "Zwei-Faktor-Authentifizierung wurde deaktiviert."
enter-password: "Bitte Passwort eingeben"
authenticator: "まず、Google Authenticatorをお使いのデバイスにインストールします:"
howtoinstall: "インストール方法はこちら"
scan: "次に、表示されているQRコードをスキャンします:"
@@ -477,16 +501,16 @@ desktop/views/components/settings.api.vue:
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
regenerate-token: "トークンを再生成"
token: "Token:"
enter-password: "パスワードを入力してください"
desktop/views/components/settings.app.vue:
enter-password: "Bitte Passwort eingeben"
desktop/views/components/settings.apps.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: "もう一度新しいパスワードを入力してください"
enter-current-password: "Derzeitiges Passwort eingeben"
enter-new-password: "Neues Passwort eingeben"
enter-new-password-again: "Neues Passwort erneut eingeben"
not-match: "新しいパスワードが一致しません"
changed: "パスワードを変更しました"
desktop/views/components/settings.profile.vue:
@@ -503,9 +527,9 @@ desktop/views/components/sub-note-content.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
media-count: "{}つのメディア"
poll: "投票"
poll: "アンケート"
desktop/views/components/taskmanager.vue:
title: "タスクマネージャ"
title: "Taskmanager"
desktop/views/components/timeline.vue:
home: "Home"
local: "Lokal"
@@ -516,12 +540,14 @@ desktop/views/components/ui.header.account.vue:
drive: "Speicher"
favorites: "Favoriten"
lists: "Listen"
follow-requests: "フォロー申請"
customize: "Anpassen"
settings: "Einstellungen"
signout: "Ausloggen"
dark: "Verdunkeln"
desktop/views/components/ui.header.nav.vue:
home: "Home"
deck: "デッキ"
messaging: "Nachrichten"
game: "Spielen"
desktop/views/components/ui.header.notifications.vue:
@@ -530,7 +556,12 @@ desktop/views/components/ui.header.post.vue:
post: "Einen neuen Post erstellen"
desktop/views/components/ui.header.search.vue:
placeholder: "Suchen"
desktop/views/components/received-follow-requests-window.vue:
title: "フォロー申請"
accept: "承認"
reject: "拒否"
desktop/views/components/user-lists-window.vue:
title: "リスト"
create-list: "リストを作成"
desktop/views/components/user-preview.vue:
notes: "投稿"
@@ -540,12 +571,19 @@ desktop/views/components/users-list.vue:
all: "すべて"
iknow: "知り合い"
load-more: "もっと"
fetching: "読み込んでいます"
fetching: "Lade…"
desktop/views/components/users-list-item.vue:
followed: "フォローされています"
desktop/views/components/window.vue:
popout: "ポップアウト"
close: "閉じる"
desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー"
desktop/views/pages/deck/deck.note.vue:
reposted-by: "{}がRenote"
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/pages/welcome.vue:
about: "詳しく..."
gotit: "わかった"
@@ -609,7 +647,7 @@ desktop/views/widgets/notifications.vue:
title: "通知"
settings: "通知の設定"
desktop/views/widgets/polls.vue:
title: "投票"
title: "アンケート"
refresh: "他を見る"
nothing: "ありません!"
desktop/views/widgets/post-form.vue:
@@ -655,12 +693,14 @@ mobile/views/components/drive.file-detail.vue:
hash: "ハッシュ (md5)"
exif: "EXIF"
mobile/views/components/follow-button.vue:
following: "フォロー中"
follow: "フォロー"
unfollow: "フォロー解除"
request-pending: "フォロー許可待ち"
follow-request: "フォロー申請"
mobile/views/components/friends-maker.vue:
title: "気になるユーザーをフォロー"
empty: "おすすめのユーザーは見つかりませんでした。"
fetching: "読み込んでいます"
fetching: "Lade…"
refresh: "もっと見る"
close: "閉じる"
mobile/views/components/note.vue:
@@ -696,7 +736,7 @@ mobile/views/components/post-form.vue:
submit: "投稿"
reply: "返信"
renote: "Renote"
renote-placeholder: "この投稿を引用... (オプション)"
quote-placeholder: "この投稿を引用... (オプション)"
reply-placeholder: "この投稿への返信..."
cw-placeholder: "内容への注釈 (オプション)"
location-alert: "お使いの端末は位置情報に対応していません"
@@ -706,16 +746,22 @@ mobile/views/components/sub-note-content.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
media-count: "{}つのメディア"
poll: "投票"
poll: "アンケート"
mobile/views/components/timeline.vue:
empty: "投稿がありません"
load-more: "もっと"
mobile/views/components/ui.nav.vue:
home: "ホーム"
timeline: "タイムライン"
notifications: "通知"
messaging: "メッセージ"
follow-requests: "フォロー申請"
search: "検索"
drive: "ドライブ"
favorites: "お気に入り"
user-lists: "リスト"
widgets: "ウィジェット"
game: "ゲーム"
darkmode: "ダークモード"
settings: "設定"
about: "Misskeyについて"
mobile/views/components/user-timeline.vue:
@@ -726,8 +772,14 @@ mobile/views/components/users-list.vue:
all: "すべて"
known: "知り合い"
load-more: "もっと"
mobile/views/pages/favorites.vue:
title: "お気に入り"
mobile/views/pages/user-lists.vue:
title: "リスト"
enter-list-name: "リスト名を入力してください"
mobile/views/pages/drive.vue:
drive: "ドライブ"
more: "もっと見る"
mobile/views/pages/followers.vue:
followers-of: "{}のフォロワー"
mobile/views/pages/following.vue:
@@ -740,6 +792,10 @@ mobile/views/pages/messaging.vue:
messaging: "メッセージ"
mobile/views/pages/messaging-room.vue:
messaging: "メッセージ"
mobile/views/pages/received-follow-requests.vue:
title: "フォロー申請"
accept: "承認"
reject: "拒否"
mobile/views/pages/note.vue:
title: "投稿"
prev: "前の投稿"
@@ -748,7 +804,7 @@ mobile/views/pages/notifications.vue:
notifications: "通知"
read-all: "すべての通知を既読にしますか?"
mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール"
title: "Profil"
name: "名前"
account: "アカウント"
location: "場所"
@@ -758,7 +814,7 @@ mobile/views/pages/settings/settings.profile.vue:
banner: "バナー"
is-cat: "このアカウントはCatです"
save: "保存"
saved: "プロフィールを保存しました"
saved: "Profil wurde aktualisiert"
uploading: "アップロード中"
upload-failed: "アップロードに失敗しました"
mobile/views/pages/search.vue:
@@ -772,7 +828,7 @@ mobile/views/pages/settings.vue:
lang-tip: "変更はページの再読み込み後に反映されます。"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
specify-language: "Sprache auswählen"
design: "デザインと表示"
dark-mode: "ダークモード"
i-am-under-limited-internet: "私は通信を制限されている"
@@ -795,9 +851,9 @@ mobile/views/pages/settings.vue:
twitter-disconnect: "切断する"
update: "Misskey Update"
version: "バージョン:"
latest-version: "最新のバージョン:"
update-checking: "アップデートを確認中"
check-for-updates: "アップデートを確認"
latest-version: "Neuste Version:"
update-checking: "Suche nach Updates"
check-for-updates: "Suche nach Updates"
no-updates: "利用可能な更新はありません"
no-updates-desc: "お使いのMisskeyは最新です。"
update-available: "新しいバージョンが利用可能です"

View File

@@ -5,7 +5,7 @@ meta:
common:
misskey: "A planet of fediverse"
about-title: "A ⭐ of fediverse."
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
about: "Thanks for finding Misskey. Misskey is a <b>decentralized microblogging platform</b> born on Earth. Since it exists within Fediverse (a universe where various social media platforms are organized) it is mutually linked with other social media platforms. Why don't you take a short break from the hustle and bustle of the city, and dive into a new Internet?"
time:
unknown: "unknown"
future: "future"
@@ -45,17 +45,19 @@ common:
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."
update-available: "A new version of Misskey is now available({newer}, the current version is {current}). Reload the page to apply updates."
my-token-regenerated: "Your token has been renewed so you will be signed out."
widgets:
analog-clock: "Analog clock"
profile: "Profile"
calendar: "Calendar"
timemachine: "Calendar (Time Machine)"
activity: "Activity"
rss: "RSS reader"
memo: "Memo"
memo: "Sticky note"
trends: "Trends"
photo-stream: "Photo stream"
posts-monitor: "Chart of posts"
slideshow: "Slideshow"
version: "Version"
broadcast: "Broadcast"
@@ -68,9 +70,26 @@ common:
donation: "Donation"
nav: "Navigation"
tips: "Tips"
hashtags: "Hashtags"
deck:
widgets: "Widgets"
home: "Home"
local: "Local"
global: "Global"
notifications: "Notifications"
list: "List"
swap-left: "Move left"
swap-right: "Move right"
swap-up: "Move upward"
swap-down: "Move downward"
remove: "Remove"
add-column: "Add a column"
rename: "Rename"
stack-left: "Stack to left"
pop-right: "Pop to right"
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."
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:
@@ -78,12 +97,12 @@ common/views/components/connect-failed.troubleshooter.vue:
network: "Network connection"
checking-network: "Checking network connection"
internet: "Internet connection"
checking-internet: "Checking internet connection"
checking-internet: "Checking Internet connection"
server: "Server connection"
checking-server: "Checking server connection"
finding: "Finding a problem"
no-network: "There is no Network connection"
no-network-desc: "Please make sure you are connected to the Network."
finding: "Searching for issues"
no-network: "No connection"
no-network-desc: "Please make sure you are connected to the network."
no-internet: "There is no Internet connection"
no-internet-desc: "Please make sure you are connected to the Internet."
no-server: "Unable to connect to the Misskey server"
@@ -93,19 +112,19 @@ common/views/components/connect-failed.troubleshooter.vue:
flush: "Clean cache"
set-version: "Specify version"
common/views/components/messaging.vue:
search-user: "Find an user"
search-user: "Find a user"
you: "You"
no-history: "No history"
common/views/components/messaging-room.vue:
empty: "No conversations"
more: "More"
empty: "You haven't messaged this user"
more: "Read 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-local: "Attach files from your PC"
attach-from-drive: "Attach files from your Drive"
common/views/components/messaging-room.message.vue:
is-read: "Read"
@@ -137,7 +156,7 @@ common/views/components/poll-editor.vue:
choice-n: "Choice {}"
remove: "Remove this choice"
add: "+ Add a choice"
destroy: "Destroy this poll"
destroy: "Cancel this poll"
common/views/components/reaction-picker.vue:
choose-reaction: "Choose a reaction"
common/views/components/signin.vue:
@@ -157,10 +176,10 @@ common/views/components/signup.vue:
too-long: "Please enter up to 20 characters."
password: "Password"
password-placeholder: "We recommend more than 8 characters."
weak-password: "Weak"
normal-password: "So so"
strong-password: "Strong"
retype: "Type again"
weak-password: "Weak password"
normal-password: "Fair password"
strong-password: "Strong password"
retype: "Re-enter"
retype-placeholder: "Confirm your password"
password-matched: "OK"
password-not-matched: "Doesn't match"
@@ -177,9 +196,9 @@ common/views/components/stream-indicator.vue:
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"
detail: "Detail..."
detail: "Details..."
reconnect: "Reconnect"
connect: "Link your twitter account"
connect: "Link your Twitter account"
disconnect: "Disconnect"
common/views/components/uploader.vue:
waiting: "Waiting"
@@ -199,15 +218,21 @@ common/views/widgets/broadcast.vue:
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!"
text: "To keep Misskey up and running we spend money for our domain name, servers and so on. Since we don't get money from advertisements, we count on donations from all of you. 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/posts-monitor.vue:
title: "Chart of posts"
toggle: "Toggle views"
common/views/widgets/hashtags.vue:
title: "Hashtags"
count: "{} users mentioned"
common/views/widgets/server.vue:
title: "Server info"
toggle: "Toggle views"
common/views/widgets/memo.vue:
title: "Memo"
title: "Sticky note"
memo: "Write here!"
save: "Save"
desktop/views/components/activity.chart.vue:
@@ -222,7 +247,7 @@ desktop/views/components/calendar.vue:
title: "{1} / {2}"
prev: "Previous month"
next: "Next month"
go: "Click to naviguate"
go: "Click to navigate"
desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "Choosing files"
upload: "Upload files from your PC"
@@ -289,19 +314,21 @@ desktop/views/components/drive.vue:
upload: "Upload a file"
url-upload: "Upload from a URL"
desktop/views/components/follow-button.vue:
unfollow: "Unfollow"
following: "Following"
follow: "Follow"
request-pending: "フォロー許可待ち"
follow-request: "Follow request"
desktop/views/components/followers-window.vue:
followers: "Followers of {}"
followers: "{}'s followers"
desktop/views/components/followers.vue:
empty: "Seems that you dont have any followers."
empty: "Seems like you dont have any followers."
desktop/views/components/following-window.vue:
following: "Following of {}"
following: "Following {}"
desktop/views/components/following.vue:
empty: "You dont follow anyone."
desktop/views/components/friends-maker.vue:
title: "Recommended users:"
empty: "Similar users werent found."
empty: "Couldn't find any recommended users."
fetching: "Loading…"
refresh: "More"
close: "Close"
@@ -322,19 +349,16 @@ desktop/views/components/note-detail.vue:
more: "Load more conversations"
private: "this post is private"
deleted: "this post has been deleted"
reposted-by: "Renoted by {}"
reposted-by: "Reposted by {}"
location: "Location"
renote: "Renote"
renote: "Repost"
add-reaction: "Add a reaction"
desktop/views/components/note-detail.sub.vue:
private: "this post is private"
deleted: "this post has been deleted"
desktop/views/components/notes.note.vue:
reposted-by: "Reposted by {}"
reply: "Reply"
renote: "Renote"
renote: "Repost"
add-reaction: "Add a reaction"
detail: "Show detail"
detail: "Show details"
private: "this post is private"
deleted: "this post has been deleted"
desktop/views/components/notes.vue:
@@ -348,20 +372,20 @@ desktop/views/components/post-form.vue:
quote-placeholder: "Quote this note..."
submit: "Post"
reply: "Reply"
renote: "Renote"
renote: "Repost"
posted: "Posted!"
replied: "Replied!"
reposted: "Reposted!"
note-failed: "Failed to note"
reply-failed: "Failed to reply"
renote-failed: "Failed to renote"
renote-failed: "Failed to repost"
posting: "Posting"
attach-media-from-local: "Attach media from your pc"
attach-media-from-local: "Attach media from your PC"
attach-media-from-drive: "Attach media from your Drive"
attach-cancel: "Cancel attachment"
insert-a-kao: "v(‘ω’)v"
create-poll: "Create a poll"
text-remain: "{} chars remaining"
text-remain: "{} characters remaining"
desktop/views/components/post-form-window.vue:
note: "New note"
reply: "Reply"
@@ -372,12 +396,12 @@ desktop/views/components/progress-dialog.vue:
desktop/views/components/renote-form.vue:
quote: "Quote..."
cancel: "Cancel"
renote: "Renote"
renote: "Repost"
reposting: "Reposting..."
success: "Reposted!"
failure: "Failed to Renote"
failure: "Repost failed"
desktop/views/components/renote-form-window.vue:
title: "Are you sure you want to renote this note?"
title: "Are you sure you want to repost this?"
desktop/views/components/settings-window.vue:
settings: "Settings"
desktop/views/components/settings.vue:
@@ -407,22 +431,22 @@ desktop/views/components/settings.vue:
gradient-window-header: "Use gradients on window headers"
post-form-on-timeline: "Display post form at the top of the timeline"
show-reply-target: "Display reply target"
show-my-renotes: "Show my renote in the timeline"
show-renoted-my-notes: "Show renoted my post in the timeline"
show-my-renotes: "Show my reposts in the timeline"
show-renoted-my-notes: "Show my posts that have been shared in the timeline"
show-maps: "Show the map"
show-maps-desc: "Show the map of the location attached to the post."
show-maps-desc: "Automatically show the location on the map attached to this post."
sound: "Sound"
enable-sounds: "Enable sound"
enable-sounds-desc: "Play a sound when you received a post/message. This setting is stored in the browser."
enable-sounds-desc: "Play a sound when you receive a post/message. This setting is stored in the browser."
volume: "Volume"
test: "Test"
mobile: "Mobile"
disable-via-mobile: "Not mark the post as 'from mobile'"
disable-via-mobile: "Don't mark the post as 'from mobile'"
language: "Language"
pick-language: "Select a language"
recommended: "Recommended"
auto: "Auto"
specify-language: "Specify the language"
specify-language: "Specify language"
language-desc: "You need to reload the page for the changes to take effect."
cache: "Cache"
clean-cache: "Cleanup"
@@ -440,11 +464,11 @@ desktop/views/components/settings.vue:
do-update: "Check for update"
update-settings: "Advanced settings"
prevent-update: "Postpone updates (not recommended)"
prevent-update-desc: "You may reflect updates even if you select this setting. This setting is valid only this device."
prevent-update-desc: "Even if you turn this setting on updates may apply. This setting is valid only for this device."
no-updates: "No updates available"
no-updates-desc: "Your Misskey is up to date."
update-available: "New version is available!"
update-available-desc: "To reload the page and updates are applied."
update-available-desc: "The updates will apply if you reload the page again."
advanced-settings: "Advanced"
debug-mode: "Enable the debug mode"
debug-mode-desc: "This setting is stored in the browser."
@@ -478,8 +502,8 @@ desktop/views/components/settings.api.vue:
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.apps.vue:
no-apps: "No linked applications"
desktop/views/components/settings.mute.vue:
no-users: "No muted users"
desktop/views/components/settings.password.vue:
@@ -503,7 +527,7 @@ desktop/views/components/sub-note-content.vue:
private: "this post is private"
deleted: "this post has been deleted"
media-count: "{} media attached"
poll: "Polls"
poll: "Poll"
desktop/views/components/taskmanager.vue:
title: "Task Manager"
desktop/views/components/timeline.vue:
@@ -516,12 +540,14 @@ desktop/views/components/ui.header.account.vue:
drive: "Drive"
favorites: "Favorites"
lists: "Lists"
follow-requests: "Follow requests"
customize: "Customize"
settings: "Settings"
signout: "Sign out"
dark: "Fall in dark"
desktop/views/components/ui.header.nav.vue:
home: "Home"
deck: "Deck"
messaging: "Messages"
game: "Play Othello"
desktop/views/components/ui.header.notifications.vue:
@@ -530,7 +556,12 @@ desktop/views/components/ui.header.post.vue:
post: "Compose new Post"
desktop/views/components/ui.header.search.vue:
placeholder: "Search"
desktop/views/components/received-follow-requests-window.vue:
title: "Follow requests"
accept: "Accept"
reject: "Reject"
desktop/views/components/user-lists-window.vue:
title: "User lists"
create-list: "Create list"
desktop/views/components/user-preview.vue:
notes: "Posts"
@@ -546,6 +577,13 @@ desktop/views/components/users-list-item.vue:
desktop/views/components/window.vue:
popout: "Popout"
close: "Close"
desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "Only media posts"
is-media-view: "Media view"
desktop/views/pages/deck/deck.note.vue:
reposted-by: "Reposted by {}"
private: "this post is private"
deleted: "this post has been deleted"
desktop/views/pages/welcome.vue:
about: "about"
gotit: "Got it!"
@@ -635,13 +673,13 @@ mobile/views/components/drive.vue:
load-more: "Load more"
nothing-in-drive: "Nothing"
folder-is-empty: "This folder is empty"
prompt: "何をしますか?(数字を入力してください): <1 → ファイルをアップロード | 2 → ファイルをURLでアップロード | 3 → フォルダ作成 | 4 → このフォルダ名を変更 | 5 → このフォルダを移動 | 6 → このフォルダを削除>"
prompt: "What do you want to do? (Please enter a number): <1 → Upload a file | 2 → Upload a file from a URL | 3 → Create a folder | 4 → Change this folder's name | 5 → Move this folder | 6 → Delete this folder>"
deletion-alert: "Sorry! Deleting a folder is not yet implemented."
folder-name: "Folder name"
root-rename-alert: "現在いる場所はルートで、フォルダではないため名前の変更はできません。名前を変更したいフォルダに移動してからやってください。"
root-move-alert: "現在いる場所はルートで、フォルダではないため移動はできません。移動したいフォルダに移動してからやってください。"
root-rename-alert: "You're in the root; it can't be renamed because it's not a folder. Navigate to a folder you want to rename and try again."
root-move-alert: "You're in the root; it can't be moved because it's not a folder. Navigate to a folder you want to move and try again."
url-prompt: "URL of file you want to upload"
uploading: "アップロードをリクエストしました。アップロードが完了するまで時間がかかる場合があります。"
uploading: "Upload requested. It may take some time for the upload to complete."
mobile/views/components/drive-file-detail.vue:
rename: "Rename"
mobile/views/components/drive-file-chooser.vue:
@@ -655,8 +693,10 @@ mobile/views/components/drive.file-detail.vue:
hash: "Hash (md5)"
exif: "EXIF"
mobile/views/components/follow-button.vue:
following: "Following"
follow: "Follow"
unfollow: "Unfollow"
request-pending: "フォロー許可待ち"
follow-request: "Follow request"
mobile/views/components/friends-maker.vue:
title: "Let's follow users"
empty: "Featured user was not found."
@@ -664,7 +704,7 @@ mobile/views/components/friends-maker.vue:
refresh: "See more"
close: "Close"
mobile/views/components/note.vue:
reposted-by: "Renoted by {}"
reposted-by: "Reposted by {}"
more: "See more"
less: "Hide"
private: "this post is private"
@@ -673,7 +713,7 @@ mobile/views/components/note.vue:
mobile/views/components/note-detail.vue:
reply: "Reply"
reaction: "Reaction"
reposted-by: "Renoted by {}"
reposted-by: "Reposted by {}"
private: "this post is private"
deleted: "this post has been deleted"
location: "Location"
@@ -695,11 +735,11 @@ mobile/views/components/post-form.vue:
add-visible-user: "Add a user"
submit: "Post"
reply: "Reply"
renote: "Renote"
renote-placeholder: "Quote this post. (optional)"
renote: "Repost"
quote-placeholder: "Quote this post... (optional)"
reply-placeholder: "Reply to this note..."
cw-placeholder: "内容への注釈 (オプション)"
location-alert: "お使いの端末は位置情報に対応していません"
cw-placeholder: "Comments about content (optional)"
location-alert: "Your device does not support location services"
error: "Error"
username-prompt: "Enter user name"
mobile/views/components/sub-note-content.vue:
@@ -711,11 +751,17 @@ mobile/views/components/timeline.vue:
empty: "No notes"
load-more: "More"
mobile/views/components/ui.nav.vue:
home: "Home"
timeline: "Timeline"
notifications: "Notifications"
messaging: "Messages"
follow-requests: "Follow requests"
search: "Search"
drive: "Drive"
favorites: "Favorites"
user-lists: "Lists"
widgets: "Widgets"
game: "Games"
darkmode: "Dark mode"
settings: "Settings"
about: "About Misskey"
mobile/views/components/user-timeline.vue:
@@ -726,8 +772,14 @@ mobile/views/components/users-list.vue:
all: "All"
known: "You know"
load-more: "More"
mobile/views/pages/favorites.vue:
title: "Favorites"
mobile/views/pages/user-lists.vue:
title: "Lists"
enter-list-name: "Enter list name"
mobile/views/pages/drive.vue:
drive: "Drive"
more: "Load more"
mobile/views/pages/followers.vue:
followers-of: "Followers of {}"
mobile/views/pages/following.vue:
@@ -740,6 +792,10 @@ mobile/views/pages/messaging.vue:
messaging: "Messaging"
mobile/views/pages/messaging-room.vue:
messaging: "Messaging"
mobile/views/pages/received-follow-requests.vue:
title: "Follow requests"
accept: "Accept"
reject: "Reject"
mobile/views/pages/note.vue:
title: "Post"
prev: "Previous note"
@@ -779,8 +835,8 @@ mobile/views/pages/settings.vue:
circle-icons: "Use circle icons"
timeline: "Timeline"
show-reply-target: "Show reply target"
show-my-renotes: "Show my renotes"
show-renoted-my-notes: "Show renoted my notes"
show-my-renotes: "Show my reposts"
show-renoted-my-notes: "Show my reposted posts"
post-style: "Post design"
post-style-standard: "Standard"
post-style-smart: "Smart"

View File

@@ -48,26 +48,45 @@ common:
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
widgets:
analog-clock: "アナログ時計"
profile: "プロフィール"
calendar: "カレンダー"
timemachine: "カレンダー(タイムマシン)"
activity: "アクティビティ"
rss: "RSSリーダー"
memo: "メモ"
memo: "付箋"
trends: "トレンド"
photo-stream: "フォトストリーム"
posts-monitor: "投稿チャート"
slideshow: "スライドショー"
version: "バージョン"
broadcast: "ブロードキャスト"
notifications: "通知"
users: "おすすめユーザー"
polls: "投票"
polls: "アンケート"
post-form: "投稿フォーム"
messaging: "メッセージ"
server: "サーバー情報"
donation: "寄付のお願い"
nav: "ナビゲーション"
tips: "ヒント"
hashtags: "ハッシュタグ"
deck:
widgets: "ウィジェット"
home: "ホーム"
local: "ローカル"
global: "グローバル"
notifications: "通知"
list: "リスト"
swap-left: "左に移動"
swap-right: "右に移動"
swap-up: "上に移動"
swap-down: "下に移動"
remove: "カラムを削除"
add-column: "カラムを追加"
rename: "名前を変更"
stack-left: "左に重ねる"
pop-right: "右に出す"
common/views/components/connect-failed.vue:
title: "サーバーに接続できません"
description: "インターネット回線に問題があるか、サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから{再度お試し}ください。"
@@ -133,11 +152,11 @@ common/views/components/poll.vue:
show-result: "結果を見る"
voted: "投票済み"
common/views/components/poll-editor.vue:
no-only-one-choice: "投票には、選択肢が最低2つ必要です"
no-only-one-choice: "アンケートには、選択肢が最低2つ必要です"
choice-n: "選択肢{}"
remove: "この選択肢を削除"
add: "+選択肢を追加"
destroy: "投票を破棄"
destroy: "アンケートを破棄"
common/views/components/reaction-picker.vue:
choose-reaction: "リアクションを選択"
common/views/components/signin.vue:
@@ -203,11 +222,17 @@ common/views/widgets/donation.vue:
common/views/widgets/photo-stream.vue:
title: "フォトストリーム"
no-photos: "写真はありません"
common/views/widgets/posts-monitor.vue:
title: "投稿チャート"
toggle: "表示を切り替え"
common/views/widgets/hashtags.vue:
title: "ハッシュタグ"
count: "{}人が投稿"
common/views/widgets/server.vue:
title: "サーバー情報"
toggle: "表示を切り替え"
common/views/widgets/memo.vue:
title: "メモ"
title: "付箋"
memo: "ここに書いて!"
save: "保存"
desktop/views/components/activity.chart.vue:
@@ -289,8 +314,10 @@ desktop/views/components/drive.vue:
upload: "ファイルをアップロード"
url-upload: "URLからアップロード"
desktop/views/components/follow-button.vue:
unfollow: "フォロー解除"
follow: "フォローする"
following: "フォロー"
follow: "フォロー"
request-pending: "フォロー許可待ち"
follow-request: "フォロー申請"
desktop/views/components/followers-window.vue:
followers: "{} のフォロワー"
desktop/views/components/followers.vue:
@@ -326,9 +353,6 @@ desktop/views/components/note-detail.vue:
location: "位置情報"
renote: "Renote"
add-reaction: "リアクション"
desktop/views/components/note-detail.sub.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/components/notes.note.vue:
reposted-by: "{}がRenote"
reply: "返信"
@@ -360,7 +384,7 @@ desktop/views/components/post-form.vue:
attach-media-from-drive: "ドライブからメディアを添付"
attach-cancel: "添付取り消し"
insert-a-kao: "v(‘ω’)v"
create-poll: "投票を作成"
create-poll: "アンケートを作成"
text-remain: "残り{}文字"
desktop/views/components/post-form-window.vue:
note: "新規投稿"
@@ -478,7 +502,7 @@ desktop/views/components/settings.api.vue:
regenerate-token: "トークンを再生成"
token: "Token:"
enter-password: "パスワードを入力してください"
desktop/views/components/settings.app.vue:
desktop/views/components/settings.apps.vue:
no-apps: "連携しているアプリケーションはありません"
desktop/views/components/settings.mute.vue:
no-users: "ミュートしているユーザーはいません"
@@ -503,7 +527,7 @@ desktop/views/components/sub-note-content.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
media-count: "{}つのメディア"
poll: "投票"
poll: "アンケート"
desktop/views/components/taskmanager.vue:
title: "タスクマネージャ"
desktop/views/components/timeline.vue:
@@ -516,12 +540,14 @@ desktop/views/components/ui.header.account.vue:
drive: "ドライブ"
favorites: "お気に入り"
lists: "リスト"
follow-requests: "フォロー申請"
customize: "カスタマイズ"
settings: "設定"
signout: "サインアウト"
dark: "闇に飲まれる"
desktop/views/components/ui.header.nav.vue:
home: "ホーム"
deck: "デッキ"
messaging: "メッセージ"
game: "ゲーム"
desktop/views/components/ui.header.notifications.vue:
@@ -530,7 +556,12 @@ desktop/views/components/ui.header.post.vue:
post: "新規投稿"
desktop/views/components/ui.header.search.vue:
placeholder: "検索"
desktop/views/components/received-follow-requests-window.vue:
title: "フォロー申請"
accept: "承認"
reject: "拒否"
desktop/views/components/user-lists-window.vue:
title: "リスト"
create-list: "リストを作成"
desktop/views/components/user-preview.vue:
notes: "投稿"
@@ -546,6 +577,13 @@ desktop/views/components/users-list-item.vue:
desktop/views/components/window.vue:
popout: "ポップアウト"
close: "閉じる"
desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー"
desktop/views/pages/deck/deck.note.vue:
reposted-by: "{}がRenote"
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/pages/welcome.vue:
about: "詳しく..."
gotit: "わかった"
@@ -609,7 +647,7 @@ desktop/views/widgets/notifications.vue:
title: "通知"
settings: "通知の設定"
desktop/views/widgets/polls.vue:
title: "投票"
title: "アンケート"
refresh: "他を見る"
nothing: "ありません!"
desktop/views/widgets/post-form.vue:
@@ -655,8 +693,10 @@ mobile/views/components/drive.file-detail.vue:
hash: "ハッシュ (md5)"
exif: "EXIF"
mobile/views/components/follow-button.vue:
following: "フォロー中"
follow: "フォロー"
unfollow: "フォロー解除"
request-pending: "フォロー許可待ち"
follow-request: "フォロー申請"
mobile/views/components/friends-maker.vue:
title: "気になるユーザーをフォロー"
empty: "おすすめのユーザーは見つかりませんでした。"
@@ -696,7 +736,7 @@ mobile/views/components/post-form.vue:
submit: "投稿"
reply: "返信"
renote: "Renote"
renote-placeholder: "この投稿を引用... (オプション)"
quote-placeholder: "この投稿を引用... (オプション)"
reply-placeholder: "この投稿への返信..."
cw-placeholder: "内容への注釈 (オプション)"
location-alert: "お使いの端末は位置情報に対応していません"
@@ -706,16 +746,22 @@ mobile/views/components/sub-note-content.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
media-count: "{}つのメディア"
poll: "投票"
poll: "アンケート"
mobile/views/components/timeline.vue:
empty: "投稿がありません"
load-more: "もっと"
mobile/views/components/ui.nav.vue:
home: "ホーム"
timeline: "タイムライン"
notifications: "通知"
messaging: "メッセージ"
follow-requests: "フォロー申請"
search: "検索"
drive: "ドライブ"
favorites: "お気に入り"
user-lists: "リスト"
widgets: "ウィジェット"
game: "ゲーム"
darkmode: "ダークモード"
settings: "設定"
about: "Misskeyについて"
mobile/views/components/user-timeline.vue:
@@ -726,8 +772,14 @@ mobile/views/components/users-list.vue:
all: "すべて"
known: "知り合い"
load-more: "もっと"
mobile/views/pages/favorites.vue:
title: "お気に入り"
mobile/views/pages/user-lists.vue:
title: "リスト"
enter-list-name: "リスト名を入力してください"
mobile/views/pages/drive.vue:
drive: "ドライブ"
more: "もっと見る"
mobile/views/pages/followers.vue:
followers-of: "{}のフォロワー"
mobile/views/pages/following.vue:
@@ -740,6 +792,10 @@ mobile/views/pages/messaging.vue:
messaging: "メッセージ"
mobile/views/pages/messaging-room.vue:
messaging: "メッセージ"
mobile/views/pages/received-follow-requests.vue:
title: "フォロー申請"
accept: "承認"
reject: "拒否"
mobile/views/pages/note.vue:
title: "投稿"
prev: "前の投稿"

View File

@@ -3,9 +3,9 @@ meta:
lang: "Français"
divider: ""
common:
misskey: "A planet of fediverse"
about-title: "Aof fediverse."
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
misskey: "Une planète du fédiverse"
about-title: "Unedu fédiverse."
about: "Merci d'avoir découvert Misskey. Misskey est une <b>plateforme de micro-blogging distribuée</b> née sur Terre. Parce qu'il fait partie du Fédiverse (un univers composé de diverses plateformes de réseaux sociaux organisées), il est mutuellement connecté avec d'autres plateformes de réseaux sociaux. Désirez-vous prendre une pause, pendant un instant, loin de l'agitation de la ville et plonger dans un nouvel Internet ?"
time:
unknown: "inconnu"
future: "future"
@@ -24,7 +24,7 @@ common:
wednesday: "M"
thursday: "J"
friday: "V"
saturday: ""
saturday: "S"
reactions:
like: "Aime"
love: "Adore"
@@ -36,38 +36,57 @@ common:
confused: "Confus"
pudding: "Pudding"
note-placeholders:
a: "今どうしてる?"
b: "何かありましたか?"
c: "何をお考えですか?"
d: "言いたいことは?"
e: "ここに書いてください"
f: "あなたが書くのを待っています..."
a: "Que faîtes vous à cet instant ?"
b: "Quoi de neuf ?"
c: "Qu'avez-vous en tête ?"
d: "Voulez-vous exprimer quelque chose ?"
e: "Écrivez ici"
f: "En attente de vos écrits"
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é."
widgets:
profile: "プロフィール"
calendar: "カレンダー"
analog-clock: "Horloge analogique"
profile: "Profil"
calendar: "Calendrier"
timemachine: "カレンダー(タイムマシン)"
activity: "アクティビティ"
rss: "RSSリーダー"
memo: "メモ"
trends: "トレンド"
photo-stream: "フォトストリーム"
slideshow: "スライドショー"
version: "バージョン"
broadcast: "ブロードキャスト"
notifications: "通知"
users: "おすすめユーザー"
polls: "投票"
activity: "Activité"
rss: "Lecteur de flux RSS"
memo: "Pense-bête"
trends: "Tendances"
photo-stream: "Flux de photos"
posts-monitor: "Graph des publications"
slideshow: "Diaporama"
version: "Version"
broadcast: "Diffusion"
notifications: "Notifications"
users: "Utilisateurs"
polls: "Sondages"
post-form: "投稿フォーム"
messaging: "メッセージ"
server: "サーバー情報"
donation: "寄付のお願い"
nav: "ナビゲーション"
tips: "ヒント"
messaging: "Messagerie"
server: "Info sur le serveur"
donation: "Dons"
nav: "Navigation"
tips: "Conseils"
hashtags: "ハッシュタグ"
deck:
widgets: "Widgets"
home: "Accueil"
local: "Local"
global: "Global"
notifications: "Notifications"
list: "Liste"
swap-left: "Déplacer à gauche"
swap-right: "Déplacer à droite"
swap-up: "Vers le haut"
swap-down: "Vers le bas"
remove: "Supprimer"
add-column: "Ajouter une colonne"
rename: "Renommer"
stack-left: "Vers la gauche"
pop-right: "Vers la droite"
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."
@@ -90,8 +109,8 @@ common/views/components/connect-failed.troubleshooter.vue:
no-server-desc: "Votre connexion est OK, mais il a été impossible de vous connecter au serveur de Misskey. Il y a des chances que le serveur soit hors-ligne ou en maintenance, veuillez ressayer plus tard."
success: "Connexion au serveur de Misskey reussie!"
success-desc: "La connexion au serveur a été reussie. Veuillez recharger la page."
flush: "キャッシュの削除"
set-version: "バージョン指定"
flush: "Vider le cache"
set-version: "Choisissez une version"
common/views/components/messaging.vue:
search-user: "Trouver un utilisateur"
you: "Vous"
@@ -118,12 +137,12 @@ common/views/components/nav.vue:
donors: "Donateurs"
repository: "Repo"
develop: "Développeurs"
feedback: "フィードバック"
feedback: "Remarques"
common/views/components/note-menu.vue:
favorite: "Favorite this note"
pin: "Épingler sur votre profile"
delete: "削除"
delete-confirm: "この投稿を削除しますか?"
delete: "Supprimer"
delete-confirm: "Supprimer cette publication ?"
remote: "投稿元で見る"
common/views/components/poll.vue:
vote-to: "Voter pour '{}'"
@@ -133,11 +152,11 @@ common/views/components/poll.vue:
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"
no-only-one-choice: "Vous devez saisir au moins deux choix."
choice-n: "Choix {}"
remove: "Supprimer ce choix"
add: "+ Ajouter un choix"
destroy: "Supprimer ce sondage"
destroy: "Annuler ce sondage"
common/views/components/reaction-picker.vue:
choose-reaction: "Choisissez votre réaction"
common/views/components/signin.vue:
@@ -184,14 +203,14 @@ common/views/components/twitter-setting.vue:
common/views/components/uploader.vue:
waiting: "En attente"
common/views/components/visibility-chooser.vue:
public: "公開"
home: "ホーム"
home-desc: "ホームタイムラインにのみ公開"
followers: "フォロワー"
followers-desc: "自分のフォロワーにのみ公開"
specified: "ダイレクト"
specified-desc: "指定したユーザーにのみ公開"
private: "非公開"
public: "Public"
home: "Accueil"
home-desc: "Publier sur le fil d'Accueil uniquement"
followers: "Abonnés"
followers-desc: "Publier à vos abonnés uniquement"
specified: "Direct"
specified-desc: "Publier aux utilisateurs mentionnés"
private: "Privé"
common/views/widgets/broadcast.vue:
fetching: "Récuperation"
no-broadcasts: "No broadcasts"
@@ -203,18 +222,24 @@ common/views/widgets/donation.vue:
common/views/widgets/photo-stream.vue:
title: "Flux de photo"
no-photos: "Pas de photos"
common/views/widgets/posts-monitor.vue:
title: "Graph des publications"
toggle: "表示を切り替え"
common/views/widgets/hashtags.vue:
title: "ハッシュタグ"
count: "{}人が投稿"
common/views/widgets/server.vue:
title: "Info sur le serveur"
toggle: "Afficher les vues"
common/views/widgets/memo.vue:
title: "メモ"
memo: "ここに書いて!"
save: "保存"
title: "Pense-bête"
memo: "Écrivez ici !"
save: "Enregistrer"
desktop/views/components/activity.chart.vue:
total: "Black ... Total"
notes: "Blue ... Notes"
replies: "Red ... Replies"
renotes: "Green ... Renotes"
notes: "Bleu ... Notes"
replies: "Rouge ... Réponses"
renotes: "Vert ... Partages"
desktop/views/components/activity.vue:
title: "Activitié"
toggle: "Afficher les vues"
@@ -224,19 +249,19 @@ desktop/views/components/calendar.vue:
next: "Mois prochain"
go: "Cliquer pour naviguer"
desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "ファイル選択中"
upload: "PCからドライブにファイルをアップロード"
cancel: "キャンセル"
ok: "決定"
choose-prompt: "ファイルを選択"
choose-file: "Sélection de fichiers"
upload: "Téléverser des fichiers à partir de votre PC"
cancel: "Annuler"
ok: "OK"
choose-prompt: "Choisir un fichier"
desktop/views/components/choose-folder-from-drive-window.vue:
cancel: "キャンセル"
ok: "決定"
choose-prompt: "フォルダを選択"
cancel: "Annuler"
ok: "OK"
choose-prompt: "Choisir un dossier"
desktop/views/components/crop-window.vue:
skip: "クロップをスキップ"
cancel: "キャンセル"
ok: "決定"
skip: "Ignorer la découpe"
cancel: "Annuler"
ok: "OK"
desktop/views/components/drive-window.vue:
used: "utilisé"
drive: "Drive"
@@ -289,66 +314,65 @@ desktop/views/components/drive.vue:
upload: "Uploader un fichier"
url-upload: "Uploader d'un URL"
desktop/views/components/follow-button.vue:
unfollow: "フォロー解除"
follow: "フォローする"
following: "Abonnements"
follow: "Suivre"
request-pending: "En attente d'approbation"
follow-request: "Demande d'abonnement"
desktop/views/components/followers-window.vue:
followers: "{} のフォロワー"
followers: "{} abonnés"
desktop/views/components/followers.vue:
empty: "フォロワーはいないようです。"
empty: "Il semble que vous n'avez pas encore d'abonnés."
desktop/views/components/following-window.vue:
following: "{} のフォロー"
following: "Suit {}"
desktop/views/components/following.vue:
empty: "フォロー中のユーザーはいないようです。"
empty: "Vous ne suivez aucun compte."
desktop/views/components/friends-maker.vue:
title: "気になるユーザーをフォロー:"
empty: "おすすめのユーザーは見つかりませんでした。"
fetching: "読み込んでいます"
refresh: "もっと見る"
close: "閉じる"
title: "Utilisateurs recommandés :"
empty: "Impossible de trouver des utilisateurs à recommander."
fetching: "Chargement"
refresh: "Plus"
close: "Fermer"
desktop/views/components/game-window.vue:
game: "オセロ"
game: "Othello"
desktop/views/components/home.vue:
done: "完了"
add-widget: "ウィジェットを追加:"
add: "追加"
done: "Envoyer"
add-widget: "Ajouter un widget"
add: "Ajouter"
desktop/views/input-dialog.vue:
cancel: "キャンセル"
ok: "決定"
cancel: "Annuler"
ok: "OK"
desktop/views/components/messaging-room-window.vue:
title: "メッセージ:"
title: "Messages :"
desktop/views/components/messaging-window.vue:
title: "Messagerie"
desktop/views/components/note-detail.vue:
more: "会話をもっと読み込む"
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
reposted-by: "{}がRenote"
location: "位置情報"
renote: "Renote"
add-reaction: "リアクション"
desktop/views/components/note-detail.sub.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
more: "Charger davantage de conversations"
private: "cette publication est privée"
deleted: "cette publication a été supprimée"
reposted-by: "Republié par {}"
location: "Géolocalisation"
renote: "Republier"
add-reaction: "Ajouter votre reaction"
desktop/views/components/notes.note.vue:
reposted-by: "Reposté par {}"
reply: "Répondre"
renote: "Renote"
renote: "Republier"
add-reaction: "Ajouter votre reaction"
detail: "Afficher les détails"
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
private: "cette publication est privée"
deleted: "cette publication a été supprimée"
desktop/views/components/notes.vue:
error: "読み込みに失敗しました。"
retry: "リトライ"
error: "Échec du chargement."
retry: "Réessayer"
desktop/views/components/notifications.vue:
more: "Plus"
empty: "Pas de notifications"
desktop/views/components/post-form.vue:
reply-placeholder: "Répondre à cette note"
quote-placeholder: "Citer cette note"
submit: "投稿"
submit: "Poster"
reply: "Répondre"
renote: "Renote"
renote: "Republier"
posted: "Posté!"
replied: "Répondu!"
reposted: "Reposté!"
@@ -368,18 +392,18 @@ desktop/views/components/post-form-window.vue:
attaches: "{} media joint(s)"
uploading-media: "Upload du media {}"
desktop/views/components/progress-dialog.vue:
waiting: "待機中"
waiting: "En attente"
desktop/views/components/renote-form.vue:
quote: "Citer..."
cancel: "Annuler"
renote: "Renote"
renote: "Republier"
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-window.vue:
settings: "設定"
settings: "Paramètres"
desktop/views/components/settings.vue:
profile: "Profil"
notification: "Notification"
@@ -392,67 +416,67 @@ desktop/views/components/settings.vue:
2fa: "Vérification en deux étapes"
other: "Autres"
license: "License"
behaviour: "動作"
fetch-on-scroll: "スクロールで自動読み込み"
fetch-on-scroll-desc: "ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。"
auto-popout: "ウィンドウの自動ポップアウト"
behaviour: "Comportement"
fetch-on-scroll: "Chargement lors du défilement"
fetch-on-scroll-desc: "Chargement automatique du contenu lors du défilement de la page."
auto-popout: "Fenêtre contextuelle automatique"
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
advanced: "詳細設定"
api-via-stream: "ストリームを経由したAPIリクエスト"
advanced: "Paramètres avancés"
api-via-stream: "Requête API via le flux"
api-via-stream-desc: "この設定をオンにすると、websocket接続を経由してAPIリクエストが行われます(パフォーマンス向上が期待できます)。オフにすると、ネイティブの fetch APIが利用されます。この設定はこのデバイスのみ有効です。"
display: "デザインと表示"
customize: "ホームをカスタマイズ"
dark-mode: "ダークモード"
circle-icons: "円形のアイコンを使用"
display: "Affichage et design"
customize: "Personnaliser l'Accueil"
dark-mode: "Mode nuit"
circle-icons: "Utiliser des icônes circulaires"
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
show-my-renotes: "Afficher mes republications dans le fil"
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
show-maps: "マップの自動展開"
show-maps: "Afficher la carte"
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
sound: "サウンド"
enable-sounds: "サウンドを有効にする"
sound: "Son"
enable-sounds: "Activer le son"
enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。"
volume: "ボリューム"
test: "テスト"
mobile: "モバイル"
volume: "Volume"
test: "Test"
mobile: "Mobile"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
language: "言語"
pick-language: "言語を選択"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
language: "Langue"
pick-language: "Sélectionner une langue"
recommended: "Recommandé"
auto: "Automatique"
specify-language: "Spécifier la langue"
language-desc: "変更はページの再度読み込み後に反映されます。"
cache: "キャッシュ"
clean-cache: "クリーンアップ"
cache: "Cache"
clean-cache: "Nettoyage"
cache-warn: "クリーンアップを行うと、ブラウザに記憶されたアカウント情報のキャッシュ、書きかけの投稿・返信・メッセージ、およびその他のデータ(設定情報含む)が削除されます。クリーンアップを行った後はページを再度読み込みする必要があります。"
cache-cleared: "キャッシュを削除しました"
cache-cleared-desc: "ページを再度読み込みしてください。"
cache-cleared: "Cache nettoyé"
cache-cleared-desc: "Veuillez recharger la page."
auto-watch: "投稿の自動ウォッチ"
auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。"
about: "Misskeyについて"
operator: "このサーバーの運営者"
update: "Misskey Update"
version: "バージョン:"
latest-version: "最新のバージョン:"
update-checking: "アップデートを確認中"
do-update: "アップデートを確認"
update-settings: "詳細設定"
about: "À propose de Misskey"
operator: "L'admin de cette instance"
update: "Mise à jour de Misskey"
version: "Version :"
latest-version: "Dernière version :"
update-checking: "Recherche de mises à jour"
do-update: "Rechercher des mises à jour"
update-settings: "Paramètres avancés"
prevent-update: "アップデートを延期する(非推奨)"
prevent-update-desc: "この設定をオンにしてもアップデートが反映される場合があります。この設定はこのデバイスのみ有効です。"
no-updates: "利用可能な更新はありません"
no-updates-desc: "お使いのMisskeyは最新です。"
update-available: "新しいバージョンが利用可能です"
no-updates: "Aucune mise à jour disponible"
no-updates-desc: "Votre Misskey est à jour."
update-available: "Nouvelle version disponible !"
update-available-desc: "ページを再度読み込みすると更新が適用されます。"
advanced-settings: "高度な設定"
debug-mode: "デバッグモードを有効にする"
debug-mode-desc: "この設定はブラウザに記憶されます。"
experimental: "実験的機能を有効にする"
advanced-settings: "Réglages avancés"
debug-mode: "Activer le mode debug"
debug-mode-desc: "Ce paramètre est stocké dans le navigateur."
experimental: "Activer les fonctionnalités expérimentales"
experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。"
tools: "ツール"
task-manager: "タスクマネージャ"
third-parties: "サードパーティ"
tools: "Outils"
task-manager: "Gestionnaire de tâches"
third-parties: "Services tiers"
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..."
@@ -476,10 +500,10 @@ desktop/views/components/settings.api.vue:
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
regenerate-token: "Regenerer le token"
token: "Token:"
token: "Jeton :"
enter-password: "Veuillez entrer le mot de passe"
desktop/views/components/settings.app.vue:
no-apps: "Aucune application authorisée"
desktop/views/components/settings.apps.vue:
no-apps: "Aucune application autorisée"
desktop/views/components/settings.mute.vue:
no-users: "Aucun utilisateurs mis en sourdine"
desktop/views/components/settings.password.vue:
@@ -497,31 +521,33 @@ desktop/views/components/settings.profile.vue:
description: "Description"
birthday: "Date de naissance"
save: "Mettre à jour le profil"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
is-bot: "Ce compte est un Bot"
is-cat: "Ce compte est un Chat"
desktop/views/components/sub-note-content.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
media-count: "{}つのメディア"
poll: "投票"
private: "cette publication est privée"
deleted: "cette publication a été supprimée"
media-count: "{} médias attachés"
poll: "Sondage"
desktop/views/components/taskmanager.vue:
title: "タスクマネージャ"
title: "Gestionnaire de tâches"
desktop/views/components/timeline.vue:
home: "ホーム"
local: "ローカル"
global: "グローバル"
list: "リスト"
home: "Accueil"
local: "Local"
global: "Global"
list: "Listes"
desktop/views/components/ui.header.account.vue:
profile: "Votre profil"
drive: "Drive"
favorites: "Favorites"
lists: "リスト"
lists: "Listes"
follow-requests: "Demandes de suivi"
customize: "Modifications"
settings: "Réglages"
signout: "Déconnexion"
dark: "Fall in dark"
desktop/views/components/ui.header.nav.vue:
home: "Accueil"
deck: "デッキ"
messaging: "Messages"
game: "Jeux"
desktop/views/components/ui.header.notifications.vue:
@@ -530,36 +556,48 @@ desktop/views/components/ui.header.post.vue:
post: "Composer un nouveau post"
desktop/views/components/ui.header.search.vue:
placeholder: "Chercher"
desktop/views/components/received-follow-requests-window.vue:
title: "Demandes de suivi"
accept: "Approuver"
reject: "Refuser"
desktop/views/components/user-lists-window.vue:
create-list: "リストを作成"
title: "Listes de l'utilisateur"
create-list: "Créer une liste"
desktop/views/components/user-preview.vue:
notes: "投稿"
following: "フォロー"
followers: "フォロワー"
notes: "Publications"
following: "Abonné à"
followers: "Abonnés"
desktop/views/components/users-list.vue:
all: "すべて"
iknow: "知り合い"
load-more: "もっと"
fetching: "読み込んでいます"
all: "Tout"
iknow: "Vous connaissez"
load-more: "Afficher plus"
fetching: "Chargement ..."
desktop/views/components/users-list-item.vue:
followed: "フォローされています"
followed: "vous suit"
desktop/views/components/window.vue:
popout: "ポップアウト"
close: "閉じる"
close: "Fermer"
desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー"
desktop/views/pages/deck/deck.note.vue:
reposted-by: "Reposté par {}"
private: "cette publication est privée"
deleted: "cette publication a été supprimée"
desktop/views/pages/welcome.vue:
about: "詳しく..."
gotit: "わかった"
signin: "ログイン"
signup: "新規登録"
signin-button: "やってる"
signup-button: "やる"
timeline: "タイムライン"
about: "à propos"
gotit: "J'ai compris !"
signin: "Connexion"
signup: "S'enregistrer"
signin-button: "Se connecter"
signup-button: "S'inscrire"
timeline: "Fil d'actualité"
desktop/views/pages/drive.vue:
title: "Misskey Drive"
title: "Lecteur de Misskey"
desktop/views/pages/favorites.vue:
more: "さらに読み込む"
more: "Plus de résultats"
desktop/views/pages/home-customize.vue:
title: "ホームのカスタマイズ"
title: "Personnaliser l'Accueil"
desktop/views/pages/note.vue:
prev: "Note précédente"
next: "Note suivante"
@@ -569,9 +607,9 @@ desktop/views/pages/selectdrive.vue:
cancel: "Annuler"
upload: "Uploader un ou plusieurs fichier(s) depuis votre PC"
desktop/views/pages/user-list.users.vue:
users: "ユーザー"
add-user: "ユーザーを追加"
username: "ユーザー名"
users: "Utilisateurs"
add-user: "Ajouter un utilisateur"
username: "Nom d'utilisateur"
desktop/views/pages/user/user.followers-you-know.vue:
title: "Abonnés que vous connaissez"
loading: "Chargement en cours"
@@ -599,10 +637,10 @@ desktop/views/pages/user/user.profile.vue:
muted: "Muting"
unmute: "Enlever la sourdine"
desktop/views/pages/user/user.timeline.vue:
default: "投稿"
with-replies: "投稿と返信"
with-media: "メディア"
empty: "このユーザーはまだ何も投稿していないようです。"
default: "Publications"
with-replies: "Publications et réponses"
with-media: "Média"
empty: "Cet utilisateur n'a rien posté encore."
desktop/views/widgets/messaging.vue:
title: "Messagerie"
desktop/views/widgets/notifications.vue:
@@ -616,8 +654,8 @@ desktop/views/widgets/post-form.vue:
title: "Post"
note: "Post"
desktop/views/widgets/profile.vue:
update-banner: "クリックでバナー編集"
update-avatar: "クリックでアバター編集"
update-banner: "Cliquer pour éditer votre bannière"
update-avatar: "Cliquer pour éditer votre avatar"
desktop/views/widgets/trends.vue:
title: "Tendances"
refresh: "Afficher d'autres"
@@ -636,14 +674,14 @@ mobile/views/components/drive.vue:
nothing-in-drive: "Rien"
folder-is-empty: "Ce dossier est vide"
prompt: "何をしますか?(数字を入力してください): <1 → ファイルをアップロード | 2 → ファイルをURLでアップロード | 3 → フォルダ作成 | 4 → このフォルダ名を変更 | 5 → このフォルダを移動 | 6 → このフォルダを削除>"
deletion-alert: "ごめんなさい!フォルダの削除は未実装です...。"
folder-name: "フォルダー名"
deletion-alert: "Désolé ! La suppression dun dossier nest pas encore implémentée."
folder-name: "Nom du dossier"
root-rename-alert: "現在いる場所はルートで、フォルダではないため名前の変更はできません。名前を変更したいフォルダに移動してからやってください。"
root-move-alert: "現在いる場所はルートで、フォルダではないため移動はできません。移動したいフォルダに移動してからやってください。"
url-prompt: "アップロードしたいファイルのURL"
uploading: "アップロードをリクエストしました。アップロードが完了するまで時間がかかる場合があります。"
mobile/views/components/drive-file-detail.vue:
rename: "名前を変更"
rename: "Renommer"
mobile/views/components/drive-file-chooser.vue:
select-file: "Choisissez un fichier"
mobile/views/components/drive-folder-chooser.vue:
@@ -655,67 +693,75 @@ mobile/views/components/drive.file-detail.vue:
hash: "Hash (md5)"
exif: "EXIF"
mobile/views/components/follow-button.vue:
following: "フォロー中"
follow: "Suivre"
unfollow: "Ne plus suivre"
request-pending: "フォロー許可待ち"
follow-request: "Demande d'abonnement"
mobile/views/components/friends-maker.vue:
title: "気になるユーザーをフォロー"
title: "Abonnez-vous aux utilisateurs"
empty: "おすすめのユーザーは見つかりませんでした。"
fetching: "読み込んでいます"
refresh: "もっと見る"
close: "閉じる"
fetching: "Chargement"
refresh: "Voir plus"
close: "Fermer"
mobile/views/components/note.vue:
reposted-by: "Renoté par {}"
more: "もっと見る"
less: "隠す"
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
location: "位置情報"
more: "Voir plus"
less: "Masquer"
private: "cette publication est privée"
deleted: "cette publication a été supprimée"
location: "Géolocalisation"
mobile/views/components/note-detail.vue:
reply: "Répondre"
reaction: "Réaction"
reposted-by: "{}がRenote"
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
location: "位置情報"
reposted-by: "Republié par {}"
private: "cette publication est privée"
deleted: "cette publication a été supprimée"
location: "Lieu"
mobile/views/components/note-preview.vue:
admin: "admin"
bot: "bot"
cat: "cat"
cat: "chat"
mobile/views/components/note-sub.vue:
admin: "admin"
bot: "bot"
cat: "cat"
cat: "chat"
mobile/views/components/notes.vue:
failed: "読み込みに失敗しました。"
retry: "リトライ"
failed: "Échec du chargement."
retry: "Réessayer"
mobile/views/components/notifications.vue:
more: "Plus"
empty: "Pas de notifications"
mobile/views/components/post-form.vue:
add-visible-user: "ユーザーを追加"
add-visible-user: "Ajouter un utilisateur"
submit: "Poster"
reply: "返信"
renote: "Renote"
renote-placeholder: "この投稿を引用... (オプション)"
reply: "Répondre"
renote: "Republier"
quote-placeholder: "Citer ce billet ... (Facultatif)"
reply-placeholder: "Répondre à cette note"
cw-placeholder: "内容への注釈 (オプション)"
location-alert: "お使いの端末は位置情報に対応していません"
error: "エラー"
username-prompt: "ユーザー名を入力してください"
location-alert: "Votre appareil ne prend pas en charge les services de localisation"
error: "Erreur"
username-prompt: "Saisir un nom d'utilisateur"
mobile/views/components/sub-note-content.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
media-count: "{}つのメディア"
poll: "Sondage"
private: "cette publication est privée"
deleted: "cette publication a été supprimée"
media-count: "{} médias attachés"
poll: "アンケート"
mobile/views/components/timeline.vue:
empty: "Pas de notes"
load-more: "Afficher plus"
mobile/views/components/ui.nav.vue:
home: "Accueil"
timeline: "Fil d'actualité"
notifications: "Notifications"
messaging: "Messages"
follow-requests: "Demandes d'abonnement"
search: "Rechercher"
drive: "Drive"
favorites: "Favoris"
user-lists: "Listes"
widgets: "Modules"
game: "Jeux"
darkmode: "Mode nuit"
settings: "Réglages"
about: "À propose de Misskey"
mobile/views/components/user-timeline.vue:
@@ -726,20 +772,30 @@ mobile/views/components/users-list.vue:
all: "Tout"
known: "Vous connaissez"
load-more: "Afficher plus"
mobile/views/pages/favorites.vue:
title: "Favoris"
mobile/views/pages/user-lists.vue:
title: "Listes"
enter-list-name: "Nom de la liste"
mobile/views/pages/drive.vue:
drive: "Drive"
more: "Afficher plus ..."
mobile/views/pages/followers.vue:
followers-of: "Abonnés de {}"
mobile/views/pages/following.vue:
following-of: "Abonnements de {}"
mobile/views/pages/home.vue:
home: "ホーム"
local: "ローカル"
global: "グローバル"
home: "Accueil"
local: "Local"
global: "Global"
mobile/views/pages/messaging.vue:
messaging: "Messagerie"
mobile/views/pages/messaging-room.vue:
messaging: "Messagerie"
mobile/views/pages/received-follow-requests.vue:
title: "Demandes d'abonnement"
accept: "Approuver"
reject: "Refuser"
mobile/views/pages/note.vue:
title: "Post"
prev: "Note précedante"
@@ -748,19 +804,19 @@ 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/settings/settings.profile.vue:
title: "プロフィール"
name: "名前"
account: "アカウント"
location: "場所"
description: "自己紹介"
birthday: "誕生日"
avatar: "アイコン"
banner: "バナー"
is-cat: "このアカウントはCatです"
save: "保存"
saved: "プロフィールを保存しました"
uploading: "アップロード中"
upload-failed: "アップロードに失敗しました"
title: "Profil"
name: "Nom"
account: "Compte"
location: "Lieu"
description: "Description"
birthday: "Date de naissance"
avatar: "Avatar"
banner: "Bannière"
is-cat: "Ce compte est un Bot"
save: "Mettre à jour le profil"
saved: "Profil mis à jour avec succès"
uploading: "En cours d'envoi"
upload-failed: "Échec de l'envoi"
mobile/views/pages/search.vue:
search: "Chercher"
empty: "Aucun message trouvé pour '{}' "
@@ -768,39 +824,39 @@ mobile/views/pages/selectdrive.vue:
select-file: "Choisissez un fichier"
mobile/views/pages/settings.vue:
signed-in-as: "Connecté en tant que {}"
lang: "言語"
lang-tip: "変更はページの再読み込み後に反映されます。"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
design: "デザインと表示"
dark-mode: "ダークモード"
i-am-under-limited-internet: "私は通信を制限されている"
circle-icons: "円形のアイコンを使用"
timeline: "タイムライン"
lang: "Langue"
lang-tip: "Le rechargement de la page est requis afin d'appliquer les modifications."
recommended: "Recommandé"
auto: "Automatique"
specify-language: "Spécifier la langue"
design: "Affichage et design"
dark-mode: "Mode nuit"
i-am-under-limited-internet: "J'ai un accès Internet limité"
circle-icons: "Utiliser des icônes circulaires"
timeline: "Fil d'actualité"
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteを表示する"
show-my-renotes: "Afficher mes republications"
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
post-style: "投稿の表示スタイル"
post-style-standard: "標準"
post-style-smart: "スマート"
behavior: "動作"
fetch-on-scroll: "スクロールで自動読み込み"
post-style: "Style de la publication"
post-style-standard: "Standard"
post-style-smart: "Intelligent"
behavior: "Comportement"
fetch-on-scroll: "Chargement lors du défilement"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
load-raw-images: "添付された画像を高画質で表示する"
load-remote-media: "リモートサーバーのメディアを表示する"
twitter: "Twitter連携"
twitter-connect: "Twitterアカウントに接続する"
twitter-reconnect: "再接続する"
twitter-disconnect: "切断する"
update: "Misskey Update"
version: "バージョン:"
latest-version: "最新のバージョン:"
update-checking: "アップデートを確認中"
check-for-updates: "アップデートを確認"
no-updates: "利用可能な更新はありません"
no-updates-desc: "お使いのMisskeyは最新です。"
update-available: "新しいバージョンが利用可能です"
load-raw-images: "Afficher les photos jointes en haute qualité"
load-remote-media: "Afficher les médias sur le serveur distant"
twitter: "Intégration à Twitter"
twitter-connect: "Se connecter à votre compte Twitter"
twitter-reconnect: "Reconnecter"
twitter-disconnect: "Déconnexion"
update: "Mise à jour de Misskey"
version: "Version :"
latest-version: "Dernière version :"
update-checking: "Recherche de mises à jour"
check-for-updates: "Fréquence de vérification"
no-updates: "Aucune mise à jour disponible"
no-updates-desc: "Votre Misskey est à jour."
update-available: "Nouvelle version disponible !"
update-available-desc: "ページを再度読み込みすると更新が適用されます。"
settings: "Réglages"
signout: "Déconnexion"

View File

@@ -48,26 +48,45 @@ common:
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
widgets:
analog-clock: "アナログ時計"
profile: "プロフィール"
calendar: "カレンダー"
timemachine: "カレンダー(タイムマシン)"
activity: "アクティビティ"
rss: "RSSリーダー"
memo: "メモ"
memo: "付箋"
trends: "トレンド"
photo-stream: "フォトストリーム"
posts-monitor: "投稿チャート"
slideshow: "スライドショー"
version: "バージョン"
broadcast: "ブロードキャスト"
notifications: "通知"
users: "おすすめユーザー"
polls: "投票"
polls: "アンケート"
post-form: "投稿フォーム"
messaging: "メッセージ"
server: "サーバー情報"
donation: "寄付のお願い"
nav: "ナビゲーション"
tips: "ヒント"
hashtags: "ハッシュタグ"
deck:
widgets: "ウィジェット"
home: "ホーム"
local: "ローカル"
global: "グローバル"
notifications: "通知"
list: "リスト"
swap-left: "左に移動"
swap-right: "右に移動"
swap-up: "上に移動"
swap-down: "下に移動"
remove: "カラムを削除"
add-column: "カラムを追加"
rename: "名前を変更"
stack-left: "左に重ねる"
pop-right: "右に出す"
common/views/components/connect-failed.vue:
title: "サーバーに接続できません"
description: "インターネット回線に問題があるか、サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから{再度お試し}ください。"
@@ -133,11 +152,11 @@ common/views/components/poll.vue:
show-result: "結果を見る"
voted: "投票済み"
common/views/components/poll-editor.vue:
no-only-one-choice: "投票には、選択肢が最低2つ必要です"
no-only-one-choice: "アンケートには、選択肢が最低2つ必要です"
choice-n: "選択肢{}"
remove: "この選択肢を削除"
add: "+選択肢を追加"
destroy: "投票を破棄"
destroy: "アンケートを破棄"
common/views/components/reaction-picker.vue:
choose-reaction: "リアクションを選択"
common/views/components/signin.vue:
@@ -203,11 +222,17 @@ common/views/widgets/donation.vue:
common/views/widgets/photo-stream.vue:
title: "フォトストリーム"
no-photos: "写真はありません"
common/views/widgets/posts-monitor.vue:
title: "投稿チャート"
toggle: "表示を切り替え"
common/views/widgets/hashtags.vue:
title: "ハッシュタグ"
count: "{}人が投稿"
common/views/widgets/server.vue:
title: "サーバー情報"
toggle: "表示を切り替え"
common/views/widgets/memo.vue:
title: "メモ"
title: "付箋"
memo: "ここに書いて!"
save: "保存"
desktop/views/components/activity.chart.vue:
@@ -289,8 +314,10 @@ desktop/views/components/drive.vue:
upload: "ファイルをアップロード"
url-upload: "URLからアップロード"
desktop/views/components/follow-button.vue:
unfollow: "フォロー解除"
follow: "フォローする"
following: "フォロー"
follow: "フォロー"
request-pending: "フォロー許可待ち"
follow-request: "フォロー申請"
desktop/views/components/followers-window.vue:
followers: "{} のフォロワー"
desktop/views/components/followers.vue:
@@ -326,9 +353,6 @@ desktop/views/components/note-detail.vue:
location: "位置情報"
renote: "Renote"
add-reaction: "リアクション"
desktop/views/components/note-detail.sub.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/components/notes.note.vue:
reposted-by: "{}がRenote"
reply: "返信"
@@ -360,7 +384,7 @@ desktop/views/components/post-form.vue:
attach-media-from-drive: "ドライブからメディアを添付"
attach-cancel: "添付取り消し"
insert-a-kao: "v(‘ω’)v"
create-poll: "投票を作成"
create-poll: "アンケートを作成"
text-remain: "残り{}文字"
desktop/views/components/post-form-window.vue:
note: "新規投稿"
@@ -478,7 +502,7 @@ desktop/views/components/settings.api.vue:
regenerate-token: "トークンを再生成"
token: "Token:"
enter-password: "パスワードを入力してください"
desktop/views/components/settings.app.vue:
desktop/views/components/settings.apps.vue:
no-apps: "連携しているアプリケーションはありません"
desktop/views/components/settings.mute.vue:
no-users: "ミュートしているユーザーはいません"
@@ -503,7 +527,7 @@ desktop/views/components/sub-note-content.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
media-count: "{}つのメディア"
poll: "投票"
poll: "アンケート"
desktop/views/components/taskmanager.vue:
title: "タスクマネージャ"
desktop/views/components/timeline.vue:
@@ -516,12 +540,14 @@ desktop/views/components/ui.header.account.vue:
drive: "ドライブ"
favorites: "お気に入り"
lists: "リスト"
follow-requests: "フォロー申請"
customize: "カスタマイズ"
settings: "設定"
signout: "サインアウト"
dark: "闇に飲まれる"
desktop/views/components/ui.header.nav.vue:
home: "ホーム"
deck: "デッキ"
messaging: "メッセージ"
game: "ゲーム"
desktop/views/components/ui.header.notifications.vue:
@@ -530,7 +556,12 @@ desktop/views/components/ui.header.post.vue:
post: "新規投稿"
desktop/views/components/ui.header.search.vue:
placeholder: "検索"
desktop/views/components/received-follow-requests-window.vue:
title: "フォロー申請"
accept: "承認"
reject: "拒否"
desktop/views/components/user-lists-window.vue:
title: "リスト"
create-list: "リストを作成"
desktop/views/components/user-preview.vue:
notes: "投稿"
@@ -546,6 +577,13 @@ desktop/views/components/users-list-item.vue:
desktop/views/components/window.vue:
popout: "ポップアウト"
close: "閉じる"
desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー"
desktop/views/pages/deck/deck.note.vue:
reposted-by: "{}がRenote"
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/pages/welcome.vue:
about: "詳しく..."
gotit: "わかった"
@@ -609,7 +647,7 @@ desktop/views/widgets/notifications.vue:
title: "通知"
settings: "通知の設定"
desktop/views/widgets/polls.vue:
title: "投票"
title: "アンケート"
refresh: "他を見る"
nothing: "ありません!"
desktop/views/widgets/post-form.vue:
@@ -655,8 +693,10 @@ mobile/views/components/drive.file-detail.vue:
hash: "ハッシュ (md5)"
exif: "EXIF"
mobile/views/components/follow-button.vue:
following: "フォロー中"
follow: "フォロー"
unfollow: "フォロー解除"
request-pending: "フォロー許可待ち"
follow-request: "フォロー申請"
mobile/views/components/friends-maker.vue:
title: "気になるユーザーをフォロー"
empty: "おすすめのユーザーは見つかりませんでした。"
@@ -696,7 +736,7 @@ mobile/views/components/post-form.vue:
submit: "投稿"
reply: "返信"
renote: "Renote"
renote-placeholder: "この投稿を引用... (オプション)"
quote-placeholder: "この投稿を引用... (オプション)"
reply-placeholder: "この投稿への返信..."
cw-placeholder: "内容への注釈 (オプション)"
location-alert: "お使いの端末は位置情報に対応していません"
@@ -706,16 +746,22 @@ mobile/views/components/sub-note-content.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
media-count: "{}つのメディア"
poll: "投票"
poll: "アンケート"
mobile/views/components/timeline.vue:
empty: "投稿がありません"
load-more: "もっと"
mobile/views/components/ui.nav.vue:
home: "ホーム"
timeline: "タイムライン"
notifications: "通知"
messaging: "メッセージ"
follow-requests: "フォロー申請"
search: "検索"
drive: "ドライブ"
favorites: "お気に入り"
user-lists: "リスト"
widgets: "ウィジェット"
game: "ゲーム"
darkmode: "ダークモード"
settings: "設定"
about: "Misskeyについて"
mobile/views/components/user-timeline.vue:
@@ -726,8 +772,14 @@ mobile/views/components/users-list.vue:
all: "すべて"
known: "知り合い"
load-more: "もっと"
mobile/views/pages/favorites.vue:
title: "お気に入り"
mobile/views/pages/user-lists.vue:
title: "リスト"
enter-list-name: "リスト名を入力してください"
mobile/views/pages/drive.vue:
drive: "ドライブ"
more: "もっと見る"
mobile/views/pages/followers.vue:
followers-of: "{}のフォロワー"
mobile/views/pages/following.vue:
@@ -740,6 +792,10 @@ mobile/views/pages/messaging.vue:
messaging: "メッセージ"
mobile/views/pages/messaging-room.vue:
messaging: "メッセージ"
mobile/views/pages/received-follow-requests.vue:
title: "フォロー申請"
accept: "承認"
reject: "拒否"
mobile/views/pages/note.vue:
title: "投稿"
prev: "前の投稿"

View File

@@ -3,7 +3,7 @@ meta:
divider: ""
common:
misskey: "A planet of fediverse"
misskey: "A of fediverse"
about-title: "A ⭐ of fediverse."
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
@@ -54,26 +54,46 @@ common:
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
widgets:
analog-clock: "アナログ時計"
profile: "プロフィール"
calendar: "カレンダー"
timemachine: "カレンダー(タイムマシン)"
activity: "アクティビティ"
rss: "RSSリーダー"
memo: "メモ"
memo: "付箋"
trends: "トレンド"
photo-stream: "フォトストリーム"
posts-monitor: "投稿チャート"
slideshow: "スライドショー"
version: "バージョン"
broadcast: "ブロードキャスト"
notifications: "通知"
users: "おすすめユーザー"
polls: "投票"
polls: "アンケート"
post-form: "投稿フォーム"
messaging: "メッセージ"
server: "サーバー情報"
donation: "寄付のお願い"
nav: "ナビゲーション"
tips: "ヒント"
hashtags: "ハッシュタグ"
deck:
widgets: "ウィジェット"
home: "ホーム"
local: "ローカル"
global: "グローバル"
notifications: "通知"
list: "リスト"
swap-left: "左に移動"
swap-right: "右に移動"
swap-up: "上に移動"
swap-down: "下に移動"
remove: "カラムを削除"
add-column: "カラムを追加"
rename: "名前を変更"
stack-left: "左に重ねる"
pop-right: "右に出す"
common/views/components/connect-failed.vue:
title: "サーバーに接続できません"
@@ -149,11 +169,11 @@ common/views/components/poll.vue:
voted: "投票済み"
common/views/components/poll-editor.vue:
no-only-one-choice: "投票には、選択肢が最低2つ必要です"
no-only-one-choice: "アンケートには、選択肢が最低2つ必要です"
choice-n: "選択肢{}"
remove: "この選択肢を削除"
add: "+選択肢を追加"
destroy: "投票を破棄"
destroy: "アンケートを破棄"
common/views/components/reaction-picker.vue:
choose-reaction: "リアクションを選択"
@@ -231,12 +251,21 @@ common/views/widgets/photo-stream.vue:
title: "フォトストリーム"
no-photos: "写真はありません"
common/views/widgets/posts-monitor.vue:
title: "投稿チャート"
toggle: "表示を切り替え"
common/views/widgets/hashtags.vue:
title: "ハッシュタグ"
count: "{}人が投稿"
empty: "トレンドなし"
common/views/widgets/server.vue:
title: "サーバー情報"
toggle: "表示を切り替え"
common/views/widgets/memo.vue:
title: "メモ"
title: "付箋"
memo: "ここに書いて!"
save: "保存"
@@ -330,8 +359,10 @@ desktop/views/components/drive.vue:
url-upload: "URLからアップロード"
desktop/views/components/follow-button.vue:
unfollow: "フォロー解除"
follow: "フォローする"
following: "フォロー"
follow: "フォロー"
request-pending: "フォロー許可待ち"
follow-request: "フォロー申請"
desktop/views/components/followers-window.vue:
followers: "{} のフォロワー"
@@ -379,10 +410,6 @@ desktop/views/components/note-detail.vue:
renote: "Renote"
add-reaction: "リアクション"
desktop/views/components/note-detail.sub.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/components/notes.note.vue:
reposted-by: "{}がRenote"
reply: "返信"
@@ -417,7 +444,7 @@ desktop/views/components/post-form.vue:
attach-media-from-drive: "ドライブからメディアを添付"
attach-cancel: "添付取り消し"
insert-a-kao: "v(‘ω’)v"
create-poll: "投票を作成"
create-poll: "アンケートを作成"
text-remain: "残り{}文字"
desktop/views/components/post-form-window.vue:
@@ -554,7 +581,7 @@ desktop/views/components/settings.api.vue:
token: "Token:"
enter-password: "パスワードを入力してください"
desktop/views/components/settings.app.vue:
desktop/views/components/settings.apps.vue:
no-apps: "連携しているアプリケーションはありません"
desktop/views/components/settings.mute.vue:
@@ -583,7 +610,7 @@ desktop/views/components/sub-note-content.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
media-count: "{}つのメディア"
poll: "投票"
poll: "アンケート"
desktop/views/components/taskmanager.vue:
title: "タスクマネージャ"
@@ -599,6 +626,7 @@ desktop/views/components/ui.header.account.vue:
drive: "ドライブ"
favorites: "お気に入り"
lists: "リスト"
follow-requests: "フォロー申請"
customize: "カスタマイズ"
settings: "設定"
signout: "サインアウト"
@@ -606,6 +634,7 @@ desktop/views/components/ui.header.account.vue:
desktop/views/components/ui.header.nav.vue:
home: "ホーム"
deck: "デッキ"
messaging: "メッセージ"
game: "ゲーム"
@@ -618,7 +647,13 @@ desktop/views/components/ui.header.post.vue:
desktop/views/components/ui.header.search.vue:
placeholder: "検索"
desktop/views/components/received-follow-requests-window.vue:
title: "フォロー申請"
accept: "承認"
reject: "拒否"
desktop/views/components/user-lists-window.vue:
title: "リスト"
create-list: "リストを作成"
desktop/views/components/user-preview.vue:
@@ -639,6 +674,15 @@ desktop/views/components/window.vue:
popout: "ポップアウト"
close: "閉じる"
desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー"
desktop/views/pages/deck/deck.note.vue:
reposted-by: "{}がRenote"
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/pages/welcome.vue:
about: "詳しく..."
gotit: "わかった"
@@ -718,7 +762,7 @@ desktop/views/widgets/notifications.vue:
settings: "通知の設定"
desktop/views/widgets/polls.vue:
title: "投票"
title: "アンケート"
refresh: "他を見る"
nothing: "ありません!"
@@ -774,8 +818,10 @@ mobile/views/components/drive.file-detail.vue:
exif: "EXIF"
mobile/views/components/follow-button.vue:
following: "フォロー中"
follow: "フォロー"
unfollow: "フォロー解除"
request-pending: "フォロー許可待ち"
follow-request: "フォロー申請"
mobile/views/components/friends-maker.vue:
title: "気になるユーザーをフォロー"
@@ -823,7 +869,7 @@ mobile/views/components/post-form.vue:
submit: "投稿"
reply: "返信"
renote: "Renote"
renote-placeholder: "この投稿を引用... (オプション)"
quote-placeholder: "この投稿を引用... (オプション)"
reply-placeholder: "この投稿への返信..."
cw-placeholder: "内容への注釈 (オプション)"
location-alert: "お使いの端末は位置情報に対応していません"
@@ -834,18 +880,24 @@ mobile/views/components/sub-note-content.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
media-count: "{}つのメディア"
poll: "投票"
poll: "アンケート"
mobile/views/components/timeline.vue:
empty: "投稿がありません"
load-more: "もっと"
mobile/views/components/ui.nav.vue:
home: "ホーム"
timeline: "タイムライン"
notifications: "通知"
messaging: "メッセージ"
follow-requests: "フォロー申請"
search: "検索"
drive: "ドライブ"
favorites: "お気に入り"
user-lists: "リスト"
widgets: "ウィジェット"
game: "ゲーム"
darkmode: "ダークモード"
settings: "設定"
about: "Misskeyについて"
@@ -859,8 +911,16 @@ mobile/views/components/users-list.vue:
known: "知り合い"
load-more: "もっと"
mobile/views/pages/favorites.vue:
title: "お気に入り"
mobile/views/pages/user-lists.vue:
title: "リスト"
enter-list-name: "リスト名を入力してください"
mobile/views/pages/drive.vue:
drive: "ドライブ"
more: "もっと見る"
mobile/views/pages/followers.vue:
followers-of: "{}のフォロワー"
@@ -879,6 +939,11 @@ mobile/views/pages/messaging.vue:
mobile/views/pages/messaging-room.vue:
messaging: "メッセージ"
mobile/views/pages/received-follow-requests.vue:
title: "フォロー申請"
accept: "承認"
reject: "拒否"
mobile/views/pages/note.vue:
title: "投稿"
prev: "前の投稿"

View File

@@ -48,26 +48,45 @@ common:
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
widgets:
analog-clock: "アナログ時計"
profile: "プロフィール"
calendar: "カレンダー"
timemachine: "カレンダー(タイムマシン)"
activity: "アクティビティ"
rss: "RSSリーダー"
memo: "メモ"
memo: "付箋"
trends: "トレンド"
photo-stream: "フォトストリーム"
posts-monitor: "投稿チャート"
slideshow: "スライドショー"
version: "バージョン"
broadcast: "ブロードキャスト"
notifications: "通知"
users: "おすすめユーザー"
polls: "投票"
polls: "アンケート"
post-form: "投稿フォーム"
messaging: "メッセージ"
server: "サーバー情報"
donation: "寄付のお願い"
nav: "ナビゲーション"
tips: "ヒント"
hashtags: "ハッシュタグ"
deck:
widgets: "ウィジェット"
home: "ホーム"
local: "ローカル"
global: "グローバル"
notifications: "通知"
list: "リスト"
swap-left: "左に移動"
swap-right: "右に移動"
swap-up: "上に移動"
swap-down: "下に移動"
remove: "カラムを削除"
add-column: "カラムを追加"
rename: "名前を変更"
stack-left: "左に重ねる"
pop-right: "右に出す"
common/views/components/connect-failed.vue:
title: "サーバーに接続できません"
description: "インターネット回線に問題があるか、サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから{再度お試し}ください。"
@@ -133,11 +152,11 @@ common/views/components/poll.vue:
show-result: "結果を見る"
voted: "投票済み"
common/views/components/poll-editor.vue:
no-only-one-choice: "投票には、選択肢が最低2つ必要です"
no-only-one-choice: "アンケートには、選択肢が最低2つ必要です"
choice-n: "選択肢{}"
remove: "この選択肢を削除"
add: "+選択肢を追加"
destroy: "投票を破棄"
destroy: "アンケートを破棄"
common/views/components/reaction-picker.vue:
choose-reaction: "リアクションを選択"
common/views/components/signin.vue:
@@ -203,11 +222,17 @@ common/views/widgets/donation.vue:
common/views/widgets/photo-stream.vue:
title: "フォトストリーム"
no-photos: "写真はありません"
common/views/widgets/posts-monitor.vue:
title: "投稿チャート"
toggle: "表示を切り替え"
common/views/widgets/hashtags.vue:
title: "ハッシュタグ"
count: "{}人が投稿"
common/views/widgets/server.vue:
title: "サーバー情報"
toggle: "表示を切り替え"
common/views/widgets/memo.vue:
title: "メモ"
title: "付箋"
memo: "ここに書いて!"
save: "保存"
desktop/views/components/activity.chart.vue:
@@ -289,8 +314,10 @@ desktop/views/components/drive.vue:
upload: "ファイルをアップロード"
url-upload: "URLからアップロード"
desktop/views/components/follow-button.vue:
unfollow: "フォロー解除"
follow: "フォローする"
following: "フォロー"
follow: "フォロー"
request-pending: "フォロー許可待ち"
follow-request: "フォロー申請"
desktop/views/components/followers-window.vue:
followers: "{} のフォロワー"
desktop/views/components/followers.vue:
@@ -326,9 +353,6 @@ desktop/views/components/note-detail.vue:
location: "位置情報"
renote: "Renote"
add-reaction: "リアクション"
desktop/views/components/note-detail.sub.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/components/notes.note.vue:
reposted-by: "{}がRenote"
reply: "返信"
@@ -360,7 +384,7 @@ desktop/views/components/post-form.vue:
attach-media-from-drive: "ドライブからメディアを添付"
attach-cancel: "添付取り消し"
insert-a-kao: "v(‘ω’)v"
create-poll: "投票を作成"
create-poll: "アンケートを作成"
text-remain: "残り{}文字"
desktop/views/components/post-form-window.vue:
note: "新規投稿"
@@ -478,7 +502,7 @@ desktop/views/components/settings.api.vue:
regenerate-token: "トークンを再生成"
token: "Token:"
enter-password: "パスワードを入力してください"
desktop/views/components/settings.app.vue:
desktop/views/components/settings.apps.vue:
no-apps: "連携しているアプリケーションはありません"
desktop/views/components/settings.mute.vue:
no-users: "ミュートしているユーザーはいません"
@@ -503,7 +527,7 @@ desktop/views/components/sub-note-content.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
media-count: "{}つのメディア"
poll: "投票"
poll: "アンケート"
desktop/views/components/taskmanager.vue:
title: "タスクマネージャ"
desktop/views/components/timeline.vue:
@@ -516,12 +540,14 @@ desktop/views/components/ui.header.account.vue:
drive: "ドライブ"
favorites: "お気に入り"
lists: "リスト"
follow-requests: "フォロー申請"
customize: "カスタマイズ"
settings: "設定"
signout: "サインアウト"
dark: "闇に飲まれる"
desktop/views/components/ui.header.nav.vue:
home: "ホーム"
deck: "デッキ"
messaging: "メッセージ"
game: "ゲーム"
desktop/views/components/ui.header.notifications.vue:
@@ -530,7 +556,12 @@ desktop/views/components/ui.header.post.vue:
post: "新規投稿"
desktop/views/components/ui.header.search.vue:
placeholder: "検索"
desktop/views/components/received-follow-requests-window.vue:
title: "フォロー申請"
accept: "承認"
reject: "拒否"
desktop/views/components/user-lists-window.vue:
title: "リスト"
create-list: "リストを作成"
desktop/views/components/user-preview.vue:
notes: "投稿"
@@ -546,6 +577,13 @@ desktop/views/components/users-list-item.vue:
desktop/views/components/window.vue:
popout: "ポップアウト"
close: "閉じる"
desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー"
desktop/views/pages/deck/deck.note.vue:
reposted-by: "{}がRenote"
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/pages/welcome.vue:
about: "詳しく..."
gotit: "わかった"
@@ -609,7 +647,7 @@ desktop/views/widgets/notifications.vue:
title: "通知"
settings: "通知の設定"
desktop/views/widgets/polls.vue:
title: "投票"
title: "アンケート"
refresh: "他を見る"
nothing: "ありません!"
desktop/views/widgets/post-form.vue:
@@ -655,8 +693,10 @@ mobile/views/components/drive.file-detail.vue:
hash: "ハッシュ (md5)"
exif: "EXIF"
mobile/views/components/follow-button.vue:
following: "フォロー中"
follow: "フォロー"
unfollow: "フォロー解除"
request-pending: "フォロー許可待ち"
follow-request: "フォロー申請"
mobile/views/components/friends-maker.vue:
title: "気になるユーザーをフォロー"
empty: "おすすめのユーザーは見つかりませんでした。"
@@ -696,7 +736,7 @@ mobile/views/components/post-form.vue:
submit: "投稿"
reply: "返信"
renote: "Renote"
renote-placeholder: "この投稿を引用... (オプション)"
quote-placeholder: "この投稿を引用... (オプション)"
reply-placeholder: "この投稿への返信..."
cw-placeholder: "内容への注釈 (オプション)"
location-alert: "お使いの端末は位置情報に対応していません"
@@ -706,16 +746,22 @@ mobile/views/components/sub-note-content.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
media-count: "{}つのメディア"
poll: "投票"
poll: "アンケート"
mobile/views/components/timeline.vue:
empty: "投稿がありません"
load-more: "もっと"
mobile/views/components/ui.nav.vue:
home: "ホーム"
timeline: "タイムライン"
notifications: "通知"
messaging: "メッセージ"
follow-requests: "フォロー申請"
search: "検索"
drive: "ドライブ"
favorites: "お気に入り"
user-lists: "リスト"
widgets: "ウィジェット"
game: "ゲーム"
darkmode: "ダークモード"
settings: "設定"
about: "Misskeyについて"
mobile/views/components/user-timeline.vue:
@@ -726,8 +772,14 @@ mobile/views/components/users-list.vue:
all: "すべて"
known: "知り合い"
load-more: "もっと"
mobile/views/pages/favorites.vue:
title: "お気に入り"
mobile/views/pages/user-lists.vue:
title: "リスト"
enter-list-name: "リスト名を入力してください"
mobile/views/pages/drive.vue:
drive: "ドライブ"
more: "もっと見る"
mobile/views/pages/followers.vue:
followers-of: "{}のフォロワー"
mobile/views/pages/following.vue:
@@ -740,6 +792,10 @@ mobile/views/pages/messaging.vue:
messaging: "メッセージ"
mobile/views/pages/messaging-room.vue:
messaging: "メッセージ"
mobile/views/pages/received-follow-requests.vue:
title: "フォロー申請"
accept: "承認"
reject: "拒否"
mobile/views/pages/note.vue:
title: "投稿"
prev: "前の投稿"

View File

@@ -3,9 +3,9 @@ meta:
lang: "język polski"
divider: ""
common:
misskey: "A planet of fediverse"
about-title: "A ⭐ of fediverse."
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
misskey: "Planeta Fediwersum"
about-title: "⭐ Fediwersum"
about: "Dziękujemy za znalezienie Misskey. Misskey jest <b>zdecentralizowaną platformą mikroblogową</b> powstałą na Ziemi. Ponieważ działa ona w Fediwersum (uniwersum, w którego skład wchodzi wiele sieci społecznościowych), jest ona połączona z innymi platformami społecznościowymi. Spróbujesz odpocząć od zatłoczoneo miasta i zanurzyć się w nowym Internecie?"
time:
unknown: "nieznany"
future: "w przyszłości"
@@ -36,26 +36,28 @@ common:
confused: "Zmieszany"
pudding: "Pudding"
note-placeholders:
a: "今どうしてる?"
b: "何かありましたか?"
c: "何をお考えですか?"
d: "言いたいことは?"
e: "ここに書いてください"
f: "あなたが書くのを待っています..."
a: "Co robisz?"
b: "Co się wydarzyło?"
c: "Co Ci chodzi po głowie?"
d: "Czy masz coś do powiedzenia?"
e: "Napisz coś tutaj!"
f: "Czekamy, aż coś napiszesz."
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."
widgets:
analog-clock: "Zegar analogowy"
profile: "Profil"
calendar: "Kalendarz"
timemachine: "Kalendarz (wehikuł czasu)"
activity: "Aktywność"
rss: "Czytnik RSS"
memo: "Notatki"
memo: "Notatka"
trends: "Na czasie"
photo-stream: "Photostream"
posts-monitor: "Wykres wpisów"
slideshow: "Pokaz slajdów"
version: "Wersja"
broadcast: "Transmisja"
@@ -68,6 +70,23 @@ common:
donation: "Dotacje"
nav: "Nawigacja"
tips: "Wskazówki"
hashtags: "Hashtagi"
deck:
widgets: "Widżety"
home: "Strona główna"
local: "Lokalne"
global: "Globalne"
notifications: "Powiadomienia"
list: "Listy"
swap-left: "Przesuń w lewo"
swap-right: "Przesuń w prawo"
swap-up: "Przenieś w górę"
swap-down: "Przenieś w dół"
remove: "Usuń"
add-column: "Dodaj kolumnę"
rename: "Zmień nazwę"
stack-left: "左に重ねる"
pop-right: "右に出す"
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."
@@ -133,11 +152,11 @@ common/views/components/poll.vue:
show-result: "Pokaż wyniki"
voted: "Zagłosowano"
common/views/components/poll-editor.vue:
no-only-one-choice: "Musisz wprowadzić dwie lub więcej opcji."
no-only-one-choice: "Musisz wprowadzić przynajmniej dwie opcje."
choice-n: "Opcja {}"
remove: "Usuń tą opcję"
add: "+ Dodaj opcję"
destroy: "Usuń ankietę"
destroy: "Usuń ankietę"
common/views/components/reaction-picker.vue:
choose-reaction: "Wybierz reakcję"
common/views/components/signin.vue:
@@ -203,11 +222,17 @@ common/views/widgets/donation.vue:
common/views/widgets/photo-stream.vue:
title: "Photostream"
no-photos: "Brak zdjęć"
common/views/widgets/posts-monitor.vue:
title: "Wykres wpisów"
toggle: "Przełącz widok"
common/views/widgets/hashtags.vue:
title: "Hashtagi"
count: "Wspomniany przez {} użytkowników"
common/views/widgets/server.vue:
title: "Informacje o serwerze"
toggle: "Przełącz widok"
common/views/widgets/memo.vue:
title: "Notatki"
title: "Notatka"
memo: "Napisz tutaj!"
save: "Zapisz"
desktop/views/components/activity.chart.vue:
@@ -289,8 +314,10 @@ desktop/views/components/drive.vue:
upload: "Wyślij plik"
url-upload: "Wyślij z adresu URL"
desktop/views/components/follow-button.vue:
unfollow: "Przestań śledzić"
following: "Śledzisz"
follow: "Śledź"
request-pending: "Oczekiwanie na pozwolenie"
follow-request: "Poproś o śledzenie"
desktop/views/components/followers-window.vue:
followers: "Śledzący"
desktop/views/components/followers.vue:
@@ -326,9 +353,6 @@ desktop/views/components/note-detail.vue:
location: "Informacje o lokalizacji"
renote: "Udostępnienie"
add-reaction: "Dodaj reakcję"
desktop/views/components/note-detail.sub.vue:
private: "ten wpis jest prywatny"
deleted: "ten wpis został usunięty"
desktop/views/components/notes.note.vue:
reposted-by: "Udostępniono przez {}"
reply: "Odpowiedz"
@@ -346,7 +370,7 @@ desktop/views/components/notifications.vue:
desktop/views/components/post-form.vue:
reply-placeholder: "Odpowiedz na ten wpis…"
quote-placeholder: "Zacytuj ten wpis…"
submit: "投稿"
submit: "Wyślij"
reply: "Odpowiedz"
renote: "Udostępnienie"
posted: "Opublikowano!"
@@ -429,7 +453,7 @@ desktop/views/components/settings.vue:
cache-warn: "Pamięć podręczna informacji o koncie/wpisów/odpowiedzi/wiadomości/ustawień przechowywanych w przeglądarce zostanie usunięta. Będziesz musiał odświeżyć stronę po wyczyszczeniu."
cache-cleared: "Wyczyszczono pamięć podręczną"
cache-cleared-desc: "Proszę odświeżyć stronę."
auto-watch: "投稿の自動ウォッチ"
auto-watch: "Automatycznie nasłuchuj"
auto-watch-desc: "Otrzymuj natychmiastowo informacje o wpisach/odpowiedziach/reakcjach."
about: "O Misskey"
operator: "Administrator instancji"
@@ -472,13 +496,13 @@ desktop/views/components/settings.2fa.vue:
failed: "Nie udało się skonfigurować uwierzytelniania dwuetapowego, upewnij się że wprowadziłeś prawidłowy token."
info: "Od teraz, wprowadzaj token wyświetlany na urządzeniu przy każdym logowaniu do Misskey."
desktop/views/components/settings.api.vue:
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
intro: "Aby uzyskać dostęp do API, ustaw ten token jako klucz 'i' parametrów żądań."
caution: "Nie pokazuj tego tokenu osobom trzecim (nie wprowadzaj go nigdzie indziej), aby konto nie trafiło w niepowołane ręce."
regeneration-of-token: "W przypadku wycieku tokenu, możesz wygenerować nowy."
regenerate-token: "Wygeneruj nowy token"
token: "Token:"
enter-password: "Wprowadź hasło"
desktop/views/components/settings.app.vue:
desktop/views/components/settings.apps.vue:
no-apps: "Brak zautoryzowanych aplikacji"
desktop/views/components/settings.mute.vue:
no-users: "Brak wyciszonych użytkowników"
@@ -503,7 +527,7 @@ desktop/views/components/sub-note-content.vue:
private: "ten wpis jest prywatny"
deleted: "ten wpis został usunięty"
media-count: "{}zawartości multimedialnej"
poll: "Ankiety"
poll: "Ankieta"
desktop/views/components/taskmanager.vue:
title: "Menedżer zadań"
desktop/views/components/timeline.vue:
@@ -516,12 +540,14 @@ desktop/views/components/ui.header.account.vue:
drive: "Dysk"
favorites: "Ulubione"
lists: "Listy"
follow-requests: "Prośby o śledzenie"
customize: "Dostosuj"
settings: "Ustawienia"
signout: "Wyloguj się"
dark: "Sprowadź ciemność"
desktop/views/components/ui.header.nav.vue:
home: "Strona główna"
deck: "Talia"
messaging: "Wiadomości"
game: "Gra"
desktop/views/components/ui.header.notifications.vue:
@@ -530,7 +556,12 @@ desktop/views/components/ui.header.post.vue:
post: "Utwórz nowy wpis"
desktop/views/components/ui.header.search.vue:
placeholder: "Szukaj"
desktop/views/components/received-follow-requests-window.vue:
title: "Poproś o śledzenie"
accept: "Zatwierdź"
reject: "Odmów"
desktop/views/components/user-lists-window.vue:
title: "Listy"
create-list: "Utwórz listę"
desktop/views/components/user-preview.vue:
notes: "Wpisy"
@@ -546,9 +577,16 @@ desktop/views/components/users-list-item.vue:
desktop/views/components/window.vue:
popout: "Pop-out"
close: "Zamknij"
desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "Tylko wpisy z zawartością multimedialną"
is-media-view: "Widok multimediów"
desktop/views/pages/deck/deck.note.vue:
reposted-by: "Udostępniono przez {}"
private: "ten wpis jest prywatny"
deleted: "ten wpis został usunięty"
desktop/views/pages/welcome.vue:
about: "詳しく..."
gotit: "わかった"
about: "O Misskey"
gotit: "Rozumiem!"
signin: "Zaloguj się"
signup: "Zarejestruj się"
signin-button: "Zaloguj się"
@@ -655,8 +693,10 @@ mobile/views/components/drive.file-detail.vue:
hash: "Hash (md5)"
exif: "EXIF"
mobile/views/components/follow-button.vue:
following: "Śledzisz"
follow: "Śledź"
unfollow: "Przestań śledzić"
request-pending: "Oczekiwanie na pozwolenie"
follow-request: "Poproś o śledzenie"
mobile/views/components/friends-maker.vue:
title: "Zacznij śledzić ludzi takich jak Ty"
empty: "Nie znaleziono podobnych użytkowników."
@@ -696,7 +736,7 @@ mobile/views/components/post-form.vue:
submit: "Wyślij"
reply: "Odpowiedz"
renote: "Udostępnij"
renote-placeholder: "Zacytuj wpis… (nieobowiązkowe)"
quote-placeholder: "Zacytuj ten wpis… (nieobowiązkowe)"
reply-placeholder: "Odpowiedź na ten wpis…"
cw-placeholder: "Treść ostrzeżenia (opcjonalnie)"
location-alert: "Twoje urządzenie nie pozwala na przekazywanie informacji o lokalizacji"
@@ -711,11 +751,17 @@ mobile/views/components/timeline.vue:
empty: "Brak wpisów"
load-more: "Więcej"
mobile/views/components/ui.nav.vue:
home: "Strona główna"
timeline: "Oś czasu"
notifications: "Powiadomienia"
messaging: "Wiadomości"
follow-requests: "Prośby o śledzenie"
search: "Szukaj"
drive: "Dysk"
favorites: "Ulubione"
user-lists: "Listy"
widgets: "Widżety"
game: "Gry"
darkmode: "Tryb ciemny"
settings: "Ustawienia"
about: "O Misskey"
mobile/views/components/user-timeline.vue:
@@ -726,8 +772,14 @@ mobile/views/components/users-list.vue:
all: "Wszyscy"
known: "Znasz"
load-more: "Więcej"
mobile/views/pages/favorites.vue:
title: "Ulubione"
mobile/views/pages/user-lists.vue:
title: "Listy"
enter-list-name: "Wprowadź nazwę listy"
mobile/views/pages/drive.vue:
drive: "Dysk"
more: "Załaduj więcej"
mobile/views/pages/followers.vue:
followers-of: "Śledzący {}"
mobile/views/pages/following.vue:
@@ -740,6 +792,10 @@ mobile/views/pages/messaging.vue:
messaging: "Wiadomości"
mobile/views/pages/messaging-room.vue:
messaging: "Wiadomości"
mobile/views/pages/received-follow-requests.vue:
title: "Prośby o śledzenie"
accept: "Zatwierdź"
reject: "Odmów"
mobile/views/pages/note.vue:
title: "Wpis"
prev: "Poprzedni wpis"
@@ -783,7 +839,7 @@ mobile/views/pages/settings.vue:
show-renoted-my-notes: "Pokazuj udostępnienia moich wpisów"
post-style: "Styl wpisów"
post-style-standard: "Standardowy"
post-style-smart: "スマート"
post-style-smart: "Inteligentny"
behavior: "Zachowanie"
fetch-on-scroll: "Automatycznie ładuj po przeciągnięciu w dół"
disable-via-mobile: "Nie oznaczaj wpisów jako „wysłane z telefonu”"

View File

@@ -48,26 +48,45 @@ common:
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
widgets:
analog-clock: "アナログ時計"
profile: "プロフィール"
calendar: "カレンダー"
timemachine: "カレンダー(タイムマシン)"
activity: "アクティビティ"
rss: "RSSリーダー"
memo: "メモ"
memo: "付箋"
trends: "トレンド"
photo-stream: "フォトストリーム"
posts-monitor: "投稿チャート"
slideshow: "スライドショー"
version: "バージョン"
broadcast: "ブロードキャスト"
notifications: "通知"
users: "おすすめユーザー"
polls: "投票"
polls: "アンケート"
post-form: "投稿フォーム"
messaging: "メッセージ"
server: "サーバー情報"
donation: "寄付のお願い"
nav: "ナビゲーション"
tips: "ヒント"
hashtags: "ハッシュタグ"
deck:
widgets: "ウィジェット"
home: "ホーム"
local: "ローカル"
global: "グローバル"
notifications: "通知"
list: "リスト"
swap-left: "左に移動"
swap-right: "右に移動"
swap-up: "上に移動"
swap-down: "下に移動"
remove: "カラムを削除"
add-column: "カラムを追加"
rename: "名前を変更"
stack-left: "左に重ねる"
pop-right: "右に出す"
common/views/components/connect-failed.vue:
title: "サーバーに接続できません"
description: "インターネット回線に問題があるか、サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから{再度お試し}ください。"
@@ -133,11 +152,11 @@ common/views/components/poll.vue:
show-result: "結果を見る"
voted: "投票済み"
common/views/components/poll-editor.vue:
no-only-one-choice: "投票には、選択肢が最低2つ必要です"
no-only-one-choice: "アンケートには、選択肢が最低2つ必要です"
choice-n: "選択肢{}"
remove: "この選択肢を削除"
add: "+選択肢を追加"
destroy: "投票を破棄"
destroy: "アンケートを破棄"
common/views/components/reaction-picker.vue:
choose-reaction: "リアクションを選択"
common/views/components/signin.vue:
@@ -203,11 +222,17 @@ common/views/widgets/donation.vue:
common/views/widgets/photo-stream.vue:
title: "フォトストリーム"
no-photos: "写真はありません"
common/views/widgets/posts-monitor.vue:
title: "投稿チャート"
toggle: "表示を切り替え"
common/views/widgets/hashtags.vue:
title: "ハッシュタグ"
count: "{}人が投稿"
common/views/widgets/server.vue:
title: "サーバー情報"
toggle: "表示を切り替え"
common/views/widgets/memo.vue:
title: "メモ"
title: "付箋"
memo: "ここに書いて!"
save: "保存"
desktop/views/components/activity.chart.vue:
@@ -289,8 +314,10 @@ desktop/views/components/drive.vue:
upload: "ファイルをアップロード"
url-upload: "URLからアップロード"
desktop/views/components/follow-button.vue:
unfollow: "フォロー解除"
follow: "フォローする"
following: "フォロー"
follow: "フォロー"
request-pending: "フォロー許可待ち"
follow-request: "フォロー申請"
desktop/views/components/followers-window.vue:
followers: "{} のフォロワー"
desktop/views/components/followers.vue:
@@ -326,9 +353,6 @@ desktop/views/components/note-detail.vue:
location: "位置情報"
renote: "Renote"
add-reaction: "リアクション"
desktop/views/components/note-detail.sub.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/components/notes.note.vue:
reposted-by: "{}がRenote"
reply: "返信"
@@ -360,7 +384,7 @@ desktop/views/components/post-form.vue:
attach-media-from-drive: "ドライブからメディアを添付"
attach-cancel: "添付取り消し"
insert-a-kao: "v(‘ω’)v"
create-poll: "投票を作成"
create-poll: "アンケートを作成"
text-remain: "残り{}文字"
desktop/views/components/post-form-window.vue:
note: "新規投稿"
@@ -478,7 +502,7 @@ desktop/views/components/settings.api.vue:
regenerate-token: "トークンを再生成"
token: "Token:"
enter-password: "パスワードを入力してください"
desktop/views/components/settings.app.vue:
desktop/views/components/settings.apps.vue:
no-apps: "連携しているアプリケーションはありません"
desktop/views/components/settings.mute.vue:
no-users: "ミュートしているユーザーはいません"
@@ -503,7 +527,7 @@ desktop/views/components/sub-note-content.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
media-count: "{}つのメディア"
poll: "投票"
poll: "アンケート"
desktop/views/components/taskmanager.vue:
title: "タスクマネージャ"
desktop/views/components/timeline.vue:
@@ -516,12 +540,14 @@ desktop/views/components/ui.header.account.vue:
drive: "ドライブ"
favorites: "お気に入り"
lists: "リスト"
follow-requests: "フォロー申請"
customize: "カスタマイズ"
settings: "設定"
signout: "サインアウト"
dark: "闇に飲まれる"
desktop/views/components/ui.header.nav.vue:
home: "ホーム"
deck: "デッキ"
messaging: "メッセージ"
game: "ゲーム"
desktop/views/components/ui.header.notifications.vue:
@@ -530,7 +556,12 @@ desktop/views/components/ui.header.post.vue:
post: "新規投稿"
desktop/views/components/ui.header.search.vue:
placeholder: "検索"
desktop/views/components/received-follow-requests-window.vue:
title: "フォロー申請"
accept: "承認"
reject: "拒否"
desktop/views/components/user-lists-window.vue:
title: "リスト"
create-list: "リストを作成"
desktop/views/components/user-preview.vue:
notes: "投稿"
@@ -546,6 +577,13 @@ desktop/views/components/users-list-item.vue:
desktop/views/components/window.vue:
popout: "ポップアウト"
close: "閉じる"
desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー"
desktop/views/pages/deck/deck.note.vue:
reposted-by: "{}がRenote"
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/pages/welcome.vue:
about: "詳しく..."
gotit: "わかった"
@@ -609,7 +647,7 @@ desktop/views/widgets/notifications.vue:
title: "通知"
settings: "通知の設定"
desktop/views/widgets/polls.vue:
title: "投票"
title: "アンケート"
refresh: "他を見る"
nothing: "ありません!"
desktop/views/widgets/post-form.vue:
@@ -655,8 +693,10 @@ mobile/views/components/drive.file-detail.vue:
hash: "ハッシュ (md5)"
exif: "EXIF"
mobile/views/components/follow-button.vue:
following: "フォロー中"
follow: "フォロー"
unfollow: "フォロー解除"
request-pending: "フォロー許可待ち"
follow-request: "フォロー申請"
mobile/views/components/friends-maker.vue:
title: "気になるユーザーをフォロー"
empty: "おすすめのユーザーは見つかりませんでした。"
@@ -696,7 +736,7 @@ mobile/views/components/post-form.vue:
submit: "投稿"
reply: "返信"
renote: "Renote"
renote-placeholder: "この投稿を引用... (オプション)"
quote-placeholder: "この投稿を引用... (オプション)"
reply-placeholder: "この投稿への返信..."
cw-placeholder: "内容への注釈 (オプション)"
location-alert: "お使いの端末は位置情報に対応していません"
@@ -706,16 +746,22 @@ mobile/views/components/sub-note-content.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
media-count: "{}つのメディア"
poll: "投票"
poll: "アンケート"
mobile/views/components/timeline.vue:
empty: "投稿がありません"
load-more: "もっと"
mobile/views/components/ui.nav.vue:
home: "ホーム"
timeline: "タイムライン"
notifications: "通知"
messaging: "メッセージ"
follow-requests: "フォロー申請"
search: "検索"
drive: "ドライブ"
favorites: "お気に入り"
user-lists: "リスト"
widgets: "ウィジェット"
game: "ゲーム"
darkmode: "ダークモード"
settings: "設定"
about: "Misskeyについて"
mobile/views/components/user-timeline.vue:
@@ -726,8 +772,14 @@ mobile/views/components/users-list.vue:
all: "すべて"
known: "知り合い"
load-more: "もっと"
mobile/views/pages/favorites.vue:
title: "お気に入り"
mobile/views/pages/user-lists.vue:
title: "リスト"
enter-list-name: "リスト名を入力してください"
mobile/views/pages/drive.vue:
drive: "ドライブ"
more: "もっと見る"
mobile/views/pages/followers.vue:
followers-of: "{}のフォロワー"
mobile/views/pages/following.vue:
@@ -740,6 +792,10 @@ mobile/views/pages/messaging.vue:
messaging: "メッセージ"
mobile/views/pages/messaging-room.vue:
messaging: "メッセージ"
mobile/views/pages/received-follow-requests.vue:
title: "フォロー申請"
accept: "承認"
reject: "拒否"
mobile/views/pages/note.vue:
title: "投稿"
prev: "前の投稿"

View File

@@ -48,26 +48,45 @@ common:
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
widgets:
analog-clock: "アナログ時計"
profile: "プロフィール"
calendar: "カレンダー"
timemachine: "カレンダー(タイムマシン)"
activity: "アクティビティ"
rss: "RSSリーダー"
memo: "メモ"
memo: "付箋"
trends: "トレンド"
photo-stream: "フォトストリーム"
posts-monitor: "投稿チャート"
slideshow: "スライドショー"
version: "バージョン"
broadcast: "ブロードキャスト"
notifications: "通知"
users: "おすすめユーザー"
polls: "投票"
polls: "アンケート"
post-form: "投稿フォーム"
messaging: "メッセージ"
server: "サーバー情報"
donation: "寄付のお願い"
nav: "ナビゲーション"
tips: "ヒント"
hashtags: "ハッシュタグ"
deck:
widgets: "ウィジェット"
home: "ホーム"
local: "ローカル"
global: "グローバル"
notifications: "通知"
list: "リスト"
swap-left: "左に移動"
swap-right: "右に移動"
swap-up: "上に移動"
swap-down: "下に移動"
remove: "カラムを削除"
add-column: "カラムを追加"
rename: "名前を変更"
stack-left: "左に重ねる"
pop-right: "右に出す"
common/views/components/connect-failed.vue:
title: "サーバーに接続できません"
description: "インターネット回線に問題があるか、サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから{再度お試し}ください。"
@@ -133,11 +152,11 @@ common/views/components/poll.vue:
show-result: "結果を見る"
voted: "投票済み"
common/views/components/poll-editor.vue:
no-only-one-choice: "投票には、選択肢が最低2つ必要です"
no-only-one-choice: "アンケートには、選択肢が最低2つ必要です"
choice-n: "選択肢{}"
remove: "この選択肢を削除"
add: "+選択肢を追加"
destroy: "投票を破棄"
destroy: "アンケートを破棄"
common/views/components/reaction-picker.vue:
choose-reaction: "リアクションを選択"
common/views/components/signin.vue:
@@ -203,11 +222,17 @@ common/views/widgets/donation.vue:
common/views/widgets/photo-stream.vue:
title: "フォトストリーム"
no-photos: "写真はありません"
common/views/widgets/posts-monitor.vue:
title: "投稿チャート"
toggle: "表示を切り替え"
common/views/widgets/hashtags.vue:
title: "ハッシュタグ"
count: "{}人が投稿"
common/views/widgets/server.vue:
title: "サーバー情報"
toggle: "表示を切り替え"
common/views/widgets/memo.vue:
title: "メモ"
title: "付箋"
memo: "ここに書いて!"
save: "保存"
desktop/views/components/activity.chart.vue:
@@ -289,8 +314,10 @@ desktop/views/components/drive.vue:
upload: "ファイルをアップロード"
url-upload: "URLからアップロード"
desktop/views/components/follow-button.vue:
unfollow: "フォロー解除"
follow: "フォローする"
following: "フォロー"
follow: "フォロー"
request-pending: "フォロー許可待ち"
follow-request: "フォロー申請"
desktop/views/components/followers-window.vue:
followers: "{} のフォロワー"
desktop/views/components/followers.vue:
@@ -326,9 +353,6 @@ desktop/views/components/note-detail.vue:
location: "位置情報"
renote: "Renote"
add-reaction: "リアクション"
desktop/views/components/note-detail.sub.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/components/notes.note.vue:
reposted-by: "{}がRenote"
reply: "返信"
@@ -360,7 +384,7 @@ desktop/views/components/post-form.vue:
attach-media-from-drive: "ドライブからメディアを添付"
attach-cancel: "添付取り消し"
insert-a-kao: "v(‘ω’)v"
create-poll: "投票を作成"
create-poll: "アンケートを作成"
text-remain: "残り{}文字"
desktop/views/components/post-form-window.vue:
note: "新規投稿"
@@ -478,7 +502,7 @@ desktop/views/components/settings.api.vue:
regenerate-token: "トークンを再生成"
token: "Token:"
enter-password: "パスワードを入力してください"
desktop/views/components/settings.app.vue:
desktop/views/components/settings.apps.vue:
no-apps: "連携しているアプリケーションはありません"
desktop/views/components/settings.mute.vue:
no-users: "ミュートしているユーザーはいません"
@@ -503,7 +527,7 @@ desktop/views/components/sub-note-content.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
media-count: "{}つのメディア"
poll: "投票"
poll: "アンケート"
desktop/views/components/taskmanager.vue:
title: "タスクマネージャ"
desktop/views/components/timeline.vue:
@@ -516,12 +540,14 @@ desktop/views/components/ui.header.account.vue:
drive: "ドライブ"
favorites: "お気に入り"
lists: "リスト"
follow-requests: "フォロー申請"
customize: "カスタマイズ"
settings: "設定"
signout: "サインアウト"
dark: "闇に飲まれる"
desktop/views/components/ui.header.nav.vue:
home: "ホーム"
deck: "デッキ"
messaging: "メッセージ"
game: "ゲーム"
desktop/views/components/ui.header.notifications.vue:
@@ -530,7 +556,12 @@ desktop/views/components/ui.header.post.vue:
post: "新規投稿"
desktop/views/components/ui.header.search.vue:
placeholder: "検索"
desktop/views/components/received-follow-requests-window.vue:
title: "フォロー申請"
accept: "承認"
reject: "拒否"
desktop/views/components/user-lists-window.vue:
title: "リスト"
create-list: "リストを作成"
desktop/views/components/user-preview.vue:
notes: "投稿"
@@ -546,6 +577,13 @@ desktop/views/components/users-list-item.vue:
desktop/views/components/window.vue:
popout: "ポップアウト"
close: "閉じる"
desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー"
desktop/views/pages/deck/deck.note.vue:
reposted-by: "{}がRenote"
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/pages/welcome.vue:
about: "詳しく..."
gotit: "わかった"
@@ -609,7 +647,7 @@ desktop/views/widgets/notifications.vue:
title: "通知"
settings: "通知の設定"
desktop/views/widgets/polls.vue:
title: "投票"
title: "アンケート"
refresh: "他を見る"
nothing: "ありません!"
desktop/views/widgets/post-form.vue:
@@ -655,8 +693,10 @@ mobile/views/components/drive.file-detail.vue:
hash: "ハッシュ (md5)"
exif: "EXIF"
mobile/views/components/follow-button.vue:
following: "フォロー中"
follow: "フォロー"
unfollow: "フォロー解除"
request-pending: "フォロー許可待ち"
follow-request: "フォロー申請"
mobile/views/components/friends-maker.vue:
title: "気になるユーザーをフォロー"
empty: "おすすめのユーザーは見つかりませんでした。"
@@ -696,7 +736,7 @@ mobile/views/components/post-form.vue:
submit: "投稿"
reply: "返信"
renote: "Renote"
renote-placeholder: "この投稿を引用... (オプション)"
quote-placeholder: "この投稿を引用... (オプション)"
reply-placeholder: "この投稿への返信..."
cw-placeholder: "内容への注釈 (オプション)"
location-alert: "お使いの端末は位置情報に対応していません"
@@ -706,16 +746,22 @@ mobile/views/components/sub-note-content.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
media-count: "{}つのメディア"
poll: "投票"
poll: "アンケート"
mobile/views/components/timeline.vue:
empty: "投稿がありません"
load-more: "もっと"
mobile/views/components/ui.nav.vue:
home: "ホーム"
timeline: "タイムライン"
notifications: "通知"
messaging: "メッセージ"
follow-requests: "フォロー申請"
search: "検索"
drive: "ドライブ"
favorites: "お気に入り"
user-lists: "リスト"
widgets: "ウィジェット"
game: "ゲーム"
darkmode: "ダークモード"
settings: "設定"
about: "Misskeyについて"
mobile/views/components/user-timeline.vue:
@@ -726,8 +772,14 @@ mobile/views/components/users-list.vue:
all: "すべて"
known: "知り合い"
load-more: "もっと"
mobile/views/pages/favorites.vue:
title: "お気に入り"
mobile/views/pages/user-lists.vue:
title: "リスト"
enter-list-name: "リスト名を入力してください"
mobile/views/pages/drive.vue:
drive: "ドライブ"
more: "もっと見る"
mobile/views/pages/followers.vue:
followers-of: "{}のフォロワー"
mobile/views/pages/following.vue:
@@ -740,6 +792,10 @@ mobile/views/pages/messaging.vue:
messaging: "メッセージ"
mobile/views/pages/messaging-room.vue:
messaging: "メッセージ"
mobile/views/pages/received-follow-requests.vue:
title: "フォロー申請"
accept: "承認"
reject: "拒否"
mobile/views/pages/note.vue:
title: "投稿"
prev: "前の投稿"

View File

@@ -48,26 +48,45 @@ common:
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
widgets:
analog-clock: "アナログ時計"
profile: "プロフィール"
calendar: "カレンダー"
timemachine: "カレンダー(タイムマシン)"
activity: "アクティビティ"
rss: "RSSリーダー"
memo: "メモ"
memo: "付箋"
trends: "トレンド"
photo-stream: "フォトストリーム"
posts-monitor: "投稿チャート"
slideshow: "スライドショー"
version: "バージョン"
broadcast: "ブロードキャスト"
notifications: "通知"
users: "おすすめユーザー"
polls: "投票"
polls: "アンケート"
post-form: "投稿フォーム"
messaging: "メッセージ"
server: "サーバー情報"
donation: "寄付のお願い"
nav: "ナビゲーション"
tips: "ヒント"
hashtags: "ハッシュタグ"
deck:
widgets: "ウィジェット"
home: "ホーム"
local: "ローカル"
global: "グローバル"
notifications: "通知"
list: "リスト"
swap-left: "左に移動"
swap-right: "右に移動"
swap-up: "上に移動"
swap-down: "下に移動"
remove: "カラムを削除"
add-column: "カラムを追加"
rename: "名前を変更"
stack-left: "左に重ねる"
pop-right: "右に出す"
common/views/components/connect-failed.vue:
title: "サーバーに接続できません"
description: "インターネット回線に問題があるか、サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから{再度お試し}ください。"
@@ -133,11 +152,11 @@ common/views/components/poll.vue:
show-result: "結果を見る"
voted: "投票済み"
common/views/components/poll-editor.vue:
no-only-one-choice: "投票には、選択肢が最低2つ必要です"
no-only-one-choice: "アンケートには、選択肢が最低2つ必要です"
choice-n: "選択肢{}"
remove: "この選択肢を削除"
add: "+選択肢を追加"
destroy: "投票を破棄"
destroy: "アンケートを破棄"
common/views/components/reaction-picker.vue:
choose-reaction: "リアクションを選択"
common/views/components/signin.vue:
@@ -203,11 +222,17 @@ common/views/widgets/donation.vue:
common/views/widgets/photo-stream.vue:
title: "フォトストリーム"
no-photos: "写真はありません"
common/views/widgets/posts-monitor.vue:
title: "投稿チャート"
toggle: "表示を切り替え"
common/views/widgets/hashtags.vue:
title: "ハッシュタグ"
count: "{}人が投稿"
common/views/widgets/server.vue:
title: "サーバー情報"
toggle: "表示を切り替え"
common/views/widgets/memo.vue:
title: "メモ"
title: "付箋"
memo: "ここに書いて!"
save: "保存"
desktop/views/components/activity.chart.vue:
@@ -289,8 +314,10 @@ desktop/views/components/drive.vue:
upload: "ファイルをアップロード"
url-upload: "URLからアップロード"
desktop/views/components/follow-button.vue:
unfollow: "フォロー解除"
follow: "フォローする"
following: "フォロー"
follow: "フォロー"
request-pending: "フォロー許可待ち"
follow-request: "フォロー申請"
desktop/views/components/followers-window.vue:
followers: "{} のフォロワー"
desktop/views/components/followers.vue:
@@ -326,9 +353,6 @@ desktop/views/components/note-detail.vue:
location: "位置情報"
renote: "Renote"
add-reaction: "リアクション"
desktop/views/components/note-detail.sub.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/components/notes.note.vue:
reposted-by: "{}がRenote"
reply: "返信"
@@ -360,7 +384,7 @@ desktop/views/components/post-form.vue:
attach-media-from-drive: "ドライブからメディアを添付"
attach-cancel: "添付取り消し"
insert-a-kao: "v(‘ω’)v"
create-poll: "投票を作成"
create-poll: "アンケートを作成"
text-remain: "残り{}文字"
desktop/views/components/post-form-window.vue:
note: "新規投稿"
@@ -478,7 +502,7 @@ desktop/views/components/settings.api.vue:
regenerate-token: "トークンを再生成"
token: "Token:"
enter-password: "パスワードを入力してください"
desktop/views/components/settings.app.vue:
desktop/views/components/settings.apps.vue:
no-apps: "連携しているアプリケーションはありません"
desktop/views/components/settings.mute.vue:
no-users: "ミュートしているユーザーはいません"
@@ -503,7 +527,7 @@ desktop/views/components/sub-note-content.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
media-count: "{}つのメディア"
poll: "投票"
poll: "アンケート"
desktop/views/components/taskmanager.vue:
title: "タスクマネージャ"
desktop/views/components/timeline.vue:
@@ -516,12 +540,14 @@ desktop/views/components/ui.header.account.vue:
drive: "ドライブ"
favorites: "お気に入り"
lists: "リスト"
follow-requests: "フォロー申請"
customize: "カスタマイズ"
settings: "設定"
signout: "サインアウト"
dark: "闇に飲まれる"
desktop/views/components/ui.header.nav.vue:
home: "ホーム"
deck: "デッキ"
messaging: "メッセージ"
game: "ゲーム"
desktop/views/components/ui.header.notifications.vue:
@@ -530,7 +556,12 @@ desktop/views/components/ui.header.post.vue:
post: "新規投稿"
desktop/views/components/ui.header.search.vue:
placeholder: "検索"
desktop/views/components/received-follow-requests-window.vue:
title: "フォロー申請"
accept: "承認"
reject: "拒否"
desktop/views/components/user-lists-window.vue:
title: "リスト"
create-list: "リストを作成"
desktop/views/components/user-preview.vue:
notes: "投稿"
@@ -546,6 +577,13 @@ desktop/views/components/users-list-item.vue:
desktop/views/components/window.vue:
popout: "ポップアウト"
close: "閉じる"
desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー"
desktop/views/pages/deck/deck.note.vue:
reposted-by: "{}がRenote"
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
desktop/views/pages/welcome.vue:
about: "詳しく..."
gotit: "わかった"
@@ -609,7 +647,7 @@ desktop/views/widgets/notifications.vue:
title: "通知"
settings: "通知の設定"
desktop/views/widgets/polls.vue:
title: "投票"
title: "アンケート"
refresh: "他を見る"
nothing: "ありません!"
desktop/views/widgets/post-form.vue:
@@ -655,8 +693,10 @@ mobile/views/components/drive.file-detail.vue:
hash: "ハッシュ (md5)"
exif: "EXIF"
mobile/views/components/follow-button.vue:
following: "フォロー中"
follow: "フォロー"
unfollow: "フォロー解除"
request-pending: "フォロー許可待ち"
follow-request: "フォロー申請"
mobile/views/components/friends-maker.vue:
title: "気になるユーザーをフォロー"
empty: "おすすめのユーザーは見つかりませんでした。"
@@ -696,7 +736,7 @@ mobile/views/components/post-form.vue:
submit: "投稿"
reply: "返信"
renote: "Renote"
renote-placeholder: "この投稿を引用... (オプション)"
quote-placeholder: "この投稿を引用... (オプション)"
reply-placeholder: "この投稿への返信..."
cw-placeholder: "内容への注釈 (オプション)"
location-alert: "お使いの端末は位置情報に対応していません"
@@ -706,16 +746,22 @@ mobile/views/components/sub-note-content.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
media-count: "{}つのメディア"
poll: "投票"
poll: "アンケート"
mobile/views/components/timeline.vue:
empty: "投稿がありません"
load-more: "もっと"
mobile/views/components/ui.nav.vue:
home: "ホーム"
timeline: "タイムライン"
notifications: "通知"
messaging: "メッセージ"
follow-requests: "フォロー申請"
search: "検索"
drive: "ドライブ"
favorites: "お気に入り"
user-lists: "リスト"
widgets: "ウィジェット"
game: "ゲーム"
darkmode: "ダークモード"
settings: "設定"
about: "Misskeyについて"
mobile/views/components/user-timeline.vue:
@@ -726,8 +772,14 @@ mobile/views/components/users-list.vue:
all: "すべて"
known: "知り合い"
load-more: "もっと"
mobile/views/pages/favorites.vue:
title: "お気に入り"
mobile/views/pages/user-lists.vue:
title: "リスト"
enter-list-name: "リスト名を入力してください"
mobile/views/pages/drive.vue:
drive: "ドライブ"
more: "もっと見る"
mobile/views/pages/followers.vue:
followers-of: "{}のフォロワー"
mobile/views/pages/following.vue:
@@ -740,6 +792,10 @@ mobile/views/pages/messaging.vue:
messaging: "メッセージ"
mobile/views/pages/messaging-room.vue:
messaging: "メッセージ"
mobile/views/pages/received-follow-requests.vue:
title: "フォロー申請"
accept: "承認"
reject: "拒否"
mobile/views/pages/note.vue:
title: "投稿"
prev: "前の投稿"

View File

@@ -1,8 +1,8 @@
{
"name": "misskey",
"author": "syuilo <i@syuilo.com>",
"version": "2.22.1",
"clientVersion": "1.0.5942",
"version": "3.0.1",
"clientVersion": "1.0.6517",
"codename": "nighthike",
"main": "./built/index.js",
"private": true,
@@ -29,12 +29,70 @@
"@fortawesome/fontawesome-free-solid": "5.0.2",
"@koa/cors": "2.2.1",
"@prezzemolo/rap": "0.1.2",
"autwh": "0.1.0",
"bcryptjs": "2.4.3",
"cafy": "8.0.0",
"chalk": "2.4.1",
"crc-32": "1.2.0",
"debug": "3.1.0",
"deepcopy": "0.6.3",
"diskusage": "0.2.4",
"elasticsearch": "15.0.0",
"emojilib": "2.2.12",
"escape-regexp": "0.0.1",
"file-type": "8.0.0",
"gm": "1.23.1",
"http-signature": "1.2.0",
"is-root": "2.0.0",
"is-url": "1.2.4",
"js-yaml": "3.11.0",
"jsdom": "11.11.0",
"koa": "2.5.1",
"koa-bodyparser": "4.2.1",
"koa-compress": "3.0.0",
"koa-favicon": "2.0.1",
"koa-json-body": "5.3.0",
"koa-logger": "3.2.0",
"koa-mount": "3.0.0",
"koa-multer": "1.0.2",
"koa-router": "7.4.0",
"koa-send": "4.1.3",
"koa-slow": "2.1.0",
"koa-views": "6.1.4",
"kue": "0.11.6",
"mongodb": "3.0.10",
"monk": "6.0.6",
"ms": "2.1.1",
"nopt": "4.0.1",
"os-utils": "0.0.14",
"parse5": "5.0.0",
"prominence": "0.2.0",
"promise-sequential": "1.1.1",
"punycode": "2.1.1",
"qrcode": "1.2.0",
"ratelimiter": "3.0.3",
"recaptcha-promise": "0.1.3",
"reconnecting-websocket": "3.2.2",
"redis": "2.8.0",
"request": "2.87.0",
"request-promise-native": "1.0.5",
"rndstr": "1.0.0",
"speakeasy": "2.0.0",
"summaly": "2.0.6",
"tcp-port-used": "0.1.2",
"tmp": "0.0.33",
"uuid": "3.2.1",
"web-push": "3.3.1",
"webfinger.js": "2.6.6",
"websocket": "1.0.26",
"ws": "5.2.0",
"xev": "2.0.1",
"@prezzemolo/zip": "0.0.3",
"@types/bcryptjs": "2.4.1",
"@types/debug": "0.0.30",
"@types/deep-equal": "1.0.1",
"@types/elasticsearch": "5.0.23",
"@types/eventemitter3": "2.0.2",
"@types/gm": "1.18.0",
"@types/gulp": "3.8.36",
"@types/gulp-htmlmin": "1.3.32",
@@ -63,7 +121,6 @@
"@types/mkdirp": "0.5.2",
"@types/mocha": "5.2.0",
"@types/mongodb": "3.0.18",
"@types/monk": "6.0.0",
"@types/ms": "0.7.30",
"@types/node": "10.1.2",
"@types/nopt": "3.0.29",
@@ -86,30 +143,17 @@
"@types/ws": "5.1.1",
"animejs": "2.2.0",
"autosize": "4.0.2",
"autwh": "0.1.0",
"bcryptjs": "2.4.3",
"bootstrap-vue": "2.0.0-rc.6",
"cafy": "8.0.0",
"chalk": "2.4.1",
"crc-32": "1.2.0",
"css-loader": "0.28.11",
"debug": "3.1.0",
"deep-equal": "1.0.1",
"deepcopy": "0.6.3",
"diskusage": "0.2.4",
"dompurify": "1.0.4",
"elasticsearch": "15.0.0",
"element-ui": "2.3.9",
"emojilib": "2.2.12",
"escape-regexp": "0.0.1",
"eslint": "4.19.1",
"eslint-plugin-vue": "4.5.0",
"eventemitter3": "3.1.0",
"exif-js": "2.3.0",
"file-loader": "1.1.11",
"file-type": "8.0.0",
"fuckadblock": "3.2.1",
"gm": "1.23.1",
"gulp": "3.9.1",
"gulp-cssnano": "2.1.3",
"gulp-htmlmin": "4.0.0",
@@ -127,71 +171,32 @@
"hard-source-webpack-plugin": "0.6.10",
"highlight.js": "9.12.0",
"html-minifier": "3.5.16",
"http-signature": "1.2.0",
"inquirer": "5.2.0",
"is-root": "2.0.0",
"is-url": "1.2.4",
"js-yaml": "3.11.0",
"jsdom": "11.11.0",
"koa": "2.5.1",
"koa-bodyparser": "4.2.1",
"koa-compress": "3.0.0",
"koa-favicon": "2.0.1",
"koa-json-body": "5.3.0",
"koa-logger": "3.2.0",
"koa-mount": "3.0.0",
"koa-multer": "1.0.2",
"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": "20.0.0",
"loader-utils": "1.1.0",
"mecab-async": "0.1.2",
"mkdirp": "0.5.1",
"mocha": "5.2.0",
"moji": "0.5.1",
"mongodb": "3.0.8",
"monk": "6.0.6",
"ms": "2.1.1",
"nan": "2.10.0",
"node-sass": "4.9.0",
"node-sass-json-importer": "3.2.0",
"nopt": "4.0.1",
"nprogress": "0.2.0",
"object-assign-deep": "0.4.0",
"on-build-webpack": "0.1.0",
"os-utils": "0.0.14",
"parse5": "5.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.1",
"qrcode": "1.2.0",
"ratelimiter": "3.0.3",
"recaptcha-promise": "0.1.3",
"reconnecting-websocket": "3.2.2",
"redis": "2.8.0",
"request": "2.87.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",
"stylus-loader": "3.0.2",
"summaly": "2.0.6",
"swagger-jsdoc": "1.9.7",
"syuilo-password-strength": "0.0.1",
"tcp-port-used": "0.1.2",
"textarea-caret": "3.1.0",
"tmp": "0.0.33",
"ts-loader": "4.3.0",
"ts-node": "6.0.4",
"tslint": "5.10.0",
@@ -199,25 +204,18 @@
"typescript-eslint-parser": "15.0.0",
"uglify-es": "3.3.9",
"url-loader": "1.0.1",
"uuid": "3.2.1",
"v-animate-css": "0.0.2",
"vue": "2.5.16",
"vue-cropperjs": "2.2.0",
"vue-js-modal": "1.3.13",
"vue-json-tree-view": "2.1.4",
"vue-loader": "15.2.1",
"vue-material": "^1.0.0-beta-10.2",
"vue-router": "3.0.1",
"vue-template-compiler": "2.5.16",
"vuedraggable": "2.16.0",
"vuex": "3.0.1",
"vuex-persistedstate": "^2.5.4",
"web-push": "3.3.1",
"webfinger.js": "2.6.6",
"webpack": "4.9.1",
"webpack-cli": "2.1.4",
"websocket": "1.0.26",
"ws": "5.2.0",
"xev": "2.0.0"
"webpack-cli": "2.1.4"
}
}

View File

@@ -7,11 +7,6 @@ html
cursor progress !important
body
// for md
font-size 16px !important
line-height initial !important
letter-spacing initial !important
overflow-wrap break-word
#error

View File

@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!-- Generator: Gravit.io --><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="isolation:isolate" viewBox="0 0 512 512" width="512" height="512"><defs><clipPath id="_clipPath_P6eAE2OaBltOJ3gHGVajfqsOnfv4xIns"><rect width="512" height="512"/></clipPath></defs><g clip-path="url(#_clipPath_P6eAE2OaBltOJ3gHGVajfqsOnfv4xIns)"><clipPath id="_clipPath_P6q7MZAUp3XpQhVgs2GuAbegX9v4gkom"><rect x="0" y="0" width="512" height="512" transform="matrix(1,0,0,1,0,0)" fill="rgb(255,255,255)"/></clipPath><g clip-path="url(#_clipPath_P6q7MZAUp3XpQhVgs2GuAbegX9v4gkom)"><g id="Group"><g id="g4502"><g id="g5125"><g id="text4489"><path d=" M 190.093 359.243 C 167.923 359.32 148.881 345.963 139.9 330.409 C 135.104 323.615 125.617 321.198 125.482 330.409 L 125.482 372.939 C 125.482 390.026 119.253 404.799 106.794 417.258 C 94.69 429.362 79.917 435.413 62.474 435.413 C 45.387 435.413 30.614 429.362 18.155 417.258 C 6.052 404.799 0 390.026 0 372.939 L 0 139.061 C 0 125.89 3.738 113.965 11.213 103.285 C 19.045 92.25 29.012 84.596 41.116 80.325 C 47.879 77.833 54.999 76.587 62.474 76.587 C 81.697 76.587 97.716 84.062 110.531 99.013 C 117.295 106.489 121.211 110.405 122.279 110.761 C 122.279 110.761 173.043 172.145 174.467 173.213 C 175.891 174.281 180.073 182.446 190.093 182.446 C 200.112 182.446 204.829 174.281 206.253 173.213 C 207.676 172.145 258.44 110.761 258.44 110.761 C 258.796 111.117 262.534 107.201 269.654 99.013 C 282.825 84.062 299.022 76.587 318.245 76.587 C 325.364 76.587 332.484 77.833 339.603 80.325 C 351.707 84.596 361.496 92.25 368.972 103.285 C 376.803 113.965 380.719 125.89 380.719 139.061 L 380.719 372.939 C 380.719 390.026 374.489 404.799 362.03 417.258 C 349.927 429.362 335.154 435.413 317.711 435.413 C 300.624 435.413 285.851 429.362 273.391 417.258 C 261.288 404.799 255.237 390.026 255.237 372.939 L 255.237 330.409 C 254.184 318.802 243.925 326.116 240.285 330.409 C 230.674 348.208 212.262 359.167 190.093 359.243 Z M 457.535 184.448 Q 435.109 184.448 419.09 168.963 Q 403.605 152.944 403.605 130.518 Q 403.605 108.091 419.09 92.606 Q 435.109 76.587 457.535 76.587 Q 479.962 76.587 495.981 92.606 Q 512 108.091 512 130.518 Q 512 152.944 495.981 168.963 Q 479.962 184.448 457.535 184.448 Z M 458.069 195.128 Q 480.496 195.128 495.981 211.147 Q 512 227.166 512 249.592 L 512 381.482 Q 512 403.909 495.981 419.928 Q 480.496 435.413 458.069 435.413 Q 435.643 435.413 419.624 419.928 Q 403.605 403.909 403.605 381.482 L 403.605 249.592 Q 403.605 227.166 419.624 211.147 Q 435.643 195.128 458.069 195.128 Z " fill-rule="evenodd" fill="rgb(157,157,157)"/></g></g></g></g></g></g></svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
y="0px" width="1024px" height="512px" viewBox="0 256 1024 512" enable-background="new 0 256 1024 512" xml:space="preserve">
<polyline opacity="0.5" fill="none" stroke="#000000" stroke-width="34" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
896.5,608.5 800.5,416.5 704.5,608.5 608.5,416.5 512.5,608.5 416.5,416.5 320.5,608.5 224.5,416.5 128.5,608.5 "/>
</svg>

Before

Width:  |  Height:  |  Size: 646 B

View File

@@ -20,6 +20,7 @@ init(launch => {
// Init router
const router = new VueRouter({
mode: 'history',
base: '/auth/',
routes: [
{ path: '/:token', component: Index },
]

View File

@@ -3,6 +3,7 @@
<main v-if="$store.getters.isSignedIn">
<p class="fetching" v-if="fetching">読み込み中<mk-ellipsis/></p>
<x-form
class="form"
ref="form"
v-if="state == 'waiting'"
:session="session"
@@ -26,7 +27,7 @@
<h1>サインインしてください</h1>
<mk-signin/>
</main>
<footer><img src="/assets/auth/logo.svg" alt="Misskey"/></footer>
<footer><img src="/assets/auth/icon.svg" alt="Misskey"/></footer>
</div>
</template>
@@ -62,7 +63,7 @@ export default Vue.extend({
// 既に連携していた場合
if (this.session.app.isAuthorized) {
this.$root.$data.os.api('auth/accept', {
(this as any).api('auth/accept', {
token: this.session.token
}).then(() => {
this.accepted();
@@ -102,7 +103,7 @@ export default Vue.extend({
padding 32px
color #555
> div
> div:not(.form)
padding 64px
> h1
@@ -143,8 +144,8 @@ export default Vue.extend({
> footer
> img
display block
width 64px
height 64px
margin 0 auto
width 32px
height 32px
margin 16px auto
</style>

View File

@@ -42,7 +42,7 @@ html
| JavaScriptを有効にしてください
br
| Please turn on your JavaScript
div#ini: p
span .
span .
span .
div#ini.
<svg viewBox="0 0 50 50">
<path fill=#{themeColor} d="M25.251,6.461c-10.318,0-18.683,8.365-18.683,18.683h4.068c0-8.071,6.543-14.615,14.615-14.615V6.461z" />
</svg>

View File

@@ -32,9 +32,9 @@
//#region Detect app name
let app = null;
if (url.pathname == '/docs') app = 'docs';
if (url.pathname == '/dev') app = 'dev';
if (url.pathname == '/auth') app = 'auth';
if (url.pathname == '/docs' || url.pathname.startsWith('/docs/')) app = 'docs';
if (url.pathname == '/dev' || url.pathname.startsWith('/dev/')) app = 'dev';
if (url.pathname == '/auth' || url.pathname.startsWith('/auth/')) app = 'auth';
//#endregion
//#region Detect the user language

View File

@@ -9,9 +9,9 @@ export default function<T extends object>(data: {
widget: {
type: Object
},
isMobile: {
type: Boolean,
default: false
platform: {
type: String,
required: true
},
isCustomizeMode: {
type: Boolean,
@@ -66,17 +66,10 @@ export default function<T extends object>(data: {
this.bakeProps();
if (this.isMobile) {
(this as any).api('i/update_mobile_home', {
id: this.id,
data: this.props
});
} else {
(this as any).api('i/update_home', {
id: this.id,
data: this.props
});
}
(this as any).api('i/update_widget', {
id: this.id,
data: this.props
});
}
}
});

View File

@@ -1,5 +1,3 @@
import * as merge from 'object-assign-deep';
import Stream from './stream';
import StreamManager from './stream-manager';
import MiOS from '../../../mios';
@@ -20,7 +18,7 @@ export class HomeStream extends Stream {
}, 1000 * 60);
// 自分の情報が更新されたとき
this.on('i_updated', i => {
this.on('meUpdated', i => {
if (os.debug) {
console.log('I updated:', i);
}
@@ -60,25 +58,18 @@ export class HomeStream extends Stream {
});
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
});
}
os.store.commit('settings/setHome', x);
});
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
});
}
os.store.commit('settings/setMobileHome', x);
});
this.on('widgetUpdated', x => {
os.store.commit('settings/setWidget', {
id: x.id,
data: x.data
});
});
// トークンが再生成されたとき

View File

@@ -3,15 +3,15 @@ import StreamManager from './stream-manager';
import MiOS from '../../../mios';
/**
* Server stream connection
* Notes stats stream connection
*/
export class ServerStream extends Stream {
export class NotesStatsStream extends Stream {
constructor(os: MiOS) {
super(os, 'server');
super(os, 'notes-stats');
}
}
export class ServerStreamManager extends StreamManager<ServerStream> {
export class NotesStatsStreamManager extends StreamManager<NotesStatsStream> {
private os: MiOS;
constructor(os: MiOS) {
@@ -22,7 +22,7 @@ export class ServerStreamManager extends StreamManager<ServerStream> {
public getConnection() {
if (this.connection == null) {
this.connection = new ServerStream(this.os);
this.connection = new NotesStatsStream(this.os);
}
return this.connection;

View File

@@ -0,0 +1,30 @@
import Stream from './stream';
import StreamManager from './stream-manager';
import MiOS from '../../../mios';
/**
* Server stats stream connection
*/
export class ServerStatsStream extends Stream {
constructor(os: MiOS) {
super(os, 'server-stats');
}
}
export class ServerStatsStreamManager extends StreamManager<ServerStatsStream> {
private os: MiOS;
constructor(os: MiOS) {
super();
this.os = os;
}
public getConnection() {
if (this.connection == null) {
this.connection = new ServerStatsStream(this.os);
}
return this.connection;
}
}

View File

@@ -0,0 +1,127 @@
<template>
<svg class="mk-analog-clock" viewBox="0 0 10 10" preserveAspectRatio="none">
<circle v-for="angle, i in graduations"
:cx="5 + (Math.sin(angle) * (5 - graduationsPadding))"
:cy="5 - (Math.cos(angle) * (5 - graduationsPadding))"
:r="i % 5 == 0 ? 0.125 : 0.05"
:fill="i % 5 == 0 ? majorGraduationColor : minorGraduationColor"/>
<line
:x1="5 - (Math.sin(sAngle) * (sHandLengthRatio * handsTailLength))"
:y1="5 + (Math.cos(sAngle) * (sHandLengthRatio * handsTailLength))"
:x2="5 + (Math.sin(sAngle) * ((sHandLengthRatio * 5) - handsPadding))"
:y2="5 - (Math.cos(sAngle) * ((sHandLengthRatio * 5) - handsPadding))"
:stroke="sHandColor"
stroke-width="0.05"/>
<line
:x1="5 - (Math.sin(mAngle) * (mHandLengthRatio * handsTailLength))"
:y1="5 + (Math.cos(mAngle) * (mHandLengthRatio * handsTailLength))"
:x2="5 + (Math.sin(mAngle) * ((mHandLengthRatio * 5) - handsPadding))"
:y2="5 - (Math.cos(mAngle) * ((mHandLengthRatio * 5) - handsPadding))"
:stroke="mHandColor"
stroke-width="0.1"/>
<line
:x1="5 - (Math.sin(hAngle) * (hHandLengthRatio * handsTailLength))"
:y1="5 + (Math.cos(hAngle) * (hHandLengthRatio * handsTailLength))"
:x2="5 + (Math.sin(hAngle) * ((hHandLengthRatio * 5) - handsPadding))"
:y2="5 - (Math.cos(hAngle) * ((hHandLengthRatio * 5) - handsPadding))"
:stroke="hHandColor"
stroke-width="0.1"/>
</svg>
</template>
<script lang="ts">
import Vue from 'vue';
import { themeColor } from '../../../config';
export default Vue.extend({
props: {
dark: {
type: Boolean,
default: false
}
},
data() {
return {
now: new Date(),
clock: null,
graduationsPadding: 0.5,
handsPadding: 1,
handsTailLength: 0.7,
hHandLengthRatio: 0.75,
mHandLengthRatio: 1,
sHandLengthRatio: 1
};
},
computed: {
majorGraduationColor(): string {
return this.dark ? 'rgba(255, 255, 255, 0.3)' : 'rgba(0, 0, 0, 0.3)';
},
minorGraduationColor(): string {
return this.dark ? 'rgba(255, 255, 255, 0.2)' : 'rgba(0, 0, 0, 0.2)';
},
sHandColor(): string {
return this.dark ? 'rgba(255, 255, 255, 0.5)' : 'rgba(0, 0, 0, 0.3)';
},
mHandColor(): string {
return this.dark ? '#fff' : '#777';
},
hHandColor(): string {
return themeColor;
},
s(): number {
return this.now.getSeconds();
},
m(): number {
return this.now.getMinutes();
},
h(): number {
return this.now.getHours();
},
hAngle(): number {
return Math.PI * (this.h % 12 + this.m / 60) / 6;
},
mAngle(): number {
return Math.PI * (this.m + this.s / 60) / 30;
},
sAngle(): number {
return Math.PI * this.s / 30;
},
graduations(): any {
const angles = [];
for (let i = 0; i < 60; i++) {
const angle = Math.PI * i / 30;
angles.push(angle);
}
return angles;
}
},
mounted() {
this.clock = setInterval(this.tick, 1000);
},
beforeDestroy() {
clearInterval(this.clock);
},
methods: {
tick() {
this.now = new Date();
}
}
});
</script>
<style lang="stylus" scoped>
.mk-analog-clock
display block
</style>

View File

@@ -13,9 +13,6 @@
.a
display block
position fixed
top 0
right 0
> svg
display block

View File

@@ -1,5 +1,8 @@
import Vue from 'vue';
import analogClock from './analog-clock.vue';
import menu from './menu.vue';
import noteHeader from './note-header.vue';
import signin from './signin.vue';
import signup from './signup.vue';
import forkit from './forkit.vue';
@@ -26,7 +29,18 @@ import fileTypeIcon from './file-type-icon.vue';
import Switch from './switch.vue';
import Othello from './othello.vue';
import welcomeTimeline from './welcome-timeline.vue';
import uiInput from './ui/input.vue';
import uiButton from './ui/button.vue';
import uiCard from './ui/card.vue';
import uiForm from './ui/form.vue';
import uiTextarea from './ui/textarea.vue';
import uiSwitch from './ui/switch.vue';
import uiRadio from './ui/radio.vue';
import uiSelect from './ui/select.vue';
Vue.component('mk-analog-clock', analogClock);
Vue.component('mk-menu', menu);
Vue.component('mk-note-header', noteHeader);
Vue.component('mk-signin', signin);
Vue.component('mk-signup', signup);
Vue.component('mk-forkit', forkit);
@@ -53,3 +67,11 @@ Vue.component('mk-file-type-icon', fileTypeIcon);
Vue.component('mk-switch', Switch);
Vue.component('mk-othello', Othello);
Vue.component('mk-welcome-timeline', welcomeTimeline);
Vue.component('ui-input', uiInput);
Vue.component('ui-button', uiButton);
Vue.component('ui-card', uiCard);
Vue.component('ui-form', uiForm);
Vue.component('ui-textarea', uiTextarea);
Vue.component('ui-switch', uiSwitch);
Vue.component('ui-radio', uiRadio);
Vue.component('ui-select', uiSelect);

View File

@@ -1,9 +1,11 @@
<template>
<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 :raw="raw"/>
</template>
<div class="mk-media-list">
<div :data-count="mediaList.length" ref="grid">
<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 :raw="raw"/>
</template>
</div>
</div>
</template>
@@ -18,47 +20,60 @@ export default Vue.extend({
raw: {
default: false
}
},
mounted() {
// for Safari bug
this.$refs.grid.style.height = this.$refs.grid.clientHeight ? `${this.$refs.grid.clientHeight}px` : '128px';
}
});
</script>
<style lang="stylus" scoped>
.mk-media-list
display grid
grid-gap 4px
height 256px
width 100%
@media (max-width 500px)
height 192px
&:before
content ''
display block
padding-top 56.25% // 16:9
> div
position absolute
top 0
right 0
bottom 0
left 0
display grid
grid-gap 4px
&[data-count="1"]
grid-template-rows 1fr
&[data-count="2"]
grid-template-columns 1fr 1fr
grid-template-rows 1fr
&[data-count="3"]
grid-template-columns 1fr 0.5fr
grid-template-rows 1fr 1fr
:nth-child(1)
grid-row 1 / 3
:nth-child(3)
grid-column 2 / 3
grid-row 2 / 3
&[data-count="4"]
grid-template-columns 1fr 1fr
grid-template-rows 1fr 1fr
&[data-count="1"]
grid-template-rows 1fr
&[data-count="2"]
grid-template-columns 1fr 1fr
grid-template-rows 1fr
&[data-count="3"]
grid-template-columns 1fr 0.5fr
grid-template-rows 1fr 1fr
:nth-child(1)
grid-row 1 / 3
:nth-child(3)
grid-column 1 / 2
grid-row 1 / 2
:nth-child(2)
grid-column 2 / 3
grid-row 2/3
&[data-count="4"]
grid-template-columns 1fr 1fr
grid-template-rows 1fr 1fr
:nth-child(1)
grid-column 1 / 2
grid-row 1 / 2
:nth-child(2)
grid-column 2 / 3
grid-row 1 / 2
:nth-child(3)
grid-column 1 / 2
grid-row 2 / 3
:nth-child(4)
grid-column 2 / 3
grid-row 2 / 3
grid-row 1 / 2
:nth-child(3)
grid-column 1 / 2
grid-row 2 / 3
:nth-child(4)
grid-column 2 / 3
grid-row 2 / 3
</style>

View File

@@ -0,0 +1,196 @@
<template>
<div class="mk-menu">
<div class="backdrop" ref="backdrop" @click="close"></div>
<div class="popover" :class="{ hukidasi }" ref="popover">
<template v-for="item in items">
<div v-if="item === null"></div>
<button v-if="item" @click="clicked(item.action)" v-html="item.icon ? item.icon + ' ' + item.text : item.text"></button>
</template>
</div>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import * as anime from 'animejs';
export default Vue.extend({
props: {
source: {
required: true
},
items: {
type: Array,
required: true
},
compact: {
type: Boolean,
required: false,
default: false
}
},
data() {
return {
hukidasi: !this.compact
};
},
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.pageXOffset > window.innerWidth) {
left = window.innerWidth - width + window.pageXOffset;
this.hukidasi = false;
}
if (top + height - window.pageYOffset > window.innerHeight) {
top = window.innerHeight - height + window.pageYOffset;
this.hukidasi = false;
}
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: {
clicked(fn) {
fn();
this.close();
},
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.$emit('closed');
this.$destroy();
}
});
}
}
});
</script>
<style lang="stylus" scoped>
@import '~const.styl'
$border-color = rgba(27, 31, 35, 0.15)
.mk-menu
position initial
> .backdrop
position fixed
top 0
left 0
z-index 10000
width 100%
height 100%
background rgba(#000, 0.1)
opacity 0
> .popover
position absolute
z-index 10001
padding 8px 0
background #fff
border 1px solid $border-color
border-radius 4px
box-shadow 0 3px 12px rgba(27, 31, 35, 0.15)
transform scale(0.5)
opacity 0
$balloon-size = 16px
&.hukidasi
margin-top $balloon-size
transform-origin center -($balloon-size)
&:before
&:after
content ""
display block
position absolute
pointer-events none
&:before
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
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 #fff
> button
display block
padding 8px 16px
width 100%
&:hover
color $theme-color-foreground
background $theme-color
text-decoration none
&:active
color $theme-color-foreground
background darken($theme-color, 10%)
> div
margin 8px 0
height 1px
background #eee
</style>

View File

@@ -0,0 +1,117 @@
<template>
<header class="bvonvjxbwzaiskogyhbwgyxvcgserpmu">
<mk-avatar class="avatar" :user="note.user" v-if="$store.state.device.postStyle == 'smart'"/>
<router-link class="name" :to="note.user | userPage" v-user-preview="note.user.id">{{ note.user | userName }}</router-link>
<span class="is-admin" v-if="note.user.isAdmin">admin</span>
<span class="is-bot" v-if="note.user.isBot">bot</span>
<span class="is-cat" v-if="note.user.isCat">cat</span>
<span class="username"><mk-acct :user="note.user"/></span>
<div class="info">
<span class="app" v-if="note.app && !mini">via <b>{{ note.app.name }}</b></span>
<span class="mobile" v-if="note.viaMobile">%fa:mobile-alt%</span>
<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>
</template>
<script lang="ts">
import Vue from 'vue';
export default Vue.extend({
props: {
note: {
type: Object,
required: true
},
mini: {
type: Boolean,
required: false,
default: false
}
}
});
</script>
<style lang="stylus" scoped>
@import '~const.styl'
root(isDark)
display flex
align-items baseline
white-space nowrap
> .avatar
flex-shrink 0
margin-right 8px
width 20px
height 20px
border-radius 100%
> .name
display block
margin 0 .5em 0 0
padding 0
overflow hidden
color isDark ? #fff : #627079
font-size 1em
font-weight bold
text-decoration none
text-overflow ellipsis
&:hover
text-decoration underline
> .is-admin
> .is-bot
> .is-cat
align-self center
margin 0 .5em 0 0
padding 1px 6px
font-size 80%
color isDark ? #758188 : #aaa
border solid 1px isDark ? #57616f : #ddd
border-radius 3px
&.is-admin
border-color isDark ? #d42c41 : #f56a7b
color isDark ? #d42c41 : #f56a7b
> .username
margin 0 .5em 0 0
overflow hidden
text-overflow ellipsis
color isDark ? #606984 : #ccc
> .info
margin-left auto
font-size 0.9em
> *
color isDark ? #606984 : #c0c0c0
> .mobile
margin-right 8px
> .app
margin-right 8px
padding-right 8px
border-right solid 1px isDark ? #1c2023 : #eaeaea
> .visibility
margin-left 8px
.bvonvjxbwzaiskogyhbwgyxvcgserpmu[data-darkmode]
root(true)
.bvonvjxbwzaiskogyhbwgyxvcgserpmu:not([data-darkmode])
root(false)
</style>

View File

@@ -40,6 +40,17 @@ export default Vue.component('mk-note-html', {
ast = this.ast;
}
if (ast.filter(x => x.type != 'hashtag').length == 0) {
return;
}
while (ast[ast.length - 1] && (
ast[ast.length - 1].type == 'hashtag' ||
(ast[ast.length - 1].type == 'text' && ast[ast.length - 1].content == ' ') ||
(ast[ast.length - 1].type == 'text' && ast[ast.length - 1].content == '\n'))) {
ast.pop();
}
// Parse ast to DOM
const els = flatten(ast.map(token => {
switch (token.type) {
@@ -92,7 +103,7 @@ export default Vue.component('mk-note-html', {
case 'hashtag':
return createElement('a', {
attrs: {
href: `${url}/search?q=${token.content}`,
href: `${url}/tags/${token.hashtag}`,
target: '_blank'
}
}, token.content);

View File

@@ -1,55 +1,45 @@
<template>
<div class="mk-note-menu">
<div class="backdrop" ref="backdrop" @click="close"></div>
<div class="popover" :class="{ compact }" ref="popover">
<button @click="favorite">%i18n:@favorite%</button>
<button v-if="note.userId == $store.state.i.id" @click="pin">%i18n:@pin%</button>
<button v-if="note.userId == $store.state.i.id" @click="del">%i18n:@delete%</button>
<a v-if="note.uri" :href="note.uri" target="_blank">%i18n:@remote%</a>
</div>
<div style="position:initial">
<mk-menu :source="source" :compact="compact" :items="items" @closed="closed"/>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import * as anime from 'animejs';
export default Vue.extend({
props: ['note', 'source', 'compact'],
mounted() {
this.$nextTick(() => {
const popover = this.$refs.popover as any;
const rect = this.source.getBoundingClientRect();
const width = popover.offsetWidth;
const height = popover.offsetHeight;
if (this.compact) {
const x = rect.left + window.pageXOffset + (this.source.offsetWidth / 2);
const y = rect.top + window.pageYOffset + (this.source.offsetHeight / 2);
popover.style.left = (x - (width / 2)) + 'px';
popover.style.top = (y - (height / 2)) + 'px';
} else {
const x = rect.left + window.pageXOffset + (this.source.offsetWidth / 2);
const y = rect.top + window.pageYOffset + this.source.offsetHeight;
popover.style.left = (x - (width / 2)) + 'px';
popover.style.top = y + 'px';
computed: {
items() {
const items = [];
items.push({
icon: '%fa:star%',
text: '%i18n:@favorite%',
action: this.favorite
});
if (this.note.userId == this.$store.state.i.id) {
items.push({
icon: '%fa:thumbtack%',
text: '%i18n:@pin%',
action: this.pin
});
items.push({
icon: '%fa:trash-alt R%',
text: '%i18n:@delete%',
action: this.del
});
}
anime({
targets: this.$refs.backdrop,
opacity: 1,
duration: 100,
easing: 'linear'
});
anime({
targets: this.$refs.popover,
opacity: 1,
scale: [0.5, 1],
duration: 500
});
});
if (this.note.uri) {
items.push({
icon: '%fa:external-link-square-alt%',
text: '%i18n:@remote%',
action: () => {
window.open(this.note.uri, '_blank');
}
});
}
return items;
}
},
methods: {
pin() {
@@ -77,99 +67,11 @@ export default Vue.extend({
});
},
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()
closed() {
this.$nextTick(() => {
this.$destroy();
});
}
}
});
</script>
<style lang="stylus" scoped>
@import '~const.styl'
$border-color = rgba(27, 31, 35, 0.15)
.mk-note-menu
position initial
> .backdrop
position fixed
top 0
left 0
z-index 10000
width 100%
height 100%
background rgba(#000, 0.1)
opacity 0
> .popover
position absolute
z-index 10001
padding 8px 0
background #fff
border 1px solid $border-color
border-radius 4px
box-shadow 0 3px 12px rgba(27, 31, 35, 0.15)
transform scale(0.5)
opacity 0
$balloon-size = 16px
&:not(.compact)
margin-top $balloon-size
transform-origin center -($balloon-size)
&:before
content ""
display block
position absolute
top -($balloon-size * 2)
left s('calc(50% - %s)', $balloon-size)
border-top solid $balloon-size transparent
border-left solid $balloon-size transparent
border-right solid $balloon-size transparent
border-bottom solid $balloon-size $border-color
&:after
content ""
display block
position absolute
top -($balloon-size * 2) + 1.5px
left s('calc(50% - %s)', $balloon-size)
border-top solid $balloon-size transparent
border-left solid $balloon-size transparent
border-right solid $balloon-size transparent
border-bottom solid $balloon-size #fff
> button
> a
display block
padding 8px 16px
width 100%
&:hover
color $theme-color-foreground
background $theme-color
text-decoration none
&:active
color $theme-color-foreground
background darken($theme-color, 10%)
</style>

View File

@@ -1,24 +1,33 @@
<template>
<form class="mk-signin" :class="{ signing }" @submit.prevent="onSubmit">
<label class="user-name">
<input v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" placeholder="%i18n:@username%" autofocus required @change="onUsernameChange"/>%fa:at%
</label>
<label class="password">
<input v-model="password" type="password" placeholder="%i18n:@password%" required/>%fa:lock%
</label>
<label class="token" v-if="user && user.twoFactorEnabled">
<input v-model="token" type="number" placeholder="%i18n:@token%" required/>%fa:lock%
</label>
<button type="submit" :disabled="signing">{{ signing ? '%i18n:@signing-in%' : '%i18n:@signin%' }}</button>
もしくは <a :href="`${apiUrl}/signin/twitter`">Twitterでログイン</a>
<div class="avatar" :style="{ backgroundImage: user ? `url('${ user.avatarUrl }')` : null }" v-show="withAvatar"></div>
<ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" spellcheck="false" autofocus required @input="onUsernameChange">
<span>%i18n:@username%</span>
<span slot="prefix">@</span>
<span slot="suffix">@{{ host }}</span>
</ui-input>
<ui-input v-model="password" type="password" required>
<span>%i18n:@password%</span>
<span slot="prefix">%fa:lock%</span>
</ui-input>
<ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" required/>
<ui-button type="submit" :disabled="signing">{{ signing ? '%i18n:@signing-in%' : '%i18n:@signin%' }}</ui-button>
<p style="margin: 8px 0;">または<a :href="`${apiUrl}/signin/twitter`">Twitterでログイン</a></p>
</form>
</template>
<script lang="ts">
import Vue from 'vue';
import { apiUrl } from '../../../config';
import { apiUrl, host } from '../../../config';
export default Vue.extend({
props: {
withAvatar: {
type: Boolean,
required: false,
default: true
}
},
data() {
return {
signing: false,
@@ -27,6 +36,7 @@ export default Vue.extend({
password: '',
token: '',
apiUrl,
host
};
},
methods: {
@@ -35,6 +45,8 @@ export default Vue.extend({
username: this.username
}).then(user => {
this.user = user;
}, () => {
this.user = null;
});
},
onSubmit() {
@@ -59,84 +71,19 @@ export default Vue.extend({
@import '~const.styl'
.mk-signin
color #555
&.signing
&, *
cursor wait !important
label
display block
margin 12px 0
[data-fa]
display block
pointer-events none
position absolute
bottom 0
top 0
left 0
z-index 1
margin auto
padding 0 16px
height 1em
color #898786
input[type=text]
input[type=password]
input[type=number]
user-select text
display inline-block
cursor auto
padding 0 0 0 38px
margin 0
width 100%
line-height 44px
font-size 1em
color rgba(#000, 0.7)
background #fff
outline none
border solid 1px #eee
border-radius 4px
&:hover
background rgba(255, 255, 255, 0.7)
border-color #ddd
& + i
color #797776
&:focus
background #fff
border-color #ccc
& + i
color #797776
[type=submit]
cursor pointer
padding 16px
margin -6px 0 0 0
width 100%
font-size 1.2em
color rgba(#000, 0.5)
outline none
border none
border-radius 0
background transparent
transition all .5s ease
&:hover
color $theme-color
transition all .2s ease
&:focus
color $theme-color
transition all .2s ease
&:active
color darken($theme-color, 30%)
transition all .2s ease
&:disabled
opacity 0.7
> .avatar
margin 16px auto 0 auto
width 64px
height 64px
background #ddd
background-position center
background-size cover
border-radius 100%
</style>

View File

@@ -1,60 +1,58 @@
<template>
<form class="mk-signup" @submit.prevent="onSubmit" autocomplete="off">
<label class="username">
<p class="caption">%fa:at%%i18n:@username%</p>
<input v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" placeholder="a~z、A~Z、0~9、-" autocomplete="off" required @input="onChangeUsername"/>
<p class="profile-page-url-preview" v-if="shouldShowProfileUrl">{{ `${url}/@${username}` }}</p>
<p class="info" v-if="usernameState == 'wait'" style="color:#999">%fa:spinner .pulse .fw%%i18n:@checking%</p>
<p class="info" v-if="usernameState == 'ok'" style="color:#3CB7B5">%fa:check .fw%%i18n:@available%</p>
<p class="info" v-if="usernameState == 'unavailable'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:@unavailable%</p>
<p class="info" v-if="usernameState == 'error'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:@error%</p>
<p class="info" v-if="usernameState == 'invalid-format'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:@invalid-format%</p>
<p class="info" v-if="usernameState == 'min-range'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:@too-short%</p>
<p class="info" v-if="usernameState == 'max-range'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:@too-long%</p>
</label>
<label class="password">
<p class="caption">%fa:lock%%i18n:@password%</p>
<input v-model="password" type="password" placeholder="%i18n:@password-placeholder%" autocomplete="off" required @input="onChangePassword"/>
<div class="meter" v-show="passwordStrength != ''" :data-strength="passwordStrength">
<div class="value" ref="passwordMetar"></div>
<form class="mk-signup" @submit.prevent="onSubmit" :autocomplete="Math.random()">
<ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" :autocomplete="Math.random()" spellcheck="false" required @input="onChangeUsername">
<span>%i18n:@username%</span>
<span slot="prefix">@</span>
<span slot="suffix">@{{ host }}</span>
<p slot="text" v-if="usernameState == 'wait'" style="color:#999">%fa:spinner .pulse .fw% %i18n:@checking%</p>
<p slot="text" v-if="usernameState == 'ok'" style="color:#3CB7B5">%fa:check .fw% %i18n:@available%</p>
<p slot="text" v-if="usernameState == 'unavailable'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@unavailable%</p>
<p slot="text" v-if="usernameState == 'error'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@error%</p>
<p slot="text" v-if="usernameState == 'invalid-format'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@invalid-format%</p>
<p slot="text" v-if="usernameState == 'min-range'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@too-short%</p>
<p slot="text" v-if="usernameState == 'max-range'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@too-long%</p>
</ui-input>
<ui-input v-model="password" type="password" :autocomplete="Math.random()" required @input="onChangePassword" :with-password-meter="true">
<span>%i18n:@password%</span>
<span slot="prefix">%fa:lock%</span>
<div slot="text">
<p slot="text" v-if="passwordStrength == 'low'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@weak-password%</p>
<p slot="text" v-if="passwordStrength == 'medium'" style="color:#3CB7B5">%fa:check .fw% %i18n:@normal-password%</p>
<p slot="text" v-if="passwordStrength == 'high'" style="color:#3CB7B5">%fa:check .fw% %i18n:@strong-password%</p>
</div>
<p class="info" v-if="passwordStrength == 'low'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:@weak-password%</p>
<p class="info" v-if="passwordStrength == 'medium'" style="color:#3CB7B5">%fa:check .fw%%i18n:@normal-password%</p>
<p class="info" v-if="passwordStrength == 'high'" style="color:#3CB7B5">%fa:check .fw%%i18n:@strong-password%</p>
</label>
<label class="retype-password">
<p class="caption">%fa:lock%%i18n:@password%(%i18n:@retype%)</p>
<input v-model="retypedPassword" type="password" placeholder="%i18n:@retype-placeholder%" autocomplete="off" required @input="onChangePasswordRetype"/>
<p class="info" v-if="passwordRetypeState == 'match'" style="color:#3CB7B5">%fa:check .fw%%i18n:@password-matched%</p>
<p class="info" v-if="passwordRetypeState == 'not-match'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:@password-not-matched%</p>
</label>
<label class="recaptcha">
<p class="caption"><template v-if="recaptchaed">%fa:toggle-on%</template><template v-if="!recaptchaed">%fa:toggle-off%</template>%i18n:@recaptcha%</p>
<div class="g-recaptcha" data-callback="onRecaptchaed" data-expired-callback="onRecaptchaExpired" :data-sitekey="recaptchaSitekey"></div>
</label>
<label class="agree-tou">
<input name="agree-tou" type="checkbox" autocomplete="off" required/>
</ui-input>
<ui-input v-model="retypedPassword" type="password" :autocomplete="Math.random()" required @input="onChangePasswordRetype">
<span>%i18n:@password% (%i18n:@retype%)</span>
<span slot="prefix">%fa:lock%</span>
<div slot="text">
<p slot="text" v-if="passwordRetypeState == 'match'" style="color:#3CB7B5">%fa:check .fw% %i18n:@password-matched%</p>
<p slot="text" v-if="passwordRetypeState == 'not-match'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@password-not-matched%</p>
</div>
</ui-input>
<div class="g-recaptcha" :data-sitekey="recaptchaSitekey" style="margin: 16px 0;"></div>
<label class="agree-tou" style="display: block; margin: 16px 0;">
<input name="agree-tou" type="checkbox" required/>
<p><a :href="touUrl" target="_blank">利用規約</a>に同意する</p>
</label>
<button type="submit">%i18n:@create%</button>
<ui-button type="submit">%i18n:@create%</ui-button>
</form>
</template>
<script lang="ts">
import Vue from 'vue';
const getPasswordStrength = require('syuilo-password-strength');
import { url, docsUrl, lang, recaptchaSitekey } from '../../../config';
import { host, url, docsUrl, lang, recaptchaSitekey } from '../../../config';
export default Vue.extend({
data() {
return {
host,
username: '',
password: '',
retypedPassword: '',
url,
touUrl: `${docsUrl}/${lang}/tou`,
recaptchaSitekey,
recaptchaed: false,
usernameState: null,
passwordStrength: '',
passwordRetypeState: null
@@ -104,7 +102,6 @@ export default Vue.extend({
const strength = getPasswordStrength(this.password);
this.passwordStrength = strength > 0.7 ? 'high' : strength > 0.3 ? 'medium' : 'low';
(this.$refs.passwordMetar as any).style.width = `${strength * 100}%`;
},
onChangePasswordRetype() {
if (this.retypedPassword == '') {
@@ -130,19 +127,9 @@ export default Vue.extend({
alert('%i18n:@some-error%');
(window as any).grecaptcha.reset();
this.recaptchaed = false;
});
}
},
created() {
(window as any).onRecaptchaed = () => {
this.recaptchaed = true;
};
(window as any).onRecaptchaExpired = () => {
this.recaptchaed = false;
};
},
mounted() {
const head = document.getElementsByTagName('head')[0];
const script = document.createElement('script');
@@ -158,100 +145,6 @@ export default Vue.extend({
.mk-signup
min-width 302px
label
display block
margin 0 0 16px 0
> .caption
margin 0 0 4px 0
color #828888
font-size 0.95em
> [data-fa]
margin-right 0.25em
color #96adac
> .info
display block
margin 4px 0
font-size 0.8em
> [data-fa]
margin-right 0.3em
&.username
.profile-page-url-preview
display block
margin 4px 8px 0 4px
font-size 0.8em
color #888
&:empty
display none
&:not(:empty) + .info
margin-top 0
&.password
.meter
display block
margin-top 8px
width 100%
height 8px
&[data-strength='']
display none
&[data-strength='low']
> .value
background #d73612
&[data-strength='medium']
> .value
background #d7ca12
&[data-strength='high']
> .value
background #61bb22
> .value
display block
width 0%
height 100%
background transparent
border-radius 4px
transition all 0.1s ease
[type=text], [type=password]
user-select text
display inline-block
cursor auto
padding 0 12px
margin 0
width 100%
line-height 44px
font-size 1em
color #333 !important
background #fff !important
outline none
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(#000, 0.2)
transition all .1s ease
&:focus
color $theme-color !important
border-color $theme-color
box-shadow 0 0 0 1024px #fff inset, 0 0 0 4px rgba($theme-color, 10%)
transition all 0s ease
&:disabled
opacity 0.5
.agree-tou
padding 4px
border-radius 4px
@@ -269,19 +162,4 @@ export default Vue.extend({
display inline
color #555
button
margin 0
padding 16px
width 100%
font-size 1em
color #fff
background $theme-color
border-radius 3px
&:hover
background lighten($theme-color, 5%)
&:active
background darken($theme-color, 5%)
</style>

View File

@@ -58,18 +58,21 @@ export default Vue.extend({
},
created() {
if (this.mode == 'relative' || this.mode == 'detail') {
this.tick();
this.tickId = setInterval(this.tick, 1000);
this.tickId = window.requestAnimationFrame(this.tick);
}
},
destroyed() {
if (this.mode === 'relative' || this.mode === 'detail') {
clearInterval(this.tickId);
window.clearTimeout(this.tickId);
}
},
methods: {
tick() {
this.now = new Date();
this.tickId = setTimeout(() => {
window.requestAnimationFrame(this.tick);
}, 10000);
}
}
});

View File

@@ -0,0 +1,82 @@
<template>
<div class="ui-button" :class="[styl]">
<button :type="type" @click="$emit('click')">
<slot></slot>
</button>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
export default Vue.extend({
props: {
type: {
type: String,
required: false
}
},
data() {
return {
styl: 'fill'
};
},
inject: {
isCardChild: { default: false }
},
created() {
if (this.isCardChild) {
this.styl = 'line';
}
}
});
</script>
<style lang="stylus" scoped>
@import '~const.styl'
root(isDark, fill)
> button
display block
width 100%
margin 0
padding 0
font-weight bold
font-size 16px
line-height 44px
border none
border-radius 6px
outline none
box-shadow none
if fill
color $theme-color-foreground
background $theme-color
&:hover
background lighten($theme-color, 5%)
&:active
background darken($theme-color, 5%)
else
color $theme-color
background none
&:hover
color darken($theme-color, 5%)
&:active
background rgba($theme-color, 0.3)
.ui-button[data-darkmode]
&.fill
root(true, true)
&:not(.fill)
root(true, false)
.ui-button:not([data-darkmode])
&.fill
root(false, true)
&:not(.fill)
root(false, false)
</style>

View File

@@ -0,0 +1,46 @@
<template>
<div class="ui-card">
<header>
<slot name="title"></slot>
</header>
<slot></slot>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
export default Vue.extend({
provide() {
return {
isCardChild: true
};
}
});
</script>
<style lang="stylus" scoped>
@import '~const.styl'
root(isDark)
margin 16px
padding 16px
color isDark ? #fff : #000
background isDark ? #282C37 : #fff
box-shadow 0 3px 1px -2px rgba(#000, 0.2), 0 2px 2px 0 rgba(#000, 0.14), 0 1px 5px 0 rgba(#000, 0.12)
@media (min-width 500px)
padding 32px
> header
font-weight normal
font-size 24px
color isDark ? #fff : #444
.ui-card[data-darkmode]
root(true)
.ui-card:not([data-darkmode])
root(false)
</style>

View File

@@ -0,0 +1,30 @@
<template>
<div class="ui-form">
<fieldset :disabled="disabled">
<slot></slot>
</fieldset>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
export default Vue.extend({
props: {
disabled: {
type: Boolean,
required: false
}
}
});
</script>
<style lang="stylus" scoped>
@import '~const.styl'
.ui-form
> fieldset
margin 0
padding 0
border none
</style>

View File

@@ -0,0 +1,346 @@
<template>
<div class="ui-input" :class="[{ focused, filled }, styl]">
<div class="icon" ref="icon"><slot name="icon"></slot></div>
<div class="input">
<div class="password-meter" v-if="withPasswordMeter" v-show="passwordStrength != ''" :data-strength="passwordStrength">
<div class="value" ref="passwordMetar"></div>
</div>
<span class="label" ref="label"><slot></slot></span>
<div class="prefix" ref="prefix"><slot name="prefix"></slot></div>
<template v-if="type != 'file'">
<input ref="input"
:type="type"
v-model="v"
:required="required"
:readonly="readonly"
:pattern="pattern"
:autocomplete="autocomplete"
:spellcheck="spellcheck"
@focus="focused = true"
@blur="focused = false">
</template>
<template v-else>
<input ref="input"
type="text"
:value="placeholder"
readonly
@click="chooseFile">
<input ref="file"
type="file"
:value="value"
@change="onChangeFile">
</template>
<div class="suffix" ref="suffix"><slot name="suffix"></slot></div>
</div>
<div class="text"><slot name="text"></slot></div>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
const getPasswordStrength = require('syuilo-password-strength');
export default Vue.extend({
props: {
value: {
required: false
},
type: {
type: String,
required: false
},
required: {
type: Boolean,
required: false
},
readonly: {
type: Boolean,
required: false
},
pattern: {
type: String,
required: false
},
autocomplete: {
required: false
},
spellcheck: {
required: false
},
withPasswordMeter: {
type: Boolean,
required: false,
default: false
}
},
data() {
return {
v: this.value,
focused: false,
passwordStrength: '',
styl: 'fill'
};
},
computed: {
filled(): boolean {
return this.v != '' && this.v != null;
},
placeholder(): string {
if (this.type != 'file') return null;
if (this.v == null) return null;
if (typeof this.v == 'string') return this.v;
if (Array.isArray(this.v)) {
return this.v.map(file => file.name).join(', ');
} else {
return this.v.name;
}
}
},
watch: {
value(v) {
this.v = v;
},
v(v) {
this.$emit('input', v);
if (this.withPasswordMeter) {
if (v == '') {
this.passwordStrength = '';
return;
}
const strength = getPasswordStrength(v);
this.passwordStrength = strength > 0.7 ? 'high' : strength > 0.3 ? 'medium' : 'low';
(this.$refs.passwordMetar as any).style.width = `${strength * 100}%`;
}
}
},
inject: {
isCardChild: { default: false }
},
created() {
if (this.isCardChild) {
this.styl = 'line';
}
},
mounted() {
if (this.$refs.prefix) {
this.$refs.label.style.left = (this.$refs.prefix.offsetLeft + this.$refs.prefix.offsetWidth) + 'px';
if (this.$refs.prefix.offsetWidth) {
this.$refs.input.style.paddingLeft = this.$refs.prefix.offsetWidth + 'px';
}
}
if (this.$refs.suffix) {
if (this.$refs.suffix.offsetWidth) {
this.$refs.input.style.paddingRight = this.$refs.suffix.offsetWidth + 'px';
}
}
},
methods: {
focus() {
this.$refs.input.focus();
},
chooseFile() {
this.$refs.file.click();
},
onChangeFile() {
this.v = Array.from((this.$refs.file as any).files);
this.$emit('input', this.v);
this.$emit('change', this.v);
}
}
});
</script>
<style lang="stylus" scoped>
@import '~const.styl'
root(isDark, fill)
margin 32px 0
> .icon
position absolute
top 0
left 0
width 24px
text-align center
line-height 32px
color isDark ? rgba(#fff, 0.7) : rgba(#000, 0.54)
&:not(:empty) + .input
margin-left 28px
> .input
if !fill
&:before
content ''
display block
position absolute
bottom 0
left 0
right 0
height 1px
background isDark ? rgba(#fff, 0.7) : rgba(#000, 0.42)
&:after
content ''
display block
position absolute
bottom 0
left 0
right 0
height 2px
background $theme-color
opacity 0
transform scaleX(0.12)
transition border 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.3s cubic-bezier(0.4, 0, 0.2, 1), transform 0.3s cubic-bezier(0.4, 0, 0.2, 1)
will-change border opacity transform
> .password-meter
position absolute
top 0
left 0
width 100%
height 100%
border-radius 6px
overflow hidden
opacity 0.3
&[data-strength='']
display none
&[data-strength='low']
> .value
background #d73612
&[data-strength='medium']
> .value
background #d7ca12
&[data-strength='high']
> .value
background #61bb22
> .value
display block
width 0%
height 100%
background transparent
border-radius 6px
transition all 0.1s ease
> .label
position absolute
z-index 1
top fill ? 6px : 0
left 0
pointer-events none
transition 0.4s cubic-bezier(0.25, 0.8, 0.25, 1)
transition-duration 0.3s
font-size 16px
line-height 32px
color isDark ? rgba(#fff, 0.7) : rgba(#000, 0.54)
pointer-events none
//will-change transform
transform-origin top left
transform scale(1)
> input
display block
width 100%
margin 0
padding 0
font inherit
font-weight fill ? bold : normal
font-size 16px
line-height 32px
color isDark ? #fff : #000
background transparent
border none
border-radius 0
outline none
box-shadow none
if fill
padding 6px 12px
background rgba(#000, 0.035)
border-radius 6px
&[type='file']
display none
> .prefix
> .suffix
display block
position absolute
z-index 1
top 0
font-size 16px
line-height fill ? 44px : 32px
color isDark ? rgba(#fff, 0.7) : rgba(#000, 0.54)
pointer-events none
&:empty
display none
> *
display block
min-width 16px
> .prefix
left 0
padding-right 4px
if fill
padding-left 12px
> .suffix
right 0
padding-left 4px
if fill
padding-right 12px
> .text
margin 6px 0
font-size 13px
*
margin 0
&.focused
> .input
if fill
background rgba(#000, 0.05)
else
&:after
opacity 1
transform scaleX(1)
> .label
color $theme-color
&.focused
&.filled
> .input
> .label
top fill ? -24px : -17px
left 0 !important
transform scale(0.75)
.ui-input[data-darkmode]
&.fill
root(true, true)
&:not(.fill)
root(true, false)
.ui-input:not([data-darkmode])
&.fill
root(false, true)
&:not(.fill)
root(false, false)
</style>

View File

@@ -0,0 +1,120 @@
<template>
<div
class="ui-radio"
:class="{ disabled, checked }"
:aria-checked="checked"
:aria-disabled="disabled"
@click="toggle"
>
<input type="radio"
:disabled="disabled"
>
<span class="button">
<span></span>
</span>
<span class="label"><slot></slot></span>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
export default Vue.extend({
model: {
prop: 'model',
event: 'change'
},
props: {
model: {
type: String,
required: false
},
value: {
type: String,
required: false
},
disabled: {
type: Boolean,
default: false
}
},
computed: {
checked(): boolean {
return this.model === this.value;
}
},
methods: {
toggle() {
this.$emit('change', this.value);
}
}
});
</script>
<style lang="stylus" scoped>
@import '~const.styl'
root(isDark)
display inline-block
margin 32px 32px 32px 0
cursor pointer
transition all 0.3s
> *
user-select none
&.disabled
opacity 0.6
cursor not-allowed
&.checked
> .button
border-color $theme-color
&:after
background-color $theme-color
transform scale(1)
opacity 1
> input
position absolute
width 0
height 0
opacity 0
margin 0
> .button
position absolute
width 20px
height 20px
background none
border solid 2px isDark ? rgba(#fff, 0.7) : rgba(#000, 0.54)
border-radius 100%
transition inherit
&:after
content ''
display block
position absolute
top 3px
right 3px
bottom 3px
left 3px
border-radius 100%
opacity 0
transform scale(0)
transition 0.4s cubic-bezier(0.25, 0.8, 0.25, 1)
> .label
margin-left 28px
display block
font-size 16px
line-height 20px
cursor pointer
.ui-radio[data-darkmode]
root(true)
.ui-radio:not([data-darkmode])
root(false)
</style>

View File

@@ -0,0 +1,215 @@
<template>
<div class="ui-select" :class="[{ focused, filled }, styl]">
<div class="icon" ref="icon"><slot name="icon"></slot></div>
<div class="input" @click="focus">
<span class="label" ref="label"><slot name="label"></slot></span>
<div class="prefix" ref="prefix"><slot name="prefix"></slot></div>
<select ref="input"
:value="v"
:required="required"
@input="$emit('input', $event.target.value)"
@focus="focused = true"
@blur="focused = false">
<slot></slot>
</select>
<div class="suffix"><slot name="suffix"></slot></div>
</div>
<div class="text"><slot name="text"></slot></div>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
export default Vue.extend({
props: {
value: {
required: false
},
required: {
type: Boolean,
required: false
}
},
data() {
return {
v: this.value,
focused: false,
styl: 'fill'
};
},
computed: {
filled(): boolean {
return this.v != '' && this.v != null;
}
},
watch: {
value(v) {
this.v = v;
}
},
inject: {
isCardChild: { default: false }
},
created() {
if (this.isCardChild) {
this.styl = 'line';
}
},
mounted() {
if (this.$refs.prefix) {
this.$refs.label.style.left = (this.$refs.prefix.offsetLeft + this.$refs.prefix.offsetWidth) + 'px';
}
},
methods: {
focus() {
this.$refs.input.focus();
}
}
});
</script>
<style lang="stylus" scoped>
@import '~const.styl'
root(isDark, fill)
margin 32px 0
> .icon
position absolute
top 0
left 0
width 24px
text-align center
line-height 32px
color rgba(#000, 0.54)
&:not(:empty) + .input
margin-left 28px
> .input
display flex
if fill
padding 6px 12px
background rgba(#000, 0.035)
border-radius 6px
else
&:before
content ''
display block
position absolute
bottom 0
left 0
right 0
height 1px
background isDark ? rgba(#fff, 0.7) : rgba(#000, 0.42)
&:after
content ''
display block
position absolute
bottom 0
left 0
right 0
height 2px
background $theme-color
opacity 0
transform scaleX(0.12)
transition border 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.3s cubic-bezier(0.4, 0, 0.2, 1), transform 0.3s cubic-bezier(0.4, 0, 0.2, 1)
will-change border opacity transform
> .label
position absolute
top fill ? 6px : 0
left 0
pointer-events none
transition 0.4s cubic-bezier(0.25, 0.8, 0.25, 1)
transition-duration 0.3s
font-size 16px
line-height 32px
color rgba(#000, 0.54)
pointer-events none
//will-change transform
transform-origin top left
transform scale(1)
> select
display block
flex 1
width 100%
padding 0
font inherit
font-weight fill ? bold : normal
font-size 16px
height 32px
color isDark ? #fff : #000
background transparent
border none
border-radius 0
outline none
box-shadow none
*
color #000
> .prefix
> .suffix
display block
align-self center
justify-self center
font-size 16px
line-height 32px
color rgba(#000, 0.54)
pointer-events none
> *
display block
min-width 16px
> .prefix
padding-right 4px
> .suffix
padding-left 4px
> .text
margin 6px 0
font-size 13px
*
margin 0
&.focused
> .input
if fill
background rgba(#000, 0.05)
else
&:after
opacity 1
transform scaleX(1)
> .label
color $theme-color
&.focused
&.filled
> .input
> .label
top fill ? -24px : -17px
left 0 !important
transform scale(0.75)
.ui-select[data-darkmode]
&.fill
root(true, true)
&:not(.fill)
root(true, false)
.ui-select:not([data-darkmode])
&.fill
root(false, true)
&:not(.fill)
root(false, false)
</style>

View File

@@ -0,0 +1,135 @@
<template>
<div
class="ui-switch"
:class="{ disabled, checked }"
role="switch"
:aria-checked="checked"
:aria-disabled="disabled"
@click="toggle"
>
<input
type="checkbox"
ref="input"
:disabled="disabled"
@keydown.enter="toggle"
>
<span class="button">
<span></span>
</span>
<span class="label">
<span :aria-hidden="!checked"><slot></slot></span>
<p :aria-hidden="!checked">
<slot name="text"></slot>
</p>
</span>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
export default Vue.extend({
model: {
prop: 'value',
event: 'change'
},
props: {
value: {
type: Boolean,
default: false
},
disabled: {
type: Boolean,
default: false
}
},
computed: {
checked(): boolean {
return this.value;
}
},
methods: {
toggle() {
this.$emit('change', !this.checked);
}
}
});
</script>
<style lang="stylus" scoped>
@import '~const.styl'
root(isDark)
display flex
margin 32px 0
cursor pointer
transition all 0.3s
> *
user-select none
&.disabled
opacity 0.6
cursor not-allowed
&.checked
> .button
background-color rgba($theme-color, 0.4)
border-color rgba($theme-color, 0.4)
> *
background-color $theme-color
transform translateX(14px)
> input
position absolute
width 0
height 0
opacity 0
margin 0
> .button
display inline-block
margin 3px 0 0 0
width 34px
height 14px
background isDark ? rgba(#fff, 0.15) : rgba(#000, 0.25)
outline none
border-radius 14px
transition inherit
> *
position absolute
top -3px
left 0
border-radius 100%
transition background-color 0.3s, transform 0.3s
width 20px
height 20px
background-color #fff
box-shadow 0 2px 1px -1px rgba(#000, 0.2), 0 1px 1px 0 rgba(#000, 0.14), 0 1px 3px 0 rgba(#000, 0.12)
> .label
margin-left 8px
display block
font-size 16px
cursor pointer
transition inherit
> span
display block
line-height 20px
color isDark ? #c4ccd2 : rgba(#000, 0.75)
transition inherit
> p
margin 0
//font-size 90%
color isDark ? #78858e : #9daab3
.ui-switch[data-darkmode]
root(true)
.ui-switch:not([data-darkmode])
root(false)
</style>

View File

@@ -0,0 +1,174 @@
<template>
<div class="ui-textarea" :class="{ focused, filled }">
<div class="input">
<span class="label" ref="label"><slot></slot></span>
<textarea ref="input"
:value="value"
:required="required"
:readonly="readonly"
:pattern="pattern"
:autocomplete="autocomplete"
@input="$emit('input', $event.target.value)"
@focus="focused = true"
@blur="focused = false">
</textarea>
</div>
<div class="text"><slot name="text"></slot></div>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
const getPasswordStrength = require('syuilo-password-strength');
export default Vue.extend({
props: {
value: {
required: false
},
required: {
type: Boolean,
required: false
},
readonly: {
type: Boolean,
required: false
},
pattern: {
type: String,
required: false
},
autocomplete: {
type: String,
required: false
}
},
data() {
return {
focused: false,
passwordStrength: ''
}
},
computed: {
filled(): boolean {
return this.value != '' && this.value != null;
}
},
methods: {
focus() {
this.$refs.input.focus();
}
}
});
</script>
<style lang="stylus" scoped>
@import '~const.styl'
root(isDark, fill)
margin 42px 0 32px 0
> .input
padding 12px
if fill
background rgba(#000, 0.035)
border-radius 6px
else
&:before
content ''
display block
position absolute
top 0
bottom 0
left 0
right 0
background none
border solid 1px isDark ? rgba(#fff, 0.7) : rgba(#000, 0.42)
border-radius 3px
pointer-events none
&:after
content ''
display block
position absolute
top 0
bottom 0
left 0
right 0
background none
border solid 2px $theme-color
border-radius 3px
opacity 0
transition opacity 0.3s cubic-bezier(0.4, 0, 0.2, 1)
pointer-events none
> .label
position absolute
top 6px
left 12px
pointer-events none
transition 0.4s cubic-bezier(0.25, 0.8, 0.25, 1)
transition-duration 0.3s
font-size 16px
line-height 32px
color isDark ? rgba(#fff, 0.7) : rgba(#000, 0.54)
pointer-events none
//will-change transform
transform-origin top left
transform scale(1)
> textarea
display block
width 100%
min-height 100px
padding 0
font inherit
font-weight fill ? bold : normal
font-size 16px
color isDark ? #fff : #000
background transparent
border none
border-radius 0
outline none
box-shadow none
> .text
margin 6px 0
font-size 13px
*
margin 0
&.focused
> .input
if fill
background rgba(#000, 0.05)
else
&:after
opacity 1
> .label
color $theme-color
&.focused
&.filled
> .input
> .label
top -24px
left 0 !important
transform scale(0.75)
.ui-textarea[data-darkmode]
&.fill
root(true, true)
&:not(.fill)
root(true, false)
.ui-textarea:not([data-darkmode])
&.fill
root(false, true)
&:not(.fill)
root(false, false)
</style>

View File

@@ -203,6 +203,7 @@ root(isDark)
justify-content center
align-items center
margin-right 10px
width 16px
> *:last-child
flex 1 1 auto

View File

@@ -109,6 +109,9 @@ root(isDark)
> .created-at
color isDark ? #606984 : #c0c0c0
> .text
text-align left
.mk-welcome-timeline[data-darkmode]
root(true)

View File

@@ -0,0 +1,41 @@
<template>
<div class="mkw-analog-clock">
<mk-widget-container :naked="props.naked" :show-header="false">
<div class="mkw-analog-clock--body">
<mk-analog-clock :dark="$store.state.device.darkmode"/>
</div>
</mk-widget-container>
</div>
</template>
<script lang="ts">
import define from '../../../common/define-widget';
export default define({
name: 'analog-clock',
props: () => ({
naked: false
})
}).extend({
methods: {
func() {
this.props.naked = !this.props.naked;
this.save();
}
}
});
</script>
<style lang="stylus" scoped>
@import '~const.styl'
root(isDark)
.mkw-analog-clock--body
padding 8px
.mkw-analog-clock[data-darkmode]
root(true)
.mkw-analog-clock:not([data-darkmode])
root(false)
</style>

View File

@@ -2,7 +2,7 @@
<div class="mkw-broadcast"
:data-found="broadcasts.length != 0"
:data-melt="props.design == 1"
:data-mobile="isMobile"
:data-mobile="platform == 'mobile'"
>
<div class="icon">
<svg height="32" version="1.1" viewBox="0 0 32 32" width="32">

View File

@@ -1,5 +1,5 @@
<template>
<div class="mkw-calendar" :data-special="special" :data-mobile="isMobile">
<div class="mkw-calendar" :data-special="special" :data-mobile="platform == 'mobile'">
<mk-widget-container :naked="props.design == 1" :show-header="false">
<div class="mkw-calendar--body">
<div class="calendar" :data-is-holiday="isHoliday">
@@ -67,7 +67,7 @@ export default define({
},
methods: {
func() {
if (this.isMobile) return;
if (this.platform == 'mobile') return;
if (this.props.design == 2) {
this.props.design = 0;
} else {

View File

@@ -1,5 +1,5 @@
<template>
<div class="mkw-donation" :data-mobile="isMobile">
<div class="mkw-donation" :data-mobile="platform == 'mobile'">
<article>
<h1>%fa:heart%%i18n:@title%</h1>
<p>

View File

@@ -0,0 +1,89 @@
<template>
<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" style="overflow:visible">
<defs>
<linearGradient :id="gradientId" x1="0" x2="0" y1="1" y2="0">
<stop offset="0%" stop-color="hsl(200, 80%, 70%)"></stop>
<stop offset="100%" stop-color="hsl(90, 80%, 70%)"></stop>
</linearGradient>
<mask :id="maskId" x="0" y="0" :width="viewBoxX" :height="viewBoxY">
<polygon
:points="polygonPoints"
fill="#fff"
fill-opacity="0.5"/>
<polyline
:points="polylinePoints"
fill="none"
stroke="#fff"
stroke-width="2"/>
<circle
:cx="headX"
:cy="headY"
r="3"
fill="#fff"/>
</mask>
</defs>
<rect
x="-10" y="-10"
:width="viewBoxX + 20" :height="viewBoxY + 20"
:style="`stroke: none; fill: url(#${ gradientId }); mask: url(#${ maskId })`"/>
</svg>
</template>
<script lang="ts">
import Vue from 'vue';
import * as uuid from 'uuid';
export default Vue.extend({
props: {
src: {
type: Array,
required: true
}
},
data() {
return {
viewBoxX: 50,
viewBoxY: 30,
gradientId: uuid(),
maskId: uuid(),
polylinePoints: '',
polygonPoints: '',
headX: null,
headY: null,
clock: null
};
},
watch: {
src() {
this.draw();
}
},
created() {
this.draw();
// Vueが何故かWatchを発動させない場合があるので
this.clock = setInterval(this.draw, 1000);
},
beforeDestroy() {
clearInterval(this.clock);
},
methods: {
draw() {
const stats = this.src.slice().reverse();
const peak = Math.max.apply(null, stats) || 1;
const polylinePoints = stats.map((n, i) => [
i * (this.viewBoxX / (stats.length - 1)),
(1 - (n / peak)) * this.viewBoxY
]);
this.polylinePoints = polylinePoints.map(xy => `${xy[0]},${xy[1]}`).join(' ');
this.polygonPoints = `0,${ this.viewBoxY } ${ this.polylinePoints } ${ this.viewBoxX },${ this.viewBoxY }`;
this.headX = polylinePoints[polylinePoints.length - 1][0];
this.headY = polylinePoints[polylinePoints.length - 1][1];
}
}
});
</script>

View File

@@ -0,0 +1,118 @@
<template>
<div class="mkw-hashtags">
<mk-widget-container :show-header="!props.compact">
<template slot="header">%fa:hashtag%%i18n:@title%</template>
<div class="mkw-hashtags--body" :data-mobile="platform == 'mobile'">
<p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p>
<p class="empty" v-else-if="stats.length == 0">%fa:exclamation-circle%%i18n:@empty%</p>
<transition-group v-else tag="div" name="chart">
<div v-for="stat in stats" :key="stat.tag">
<div class="tag">
<router-link :to="`/tags/${ stat.tag }`" :title="stat.tag">#{{ stat.tag }}</router-link>
<p>{{ '%i18n:@count%'.replace('{}', stat.usersCount) }}</p>
</div>
<x-chart class="chart" :src="stat.chart"/>
</div>
</transition-group>
</div>
</mk-widget-container>
</div>
</template>
<script lang="ts">
import define from '../../../common/define-widget';
import XChart from './hashtags.chart.vue';
export default define({
name: 'hashtags',
props: () => ({
compact: false
})
}).extend({
components: {
XChart
},
data() {
return {
stats: [],
fetching: true,
clock: null
};
},
mounted() {
this.fetch();
this.clock = setInterval(this.fetch, 1000 * 60);
},
beforeDestroy() {
clearInterval(this.clock);
},
methods: {
func() {
this.props.compact = !this.props.compact;
this.save();
},
fetch() {
(this as any).api('hashtags/trend').then(stats => {
this.stats = stats;
this.fetching = false;
});
}
}
});
</script>
<style lang="stylus" scoped>
root(isDark)
.mkw-hashtags--body
> .fetching
> .empty
margin 0
padding 16px
text-align center
color #aaa
> [data-fa]
margin-right 4px
> div
.chart-move
transition transform 1s ease
> div
display flex
align-items center
padding 14px 16px
&:not(:last-child)
border-bottom solid 1px isDark ? #393f4f : #eee
> .tag
flex 1
overflow hidden
font-size 14px
color isDark ? #9baec8 : #65727b
> a
display block
width 100%
white-space nowrap
overflow hidden
text-overflow ellipsis
color inherit
> p
margin 0
font-size 75%
opacity 0.7
> .chart
height 30px
.mkw-hashtags[data-darkmode]
root(true)
.mkw-hashtags:not([data-darkmode])
root(false)
</style>

View File

@@ -1,8 +1,10 @@
import Vue from 'vue';
import wAnalogClock from './analog-clock.vue';
import wVersion from './version.vue';
import wRss from './rss.vue';
import wServer from './server.vue';
import wPostsMonitor from './posts-monitor.vue';
import wMemo from './memo.vue';
import wBroadcast from './broadcast.vue';
import wCalendar from './calendar.vue';
@@ -11,7 +13,9 @@ import wSlideshow from './slideshow.vue';
import wTips from './tips.vue';
import wDonation from './donation.vue';
import wNav from './nav.vue';
import wHashtags from './hashtags.vue';
Vue.component('mkw-analog-clock', wAnalogClock);
Vue.component('mkw-nav', wNav);
Vue.component('mkw-calendar', wCalendar);
Vue.component('mkw-photo-stream', wPhotoStream);
@@ -20,6 +24,8 @@ Vue.component('mkw-tips', wTips);
Vue.component('mkw-donation', wDonation);
Vue.component('mkw-broadcast', wBroadcast);
Vue.component('mkw-server', wServer);
Vue.component('mkw-posts-monitor', wPostsMonitor);
Vue.component('mkw-memo', wMemo);
Vue.component('mkw-rss', wRss);
Vue.component('mkw-version', wVersion);
Vue.component('mkw-hashtags', wHashtags);

View File

@@ -73,6 +73,7 @@ root(isDark)
background isDark ? #282c37 : #fff
border none
border-bottom solid 1px isDark ? #1c2023 : #eee
border-radius 0
> button
display block

View File

@@ -0,0 +1,211 @@
<template>
<div class="mkw-posts-monitor">
<mk-widget-container :show-header="props.design == 0" :naked="props.design == 2">
<template slot="header">%fa:chart-line%%i18n:@title%</template>
<button slot="func" @click="toggle" title="%i18n:@toggle%">%fa:sort%</button>
<div class="qpdmibaztplkylerhdbllwcokyrfxeyj" :class="{ dual: props.view == 0 }" :data-darkmode="$store.state.device.darkmode">
<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" v-show="props.view != 2">
<defs>
<linearGradient :id="localGradientId" x1="0" x2="0" y1="1" y2="0">
<stop offset="0%" stop-color="hsl(200, 80%, 70%)"></stop>
<stop offset="100%" stop-color="hsl(90, 80%, 70%)"></stop>
</linearGradient>
<mask :id="localMaskId" x="0" y="0" :width="viewBoxX" :height="viewBoxY">
<polygon
:points="localPolygonPoints"
fill="#fff"
fill-opacity="0.5"/>
<polyline
:points="localPolylinePoints"
fill="none"
stroke="#fff"
stroke-width="1"/>
<circle
:cx="localHeadX"
:cy="localHeadY"
r="1.5"
fill="#fff"/>
</mask>
</defs>
<rect
x="-2" y="-2"
:width="viewBoxX + 4" :height="viewBoxY + 4"
:style="`stroke: none; fill: url(#${ localGradientId }); mask: url(#${ localMaskId })`"/>
<text x="1" y="5">Local</text>
</svg>
<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" v-show="props.view != 1">
<defs>
<linearGradient :id="fediGradientId" x1="0" x2="0" y1="1" y2="0">
<stop offset="0%" stop-color="hsl(200, 80%, 70%)"></stop>
<stop offset="100%" stop-color="hsl(90, 80%, 70%)"></stop>
</linearGradient>
<mask :id="fediMaskId" x="0" y="0" :width="viewBoxX" :height="viewBoxY">
<polygon
:points="fediPolygonPoints"
fill="#fff"
fill-opacity="0.5"/>
<polyline
:points="fediPolylinePoints"
fill="none"
stroke="#fff"
stroke-width="1"/>
<circle
:cx="fediHeadX"
:cy="fediHeadY"
r="1.5"
fill="#fff"/>
</mask>
</defs>
<rect
x="-2" y="-2"
:width="viewBoxX + 4" :height="viewBoxY + 4"
:style="`stroke: none; fill: url(#${ fediGradientId }); mask: url(#${ fediMaskId })`"/>
<text x="1" y="5">Fedi</text>
</svg>
</div>
</mk-widget-container>
</div>
</template>
<script lang="ts">
import define from '../../../common/define-widget';
import * as uuid from 'uuid';
export default define({
name: 'server',
props: () => ({
design: 0,
view: 0
})
}).extend({
data() {
return {
connection: null,
connectionId: null,
viewBoxY: 30,
stats: [],
fediGradientId: uuid(),
fediMaskId: uuid(),
localGradientId: uuid(),
localMaskId: uuid(),
fediPolylinePoints: '',
localPolylinePoints: '',
fediPolygonPoints: '',
localPolygonPoints: '',
fediHeadX: null,
fediHeadY: null,
localHeadX: null,
localHeadY: null
};
},
computed: {
viewBoxX(): number {
return this.props.view == 0 ? 50 : 100;
}
},
watch: {
viewBoxX() {
this.draw();
}
},
mounted() {
this.connection = (this as any).os.streams.notesStatsStream.getConnection();
this.connectionId = (this as any).os.streams.notesStatsStream.use();
this.connection.on('stats', this.onStats);
this.connection.on('statsLog', this.onStatsLog);
this.connection.send({
type: 'requestLog',
id: Math.random().toString()
});
},
beforeDestroy() {
this.connection.off('stats', this.onStats);
this.connection.off('statsLog', this.onStatsLog);
(this as any).os.streams.notesStatsStream.dispose(this.connectionId);
},
methods: {
toggle() {
if (this.props.view == 2) {
this.props.view = 0;
} else {
this.props.view++;
}
this.save();
},
func() {
if (this.props.design == 2) {
this.props.design = 0;
} else {
this.props.design++;
}
this.save();
},
draw() {
const stats = this.props.view == 0 ? this.stats.slice(-50) : this.stats;
const fediPeak = Math.max.apply(null, stats.map(x => x.all)) || 1;
const localPeak = Math.max.apply(null, stats.map(x => x.local)) || 1;
const fediPolylinePoints = stats.map((s, i) => [this.viewBoxX - ((stats.length - 1) - i), (1 - (s.all / fediPeak)) * this.viewBoxY]);
const localPolylinePoints = stats.map((s, i) => [this.viewBoxX - ((stats.length - 1) - i), (1 - (s.local / localPeak)) * this.viewBoxY]);
this.fediPolylinePoints = fediPolylinePoints.map(xy => `${xy[0]},${xy[1]}`).join(' ');
this.localPolylinePoints = localPolylinePoints.map(xy => `${xy[0]},${xy[1]}`).join(' ');
this.fediPolygonPoints = `${this.viewBoxX - (stats.length - 1)},${ this.viewBoxY } ${ this.fediPolylinePoints } ${ this.viewBoxX },${ this.viewBoxY }`;
this.localPolygonPoints = `${this.viewBoxX - (stats.length - 1)},${ this.viewBoxY } ${ this.localPolylinePoints } ${ this.viewBoxX },${ this.viewBoxY }`;
this.fediHeadX = fediPolylinePoints[fediPolylinePoints.length - 1][0];
this.fediHeadY = fediPolylinePoints[fediPolylinePoints.length - 1][1];
this.localHeadX = localPolylinePoints[localPolylinePoints.length - 1][0];
this.localHeadY = localPolylinePoints[localPolylinePoints.length - 1][1];
},
onStats(stats) {
this.stats.push(stats);
if (this.stats.length > 100) this.stats.shift();
this.draw();
},
onStatsLog(statsLog) {
statsLog.forEach(stats => this.onStats(stats));
}
}
});
</script>
<style lang="stylus" scoped>
root(isDark)
&.dual
> svg
width 50%
float left
&:first-child
padding-right 5px
&:last-child
padding-left 5px
> svg
display block
padding 10px
width 100%
> text
font-size 5px
fill isDark ? rgba(#fff, 0.55) : rgba(#000, 0.55)
> tspan
opacity 0.5
&:after
content ""
display block
clear both
.qpdmibaztplkylerhdbllwcokyrfxeyj[data-darkmode]
root(true)
.qpdmibaztplkylerhdbllwcokyrfxeyj:not([data-darkmode])
root(false)
</style>

View File

@@ -4,7 +4,7 @@
<template slot="header">%fa:rss-square%RSS</template>
<button slot="func" title="設定" @click="setting">%fa:cog%</button>
<div class="mkw-rss--body" :data-mobile="isMobile">
<div class="mkw-rss--body" :data-mobile="platform == 'mobile'">
<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>

View File

@@ -1,6 +1,6 @@
<template>
<div class="cpu-memory">
<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" preserveAspectRatio="none">
<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`">
<defs>
<linearGradient :id="cpuGradientId" x1="0" x2="0" y1="1" y2="0">
<stop offset="0%" stop-color="hsl(180, 80%, 70%)"></stop>
@@ -16,15 +16,20 @@
fill="none"
stroke="#fff"
stroke-width="1"/>
<circle
:cx="cpuHeadX"
:cy="cpuHeadY"
r="1.5"
fill="#fff"/>
</mask>
</defs>
<rect
x="-1" y="-1"
:width="viewBoxX + 2" :height="viewBoxY + 2"
x="-2" y="-2"
:width="viewBoxX + 4" :height="viewBoxY + 4"
:style="`stroke: none; fill: url(#${ cpuGradientId }); mask: url(#${ cpuMaskId })`"/>
<text x="1" y="5">CPU <tspan>{{ cpuP }}%</tspan></text>
</svg>
<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" preserveAspectRatio="none">
<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`">
<defs>
<linearGradient :id="memGradientId" x1="0" x2="0" y1="1" y2="0">
<stop offset="0%" stop-color="hsl(180, 80%, 70%)"></stop>
@@ -40,11 +45,16 @@
fill="none"
stroke="#fff"
stroke-width="1"/>
<circle
:cx="memHeadX"
:cy="memHeadY"
r="1.5"
fill="#fff"/>
</mask>
</defs>
<rect
x="-1" y="-1"
:width="viewBoxX + 2" :height="viewBoxY + 2"
x="-2" y="-2"
:width="viewBoxX + 4" :height="viewBoxY + 4"
:style="`stroke: none; fill: url(#${ memGradientId }); mask: url(#${ memMaskId })`"/>
<text x="1" y="5">MEM <tspan>{{ memP }}%</tspan></text>
</svg>
@@ -70,15 +80,25 @@ export default Vue.extend({
memPolylinePoints: '',
cpuPolygonPoints: '',
memPolygonPoints: '',
cpuHeadX: null,
cpuHeadY: null,
memHeadX: null,
memHeadY: null,
cpuP: '',
memP: ''
};
},
mounted() {
this.connection.on('stats', this.onStats);
this.connection.on('statsLog', this.onStatsLog);
this.connection.send({
type: 'requestLog',
id: Math.random().toString()
});
},
beforeDestroy() {
this.connection.off('stats', this.onStats);
this.connection.off('statsLog', this.onStatsLog);
},
methods: {
onStats(stats) {
@@ -86,14 +106,24 @@ export default Vue.extend({
this.stats.push(stats);
if (this.stats.length > 50) this.stats.shift();
this.cpuPolylinePoints = this.stats.map((s, i) => `${this.viewBoxX - ((this.stats.length - 1) - i)},${(1 - s.cpu_usage) * this.viewBoxY}`).join(' ');
this.memPolylinePoints = this.stats.map((s, i) => `${this.viewBoxX - ((this.stats.length - 1) - i)},${(1 - (s.mem.used / s.mem.total)) * this.viewBoxY}`).join(' ');
const cpuPolylinePoints = this.stats.map((s, i) => [this.viewBoxX - ((this.stats.length - 1) - i), (1 - s.cpu_usage) * this.viewBoxY]);
const memPolylinePoints = this.stats.map((s, i) => [this.viewBoxX - ((this.stats.length - 1) - i), (1 - (s.mem.used / s.mem.total)) * this.viewBoxY]);
this.cpuPolylinePoints = cpuPolylinePoints.map(xy => `${xy[0]},${xy[1]}`).join(' ');
this.memPolylinePoints = memPolylinePoints.map(xy => `${xy[0]},${xy[1]}`).join(' ');
this.cpuPolygonPoints = `${this.viewBoxX - (this.stats.length - 1)},${ this.viewBoxY } ${ this.cpuPolylinePoints } ${ this.viewBoxX },${ this.viewBoxY }`;
this.memPolygonPoints = `${this.viewBoxX - (this.stats.length - 1)},${ this.viewBoxY } ${ this.memPolylinePoints } ${ this.viewBoxX },${ this.viewBoxY }`;
this.cpuHeadX = cpuPolylinePoints[cpuPolylinePoints.length - 1][0];
this.cpuHeadY = cpuPolylinePoints[cpuPolylinePoints.length - 1][1];
this.memHeadX = memPolylinePoints[memPolylinePoints.length - 1][0];
this.memHeadY = memPolylinePoints[memPolylinePoints.length - 1][1];
this.cpuP = (stats.cpu_usage * 100).toFixed(0);
this.memP = (stats.mem.used / stats.mem.total * 100).toFixed(0);
},
onStatsLog(statsLog) {
statsLog.forEach(stats => this.onStats(stats));
}
}
});

View File

@@ -55,11 +55,11 @@ export default define({
this.fetching = false;
});
this.connection = (this as any).os.streams.serverStream.getConnection();
this.connectionId = (this as any).os.streams.serverStream.use();
this.connection = (this as any).os.streams.serverStatsStream.getConnection();
this.connectionId = (this as any).os.streams.serverStatsStream.use();
},
beforeDestroy() {
(this as any).os.streams.serverStream.dispose(this.connectionId);
(this as any).os.streams.serverStatsStream.dispose(this.connectionId);
},
methods: {
toggle() {

View File

@@ -1,5 +1,5 @@
<template>
<div class="mkw-slideshow" :data-mobile="isMobile">
<div class="mkw-slideshow" :data-mobile="platform == 'mobile'">
<div @click="choose">
<p v-if="props.folder === undefined">
<template v-if="isCustomizeMode">フォルダを指定するにはカスタマイズモードを終了してください</template>

View File

@@ -1,6 +1,8 @@
declare const _HOST_: string;
declare const _HOSTNAME_: string;
declare const _URL_: string;
declare const _NAME_: string;
declare const _DESCRIPTION_: string;
declare const _API_URL_: string;
declare const _WS_URL_: string;
declare const _DOCS_URL_: string;
@@ -17,10 +19,13 @@ declare const _VERSION_: string;
declare const _CODENAME_: string;
declare const _LICENSE_: string;
declare const _GOOGLE_MAPS_API_KEY_: string;
declare const _WELCOME_BG_URL_: string;
export const host = _HOST_;
export const hostname = _HOSTNAME_;
export const url = _URL_;
export const name = _NAME_;
export const description = _DESCRIPTION_;
export const apiUrl = _API_URL_;
export const wsUrl = _WS_URL_;
export const docsUrl = _DOCS_URL_;
@@ -37,3 +42,4 @@ export const version = _VERSION_;
export const codename = _CODENAME_;
export const license = _LICENSE_;
export const googleMapsApiKey = _GOOGLE_MAPS_API_KEY_;
export const welcomeBgUrl = _WELCOME_BG_URL_;

View File

@@ -6,7 +6,7 @@ export default (os: OS) => opts => {
const o = opts || {};
if (o.renote) {
const vm = os.new(RenoteFormWindow, {
renote: o.renote
note: o.renote
});
document.body.appendChild(vm.$el);
} else {

View File

@@ -23,6 +23,7 @@ import updateAvatar from './api/update-avatar';
import updateBanner from './api/update-banner';
import MkIndex from './views/pages/index.vue';
import MkDeck from './views/pages/deck/deck.vue';
import MkUser from './views/pages/user/user.vue';
import MkFavorites from './views/pages/favorites.vue';
import MkSelectDrive from './views/pages/selectdrive.vue';
@@ -32,6 +33,7 @@ import MkHomeCustomize from './views/pages/home-customize.vue';
import MkMessagingRoom from './views/pages/messaging-room.vue';
import MkNote from './views/pages/note.vue';
import MkSearch from './views/pages/search.vue';
import MkTag from './views/pages/tag.vue';
import MkOthello from './views/pages/othello.vue';
/**
@@ -50,6 +52,7 @@ init(async (launch) => {
mode: 'history',
routes: [
{ path: '/', name: 'index', component: MkIndex },
{ path: '/deck', name: 'deck', component: MkDeck },
{ path: '/i/customize-home', component: MkHomeCustomize },
{ path: '/i/favorites', component: MkFavorites },
{ path: '/i/messaging/:user', component: MkMessagingRoom },
@@ -58,6 +61,7 @@ init(async (launch) => {
{ path: '/i/lists/:list', component: MkUserList },
{ path: '/selectdrive', component: MkSelectDrive },
{ path: '/search', component: MkSearch },
{ path: '/tags/:tag', component: MkTag },
{ path: '/othello', component: MkOthello },
{ path: '/othello/:game', component: MkOthello },
{ path: '/@:user', component: MkUser },

View File

@@ -42,8 +42,3 @@ html
&:active
background-color $theme-color
body
display flex
flex-direction column
min-height 100%

View File

@@ -1,5 +1,5 @@
<template>
<svg viewBox="0 0 21 7" preserveAspectRatio="none">
<svg viewBox="0 0 21 7">
<rect v-for="record in data" class="day"
width="1" height="1"
:x="record.x" :y="record.date.weekday"
@@ -15,7 +15,7 @@
style="pointer-events: none;"/>
<rect class="today"
width="1" height="1"
:x="data[data.length - 1].x" :y="data[data.length - 1].date.weekday"
:x="data[0].x" :y="data[0].date.weekday"
rx="1" ry="1"
fill="none"
stroke-width="0.1"
@@ -33,7 +33,7 @@ export default Vue.extend({
const peak = Math.max.apply(null, this.data.map(d => d.total));
let x = 0;
this.data.reverse().forEach(d => {
this.data.slice().reverse().forEach(d => {
d.x = x;
d.date.weekday = (new Date(d.date.year, d.date.month - 1, d.date.day)).getDay();

View File

@@ -1,5 +1,5 @@
<template>
<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" preserveAspectRatio="none" @mousedown.prevent="onMousedown">
<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" @mousedown.prevent="onMousedown">
<title>%i18n:@total%<br/>%i18n:@notes%<br/>%i18n:@replies%<br/>%i18n:@renotes%</title>
<polyline
:points="pointsNote"
@@ -55,7 +55,6 @@ export default Vue.extend({
};
},
created() {
this.data.reverse();
this.data.forEach(d => d.total = d.notes + d.replies + d.renotes);
this.render();
},
@@ -63,10 +62,11 @@ export default Vue.extend({
render() {
const peak = Math.max.apply(null, this.data.map(d => d.total));
if (peak != 0) {
this.pointsNote = this.data.map((d, i) => `${(i * this.zoom) + this.pos},${(1 - (d.notes / peak)) * this.viewBoxY}`).join(' ');
this.pointsReply = this.data.map((d, i) => `${(i * this.zoom) + this.pos},${(1 - (d.replies / peak)) * this.viewBoxY}`).join(' ');
this.pointsRenote = this.data.map((d, i) => `${(i * this.zoom) + this.pos},${(1 - (d.renotes / peak)) * this.viewBoxY}`).join(' ');
this.pointsTotal = this.data.map((d, i) => `${(i * this.zoom) + this.pos},${(1 - (d.total / peak)) * this.viewBoxY}`).join(' ');
const data = this.data.slice().reverse();
this.pointsNote = data.map((d, i) => `${(i * this.zoom) + this.pos},${(1 - (d.notes / peak)) * this.viewBoxY}`).join(' ');
this.pointsReply = data.map((d, i) => `${(i * this.zoom) + this.pos},${(1 - (d.replies / peak)) * this.viewBoxY}`).join(' ');
this.pointsRenote = data.map((d, i) => `${(i * this.zoom) + this.pos},${(1 - (d.renotes / peak)) * this.viewBoxY}`).join(' ');
this.pointsTotal = data.map((d, i) => `${(i * this.zoom) + this.pos},${(1 - (d.total / peak)) * this.viewBoxY}`).join(' ');
}
},
onMousedown(e) {

View File

@@ -1,108 +0,0 @@
<template>
<canvas class="mk-analog-clock" ref="canvas" width="256" height="256"></canvas>
</template>
<script lang="ts">
import Vue from 'vue';
import { themeColor } from '../../../config';
const Vec2 = function(this: any, x, y) {
this.x = x;
this.y = y;
};
export default Vue.extend({
data() {
return {
clock: null
};
},
mounted() {
this.tick();
this.clock = setInterval(this.tick, 1000);
},
beforeDestroy() {
clearInterval(this.clock);
},
methods: {
tick() {
const canv = this.$refs.canvas as any;
const now = new Date();
const s = now.getSeconds();
const m = now.getMinutes();
const h = now.getHours();
const ctx = canv.getContext('2d');
const canvW = canv.width;
const canvH = canv.height;
ctx.clearRect(0, 0, canvW, canvH);
{ // 背景
const center = Math.min((canvW / 2), (canvH / 2));
const lineStart = center * 0.90;
const shortLineEnd = center * 0.87;
const longLineEnd = center * 0.84;
for (let i = 0; i < 60; i++) {
const angle = Math.PI * i / 30;
const uv = new Vec2(Math.sin(angle), -Math.cos(angle));
ctx.beginPath();
ctx.lineWidth = 1;
ctx.moveTo((canvW / 2) + uv.x * lineStart, (canvH / 2) + uv.y * lineStart);
if (i % 5 == 0) {
ctx.strokeStyle = 'rgba(255, 255, 255, 0.2)';
ctx.lineTo((canvW / 2) + uv.x * longLineEnd, (canvH / 2) + uv.y * longLineEnd);
} else {
ctx.strokeStyle = 'rgba(255, 255, 255, 0.1)';
ctx.lineTo((canvW / 2) + uv.x * shortLineEnd, (canvH / 2) + uv.y * shortLineEnd);
}
ctx.stroke();
}
}
{ // 分
const angle = Math.PI * (m + s / 60) / 30;
const length = Math.min(canvW, canvH) / 2.6;
const uv = new Vec2(Math.sin(angle), -Math.cos(angle));
ctx.beginPath();
ctx.strokeStyle = '#ffffff';
ctx.lineWidth = 2;
ctx.moveTo(canvW / 2 - uv.x * length / 5, canvH / 2 - uv.y * length / 5);
ctx.lineTo(canvW / 2 + uv.x * length, canvH / 2 + uv.y * length);
ctx.stroke();
}
{ // 時
const angle = Math.PI * (h % 12 + m / 60) / 6;
const length = Math.min(canvW, canvH) / 4;
const uv = new Vec2(Math.sin(angle), -Math.cos(angle));
ctx.beginPath();
ctx.strokeStyle = themeColor;
ctx.lineWidth = 2;
ctx.moveTo(canvW / 2 - uv.x * length / 5, canvH / 2 - uv.y * length / 5);
ctx.lineTo(canvW / 2 + uv.x * length, canvH / 2 + uv.y * length);
ctx.stroke();
}
{ // 秒
const angle = Math.PI * s / 30;
const length = Math.min(canvW, canvH) / 2.6;
const uv = new Vec2(Math.sin(angle), -Math.cos(angle));
ctx.beginPath();
ctx.strokeStyle = 'rgba(255, 255, 255, 0.5)';
ctx.lineWidth = 1;
ctx.moveTo(canvW / 2 - uv.x * length / 5, canvH / 2 - uv.y * length / 5);
ctx.lineTo(canvW / 2 + uv.x * length, canvH / 2 + uv.y * length);
ctx.stroke();
}
}
}
});
</script>
<style lang="stylus" scoped>
.mk-analog-clock
display block
width 256px
height 256px
</style>

View File

@@ -1,15 +1,17 @@
<template>
<ul class="menu">
<li v-for="(item, i) in menu" :class="item.type">
<template v-if="item.type == 'item'">
<p @click="click(item)"><span :class="$style.icon" v-if="item.icon" v-html="item.icon"></span>{{ item.text }}</p>
</template>
<template v-if="item.type == 'link'">
<a :href="item.href" :target="item.target" @click="click(item)"><span :class="$style.icon" v-if="item.icon" v-html="item.icon"></span>{{ item.text }}</a>
</template>
<template v-else-if="item.type == 'nest'">
<p><span :class="$style.icon" v-if="item.icon" v-html="item.icon"></span>{{ item.text }}...<span class="caret">%fa:caret-right%</span></p>
<me-nu :menu="item.menu" @x="click"/>
<li v-for="(item, i) in menu" :class="item ? item.type : item === null ? 'divider' : null">
<template v-if="item">
<template v-if="item.type == null || item.type == 'item'">
<p @click="click(item)"><span :class="$style.icon" v-if="item.icon" v-html="item.icon"></span>{{ item.text }}</p>
</template>
<template v-else-if="item.type == 'link'">
<a :href="item.href" :target="item.target" @click="click(item)"><span :class="$style.icon" v-if="item.icon" v-html="item.icon"></span>{{ item.text }}</a>
</template>
<template v-else-if="item.type == 'nest'">
<p><span :class="$style.icon" v-if="item.icon" v-html="item.icon"></span>{{ item.text }}...<span class="caret">%fa:caret-right%</span></p>
<me-nu :menu="item.menu" @x="click"/>
</template>
</template>
</li>
</ul>

View File

@@ -1,5 +1,5 @@
<template>
<div class="context-menu" :style="{ left: `${x}px`, top: `${y}px` }" @contextmenu.prevent="() => {}">
<div class="context-menu" @contextmenu.prevent="() => {}">
<x-menu :menu="menu" @x="click"/>
</div>
</template>
@@ -17,6 +17,23 @@ export default Vue.extend({
props: ['x', 'y', 'menu'],
mounted() {
this.$nextTick(() => {
const width = this.$el.offsetWidth;
const height = this.$el.offsetHeight;
let x = this.x;
let y = this.y;
if (x + width - window.pageXOffset > window.innerWidth) {
x = window.innerWidth - width + window.pageXOffset;
}
if (y + height - window.pageYOffset > window.innerHeight) {
y = window.innerHeight - height + window.pageYOffset;
}
this.$el.style.left = x + 'px';
this.$el.style.top = y + 'px';
Array.from(document.querySelectorAll('body *')).forEach(el => {
el.addEventListener('mousedown', this.onMousedown);
});
@@ -38,7 +55,7 @@ export default Vue.extend({
return false;
},
click(item) {
if (item.onClick) item.onClick();
if (item.action) item.action();
this.close();
},
close() {
@@ -59,7 +76,6 @@ root(isDark)
$item-height = 38px
$padding = 10px
display none
position fixed
top 0
left 0

View File

@@ -62,41 +62,37 @@ export default Vue.extend({
onContextmenu(e) {
this.isContextmenuShowing = true;
contextmenu(e, [{
contextmenu((this as any).os)(e, [{
type: 'item',
text: '%i18n:@contextmenu.rename%',
icon: '%fa:i-cursor%',
onClick: this.rename
action: this.rename
}, {
type: 'item',
text: '%i18n:@contextmenu.copy-url%',
icon: '%fa:link%',
onClick: this.copyUrl
action: this.copyUrl
}, {
type: 'link',
href: `${this.file.url}?download`,
text: '%i18n:@contextmenu.download%',
icon: '%fa:download%',
}, {
type: 'divider',
}, {
}, null, {
type: 'item',
text: '%i18n:common.delete%',
icon: '%fa:R trash-alt%',
onClick: this.deleteFile
}, {
type: 'divider',
}, {
action: this.deleteFile
}, null, {
type: 'nest',
text: '%i18n:@contextmenu.else-files%',
menu: [{
type: 'item',
text: '%i18n:@contextmenu.set-as-avatar%',
onClick: this.setAsAvatar
action: this.setAsAvatar
}, {
type: 'item',
text: '%i18n:@contextmenu.set-as-banner%',
onClick: this.setAsBanner
action: this.setAsBanner
}]
}, {
type: 'nest',
@@ -104,7 +100,7 @@ export default Vue.extend({
menu: [{
type: 'item',
text: '%i18n:@contextmenu.add-app%...',
onClick: this.addApp
action: this.addApp
}]
}], {
closed: () => {
@@ -149,7 +145,7 @@ export default Vue.extend({
(this as any).api('drive/files/update', {
fileId: this.file.id,
name: name
})
});
});
},
@@ -177,7 +173,9 @@ export default Vue.extend({
},
deleteFile() {
alert('not implemented yet');
(this as any).api('drive/files/delete', {
fileId: this.file.id
});
}
}
});

View File

@@ -52,30 +52,26 @@ export default Vue.extend({
onContextmenu(e) {
this.isContextmenuShowing = true;
contextmenu(e, [{
contextmenu((this as any).os)(e, [{
type: 'item',
text: '%i18n:@contextmenu.move-to-this-folder%',
icon: '%fa:arrow-right%',
onClick: this.go
action: this.go
}, {
type: 'item',
text: '%i18n:@contextmenu.show-in-new-window%',
icon: '%fa:R window-restore%',
onClick: this.newWindow
}, {
type: 'divider',
}, {
action: this.newWindow
}, null, {
type: 'item',
text: '%i18n:@contextmenu.rename%',
icon: '%fa:i-cursor%',
onClick: this.rename
}, {
type: 'divider',
}, {
action: this.rename
}, null, {
type: 'item',
text: '%i18n:common.delete%',
icon: '%fa:R trash-alt%',
onClick: this.deleteFolder
action: this.deleteFolder
}], {
closed: () => {
this.isContextmenuShowing = false;

View File

@@ -118,6 +118,7 @@ export default Vue.extend({
this.connection.on('file_created', this.onStreamDriveFileCreated);
this.connection.on('file_updated', this.onStreamDriveFileUpdated);
this.connection.on('file_deleted', this.onStreamDriveFileDeleted);
this.connection.on('folder_created', this.onStreamDriveFolderCreated);
this.connection.on('folder_updated', this.onStreamDriveFolderUpdated);
@@ -130,27 +131,28 @@ export default Vue.extend({
beforeDestroy() {
this.connection.off('file_created', this.onStreamDriveFileCreated);
this.connection.off('file_updated', this.onStreamDriveFileUpdated);
this.connection.off('file_deleted', this.onStreamDriveFileDeleted);
this.connection.off('folder_created', this.onStreamDriveFolderCreated);
this.connection.off('folder_updated', this.onStreamDriveFolderUpdated);
(this as any).os.streams.driveStream.dispose(this.connectionId);
},
methods: {
onContextmenu(e) {
contextmenu(e, [{
contextmenu((this as any).os)(e, [{
type: 'item',
text: '%i18n:@contextmenu.create-folder%',
icon: '%fa:R folder%',
onClick: this.createFolder
action: this.createFolder
}, {
type: 'item',
text: '%i18n:@contextmenu.upload%',
icon: '%fa:upload%',
onClick: this.selectLocalFile
action: this.selectLocalFile
}, {
type: 'item',
text: '%i18n:@contextmenu.url-upload%',
icon: '%fa:cloud-upload-alt%',
onClick: this.urlUpload
action: this.urlUpload
}]);
},
@@ -167,6 +169,10 @@ export default Vue.extend({
}
},
onStreamDriveFileDeleted(fileId) {
this.removeFile(fileId);
},
onStreamDriveFolderCreated(folder) {
this.addFolder(folder, true);
},

View File

@@ -1,19 +1,16 @@
<template>
<button class="mk-follow-button"
:class="{ wait, follow: !user.isFollowing, unfollow: user.isFollowing, big: size == 'big' }"
:class="{ wait, active: u.isFollowing || u.hasPendingFollowRequestFromYou, big: size == 'big' }"
@click="onClick"
:disabled="wait"
:title="user.isFollowing ? '%i18n:@unfollow%' : '%i18n:@follow%'"
>
<template v-if="!wait && user.isFollowing">
<template v-if="size == 'compact'">%fa:minus%</template>
<template v-if="size == 'big'">%fa:minus%%i18n:@unfollow%</template>
<template v-if="!wait">
<template v-if="u.hasPendingFollowRequestFromYou">%fa:hourglass-half%<template v-if="size == 'big'"> %i18n:@request-pending%</template></template>
<template v-else-if="u.isFollowing">%fa:minus%<template v-if="size == 'big'"> %i18n:@following%</template></template>
<template v-else-if="!u.isFollowing && u.isLocked">%fa:plus%<template v-if="size == 'big'"> %i18n:@follow-request%</template></template>
<template v-else-if="!u.isFollowing && !u.isLocked">%fa:plus%<template v-if="size == 'big'"> %i18n:@follow%</template></template>
</template>
<template v-if="!wait && !user.isFollowing">
<template v-if="size == 'compact'">%fa:plus%</template>
<template v-if="size == 'big'">%fa:plus%%i18n:@follow%</template>
</template>
<template v-if="wait">%fa:spinner .pulse .fw%</template>
<template v-else>%fa:spinner .pulse .fw%</template>
</button>
</template>
@@ -34,6 +31,7 @@ export default Vue.extend({
data() {
return {
u: this.user,
wait: false,
connection: null,
connectionId: null
@@ -56,39 +54,44 @@ export default Vue.extend({
methods: {
onFollow(user) {
if (user.id == this.user.id) {
if (user.id == this.u.id) {
this.user.isFollowing = user.isFollowing;
}
},
onUnfollow(user) {
if (user.id == this.user.id) {
if (user.id == this.u.id) {
this.user.isFollowing = user.isFollowing;
}
},
onClick() {
async onClick() {
this.wait = true;
if (this.user.isFollowing) {
(this as any).api('following/delete', {
userId: this.user.id
}).then(() => {
this.user.isFollowing = false;
}).catch(err => {
console.error(err);
}).then(() => {
this.wait = false;
});
} else {
(this as any).api('following/create', {
userId: this.user.id
}).then(() => {
this.user.isFollowing = true;
}).catch(err => {
console.error(err);
}).then(() => {
this.wait = false;
});
try {
if (this.u.isFollowing) {
this.u = await (this as any).api('following/delete', {
userId: this.u.id
});
} else {
if (this.u.isLocked && this.u.hasPendingFollowRequestFromYou) {
this.u = await (this as any).api('following/requests/cancel', {
userId: this.u.id
});
} else if (this.u.isLocked) {
this.u = await (this as any).api('following/create', {
userId: this.u.id
});
} else {
this.u = await (this as any).api('following/create', {
userId: this.user.id
});
}
}
} catch (e) {
console.error(e);
} finally {
this.wait = false;
}
}
}
@@ -124,7 +127,7 @@ root(isDark)
border 2px solid rgba($theme-color, 0.3)
border-radius 8px
&.follow
&:not(.active)
color isDark ? #fff : #888
background isDark ? linear-gradient(to bottom, #313543 0%, #282c37 100%) : linear-gradient(to bottom, #ffffff 0%, #f5f5f5 100%)
border solid 1px isDark ? #1c2023 : #e2e2e2
@@ -137,7 +140,7 @@ root(isDark)
background isDark ? #22262f : #ececec
border-color isDark ? #151a1d : #dcdcdc
&.unfollow
&.active
color $theme-color-foreground
background linear-gradient(to bottom, lighten($theme-color, 25%) 0%, lighten($theme-color, 10%) 100%)
border solid 1px lighten($theme-color, 15%)
@@ -162,9 +165,6 @@ root(isDark)
height 38px
line-height 38px
i
margin-right 8px
.mk-follow-button[data-darkmode]
root(true)

View File

@@ -7,6 +7,7 @@
<p>%i18n:@add-widget%</p>
<select v-model="widgetAdderSelected">
<option value="profile">%i18n:common.widgets.profile%</option>
<option value="analog-clock">%i18n:common.widgets.analog-clock%</option>
<option value="calendar">%i18n:common.widgets.calendar%</option>
<option value="timemachine">%i18n:common.widgets.timemachine%</option>
<option value="activity">%i18n:common.widgets.activity%</option>
@@ -22,6 +23,8 @@
<option value="post-form">%i18n:common.widgets.post-form%</option>
<option value="messaging">%i18n:common.widgets.messaging%</option>
<option value="memo">%i18n:common.widgets.memo%</option>
<option value="hashtags">%i18n:common.widgets.hashtags%</option>
<option value="posts-monitor">%i18n:common.widgets.posts-monitor%</option>
<option value="server">%i18n:common.widgets.server%</option>
<option value="donation">%i18n:common.widgets.donation%</option>
<option value="nav">%i18n:common.widgets.nav%</option>
@@ -46,7 +49,7 @@
:key="place"
>
<div v-for="widget in widgets[place]" class="customize-container" :key="widget.id" @contextmenu.stop.prevent="onWidgetContextmenu(widget.id)">
<component :is="`mkw-${widget.name}`" :widget="widget" :ref="widget.id" :is-customize-mode="true"/>
<component :is="`mkw-${widget.name}`" :widget="widget" :ref="widget.id" :is-customize-mode="true" platform="desktop"/>
</div>
</x-draggable>
<div class="main">
@@ -59,12 +62,11 @@
</template>
<template v-else>
<div v-for="place in ['left', 'right']" :class="place">
<component v-for="widget in widgets[place]" :is="`mkw-${widget.name}`" :key="widget.id" :ref="widget.id" :widget="widget" @chosen="warp"/>
<component v-for="widget in widgets[place]" :is="`mkw-${widget.name}`" :key="widget.id" :ref="widget.id" :widget="widget" @chosen="warp" platform="desktop"/>
</div>
<div class="main">
<mk-post-form v-if="$store.state.settings.showPostFormOnTopOfTl"/>
<mk-timeline ref="tl" @loaded="onTlLoaded" v-if="mode == 'timeline'"/>
<mk-mentions @loaded="onTlLoaded" v-if="mode == 'mentions'"/>
<mk-post-form class="form" v-if="$store.state.settings.showPostFormOnTopOfTl"/>
<mk-timeline class="tl" cref="tl" @loaded="onTlLoaded" v-if="mode == 'timeline'"/>
</div>
</template>
</div>
@@ -76,6 +78,50 @@ import Vue from 'vue';
import * as XDraggable from 'vuedraggable';
import * as uuid from 'uuid';
const defaultDesktopHomeWidgets = {
left: [
'profile',
'calendar',
'activity',
'rss',
'trends',
'photo-stream',
'version'
],
right: [
'broadcast',
'notifications',
'users',
'polls',
'server',
'donation',
'nav',
'tips'
]
};
//#region Construct home data
const _defaultDesktopHomeWidgets = [];
defaultDesktopHomeWidgets.left.forEach(widget => {
_defaultDesktopHomeWidgets.push({
name: widget,
id: uuid(),
place: 'left',
data: {}
});
});
defaultDesktopHomeWidgets.right.forEach(widget => {
_defaultDesktopHomeWidgets.push({
name: widget,
id: uuid(),
place: 'right',
data: {}
});
});
//#endregion
export default Vue.extend({
components: {
XDraggable
@@ -103,7 +149,7 @@ export default Vue.extend({
computed: {
home(): any[] {
return this.$store.state.settings.home;
return this.$store.state.settings.home || [];
},
left(): any[] {
return this.home.filter(w => w.place == 'left');
@@ -119,6 +165,16 @@ export default Vue.extend({
}
},
created() {
if (this.$store.state.settings.home == null) {
this.api('i/update_home', {
home: _defaultDesktopHomeWidgets
}).then(() => {
this.$store.commit('settings/setHome', _defaultDesktopHomeWidgets);
});
}
},
mounted() {
this.connection = (this as any).os.stream.getConnection();
this.connectionId = (this as any).os.stream.use();
@@ -298,11 +354,18 @@ root(isDark)
width calc(100% - 275px * 2)
order 2
.mk-post-form
> .form
margin-bottom 16px
border solid 1px rgba(#000, 0.075)
border-radius 4px
@media (max-width 700px)
padding 0
> .tl
border none
border-radius 0
> *:not(.main)
width 275px
padding 16px 0 16px 0

View File

@@ -9,7 +9,6 @@ import subNoteContent from './sub-note-content.vue';
import window from './window.vue';
import noteFormWindow from './post-form-window.vue';
import renoteFormWindow from './renote-form-window.vue';
import analogClock from './analog-clock.vue';
import ellipsisIcon from './ellipsis-icon.vue';
import mediaImage from './media-image.vue';
import mediaImageDialog from './media-image-dialog.vue';
@@ -40,7 +39,6 @@ Vue.component('mk-sub-note-content', subNoteContent);
Vue.component('mk-window', window);
Vue.component('mk-post-form-window', noteFormWindow);
Vue.component('mk-renote-form-window', renoteFormWindow);
Vue.component('mk-analog-clock', analogClock);
Vue.component('mk-ellipsis-icon', ellipsisIcon);
Vue.component('mk-media-image', mediaImage);
Vue.component('mk-media-image-dialog', mediaImageDialog);

View File

@@ -1,124 +0,0 @@
<template>
<div class="sub" :title="title">
<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"><mk-acct :user="note.user"/></span>
</div>
<div class="right">
<router-link class="time" :to="note | notePage">
<mk-time :time="note.createdAt"/>
</router-link>
</div>
</header>
<div class="body">
<div class="text">
<span v-if="note.isHidden" style="opacity: 0.5">%i18n:@private%</span>
<span v-if="note.deletedAt" style="opacity: 0.5">%i18n:@deleted%</span>
<mk-note-html v-if="note.text" :text="note.text" :i="$store.state.i"/>
</div>
<div class="media" v-if="note.mediaIds.length > 0">
<mk-media-list :media-list="note.media"/>
</div>
</div>
</div>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import dateStringify from '../../../common/scripts/date-stringify';
export default Vue.extend({
props: ['note'],
computed: {
title(): string {
return dateStringify(this.note.createdAt);
}
}
});
</script>
<style lang="stylus" scoped>
root(isDark)
margin 0
padding 20px 32px
background isDark ? #21242d : #fdfdfd
&:after
content ""
display block
clear both
&:hover
> .main > footer > button
color #888
> .avatar
display block
float left
margin 0 16px 0 0
width 44px
height 44px
border-radius 4px
> .main
float left
width calc(100% - 60px)
> header
margin-bottom 4px
white-space nowrap
&:after
content ""
display block
clear both
> .left
float left
> .name
display inline
margin 0
padding 0
color isDark ? #fff : #777
font-size 1em
font-weight 700
text-align left
text-decoration none
&:hover
text-decoration underline
> .username
text-align left
margin 0 0 0 8px
color isDark ? #606984 : #ccc
> .right
float right
> .time
font-size 0.9em
color isDark ? #606984 : #c0c0c0
> .body
> .text
cursor default
display block
margin 0
padding 0
overflow-wrap break-word
font-size 1em
color isDark ? #959ba7 : #717171
.sub[data-darkmode]
root(true)
.sub:not([data-darkmode])
root(false)
</style>

View File

@@ -48,7 +48,7 @@
<mk-poll v-if="p.poll" :note="p"/>
<mk-url-preview v-for="url in urls" :url="url" :key="url"/>
<div class="tags" v-if="p.tags && p.tags.length > 0">
<router-link v-for="tag in p.tags" :key="tag" :to="`/search?q=#${tag}`">{{ tag }}</router-link>
<router-link v-for="tag in p.tags" :key="tag" :to="`/tags/${tag}`">{{ tag }}</router-link>
</div>
<a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a>
<div class="map" v-if="p.geo" ref="map"></div>
@@ -89,7 +89,7 @@ import MkPostFormWindow from './post-form-window.vue';
import MkRenoteFormWindow from './renote-form-window.vue';
import MkNoteMenu from '../../../common/views/components/note-menu.vue';
import MkReactionPicker from '../../../common/views/components/reaction-picker.vue';
import XSub from './note-detail.sub.vue';
import XSub from './notes.note.sub.vue';
export default Vue.extend({
components: {
@@ -218,8 +218,6 @@ export default Vue.extend({
@import '~const.styl'
root(isDark)
margin 0 auto
padding 0
overflow hidden
text-align left
background isDark ? #282C37 : #fff

View File

@@ -1,14 +1,8 @@
<template>
<div class="mk-note-preview" :title="title">
<mk-avatar class="avatar" :user="note.user"/>
<mk-avatar class="avatar" :user="note.user" v-if="!mini"/>
<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"><mk-acct :user="note.user"/></span>
<router-link class="time" :to="note | notePage">
<mk-time :time="note.createdAt"/>
</router-link>
</header>
<mk-note-header class="header" :note="note" :mini="true"/>
<div class="body">
<mk-sub-note-content class="text" :note="note"/>
</div>
@@ -21,7 +15,17 @@ import Vue from 'vue';
import dateStringify from '../../../common/scripts/date-stringify';
export default Vue.extend({
props: ['note'],
props: {
note: {
type: Object,
required: true
},
mini: {
type: Boolean,
required: false,
default: false
}
},
computed: {
title(): string {
return dateStringify(this.note.createdAt);
@@ -32,52 +36,20 @@ export default Vue.extend({
<style lang="stylus" scoped>
root(isDark)
display flex
font-size 0.9em
&:after
content ""
display block
clear both
> .avatar
flex-shrink 0
display block
float left
margin 0 12px 0 0
width 48px
height 48px
border-radius 8px
> .main
float left
width calc(100% - 60px)
> 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
text-overflow ellipsis
&:hover
text-decoration underline
> .username
margin 0 .5em 0 0
overflow hidden
text-overflow ellipsis
color isDark ? #606984 : #d1d8da
> .time
margin-left auto
color isDark ? #606984 : #b2b8bb
flex 1
min-width 0
> .body

View File

@@ -2,25 +2,7 @@
<div class="sub" :title="title">
<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="is-admin" v-if="note.user.isAdmin">admin</span>
<span class="is-bot" v-if="note.user.isBot">bot</span>
<span class="is-cat" v-if="note.user.isCat">cat</span>
<span class="username"><mk-acct :user="note.user"/></span>
<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>
<mk-note-header class="header" :note="note"/>
<div class="body">
<mk-sub-note-content class="text" :note="note"/>
</div>
@@ -44,83 +26,28 @@ export default Vue.extend({
<style lang="stylus" scoped>
root(isDark)
display flex
margin 0
padding 16px 32px
font-size 0.9em
background isDark ? #21242d : #fcfcfc
&:after
content ""
display block
clear both
> .avatar
flex-shrink 0
display block
float left
margin 0 12px 0 0
width 48px
height 48px
border-radius 8px
> .main
float left
width calc(100% - 60px)
flex 1
min-width 0
> header
display flex
align-items baseline
> .header
margin-bottom 2px
white-space nowrap
> .name
display block
margin 0 .5em 0 0
padding 0
overflow hidden
color isDark ? #fff : #607073
font-size 1em
font-weight bold
text-decoration none
text-overflow ellipsis
&:hover
text-decoration underline
> .is-admin
> .is-bot
> .is-cat
align-self center
margin 0 0.5em 0 0
padding 1px 5px
font-size 10px
color isDark ? #758188 : #aaa
border solid 1px isDark ? #57616f : #ddd
border-radius 3px
&.is-admin
border-color isDark ? #d42c41 : #f56a7b
color isDark ? #d42c41 : #f56a7b
> .username
margin 0 .5em 0 0
color isDark ? #606984 : #d1d8da
> .info
margin-left auto
font-size 0.9em
> *
color isDark ? #606984 : #b2b8bb
> .mobile
margin-right 6px
> .visibility
margin-left 6px
> .body
max-height 128px
overflow hidden
> .text
cursor default

View File

@@ -14,26 +14,7 @@
<article>
<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-admin" v-if="p.user.isAdmin">admin</span>
<span class="is-bot" v-if="p.user.isBot">bot</span>
<span class="is-cat" v-if="p.user.isCat">cat</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>
<mk-note-header class="header" :note="p"/>
<div class="body">
<p v-if="p.cw != null" class="cw">
<span class="text" v-if="p.cw != ''">{{ p.cw }}</span>
@@ -52,7 +33,7 @@
</div>
<mk-poll v-if="p.poll" :note="p" ref="pollViewer"/>
<div class="tags" v-if="p.tags && p.tags.length > 0">
<router-link v-for="tag in p.tags" :key="tag" :to="`/search?q=#${tag}`">{{ tag }}</router-link>
<router-link v-for="tag in p.tags" :key="tag" :to="`/tags/${tag}`">{{ tag }}</router-link>
</div>
<a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% 位置情報</a>
<div class="map" v-if="p.geo" ref="map"></div>
@@ -387,20 +368,16 @@ root(isDark)
padding-top 8px
> article
display flex
padding 28px 32px 18px 32px
&:after
content ""
display block
clear both
&:hover
> .main > footer > button
color isDark ? #707b97 : #888
> .avatar
flex-shrink 0
display block
float left
margin 0 16px 10px 0
width 58px
height 58px
@@ -410,67 +387,11 @@ root(isDark)
//top 74px
> .main
float left
width calc(100% - 74px)
flex 1
min-width 0
> header
display flex
align-items baseline
> .header
margin-bottom 4px
white-space nowrap
> .name
display block
margin 0 .5em 0 0
padding 0
overflow hidden
color isDark ? #fff : #627079
font-size 1em
font-weight bold
text-decoration none
text-overflow ellipsis
&:hover
text-decoration underline
> .is-admin
> .is-bot
> .is-cat
align-self center
margin 0 .5em 0 0
padding 1px 6px
font-size 12px
color isDark ? #758188 : #aaa
border solid 1px isDark ? #57616f : #ddd
border-radius 3px
&.is-admin
border-color isDark ? #d42c41 : #f56a7b
color isDark ? #d42c41 : #f56a7b
> .username
margin 0 .5em 0 0
overflow hidden
text-overflow ellipsis
color isDark ? #606984 : #ccc
> .info
margin-left auto
font-size 0.9em
> *
color isDark ? #606984 : #c0c0c0
> .mobile
margin-right 8px
> .app
margin-right 8px
padding-right 8px
border-right solid 1px #eaeaea
> .visibility
margin-left 8px
> .body
@@ -556,7 +477,7 @@ root(isDark)
padding 2px 8px 2px 16px
font-size 90%
color #8d969e
background #edf0f3
background isDark ? #313543 : #edf0f3
border-radius 4px
&:before
@@ -569,7 +490,7 @@ root(isDark)
width 8px
height 8px
margin auto 0
background #fff
background isDark ? #282c37 : #fff
border-radius 100%
&:hover

View File

@@ -74,7 +74,7 @@ export default Vue.extend({
mounted() {
document.addEventListener('visibilitychange', this.onVisibilitychange, false);
window.addEventListener('scroll', this.onScroll);
window.addEventListener('scroll', this.onScroll, { passive: true });
},
beforeDestroy() {

View File

@@ -5,6 +5,7 @@
<template v-for="(notification, i) in _notifications">
<div class="notification" :class="notification.type" :key="notification.id">
<mk-time :time="notification.createdAt"/>
<template v-if="notification.type == 'reaction'">
<mk-avatar class="avatar" :user="notification.user"/>
<div class="text">
@@ -17,6 +18,7 @@
</router-link>
</div>
</template>
<template v-if="notification.type == 'renote'">
<mk-avatar class="avatar" :user="notification.note.user"/>
<div class="text">
@@ -28,6 +30,7 @@
</router-link>
</div>
</template>
<template v-if="notification.type == 'quote'">
<mk-avatar class="avatar" :user="notification.note.user"/>
<div class="text">
@@ -37,6 +40,7 @@
<router-link class="note-preview" :to="notification.note | notePage">{{ getNoteSummary(notification.note) }}</router-link>
</div>
</template>
<template v-if="notification.type == 'follow'">
<mk-avatar class="avatar" :user="notification.user"/>
<div class="text">
@@ -45,6 +49,16 @@
</p>
</div>
</template>
<template v-if="notification.type == 'receiveFollowRequest'">
<mk-avatar class="avatar" :user="notification.user"/>
<div class="text">
<p>%fa:user-clock%
<router-link :to="notification.user | userPage" v-user-preview="notification.user.id">{{ notification.user | userName }}</router-link>
</p>
</div>
</template>
<template v-if="notification.type == 'reply'">
<mk-avatar class="avatar" :user="notification.note.user"/>
<div class="text">
@@ -54,6 +68,7 @@
<router-link class="note-preview" :to="notification.note | notePage">{{ getNoteSummary(notification.note) }}</router-link>
</div>
</template>
<template v-if="notification.type == 'mention'">
<mk-avatar class="avatar" :user="notification.note.user"/>
<div class="text">
@@ -63,6 +78,7 @@
<a class="note-preview" :href="notification.note | notePage">{{ getNoteSummary(notification.note) }}</a>
</div>
</template>
<template v-if="notification.type == 'poll_vote'">
<mk-avatar class="avatar" :user="notification.user"/>
<div class="text">
@@ -73,6 +89,7 @@
</div>
</template>
</div>
<p class="date" v-if="i != notifications.length - 1 && notification._date != _notifications[i + 1]._date" :key="notification.id + '-time'">
<span>%fa:angle-up%{{ notification._datetext }}</span>
<span>%fa:angle-down%{{ _notifications[i + 1]._datetext }}</span>
@@ -189,7 +206,7 @@ root(isDark)
margin 0
padding 16px
overflow-wrap break-word
font-size 0.9em
font-size 13px
border-bottom solid 1px isDark ? #1c2023 : rgba(#000, 0.05)
&:last-child
@@ -251,6 +268,10 @@ root(isDark)
.text p i
color #53c7ce
&.receiveFollowRequest
.text p i
color #888
&.reply, &.mention
.text p i
color #555

View File

@@ -1,21 +1,23 @@
<template>
<mk-window ref="window" is-modal @closed="$destroy">
<span slot="header">
<span :class="$style.icon" v-if="geo">%fa:map-marker-alt%</span>
<mk-window class="mk-post-form-window" ref="window" is-modal @closed="$destroy">
<span slot="header" class="mk-post-form-window--header">
<span class="icon" v-if="geo">%fa:map-marker-alt%</span>
<span v-if="!reply">%i18n:@note%</span>
<span v-if="reply">%i18n:@reply%</span>
<span :class="$style.count" v-if="media.length != 0">{{ '%i18n:@attaches%'.replace('{}', media.length) }}</span>
<span :class="$style.count" v-if="uploadings.length != 0">{{ '%i18n:@uploading-media%'.replace('{}', uploadings.length) }}<mk-ellipsis/></span>
<span class="count" v-if="media.length != 0">{{ '%i18n:@attaches%'.replace('{}', media.length) }}</span>
<span class="count" v-if="uploadings.length != 0">{{ '%i18n:@uploading-media%'.replace('{}', uploadings.length) }}<mk-ellipsis/></span>
</span>
<mk-note-preview v-if="reply" :class="$style.notePreview" :note="reply"/>
<mk-post-form ref="form"
:reply="reply"
@posted="onPosted"
@change-uploadings="onChangeUploadings"
@change-attached-media="onChangeMedia"
@geo-attached="onGeoAttached"
@geo-dettached="onGeoDettached"/>
<div class="mk-post-form-window--body">
<mk-note-preview v-if="reply" class="notePreview" :note="reply"/>
<mk-post-form ref="form"
:reply="reply"
@posted="onPosted"
@change-uploadings="onChangeUploadings"
@change-attached-media="onChangeMedia"
@geo-attached="onGeoAttached"
@geo-dettached="onGeoDettached"/>
</div>
</mk-window>
</template>
@@ -56,21 +58,33 @@ export default Vue.extend({
});
</script>
<style lang="stylus" module>
.icon
margin-right 8px
<style lang="stylus" scoped>
root(isDark)
.mk-post-form-window--header
.icon
margin-right 8px
.count
margin-left 8px
opacity 0.8
.count
margin-left 8px
opacity 0.8
&:before
content '('
&:before
content '('
&:after
content ')'
&:after
content ')'
.notePreview
margin 16px 22px 0 22px
.mk-post-form-window--body
.notePreview
if isDark
margin 16px 22px 0 22px
else
margin 16px 22px
.mk-post-form-window[data-darkmode]
root(true)
.mk-post-form-window:not([data-darkmode])
root(false)
</style>

View File

@@ -50,6 +50,7 @@ import * as XDraggable from 'vuedraggable';
import getKao from '../../../common/scripts/get-kao';
import MkVisibilityChooser from '../../../common/views/components/visibility-chooser.vue';
import parse from '../../../../../text/parse';
import { host } from '../../../config';
export default Vue.extend({
components: {
@@ -129,6 +130,7 @@ export default Vue.extend({
// 自分は除外
if (this.$store.state.i.username == x.username && x.host == null) return;
if (this.$store.state.i.username == x.username && x.host == host) return;
// 重複は除外
if (this.text.indexOf(`${mention} `) != -1) return;

View File

@@ -0,0 +1,72 @@
<template>
<mk-window ref="window" is-modal width="450px" height="500px" @closed="$destroy">
<span slot="header">%fa:envelope R% %i18n:@title%</span>
<div class="slpqaxdoxhvglersgjukmvizkqbmbokc" :data-darkmode="$store.state.device.darkmode">
<div v-for="req in requests">
<router-link :key="req.id" :to="req.follower | userPage">{{ req.follower | userName }}</router-link>
<span>
<a @click="accept(req.follower)">%i18n:@accept%</a>|<a @click="reject(req.follower)">%i18n:@reject%</a>
</span>
</div>
</div>
</mk-window>
</template>
<script lang="ts">
import Vue from 'vue';
export default Vue.extend({
data() {
return {
fetching: true,
requests: []
};
},
mounted() {
(this as any).api('following/requests/list').then(requests => {
this.fetching = false;
this.requests = requests;
});
},
methods: {
accept(user) {
(this as any).api('following/requests/accept', { userId: user.id }).then(() => {
this.requests = this.requests.filter(r => r.follower.id != user.id);
});
},
reject(user) {
(this as any).api('following/requests/reject', { userId: user.id }).then(() => {
this.requests = this.requests.filter(r => r.follower.id != user.id);
});
},
close() {
(this as any).$refs.window.close();
}
}
});
</script>
<style lang="stylus" scoped>
root(isDark)
padding 16px
> button
margin-bottom 16px
> div
display flex
padding 16px
border solid 1px isDark ? #1c2023 : #eee
border-radius 4px
> span
margin 0 0 0 auto
.slpqaxdoxhvglersgjukmvizkqbmbokc[data-darkmode]
root(true)
.slpqaxdoxhvglersgjukmvizkqbmbokc:not([data-darkmode])
root(false)
</style>

View File

@@ -23,7 +23,11 @@
</label>
<button class="ui primary" @click="save">%i18n:@save%</button>
<section>
<h2>その他</h2>
<h2>%i18n:@locked-account%</h2>
<mk-switch v-model="$store.state.i.isLocked" @change="onChangeIsLocked" text="%i18n:@is-locked%"/>
</section>
<section>
<h2>%i18n:@other%</h2>
<mk-switch v-model="$store.state.i.isBot" @change="onChangeIsBot" text="%i18n:@is-bot%"/>
<mk-switch v-model="$store.state.i.isCat" @change="onChangeIsCat" text="%i18n:@is-cat%"/>
</section>
@@ -62,6 +66,11 @@ export default Vue.extend({
(this as any).apis.notify('プロフィールを更新しました');
});
},
onChangeIsLocked() {
(this as any).api('i/update', {
isLocked: this.$store.state.i.isLocked
});
},
onChangeIsBot() {
(this as any).api('i/update', {
isBot: this.$store.state.i.isBot

View File

@@ -40,6 +40,8 @@
<button class="ui button" @click="customizeHome" style="margin-bottom: 16px">%i18n:@customize%</button>
</div>
<div class="div">
<button class="ui" @click="updateWallpaper">%i18n:@choose-wallpaper%</button>
<button class="ui" @click="deleteWallpaper">%i18n:@delete-wallpaper%</button>
<mk-switch v-model="darkmode" text="%i18n:@dark-mode%"/>
<mk-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons" text="%i18n:@circle-icons%"/>
<mk-switch v-model="$store.state.settings.gradientWindowHeader" @change="onChangeGradientWindowHeader" text="%i18n:@gradient-window-header%"/>
@@ -293,6 +295,20 @@ export default Vue.extend({
this.$router.push('/i/customize-home');
this.$emit('done');
},
updateWallpaper() {
(this as any).apis.chooseDriveFile({
multiple: false
}).then(file => {
(this as any).api('i/update', {
wallpaperId: file.id
});
});
},
deleteWallpaper() {
(this as any).api('i/update', {
wallpaperId: null
});
},
onChangeFetchOnScroll(v) {
this.$store.dispatch('settings/set', {
key: 'fetchOnScroll',

View File

@@ -5,7 +5,7 @@
<span v-if="note.deletedAt" style="opacity: 0.5">%i18n:@deleted%</span>
<a class="reply" v-if="note.replyId">%fa:reply%</a>
<mk-note-html v-if="note.text" :text="note.text" :i="$store.state.i"/>
<a class="rp" v-if="note.renoteId" :href="`/note:${note.renoteId}`">RP: ...</a>
<a class="rp" v-if="note.renoteId" :href="`/notes/${note.renoteId}`">RP: ...</a>
</div>
<details v-if="note.media.length > 0">
<summary>({{ '%i18n:@media-count%'.replace('{}', note.media.length) }})</summary>

View File

@@ -36,7 +36,7 @@ export default Vue.extend({
</script>
<style lang="stylus" scoped>
.mk-ui-notification
root(isDark)
display block
position fixed
z-index 10000
@@ -46,10 +46,10 @@ export default Vue.extend({
margin 0 auto
padding 128px 0 0 0
width 500px
color rgba(#000, 0.6)
background rgba(#fff, 0.9)
color rgba(isDark ? #fff : #000, 0.6)
background rgba(isDark ? #282C37 : #fff, 0.9)
border-radius 0 0 8px 8px
box-shadow 0 2px 4px rgba(#000, 0.2)
box-shadow 0 2px 4px rgba(#000, isDark ? 0.4 : 0.2)
transform translateY(-64px)
opacity 0
@@ -58,4 +58,10 @@ export default Vue.extend({
line-height 64px
text-align center
.mk-ui-notification[data-darkmode]
root(true)
.mk-ui-notification:not([data-darkmode])
root(false)
</style>

View File

@@ -19,6 +19,9 @@
<li @click="list">
<p>%fa:list%<span>%i18n:@lists%</span>%fa:angle-right%</p>
</li>
<li @click="followRequests" v-if="$store.state.i.isLocked">
<p>%fa:envelope R%<span>%i18n:@follow-requests%<i v-if="$store.state.i.pendingReceivedFollowRequestsCount">{{ $store.state.i.pendingReceivedFollowRequestsCount }}</i></span>%fa:angle-right%</p>
</li>
</ul>
<ul>
<li>
@@ -46,6 +49,7 @@
<script lang="ts">
import Vue from 'vue';
import MkUserListsWindow from './user-lists-window.vue';
import MkFollowRequestsWindow from './received-follow-requests-window.vue';
import MkSettingsWindow from './settings-window.vue';
import MkDriveWindow from './drive-window.vue';
import contains from '../../../common/scripts/contains';
@@ -91,6 +95,10 @@ export default Vue.extend({
this.$router.push(`i/lists/${ list.id }`);
});
},
followRequests() {
this.close();
(this as any).os.new(MkFollowRequestsWindow);
},
settings() {
this.close();
(this as any).os.new(MkSettingsWindow);
@@ -225,6 +233,16 @@ root(isDark)
> span:first-child
padding-left 22px
> span:nth-child(2)
> i
margin-left 4px
padding 2px 8px
font-size 90%
font-style normal
background $theme-color
color $theme-color-foreground
border-radius 8px
> [data-fa]:first-child
margin-right 6px
width 16px

View File

@@ -8,7 +8,7 @@
</time>
</div>
<div class="content">
<mk-analog-clock/>
<mk-analog-clock :dark="true"/>
</div>
</div>
</template>

View File

@@ -8,6 +8,12 @@
<p>%i18n:@home%</p>
</router-link>
</li>
<li class="deck" :class="{ active: $route.name == 'deck' }">
<router-link to="/deck">
%fa:columns%
<p>%i18n:@deck% <small>(beta)</small></p>
</router-link>
</li>
<li class="messaging">
<a @click="messaging">
%fa:comments%

View File

@@ -17,7 +17,11 @@ export default Vue.extend({
},
methods: {
onSubmit() {
location.href = `/search?q=${encodeURIComponent(this.q)}`;
if (this.q.startsWith('#')) {
this.$router.push(`/tags/${encodeURIComponent(this.q.substr(1))}`);
} else {
this.$router.push(`/search?q=${encodeURIComponent(this.q)}`);
}
}
}
});

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