Merge branch 'master' into l10n_master

This commit is contained in:
syuilo 2018-08-02 07:38:44 +09:00 committed by GitHub
commit 7f08d84989
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
22 changed files with 247 additions and 115 deletions

View file

@ -917,6 +917,19 @@ mobile/views/pages/signup.vue:
lets-start: "Let's start! 📦" lets-start: "Let's start! 📦"
mobile/views/pages/followers.vue: mobile/views/pages/followers.vue:
followers-of: "Followers of {}" followers-of: "Followers of {}"
mobile/views/pages/signup.vue:
lets-start: "Let's start! 📦"
mobile/views/pages/tag.vue:
no-posts-found-japanese: ""
no-posts-found-english: "No posts were found for "
left-quote: "\""
right-quote: "\"."
mobile/views/pages/welcome.vue:
signup: "Sign up."
mobile/views/pages/widgets.vue:
dashboard: "Dashboard"
mobile/views/pages/widgets/activity.vue:
activity: "Activity"
mobile/views/pages/following.vue: mobile/views/pages/following.vue:
following-of: "Following of {}" following-of: "Following of {}"
mobile/views/pages/home.vue: mobile/views/pages/home.vue:

View file

@ -6,7 +6,6 @@ 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と相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
customization-tips: customization-tips:
title: "カスタマイズのヒント" title: "カスタマイズのヒント"
paragraph1: "ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。" paragraph1: "ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。"
@ -14,7 +13,7 @@ common:
paragraph3: "ウィジェットを削除するには、ヘッダーの<strong>「ゴミ箱」</strong>と書かれたエリアにウィジェットをドラッグ&ドロップします。" paragraph3: "ウィジェットを削除するには、ヘッダーの<strong>「ゴミ箱」</strong>と書かれたエリアにウィジェットをドラッグ&ドロップします。"
paragraph4: "カスタマイズを終了するには、右上の「完了」をクリックします。" paragraph4: "カスタマイズを終了するには、右上の「完了」をクリックします。"
gotit: "Got it!" gotit: "Got it!"
name: "Misskey"
time: time:
unknown: "なぞのじかん" unknown: "なぞのじかん"
future: "未来" future: "未来"
@ -38,6 +37,15 @@ common:
friday: "金" friday: "金"
saturday: "土" saturday: "土"
weekday:
sunday: "日曜日"
monday: "月曜日"
tuesday: "火曜日"
wednesday: "水曜日"
thursday: "木曜日"
friday: "金曜日"
saturday: "土曜日"
reactions: reactions:
like: "いいね" like: "いいね"
love: "しゅき" love: "しゅき"
@ -75,6 +83,10 @@ common:
turn-of: "{}のターンです" turn-of: "{}のターンです"
past-turn-of: "{}のターン" past-turn-of: "{}のターン"
won: "{}の勝ち" won: "{}の勝ち"
black: "黒"
white: "白"
total: "合計"
this-turn: "{}ターン目"
widgets: widgets:
analog-clock: "アナログ時計" analog-clock: "アナログ時計"
@ -119,6 +131,44 @@ common:
stack-left: "左に重ねる" stack-left: "左に重ねる"
pop-right: "右に出す" pop-right: "右に出す"
common/views/components/games/reversi/reversi.vue:
title: "Misskey Reversi"
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
invite: "招待"
rule: "遊び方"
rule-desc: "リバーシは、相手と交互に石をボードに置いて、相手の石を挟んで自分の色に変えてゆき、最終的に残った石が多い方が勝ちというボードゲームです。"
mode-invite: "招待"
mode-invite-desc: "指定したユーザーと対戦するモードです。"
invitations: "対局の招待があります!"
my-games: "自分の対局"
all-games: "みんなの対局"
enter-username: "ユーザー名を入力してください"
game-state:
ended: "終了"
playing: "進行中"
matching:
waiting-for: "{}を待っています"
cacnel: "キャンセル"
common/views/components/games/reversi/reversi.room.vue:
settings-of-the-game: "ゲームの設定"
choose-map: "マップを選択"
random: "ランダム"
black-or-white: "先手/後手"
black-is: "{}が黒"
rules: "ルール"
is-llotheo: "石の少ない方が勝ち(ロセオ)"
looped-map: "ループマップ"
can-put-everywhere: "どこでも置けるモード"
settings-of-the-bot: "Botの設定"
this-gane-is-started-soon: "ゲームは数秒後に開始されます"
waiting-for-other: "相手の準備が完了するのを待っています"
waiting-for-me: "あなたの準備が完了するのを待っています"
waiting-for-both: "準備中"
cancel: "キャンセル"
ready: "準備完了"
cancel-ready: "準備続行"
common/views/components/connect-failed.vue: common/views/components/connect-failed.vue:
title: "サーバーに接続できません" title: "サーバーに接続できません"
description: "インターネット回線に問題があるか、サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから{再度お試し}ください。" description: "インターネット回線に問題があるか、サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから{再度お試し}ください。"
@ -267,6 +317,19 @@ common/views/widgets/broadcast.vue:
have-a-nice-day: "良い一日を!" have-a-nice-day: "良い一日を!"
next: "次" next: "次"
common/views/widgets/calendar.vue:
year-english: ""
year-japanese: "年"
month-english: ""
month-japanese: "月"
day-english: ""
day-japanese: "日"
weekday-english: ""
weekday-japanese: "曜日"
today: "今日:"
this-month: "今月:"
this-year: "今年:"
common/views/widgets/donation.vue: common/views/widgets/donation.vue:
title: "寄付のお願い" title: "寄付のお願い"
text: "Misskeyの運営にはドメイン、サーバー等のコストが掛かります。Misskeyは広告を掲載したりしないため、収入を皆様からの寄付に頼っています。もしご興味があれば、{}までご連絡ください。ご協力ありがとうございます。" text: "Misskeyの運営にはドメイン、サーバー等のコストが掛かります。Misskeyは広告を掲載したりしないため、収入を皆様からの寄付に頼っています。もしご興味があれば、{}までご連絡ください。ご協力ありがとうございます。"
@ -292,12 +355,34 @@ common/views/widgets/memo.vue:
title: "付箋" title: "付箋"
memo: "ここに書いて!" memo: "ここに書いて!"
save: "保存" save: "保存"
common/views/widgets/slideshow.vue: common/views/widgets/slideshow.vue:
folder-customize-mode: "フォルダを指定するには、カスタマイズモードを終了してください" folder-customize-mode: "フォルダを指定するには、カスタマイズモードを終了してください"
folder: "クリックしてフォルダを指定してください" folder: "クリックしてフォルダを指定してください"
no-image: "このフォルダには画像がありません" no-image: "このフォルダには画像がありません"
common/views/widgets/tips.vue:
tips-line1: "<kbd>t</kbd>でタイムラインにフォーカスできます"
tips-line2: "<kbd>p</kbd>または<kbd>n</kbd>で投稿フォームを開きます"
tips-line3: "投稿フォームにはファイルをドラッグ&ドロップできます"
tips-line4: "投稿フォームにクリップボードにある画像データをペーストできます"
tips-line5: "ドライブにファイルをドラッグ&ドロップしてアップロードできます"
tips-line6: "ドライブでファイルをドラッグしてフォルダ移動できます"
tips-line7: "ドライブでフォルダをドラッグしてフォルダ移動できます"
tips-line8: "ホームは設定からカスタマイズできます"
tips-line9: "MisskeyはAGPLv3です"
tips-line10: "タイムマシンウィジェットを利用すると、簡単に過去のタイムラインに遡れます"
tips-line11: "投稿の ... をクリックして、投稿をユーザーページにピン留めできます"
tips-line13: "投稿に添付したファイルは全てドライブに保存されます"
tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます"
tips-line17: "「**」でテキストを囲むと**強調表示**されます"
tips-line19: "いくつかのウィンドウはブラウザの外に切り離すことができます"
tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示しています"
tips-line21: "APIを利用してbotの開発なども行えます"
tips-line23: "まゆかわいいよまゆ"
tips-line24: "Misskeyは2014年にサービスを開始しました"
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
common/views/pages/follow.vue: common/views/pages/follow.vue:
signed-in-as: "{}としてサインイン中" signed-in-as: "{}としてサインイン中"
following: "フォロー中" following: "フォロー中"
@ -502,7 +587,7 @@ desktop/views/components/post-form.vue:
geolocation-alert: "お使いの端末は位置情報に対応していません" geolocation-alert: "お使いの端末は位置情報に対応していません"
error: "エラー" error: "エラー"
enter-username: "ユーザー名を入力してください" enter-username: "ユーザー名を入力してください"
desktop/views/components/post-form-window.vue: desktop/views/components/post-form-window.vue:
note: "新規投稿" note: "新規投稿"
reply: "返信" reply: "返信"
@ -642,6 +727,10 @@ desktop/views/components/settings.api.vue:
desktop/views/components/settings.apps.vue: desktop/views/components/settings.apps.vue:
no-apps: "連携しているアプリケーションはありません" no-apps: "連携しているアプリケーションはありません"
desktop/views/components/settings.drive.vue:
max: "中"
in-use: "使用中"
desktop/views/components/settings.mute.vue: desktop/views/components/settings.mute.vue:
no-users: "ミュートしているユーザーはいません" no-users: "ミュートしているユーザーはいません"
@ -718,6 +807,8 @@ 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: "リストを作成"
@ -758,6 +849,7 @@ desktop/views/pages/welcome.vue:
signin-button: "やってる" signin-button: "やってる"
signup-button: "やる" signup-button: "やる"
timeline: "タイムライン" timeline: "タイムライン"
powered-by-misskey: "Powered by <b>Misskey</b>."
desktop/views/pages/drive.vue: desktop/views/pages/drive.vue:
title: "Misskey Drive" title: "Misskey Drive"
@ -778,6 +870,23 @@ desktop/views/pages/selectdrive.vue:
cancel: "キャンセル" cancel: "キャンセル"
upload: "PCからドライブにファイルをアップロード" upload: "PCからドライブにファイルをアップロード"
desktop/views/pages/search.vue:
not-available: "検索機能を利用することができません。"
not-found-quotes1: "「"
not-found-quotes2: "」"
not-found-text-english: ""
not-found-text-japanese: "に関する投稿は見つかりませんでした。"
desktop/views/pages/share.vue:
share-with: "Misskeyで共有"
close: "閉じる"
desktop/views/pages/tag.vue:
no-posts-found-english: ""
no-posts-found-japanese: "に関する投稿は見つかりませんでした。"
left-quote: "「"
right-quote: "」"
desktop/views/pages/user-list.users.vue: desktop/views/pages/user-list.users.vue:
users: "ユーザー" users: "ユーザー"
add-user: "ユーザーを追加" add-user: "ユーザーを追加"
@ -967,6 +1076,9 @@ mobile/views/components/timeline.vue:
empty: "投稿がありません" empty: "投稿がありません"
load-more: "もっと" load-more: "もっと"
mobile/views/components/ui.header.vue:
welcome-back: "おかえりなさい、"
mobile/views/components/ui.nav.vue: mobile/views/components/ui.nav.vue:
timeline: "タイムライン" timeline: "タイムライン"
notifications: "通知" notifications: "通知"
@ -1003,6 +1115,9 @@ mobile/views/pages/drive.vue:
drive: "ドライブ" drive: "ドライブ"
more: "もっと見る" more: "もっと見る"
mobile/views/pages/signup.vue:
lets-start: "📦 始めましょう"
mobile/views/pages/followers.vue: mobile/views/pages/followers.vue:
followers-of: "{}のフォロワー" followers-of: "{}のフォロワー"
@ -1015,6 +1130,21 @@ mobile/views/pages/home.vue:
hybrid: "ソーシャル" hybrid: "ソーシャル"
global: "グローバル" global: "グローバル"
mobile/views/pages/tag.vue:
no-posts-found-japanese: "に関する投稿は見つかりませんでした。"
no-posts-found-english: ""
left-quote: "「"
right-quote: "」"
mobile/views/pages/welcome.vue:
signup: "新規登録"
mobile/views/pages/widgets.vue:
dashboard: "ダッシュボード"
mobile/views/pages/widgets/activity.vue:
activity: "アクティビティ"
mobile/views/pages/messaging.vue: mobile/views/pages/messaging.vue:
messaging: "メッセージ" messaging: "メッセージ"
@ -1035,6 +1165,9 @@ mobile/views/pages/notifications.vue:
notifications: "通知" notifications: "通知"
read-all: "すべての通知を既読にしますか?" read-all: "すべての通知を既読にしますか?"
mobile/views/pages/reversi.vue:
reversi: "リバーシ"
mobile/views/pages/settings/settings.profile.vue: mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール" title: "プロフィール"
name: "名前" name: "名前"

View file

@ -1,8 +1,8 @@
{ {
"name": "misskey", "name": "misskey",
"author": "syuilo <i@syuilo.com>", "author": "syuilo <i@syuilo.com>",
"version": "5.8.0", "version": "5.9.0",
"clientVersion": "1.0.7664", "clientVersion": "1.0.7726",
"codename": "nighthike", "codename": "nighthike",
"main": "./built/index.js", "main": "./built/index.js",
"private": true, "private": true,
@ -60,7 +60,7 @@
"@types/mocha": "5.2.3", "@types/mocha": "5.2.3",
"@types/mongodb": "3.1.2", "@types/mongodb": "3.1.2",
"@types/ms": "0.7.30", "@types/ms": "0.7.30",
"@types/node": "10.5.4", "@types/node": "10.5.5",
"@types/parse5": "5.0.0", "@types/parse5": "5.0.0",
"@types/portscanner": "2.1.0", "@types/portscanner": "2.1.0",
"@types/pug": "2.0.4", "@types/pug": "2.0.4",
@ -178,7 +178,7 @@
"rimraf": "2.6.2", "rimraf": "2.6.2",
"rndstr": "1.0.0", "rndstr": "1.0.0",
"s-age": "1.1.2", "s-age": "1.1.2",
"sass-loader": "7.0.3", "sass-loader": "7.1.0",
"seedrandom": "2.4.3", "seedrandom": "2.4.3",
"sharp": "0.20.5", "sharp": "0.20.5",
"showdown": "1.8.6", "showdown": "1.8.6",
@ -202,14 +202,14 @@
"url-loader": "1.0.1", "url-loader": "1.0.1",
"uuid": "3.3.2", "uuid": "3.3.2",
"v-animate-css": "0.0.2", "v-animate-css": "0.0.2",
"vue": "2.5.16", "vue": "2.5.17",
"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.2.6",
"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.16", "vue-template-compiler": "2.5.17",
"vuedraggable": "2.16.0", "vuedraggable": "2.16.0",
"vuex": "3.0.1", "vuex": "3.0.1",
"vuex-persistedstate": "2.5.4", "vuex-persistedstate": "2.5.4",

View file

@ -1,6 +1,6 @@
<template> <template>
<div class="root"> <div class="root">
<header><b>{{ blackUser.name }}</b>() vs <b>{{ whiteUser.name }}</b>()</header> <header><b>{{ blackUser.name }}</b>(%i18n:common.reversi.black%) vs <b>{{ whiteUser.name }}</b>(%i18n:common.reversi.white%)</header>
<div style="overflow: hidden"> <div style="overflow: hidden">
<p class="turn" v-if="!iAmPlayer && !game.isEnded">{{ '%i18n:common.reversi.turn-of%'.replace('{}', turnUser.name) }}<mk-ellipsis/></p> <p class="turn" v-if="!iAmPlayer && !game.isEnded">{{ '%i18n:common.reversi.turn-of%'.replace('{}', turnUser.name) }}<mk-ellipsis/></p>
@ -39,7 +39,7 @@
</div> </div>
</div> </div>
<p class="status"><b>{{ logPos }}ターン目</b> :{{ o.blackCount }} :{{ o.whiteCount }} 合計:{{ 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="player" v-if="game.isEnded"> <div class="player" v-if="game.isEnded">
<el-button-group> <el-button-group>

View file

@ -3,12 +3,12 @@
<header><b>{{ game.user1.name }}</b> vs <b>{{ game.user2.name }}</b></header> <header><b>{{ game.user1.name }}</b> vs <b>{{ game.user2.name }}</b></header>
<div> <div>
<p>ゲームの設定</p> <p>%i18n:@settings-of-the-game%</p>
<el-card class="map"> <el-card class="map">
<div slot="header"> <div slot="header">
<el-select :class="$style.mapSelect" v-model="mapName" placeholder="マップを選択" @change="onMapChange"> <el-select :class="$style.mapSelect" v-model="mapName" placeholder="%i18n:@choose-map%" @change="onMapChange">
<el-option label="ランダム" :value="null"/> <el-option label="%i18n:@random%" :value="null"/>
<el-option-group v-for="c in mapCategories" :key="c" :label="c"> <el-option-group v-for="c in mapCategories" :key="c" :label="c">
<el-option v-for="m in maps" v-if="m.category == c" :key="m.name" :label="m.name" :value="m.name"> <el-option v-for="m in maps" v-if="m.category == c" :key="m.name" :label="m.name" :value="m.name">
<span style="float: left">{{ m.name }}</span> <span style="float: left">{{ m.name }}</span>
@ -30,25 +30,25 @@
<el-card class="bw"> <el-card class="bw">
<div slot="header"> <div slot="header">
<span>先手/後手</span> <span>%i18n:@black-or-white%</span>
</div> </div>
<el-radio v-model="game.settings.bw" label="random" @change="updateSettings">ランダム</el-radio> <el-radio v-model="game.settings.bw" label="random" @change="updateSettings">%i18n:@random%</el-radio>
<el-radio v-model="game.settings.bw" :label="1" @change="updateSettings">{{ game.user1.name }}が黒</el-radio> <el-radio v-model="game.settings.bw" :label="1" @change="updateSettings">{{ '%i18n:@black-is%'.split('{}')[0] }}{{ game.user1.name }}{{ '%i18n:@black-is%'.split('{}')[1] }}</el-radio>
<el-radio v-model="game.settings.bw" :label="2" @change="updateSettings">{{ game.user2.name }}が黒</el-radio> <el-radio v-model="game.settings.bw" :label="2" @change="updateSettings">{{ '%i18n:@black-is%'.split('{}')[0] }}{{ game.user2.name }}{{ '%i18n:@black-is%'.split('{}')[1] }}</el-radio>
</el-card> </el-card>
<el-card class="rules"> <el-card class="rules">
<div slot="header"> <div slot="header">
<span>ルール</span> <span>%i18n:@rules%</span>
</div> </div>
<mk-switch v-model="game.settings.isLlotheo" @change="updateSettings" text="石の少ない方が勝ち(ロセオ)"/> <mk-switch v-model="game.settings.isLlotheo" @change="updateSettings" text="%i18n:@is-llotheo%"/>
<mk-switch v-model="game.settings.loopedBoard" @change="updateSettings" text="ループマップ"/> <mk-switch v-model="game.settings.loopedBoard" @change="updateSettings" text="%i18n:@looped-map%"/>
<mk-switch v-model="game.settings.canPutEverywhere" @change="updateSettings" text="どこでも置けるモード"/> <mk-switch v-model="game.settings.canPutEverywhere" @change="updateSettings" text="%i18n:@can-put-everywhere%"/>
</el-card> </el-card>
<el-card class="bot-form" v-if="form"> <el-card class="bot-form" v-if="form">
<div slot="header"> <div slot="header">
<span>Botの設定</span> <span>%i18n:@settings-of-the-bot%</span>
</div> </div>
<el-alert v-for="message in messages" <el-alert v-for="message in messages"
:title="message.text" :title="message.text"
@ -77,16 +77,16 @@
<footer> <footer>
<p class="status"> <p class="status">
<template v-if="isAccepted && isOpAccepted">ゲームは数秒後に開始されます<mk-ellipsis/></template> <template v-if="isAccepted && isOpAccepted">%i18n:@this-gane-is-started-soon%<mk-ellipsis/></template>
<template v-if="isAccepted && !isOpAccepted">相手の準備が完了するのを待っています<mk-ellipsis/></template> <template v-if="isAccepted && !isOpAccepted">%i18n:@waiting-for-other%<mk-ellipsis/></template>
<template v-if="!isAccepted && isOpAccepted">あなたの準備が完了するのを待っています</template> <template v-if="!isAccepted && isOpAccepted">%i18n:@waiting-for-me%</template>
<template v-if="!isAccepted && !isOpAccepted">準備中<mk-ellipsis/></template> <template v-if="!isAccepted && !isOpAccepted">%i18n:@waiting-for-both%<mk-ellipsis/></template>
</p> </p>
<div class="actions"> <div class="actions">
<el-button @click="exit">キャンセル</el-button> <el-button @click="exit">%i18n:@cancel%</el-button>
<el-button type="primary" @click="accept" v-if="!isAccepted">準備完了</el-button> <el-button type="primary" @click="accept" v-if="!isAccepted">%i18n:@ready%</el-button>
<el-button type="primary" @click="cancel" v-if="isAccepted">準備続行</el-button> <el-button type="primary" @click="cancel" v-if="isAccepted">%i18n:@cancel-ready%</el-button>
</div> </div>
</footer> </footer>
</div> </div>

View file

@ -4,32 +4,30 @@
<x-gameroom :game="game"/> <x-gameroom :game="game"/>
</div> </div>
<div class="matching" v-else-if="matching"> <div class="matching" v-else-if="matching">
<h1><b>{{ matching.name }}</b>を待っています<mk-ellipsis/></h1> <h1>{{ '%i18n:@matching.waiting-for%'.split('{}')[0] }}<b>{{ matching.name }}</b>{{ '%i18n:@matching.waiting-for%'.split('{}')[1] }}<mk-ellipsis/></h1>
<div class="cancel"> <div class="cancel">
<el-button round @click="cancel">キャンセル</el-button> <el-button round @click="cancel">%i18n:@matching.cancel%</el-button>
</div> </div>
</div> </div>
<div class="index" v-else> <div class="index" v-else>
<h1>Misskey Reversi</h1> <h1>%i18n:@title%</h1>
<p>他のMisskeyユーザーとリバーシで対戦しよう</p> <p>%i18n:@sub-title%</p>
<div class="play"> <div class="play">
<el-button round>フリーマッチ(準備中)</el-button> <!--<el-button round>フリーマッチ(準備中)</el-button>-->
<el-button type="primary" round @click="match">指名</el-button> <el-button type="primary" round @click="match">%i18n:@invite%</el-button>
<details> <details>
<summary>遊び方</summary> <summary>%i18n:@rule%</summary>
<div> <div>
<p>リバーシは相手と交互に石をボードに置いてゆき相手の石を挟んでひっくり返しながら最終的に残った石が多い方が勝ちというボードゲームです</p> <p>%i18n:@rule-desc%</p>
<dl> <dl>
<dt><b>フリーマッチ</b></dt> <dt><b>%i18n:@mode-invite%</b></dt>
<dd>ランダムなユーザーと対戦するモードです</dd> <dd>%i18n:@mode-invite-desc%</dd>
<dt><b>指名</b></dt>
<dd>指定したユーザーと対戦するモードです</dd>
</dl> </dl>
</div> </div>
</details> </details>
</div> </div>
<section v-if="invitations.length > 0"> <section v-if="invitations.length > 0">
<h2>対局の招待があります:</h2> <h2>%i18n:@invitations%</h2>
<div class="invitation" v-for="i in invitations" tabindex="-1" @click="accept(i)"> <div class="invitation" v-for="i in invitations" tabindex="-1" @click="accept(i)">
<mk-avatar class="avatar" :user="i.parent"/> <mk-avatar class="avatar" :user="i.parent"/>
<span class="name"><b>{{ i.parent.name }}</b></span> <span class="name"><b>{{ i.parent.name }}</b></span>
@ -38,21 +36,21 @@
</div> </div>
</section> </section>
<section v-if="myGames.length > 0"> <section v-if="myGames.length > 0">
<h2>自分の対局</h2> <h2>%i18n:@my-games%</h2>
<a class="game" v-for="g in myGames" tabindex="-1" @click.prevent="go(g)" :href="`/reversi/${g.id}`"> <a class="game" v-for="g in myGames" tabindex="-1" @click.prevent="go(g)" :href="`/reversi/${g.id}`">
<mk-avatar class="avatar" :user="g.user1"/> <mk-avatar class="avatar" :user="g.user1"/>
<mk-avatar class="avatar" :user="g.user2"/> <mk-avatar class="avatar" :user="g.user2"/>
<span><b>{{ g.user1.name }}</b> vs <b>{{ g.user2.name }}</b></span> <span><b>{{ g.user1.name }}</b> vs <b>{{ g.user2.name }}</b></span>
<span class="state">{{ g.isEnded ? '終了' : '進行中' }}</span> <span class="state">{{ g.isEnded ? '%i18n:@game-state.ended%' : '%i18n:@game-state.playing%' }}</span>
</a> </a>
</section> </section>
<section v-if="games.length > 0"> <section v-if="games.length > 0">
<h2>みんなの対局</h2> <h2>%i18n:@all-games%</h2>
<a class="game" v-for="g in games" tabindex="-1" @click.prevent="go(g)" :href="`/reversi/${g.id}`"> <a class="game" v-for="g in games" tabindex="-1" @click.prevent="go(g)" :href="`/reversi/${g.id}`">
<mk-avatar class="avatar" :user="g.user1"/> <mk-avatar class="avatar" :user="g.user1"/>
<mk-avatar class="avatar" :user="g.user2"/> <mk-avatar class="avatar" :user="g.user2"/>
<span><b>{{ g.user1.name }}</b> vs <b>{{ g.user2.name }}</b></span> <span><b>{{ g.user1.name }}</b> vs <b>{{ g.user2.name }}</b></span>
<span class="state">{{ g.isEnded ? '終了' : '進行中' }}</span> <span class="state">{{ g.isEnded ? '%i18n:@game-state.ended%' : '%i18n:@game-state.playing%' }}</span>
</a> </a>
</section> </section>
</div> </div>
@ -153,7 +151,7 @@ export default Vue.extend({
match() { match() {
(this as any).apis.input({ (this as any).apis.input({
title: 'ユーザー名を入力してください' title: '%i18n:@enter-username%'
}).then(username => { }).then(username => {
(this as any).api('users/show', { (this as any).api('users/show', {
username username

View file

@ -4,27 +4,27 @@
<div class="mkw-calendar--body"> <div class="mkw-calendar--body">
<div class="calendar" :data-is-holiday="isHoliday"> <div class="calendar" :data-is-holiday="isHoliday">
<p class="month-and-year"> <p class="month-and-year">
<span class="year">{{ year }}</span> <span class="year">%i18n:@year-english%{{ year }}%i18n:@year-japanese%</span>
<span class="month">{{ month }}</span> <span class="month">%i18n:@month-english%{{ month }}%i18n:@month-japanese%</span>
</p> </p>
<p class="day">{{ day }}</p> <p class="day">%i18n:@day-english%{{ day }}%i18n:@day-japanese%</p>
<p class="week-day">{{ weekDay }}曜日</p> <p class="week-day">{{ weekDay }}</p>
</div> </div>
<div class="info"> <div class="info">
<div> <div>
<p>今日:<b>{{ dayP.toFixed(1) }}%</b></p> <p>%i18n:@today%<b>{{ dayP.toFixed(1) }}%</b></p>
<div class="meter"> <div class="meter">
<div class="val" :style="{ width: `${dayP}%` }"></div> <div class="val" :style="{ width: `${dayP}%` }"></div>
</div> </div>
</div> </div>
<div> <div>
<p>今月:<b>{{ monthP.toFixed(1) }}%</b></p> <p>%i18n:@this-month%<b>{{ monthP.toFixed(1) }}%</b></p>
<div class="meter"> <div class="meter">
<div class="val" :style="{ width: `${monthP}%` }"></div> <div class="val" :style="{ width: `${monthP}%` }"></div>
</div> </div>
</div> </div>
<div> <div>
<p>今年:<b>{{ yearP.toFixed(1) }}%</b></p> <p>%i18n:@this-year%<b>{{ yearP.toFixed(1) }}%</b></p>
<div class="meter"> <div class="meter">
<div class="val" :style="{ width: `${yearP}%` }"></div> <div class="val" :style="{ width: `${yearP}%` }"></div>
</div> </div>
@ -84,7 +84,15 @@ export default define({
this.year = ny; this.year = ny;
this.month = nm + 1; this.month = nm + 1;
this.day = nd; this.day = nd;
this.weekDay = ['日', '月', '火', '水', '木', '金', '土'][now.getDay()]; this.weekDay = [
'%i18n:common.weekday.sunday%',
'%i18n:common.weekday.monday%',
'%i18n:common.weekday.tuesday%',
'%i18n:common.weekday.wednesday%',
'%i18n:common.weekday.thursday%',
'%i18n:common.weekday.friday%',
'%i18n:common.weekday.saturday%'
][now.getDay()];
const dayNumer = now.getTime() - new Date(ny, nm, nd).getTime(); const dayNumer = now.getTime() - new Date(ny, nm, nd).getTime();
const dayDenom = 1000/*ms*/ * 60/*s*/ * 60/*m*/ * 24/*h*/; const dayDenom = 1000/*ms*/ * 60/*s*/ * 60/*m*/ * 24/*h*/;

View file

@ -9,31 +9,26 @@ import * as anime from 'animejs';
import define from '../../../common/define-widget'; import define from '../../../common/define-widget';
const tips = [ const tips = [
'<kbd>t</kbd>でタイムラインにフォーカスできます', '%i18n:@tips-line1%',
'<kbd>p</kbd>または<kbd>n</kbd>で投稿フォームを開きます', '%i18n:@tips-line2%',
'投稿フォームにはファイルをドラッグ&ドロップできます', '%i18n:@tips-line3%',
'投稿フォームにクリップボードにある画像データをペーストできます', '%i18n:@tips-line4%',
'ドライブにファイルをドラッグ&ドロップしてアップロードできます', '%i18n:@tips-line5%',
'ドライブでファイルをドラッグしてフォルダ移動できます', '%i18n:@tips-line6%',
'ドライブでフォルダをドラッグしてフォルダ移動できます', '%i18n:@tips-line7%',
'ホームは設定からカスタマイズできます', '%i18n:@tips-line8%',
'MisskeyはAGPLv3です', '%i18n:@tips-line9%',
'タイムマシンウィジェットを利用すると、簡単に過去のタイムラインに遡れます', '%i18n:@tips-line10%',
'投稿の ... をクリックして、投稿をユーザーページにピン留めできます', '%i18n:@tips-line11%',
'ドライブの容量は(デフォルトで)1GBです', '%i18n:@tips-line13%',
'投稿に添付したファイルは全てドライブに保存されます', '%i18n:@tips-line14%',
'ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます', '%i18n:@tips-line17%',
'タイムライン上部にもウィジェットを設置できます', '%i18n:@tips-line19%',
'投稿をダブルクリックすると詳細が見れます', '%i18n:@tips-line20%',
'「**」でテキストを囲むと**強調表示**されます', '%i18n:@tips-line21%',
'チャンネルウィジェットを利用すると、よく利用するチャンネルを素早く確認できます', '%i18n:@tips-line23%',
'いくつかのウィンドウはブラウザの外に切り離すことができます', '%i18n:@tips-line24%',
'カレンダーウィジェットのパーセンテージは、経過の割合を示しています', '%i18n:@tips-line25%'
'APIを利用してbotの開発なども行えます',
'MisskeyはLINEを通じてでも利用できます',
'まゆかわいいよまゆ',
'Misskeyは2014年にサービスを開始しました',
'対応ブラウザではMisskeyを開いていなくても通知を受け取れます'
] ]
export default define({ export default define({

View file

@ -2,7 +2,7 @@
<div class="root"> <div class="root">
<template v-if="!fetching"> <template v-if="!fetching">
<el-progress :text-inside="true" :stroke-width="18" :percentage="Math.floor((usage / capacity) * 100)"/> <el-progress :text-inside="true" :stroke-width="18" :percentage="Math.floor((usage / capacity) * 100)"/>
<p><b>{{ capacity | bytes }}</b><b>{{ usage | bytes }}</b>使用中</p> <p><b>{{ capacity | bytes }}</b>%i18n:max%<b>{{ usage | bytes }}</b>%i18n:in-use%</p>
</template> </template>
</div> </div>
</template> </template>

View file

@ -6,8 +6,8 @@
<div :class="$style.loading" v-if="fetching"> <div :class="$style.loading" v-if="fetching">
<mk-ellipsis-icon/> <mk-ellipsis-icon/>
</div> </div>
<p :class="$style.notAvailable" v-if="!fetching && notAvailable">検索機能を利用することができません</p> <p :class="$style.notAvailable" v-if="!fetching && notAvailable">%i18n:@not-available%</p>
<p :class="$style.empty" v-if="!fetching && empty">%fa:search%{{ q }}に関する投稿は見つかりませんでした</p> <p :class="$style.empty" v-if="!fetching && empty">%fa:search%%i18n:@not-found-text-english%%i18n:@not-found-quotes1%{{ q }}%i18n:@not-found-quotes2%%i18n:@not-found-text-japanese%</p>
<mk-notes ref="timeline" :class="$style.notes" :more="existMore ? more : null"/> <mk-notes ref="timeline" :class="$style.notes" :more="existMore ? more : null"/>
</mk-ui> </mk-ui>
</template> </template>

View file

@ -1,12 +1,12 @@
<template> <template>
<div class="pptjhabgjtt7kwskbfv4y3uml6fpuhmr"> <div class="pptjhabgjtt7kwskbfv4y3uml6fpuhmr">
<h1>Misskeyで共有</h1> <h1>%i18n:@share-with%</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>
<button v-if="posted" class="ui button" @click="close">閉じる</button> <button v-if="posted" class="ui button" @click="close">%i18n:@close%</button>
</div> </div>
</template> </template>

View file

@ -6,7 +6,7 @@
<div :class="$style.loading" v-if="fetching"> <div :class="$style.loading" v-if="fetching">
<mk-ellipsis-icon/> <mk-ellipsis-icon/>
</div> </div>
<p :class="$style.empty" v-if="!fetching && empty">%fa:search%{{ q }}に関する投稿は見つかりませんでした</p> <p :class="$style.empty" v-if="!fetching && empty">%i18n:no-posts-found-english%%fa:search%%i18n:left-quote%{{ q }}%i18n:right-quote%%i18n:no-posts-found-japanese%</p>
<mk-notes ref="timeline" :class="$style.notes" :more="existMore ? more : null"/> <mk-notes ref="timeline" :class="$style.notes" :more="existMore ? more : null"/>
</mk-ui> </mk-ui>
</template> </template>

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.misskey% <b>{{ host }}</b></span> <span>%i18n:common.name% <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>
@ -18,7 +18,7 @@
<div class="about"> <div class="about">
<h1 v-if="name">{{ name }}</h1> <h1 v-if="name">{{ name }}</h1>
<h1 v-else><img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" alt="Misskey"></h1> <h1 v-else><img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" alt="Misskey"></h1>
<p class="powerd-by" v-if="name">powerd by <b>Misskey</b></p> <p class="powerd-by" v-if="name">%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>

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">おかえりなさい<b>{{ $store.state.i | userName }}</b>さん</p> <p ref="welcomeback" v-if="$store.getters.isSignedIn">%i18n:@welcome-back%<b>{{ $store.state.i | userName }}</b>さん</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>Misskey</slot> <slot>%i18n:common.name%</slot>
</h1> </h1>
<slot name="func"></slot> <slot name="func"></slot>
</div> </div>

View file

@ -1,6 +1,6 @@
<template> <template>
<mk-ui> <mk-ui>
<span slot="header">%fa:gamepad%リバーシ</span> <span slot="header">%fa:gamepad%%i18n:@reversi%</span>
<mk-reversi v-if="!fetching" :init-game="game" @gamed="onGamed"/> <mk-reversi v-if="!fetching" :init-game="game" @gamed="onGamed"/>
</mk-ui> </mk-ui>
</template> </template>
@ -23,7 +23,7 @@ export default Vue.extend({
this.fetch(); this.fetch();
}, },
mounted() { mounted() {
document.title = 'Misskey リバーシ'; document.title = '%i18n:common.name% %i18n:@reversi%';
document.documentElement.style.background = '#fff'; document.documentElement.style.background = '#fff';
}, },
methods: { methods: {

View file

@ -1,6 +1,6 @@
<template> <template>
<div class="signup"> <div class="signup">
<h1>📦 始めましょう</h1> <h1>%i18n:@lets-start%</h1>
<mk-signup/> <mk-signup/>
</div> </div>
</template> </template>

View file

@ -3,7 +3,7 @@
<span slot="header">%fa:hashtag%{{ $route.params.tag }}</span> <span slot="header">%fa:hashtag%{{ $route.params.tag }}</span>
<main> <main>
<p v-if="!fetching && empty">%fa:search%{{ q }}に関する投稿は見つかりませんでした</p> <p v-if="!fetching && empty">%fa:search%%i18n:@no-posts-found-english%%i18n:@left-quote%{{ q }}%i18n:@right-quote%%i18n:@no-posts-found-japanese%</p>
<mk-notes ref="timeline" :more="existMore ? more : null"/> <mk-notes ref="timeline" :more="existMore ? more : null"/>
</main> </main>
</mk-ui> </mk-ui>

View file

@ -6,7 +6,7 @@
<div class="about"> <div class="about">
<h2>{{ name || 'unidentified' }}</h2> <h2>{{ name || 'unidentified' }}</h2>
<p v-html="description || '%i18n:common.about%'"></p> <p v-html="description || '%i18n:common.about%'"></p>
<router-link class="signup" to="/signup">新規登録</router-link> <router-link class="signup" to="/signup">%i18n:@signup%</router-link>
</div> </div>
<div class="login"> <div class="login">
<mk-signin :with-avatar="false"/> <mk-signin :with-avatar="false"/>

View file

@ -1,6 +1,6 @@
<template> <template>
<mk-ui> <mk-ui>
<span slot="header">%fa:home%ダッシュボード</span> <span slot="header">%fa:home%%i18n:@dashboard%</span>
<template slot="func"> <template slot="func">
<button @click="customizing = !customizing">%fa:cog%</button> <button @click="customizing = !customizing">%fa:cog%</button>
</template> </template>

View file

@ -1,7 +1,7 @@
<template> <template>
<div class="mkw-activity"> <div class="mkw-activity">
<mk-widget-container :show-header="!props.compact"> <mk-widget-container :show-header="!props.compact">
<template slot="header">%fa:chart-bar%アクティビティ</template> <template slot="header">%fa:chart-bar%%i18n:@activity%</template>
<div :class="$style.body"> <div :class="$style.body">
<mk-activity :user="$store.state.i"/> <mk-activity :user="$store.state.i"/>
</div> </div>

View file

@ -9,7 +9,6 @@ import { pack } from '../../../../../models/messaging-message';
import { publishUserStream } from '../../../../../stream'; import { publishUserStream } from '../../../../../stream';
import { publishMessagingStream, publishMessagingIndexStream } from '../../../../../stream'; import { publishMessagingStream, publishMessagingIndexStream } from '../../../../../stream';
import pushSw from '../../../../../push-sw'; import pushSw from '../../../../../push-sw';
import config from '../../../../../config';
export const meta = { export const meta = {
desc: { desc: {
@ -123,20 +122,6 @@ export default (params: any, user: ILocalUser) => new Promise(async (res, rej) =
} }
}, 3000); }, 3000);
// Register to search database
if (message.text && config.elasticsearch) {
const es = require('../../../db/elasticsearch');
es.index({
index: 'misskey',
type: 'messaging_message',
id: message._id.toString(),
body: {
text: message.text
}
});
}
// 履歴作成(自分) // 履歴作成(自分)
History.update({ History.update({
userId: user._id, userId: user._id,

View file

@ -8,6 +8,6 @@ export default function(request: websocket.request, connection: websocket.connec
// Subscribe stream // Subscribe stream
subscriber.on(`user-list-stream:${listId}`, data => { subscriber.on(`user-list-stream:${listId}`, data => {
connection.send(data); connection.send(JSON.stringify(data));
}); });
} }