Compare commits

...

130 Commits

Author SHA1 Message Date
196c55edbc Merge pull request #2125 from acid-chicken/acid-chicken-patch-2
Spotify
2018-08-09 03:32:55 +09:00
e724c1e7e8 Update url-preview.vue 2018-08-09 03:32:09 +09:00
869c19c666 fix(package): update style-loader to version 0.22.1 2018-08-09 00:59:39 +09:00
86a5f715d3 Merge pull request #2121 from syuilo/greenkeeper/systeminformation-3.42.9
Update systeminformation to the latest version 🚀
2018-08-08 23:18:27 +09:00
514aeac2d8 Merge pull request #2120 from syuilo/greenkeeper/vue-loader-15.3.0
Update vue-loader to the latest version 🚀
2018-08-08 23:18:16 +09:00
8980a26713 Merge pull request #2119 from syuilo/greenkeeper/style-loader-0.22.0
Update style-loader to the latest version 🚀
2018-08-08 23:18:06 +09:00
a39e2b28d1 Merge pull request #2118 from syuilo/greenkeeper/commander-2.17.1
Update commander to the latest version 🚀
2018-08-08 23:17:53 +09:00
bef617cb7c fix(package): update systeminformation to version 3.42.9 2018-08-08 05:13:03 +00:00
1dc1feca0f fix(package): update vue-loader to version 15.3.0 2018-08-07 21:34:59 +00:00
90eed0ea0d fix(package): update style-loader to version 0.22.0 2018-08-07 13:13:16 +00:00
c730e5edfa fix(package): update commander to version 2.17.1 2018-08-07 11:23:35 +00:00
7bd33ecc72 ✌️ 2018-08-07 13:25:50 +09:00
d4f7058574 🍕 2018-08-07 12:37:17 +09:00
980ae3dcb3 Merge pull request #2114 from gutfuckllc/devel
Localized all hiragana lines.
2018-08-07 11:09:55 +09:00
3a76113b78 Merge pull request #2109 from syuilo/l10n_master
New Crowdin translations
2018-08-07 11:09:34 +09:00
ec8105b2ae Merge pull request #2112 from syuilo/greenkeeper/@types/node-10.5.7
Update @types/node to the latest version 🚀
2018-08-07 11:09:16 +09:00
bf05785345 Merge pull request #2110 from syuilo/greenkeeper/typescript-eslint-parser-18.0.0
Update typescript-eslint-parser to the latest version 🚀
2018-08-07 11:09:07 +09:00
82346d788b Merge pull request #2115 from syuilo/greenkeeper/vue-loader-15.2.7
Update vue-loader to the latest version 🚀
2018-08-07 11:08:46 +09:00
d86cfa86e4 fix(package): update vue-loader to version 15.2.7 2018-08-07 02:05:20 +00:00
b85f13dad3 Localize mobile search.vue 2018-08-06 21:06:09 -04:00
eb8c3fe884 Localize a dev file 2018-08-06 21:03:24 -04:00
ff325d9588 Localized annotations line 2018-08-06 21:00:58 -04:00
a98392ff27 Localize "only one file attached" popup 2018-08-06 20:57:14 -04:00
22b8aab7a0 fix(package): update @types/node to version 10.5.7 2018-08-06 22:08:57 +00:00
24de518922 Localized 2 missing lines for mobile widgets.vue 2018-08-06 16:08:54 -04:00
a169c7756f Added more close buttons 2018-08-06 16:05:48 -04:00
249a7f4f68 Slight reordering 2018-08-06 16:05:32 -04:00
4f590e0a96 Localized adjective 2018-08-06 16:04:20 -04:00
f5b5b290e4 Localized copy-paste message (added common) 2018-08-06 16:02:53 -04:00
1f75cf4ace Localize missing line 2018-08-06 16:00:12 -04:00
1e4f11a979 Localize japanese adjective. 2018-08-06 15:58:09 -04:00
be12e23aa1 Localize unlocalized line. 2018-08-06 15:55:39 -04:00
790e6ceca4 Localize unlocalized line 2018-08-06 15:53:21 -04:00
a303d52990 Fix typo 2018-08-06 15:53:06 -04:00
096fab575c fix(package): update typescript-eslint-parser to version 18.0.0 2018-08-06 19:52:58 +00:00
a256393b81 Merge remote-tracking branch 'upstream/master' into devel 2018-08-06 15:45:52 -04:00
e8eee9057a New translations ja.yml (Spanish) 2018-08-07 03:51:39 +09:00
d81acae17e 5.19.0 2018-08-07 03:33:21 +09:00
313715bc75 Merge pull request #2108 from syuilo/l10n_master
New Crowdin translations
2018-08-07 03:32:25 +09:00
94dabd2038 New translations ja.yml (English) 2018-08-07 03:31:58 +09:00
a3d58e5bc7 New translations ja.yml (Catalan) 2018-08-07 03:22:45 +09:00
bfdfd026a2 New translations ja.yml (Portuguese) 2018-08-07 03:22:43 +09:00
b713f06599 New translations ja.yml (Korean) 2018-08-07 03:22:41 +09:00
2172c5edca New translations ja.yml (Polish) 2018-08-07 03:22:39 +09:00
9bc0cfacfa New translations ja.yml (Chinese Simplified) 2018-08-07 03:22:37 +09:00
546cfeadbe New translations ja.yml (Italian) 2018-08-07 03:22:33 +09:00
2413583ce9 New translations ja.yml (Russian) 2018-08-07 03:22:30 +09:00
d7510491a5 New translations ja.yml (English) 2018-08-07 03:22:28 +09:00
61db07edf4 New translations ja.yml (Spanish) 2018-08-07 03:22:25 +09:00
5c3ac8f952 New translations ja.yml (German) 2018-08-07 03:22:22 +09:00
5bfcb75ec3 New translations ja.yml (French) 2018-08-07 03:22:18 +09:00
d733a1b445 i18n 2018-08-07 03:20:26 +09:00
75c44cd349 Merge pull request #2107 from syuilo/l10n_master
New Crowdin translations
2018-08-07 00:28:13 +09:00
f4d247cfae New translations ja.yml (English) 2018-08-07 00:21:42 +09:00
4260ec713f Improve error handling 2018-08-06 21:48:23 +09:00
99f4ab7000 ✌️ 2018-08-06 21:35:49 +09:00
b6157e0012 5.18.0 2018-08-06 18:30:19 +09:00
4405c19852 Merge pull request #2104 from syuilo/greenkeeper/webpack-4.16.5
Update webpack to the latest version 🚀
2018-08-06 18:29:07 +09:00
5f208a7d99 ユーザー検索APIを統合 2018-08-06 18:28:27 +09:00
2ec4cc9a07 fix(package): update webpack to version 4.16.5 2018-08-06 07:19:30 +00:00
06390380f8 Translated mute. 2018-08-06 03:18:52 -04:00
752186066b Merge remote-tracking branch 'upstream/master' into devel 2018-08-05 16:54:54 -04:00
10f9549a04 非公開の投稿に自分以外が返信したりRenoteしたりできないように 2018-08-06 04:38:31 +09:00
84a4174883 削除された投稿に返信したりRenoteしたりできないように 2018-08-06 04:07:22 +09:00
ee765d0812 Fix test 2018-08-06 00:31:09 +09:00
1ccd2def50 5.17.0 2018-08-06 00:15:13 +09:00
0d9782571f 🎨 2018-08-06 00:09:21 +09:00
973018fc98 Merge pull request #2095 from syuilo/l10n_master
New Crowdin translations
2018-08-06 00:01:17 +09:00
d0926a3ba1 MFMの((()))構文が顔文字と競合する対策としてタグ形式の構文も追加 2018-08-05 23:56:08 +09:00
be67f5f422 🎨 2018-08-05 23:38:31 +09:00
b70b607c4f New translations ja.yml (Polish) 2018-08-05 22:00:49 +09:00
2bd38fa052 New translations ja.yml (Polish) 2018-08-05 21:51:12 +09:00
43b6140dbe Fix bug 2018-08-05 21:03:52 +09:00
813804a43e 5.16.0 2018-08-05 21:01:03 +09:00
bec9604445 Merge branch 'master' of https://github.com/syuilo/misskey 2018-08-05 20:57:27 +09:00
2e454dad2d 🎨 2018-08-05 20:57:24 +09:00
7d64435e56 Merge pull request #2091 from syuilo/l10n_master
New Crowdin translations
2018-08-05 19:42:59 +09:00
6ef28214df ひとつの投稿内で使えるそれぞれの動きのあるMFM構文は3回までに制限 2018-08-05 19:36:19 +09:00
5bbc95d659 文字数が多い場合は動きを無効に 2018-08-05 19:20:26 +09:00
83794f254c New translations ja.yml (French) 2018-08-05 16:31:14 +09:00
005d25a07b Fix test 2018-08-05 13:50:49 +09:00
255222bfb4 5.15.0 2018-08-05 13:47:51 +09:00
9e5e3c2f2e ✌️ 2018-08-05 13:44:44 +09:00
5bd80f115f Merge pull request #2089 from syuilo/greenkeeper/@types/node-10.5.6
Update @types/node to the latest version 🚀
2018-08-05 13:41:05 +09:00
c86e1a3e9b Merge pull request #2088 from syuilo/greenkeeper/commander-2.17.0
Update commander to the latest version 🚀
2018-08-05 13:40:57 +09:00
128a201b9d #2080 など 2018-08-05 13:40:26 +09:00
b68f74f39c typo 2018-08-05 12:33:55 +09:00
cd28504dd8 Add new MFM syntax 2018-08-05 12:33:51 +09:00
911762fedf Removed start.sh 2018-08-04 13:13:56 -04:00
de448fc99f Added start.sh 2018-08-04 13:13:29 -04:00
a3531981ee New translations ja.yml (French) 2018-08-05 00:30:59 +09:00
fc8d06a9ab New translations ja.yml (Korean) 2018-08-04 23:20:55 +09:00
5de8edf15f New translations ja.yml (Korean) 2018-08-04 23:10:59 +09:00
f762cf2770 Merge branch 'master' of https://github.com/syuilo/misskey 2018-08-04 23:04:56 +09:00
d84cae9358 5.14.0 2018-08-04 23:04:45 +09:00
9c54721010 Merge pull request #2090 from syuilo/l10n_master
New Crowdin translations
2018-08-04 23:03:59 +09:00
16f35c81a1 New translations ja.yml (Korean) 2018-08-04 23:00:59 +09:00
d0dbb62a54 New translations ja.yml (English) 2018-08-04 23:00:57 +09:00
9fa68f4478 New translations ja.yml (Catalan) 2018-08-04 22:51:25 +09:00
0d76625868 New translations ja.yml (Portuguese) 2018-08-04 22:51:23 +09:00
5a8a701188 New translations ja.yml (Korean) 2018-08-04 22:51:21 +09:00
121344afbb New translations ja.yml (Polish) 2018-08-04 22:51:19 +09:00
d647cf3446 New translations ja.yml (Chinese Simplified) 2018-08-04 22:51:16 +09:00
04a23b3f2f New translations ja.yml (Italian) 2018-08-04 22:51:14 +09:00
08826e1c41 New translations ja.yml (Russian) 2018-08-04 22:51:12 +09:00
2e31e3c7cb New translations ja.yml (English) 2018-08-04 22:51:10 +09:00
7aed50f9fa New translations ja.yml (Spanish) 2018-08-04 22:51:08 +09:00
2de782dbe4 New translations ja.yml (German) 2018-08-04 22:51:06 +09:00
50693fbe25 New translations ja.yml (French) 2018-08-04 22:51:03 +09:00
9a2ff56a79 動きのあるMFMを無効にするオプションを実装 2018-08-04 22:48:35 +09:00
daed63d66c Update doc 2018-08-04 22:33:37 +09:00
f2241a47b7 New translations ja.yml (Catalan) 2018-08-04 22:31:23 +09:00
de95aac59b New translations ja.yml (Portuguese) 2018-08-04 22:31:20 +09:00
8612ac0c6a New translations ja.yml (Korean) 2018-08-04 22:31:18 +09:00
2118e500a8 New translations ja.yml (Polish) 2018-08-04 22:31:16 +09:00
a7063eab85 New translations ja.yml (Chinese Simplified) 2018-08-04 22:31:14 +09:00
5b5ae0e47f New translations ja.yml (Italian) 2018-08-04 22:31:12 +09:00
b19ecc1a0d New translations ja.yml (Russian) 2018-08-04 22:31:10 +09:00
ac9223957f New translations ja.yml (English) 2018-08-04 22:31:07 +09:00
e580adc41e New translations ja.yml (Spanish) 2018-08-04 22:31:05 +09:00
607a105b78 New translations ja.yml (German) 2018-08-04 22:31:03 +09:00
cc601cf600 New translations ja.yml (French) 2018-08-04 22:31:01 +09:00
be9f6ad294 Implement surrender of reversi 2018-08-04 22:28:01 +09:00
a2952c02cf New translations ja.yml (French) 2018-08-04 21:31:21 +09:00
244d567b3a 5.13.2 2018-08-04 12:38:14 +09:00
61a9ad23f1 Fix bug 2018-08-04 12:35:57 +09:00
4f7c19461e 5.13.1 2018-08-04 11:40:06 +09:00
4ba6e1c2b2 Fix bug 2018-08-04 11:39:59 +09:00
864d1a39cd fix(package): update @types/node to version 10.5.6 2018-08-04 01:48:39 +00:00
e14f244e83 fix(package): update commander to version 2.17.0 2018-08-04 00:14:18 +00:00
91 changed files with 1048 additions and 507 deletions

View File

@ -11,6 +11,7 @@ common:
warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。" warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。"
application-authorization: "アプリの連携" application-authorization: "アプリの連携"
close: "閉じる" close: "閉じる"
got-it: "わかった"
customization-tips: customization-tips:
title: "カスタマイズのヒント" title: "カスタマイズのヒント"
paragraph1: "ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。" paragraph1: "ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。"
@ -39,12 +40,6 @@ common:
months_ago: "{}ヶ月前" months_ago: "{}ヶ月前"
years_ago: "{}年前" years_ago: "{}年前"
trash: "ゴミ箱" trash: "ゴミ箱"
date:
full-year: "年"
month: "月"
day: "日"
hours: "時"
minutes: "分"
weekday-short: weekday-short:
sunday: "日" sunday: "日"
monday: "月" monday: "月"
@ -88,6 +83,7 @@ common:
i-like-sushi: "私は(プリンよりむしろ)寿司が好き" i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示" show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
verified-user: "認証済みのユーザー" verified-user: "認証済みのユーザー"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
reversi: reversi:
drawn: "引き分け" drawn: "引き分け"
my-turn: "あなたのターンです" my-turn: "あなたのターンです"
@ -168,6 +164,9 @@ common/views/components/games/reversi/reversi.vue:
matching: matching:
waiting-for: "{}を待っています" waiting-for: "{}を待っています"
cancel: "キャンセル" cancel: "キャンセル"
common/views/components/games/reversi/reversi.game.vue:
surrender: "投了"
surrendered: "投了により"
common/views/components/games/reversi/reversi.index.vue: common/views/components/games/reversi/reversi.index.vue:
title: "Misskey Reversi" title: "Misskey Reversi"
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう" sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
@ -279,6 +278,8 @@ common/views/components/signin.vue:
token: "トークン" token: "トークン"
signing-in: "やってます..." signing-in: "やってます..."
signin: "サインイン" signin: "サインイン"
or: "または"
signin-with-twitter: "Twitterでログイン"
common/views/components/signup.vue: common/views/components/signup.vue:
username: "ユーザー名" username: "ユーザー名"
checking: "確認しています..." checking: "確認しています..."
@ -388,6 +389,17 @@ common/views/pages/follow.vue:
follow: "フォロー" follow: "フォロー"
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
follow-request: "フォロー申請" follow-request: "フォロー申請"
desktop:
banner-crop-title: "バナーとして表示する部分を選択"
banner: "バナー"
uploading-banner: "新しいバナーをアップロードしています"
banner-updated: "バナーを更新しました"
choose-banner: "バナーにする画像を選択"
avatar-crop-title: "アバターとして表示する部分を選択"
avatar: "アバター"
uploading-avatar: "新しいアバターをアップロードしています"
avatar-updated: "アバターを更新しました"
choose-avatar: "アバターにする画像を選択"
desktop/views/components/activity.chart.vue: desktop/views/components/activity.chart.vue:
total: "Black ... Total" total: "Black ... Total"
notes: "Blue ... Notes" notes: "Blue ... Notes"
@ -746,6 +758,7 @@ desktop/views/components/received-follow-requests-window.vue:
desktop/views/components/user-lists-window.vue: desktop/views/components/user-lists-window.vue:
title: "リスト" title: "リスト"
create-list: "リストを作成" create-list: "リストを作成"
list-name: "リスト名"
desktop/views/components/user-preview.vue: desktop/views/components/user-preview.vue:
notes: "投稿" notes: "投稿"
following: "フォロー" following: "フォロー"
@ -828,6 +841,8 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする" mute: "ミュートする"
muted: "ミュートしています" muted: "ミュートしています"
unmute: "ミュート解除" unmute: "ミュート解除"
push-to-a-list: "リストに追加"
list-pushed: "{user}を{list}に追加しました。"
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
posts: "投稿" posts: "投稿"
following: "フォロー" following: "フォロー"

View File

@ -11,6 +11,7 @@ common:
warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。" warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。"
application-authorization: "アプリの連携" application-authorization: "アプリの連携"
close: "閉じる" close: "閉じる"
got-it: "わかった"
customization-tips: customization-tips:
title: "カスタマイズのヒント" title: "カスタマイズのヒント"
paragraph1: "ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。" paragraph1: "ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。"
@ -39,12 +40,6 @@ common:
months_ago: "vor {0} Monat{0:en}" months_ago: "vor {0} Monat{0:en}"
years_ago: "vor {} Jahr{0:en}" years_ago: "vor {} Jahr{0:en}"
trash: "ゴミ箱" trash: "ゴミ箱"
date:
full-year: "年"
month: "月"
day: "日"
hours: "時"
minutes: "分"
weekday-short: weekday-short:
sunday: "So" sunday: "So"
monday: "Mo" monday: "Mo"
@ -88,6 +83,7 @@ common:
i-like-sushi: "私は(プリンよりむしろ)寿司が好き" i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示" show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
verified-user: "認証済みのユーザー" verified-user: "認証済みのユーザー"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
reversi: reversi:
drawn: "引き分け" drawn: "引き分け"
my-turn: "あなたのターンです" my-turn: "あなたのターンです"
@ -168,6 +164,9 @@ common/views/components/games/reversi/reversi.vue:
matching: matching:
waiting-for: "{}を待っています" waiting-for: "{}を待っています"
cancel: "キャンセル" cancel: "キャンセル"
common/views/components/games/reversi/reversi.game.vue:
surrender: "投了"
surrendered: "投了により"
common/views/components/games/reversi/reversi.index.vue: common/views/components/games/reversi/reversi.index.vue:
title: "Misskey Reversi" title: "Misskey Reversi"
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう" sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
@ -279,6 +278,8 @@ common/views/components/signin.vue:
token: "Token" token: "Token"
signing-in: "Melde an..." signing-in: "Melde an..."
signin: "Anmelden" signin: "Anmelden"
or: "または"
signin-with-twitter: "Twitterでログイン"
common/views/components/signup.vue: common/views/components/signup.vue:
username: "Benutzername" username: "Benutzername"
checking: "Überprüfung..." checking: "Überprüfung..."
@ -388,6 +389,17 @@ common/views/pages/follow.vue:
follow: "フォロー" follow: "フォロー"
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
follow-request: "フォロー申請" follow-request: "フォロー申請"
desktop:
banner-crop-title: "バナーとして表示する部分を選択"
banner: "バナー"
uploading-banner: "新しいバナーをアップロードしています"
banner-updated: "バナーを更新しました"
choose-banner: "バナーにする画像を選択"
avatar-crop-title: "アバターとして表示する部分を選択"
avatar: "アバター"
uploading-avatar: "新しいアバターをアップロードしています"
avatar-updated: "アバターを更新しました"
choose-avatar: "アバターにする画像を選択"
desktop/views/components/activity.chart.vue: desktop/views/components/activity.chart.vue:
total: "Schwarz ... komplett" total: "Schwarz ... komplett"
notes: "Blau ... Hinweise" notes: "Blau ... Hinweise"
@ -746,6 +758,7 @@ desktop/views/components/received-follow-requests-window.vue:
desktop/views/components/user-lists-window.vue: desktop/views/components/user-lists-window.vue:
title: "リスト" title: "リスト"
create-list: "リストを作成" create-list: "リストを作成"
list-name: "リスト名"
desktop/views/components/user-preview.vue: desktop/views/components/user-preview.vue:
notes: "投稿" notes: "投稿"
following: "フォロー" following: "フォロー"
@ -828,6 +841,8 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする" mute: "ミュートする"
muted: "ミュートしています" muted: "ミュートしています"
unmute: "ミュート解除" unmute: "ミュート解除"
push-to-a-list: "リストに追加"
list-pushed: "{user}を{list}に追加しました。"
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
posts: "投稿" posts: "投稿"
following: "フォロー" following: "フォロー"

View File

@ -11,6 +11,7 @@ common:
warning: "<strong>Misskey is not running ads</strong>, but some features may be unavailable or malfunctioning if ad blocking features are enabled." warning: "<strong>Misskey is not running ads</strong>, but some features may be unavailable or malfunctioning if ad blocking features are enabled."
application-authorization: "Application authorizations." application-authorization: "Application authorizations."
close: "Close" close: "Close"
got-it: "Got it!"
customization-tips: customization-tips:
title: "Customization tips" title: "Customization tips"
paragraph1: "Home customization allows you to add/delete, drag and drop and rearrange widgets." paragraph1: "Home customization allows you to add/delete, drag and drop and rearrange widgets."
@ -39,12 +40,6 @@ common:
months_ago: "{}month(s) ago" months_ago: "{}month(s) ago"
years_ago: "{}year(s) ago" years_ago: "{}year(s) ago"
trash: "Trash" trash: "Trash"
date:
full-year: "Year"
month: "Month"
day: "Day"
hours: "Hour"
minutes: "Minutes"
weekday-short: weekday-short:
sunday: "S" sunday: "S"
monday: "M" monday: "M"
@ -88,6 +83,7 @@ common:
i-like-sushi: "I prefer sushi rather than pudding" i-like-sushi: "I prefer sushi rather than pudding"
show-reversi-board-labels: "Show row and column labels in Reversi" show-reversi-board-labels: "Show row and column labels in Reversi"
verified-user: "Verified user" verified-user: "Verified user"
disable-animated-mfm: "Disable animated texts in a post"
reversi: reversi:
drawn: "Draw" drawn: "Draw"
my-turn: "Your turn" my-turn: "Your turn"
@ -168,6 +164,9 @@ common/views/components/games/reversi/reversi.vue:
matching: matching:
waiting-for: "Waiting for {}" waiting-for: "Waiting for {}"
cancel: "Cancel" cancel: "Cancel"
common/views/components/games/reversi/reversi.game.vue:
surrender: "Surrender"
surrendered: "By surrender"
common/views/components/games/reversi/reversi.index.vue: common/views/components/games/reversi/reversi.index.vue:
title: "Misskey Reversi" title: "Misskey Reversi"
sub-title: "Play reversi with your friends!" sub-title: "Play reversi with your friends!"
@ -203,7 +202,7 @@ common/views/components/games/reversi/reversi.room.vue:
cancel-ready: "Cancel \"Ready\"" cancel-ready: "Cancel \"Ready\""
common/views/components/connect-failed.vue: common/views/components/connect-failed.vue:
title: "Unable to connect to the server" title: "Unable to connect to the server"
description: "There is a problem with your Internet connection, or the server may be down or under maintenance. Please try again later." description: "There is a problem with your Internet connection, or the server may be down or under maintenance. Please {try again} later."
thanks: "Thank you for using Misskey." thanks: "Thank you for using Misskey."
troubleshoot: "Troubleshoot" troubleshoot: "Troubleshoot"
common/views/components/connect-failed.troubleshooter.vue: common/views/components/connect-failed.troubleshooter.vue:
@ -279,6 +278,8 @@ common/views/components/signin.vue:
token: "Token" token: "Token"
signing-in: "Signing in..." signing-in: "Signing in..."
signin: "Sign in" signin: "Sign in"
or: "Or"
signin-with-twitter: "Log in with Twitter"
common/views/components/signup.vue: common/views/components/signup.vue:
username: "Username" username: "Username"
checking: "Checking..." checking: "Checking..."
@ -388,6 +389,17 @@ common/views/pages/follow.vue:
follow: "Follow" follow: "Follow"
request-pending: "Pending follow request" request-pending: "Pending follow request"
follow-request: "Follow request" follow-request: "Follow request"
desktop:
banner-crop-title: "Crop the part that appears as a banner"
banner: "Banner"
uploading-banner: "Uploading a new banner"
banner-updated: "Updated the banner"
choose-banner: "Choose the banner"
avatar-crop-title: "Crop the part that appears as an avatar"
avatar: "Avatar"
uploading-avatar: "Uploading a new avatar"
avatar-updated: "Updated the avatar"
choose-avatar: "Choose an avatar image"
desktop/views/components/activity.chart.vue: desktop/views/components/activity.chart.vue:
total: "Black ... Total" total: "Black ... Total"
notes: "Blue ... Notes" notes: "Blue ... Notes"
@ -746,6 +758,7 @@ desktop/views/components/received-follow-requests-window.vue:
desktop/views/components/user-lists-window.vue: desktop/views/components/user-lists-window.vue:
title: "User lists" title: "User lists"
create-list: "Create new list" create-list: "Create new list"
list-name: "List name"
desktop/views/components/user-preview.vue: desktop/views/components/user-preview.vue:
notes: "Posts" notes: "Posts"
following: "Following" following: "Following"
@ -828,6 +841,8 @@ desktop/views/pages/user/user.profile.vue:
mute: "Mute" mute: "Mute"
muted: "Muting" muted: "Muting"
unmute: "Unmute" unmute: "Unmute"
push-to-a-list: "Add to list"
list-pushed: "You added {user} to {list}."
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
posts: "Notes" posts: "Notes"
following: "Following" following: "Following"
@ -1002,7 +1017,7 @@ mobile/views/pages/welcome.vue:
signup: "Sign up" signup: "Sign up"
mobile/views/pages/widgets.vue: mobile/views/pages/widgets.vue:
dashboard: "Dashboard" dashboard: "Dashboard"
widgets-hints: "ウィジェットを追加/削除したり並べ替えたりできます。ウィジェットを移動するには「三」をドラッグします。ウィジェットを削除するには「x」をタップします。いくつかのウィジェットはタップすることで表示を変更できます。" widgets-hints: "You can add/delete/rearrange widgets. To move the widget, drag \"三\". Tap \"x\" to delete the widget. Some widgets can change display by tapping."
mobile/views/pages/widgets/activity.vue: mobile/views/pages/widgets/activity.vue:
activity: "Activity" activity: "Activity"
mobile/views/pages/share.vue: mobile/views/pages/share.vue:

View File

@ -11,6 +11,7 @@ common:
warning: "<strong>Misskey no tiene anuncios publicitarios.</strong> Sin embargo, algunas características podrían no estar disponibles si el bloqueador de publicidad está habilitado." warning: "<strong>Misskey no tiene anuncios publicitarios.</strong> Sin embargo, algunas características podrían no estar disponibles si el bloqueador de publicidad está habilitado."
application-authorization: "Autorizaciones de la aplicación." application-authorization: "Autorizaciones de la aplicación."
close: "Cerrar" close: "Cerrar"
got-it: "¡Listo!"
customization-tips: customization-tips:
title: "Consejos de personalización" title: "Consejos de personalización"
paragraph1: "Customización de inicio le permite agregar, borrar, o reorganizar los accesorios." paragraph1: "Customización de inicio le permite agregar, borrar, o reorganizar los accesorios."
@ -39,12 +40,6 @@ common:
months_ago: "Hace {} mes(es)" months_ago: "Hace {} mes(es)"
years_ago: "Hace {} año(s)" years_ago: "Hace {} año(s)"
trash: "Papelera" trash: "Papelera"
date:
full-year: "Año"
month: "Mes"
day: "Día"
hours: "horas"
minutes: "minutos"
weekday-short: weekday-short:
sunday: "domingo" sunday: "domingo"
monday: "lunes" monday: "lunes"
@ -88,6 +83,7 @@ common:
i-like-sushi: "Prefiero sushi a pudín" i-like-sushi: "Prefiero sushi a pudín"
show-reversi-board-labels: "Mostrar etiquetas de filas y columnas en Reversi" show-reversi-board-labels: "Mostrar etiquetas de filas y columnas en Reversi"
verified-user: "Usuario verificado" verified-user: "Usuario verificado"
disable-animated-mfm: "Desactivar texto animado en una publicación"
reversi: reversi:
drawn: "Empatado" drawn: "Empatado"
my-turn: "Mi turno" my-turn: "Mi turno"
@ -168,21 +164,24 @@ common/views/components/games/reversi/reversi.vue:
matching: matching:
waiting-for: "Esperando por {}" waiting-for: "Esperando por {}"
cancel: "Cancelar" cancel: "Cancelar"
common/views/components/games/reversi/reversi.game.vue:
surrender: "Rendirse"
surrendered: "Por rendirse"
common/views/components/games/reversi/reversi.index.vue: common/views/components/games/reversi/reversi.index.vue:
title: "Misskey Reversi" title: "Misskey Reversi"
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう" sub-title: "¡Juega Reversi con tus amigos!"
invite: "招待" invite: "Invitar"
rule: "遊び方" rule: "Cómo jugar"
rule-desc: "リバーシは、相手と交互に石をボードに置いて、相手の石を挟んで自分の色に変えてゆき、最終的に残った石が多い方が勝ちというボードゲームです。" rule-desc: "リバーシは、相手と交互に石をボードに置いて、相手の石を挟んで自分の色に変えてゆき、最終的に残った石が多い方が勝ちというボードゲームです。"
mode-invite: "招待" mode-invite: "Invitar"
mode-invite-desc: "指定したユーザーと対戦するモードです。" mode-invite-desc: "Invitar un usuario al juego."
invitations: "対局の招待があります!" invitations: "¡Has recibido una invitación!"
my-games: "自分の対局" my-games: "Mis juegos"
all-games: "みんなの対局" all-games: "Todos los juegos"
enter-username: "ユーザー名を入力してください" enter-username: "Ingresar nombre de usuario"
game-state: game-state:
ended: "終了" ended: "Finalizado"
playing: "進行中" playing: "En progreso"
common/views/components/games/reversi/reversi.room.vue: common/views/components/games/reversi/reversi.room.vue:
settings-of-the-game: "Configuración de juego" settings-of-the-game: "Configuración de juego"
choose-map: "Elije un mapa" choose-map: "Elije un mapa"
@ -194,7 +193,7 @@ common/views/components/games/reversi/reversi.room.vue:
looped-map: "Mapa en bucle" looped-map: "Mapa en bucle"
can-put-everywhere: "Puedes colocar donde quieras" can-put-everywhere: "Puedes colocar donde quieras"
settings-of-the-bot: "Configuración de bot" settings-of-the-bot: "Configuración de bot"
this-game-is-started-soon: "ゲームは数秒後に開始されます" this-game-is-started-soon: "El juego comenzará pronto"
waiting-for-other: "Esperando a que se prepare el adversario" waiting-for-other: "Esperando a que se prepare el adversario"
waiting-for-me: "Esperando por la preparación" waiting-for-me: "Esperando por la preparación"
waiting-for-both: "Esperando por ti" waiting-for-both: "Esperando por ti"
@ -279,6 +278,8 @@ common/views/components/signin.vue:
token: "Identificador" token: "Identificador"
signing-in: "Entrando..." signing-in: "Entrando..."
signin: "Entra" signin: "Entra"
or: "O"
signin-with-twitter: "Ingresar con Twitter"
common/views/components/signup.vue: common/views/components/signup.vue:
username: "Usuario" username: "Usuario"
checking: "Comprobando..." checking: "Comprobando..."
@ -373,7 +374,7 @@ common/views/widgets/tips.vue:
tips-line9: "Misskey está hecho bajo licencia AGPLv3" tips-line9: "Misskey está hecho bajo licencia AGPLv3"
tips-line10: "Usando el accesorio de Máquina del Tiempo puedes encontrar publicaciones antiguas" tips-line10: "Usando el accesorio de Máquina del Tiempo puedes encontrar publicaciones antiguas"
tips-line11: "Puedes resaltar publicaciones en la página de usuario haciendo click en \"...\"" tips-line11: "Puedes resaltar publicaciones en la página de usuario haciendo click en \"...\""
tips-line13: "投稿に添付したファイルは全てドライブに保存されます" tips-line13: "Todos los archivos añadidos a la publicación se han guardado en tu unidad."
tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます" tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます"
tips-line17: "「**」でテキストを囲むと**強調表示**されます" tips-line17: "「**」でテキストを囲むと**強調表示**されます"
tips-line19: "いくつかのウィンドウはブラウザの外に切り離すことができます" tips-line19: "いくつかのウィンドウはブラウザの外に切り離すことができます"
@ -388,6 +389,17 @@ common/views/pages/follow.vue:
follow: "フォロー" follow: "フォロー"
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
follow-request: "フォロー申請" follow-request: "フォロー申請"
desktop:
banner-crop-title: "バナーとして表示する部分を選択"
banner: "バナー"
uploading-banner: "新しいバナーをアップロードしています"
banner-updated: "バナーを更新しました"
choose-banner: "バナーにする画像を選択"
avatar-crop-title: "アバターとして表示する部分を選択"
avatar: "アバター"
uploading-avatar: "新しいアバターをアップロードしています"
avatar-updated: "アバターを更新しました"
choose-avatar: "アバターにする画像を選択"
desktop/views/components/activity.chart.vue: desktop/views/components/activity.chart.vue:
total: "Black ... Total" total: "Black ... Total"
notes: "Blue ... Notes" notes: "Blue ... Notes"
@ -746,6 +758,7 @@ desktop/views/components/received-follow-requests-window.vue:
desktop/views/components/user-lists-window.vue: desktop/views/components/user-lists-window.vue:
title: "リスト" title: "リスト"
create-list: "リストを作成" create-list: "リストを作成"
list-name: "リスト名"
desktop/views/components/user-preview.vue: desktop/views/components/user-preview.vue:
notes: "投稿" notes: "投稿"
following: "フォロー" following: "フォロー"
@ -828,6 +841,8 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする" mute: "ミュートする"
muted: "ミュートしています" muted: "ミュートしています"
unmute: "ミュート解除" unmute: "ミュート解除"
push-to-a-list: "リストに追加"
list-pushed: "{user}を{list}に追加しました。"
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
posts: "投稿" posts: "投稿"
following: "フォロー" following: "フォロー"

View File

@ -11,6 +11,7 @@ common:
warning: "<strong>Misskey n'utilise pas de publicités</strong>, mais quelques options peuvent être non disponibles ou fonctionneraient mal si un bloqueur de publicités est activé." warning: "<strong>Misskey n'utilise pas de publicités</strong>, mais quelques options peuvent être non disponibles ou fonctionneraient mal si un bloqueur de publicités est activé."
application-authorization: "Permissions de l'application" application-authorization: "Permissions de l'application"
close: "Fermer" close: "Fermer"
got-it: "わかった"
customization-tips: customization-tips:
title: "Conseils de personnalisation" title: "Conseils de personnalisation"
paragraph1: "La personnalisation à la maison vous permet d'ajouter / supprimer, glisser et déposer et réorganiser les widgets." paragraph1: "La personnalisation à la maison vous permet d'ajouter / supprimer, glisser et déposer et réorganiser les widgets."
@ -39,12 +40,6 @@ common:
months_ago: "Il y a {} mois" months_ago: "Il y a {} mois"
years_ago: "Il y a {} an·s" years_ago: "Il y a {} an·s"
trash: "Corbeille" trash: "Corbeille"
date:
full-year: "Année "
month: "Mois"
day: "Jour"
hours: "heures"
minutes: "minutes"
weekday-short: weekday-short:
sunday: "D" sunday: "D"
monday: "L" monday: "L"
@ -88,6 +83,7 @@ common:
i-like-sushi: "Je préfère les sushis (au pudding)" i-like-sushi: "Je préfère les sushis (au pudding)"
show-reversi-board-labels: "Afficher les étiquettes des lignes et colonnes dans Reversi" show-reversi-board-labels: "Afficher les étiquettes des lignes et colonnes dans Reversi"
verified-user: "Utilisateur·trice vérifié·e" verified-user: "Utilisateur·trice vérifié·e"
disable-animated-mfm: "Désactiver les textes animés dans les publications"
reversi: reversi:
drawn: "Partie nulle" drawn: "Partie nulle"
my-turn: "Cest votre tour" my-turn: "Cest votre tour"
@ -98,7 +94,7 @@ common:
black: "Noirs" black: "Noirs"
white: "Blancs" white: "Blancs"
total: "Total" total: "Total"
this-turn: "Tour de {}" this-turn: "Tour {}"
widgets: widgets:
analog-clock: "Horloge analogique" analog-clock: "Horloge analogique"
profile: "Profil" profile: "Profil"
@ -116,7 +112,7 @@ common:
notifications: "Notifications" notifications: "Notifications"
users: "Utilisateurs" users: "Utilisateurs"
polls: "Sondages" polls: "Sondages"
post-form: "投稿フォーム" post-form: "Formulaire de publication"
messaging: "Messagerie" messaging: "Messagerie"
server: "Info sur le serveur" server: "Info sur le serveur"
donation: "Dons" donation: "Dons"
@ -156,7 +152,7 @@ auth/views/form.vue:
accept: "Autoriser laccès" accept: "Autoriser laccès"
auth/views/index.vue: auth/views/index.vue:
loading: "Chargement en cours" loading: "Chargement en cours"
denied: "アプリケーションの連携をキャンセルしました。" denied: "L'autorisation de l'application a été refusée."
denied-paragraph: "Cette application ne va pas accéder à votre compte." denied-paragraph: "Cette application ne va pas accéder à votre compte."
already-authorized: "Cette application est déjà autorisée" already-authorized: "Cette application est déjà autorisée"
allowed: "アプリケーションの連携を許可しました" allowed: "アプリケーションの連携を許可しました"
@ -168,6 +164,9 @@ common/views/components/games/reversi/reversi.vue:
matching: matching:
waiting-for: "En attente de {}" waiting-for: "En attente de {}"
cancel: "Annuler" cancel: "Annuler"
common/views/components/games/reversi/reversi.game.vue:
surrender: "Se rendre"
surrendered: "Par abandon"
common/views/components/games/reversi/reversi.index.vue: common/views/components/games/reversi/reversi.index.vue:
title: "Misskey Reversi" title: "Misskey Reversi"
sub-title: "Jouer à Reversi avec vos amis·es !" sub-title: "Jouer à Reversi avec vos amis·es !"
@ -197,10 +196,10 @@ common/views/components/games/reversi/reversi.room.vue:
this-game-is-started-soon: "La partie commencera dans quelques instants" this-game-is-started-soon: "La partie commencera dans quelques instants"
waiting-for-other: "En attente que l'adversaire soit prêt" waiting-for-other: "En attente que l'adversaire soit prêt"
waiting-for-me: "En attente que vous soyez prêt" waiting-for-me: "En attente que vous soyez prêt"
waiting-for-both: "準備中" waiting-for-both: "En attente que vous soyez prêt"
cancel: "Annuler" cancel: "Annuler"
ready: "Prêt" ready: "Prêt"
cancel-ready: "準備続行" cancel-ready: "Annuler \"Je suis prêt\""
common/views/components/connect-failed.vue: common/views/components/connect-failed.vue:
title: "Impossible de se connecter au server." 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." 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."
@ -279,6 +278,8 @@ common/views/components/signin.vue:
token: "Token" token: "Token"
signing-in: "Connexion...." signing-in: "Connexion...."
signin: "Se connecter" signin: "Se connecter"
or: "または"
signin-with-twitter: "Twitterでログイン"
common/views/components/signup.vue: common/views/components/signup.vue:
username: "Nom d'utilisateur" username: "Nom d'utilisateur"
checking: "Vérification" checking: "Vérification"
@ -364,15 +365,15 @@ common/views/widgets/slideshow.vue:
common/views/widgets/tips.vue: common/views/widgets/tips.vue:
tips-line1: "<kbd>t</kbd>でタイムラインにフォーカスできます" tips-line1: "<kbd>t</kbd>でタイムラインにフォーカスできます"
tips-line2: "<kbd>p</kbd>または<kbd>n</kbd>で投稿フォームを開きます" tips-line2: "<kbd>p</kbd>または<kbd>n</kbd>で投稿フォームを開きます"
tips-line3: "投稿フォームにはファイルをドラッグ&ドロップできます" tips-line3: "Vous pouvez glisser et déposer des fichiers sur la fenêtre de la note"
tips-line4: "投稿フォームにクリップボードにある画像データをペーストできます" tips-line4: "Vous pouvez coller des images à partir du presse-papier sur la fenêtre de la note"
tips-line5: "ドライブにファイルをドラッグ&ドロップしてアップロードできます" tips-line5: "ドライブにファイルをドラッグ&ドロップしてアップロードできます"
tips-line6: "ドライブでファイルをドラッグしてフォルダ移動できます" tips-line6: "ドライブでファイルをドラッグしてフォルダ移動できます"
tips-line7: "ドライブでフォルダをドラッグしてフォルダ移動できます" tips-line7: "ドライブでフォルダをドラッグしてフォルダ移動できます"
tips-line8: "Vous pouvez personnaliser l'Accueil via les paramètres" tips-line8: "Vous pouvez personnaliser l'Accueil via les paramètres"
tips-line9: "Misskey est sous licence AGPLv3" tips-line9: "Misskey est sous licence AGPLv3"
tips-line10: "タイムマシンウィジェットを利用すると、簡単に過去のタイムラインに遡れます" tips-line10: "タイムマシンウィジェットを利用すると、簡単に過去のタイムラインに遡れます"
tips-line11: "投稿の ... をクリックして、投稿をユーザーページにピン留めできます" tips-line11: "Vous pouvez épingler des notes sur votre page en appuyant sur \"…\""
tips-line13: "Tous les fichiers attachés à cette publication sont sauvegardés dans le Drive" tips-line13: "Tous les fichiers attachés à cette publication sont sauvegardés dans le Drive"
tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます" tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます"
tips-line17: "「**」でテキストを囲むと**強調表示**されます" tips-line17: "「**」でテキストを囲むと**強調表示**されます"
@ -388,6 +389,17 @@ common/views/pages/follow.vue:
follow: "Suivre" follow: "Suivre"
request-pending: "Demande d'abonnement en attente" request-pending: "Demande d'abonnement en attente"
follow-request: "Demande d'abonnement" follow-request: "Demande d'abonnement"
desktop:
banner-crop-title: "バナーとして表示する部分を選択"
banner: "バナー"
uploading-banner: "新しいバナーをアップロードしています"
banner-updated: "バナーを更新しました"
choose-banner: "バナーにする画像を選択"
avatar-crop-title: "アバターとして表示する部分を選択"
avatar: "アバター"
uploading-avatar: "新しいアバターをアップロードしています"
avatar-updated: "アバターを更新しました"
choose-avatar: "アバターにする画像を選択"
desktop/views/components/activity.chart.vue: desktop/views/components/activity.chart.vue:
total: "Noirs ... Total" total: "Noirs ... Total"
notes: "Bleu ... Notes" notes: "Bleu ... Notes"
@ -717,7 +729,7 @@ desktop/views/components/timeline.vue:
global: "Global" global: "Global"
list: "Listes" list: "Listes"
desktop/views/components/ui.header.vue: desktop/views/components/ui.header.vue:
welcome-back: "Vous êtes de retour !" welcome-back: "Content de vous revoir !"
desktop/views/components/ui.header.account.vue: desktop/views/components/ui.header.account.vue:
profile: "Votre profil" profile: "Votre profil"
drive: "Drive" drive: "Drive"
@ -746,6 +758,7 @@ desktop/views/components/received-follow-requests-window.vue:
desktop/views/components/user-lists-window.vue: desktop/views/components/user-lists-window.vue:
title: "Listes de l'utilisateur" title: "Listes de l'utilisateur"
create-list: "Créer une liste" create-list: "Créer une liste"
list-name: "リスト名"
desktop/views/components/user-preview.vue: desktop/views/components/user-preview.vue:
notes: "Publications" notes: "Publications"
following: "Abonné à" following: "Abonné à"
@ -828,6 +841,8 @@ desktop/views/pages/user/user.profile.vue:
mute: "Mettre en sourdine" mute: "Mettre en sourdine"
muted: "Muting" muted: "Muting"
unmute: "Enlever la sourdine" unmute: "Enlever la sourdine"
push-to-a-list: "リストに追加"
list-pushed: "{user}を{list}に追加しました。"
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
posts: "Notes" posts: "Notes"
following: "Suit" following: "Suit"
@ -986,7 +1001,7 @@ mobile/views/pages/drive.vue:
drive: "Drive" drive: "Drive"
more: "Afficher plus ..." more: "Afficher plus ..."
mobile/views/pages/signup.vue: mobile/views/pages/signup.vue:
lets-start: "📦 始めましょう" lets-start: "Commençons ! 📦"
mobile/views/pages/followers.vue: mobile/views/pages/followers.vue:
followers-of: "Abonné·e·s de {}" followers-of: "Abonné·e·s de {}"
mobile/views/pages/following.vue: mobile/views/pages/following.vue:
@ -1055,9 +1070,9 @@ mobile/views/pages/settings.vue:
i-am-under-limited-internet: "J'ai un accès Internet limité" i-am-under-limited-internet: "J'ai un accès Internet limité"
circle-icons: "Utiliser des icônes circulaires" circle-icons: "Utiliser des icônes circulaires"
timeline: "Fil d'actualité" timeline: "Fil d'actualité"
show-reply-target: "リプライ先を表示する" show-reply-target: "Afficher les réponses"
show-my-renotes: "Afficher mes republications" show-my-renotes: "Afficher mes republications"
show-renoted-my-notes: "Renoteされた自分の投稿を表示する" show-renoted-my-notes: "Afficher les notes que j'ai repartagé"
post-style: "Style de la publication" post-style: "Style de la publication"
post-style-standard: "Standard" post-style-standard: "Standard"
post-style-smart: "Intelligent" post-style-smart: "Intelligent"

View File

@ -11,6 +11,7 @@ common:
warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。" warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。"
application-authorization: "アプリの連携" application-authorization: "アプリの連携"
close: "閉じる" close: "閉じる"
got-it: "わかった"
customization-tips: customization-tips:
title: "カスタマイズのヒント" title: "カスタマイズのヒント"
paragraph1: "ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。" paragraph1: "ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。"
@ -39,12 +40,6 @@ common:
months_ago: "{}ヶ月前" months_ago: "{}ヶ月前"
years_ago: "{}年前" years_ago: "{}年前"
trash: "ゴミ箱" trash: "ゴミ箱"
date:
full-year: "年"
month: "月"
day: "日"
hours: "時"
minutes: "分"
weekday-short: weekday-short:
sunday: "日" sunday: "日"
monday: "月" monday: "月"
@ -88,6 +83,7 @@ common:
i-like-sushi: "私は(プリンよりむしろ)寿司が好き" i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示" show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
verified-user: "認証済みのユーザー" verified-user: "認証済みのユーザー"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
reversi: reversi:
drawn: "引き分け" drawn: "引き分け"
my-turn: "あなたのターンです" my-turn: "あなたのターンです"
@ -168,6 +164,9 @@ common/views/components/games/reversi/reversi.vue:
matching: matching:
waiting-for: "{}を待っています" waiting-for: "{}を待っています"
cancel: "キャンセル" cancel: "キャンセル"
common/views/components/games/reversi/reversi.game.vue:
surrender: "投了"
surrendered: "投了により"
common/views/components/games/reversi/reversi.index.vue: common/views/components/games/reversi/reversi.index.vue:
title: "Misskey Reversi" title: "Misskey Reversi"
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう" sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
@ -279,6 +278,8 @@ common/views/components/signin.vue:
token: "トークン" token: "トークン"
signing-in: "やってます..." signing-in: "やってます..."
signin: "サインイン" signin: "サインイン"
or: "または"
signin-with-twitter: "Twitterでログイン"
common/views/components/signup.vue: common/views/components/signup.vue:
username: "ユーザー名" username: "ユーザー名"
checking: "確認しています..." checking: "確認しています..."
@ -388,6 +389,17 @@ common/views/pages/follow.vue:
follow: "フォロー" follow: "フォロー"
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
follow-request: "フォロー申請" follow-request: "フォロー申請"
desktop:
banner-crop-title: "バナーとして表示する部分を選択"
banner: "バナー"
uploading-banner: "新しいバナーをアップロードしています"
banner-updated: "バナーを更新しました"
choose-banner: "バナーにする画像を選択"
avatar-crop-title: "アバターとして表示する部分を選択"
avatar: "アバター"
uploading-avatar: "新しいアバターをアップロードしています"
avatar-updated: "アバターを更新しました"
choose-avatar: "アバターにする画像を選択"
desktop/views/components/activity.chart.vue: desktop/views/components/activity.chart.vue:
total: "Black ... Total" total: "Black ... Total"
notes: "Blue ... Notes" notes: "Blue ... Notes"
@ -746,6 +758,7 @@ desktop/views/components/received-follow-requests-window.vue:
desktop/views/components/user-lists-window.vue: desktop/views/components/user-lists-window.vue:
title: "リスト" title: "リスト"
create-list: "リストを作成" create-list: "リストを作成"
list-name: "リスト名"
desktop/views/components/user-preview.vue: desktop/views/components/user-preview.vue:
notes: "投稿" notes: "投稿"
following: "フォロー" following: "フォロー"
@ -828,6 +841,8 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする" mute: "ミュートする"
muted: "ミュートしています" muted: "ミュートしています"
unmute: "ミュート解除" unmute: "ミュート解除"
push-to-a-list: "リストに追加"
list-pushed: "{user}を{list}に追加しました。"
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
posts: "投稿" posts: "投稿"
following: "フォロー" following: "フォロー"

View File

@ -11,6 +11,8 @@ common:
warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。" warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。"
application-authorization: "アプリの連携" application-authorization: "アプリの連携"
close: "閉じる" close: "閉じる"
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
got-it: "わかった"
customization-tips: customization-tips:
title: "カスタマイズのヒント" title: "カスタマイズのヒント"
paragraph1: "ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。" paragraph1: "ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。"
@ -26,7 +28,6 @@ common:
notified-by: "{}さんから" notified-by: "{}さんから"
reply-from: "{}さんから返信:" reply-from: "{}さんから返信:"
quoted-by: "{}さんが引用:" quoted-by: "{}さんが引用:"
name: "Misskey"
time: time:
unknown: "なぞのじかん" unknown: "なぞのじかん"
future: "未来" future: "未来"
@ -38,16 +39,10 @@ common:
weeks_ago: "{}週間前" weeks_ago: "{}週間前"
months_ago: "{}ヶ月前" months_ago: "{}ヶ月前"
years_ago: "{}年前" years_ago: "{}年前"
month-and-day: "{month}月 {day}日"
trash: "ゴミ箱" trash: "ゴミ箱"
date:
full-year: "年"
month: "月"
day: "日"
hours: "時"
minutes: "分"
weekday-short: weekday-short:
sunday: "日" sunday: "日"
monday: "月" monday: "月"
@ -95,6 +90,7 @@ common:
i-like-sushi: "私は(プリンよりむしろ)寿司が好き" i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示" show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
verified-user: "認証済みのユーザー" verified-user: "認証済みのユーザー"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
reversi: reversi:
drawn: "引き分け" drawn: "引き分け"
@ -182,6 +178,10 @@ common/views/components/games/reversi/reversi.vue:
waiting-for: "{}を待っています" waiting-for: "{}を待っています"
cancel: "キャンセル" cancel: "キャンセル"
common/views/components/games/reversi/reversi.game.vue:
surrender: "投了"
surrendered: "投了により"
common/views/components/games/reversi/reversi.index.vue: common/views/components/games/reversi/reversi.index.vue:
title: "Misskey Reversi" title: "Misskey Reversi"
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう" sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
@ -254,12 +254,14 @@ common/views/components/messaging-room.vue:
no-history: "これより過去の履歴はありません" no-history: "これより過去の履歴はありません"
resize-form: "ドラッグしてフォームの広さを調整" resize-form: "ドラッグしてフォームの広さを調整"
new-message: "新しいメッセージがあります" new-message: "新しいメッセージがあります"
only-one-file-attached: "メッセージに添付できるのはひとつのファイルのみです"
common/views/components/messaging-room.form.vue: common/views/components/messaging-room.form.vue:
input-message-here: "ここにメッセージを入力" input-message-here: "ここにメッセージを入力"
send: "送信" send: "送信"
attach-from-local: "PCからファイルを添付する" attach-from-local: "PCからファイルを添付する"
attach-from-drive: "ドライブからファイルを添付する" attach-from-drive: "ドライブからファイルを添付する"
only-one-file-attached: "メッセージに添付できるのはひとつのファイルのみです"
common/views/components/messaging-room.message.vue: common/views/components/messaging-room.message.vue:
is-read: "既読" is-read: "既読"
@ -306,6 +308,8 @@ common/views/components/signin.vue:
token: "トークン" token: "トークン"
signing-in: "やってます..." signing-in: "やってます..."
signin: "サインイン" signin: "サインイン"
or: "または"
signin-with-twitter: "Twitterでログイン"
common/views/components/signup.vue: common/views/components/signup.vue:
username: "ユーザー名" username: "ユーザー名"
@ -433,6 +437,18 @@ common/views/pages/follow.vue:
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
follow-request: "フォロー申請" follow-request: "フォロー申請"
desktop:
banner-crop-title: "バナーとして表示する部分を選択"
banner: "バナー"
uploading-banner: "新しいバナーをアップロードしています"
banner-updated: "バナーを更新しました"
choose-banner: "バナーにする画像を選択"
avatar-crop-title: "アバターとして表示する部分を選択"
avatar: "アバター"
uploading-avatar: "新しいアバターをアップロードしています"
avatar-updated: "アバターを更新しました"
choose-avatar: "アバターにする画像を選択"
desktop/views/components/activity.chart.vue: desktop/views/components/activity.chart.vue:
total: "Black ... Total" total: "Black ... Total"
notes: "Blue ... Notes" notes: "Blue ... Notes"
@ -592,6 +608,8 @@ desktop/views/components/notes.note.vue:
detail: "詳細" detail: "詳細"
private: "この投稿は非公開です" private: "この投稿は非公開です"
deleted: "この投稿は削除されました" deleted: "この投稿は削除されました"
hide: "隠す"
see-more: "もっと見る"
desktop/views/components/notes.vue: desktop/views/components/notes.vue:
error: "読み込みに失敗しました。" error: "読み込みに失敗しました。"
@ -630,6 +648,7 @@ desktop/views/components/post-form.vue:
geolocation-alert: "お使いの端末は位置情報に対応していません" geolocation-alert: "お使いの端末は位置情報に対応していません"
error: "エラー" error: "エラー"
enter-username: "ユーザー名を入力してください" enter-username: "ユーザー名を入力してください"
annotations: "内容への注釈 (オプション)"
desktop/views/components/post-form-window.vue: desktop/views/components/post-form-window.vue:
note: "新規投稿" note: "新規投稿"
@ -818,6 +837,7 @@ desktop/views/components/timeline.vue:
desktop/views/components/ui.header.vue: desktop/views/components/ui.header.vue:
welcome-back: "おかえりなさい、" welcome-back: "おかえりなさい、"
adjective: "さん"
desktop/views/components/ui.header.account.vue: desktop/views/components/ui.header.account.vue:
profile: "プロフィール" profile: "プロフィール"
@ -850,11 +870,10 @@ desktop/views/components/received-follow-requests-window.vue:
accept: "承認" accept: "承認"
reject: "拒否" reject: "拒否"
desktop/views/components/user-lists-window.vue: desktop/views/components/user-lists-window.vue:
title: "リスト" title: "リスト"
create-list: "リストを作成" create-list: "リストを作成"
list-name: "リスト名"
desktop/views/components/user-preview.vue: desktop/views/components/user-preview.vue:
notes: "投稿" notes: "投稿"
@ -959,6 +978,8 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする" mute: "ミュートする"
muted: "ミュートしています" muted: "ミュートしています"
unmute: "ミュート解除" unmute: "ミュート解除"
push-to-a-list: "リストに追加"
list-pushed: "{user}を{list}に追加しました。"
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
posts: "投稿" posts: "投稿"
@ -1114,6 +1135,7 @@ mobile/views/components/timeline.vue:
mobile/views/components/ui.header.vue: mobile/views/components/ui.header.vue:
welcome-back: "おかえりなさい、" welcome-back: "おかえりなさい、"
adjective: "さん"
mobile/views/components/ui.nav.vue: mobile/views/components/ui.nav.vue:
timeline: "タイムライン" timeline: "タイムライン"
@ -1175,6 +1197,8 @@ mobile/views/pages/welcome.vue:
mobile/views/pages/widgets.vue: mobile/views/pages/widgets.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
widgets-hints: "ウィジェットを追加/削除したり並べ替えたりできます。ウィジェットを移動するには「三」をドラッグします。ウィジェットを削除するには「x」をタップします。いくつかのウィジェットはタップすることで表示を変更できます。" widgets-hints: "ウィジェットを追加/削除したり並べ替えたりできます。ウィジェットを移動するには「三」をドラッグします。ウィジェットを削除するには「x」をタップします。いくつかのウィジェットはタップすることで表示を変更できます。"
add-widget: "追加"
customization-tips: "カスタマイズのヒント"
mobile/views/pages/widgets/activity.vue: mobile/views/pages/widgets/activity.vue:
activity: "アクティビティ" activity: "アクティビティ"
@ -1223,6 +1247,7 @@ mobile/views/pages/settings/settings.profile.vue:
mobile/views/pages/search.vue: mobile/views/pages/search.vue:
search: "検索" search: "検索"
empty: "「{}」に関する投稿は見つかりませんでした。" empty: "「{}」に関する投稿は見つかりませんでした。"
not-found: "「{}」に関する投稿は見つかりませんでした。"
mobile/views/pages/selectdrive.vue: mobile/views/pages/selectdrive.vue:
select-file: "ファイルを選択" select-file: "ファイルを選択"
@ -1327,3 +1352,7 @@ docs:
name: "名前" name: "名前"
type: "型" type: "型"
description: "説明" description: "説明"
dev/views/index.vue:
manage-apps: "アプリの管理"

View File

@ -1,128 +1,124 @@
--- ---
meta: meta:
lang: "日本語" lang: "한국어"
divider: "" divider: ""
common: common:
misskey: "A ⭐ of fediverse" misskey: "A ⭐ of fediverse"
about-title: "A ⭐ of fediverse." about-title: "A ⭐ of fediverse."
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。" about: "Misskey를 찾아 주셔서 감사합니다. Misskey은 지구에서 태어난 <b>분산 마이크로 블로그 SNS </b> 입니다. Fediverse (다양한 SNS로 구성되는 우주)에 존재하는 다른 SNS와 상호 연결되어 있습니다. 잠시 도시의 번잡함에서 벗어나 새로운 인터넷에 다이브 해 보지 않겠습니까."
adblock: adblock:
detected: "広告ブロッカーを無効にしてください" detected: "광고 차단기를 해제하십시오"
warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。" warning: "<strong>Misskey는 광고를 게재하지 않습니다</strong> 그러나 광고를 차단하는 기능 기능을 사용할 경우 일부 기능을 사용할 수 없게 될 가능성이나 결함이 발생하는 경우가 있습니다."
application-authorization: "アプリの連携" application-authorization: "앱의 연계"
close: "閉じる" close: "닫기"
got-it: "わかった"
customization-tips: customization-tips:
title: "カスタマイズのヒント" title: "사용자 정의 팁"
paragraph1: "ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。" paragraph1: "홈 정의는 위젯을 추가 / 삭제하거나 드래그 앤 드롭하여 정렬 할 수 있습니다."
paragraph2: "一部のウィジェットは、<strong><strong>右</strong>クリック</strong>することで表示を変更することができます。" paragraph2: "일부 위젯은 <strong>오른쪽 클릭</strong> 하여 모양을 변경할 수 있습니다."
paragraph3: "ウィジェットを削除するには、ヘッダーの<strong>「ゴミ箱」</strong>と書かれたエリアにウィジェットをドラッグ&ドロップします。" paragraph3: "위젯을 삭제하려면 헤더 <strong>\"휴지통\"</strong> 라고 쓰여진 영역으로 끌어다 놓습니다."
paragraph4: "カスタマイズを終了するには、右上の「完了」をクリックします。" paragraph4: "사용자 정의를 종료하려면 오른쪽 상단의 '완료' 를 클릭합니다."
gotit: "Got it!" gotit: "Got it!"
notification: notification:
file-uploaded: "ファイルがアップロードされました" file-uploaded: "파일이 업로드되었습니다"
message-from: "{}さんからメッセージ:" message-from: "{}씨로부터 메시지:"
reversi-invited: "対局への招待があります" reversi-invited: "대결에 초대되어 있습니다"
reversi-invited-by: "{}さんから" reversi-invited-by: "{}"
notified-by: "{}さんから" notified-by: "{}"
reply-from: "{}さんから返信:" reply-from: "{}님으로부터 답글:"
quoted-by: "{}さんが引用:" quoted-by: "{}씨가 인용:"
name: "Misskey" name: "Misskey"
time: time:
unknown: "なぞのじかん" unknown: "수수께끼의 시간"
future: "未来" future: "미래"
just_now: "たった今" just_now: "방금"
seconds_ago: "{}秒前" seconds_ago: "{}초전"
minutes_ago: "{}分前" minutes_ago: "{}분전"
hours_ago: "{}時間前" hours_ago: "{}시간전"
days_ago: "{}日前" days_ago: "{}일전"
weeks_ago: "{}週間前" weeks_ago: "{}주전"
months_ago: "{}ヶ月前" months_ago: "{}개월전"
years_ago: "{}年前" years_ago: "{}년전"
trash: "ゴミ箱" trash: "휴지통"
date:
full-year: "年"
month: "月"
day: "日"
hours: "時"
minutes: "分"
weekday-short: weekday-short:
sunday: "" sunday: ""
monday: "" monday: ""
tuesday: "" tuesday: ""
wednesday: "" wednesday: ""
thursday: "" thursday: ""
friday: "" friday: ""
saturday: "" saturday: ""
weekday: weekday:
sunday: "日曜日" sunday: "일요일"
monday: "月曜日" monday: "월요일"
tuesday: "火曜日" tuesday: "화요일"
wednesday: "水曜日" wednesday: "수요일"
thursday: "木曜日" thursday: "목요일"
friday: "金曜日" friday: "금요일"
saturday: "土曜日" saturday: "토요일"
reactions: reactions:
like: "いいね" like: "좋네"
love: "しゅき" love: "좋아"
laugh: "" laugh: "크크"
hmm: "ふぅ~む" hmm: "음..."
surprise: "わお" surprise: "와우"
congrats: "おめでとう" congrats: "받으세요"
angry: "おこ" angry: "화냈어"
confused: "こまこまのこまり" confused: "곤란하고 있어"
pudding: "Pudding" pudding: "Pudding"
note-placeholders: note-placeholders:
a: "今どうしてる?" a: "지금 어떻게하고있어?"
b: "何かありましたか?" b: "뭔가 있었습니까?"
c: "何をお考えですか?" c: "무엇을 생각하십니까?"
d: "言いたいことは?" d: "말하고 싶은 것은?"
e: "ここに書いてください" e: "여기에 써주십시오"
f: "あなたが書くのを待っています..." f: "당신이 쓸 것을 당신 기다리고 있습니다..."
search: "検索" search: "검색"
delete: "削除" delete: "삭제"
loading: "読み込み中" loading: "로드 중"
ok: "わかった" ok: "확인"
update-available-title: "更新があります" update-available-title: "갱신이 있습니다"
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。" update-available: "Misskey의 새로운 버전이 있습니다 ({newer} 현재 {current}을 사용 중). 페이지를 다시로드하면 업데이트가 적용됩니다."
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。" my-token-regenerated: "당신의 토큰이 업데이트되어 있기 때문에 로그 아웃합니다."
i-like-sushi: "私は(プリンよりむしろ)寿司が好き" i-like-sushi: "나는(푸딩보다 오히려)스시가 좋아"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示" show-reversi-board-labels: "리버시 보드의 행과 열 레이블을 표시"
verified-user: "認証済みのユーザー" verified-user: "인증 된 사용자"
disable-animated-mfm: "게시물의 문자 애니메이션을 비활성화 할"
reversi: reversi:
drawn: "引き分け" drawn: "무승부"
my-turn: "あなたのターンです" my-turn: "당신의 차례입니다"
opponent-turn: "相手のターンです" opponent-turn: "상대의 차례입니다"
turn-of: "{}のターンです" turn-of: "{}의 차례입니다"
past-turn-of: "{}のターン" past-turn-of: "{}"
won: "{}の勝ち" won: "{} 승리"
black: "" black: "검정"
white: "" white: "흰색"
total: "合計" total: "합계"
this-turn: "{}ターン目" this-turn: "{}턴눈"
widgets: widgets:
analog-clock: "アナログ時計" analog-clock: "아날로그 시계"
profile: "プロフィール" profile: "프로필"
calendar: "カレンダー" calendar: "달력"
timemachine: "カレンダー(タイムマシン)" timemachine: "달력(타임머신)"
activity: "アクティビティ" activity: "활동"
rss: "RSSリーダー" rss: "RSS 리더"
memo: "付箋" memo: "끈끈이"
trends: "トレンド" trends: "트렌드"
photo-stream: "フォトストリーム" photo-stream: "포토 스트림"
posts-monitor: "投稿チャート" posts-monitor: "게시물 차트"
slideshow: "スライドショー" slideshow: "슬라이드 쇼"
version: "バージョン" version: "버전"
broadcast: "ブロードキャスト" broadcast: "브로드 캐스트"
notifications: "通知" notifications: "통지"
users: "おすすめユーザー" users: "추천 사용자"
polls: "アンケート" polls: "설문"
post-form: "投稿フォーム" post-form: "게시 양식"
messaging: "メッセージ" messaging: "메시지"
server: "サーバー情報" server: "서버 정보"
donation: "寄付のお願い" donation: "기부 요청"
nav: "ナビゲーション" nav: "네비게이션"
tips: "ヒント" tips: ""
hashtags: "ハッシュタグ" hashtags: "해시 태그"
deck: deck:
widgets: "ウィジェット" widgets: "ウィジェット"
home: "ホーム" home: "ホーム"
@ -168,6 +164,9 @@ common/views/components/games/reversi/reversi.vue:
matching: matching:
waiting-for: "{}を待っています" waiting-for: "{}を待っています"
cancel: "キャンセル" cancel: "キャンセル"
common/views/components/games/reversi/reversi.game.vue:
surrender: "投了"
surrendered: "投了により"
common/views/components/games/reversi/reversi.index.vue: common/views/components/games/reversi/reversi.index.vue:
title: "Misskey Reversi" title: "Misskey Reversi"
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう" sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
@ -279,6 +278,8 @@ common/views/components/signin.vue:
token: "トークン" token: "トークン"
signing-in: "やってます..." signing-in: "やってます..."
signin: "サインイン" signin: "サインイン"
or: "または"
signin-with-twitter: "Twitterでログイン"
common/views/components/signup.vue: common/views/components/signup.vue:
username: "ユーザー名" username: "ユーザー名"
checking: "確認しています..." checking: "確認しています..."
@ -388,6 +389,17 @@ common/views/pages/follow.vue:
follow: "フォロー" follow: "フォロー"
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
follow-request: "フォロー申請" follow-request: "フォロー申請"
desktop:
banner-crop-title: "バナーとして表示する部分を選択"
banner: "バナー"
uploading-banner: "新しいバナーをアップロードしています"
banner-updated: "バナーを更新しました"
choose-banner: "バナーにする画像を選択"
avatar-crop-title: "アバターとして表示する部分を選択"
avatar: "アバター"
uploading-avatar: "新しいアバターをアップロードしています"
avatar-updated: "アバターを更新しました"
choose-avatar: "アバターにする画像を選択"
desktop/views/components/activity.chart.vue: desktop/views/components/activity.chart.vue:
total: "Black ... Total" total: "Black ... Total"
notes: "Blue ... Notes" notes: "Blue ... Notes"
@ -746,6 +758,7 @@ desktop/views/components/received-follow-requests-window.vue:
desktop/views/components/user-lists-window.vue: desktop/views/components/user-lists-window.vue:
title: "リスト" title: "リスト"
create-list: "リストを作成" create-list: "リストを作成"
list-name: "リスト名"
desktop/views/components/user-preview.vue: desktop/views/components/user-preview.vue:
notes: "投稿" notes: "投稿"
following: "フォロー" following: "フォロー"
@ -828,6 +841,8 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする" mute: "ミュートする"
muted: "ミュートしています" muted: "ミュートしています"
unmute: "ミュート解除" unmute: "ミュート解除"
push-to-a-list: "リストに追加"
list-pushed: "{user}を{list}に追加しました。"
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
posts: "投稿" posts: "投稿"
following: "フォロー" following: "フォロー"

View File

@ -11,12 +11,13 @@ common:
warning: "<strong>Misskey nie zawiera reklam</strong>, ale część funkcji może nie działać prawidłowo z włączonym blokowaniem reklam." warning: "<strong>Misskey nie zawiera reklam</strong>, ale część funkcji może nie działać prawidłowo z włączonym blokowaniem reklam."
application-authorization: "アプリの連携" application-authorization: "アプリの連携"
close: "Zamknij" close: "Zamknij"
got-it: "わかった"
customization-tips: customization-tips:
title: "Wskazówki o dostosowywaniu" title: "Wskazówki o dostosowywaniu"
paragraph1: "Dostosowywanie strony głównej pozwala na dodawanie, usuwanie, przeciąganie i zmienianie kolejności widżetów." paragraph1: "Dostosowywanie strony głównej pozwala na dodawanie, usuwanie, przeciąganie i zmienianie kolejności widżetów."
paragraph2: "一部のウィジェットは、<strong><strong>右</strong>クリック</strong>することで表示を変更することができます。" paragraph2: "一部のウィジェットは、<strong><strong>右</strong>クリック</strong>することで表示を変更することができます。"
paragraph3: "ウィジェットを削除するには、ヘッダーの<strong>「ゴミ箱」</strong>と書かれたエリアにウィジェットをドラッグ&ドロップします。" paragraph3: "Aby usunąć widżet, <strong>przeciągnij i upuść widżet do części nazwanej „Kosz”</strong> w nagłówku."
paragraph4: "カスタマイズを終了するには、右上の「完了」をクリックします。" paragraph4: "Aby zakończyć dostosowywanie, naciśnij „Zakończ” w w prawym górnym rogu."
gotit: "Rozumiem!" gotit: "Rozumiem!"
notification: notification:
file-uploaded: "Wysłano plik!" file-uploaded: "Wysłano plik!"
@ -39,12 +40,6 @@ common:
months_ago: "{} mies. temu" months_ago: "{} mies. temu"
years_ago: "{} lat temu" years_ago: "{} lat temu"
trash: "Kosz" trash: "Kosz"
date:
full-year: "Rok"
month: "Miesiąc"
day: "Dzień"
hours: "Godzina"
minutes: "Minuty"
weekday-short: weekday-short:
sunday: "N" sunday: "N"
monday: "Pn" monday: "Pn"
@ -88,6 +83,7 @@ common:
i-like-sushi: "Wolę sushi od puddingu" i-like-sushi: "Wolę sushi od puddingu"
show-reversi-board-labels: "Pokazuj podpisy wierszy i kolumn w Reversi" show-reversi-board-labels: "Pokazuj podpisy wierszy i kolumn w Reversi"
verified-user: "Zweryfikowany użytkownik" verified-user: "Zweryfikowany użytkownik"
disable-animated-mfm: "Wyłącz animowany tekst we wpisach"
reversi: reversi:
drawn: "Remis" drawn: "Remis"
my-turn: "Twoja kolej" my-turn: "Twoja kolej"
@ -141,55 +137,58 @@ common:
stack-left: "Przypnij do lewej" stack-left: "Przypnij do lewej"
pop-right: "Odepnij w prawo" pop-right: "Odepnij w prawo"
auth/views/form.vue: auth/views/form.vue:
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?" share-access: "Czy chcesz <b>zezwolić</b> <i>{{ app.name }}</i> na dostęp do Twojego konta?"
permission-ask: "このアプリは次の権限を要求しています:" permission-ask: "Ta aplikacja wymaga następujących uprawnień:"
account-read: "アカウントの情報を見る。" account-read: "Wyświetlanie informacji o koncie:"
account-write: "アカウントの情報を操作する。" account-write: "Modyfikowanie informacji o koncie:"
note-write: "投稿する。" note-write: "Publikacja."
like-write: "いいねしたりいいね解除する。" like-write: "Reagowanie na wpisy."
following-write: "フォローしたりフォロー解除する。" following-write: "Śledzenie i cofanie śledzenia."
drive-read: "ドライブを見る。" drive-read: "Odczytywanie Twojego dysku."
drive-write: "ドライブを操作する。" drive-write: "Wysyłanie i usuwanie plików na Twoim dysku."
notification-read: "通知を見る。" notification-read: "Odczytywanie Twoich powiadomień."
notification-write: "通知を操作する。" notification-write: "Zarządzanie Twoimi powiadomieniami."
cancel: "キャンセル" cancel: "Anuluj"
accept: "アクセスを許可" accept: "Przyznaj dostęp."
auth/views/index.vue: auth/views/index.vue:
loading: "読み込み中" loading: "Ładowanie"
denied: "アプリケーションの連携をキャンセルしました。" denied: "Odrzucono uwierzytelnianie aplikacji."
denied-paragraph: "このアプリがあなたのアカウントにアクセスすることはありません。" denied-paragraph: "Ta aplikacja nie uzyska dostępu do Twojego konta."
already-authorized: "このアプリは既に連携済みです" already-authorized: "Ta aplikacja została już uwierzytelniona."
allowed: "アプリケーションの連携を許可しました" allowed: "アプリケーションの連携を許可しました"
callback-url: "アプリケーションに戻っています" callback-url: "Powracam do aplikacji."
please-go-back: "アプリケーションに戻って、やっていってください。" please-go-back: "Wróć do aplikacji."
error: "セッションが存在しません。" error: "Sesja nie istnieje."
sign-in: "サインインしてください" sign-in: "Proszę zalogować się."
common/views/components/games/reversi/reversi.vue: common/views/components/games/reversi/reversi.vue:
matching: matching:
waiting-for: "{}を待っています" waiting-for: "Oczekiwanie na {}"
cancel: "キャンセル" cancel: "Anuluj"
common/views/components/games/reversi/reversi.game.vue:
surrender: "投了"
surrendered: "投了により"
common/views/components/games/reversi/reversi.index.vue: common/views/components/games/reversi/reversi.index.vue:
title: "Misskey Reversi" title: "Misskey Reversi"
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう" sub-title: "Zagraj w Reversi ze znajomymi!"
invite: "招待" invite: "Zaproś"
rule: "遊び方" rule: "Jak grać"
rule-desc: "リバーシは、相手と交互に石をボードに置いて、相手の石を挟んで自分の色に変えてゆき、最終的に残った石が多い方が勝ちというボードゲームです。" rule-desc: "リバーシは、相手と交互に石をボードに置いて、相手の石を挟んで自分の色に変えてゆき、最終的に残った石が多い方が勝ちというボードゲームです。"
mode-invite: "招待" mode-invite: "Zaproś"
mode-invite-desc: "指定したユーザーと対戦するモードです。" mode-invite-desc: "Zaproś użytkownika do gry."
invitations: "対局の招待があります!" invitations: "Otrzymałeś(-aś) zaproszenie!"
my-games: "自分の対局" my-games: "Moje gry"
all-games: "みんなの対局" all-games: "Wszystkie gry"
enter-username: "ユーザー名を入力してください" enter-username: "Wprowadź nazwę użytkownika"
game-state: game-state:
ended: "終了" ended: "Zakończono"
playing: "進行中" playing: "W trakcie"
common/views/components/games/reversi/reversi.room.vue: common/views/components/games/reversi/reversi.room.vue:
settings-of-the-game: "ゲームの設定" settings-of-the-game: "Ustawienia gry"
choose-map: "マップを選択" choose-map: "Wybierz mapę"
random: "ランダム" random: "Losowy"
black-or-white: "先手/後手" black-or-white: "Czarny/biały"
black-is: "{}が黒" black-is: "{}が黒"
rules: "ルール" rules: "Zasady"
is-llotheo: "石の少ない方が勝ち(ロセオ)" is-llotheo: "石の少ない方が勝ち(ロセオ)"
looped-map: "ループマップ" looped-map: "ループマップ"
can-put-everywhere: "どこでも置けるモード" can-put-everywhere: "どこでも置けるモード"
@ -279,6 +278,8 @@ common/views/components/signin.vue:
token: "Token" token: "Token"
signing-in: "Logowanie…" signing-in: "Logowanie…"
signin: "Zaloguj" signin: "Zaloguj"
or: "または"
signin-with-twitter: "Twitterでログイン"
common/views/components/signup.vue: common/views/components/signup.vue:
username: "Nazwa użytkownika" username: "Nazwa użytkownika"
checking: "Sprawdzanie…" checking: "Sprawdzanie…"
@ -362,23 +363,23 @@ common/views/widgets/slideshow.vue:
folder: "Naciśnij i wybierz folder" folder: "Naciśnij i wybierz folder"
no-image: "Brak obrazu w tym folderze" no-image: "Brak obrazu w tym folderze"
common/views/widgets/tips.vue: common/views/widgets/tips.vue:
tips-line1: "<kbd>t</kbd>でタイムラインにフォーカスできます" tips-line1: "Możesz przejść do osi czasu używając <kbd>t</kbd>."
tips-line2: "<kbd>p</kbd>または<kbd>n</kbd>で投稿フォームを開きます" tips-line2: "Otwórz formularz nowego wpisu używając <kbd>p</kbd> lub <kbd>n</kbd>."
tips-line3: "投稿フォームにはファイルをドラッグ&ドロップできます" tips-line3: "Możesz przeciągnąć i upuścić pliki w formularzu wpisu."
tips-line4: "投稿フォームにクリップボードにある画像データをペーストできます" tips-line4: "投稿フォームにクリップボードにある画像データをペーストできます"
tips-line5: "ドライブにファイルをドラッグ&ドロップしてアップロードできます" tips-line5: "Możesz wysłać pliki przeciągając i upuszczając je w Dysku."
tips-line6: "ドライブでファイルをドラッグしてフォルダ移動できます" tips-line6: "Możesz przenieść katalog przeciągając go w Dysku."
tips-line7: "ドライブでフォルダをドラッグしてフォルダ移動できます" tips-line7: "ドライブでフォルダをドラッグしてフォルダ移動できます"
tips-line8: "Strona główna może zostać dostosowana w ustawieniach." tips-line8: "Strona główna może zostać dostosowana w ustawieniach."
tips-line9: "Misskey jest dostępny na licencji AGPLv3." tips-line9: "Misskey jest dostępny na licencji AGPLv3."
tips-line10: "タイムマシンウィジェットを利用すると、簡単に過去のタイムラインに遡れます" tips-line10: "タイムマシンウィジェットを利用すると、簡単に過去のタイムラインに遡れます"
tips-line11: "投稿の ... をクリックして、投稿をユーザーページにピン留めできます" tips-line11: "Możesz przypiąć wpis na stronie użytkownika klikając na „…”"
tips-line13: "投稿に添付したファイルは全てドライブに保存されます" tips-line13: "投稿に添付したファイルは全てドライブに保存されます"
tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます" tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます"
tips-line17: "「**」でテキストを囲むと**強調表示**されます" tips-line17: "Oznaczenie tekstu **w ten sposób** wyróżni go."
tips-line19: "いくつかのウィンドウはブラウザの外に切り離すことができます" tips-line19: "Część okien może zostać odłączona z przeglądarki."
tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示しています" tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示しています"
tips-line21: "APIを利用してbotの開発なども行えます" tips-line21: "Możesz też używać API, aby tworzyć boty."
tips-line23: "まゆかわいいよまゆ" tips-line23: "まゆかわいいよまゆ"
tips-line24: "Misskey zaczął działać w 2014." tips-line24: "Misskey zaczął działać w 2014."
tips-line25: "Możesz otrzymywać powiadomienia nawet jeżeli Misskey nie jest otwarty w obsługiwanej przeglądarce." tips-line25: "Możesz otrzymywać powiadomienia nawet jeżeli Misskey nie jest otwarty w obsługiwanej przeglądarce."
@ -388,6 +389,17 @@ common/views/pages/follow.vue:
follow: "Śledź" follow: "Śledź"
request-pending: "Oczekiwanie na pozwolenie" request-pending: "Oczekiwanie na pozwolenie"
follow-request: "Poproś o śledzenie" follow-request: "Poproś o śledzenie"
desktop:
banner-crop-title: "バナーとして表示する部分を選択"
banner: "バナー"
uploading-banner: "新しいバナーをアップロードしています"
banner-updated: "バナーを更新しました"
choose-banner: "バナーにする画像を選択"
avatar-crop-title: "アバターとして表示する部分を選択"
avatar: "アバター"
uploading-avatar: "新しいアバターをアップロードしています"
avatar-updated: "アバターを更新しました"
choose-avatar: "アバターにする画像を選択"
desktop/views/components/activity.chart.vue: desktop/views/components/activity.chart.vue:
total: "Czarny … Łącznie" total: "Czarny … Łącznie"
notes: "Niebieski … Wpisy" notes: "Niebieski … Wpisy"
@ -746,6 +758,7 @@ desktop/views/components/received-follow-requests-window.vue:
desktop/views/components/user-lists-window.vue: desktop/views/components/user-lists-window.vue:
title: "Listy" title: "Listy"
create-list: "Utwórz listę" create-list: "Utwórz listę"
list-name: "リスト名"
desktop/views/components/user-preview.vue: desktop/views/components/user-preview.vue:
notes: "Wpisy" notes: "Wpisy"
following: "Śledzeni" following: "Śledzeni"
@ -828,6 +841,8 @@ desktop/views/pages/user/user.profile.vue:
mute: "Wycisz" mute: "Wycisz"
muted: "Wyciszyłeś" muted: "Wyciszyłeś"
unmute: "Cofnij wyciszenie" unmute: "Cofnij wyciszenie"
push-to-a-list: "リストに追加"
list-pushed: "{user}を{list}に追加しました。"
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
posts: "Wpisy" posts: "Wpisy"
following: "Śledzeni" following: "Śledzeni"

View File

@ -11,6 +11,7 @@ common:
warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。" warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。"
application-authorization: "アプリの連携" application-authorization: "アプリの連携"
close: "閉じる" close: "閉じる"
got-it: "わかった"
customization-tips: customization-tips:
title: "カスタマイズのヒント" title: "カスタマイズのヒント"
paragraph1: "ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。" paragraph1: "ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。"
@ -39,12 +40,6 @@ common:
months_ago: "{}ヶ月前" months_ago: "{}ヶ月前"
years_ago: "{}年前" years_ago: "{}年前"
trash: "ゴミ箱" trash: "ゴミ箱"
date:
full-year: "年"
month: "月"
day: "日"
hours: "時"
minutes: "分"
weekday-short: weekday-short:
sunday: "日" sunday: "日"
monday: "月" monday: "月"
@ -88,6 +83,7 @@ common:
i-like-sushi: "私は(プリンよりむしろ)寿司が好き" i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示" show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
verified-user: "認証済みのユーザー" verified-user: "認証済みのユーザー"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
reversi: reversi:
drawn: "引き分け" drawn: "引き分け"
my-turn: "あなたのターンです" my-turn: "あなたのターンです"
@ -168,6 +164,9 @@ common/views/components/games/reversi/reversi.vue:
matching: matching:
waiting-for: "{}を待っています" waiting-for: "{}を待っています"
cancel: "キャンセル" cancel: "キャンセル"
common/views/components/games/reversi/reversi.game.vue:
surrender: "投了"
surrendered: "投了により"
common/views/components/games/reversi/reversi.index.vue: common/views/components/games/reversi/reversi.index.vue:
title: "Misskey Reversi" title: "Misskey Reversi"
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう" sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
@ -279,6 +278,8 @@ common/views/components/signin.vue:
token: "トークン" token: "トークン"
signing-in: "やってます..." signing-in: "やってます..."
signin: "サインイン" signin: "サインイン"
or: "または"
signin-with-twitter: "Twitterでログイン"
common/views/components/signup.vue: common/views/components/signup.vue:
username: "ユーザー名" username: "ユーザー名"
checking: "確認しています..." checking: "確認しています..."
@ -388,6 +389,17 @@ common/views/pages/follow.vue:
follow: "フォロー" follow: "フォロー"
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
follow-request: "フォロー申請" follow-request: "フォロー申請"
desktop:
banner-crop-title: "バナーとして表示する部分を選択"
banner: "バナー"
uploading-banner: "新しいバナーをアップロードしています"
banner-updated: "バナーを更新しました"
choose-banner: "バナーにする画像を選択"
avatar-crop-title: "アバターとして表示する部分を選択"
avatar: "アバター"
uploading-avatar: "新しいアバターをアップロードしています"
avatar-updated: "アバターを更新しました"
choose-avatar: "アバターにする画像を選択"
desktop/views/components/activity.chart.vue: desktop/views/components/activity.chart.vue:
total: "Black ... Total" total: "Black ... Total"
notes: "Blue ... Notes" notes: "Blue ... Notes"
@ -746,6 +758,7 @@ desktop/views/components/received-follow-requests-window.vue:
desktop/views/components/user-lists-window.vue: desktop/views/components/user-lists-window.vue:
title: "リスト" title: "リスト"
create-list: "リストを作成" create-list: "リストを作成"
list-name: "リスト名"
desktop/views/components/user-preview.vue: desktop/views/components/user-preview.vue:
notes: "投稿" notes: "投稿"
following: "フォロー" following: "フォロー"
@ -828,6 +841,8 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする" mute: "ミュートする"
muted: "ミュートしています" muted: "ミュートしています"
unmute: "ミュート解除" unmute: "ミュート解除"
push-to-a-list: "リストに追加"
list-pushed: "{user}を{list}に追加しました。"
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
posts: "投稿" posts: "投稿"
following: "フォロー" following: "フォロー"

View File

@ -11,6 +11,7 @@ common:
warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。" warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。"
application-authorization: "アプリの連携" application-authorization: "アプリの連携"
close: "閉じる" close: "閉じる"
got-it: "わかった"
customization-tips: customization-tips:
title: "カスタマイズのヒント" title: "カスタマイズのヒント"
paragraph1: "ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。" paragraph1: "ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。"
@ -39,12 +40,6 @@ common:
months_ago: "{}ヶ月前" months_ago: "{}ヶ月前"
years_ago: "{}年前" years_ago: "{}年前"
trash: "ゴミ箱" trash: "ゴミ箱"
date:
full-year: "年"
month: "月"
day: "日"
hours: "時"
minutes: "分"
weekday-short: weekday-short:
sunday: "日" sunday: "日"
monday: "月" monday: "月"
@ -88,6 +83,7 @@ common:
i-like-sushi: "私は(プリンよりむしろ)寿司が好き" i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示" show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
verified-user: "認証済みのユーザー" verified-user: "認証済みのユーザー"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
reversi: reversi:
drawn: "引き分け" drawn: "引き分け"
my-turn: "あなたのターンです" my-turn: "あなたのターンです"
@ -168,6 +164,9 @@ common/views/components/games/reversi/reversi.vue:
matching: matching:
waiting-for: "{}を待っています" waiting-for: "{}を待っています"
cancel: "キャンセル" cancel: "キャンセル"
common/views/components/games/reversi/reversi.game.vue:
surrender: "投了"
surrendered: "投了により"
common/views/components/games/reversi/reversi.index.vue: common/views/components/games/reversi/reversi.index.vue:
title: "Misskey Reversi" title: "Misskey Reversi"
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう" sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
@ -279,6 +278,8 @@ common/views/components/signin.vue:
token: "トークン" token: "トークン"
signing-in: "やってます..." signing-in: "やってます..."
signin: "サインイン" signin: "サインイン"
or: "または"
signin-with-twitter: "Twitterでログイン"
common/views/components/signup.vue: common/views/components/signup.vue:
username: "ユーザー名" username: "ユーザー名"
checking: "確認しています..." checking: "確認しています..."
@ -388,6 +389,17 @@ common/views/pages/follow.vue:
follow: "フォロー" follow: "フォロー"
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
follow-request: "フォロー申請" follow-request: "フォロー申請"
desktop:
banner-crop-title: "バナーとして表示する部分を選択"
banner: "バナー"
uploading-banner: "新しいバナーをアップロードしています"
banner-updated: "バナーを更新しました"
choose-banner: "バナーにする画像を選択"
avatar-crop-title: "アバターとして表示する部分を選択"
avatar: "アバター"
uploading-avatar: "新しいアバターをアップロードしています"
avatar-updated: "アバターを更新しました"
choose-avatar: "アバターにする画像を選択"
desktop/views/components/activity.chart.vue: desktop/views/components/activity.chart.vue:
total: "Black ... Total" total: "Black ... Total"
notes: "Blue ... Notes" notes: "Blue ... Notes"
@ -746,6 +758,7 @@ desktop/views/components/received-follow-requests-window.vue:
desktop/views/components/user-lists-window.vue: desktop/views/components/user-lists-window.vue:
title: "リスト" title: "リスト"
create-list: "リストを作成" create-list: "リストを作成"
list-name: "リスト名"
desktop/views/components/user-preview.vue: desktop/views/components/user-preview.vue:
notes: "投稿" notes: "投稿"
following: "フォロー" following: "フォロー"
@ -828,6 +841,8 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする" mute: "ミュートする"
muted: "ミュートしています" muted: "ミュートしています"
unmute: "ミュート解除" unmute: "ミュート解除"
push-to-a-list: "リストに追加"
list-pushed: "{user}を{list}に追加しました。"
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
posts: "投稿" posts: "投稿"
following: "フォロー" following: "フォロー"

View File

@ -11,6 +11,7 @@ common:
warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。" warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。"
application-authorization: "アプリの連携" application-authorization: "アプリの連携"
close: "閉じる" close: "閉じる"
got-it: "わかった"
customization-tips: customization-tips:
title: "カスタマイズのヒント" title: "カスタマイズのヒント"
paragraph1: "ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。" paragraph1: "ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。"
@ -39,12 +40,6 @@ common:
months_ago: "{}ヶ月前" months_ago: "{}ヶ月前"
years_ago: "{}年前" years_ago: "{}年前"
trash: "ゴミ箱" trash: "ゴミ箱"
date:
full-year: "年"
month: "月"
day: "日"
hours: "時"
minutes: "分"
weekday-short: weekday-short:
sunday: "日" sunday: "日"
monday: "月" monday: "月"
@ -88,6 +83,7 @@ common:
i-like-sushi: "私は(プリンよりむしろ)寿司が好き" i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示" show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
verified-user: "認証済みのユーザー" verified-user: "認証済みのユーザー"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
reversi: reversi:
drawn: "引き分け" drawn: "引き分け"
my-turn: "あなたのターンです" my-turn: "あなたのターンです"
@ -168,6 +164,9 @@ common/views/components/games/reversi/reversi.vue:
matching: matching:
waiting-for: "{}を待っています" waiting-for: "{}を待っています"
cancel: "キャンセル" cancel: "キャンセル"
common/views/components/games/reversi/reversi.game.vue:
surrender: "投了"
surrendered: "投了により"
common/views/components/games/reversi/reversi.index.vue: common/views/components/games/reversi/reversi.index.vue:
title: "Misskey Reversi" title: "Misskey Reversi"
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう" sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
@ -279,6 +278,8 @@ common/views/components/signin.vue:
token: "トークン" token: "トークン"
signing-in: "やってます..." signing-in: "やってます..."
signin: "サインイン" signin: "サインイン"
or: "または"
signin-with-twitter: "Twitterでログイン"
common/views/components/signup.vue: common/views/components/signup.vue:
username: "ユーザー名" username: "ユーザー名"
checking: "確認しています..." checking: "確認しています..."
@ -388,6 +389,17 @@ common/views/pages/follow.vue:
follow: "フォロー" follow: "フォロー"
request-pending: "フォロー許可待ち" request-pending: "フォロー許可待ち"
follow-request: "フォロー申請" follow-request: "フォロー申請"
desktop:
banner-crop-title: "バナーとして表示する部分を選択"
banner: "バナー"
uploading-banner: "新しいバナーをアップロードしています"
banner-updated: "バナーを更新しました"
choose-banner: "バナーにする画像を選択"
avatar-crop-title: "アバターとして表示する部分を選択"
avatar: "アバター"
uploading-avatar: "新しいアバターをアップロードしています"
avatar-updated: "アバターを更新しました"
choose-avatar: "アバターにする画像を選択"
desktop/views/components/activity.chart.vue: desktop/views/components/activity.chart.vue:
total: "Black ... Total" total: "Black ... Total"
notes: "Blue ... Notes" notes: "Blue ... Notes"
@ -746,6 +758,7 @@ desktop/views/components/received-follow-requests-window.vue:
desktop/views/components/user-lists-window.vue: desktop/views/components/user-lists-window.vue:
title: "リスト" title: "リスト"
create-list: "リストを作成" create-list: "リストを作成"
list-name: "リスト名"
desktop/views/components/user-preview.vue: desktop/views/components/user-preview.vue:
notes: "投稿" notes: "投稿"
following: "フォロー" following: "フォロー"
@ -828,6 +841,8 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする" mute: "ミュートする"
muted: "ミュートしています" muted: "ミュートしています"
unmute: "ミュート解除" unmute: "ミュート解除"
push-to-a-list: "リストに追加"
list-pushed: "{user}を{list}に追加しました。"
desktop/views/pages/user/user.header.vue: desktop/views/pages/user/user.header.vue:
posts: "投稿" posts: "投稿"
following: "フォロー" following: "フォロー"

View File

@ -1,8 +1,8 @@
{ {
"name": "misskey", "name": "misskey",
"author": "syuilo <i@syuilo.com>", "author": "syuilo <i@syuilo.com>",
"version": "5.13.0", "version": "5.19.0",
"clientVersion": "1.0.7963", "clientVersion": "1.0.8052",
"codename": "nighthike", "codename": "nighthike",
"main": "./built/index.js", "main": "./built/index.js",
"private": true, "private": true,
@ -59,7 +59,7 @@
"@types/mocha": "5.2.3", "@types/mocha": "5.2.3",
"@types/mongodb": "3.1.3", "@types/mongodb": "3.1.3",
"@types/ms": "0.7.30", "@types/ms": "0.7.30",
"@types/node": "10.5.5", "@types/node": "10.5.7",
"@types/portscanner": "2.1.0", "@types/portscanner": "2.1.0",
"@types/pug": "2.0.4", "@types/pug": "2.0.4",
"@types/qrcode": "1.2.0", "@types/qrcode": "1.2.0",
@ -88,7 +88,7 @@
"bootstrap-vue": "2.0.0-rc.11", "bootstrap-vue": "2.0.0-rc.11",
"cafy": "11.3.0", "cafy": "11.3.0",
"chalk": "2.4.1", "chalk": "2.4.1",
"commander": "2.16.0", "commander": "2.17.1",
"crc-32": "1.2.0", "crc-32": "1.2.0",
"css-loader": "1.0.0", "css-loader": "1.0.0",
"dateformat": "3.0.3", "dateformat": "3.0.3",
@ -183,11 +183,12 @@
"showdown-highlightjs-extension": "0.1.2", "showdown-highlightjs-extension": "0.1.2",
"single-line-log": "1.1.2", "single-line-log": "1.1.2",
"speakeasy": "2.0.0", "speakeasy": "2.0.0",
"style-loader": "0.21.0", "stringz": "1.0.0",
"style-loader": "0.22.1",
"stylus": "0.54.5", "stylus": "0.54.5",
"stylus-loader": "3.0.2", "stylus-loader": "3.0.2",
"summaly": "2.0.6", "summaly": "2.0.6",
"systeminformation": "3.42.8", "systeminformation": "3.42.9",
"syuilo-password-strength": "0.0.1", "syuilo-password-strength": "0.0.1",
"textarea-caret": "3.1.0", "textarea-caret": "3.1.0",
"tmp": "0.0.33", "tmp": "0.0.33",
@ -195,7 +196,7 @@
"ts-node": "7.0.0", "ts-node": "7.0.0",
"tslint": "5.10.0", "tslint": "5.10.0",
"typescript": "2.9.2", "typescript": "2.9.2",
"typescript-eslint-parser": "17.0.1", "typescript-eslint-parser": "18.0.0",
"uglify-es": "3.3.9", "uglify-es": "3.3.9",
"url-loader": "1.0.1", "url-loader": "1.0.1",
"uuid": "3.3.2", "uuid": "3.3.2",
@ -204,7 +205,7 @@
"vue-cropperjs": "2.2.1", "vue-cropperjs": "2.2.1",
"vue-js-modal": "1.3.16", "vue-js-modal": "1.3.16",
"vue-json-tree-view": "2.1.4", "vue-json-tree-view": "2.1.4",
"vue-loader": "15.2.6", "vue-loader": "15.3.0",
"vue-router": "3.0.1", "vue-router": "3.0.1",
"vue-style-loader": "4.1.1", "vue-style-loader": "4.1.1",
"vue-template-compiler": "2.5.17", "vue-template-compiler": "2.5.17",
@ -213,7 +214,7 @@
"vuex-persistedstate": "2.5.4", "vuex-persistedstate": "2.5.4",
"web-push": "3.3.2", "web-push": "3.3.2",
"webfinger.js": "2.6.6", "webfinger.js": "2.6.6",
"webpack": "4.16.4", "webpack": "4.16.5",
"webpack-cli": "3.1.0", "webpack-cli": "3.1.0",
"websocket": "1.0.26", "websocket": "1.0.26",
"ws": "6.0.0", "ws": "6.0.0",

View File

@ -8,14 +8,14 @@ import VueRouter from 'vue-router';
import './style.styl'; import './style.styl';
import init from '../init'; import init from '../init';
import Index from './views/index.vue'; import Index from './views/index.vue';
import * as config from '../config';
/** /**
* init * init
*/ */
init(launch => { init(launch => {
document.title = '%i18n:common.name% | %i18n:common.application-authorization%'; document.title = `${config.name} | %i18n:common.application-authorization%`;
// Init router // Init router
const router = new VueRouter({ const router = new VueRouter({

View File

@ -38,7 +38,7 @@ export default function(type, data): Notification {
switch (data.type) { switch (data.type) {
case 'mention': case 'mention':
return { return {
title: '%i18n:common.notification.notified-by%'.split("{}")[0] + `${getUserName(data.user)}さんから:` + '%i18n:common.notification.notified-by%'.split("{}")[1], title: '%i18n:common.notification.notified-by%'.split("{}")[0] + `${getUserName(data.user)}:` + '%i18n:common.notification.notified-by%'.split("{}")[1],
body: getNoteSummary(data), body: getNoteSummary(data),
icon: data.user.avatarUrl icon: data.user.avatarUrl
}; };

View File

@ -1,13 +0,0 @@
export default date => {
if (typeof date == 'string') date = new Date(date);
return (
date.getFullYear() + '%i18n:common.date.full-year%' +
(date.getMonth() + 1) + '%i18n:common.date.month%' +
date.getDate() + '%i18n:common.date.day%' +
' ' +
date.getHours() + '%i18n:common.date.hours%' +
date.getMinutes() + '%i18n:common.date.minutes%' +
' ' +
`(${['日', '月', '火', '水', '木', '金', '土'][date.getDay()]})`
);
};

View File

@ -132,7 +132,7 @@ export default Vue.extend({
this.users = users; this.users = users;
this.fetching = false; this.fetching = false;
} else { } else {
(this as any).api('users/search_by_username', { (this as any).api('users/search', {
query: this.q, query: this.q,
limit: 30 limit: 30
}).then(users => { }).then(users => {

View File

@ -1,14 +1,18 @@
<template> <template>
<div class="xqnhankfuuilcwvhgsopeqncafzsquya"> <div class="xqnhankfuuilcwvhgsopeqncafzsquya">
<header><b>{{ blackUser | userName }}</b>(%i18n:common.reversi.black%) vs <b>{{ whiteUser | userName }}</b>(%i18n:common.reversi.white%)</header> <button class="go-index" v-if="selfNav" @click="goIndex">%fa:arrow-left%</button>
<header><b><router-link :to="blackUser | userPage">{{ blackUser | userName }}</router-link></b>(%i18n:common.reversi.black%) vs <b><router-link :to="whiteUser | userPage">{{ whiteUser | userName }}</router-link></b>(%i18n:common.reversi.white%)</header>
<div style="overflow: hidden"> <div style="overflow: hidden; line-height: 28px;">
<p class="turn" v-if="!iAmPlayer && !game.isEnded">{{ '%i18n:common.reversi.turn-of%'.replace('{}', $options.filters.userName(turnUser)) }}<mk-ellipsis/></p> <p class="turn" v-if="!iAmPlayer && !game.isEnded">{{ '%i18n:common.reversi.turn-of%'.replace('{}', $options.filters.userName(turnUser)) }}<mk-ellipsis/></p>
<p class="turn" v-if="logPos != logs.length">{{ '%i18n:common.reversi.past-turn-of%'.replace('{}', $options.filters.userName(turnUser)) }}</p> <p class="turn" v-if="logPos != logs.length">{{ '%i18n:common.reversi.past-turn-of%'.replace('{}', $options.filters.userName(turnUser)) }}</p>
<p class="turn1" v-if="iAmPlayer && !game.isEnded && !isMyTurn">%i18n:common.reversi.opponent-turn%<mk-ellipsis/></p> <p class="turn1" v-if="iAmPlayer && !game.isEnded && !isMyTurn">%i18n:common.reversi.opponent-turn%<mk-ellipsis/></p>
<p class="turn2" v-if="iAmPlayer && !game.isEnded && isMyTurn" v-animate-css="{ classes: 'tada', iteration: 'infinite' }">%i18n:common.reversi.my-turn%</p> <p class="turn2" v-if="iAmPlayer && !game.isEnded && isMyTurn" v-animate-css="{ classes: 'tada', iteration: 'infinite' }">%i18n:common.reversi.my-turn%</p>
<p class="result" v-if="game.isEnded && logPos == logs.length"> <p class="result" v-if="game.isEnded && logPos == logs.length">
<template v-if="game.winner">{{ '%i18n:common.reversi.won%'.replace('{}', $options.filters.userName(game.winner)) }}{{ game.settings.isLlotheo ? ' (ロセオ)' : '' }}</template> <template v-if="game.winner">
<span>{{ '%i18n:common.reversi.won%'.replace('{}', $options.filters.userName(game.winner)) }}</span>
<span v-if="game.surrendered != null"> (%i18n:@surrendered%)</span>
</template>
<template v-else>%i18n:common.reversi.drawn%</template> <template v-else>%i18n:common.reversi.drawn%</template>
</p> </p>
</div> </div>
@ -41,6 +45,10 @@
<p class="status"><b>{{ '%i18n:common.reversi.this-turn%'.split('{}')[0] }}{{ logPos }}{{ '%i18n:common.reversi.this-turn%'.split('{}')[1] }}</b> %i18n:common.reversi.black%:{{ o.blackCount }} %i18n:common.reversi.white%:{{ o.whiteCount }} %i18n:common.reversi.total%:{{ o.blackCount + o.whiteCount }}</p> <p class="status"><b>{{ '%i18n:common.reversi.this-turn%'.split('{}')[0] }}{{ logPos }}{{ '%i18n:common.reversi.this-turn%'.split('{}')[1] }}</b> %i18n:common.reversi.black%:{{ o.blackCount }} %i18n:common.reversi.white%:{{ o.whiteCount }} %i18n:common.reversi.total%:{{ o.blackCount + o.whiteCount }}</p>
<div class="actions" v-if="!game.isEnded && iAmPlayer">
<form-button @click="surrender">%i18n:@surrender%</form-button>
</div>
<div class="player" v-if="game.isEnded"> <div class="player" v-if="game.isEnded">
<el-button-group> <el-button-group>
<el-button type="primary" @click="logPos = 0" :disabled="logPos == 0">%fa:angle-double-left%</el-button> <el-button type="primary" @click="logPos = 0" :disabled="logPos == 0">%fa:angle-double-left%</el-button>
@ -62,7 +70,20 @@ import Reversi, { Color } from '../../../../../../../games/reversi/core';
import { url } from '../../../../../config'; import { url } from '../../../../../config';
export default Vue.extend({ export default Vue.extend({
props: ['initGame', 'connection'], props: {
initGame: {
type: Object,
require: true
},
connection: {
type: Object,
require: true
},
selfNav: {
type: Boolean,
require: true
}
},
data() { data() {
return { return {
@ -79,22 +100,27 @@ export default Vue.extend({
if (!this.$store.getters.isSignedIn) return false; if (!this.$store.getters.isSignedIn) return false;
return this.game.user1Id == this.$store.state.i.id || this.game.user2Id == this.$store.state.i.id; return this.game.user1Id == this.$store.state.i.id || this.game.user2Id == this.$store.state.i.id;
}, },
myColor(): Color { myColor(): Color {
if (!this.iAmPlayer) return null; if (!this.iAmPlayer) return null;
if (this.game.user1Id == this.$store.state.i.id && this.game.black == 1) return true; if (this.game.user1Id == this.$store.state.i.id && this.game.black == 1) return true;
if (this.game.user2Id == this.$store.state.i.id && this.game.black == 2) return true; if (this.game.user2Id == this.$store.state.i.id && this.game.black == 2) return true;
return false; return false;
}, },
opColor(): Color { opColor(): Color {
if (!this.iAmPlayer) return null; if (!this.iAmPlayer) return null;
return this.myColor === true ? false : true; return this.myColor === true ? false : true;
}, },
blackUser(): any { blackUser(): any {
return this.game.black == 1 ? this.game.user1 : this.game.user2; return this.game.black == 1 ? this.game.user1 : this.game.user2;
}, },
whiteUser(): any { whiteUser(): any {
return this.game.black == 1 ? this.game.user2 : this.game.user1; return this.game.black == 1 ? this.game.user2 : this.game.user1;
}, },
turnUser(): any { turnUser(): any {
if (this.o.turn === true) { if (this.o.turn === true) {
return this.game.black == 1 ? this.game.user1 : this.game.user2; return this.game.black == 1 ? this.game.user1 : this.game.user2;
@ -104,11 +130,13 @@ export default Vue.extend({
return null; return null;
} }
}, },
isMyTurn(): boolean { isMyTurn(): boolean {
if (!this.iAmPlayer) return false; if (!this.iAmPlayer) return false;
if (this.turnUser == null) return false; if (this.turnUser == null) return false;
return this.turnUser.id == this.$store.state.i.id; return this.turnUser.id == this.$store.state.i.id;
}, },
cellsStyle(): any { cellsStyle(): any {
return { return {
'grid-template-rows': `repeat(${this.game.settings.map.length}, 1fr)`, 'grid-template-rows': `repeat(${this.game.settings.map.length}, 1fr)`,
@ -165,11 +193,13 @@ export default Vue.extend({
mounted() { mounted() {
this.connection.on('set', this.onSet); this.connection.on('set', this.onSet);
this.connection.on('rescue', this.onRescue); this.connection.on('rescue', this.onRescue);
this.connection.on('ended', this.onEnded);
}, },
beforeDestroy() { beforeDestroy() {
this.connection.off('set', this.onSet); this.connection.off('set', this.onSet);
this.connection.off('rescue', this.onRescue); this.connection.off('rescue', this.onRescue);
this.connection.off('ended', this.onEnded);
clearInterval(this.pollingClock); clearInterval(this.pollingClock);
}, },
@ -215,6 +245,10 @@ export default Vue.extend({
} }
}, },
onEnded(x) {
this.game = x.game;
},
checkEnd() { checkEnd() {
this.game.isEnded = this.o.isEnded; this.game.isEnded = this.o.isEnded;
if (this.game.isEnded) { if (this.game.isEnded) {
@ -250,6 +284,16 @@ export default Vue.extend({
this.checkEnd(); this.checkEnd();
this.$forceUpdate(); this.$forceUpdate();
},
surrender() {
(this as any).api('games/reversi/games/surrender', {
gameId: this.game.id
});
},
goIndex() {
this.$emit('go-index');
} }
} }
}); });
@ -261,10 +305,21 @@ export default Vue.extend({
root(isDark) root(isDark)
text-align center text-align center
> .go-index
position absolute
top 0
left 0
z-index 1
width 42px
height 42px
> header > header
padding 8px padding 8px
border-bottom dashed 1px isDark ? #4c5761 : #c4cdd4 border-bottom dashed 1px isDark ? #4c5761 : #c4cdd4
a
color inherit
> .board > .board
width calc(100% - 16px) width calc(100% - 16px)
max-width 500px max-width 500px
@ -381,6 +436,9 @@ root(isDark)
margin 0 margin 0
padding 16px 0 padding 16px 0
> .actions
padding-bottom 16px
> .player > .player
padding-bottom 32px padding-bottom 32px

View File

@ -1,7 +1,7 @@
<template> <template>
<div> <div>
<x-room v-if="!g.isStarted" :game="g" :connection="connection"/> <x-room v-if="!g.isStarted" :game="g" :connection="connection"/>
<x-game v-else :init-game="g" :connection="connection"/> <x-game v-else :init-game="g" :connection="connection" :self-nav="selfNav" @go-index="goIndex"/>
</div> </div>
</template> </template>
@ -16,7 +16,16 @@ export default Vue.extend({
XGame, XGame,
XRoom XRoom
}, },
props: ['game'], props: {
game: {
type: Object,
required: true
},
selfNav: {
type: Boolean,
require: true
}
},
data() { data() {
return { return {
connection: null, connection: null,
@ -36,6 +45,9 @@ export default Vue.extend({
onStarted(game) { onStarted(game) {
Object.assign(this.g, game); Object.assign(this.g, game);
this.$forceUpdate(); this.$forceUpdate();
},
goIndex() {
this.$emit('go-index');
} }
} }
}); });

View File

@ -96,11 +96,7 @@ export default Vue.extend({
methods: { methods: {
go(game) { go(game) {
(this as any).api('games/reversi/games/show', { this.$emit('go', game);
gameId: game.id
}).then(game => {
this.$emit('go', game);
});
}, },
match() { match() {

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="vchtoekanapleubgzioubdtmlkribzfd"> <div class="vchtoekanapleubgzioubdtmlkribzfd">
<div v-if="game"> <div v-if="game">
<x-gameroom :game="game"/> <x-gameroom :game="game" :self-nav="selfNav" @go-index="goIndex"/>
</div> </div>
<div class="matching" v-else-if="matching"> <div class="matching" v-else-if="matching">
<h1>{{ '%i18n:@matching.waiting-for%'.split('{}')[0] }}<b>{{ matching | userName }}</b>{{ '%i18n:@matching.waiting-for%'.split('{}')[1] }}<mk-ellipsis/></h1> <h1>{{ '%i18n:@matching.waiting-for%'.split('{}')[0] }}<b>{{ matching | userName }}</b>{{ '%i18n:@matching.waiting-for%'.split('{}')[1] }}<mk-ellipsis/></h1>
@ -34,6 +34,11 @@ export default Vue.extend({
gameId: { gameId: {
type: String, type: String,
required: false required: false
},
selfNav: {
type: Boolean,
require: false,
default: true
} }
}, },
@ -48,6 +53,10 @@ export default Vue.extend({
}, },
watch: { watch: {
game() {
this.$emit('gamed', this.game);
},
gameId() { gameId() {
this.fetch(); this.fetch();
} }
@ -91,18 +100,24 @@ export default Vue.extend({
(this as any).api('games/reversi/games/show', { (this as any).api('games/reversi/games/show', {
gameId: this.gameId gameId: this.gameId
}).then(game => { }).then(game => {
this.nav(game, true); this.game = game;
Progress.done(); Progress.done();
}); });
} }
}, },
nav(game, silent) { async nav(game, actualNav = true) {
this.matching = null; if (this.selfNav) {
this.game = game; // 受け取ったゲーム情報が省略されたものなら完全な情報を取得する
if (game != null && (game.settings == null || game.settings.map == null)) {
game = await (this as any).api('games/reversi/games/show', {
gameId: game.id
});
}
if (!silent) { this.game = game;
this.$emit('nav', this.game); } else {
this.$emit('nav', game, actualNav);
} }
}, },
@ -121,7 +136,8 @@ export default Vue.extend({
}).then(game => { }).then(game => {
if (game) { if (game) {
this.matching = null; this.matching = null;
this.game = game;
this.nav(game);
} }
}); });
}, },
@ -129,6 +145,11 @@ export default Vue.extend({
onMatched(game) { onMatched(game) {
this.matching = null; this.matching = null;
this.game = game; this.game = game;
this.nav(game, false);
},
goIndex() {
this.nav(null);
} }
} }
}); });

View File

@ -83,7 +83,7 @@ export default Vue.extend({
} }
} else { } else {
if (items[0].kind == 'file') { if (items[0].kind == 'file') {
alert('メッセージに添付できるのはひとつのファイルのみです'); alert('%i18n:only-one-file-attached%');
} }
} }
}, },
@ -105,7 +105,7 @@ export default Vue.extend({
return; return;
} else if (e.dataTransfer.files.length > 1) { } else if (e.dataTransfer.files.length > 1) {
e.preventDefault(); e.preventDefault();
alert('メッセージに添付できるのはひとつのファイルのみです'); alert('%i18n:only-one-file-attached%');
return; return;
} }

View File

@ -61,7 +61,7 @@ export default Vue.extend({
const date = new Date(message.createdAt).getDate(); const date = new Date(message.createdAt).getDate();
const month = new Date(message.createdAt).getMonth() + 1; const month = new Date(message.createdAt).getMonth() + 1;
message._date = date; message._date = date;
message._datetext = `${month}${date}`; message._datetext = '%i18n:common.month-and-day%'.replace('{month}', month.toString()).replace('{day}', date.toString());
return message; return message;
}); });
}, },
@ -111,7 +111,7 @@ export default Vue.extend({
this.form.upload(e.dataTransfer.files[0]); this.form.upload(e.dataTransfer.files[0]);
return; return;
} else if (e.dataTransfer.files.length > 1) { } else if (e.dataTransfer.files.length > 1) {
alert('メッセージに添付できるのはひとつのファイルのみです'); alert('%i18n:@only-one-file-attached%');
return; return;
} }

View File

@ -1,5 +1,6 @@
import Vue from 'vue'; import Vue from 'vue';
import * as emojilib from 'emojilib'; import * as emojilib from 'emojilib';
import { length } from 'stringz';
import parse from '../../../../../mfm/parse'; import parse from '../../../../../mfm/parse';
import getAcct from '../../../../../misc/acct/render'; import getAcct from '../../../../../misc/acct/render';
import { url } from '../../../config'; import { url } from '../../../config';
@ -40,10 +41,13 @@ export default Vue.component('misskey-flavored-markdown', {
ast = this.ast; ast = this.ast;
} }
let bigCount = 0;
let motionCount = 0;
// Parse ast to DOM // Parse ast to DOM
const els = flatten(ast.map(token => { const els = flatten(ast.map(token => {
switch (token.type) { switch (token.type) {
case 'text': case 'text': {
const text = token.content.replace(/(\r\n|\n|\r)/g, '\n'); const text = token.content.replace(/(\r\n|\n|\r)/g, '\n');
if (this.shouldBreak) { if (this.shouldBreak) {
@ -54,30 +58,52 @@ export default Vue.component('misskey-flavored-markdown', {
} else { } else {
return createElement('span', text.replace(/\n/g, ' ')); return createElement('span', text.replace(/\n/g, ' '));
} }
}
case 'bold': case 'bold': {
return createElement('b', token.bold); return createElement('b', token.bold);
}
case 'big': case 'big': {
bigCount++;
const isLong = length(token.big) > 10;
const isMany = bigCount > 3;
return (createElement as any)('strong', { return (createElement as any)('strong', {
attrs: { attrs: {
style: 'display: inline-block; font-size: 200%;' style: `display: inline-block; font-size: ${ isMany ? '100%' : '150%' };`
}, },
directives: [{ directives: [this.$store.state.settings.disableAnimatedMfm || isLong || isMany ? {} : {
name: 'animate-css', name: 'animate-css',
value: { classes: 'tada', iteration: 'infinite' } value: { classes: 'tada', iteration: 'infinite' }
}] }]
}, token.big); }, token.big);
}
case 'url': case 'motion': {
motionCount++;
const isLong = length(token.motion) > 10;
const isMany = motionCount > 3;
return (createElement as any)('span', {
attrs: {
style: 'display: inline-block;'
},
directives: [this.$store.state.settings.disableAnimatedMfm || isLong || isMany ? {} : {
name: 'animate-css',
value: { classes: 'rubberBand', iteration: 'infinite' }
}]
}, token.motion);
}
case 'url': {
return createElement(MkUrl, { return createElement(MkUrl, {
props: { props: {
url: token.content, url: token.content,
target: '_blank' target: '_blank'
} }
}); });
}
case 'link': case 'link': {
return createElement('a', { return createElement('a', {
attrs: { attrs: {
class: 'link', class: 'link',
@ -86,8 +112,9 @@ export default Vue.component('misskey-flavored-markdown', {
title: token.url title: token.url
} }
}, token.title); }, token.title);
}
case 'mention': case 'mention': {
return (createElement as any)('a', { return (createElement as any)('a', {
attrs: { attrs: {
href: `${url}/@${getAcct(token)}`, href: `${url}/@${getAcct(token)}`,
@ -99,16 +126,18 @@ export default Vue.component('misskey-flavored-markdown', {
value: token.content value: token.content
}] }]
}, token.content); }, token.content);
}
case 'hashtag': case 'hashtag': {
return createElement('a', { return createElement('a', {
attrs: { attrs: {
href: `${url}/tags/${encodeURIComponent(token.hashtag)}`, href: `${url}/tags/${encodeURIComponent(token.hashtag)}`,
target: '_blank' target: '_blank'
} }
}, token.content); }, token.content);
}
case 'code': case 'code': {
return createElement('pre', { return createElement('pre', {
class: 'code' class: 'code'
}, [ }, [
@ -118,15 +147,17 @@ export default Vue.component('misskey-flavored-markdown', {
} }
}) })
]); ]);
}
case 'inline-code': case 'inline-code': {
return createElement('code', { return createElement('code', {
domProps: { domProps: {
innerHTML: token.html innerHTML: token.html
} }
}); });
}
case 'quote': case 'quote': {
const text2 = token.quote.replace(/(\r\n|\n|\r)/g, '\n'); const text2 = token.quote.replace(/(\r\n|\n|\r)/g, '\n');
if (this.shouldBreak) { if (this.shouldBreak) {
@ -145,27 +176,32 @@ export default Vue.component('misskey-flavored-markdown', {
} }
}, text2.replace(/\n/g, ' ')); }, text2.replace(/\n/g, ' '));
} }
}
case 'title': case 'title': {
return createElement('div', { return createElement('div', {
attrs: { attrs: {
class: 'title' class: 'title'
} }
}, token.title); }, token.title);
}
case 'emoji': case 'emoji': {
const emoji = emojilib.lib[token.emoji]; const emoji = emojilib.lib[token.emoji];
return createElement('span', emoji ? emoji.char : token.content); return createElement('span', emoji ? emoji.char : token.content);
}
case 'search': case 'search': {
return createElement(MkGoogle, { return createElement(MkGoogle, {
props: { props: {
q: token.query q: token.query
} }
}); });
}
default: default: {
console.log('unknown ast type:', token.type); console.log('unknown ast type:', token.type);
}
} }
})); }));

View File

@ -12,7 +12,7 @@
</ui-input> </ui-input>
<ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" required/> <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> <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> <p style="margin: 8px 0;">%i18n:@or%<a :href="`${apiUrl}/signin/twitter`">%i18n:@signin-with-twitter%</a></p>
</form> </form>
</template> </template>

View File

@ -45,6 +45,9 @@ root(isDark)
color isDark ? #fff : #606266 color isDark ? #fff : #606266
transition 0.1s transition 0.1s
*
pointer-events none
&:hover &:hover
&:focus &:focus
color $theme-color color $theme-color

View File

@ -2,6 +2,9 @@
<iframe v-if="youtubeId" type="text/html" height="250" <iframe v-if="youtubeId" type="text/html" height="250"
:src="`https://www.youtube.com/embed/${youtubeId}?origin=${misskeyUrl}`" :src="`https://www.youtube.com/embed/${youtubeId}?origin=${misskeyUrl}`"
frameborder="0"/> frameborder="0"/>
<iframe v-else-if="spotifyId"
:src="`https://open.spotify.com/embed/track/${spotifyId}`"
frameborder="0" allowtransparency="true" allow="encrypted-media" />
<div v-else-if="tweetUrl && detail" class="twitter"> <div v-else-if="tweetUrl && detail" class="twitter">
<blockquote ref="tweet" class="twitter-tweet" :data-theme="$store.state.device.darkmode ? 'dark' : null"> <blockquote ref="tweet" class="twitter-tweet" :data-theme="$store.state.device.darkmode ? 'dark' : null">
<a :href="url"></a> <a :href="url"></a>
@ -60,6 +63,8 @@ export default Vue.extend({
this.youtubeId = url.searchParams.get('v'); this.youtubeId = url.searchParams.get('v');
} else if (url.hostname == 'youtu.be') { } else if (url.hostname == 'youtu.be') {
this.youtubeId = url.pathname; this.youtubeId = url.pathname;
} else if (url.hostname == 'open.spotify.com') {
this.spotifyId = url.pathname.split('/').reverse().filter(x => x !== '')[0];
} else if (this.detail && url.hostname == 'twitter.com' && /^\/.+\/status(es)?\/\d+/.test(url.pathname)) { } else if (this.detail && url.hostname == 'twitter.com' && /^\/.+\/status(es)?\/\d+/.test(url.pathname)) {
this.tweetUrl = url; this.tweetUrl = url;
const twttr = (window as any).twttr || {}; const twttr = (window as any).twttr || {};

View File

@ -71,7 +71,6 @@ export default Vue.extend({
this.user = user; this.user = user;
this.fetching = false; this.fetching = false;
Progress.done(); Progress.done();
document.title = getUserName(this.user) + ' | %i18n:common.name%';
}); });
}, },

View File

@ -4,7 +4,7 @@
<div> <div>
<p>%fa:R hdd%Storage</p> <p>%fa:R hdd%Storage</p>
<p>Total: {{ total | bytes(1) }}</p> <p>Total: {{ total | bytes(1) }}</p>
<p>Available: {{ available | bytes(1) }}</p> <p>Free: {{ available | bytes(1) }}</p>
<p>Used: {{ used | bytes(1) }}</p> <p>Used: {{ used | bytes(1) }}</p>
</div> </div>
</div> </div>

View File

@ -8,7 +8,7 @@ export default (os: OS) => (cb, file = null) => {
const w = os.new(CropWindow, { const w = os.new(CropWindow, {
image: file, image: file,
title: 'アバターとして表示する部分を選択', title: '%i18n:desktop.avatar-crop-title%',
aspectRatio: 1 / 1 aspectRatio: 1 / 1
}); });
@ -18,11 +18,11 @@ export default (os: OS) => (cb, file = null) => {
data.append('file', blob, file.name + '.cropped.png'); data.append('file', blob, file.name + '.cropped.png');
os.api('drive/folders/find', { os.api('drive/folders/find', {
name: 'アイコン' name: '%i18n:desktop.avatar%'
}).then(iconFolder => { }).then(iconFolder => {
if (iconFolder.length === 0) { if (iconFolder.length === 0) {
os.api('drive/folders/create', { os.api('drive/folders/create', {
name: 'アイコン' name: '%i18n:desktop.avatar%'
}).then(iconFolder => { }).then(iconFolder => {
upload(data, iconFolder); upload(data, iconFolder);
}); });
@ -41,7 +41,7 @@ export default (os: OS) => (cb, file = null) => {
const upload = (data, folder) => { const upload = (data, folder) => {
const dialog = os.new(ProgressDialog, { const dialog = os.new(ProgressDialog, {
title: '新しいアバターをアップロードしています' title: '%i18n:desktop.uploading-avatar%'
}); });
document.body.appendChild(dialog.$el); document.body.appendChild(dialog.$el);
@ -76,10 +76,10 @@ export default (os: OS) => (cb, file = null) => {
}); });
os.apis.dialog({ os.apis.dialog({
title: '%fa:info-circle%アバターを更新しました', title: '%fa:info-circle% %i18n:desktop.avatar-updated%',
text: '新しいアバターが反映されるまで時間がかかる場合があります。', text: null,
actions: [{ actions: [{
text: 'わかった' text: '%i18n:common.got-it%'
}] }]
}); });
@ -92,7 +92,7 @@ export default (os: OS) => (cb, file = null) => {
} else { } else {
os.apis.chooseDriveFile({ os.apis.chooseDriveFile({
multiple: false, multiple: false,
title: '%fa:image%アバターにする画像を選択' title: '%fa:image% %i18n:desktop.choose-avatar%'
}).then(file => { }).then(file => {
fileSelected(file); fileSelected(file);
}); });

View File

@ -8,7 +8,7 @@ export default (os: OS) => {
const cropImage = file => new Promise((resolve, reject) => { const cropImage = file => new Promise((resolve, reject) => {
const w = os.new(CropWindow, { const w = os.new(CropWindow, {
image: file, image: file,
title: 'バナーとして表示する部分を選択', title: '%i18n:desktop.banner-crop-title%',
aspectRatio: 16 / 9 aspectRatio: 16 / 9
}); });
@ -18,11 +18,11 @@ export default (os: OS) => {
data.append('file', blob, file.name + '.cropped.png'); data.append('file', blob, file.name + '.cropped.png');
os.api('drive/folders/find', { os.api('drive/folders/find', {
name: 'バナー' name: '%i18n:desktop.banner%'
}).then(bannerFolder => { }).then(bannerFolder => {
if (bannerFolder.length === 0) { if (bannerFolder.length === 0) {
os.api('drive/folders/create', { os.api('drive/folders/create', {
name: 'バナー' name: '%i18n:desktop.banner%'
}).then(iconFolder => { }).then(iconFolder => {
resolve(upload(data, iconFolder)); resolve(upload(data, iconFolder));
}); });
@ -43,7 +43,7 @@ export default (os: OS) => {
const upload = (data, folder) => new Promise((resolve, reject) => { const upload = (data, folder) => new Promise((resolve, reject) => {
const dialog = os.new(ProgressDialog, { const dialog = os.new(ProgressDialog, {
title: '新しいバナーをアップロードしています' title: '%i18n:desktop.uploading-banner%'
}); });
document.body.appendChild(dialog.$el); document.body.appendChild(dialog.$el);
@ -79,10 +79,10 @@ export default (os: OS) => {
}); });
os.apis.dialog({ os.apis.dialog({
title: '%fa:info-circle%バナーを更新しました', title: '%fa:info-circle% %i18n:desktop.banner-updated%',
text: '新しいバナーが反映されるまで時間がかかる場合があります。', text: null,
actions: [{ actions: [{
text: 'わかった' text: '%i18n:common.got-it%'
}] }]
}); });
@ -95,7 +95,7 @@ export default (os: OS) => {
? Promise.resolve(file) ? Promise.resolve(file)
: os.apis.chooseDriveFile({ : os.apis.chooseDriveFile({
multiple: false, multiple: false,
title: '%fa:image%バナーにする画像を選択' title: '%fa:image% %i18n:desktop.choose-banner%'
}); });
return selectedFile return selectedFile

View File

@ -79,7 +79,6 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import dateStringify from '../../../common/scripts/date-stringify';
import parse from '../../../../../mfm/parse'; import parse from '../../../../../mfm/parse';
import MkPostFormWindow from './post-form-window.vue'; import MkPostFormWindow from './post-form-window.vue';
@ -129,7 +128,7 @@ export default Vue.extend({
: 0; : 0;
}, },
title(): string { title(): string {
return dateStringify(this.p.createdAt); return new Date(this.p.createdAt).toLocaleString();
}, },
urls(): string[] { urls(): string[] {
if (this.p.text) { if (this.p.text) {

View File

@ -12,7 +12,6 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import dateStringify from '../../../common/scripts/date-stringify';
export default Vue.extend({ export default Vue.extend({
props: { props: {
@ -28,7 +27,7 @@ export default Vue.extend({
}, },
computed: { computed: {
title(): string { title(): string {
return dateStringify(this.note.createdAt); return new Date(this.note.createdAt).toLocaleString();
} }
} }
}); });

View File

@ -12,13 +12,12 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import dateStringify from '../../../common/scripts/date-stringify';
export default Vue.extend({ export default Vue.extend({
props: ['note'], props: ['note'],
computed: { computed: {
title(): string { title(): string {
return dateStringify(this.note.createdAt); return new Date(this.note.createdAt).toLocaleString();
} }
} }
}); });

View File

@ -18,7 +18,7 @@
<div class="body"> <div class="body">
<p v-if="p.cw != null" class="cw"> <p v-if="p.cw != null" class="cw">
<span class="text" v-if="p.cw != ''">{{ p.cw }}</span> <span class="text" v-if="p.cw != ''">{{ p.cw }}</span>
<span class="toggle" @click="showContent = !showContent">{{ showContent ? '隠す' : 'もっと見る' }}</span> <span class="toggle" @click="showContent = !showContent">{{ showContent ? '%i18n:@hide%' : '%i18n:@see-more%' }}</span>
</p> </p>
<div class="content" v-show="p.cw == null || showContent"> <div class="content" v-show="p.cw == null || showContent">
<div class="text"> <div class="text">
@ -71,7 +71,6 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import dateStringify from '../../../common/scripts/date-stringify';
import parse from '../../../../../mfm/parse'; import parse from '../../../../../mfm/parse';
import MkPostFormWindow from './post-form-window.vue'; import MkPostFormWindow from './post-form-window.vue';
@ -128,7 +127,7 @@ export default Vue.extend({
}, },
title(): string { title(): string {
return dateStringify(this.p.createdAt); return new Date(this.p.createdAt).toLocaleString();
}, },
urls(): string[] { urls(): string[] {

View File

@ -33,7 +33,7 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import { url } from '../../../config'; import * as config from '../../../config';
import getNoteSummary from '../../../../../misc/get-note-summary'; import getNoteSummary from '../../../../../misc/get-note-summary';
import XNote from './notes.note.vue'; import XNote from './notes.note.vue';
@ -69,7 +69,7 @@ export default Vue.extend({
const date = new Date(note.createdAt).getDate(); const date = new Date(note.createdAt).getDate();
const month = new Date(note.createdAt).getMonth() + 1; const month = new Date(note.createdAt).getMonth() + 1;
note._date = date; note._date = date;
note._datetext = `${month}${date}`; note._datetext = '%i18n:common.month-and-day%'.replace('{month}', month.toString()).replace('{day}', date.toString());
return note; return note;
}); });
} }
@ -149,7 +149,7 @@ export default Vue.extend({
// サウンドを再生する // サウンドを再生する
if (this.$store.state.device.enableSounds && !silent) { if (this.$store.state.device.enableSounds && !silent) {
const sound = new Audio(`${url}/assets/post.mp3`); const sound = new Audio(`${config.url}/assets/post.mp3`);
sound.volume = this.$store.state.device.soundVolume; sound.volume = this.$store.state.device.soundVolume;
sound.play(); sound.play();
} }
@ -187,7 +187,7 @@ export default Vue.extend({
clearNotification() { clearNotification() {
this.unreadCount = 0; this.unreadCount = 0;
document.title = '%i18n:common.name%'; document.title = config.name;
}, },
onVisibilitychange() { onVisibilitychange() {

View File

@ -130,7 +130,7 @@ export default Vue.extend({
const date = new Date(notification.createdAt).getDate(); const date = new Date(notification.createdAt).getDate();
const month = new Date(notification.createdAt).getMonth() + 1; const month = new Date(notification.createdAt).getMonth() + 1;
notification._date = date; notification._date = date;
notification._datetext = `${month}${date}`; notification._datetext = '%i18n:common.month-and-day%'.replace('{month}', month.toString()).replace('{day}', date.toString());
return notification; return notification;
}); });
} }

View File

@ -14,7 +14,7 @@
<b>%i18n:@recent-tags%:</b> <b>%i18n:@recent-tags%:</b>
<a v-for="tag in recentHashtags.slice(0, 5)" @click="addTag(tag)" title="%@click-to-tagging%">#{{ tag }}</a> <a v-for="tag in recentHashtags.slice(0, 5)" @click="addTag(tag)" title="%@click-to-tagging%">#{{ tag }}</a>
</div> </div>
<input v-show="useCw" v-model="cw" placeholder="内容への注釈 (オプション)"> <input v-show="useCw" v-model="cw" placeholder="%i18n:@annotations%">
<textarea :class="{ with: (files.length != 0 || poll) }" <textarea :class="{ with: (files.length != 0 || poll) }"
ref="text" v-model="text" :disabled="posting" ref="text" v-model="text" :disabled="posting"
@keydown="onKeydown" @paste="onPaste" :placeholder="placeholder" @keydown="onKeydown" @paste="onPaste" :placeholder="placeholder"

View File

@ -55,6 +55,7 @@
<span>%i18n:@show-maps-desc%</span> <span>%i18n:@show-maps-desc%</span>
</mk-switch> </mk-switch>
<mk-switch v-model="$store.state.settings.reversiBoardLabels" @change="onChangeReversiBoardLabels" text="%i18n:common.show-reversi-board-labels%"/> <mk-switch v-model="$store.state.settings.reversiBoardLabels" @change="onChangeReversiBoardLabels" text="%i18n:common.show-reversi-board-labels%"/>
<mk-switch v-model="$store.state.settings.disableAnimatedMfm" @change="onChangeDisableAnimatedMfm" text="%i18n:common.disable-animated-mfm%"/>
</section> </section>
<section class="web" v-show="page == 'web'"> <section class="web" v-show="page == 'web'">
@ -376,6 +377,12 @@ export default Vue.extend({
value: v value: v
}); });
}, },
onChangeDisableAnimatedMfm(v) {
this.$store.dispatch('settings/set', {
key: 'disableAnimatedMfm',
value: v
});
},
onChangeGradientWindowHeader(v) { onChangeGradientWindowHeader(v) {
this.$store.dispatch('settings/set', { this.$store.dispatch('settings/set', {
key: 'gradientWindowHeader', key: 'gradientWindowHeader',

View File

@ -4,7 +4,7 @@
<div class="main" ref="main"> <div class="main" ref="main">
<div class="backdrop"></div> <div class="backdrop"></div>
<div class="main"> <div class="main">
<p ref="welcomeback" v-if="$store.getters.isSignedIn">%i18n:@welcome-back%<b>{{ $store.state.i | userName }}</b>さん</p> <p ref="welcomeback" v-if="$store.getters.isSignedIn">%i18n:@welcome-back%<b>{{ $store.state.i | userName }}</b>%i18n:@adjective%</p>
<div class="container" ref="mainContainer"> <div class="container" ref="mainContainer">
<div class="left"> <div class="left">
<x-nav/> <x-nav/>

View File

@ -27,7 +27,7 @@ export default Vue.extend({
methods: { methods: {
add() { add() {
(this as any).apis.input({ (this as any).apis.input({
title: 'リスト名', title: '%i18n:@list-name%',
}).then(async title => { }).then(async title => {
const list = await (this as any).api('users/lists/create', { const list = await (this as any).api('users/lists/create', {
title title

View File

@ -72,7 +72,7 @@ export default Vue.extend({
const date = new Date(note.createdAt).getDate(); const date = new Date(note.createdAt).getDate();
const month = new Date(note.createdAt).getMonth() + 1; const month = new Date(note.createdAt).getMonth() + 1;
note._date = date; note._date = date;
note._datetext = `${month}${date}`; note._datetext = '%i18n:common.month-and-day%'.replace('{month}', month.toString()).replace('{day}', date.toString());
return note; return note;
}); });
} }

View File

@ -51,7 +51,7 @@ export default Vue.extend({
const date = new Date(notification.createdAt).getDate(); const date = new Date(notification.createdAt).getDate();
const month = new Date(notification.createdAt).getMonth() + 1; const month = new Date(notification.createdAt).getMonth() + 1;
notification._date = date; notification._date = date;
notification._datetext = `${month}${date}`; notification._datetext = '%i18n:common.month-and-day%'.replace('{month}', month.toString()).replace('{day}', date.toString());
return notification; return notification;
}); });
} }

View File

@ -1,6 +1,6 @@
<template> <template>
<component :is="ui ? 'mk-ui' : 'div'"> <component :is="ui ? 'mk-ui' : 'div'">
<mk-reversi :game-id="$route.params.game" @nav="nav"/> <mk-reversi :game-id="$route.params.game" @nav="nav" :self-nav="false"/>
</component> </component>
</template> </template>
@ -14,9 +14,14 @@ export default Vue.extend({
} }
}, },
methods: { methods: {
nav(game) { nav(game, actualNav) {
history.pushState(null, null, '/reversi/' + game.id); if (actualNav) {
}, this.$router.push('/reversi/' + game.id);
} else {
// TODO: https://github.com/vuejs/vue-router/issues/703
this.$router.push('/reversi/' + game.id);
}
}
} }
}); });
</script> </script>

View File

@ -4,9 +4,11 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import * as config from '../../../config';
export default Vue.extend({ export default Vue.extend({
mounted() { mounted() {
document.title = '%i18n:common.name% - %i18n:@title%'; document.title = `${config.name} - %i18n:@title%`;
} }
}); });
</script> </script>

View File

@ -7,6 +7,7 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import Progress from '../../../common/scripts/loading'; import Progress from '../../../common/scripts/loading';
import * as config from '../../../config';
export default Vue.extend({ export default Vue.extend({
props: { props: {
@ -16,7 +17,7 @@ export default Vue.extend({
} }
}, },
mounted() { mounted() {
document.title = '%i18n:common.name%'; document.title = config.name;
Progress.start(); Progress.start();
}, },

View File

@ -1,6 +1,6 @@
<template> <template>
<div class="pptjhabgjtt7kwskbfv4y3uml6fpuhmr"> <div class="pptjhabgjtt7kwskbfv4y3uml6fpuhmr">
<h1>{{'%i18n:@share-with%'.split("{}")[0] + '%i18n:common.name%' + '%i18n:@share-with%'.split("{}")[1]}}</h1> <h1>{{ '%i18n:@share-with%'.replace('{}', name) }}</h1>
<div> <div>
<mk-signin v-if="!$store.getters.isSignedIn"/> <mk-signin v-if="!$store.getters.isSignedIn"/>
<mk-post-form v-else-if="!posted" :initial-text="text" :instant="true" @posted="posted = true"/> <mk-post-form v-else-if="!posted" :initial-text="text" :instant="true" @posted="posted = true"/>
@ -12,10 +12,12 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import * as config from '../../../config';
export default Vue.extend({ export default Vue.extend({
data() { data() {
return { return {
name: config.name,
posted: false, posted: false,
text: new URLSearchParams(location.search).get('text') text: new URLSearchParams(location.search).get('text')
}; };

View File

@ -13,7 +13,7 @@
<span v-if="user.isMuted">%fa:eye% %i18n:@unmute%</span> <span v-if="user.isMuted">%fa:eye% %i18n:@unmute%</span>
<span v-if="!user.isMuted">%fa:eye-slash% %i18n:@mute%</span> <span v-if="!user.isMuted">%fa:eye-slash% %i18n:@mute%</span>
</button> </button>
<button class="mute ui" @click="list">%fa:list% リストに追加</button> <button class="mute ui" @click="list">%fa:list% %i18n:@push-to-a-list%</button>
</div> </div>
</div> </div>
</template> </template>
@ -76,7 +76,7 @@ export default Vue.extend({
}); });
(this as any).apis.dialog({ (this as any).apis.dialog({
title: 'Done!', title: 'Done!',
text: `${this.user.name}${list.title}に追加しました。` text: '%i18n:@list-pushed%'.replace('{user}', this.user.name).replace('{list}', list.title)
}); });
}); });
} }

View File

@ -68,7 +68,6 @@ export default Vue.extend({
this.user = user; this.user = user;
this.fetching = false; this.fetching = false;
Progress.done(); Progress.done();
document.title = getUserName(this.user) + ' | %i18n:common.name%';
}); });
}, },

View File

@ -8,7 +8,7 @@
<div class="body" :style="{ backgroundImage: `url('${ welcomeBgUrl }')` }"> <div class="body" :style="{ backgroundImage: `url('${ welcomeBgUrl }')` }">
<div class="container"> <div class="container">
<div class="info"> <div class="info">
<span>%i18n:common.name% <b>{{ host }}</b></span> <span><b>{{ host }}</b></span>
<span class="stats" v-if="stats"> <span class="stats" v-if="stats">
<span>%fa:user% {{ stats.originalUsersCount | number }}</span> <span>%fa:user% {{ stats.originalUsersCount | number }}</span>
<span>%fa:pencil-alt% {{ stats.originalNotesCount | number }}</span> <span>%fa:pencil-alt% {{ stats.originalNotesCount | number }}</span>
@ -16,9 +16,9 @@
</div> </div>
<main> <main>
<div class="about"> <div class="about">
<h1 v-if="name">{{ name }}</h1> <h1 v-if="name != 'Misskey'">{{ name }}</h1>
<h1 v-else><img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" alt="%i18n:common.name%"></h1> <h1 v-else><img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" :alt="name"></h1>
<p class="powerd-by" v-if="name">%i18n:@powered-by-misskey%</p> <p class="powerd-by" v-if="name != 'Misskey'">%i18n:@powered-by-misskey%</p>
<p class="desc" v-html="description || '%i18n:common.about%'"></p> <p class="desc" v-html="description || '%i18n:common.about%'"></p>
<a ref="signup" @click="signup">📦 %i18n:@signup%</a> <a ref="signup" @click="signup">📦 %i18n:@signup%</a>
</div> </div>
@ -32,7 +32,7 @@
<mk-nav class="nav"/> <mk-nav class="nav"/>
</div> </div>
<mk-forkit class="forkit"/> <mk-forkit class="forkit"/>
<img src="assets/title.dark.svg" alt="%i18n:common.name%"> <img src="assets/title.dark.svg" :alt="name">
</div> </div>
<div class="tl"> <div class="tl">
<mk-welcome-timeline :max="20"/> <mk-welcome-timeline :max="20"/>

View File

@ -55,7 +55,7 @@ export default define({
}).then(data => { }).then(data => {
this.clear(); this.clear();
}).catch(err => { }).catch(err => {
alert('失敗した'); alert('Something happened');
}).then(() => { }).then(() => {
this.posting = false; this.posting = false;
}); });

View File

@ -1,6 +1,6 @@
<template> <template>
<mk-ui> <mk-ui>
<p v-if="fetching">読み込み中</p> <p v-if="fetching">%i18n:common.loading%</p>
<b-card v-if="!fetching" :header="app.name"> <b-card v-if="!fetching" :header="app.name">
<b-form-group label="App Secret"> <b-form-group label="App Secret">
<b-input :value="app.secret" readonly/> <b-input :value="app.secret" readonly/>

View File

@ -1,6 +1,6 @@
<template> <template>
<mk-ui> <mk-ui>
<b-button to="/apps" variant="primary">アプリの管理</b-button> <b-button to="/apps" variant="primary">%i18n:@manage-apps%</b-button>
</mk-ui> </mk-ui>
</template> </template>

View File

@ -1,7 +1,7 @@
<template> <template>
<div> <div>
<b-navbar toggleable="md" type="dark" variant="info"> <b-navbar toggleable="md" type="dark" variant="info">
<b-navbar-brand>%i18n:common.name% Developers</b-navbar-brand> <b-navbar-brand>Developers</b-navbar-brand>
<b-navbar-nav> <b-navbar-nav>
<b-nav-item to="/">Home</b-nav-item> <b-nav-item to="/">Home</b-nav-item>
<b-nav-item to="/apps">Apps</b-nav-item> <b-nav-item to="/apps">Apps</b-nav-item>

View File

@ -55,7 +55,7 @@ Vue.mixin({
console.info(`Misskey v${version} (${codename})`); console.info(`Misskey v${version} (${codename})`);
console.info( console.info(
'%cここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。', '%c%i18n:common.do-not-copy-paste%',
'color: red; background: yellow; font-size: 16px; font-weight: bold;'); 'color: red; background: yellow; font-size: 16px; font-weight: bold;');
// BootTimer解除 // BootTimer解除

View File

@ -38,6 +38,7 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import getNoteSummary from '../../../../../misc/get-note-summary'; import getNoteSummary from '../../../../../misc/get-note-summary';
import * as config from '../../../config';
const displayLimit = 30; const displayLimit = 30;
@ -66,7 +67,7 @@ export default Vue.extend({
const date = new Date(note.createdAt).getDate(); const date = new Date(note.createdAt).getDate();
const month = new Date(note.createdAt).getMonth() + 1; const month = new Date(note.createdAt).getMonth() + 1;
note._date = date; note._date = date;
note._datetext = `${month}${date}`; note._datetext = '%i18n:common.month-and-day%'.replace('{month}', month.toString()).replace('{day}', date.toString());
return note; return note;
}); });
} }
@ -183,7 +184,7 @@ export default Vue.extend({
clearNotification() { clearNotification() {
this.unreadCount = 0; this.unreadCount = 0;
document.title = '%i18n:common.name%'; document.title = config.name;
}, },
onVisibilitychange() { onVisibilitychange() {

View File

@ -42,7 +42,7 @@ export default Vue.extend({
const date = new Date(notification.createdAt).getDate(); const date = new Date(notification.createdAt).getDate();
const month = new Date(notification.createdAt).getMonth() + 1; const month = new Date(notification.createdAt).getMonth() + 1;
notification._date = date; notification._date = date;
notification._datetext = `${month}${date}`; notification._datetext = '%i18n:common.month-and-day%'.replace('{month}', month.toString()).replace('{day}', date.toString());
return notification; return notification;
}); });
} }

View File

@ -3,12 +3,12 @@
<mk-special-message/> <mk-special-message/>
<div class="main" ref="main"> <div class="main" ref="main">
<div class="backdrop"></div> <div class="backdrop"></div>
<p ref="welcomeback" v-if="$store.getters.isSignedIn">%i18n:@welcome-back%<b>{{ $store.state.i | userName }}</b>さん</p> <p ref="welcomeback" v-if="$store.getters.isSignedIn">%i18n:@welcome-back%<b>{{ $store.state.i | userName }}</b>%i18n:@adjective%</p>
<div class="content" ref="mainContainer"> <div class="content" ref="mainContainer">
<button class="nav" @click="$parent.isDrawerOpening = true">%fa:bars%</button> <button class="nav" @click="$parent.isDrawerOpening = true">%fa:bars%</button>
<template v-if="hasUnreadNotification || hasUnreadMessagingMessage || hasGameInvitation">%fa:circle%</template> <template v-if="hasUnreadNotification || hasUnreadMessagingMessage || hasGameInvitation">%fa:circle%</template>
<h1> <h1>
<slot>%i18n:common.name%</slot> <slot>config.name</slot>
</h1> </h1>
<slot name="func"></slot> <slot name="func"></slot>
</div> </div>
@ -20,11 +20,13 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import * as anime from 'animejs'; import * as anime from 'animejs';
import * as config from '../../../config';
export default Vue.extend({ export default Vue.extend({
props: ['func'], props: ['func'],
data() { data() {
return { return {
config,
hasGameInvitation: false, hasGameInvitation: false,
connection: null, connection: null,
connectionId: null connectionId: null

View File

@ -25,6 +25,7 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import Progress from '../../../common/scripts/loading'; import Progress from '../../../common/scripts/loading';
import * as config from '../../../config';
export default Vue.extend({ export default Vue.extend({
data() { data() {
@ -43,7 +44,7 @@ export default Vue.extend({
window.addEventListener('popstate', this.onPopState); window.addEventListener('popstate', this.onPopState);
}, },
mounted() { mounted() {
document.title = '%i18n:common.name% Drive'; document.title = `${config.name} Drive`;
document.documentElement.style.background = '#fff'; document.documentElement.style.background = '#fff';
}, },
beforeDestroy() { beforeDestroy() {
@ -63,7 +64,7 @@ export default Vue.extend({
(this.$refs as any).browser.openContextMenu(); (this.$refs as any).browser.openContextMenu();
}, },
onMoveRoot(silent) { onMoveRoot(silent) {
const title = '%i18n:common.name% Drive'; const title = `${config.name} Drive`;
if (!silent) { if (!silent) {
// Rewrite URL // Rewrite URL
@ -76,7 +77,7 @@ export default Vue.extend({
this.folder = null; this.folder = null;
}, },
onOpenFolder(folder, silent) { onOpenFolder(folder, silent) {
const title = folder.name + ' | %i18n:common.name% Drive'; const title = `${folder.name} | ${config.name} Drive`;
if (!silent) { if (!silent) {
// Rewrite URL // Rewrite URL
@ -89,7 +90,7 @@ export default Vue.extend({
this.folder = folder; this.folder = folder;
}, },
onOpenFile(file, silent) { onOpenFile(file, silent) {
const title = file.name + ' | %i18n:common.name% Drive'; const title = `${file.name} | ${config.name} Drive`;
if (!silent) { if (!silent) {
// Rewrite URL // Rewrite URL

View File

@ -14,6 +14,7 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import Progress from '../../../common/scripts/loading'; import Progress from '../../../common/scripts/loading';
import * as config from '../../../config';
export default Vue.extend({ export default Vue.extend({
data() { data() {
@ -28,7 +29,7 @@ export default Vue.extend({
this.fetch(); this.fetch();
}, },
mounted() { mounted() {
document.title = '%i18n:common.name% | %i18n:@notifications%'; document.title = `${config.name} | %i18n:@notifications%`;
}, },
methods: { methods: {
fetch() { fetch() {

View File

@ -21,6 +21,7 @@ import Vue from 'vue';
import Progress from '../../../common/scripts/loading'; import Progress from '../../../common/scripts/loading';
import parseAcct from '../../../../../misc/acct/parse'; import parseAcct from '../../../../../misc/acct/parse';
import getUserName from '../../../../../misc/get-user-name'; import getUserName from '../../../../../misc/get-user-name';
import * as config from '../../../config';
export default Vue.extend({ export default Vue.extend({
data() { data() {
@ -49,7 +50,7 @@ export default Vue.extend({
this.user = user; this.user = user;
this.fetching = false; this.fetching = false;
document.title = '%i18n:@followers-of%'.replace('{}', this.name) + ' | %i18n:common.name%'; document.title = '%i18n:@followers-of%'.replace('{}', this.name) + ' | ' + config.name;
}); });
}, },
onLoaded() { onLoaded() {

View File

@ -20,6 +20,7 @@
import Vue from 'vue'; import Vue from 'vue';
import Progress from '../../../common/scripts/loading'; import Progress from '../../../common/scripts/loading';
import parseAcct from '../../../../../misc/acct/parse'; import parseAcct from '../../../../../misc/acct/parse';
import * as config from '../../../config';
export default Vue.extend({ export default Vue.extend({
data() { data() {
@ -48,7 +49,7 @@ export default Vue.extend({
this.user = user; this.user = user;
this.fetching = false; this.fetching = false;
document.title = '%i18n:@followers-of%'.replace('{}', this.name) + ' | %i18n:common.name%'; document.title = '%i18n:@followers-of%'.replace('{}', this.name) + ' | ' + config.name;
}); });
}, },
onLoaded() { onLoaded() {

View File

@ -1,21 +1,27 @@
<template> <template>
<mk-ui> <mk-ui>
<span slot="header">%fa:gamepad%%i18n:@reversi%</span> <span slot="header">%fa:gamepad%%i18n:@reversi%</span>
<mk-reversi :game-id="$route.params.game" @nav="nav"/> <mk-reversi :game-id="$route.params.game" @nav="nav" :self-nav="false"/>
</mk-ui> </mk-ui>
</template> </template>
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import * as config from '../../../../config';
export default Vue.extend({ export default Vue.extend({
mounted() { mounted() {
document.title = '%i18n:common.name% %i18n:@reversi%'; document.title = `${config.name} %i18n:@reversi%`;
document.documentElement.style.background = '#fff'; document.documentElement.style.background = '#fff';
}, },
methods: { methods: {
nav(game) { nav(game, actualNav) {
history.pushState(null, null, '/reversi/' + game.id); if (actualNav) {
this.$router.push('/reversi/' + game.id);
} else {
// TODO: https://github.com/vuejs/vue-router/issues/703
this.$router.push('/reversi/' + game.id);
}
} }
} }
}); });

View File

@ -49,6 +49,7 @@
import Vue from 'vue'; import Vue from 'vue';
import Progress from '../../../common/scripts/loading'; import Progress from '../../../common/scripts/loading';
import XTl from './home.timeline.vue'; import XTl from './home.timeline.vue';
import * as config from '../../../config';
export default Vue.extend({ export default Vue.extend({
components: { components: {
@ -96,7 +97,7 @@ export default Vue.extend({
}, },
mounted() { mounted() {
document.title = '%i18n:common.name%'; document.title = config.name;
Progress.start(); Progress.start();

View File

@ -11,6 +11,7 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import parseAcct from '../../../../../misc/acct/parse'; import parseAcct from '../../../../../misc/acct/parse';
import * as config from '../../../config';
export default Vue.extend({ export default Vue.extend({
data() { data() {
@ -47,7 +48,7 @@ export default Vue.extend({
this.user = user; this.user = user;
this.fetching = false; this.fetching = false;
document.title = `%i18n:@messaging%: ${Vue.filter('userName')(this.user)} | %i18n:common.name%`; document.title = `%i18n:@messaging%: ${Vue.filter('userName')(this.user)} | ${config.name}`;
}); });
} }
} }

View File

@ -8,10 +8,11 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import getAcct from '../../../../../misc/acct/render'; import getAcct from '../../../../../misc/acct/render';
import * as config from '../../../config';
export default Vue.extend({ export default Vue.extend({
mounted() { mounted() {
document.title = '%i18n:common.name% %i18n:@messaging%'; document.title = `${config.name} %i18n:@messaging%`;
}, },
methods: { methods: {
navigate(user) { navigate(user) {

View File

@ -16,6 +16,7 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import Progress from '../../../common/scripts/loading'; import Progress from '../../../common/scripts/loading';
import * as config from '../../../config';
export default Vue.extend({ export default Vue.extend({
data() { data() {
@ -31,7 +32,7 @@ export default Vue.extend({
this.fetch(); this.fetch();
}, },
mounted() { mounted() {
document.title = '%i18n:common.name%'; document.title = config.name;
}, },
methods: { methods: {
fetch() { fetch() {

View File

@ -15,7 +15,7 @@ import Progress from '../../../common/scripts/loading';
export default Vue.extend({ export default Vue.extend({
mounted() { mounted() {
document.title = '%i18n:common.name% | %i18n:@notifications%'; document.title = '%i18n:@notifications%';
Progress.start(); Progress.start();
}, },

View File

@ -25,7 +25,7 @@ export default Vue.extend({
}; };
}, },
mounted() { mounted() {
document.title = '%i18n:common.name% | %i18n:@title%'; document.title = '%i18n:@title%';
Progress.start(); Progress.start();

View File

@ -3,7 +3,7 @@
<span slot="header">%fa:search% {{ q }}</span> <span slot="header">%fa:search% {{ q }}</span>
<main> <main>
<p v-if="!fetching && empty">%fa:search%{{ q }}に関する投稿は見つかりませんでした</p> <p :class="$style.empty" v-if="!fetching && empty">%fa:search% {{ '%i18n:not-found%'.split('{}')[0] }}{{ q }}{{ '%i18n:not-found%'.split('{}')[1] }}</p>
<mk-notes ref="timeline" :more="existMore ? more : null"/> <mk-notes ref="timeline" :more="existMore ? more : null"/>
</main> </main>
</mk-ui> </mk-ui>
@ -12,6 +12,7 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import Progress from '../../../common/scripts/loading'; import Progress from '../../../common/scripts/loading';
import * as config from '../../../config';
const limit = 20; const limit = 20;
@ -34,7 +35,7 @@ export default Vue.extend({
} }
}, },
mounted() { mounted() {
document.title = `%i18n:@search%: ${this.q} | %i18n:common.name%`; document.title = `%i18n:@search%: ${this.q} | ${config.name}`;
this.fetch(); this.fetch();
}, },

View File

@ -14,6 +14,7 @@
<ui-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons">%i18n:@circle-icons%</ui-switch> <ui-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons">%i18n:@circle-icons%</ui-switch>
<ui-switch v-model="$store.state.settings.iLikeSushi" @change="onChangeILikeSushi">%i18n:common.i-like-sushi%</ui-switch> <ui-switch v-model="$store.state.settings.iLikeSushi" @change="onChangeILikeSushi">%i18n:common.i-like-sushi%</ui-switch>
<ui-switch v-model="$store.state.settings.reversiBoardLabels" @change="onChangeReversiBoardLabels">%i18n:common.show-reversi-board-labels%</ui-switch> <ui-switch v-model="$store.state.settings.reversiBoardLabels" @change="onChangeReversiBoardLabels">%i18n:common.show-reversi-board-labels%</ui-switch>
<ui-switch v-model="$store.state.settings.disableAnimatedMfm" @change="onChangeDisableAnimatedMfm">%i18n:common.disable-animated-mfm%</ui-switch>
<div> <div>
<div>%i18n:@timeline%</div> <div>%i18n:@timeline%</div>
@ -142,7 +143,7 @@ export default Vue.extend({
}, },
mounted() { mounted() {
document.title = '%i18n:common.name% | %i18n:@settings%'; document.title = '%i18n:@settings%';
}, },
methods: { methods: {
@ -192,6 +193,13 @@ export default Vue.extend({
}); });
}, },
onChangeDisableAnimatedMfm(v) {
this.$store.dispatch('settings/set', {
key: 'disableAnimatedMfm',
value: v
});
},
onChangeShowReplyTarget(v) { onChangeShowReplyTarget(v) {
this.$store.dispatch('settings/set', { this.$store.dispatch('settings/set', {
key: 'showReplyTarget', key: 'showReplyTarget',

View File

@ -1,21 +1,23 @@
<template> <template>
<div class="azibmfpleajagva420swmu4c3r7ni7iw"> <div class="azibmfpleajagva420swmu4c3r7ni7iw">
<h1>{{'%i18n:@share-with%'.split("{}")[0] + '%i18n:common.name%' + '%i18n:@share-with%'.split("{}")[1]}}</h1> <h1>{{ '%i18n:@share-with%'.replace('{}', name) }}</h1>
<div> <div>
<mk-signin v-if="!$store.getters.isSignedIn"/> <mk-signin v-if="!$store.getters.isSignedIn"/>
<mk-post-form v-else-if="!posted" :initial-text="text" :instant="true" @posted="posted = true"/> <mk-post-form v-else-if="!posted" :initial-text="text" :instant="true" @posted="posted = true"/>
<p v-if="posted" class="posted">%fa:check%</p> <p v-if="posted" class="posted">%fa:check%</p>
</div> </div>
<ui-button class="close" v-if="posted" @click="close">閉じる</ui-button> <ui-button class="close" v-if="posted" @click="close">%i18n:common.close%</ui-button>
</div> </div>
</template> </template>
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import * as config from '../../../config';
export default Vue.extend({ export default Vue.extend({
data() { data() {
return { return {
name: config.name,
posted: false, posted: false,
text: new URLSearchParams(location.search).get('text') text: new URLSearchParams(location.search).get('text')
}; };

View File

@ -23,7 +23,7 @@ export default Vue.extend({
}; };
}, },
mounted() { mounted() {
document.title = '%i18n:common.name% | %i18n:@title%'; document.title = '%i18n:@title%';
Progress.start(); Progress.start();

View File

@ -67,6 +67,7 @@ import * as age from 's-age';
import parseAcct from '../../../../../misc/acct/parse'; import parseAcct from '../../../../../misc/acct/parse';
import Progress from '../../../common/scripts/loading'; import Progress from '../../../common/scripts/loading';
import XHome from './user/home.vue'; import XHome from './user/home.vue';
import * as config from '../../../config';
export default Vue.extend({ export default Vue.extend({
components: { components: {
@ -106,7 +107,7 @@ export default Vue.extend({
this.fetching = false; this.fetching = false;
Progress.done(); Progress.done();
document.title = Vue.filter('userName')(this.user) + ' | %i18n:common.name%'; document.title = Vue.filter('userName')(this.user) + ' | ' + config.name;
}); });
} }
} }

View File

@ -1,10 +1,10 @@
<template> <template>
<div class="welcome"> <div class="welcome">
<div> <div>
<img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" alt="%i18n:common.name%"> <img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" :alt="name">
<p class="host">{{ host }}</p> <p class="host">{{ host }}</p>
<div class="about"> <div class="about">
<h2>{{ name || 'unidentified' }}</h2> <h2>{{ name }}</h2>
<p v-html="description || '%i18n:common.about%'"></p> <p v-html="description || '%i18n:common.about%'"></p>
<router-link class="signup" to="/signup">%i18n:@signup%</router-link> <router-link class="signup" to="/signup">%i18n:@signup%</router-link>
</div> </div>

View File

@ -24,8 +24,8 @@
<option value="nav">%i18n:common.widgets.nav%</option> <option value="nav">%i18n:common.widgets.nav%</option>
<option value="tips">%i18n:common.widgets.tips%</option> <option value="tips">%i18n:common.widgets.tips%</option>
</select> </select>
<button @click="addWidget">追加</button> <button @click="addWidget">%i18n:add-widget%</button>
<p><a @click="hint">カスタマイズのヒント</a></p> <p><a @click="hint">%i18n:customization-tips%</a></p>
</header> </header>
<x-draggable <x-draggable
:list="widgets" :list="widgets"
@ -53,6 +53,7 @@
import Vue from 'vue'; import Vue from 'vue';
import * as XDraggable from 'vuedraggable'; import * as XDraggable from 'vuedraggable';
import * as uuid from 'uuid'; import * as uuid from 'uuid';
import * as config from '../../../config';
export default Vue.extend({ export default Vue.extend({
components: { components: {
@ -102,7 +103,7 @@ export default Vue.extend({
}, },
mounted() { mounted() {
document.title = '%i18n:common.name%'; document.title = config.name;
}, },
methods: { methods: {

View File

@ -47,6 +47,8 @@ export default function load() {
if (config.localDriveCapacityMb == null) config.localDriveCapacityMb = 256; if (config.localDriveCapacityMb == null) config.localDriveCapacityMb = 256;
if (config.remoteDriveCapacityMb == null) config.remoteDriveCapacityMb = 8; if (config.remoteDriveCapacityMb == null) config.remoteDriveCapacityMb = 8;
if (config.name == null) config.name = 'Misskey';
return Object.assign(config, mixin); return Object.assign(config, mixin);
} }

View File

@ -172,3 +172,6 @@ type: `textbox`
} }
``` ```
メッセージの種類: `success`, `info`, `warning`, `error` メッセージの種類: `success`, `info`, `warning`, `error`
## 投了する
投了をするには、<a href="./api/endpoints/games/reversi/games/surrender">このエンドポイント</a>にリクエストします。

View File

@ -4,6 +4,8 @@
Error.stackTraceLimit = Infinity; Error.stackTraceLimit = Infinity;
require('events').EventEmitter.defaultMaxListeners = 128;
import * as os from 'os'; import * as os from 'os';
import * as cluster from 'cluster'; import * as cluster from 'cluster';
import * as debug from 'debug'; import * as debug from 'debug';

View File

@ -1,5 +1,6 @@
const { lib: emojilib } = require('emojilib'); const { lib: emojilib } = require('emojilib');
const JSDOM = require('jsdom'); const jsdom = require('jsdom');
const { JSDOM } = jsdom;
import config from '../config'; import config from '../config';
import { INote } from '../models/note'; import { INote } from '../models/note';
import { TextElement } from './parse'; import { TextElement } from './parse';
@ -17,6 +18,12 @@ const handlers: { [key: string]: (window: any, token: any, mentionedRemoteUsers:
document.body.appendChild(b); document.body.appendChild(b);
}, },
motion({ document }, { big }) {
const b = document.createElement('strong');
b.textContent = big;
document.body.appendChild(b);
},
code({ document }, { code }) { code({ document }, { code }) {
const pre = document.createElement('pre'); const pre = document.createElement('pre');
const inner = document.createElement('code'); const inner = document.createElement('code');

View File

@ -1,5 +1,5 @@
/** /**
* Bold * Big
*/ */
export type TextElementBig = { export type TextElementBig = {

View File

@ -0,0 +1,20 @@
/**
* Motion
*/
export type TextElementMotion = {
type: 'motion'
content: string
motion: string
};
export default function(text: string) {
const match = text.match(/^\(\(\((.+?)\)\)\)/) || text.match(/^<motion>(.+?)<\/motion>/);
if (!match) return null;
const motion = match[0];
return {
type: 'motion',
content: motion,
motion: match[1]
} as TextElementMotion;
}

View File

@ -14,6 +14,7 @@ import { TextElementQuote } from './elements/quote';
import { TextElementSearch } from './elements/search'; import { TextElementSearch } from './elements/search';
import { TextElementTitle } from './elements/title'; import { TextElementTitle } from './elements/title';
import { TextElementUrl } from './elements/url'; import { TextElementUrl } from './elements/url';
import { TextElementMotion } from './elements/motion';
const elements = [ const elements = [
require('./elements/big'), require('./elements/big'),
@ -27,7 +28,8 @@ const elements = [
require('./elements/inline-code'), require('./elements/inline-code'),
require('./elements/quote'), require('./elements/quote'),
require('./elements/emoji'), require('./elements/emoji'),
require('./elements/search') require('./elements/search'),
require('./elements/motion')
].map(element => element.default as TextElementProcessor); ].map(element => element.default as TextElementProcessor);
export type TextElement = { type: 'text', content: string } export type TextElement = { type: 'text', content: string }
@ -42,7 +44,8 @@ export type TextElement = { type: 'text', content: string }
| TextElementQuote | TextElementQuote
| TextElementSearch | TextElementSearch
| TextElementTitle | TextElementTitle
| TextElementUrl; | TextElementUrl
| TextElementMotion;
export type TextElementProcessor = (text: string, i: number) => TextElement | TextElement[]; export type TextElementProcessor = (text: string, i: number) => TextElement | TextElement[];
export default (source: string): TextElement[] => { export default (source: string): TextElement[] => {

View File

@ -25,6 +25,7 @@ export interface IReversiGame {
isStarted: boolean; isStarted: boolean;
isEnded: boolean; isEnded: boolean;
winnerId: mongo.ObjectID; winnerId: mongo.ObjectID;
surrendered: mongo.ObjectID;
logs: Array<{ logs: Array<{
at: Date; at: Date;
color: boolean; color: boolean;

View File

@ -7,6 +7,11 @@ export default async (job: bq.Job, done: any): Promise<void> => {
await request(job.data.user, job.data.to, job.data.content); await request(job.data.user, job.data.to, job.data.content);
done(); done();
} catch (res) { } catch (res) {
if (!res.hasOwnProperty('statusCode')) {
console.warn(`deliver failed (unknown): ${res}`);
return done();
}
if (res.statusCode == null) return done(); if (res.statusCode == null) return done();
if (res.statusCode >= 400 && res.statusCode < 500) { if (res.statusCode >= 400 && res.statusCode < 500) {
// HTTPステータスコード4xxはクライアントエラーであり、それはつまり // HTTPステータスコード4xxはクライアントエラーであり、それはつまり

View File

@ -0,0 +1,59 @@
import $ from 'cafy'; import ID from '../../../../../../misc/cafy-id';
import ReversiGame, { pack } from '../../../../../../models/games/reversi/game';
import { ILocalUser } from '../../../../../../models/user';
import getParams from '../../../../get-params';
import { publishReversiGameStream } from '../../../../../../stream';
export const meta = {
desc: {
ja: '指定したリバーシの対局で投了します。'
},
requireCredential: true,
params: {
gameId: $.type(ID).note({
desc: {
ja: '投了したい対局'
}
})
}
};
export default (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
const [ps, psErr] = getParams(meta, params);
if (psErr) return rej(psErr);
const game = await ReversiGame.findOne({ _id: ps.gameId });
if (game == null) {
return rej('game not found');
}
if (game.isEnded) {
return rej('this game is already ended');
}
if (!game.user1Id.equals(user._id) && !game.user2Id.equals(user._id)) {
return rej('access denied');
}
const winnerId = game.user1Id.equals(user._id) ? game.user2Id : game.user1Id;
await ReversiGame.update({
_id: game._id
}, {
$set: {
surrendered: user._id,
isEnded: true,
winnerId: winnerId
}
});
publishReversiGameStream(game._id, 'ended', {
winnerId: winnerId,
game: await pack(game._id, user)
});
res();
});

View File

@ -1,33 +1,156 @@
import $ from 'cafy'; import $ from 'cafy';
import User, { pack, ILocalUser } from '../../../../models/user';
const escapeRegexp = require('escape-regexp'); const escapeRegexp = require('escape-regexp');
import User, { pack, ILocalUser, validateUsername, IUser } from '../../../../models/user';
import getParams from '../../get-params';
export const meta = {
desc: {
ja: 'ユーザーを検索します。'
},
requireCredential: false,
params: {
query: $.str.note({
desc: {
ja: 'クエリ'
}
}),
offset: $.num.optional.min(0).note({
default: 0,
desc: {
ja: 'オフセット'
}
}),
limit: $.num.optional.range(1, 100).note({
default: 10,
desc: {
ja: '取得する数'
}
}),
localOnly: $.bool.optional.note({
default: false,
desc: {
ja: 'ローカルユーザーのみ検索対象にするか否か'
}
}),
},
};
/** /**
* Search a user * Search a user
*/ */
export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => { export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
// Get 'query' parameter const [ps, psErr] = getParams(meta, params);
const [query, queryError] = $.str.pipe(x => x != '').get(params.query); if (psErr) return rej(psErr);
if (queryError) return rej('invalid query param');
// Get 'max' parameter const isUsername = validateUsername(ps.query.replace('@', ''));
const [max = 10, maxErr] = $.num.optional.range(1, 30).get(params.max);
if (maxErr) return rej('invalid max param');
const escapedQuery = escapeRegexp(query); let users: IUser[] = [];
// Search users if (isUsername) {
const users = await User users = await User
.find({ .find({
host: null, host: null,
$or: [{ usernameLower: new RegExp('^' + escapeRegexp(ps.query.replace('@', '').toLowerCase()))
usernameLower: new RegExp(escapedQuery.replace('@', '').toLowerCase())
}, { }, {
name: new RegExp(escapedQuery) limit: ps.limit,
}] skip: ps.offset
}, { });
limit: max
}); if (users.length < ps.limit && !ps.localOnly) {
const otherUsers = await User
.find({
host: { $ne: null },
usernameLower: new RegExp('^' + escapeRegexp(ps.query.replace('@', '').toLowerCase()))
}, {
limit: ps.limit - users.length
});
users = users.concat(otherUsers);
}
if (users.length < ps.limit) {
const otherUsers = await User
.find({
_id: { $nin: users.map(u => u._id) },
host: null,
usernameLower: new RegExp(escapeRegexp(ps.query.replace('@', '').toLowerCase()))
}, {
limit: ps.limit - users.length
});
users = users.concat(otherUsers);
}
if (users.length < ps.limit && !ps.localOnly) {
const otherUsers = await User
.find({
_id: { $nin: users.map(u => u._id) },
host: { $ne: null },
usernameLower: new RegExp(escapeRegexp(ps.query.replace('@', '').toLowerCase()))
}, {
limit: ps.limit - users.length
});
users = users.concat(otherUsers);
}
}
if (users.length < ps.limit) {
const otherUsers = await User
.find({
_id: { $nin: users.map(u => u._id) },
host: null,
name: new RegExp('^' + escapeRegexp(ps.query.toLowerCase()))
}, {
limit: ps.limit - users.length
});
users = users.concat(otherUsers);
}
if (users.length < ps.limit && !ps.localOnly) {
const otherUsers = await User
.find({
_id: { $nin: users.map(u => u._id) },
host: { $ne: null },
name: new RegExp('^' + escapeRegexp(ps.query.toLowerCase()))
}, {
limit: ps.limit - users.length
});
users = users.concat(otherUsers);
}
if (users.length < ps.limit) {
const otherUsers = await User
.find({
_id: { $nin: users.map(u => u._id) },
host: null,
name: new RegExp(escapeRegexp(ps.query.toLowerCase()))
}, {
limit: ps.limit - users.length
});
users = users.concat(otherUsers);
}
if (users.length < ps.limit && !ps.localOnly) {
const otherUsers = await User
.find({
_id: { $nin: users.map(u => u._id) },
host: { $ne: null },
name: new RegExp(escapeRegexp(ps.query.toLowerCase()))
}, {
limit: ps.limit - users.length
});
users = users.concat(otherUsers);
}
// Serialize // Serialize
res(await Promise.all(users.map(user => pack(user, me, { detail: true })))); res(await Promise.all(users.map(user => pack(user, me, { detail: true }))));

View File

@ -1,70 +0,0 @@
import $ from 'cafy';
import User, { pack, ILocalUser } from '../../../../models/user';
const escapeRegexp = require('escape-regexp');
/**
* Search a user by username
*/
export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
// Get 'query' parameter
const [query, queryError] = $.str.get(params.query);
if (queryError) return rej('invalid query param');
// Get 'offset' parameter
const [offset = 0, offsetErr] = $.num.optional.min(0).get(params.offset);
if (offsetErr) return rej('invalid offset param');
// Get 'limit' parameter
const [limit = 10, limitErr] = $.num.optional.range(1, 100).get(params.limit);
if (limitErr) return rej('invalid limit param');
let users = await User
.find({
host: null,
usernameLower: new RegExp('^' + escapeRegexp(query.toLowerCase()))
}, {
limit: limit,
skip: offset
});
if (users.length < limit) {
const otherUsers = await User
.find({
host: { $ne: null },
usernameLower: new RegExp('^' + escapeRegexp(query.toLowerCase()))
}, {
limit: limit - users.length
});
users = users.concat(otherUsers);
}
if (users.length < limit) {
const otherUsers = await User
.find({
_id: { $nin: users.map(u => u._id) },
host: null,
usernameLower: new RegExp(escapeRegexp(query.toLowerCase()))
}, {
limit: limit - users.length
});
users = users.concat(otherUsers);
}
if (users.length < limit) {
const otherUsers = await User
.find({
_id: { $nin: users.map(u => u._id) },
host: { $ne: null },
usernameLower: new RegExp(escapeRegexp(query.toLowerCase()))
}, {
limit: limit - users.length
});
users = users.concat(otherUsers);
}
// Serialize
res(await Promise.all(users.map(user => pack(user, me, { detail: true }))));
});

View File

@ -11,7 +11,7 @@ const handler = new EventEmitter();
let bot: IUser; let bot: IUser;
const post = async (text: string) => { const post = async (text: string, home = true) => {
if (bot == null) { if (bot == null) {
const account = await User.findOne({ const account = await User.findOne({
usernameLower: config.github_bot.username.toLowerCase() usernameLower: config.github_bot.username.toLowerCase()
@ -25,7 +25,7 @@ const post = async (text: string) => {
} }
} }
createNote(bot, { text, visibility: 'home' }); createNote(bot, { text, visibility: home ? 'home' : 'public' });
}; };
// Init router // Init router
@ -130,7 +130,7 @@ handler.on('issue_comment', event => {
handler.on('watch', event => { handler.on('watch', event => {
const sender = event.sender; const sender = event.sender;
post(`⭐️ Starred by **${sender.login}** ⭐️`); post(`(((⭐️))) Starred by **${sender.login}** (((⭐️)))`, false);
}); });
handler.on('fork', event => { handler.on('fork', event => {

View File

@ -103,6 +103,24 @@ export default async (user: IUser, data: Option, silent = false) => new Promise<
data.visibleUsers = data.visibleUsers.filter(x => x != null); data.visibleUsers = data.visibleUsers.filter(x => x != null);
} }
if (data.reply && data.reply.deletedAt != null) {
return rej();
}
if (data.renote && data.renote.deletedAt != null) {
return rej();
}
// リプライ先が自分以外の非公開の投稿なら禁止
if (data.reply && data.reply.visibility == 'private' && !data.reply.userId.equals(user._id)) {
return rej();
}
// Renote先が自分以外の非公開の投稿なら禁止
if (data.renote && data.renote.visibility == 'private' && !data.renote.userId.equals(user._id)) {
return rej();
}
if (data.text) { if (data.text) {
data.text = data.text.trim(); data.text = data.text.trim();
} }

View File

@ -34,11 +34,25 @@ describe('Text', () => {
it('big', () => { it('big', () => {
const tokens = analyze('***Strawberry*** Pasta'); const tokens = analyze('***Strawberry*** Pasta');
assert.deepEqual([ assert.deepEqual([
{ type: 'big', content: '***Strawberry***', bold: 'Strawberry' }, { type: 'big', content: '***Strawberry***', big: 'Strawberry' },
{ type: 'text', content: ' Pasta' } { type: 'text', content: ' Pasta' }
], tokens); ], tokens);
}); });
it('motion', () => {
const tokens1 = analyze('(((Strawberry))) Pasta');
assert.deepEqual([
{ type: 'motion', content: '(((Strawberry)))', motion: 'Strawberry' },
{ type: 'text', content: ' Pasta' }
], tokens1);
const tokens2 = analyze('<motion>Strawberry</motion> Pasta');
assert.deepEqual([
{ type: 'motion', content: '<motion>Strawberry</motion>', motion: 'Strawberry' },
{ type: 'text', content: ' Pasta' }
], tokens2);
});
it('mention', () => { it('mention', () => {
const tokens = analyze('@himawari お腹ペコい'); const tokens = analyze('@himawari お腹ペコい');
assert.deepEqual([ assert.deepEqual([