diff options
| author | かっこかり <67428053+kakkokari-gtyih@users.noreply.github.com> | 2024-02-23 18:07:41 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-02-23 18:07:41 +0900 |
| commit | d8342322327924a111a8ece0a6c7eb8c9ac2f378 (patch) | |
| tree | 09ee53f4b8beb95359f077a281bcaaaed5f476cf | |
| parent | enhance: リモートのフォロワーから再度Followが来た場合、ac... (diff) | |
| download | misskey-d8342322327924a111a8ece0a6c7eb8c9ac2f378.tar.gz misskey-d8342322327924a111a8ece0a6c7eb8c9ac2f378.tar.bz2 misskey-d8342322327924a111a8ece0a6c7eb8c9ac2f378.zip | |
enhance(games): 抜けている翻訳を追加・スタイル共通化 (#13434)
* enhance(games): 抜けている翻訳を追加・スタイル共通化
* frameDivider の使用箇所が見当たらなかったので削除
* ミス
* インナーでもcss変数を使う
* コロンを翻訳から外す
* 一部の翻訳を除去
* p
* revert some text
---------
Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com>
| -rw-r--r-- | locales/index.d.ts | 62 | ||||
| -rw-r--r-- | locales/ja-JP.yml | 16 | ||||
| -rw-r--r-- | packages/frontend/src/pages/drop-and-fusion.game.vue | 120 | ||||
| -rw-r--r-- | packages/frontend/src/pages/drop-and-fusion.vue | 56 | ||||
| -rw-r--r-- | packages/frontend/src/pages/reversi/game.board.vue | 17 | ||||
| -rw-r--r-- | packages/frontend/src/style.scss | 33 |
6 files changed, 177 insertions, 127 deletions
diff --git a/locales/index.d.ts b/locales/index.d.ts index d483fea837..1a2565b06a 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -4857,6 +4857,14 @@ export interface Locale extends ILocale { */ "replaying": string; /** + * リプレイを終了 + */ + "endReplay": string; + /** + * リプレイデータをコピー + */ + "copyReplayData": string; + /** * ランキング */ "ranking": string; @@ -4884,11 +4892,57 @@ export interface Locale extends ILocale { * スワイプしてタブを切り替える */ "enableHorizontalSwipe": string; + /** + * 読み込み中 + */ + "loading": string; + /** + * やめる + */ + "surrender": string; + /** + * リトライ + */ + "gameRetry": string; "_bubbleGame": { /** * 遊び方 */ "howToPlay": string; + /** + * ホールド + */ + "hold": string; + "_score": { + /** + * スコア + */ + "score": string; + /** + * 稼いだ金額 + */ + "scoreYen": string; + /** + * ハイスコア + */ + "highScore": string; + /** + * 最大チェーン数 + */ + "maxChain": string; + /** + * {yen}円 + */ + "yen": ParameterizedString<"yen">; + /** + * {qty}個分 + */ + "estimatedQty": ParameterizedString<"qty">; + /** + * おにぎり {onigiriQtyWithUnit} + */ + "scoreSweets": ParameterizedString<"onigiriQtyWithUnit">; + }; "_howToPlay": { /** * 位置を調整してハコにモノを落とします。 @@ -9659,6 +9713,14 @@ export interface Locale extends ILocale { * 変則なし */ "disallowIrregularRules": string; + /** + * 盤面に行・列番号を表示 + */ + "showBoardLabels": string; + /** + * 石をアイコンにする + */ + "useAvatarAsStone": string; }; "_offlineScreen": { /** diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 7e16619fc7..61c61b8f96 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1210,6 +1210,8 @@ soundWillBePlayed: "サウンドが再生されます" showReplay: "リプレイを見る" replay: "リプレイ" replaying: "リプレイ中" +endReplay: "リプレイを終了" +copyReplayData: "リプレイデータをコピー" ranking: "ランキング" lastNDays: "直近{n}日" backToTitle: "タイトルへ" @@ -1217,9 +1219,21 @@ hemisphere: "お住まいの地域" withSensitive: "センシティブなファイルを含むノートを表示" userSaysSomethingSensitive: "{name}のセンシティブなファイルを含む投稿" enableHorizontalSwipe: "スワイプしてタブを切り替える" +loading: "読み込み中" +surrender: "やめる" +gameRetry: "リトライ" _bubbleGame: howToPlay: "遊び方" + hold: "ホールド" + _score: + score: "スコア" + scoreYen: "稼いだ金額" + highScore: "ハイスコア" + maxChain: "最大チェーン数" + yen: "{yen}円" + estimatedQty: "{qty}個分" + scoreSweets: "おにぎり {onigiriQtyWithUnit}" _howToPlay: section1: "位置を調整してハコにモノを落とします。" section2: "同じ種類のモノがくっつくと別のモノに変化して、スコアが得られます。" @@ -2572,6 +2586,8 @@ _reversi: opponentHasSettingsChanged: "相手が設定を変更しました" allowIrregularRules: "変則許可 (完全フリー)" disallowIrregularRules: "変則なし" + showBoardLabels: "盤面に行・列番号を表示" + useAvatarAsStone: "石をアイコンにする" _offlineScreen: title: "オフライン - サーバーに接続できません" diff --git a/packages/frontend/src/pages/drop-and-fusion.game.vue b/packages/frontend/src/pages/drop-and-fusion.game.vue index d9881cebbf..eba5b92154 100644 --- a/packages/frontend/src/pages/drop-and-fusion.game.vue +++ b/packages/frontend/src/pages/drop-and-fusion.game.vue @@ -7,9 +7,7 @@ SPDX-License-Identifier: AGPL-3.0-only <MkSpacer :contentMax="800"> <div :class="$style.root"> <div v-if="!gameLoaded" :class="$style.loadingScreen"> - <div> - Loading... - </div> + <div>{{ i18n.ts.loading }}<MkEllipsis/></div> </div> <!-- ↓に対してTransitionコンポーネントを使うと何故かkeyを指定していてもキャッシュが効かず様々なコンポーネントが都度再評価されてパフォーマンスが低下する --> <div v-show="gameLoaded" class="_gaps_s"> @@ -32,18 +30,18 @@ SPDX-License-Identifier: AGPL-3.0-only </Transition> <div :class="$style.header"> - <div :class="[$style.frame, $style.headerTitle]"> - <div :class="$style.frameInner"> - <b>BUBBLE GAME</b> - <div>- {{ gameMode }} -</div> + <div class="_woodenFrame" :class="[$style.headerTitle]"> + <div class="_woodenFrameInner"> + <b>{{ i18n.ts.bubbleGame }}</b> + <div>- {{ gameMode.toUpperCase() }} -</div> </div> </div> - <div :class="[$style.frame, $style.frameH]"> - <div :class="$style.frameInner"> - <MkButton inline small @click="hold">HOLD</MkButton> + <div class="_woodenFrame _woodenFrameH"> + <div class="_woodenFrameInner"> + <MkButton inline small @click="hold">{{ i18n.ts._bubbleGame.hold }}</MkButton> <img v-if="holdingStock" :src="getTextureImageUrl(holdingStock.mono)" style="width: 32px; margin-left: 8px; vertical-align: bottom;"/> </div> - <div :class="[$style.frameInner, $style.stock]" style="text-align: center;"> + <div class="_woodenFrameInner" :class="$style.stock" style="text-align: center;"> <TransitionGroup :enterActiveClass="$style.transition_stock_enterActive" :leaveActiveClass="$style.transition_stock_leaveActive" @@ -90,58 +88,74 @@ SPDX-License-Identifier: AGPL-3.0-only <div v-if="isGameOver && !replaying" :class="$style.gameOverLabel"> <div class="_gaps_s"> <img src="/client-assets/drop-and-fusion/gameover.png" style="width: 200px; max-width: 100%; display: block; margin: auto; margin-bottom: -5px;"/> - <div>SCORE: <MkNumber :value="score"/>{{ getScoreUnit(gameMode) }}</div> - <div>MAX CHAIN: <MkNumber :value="maxCombo"/></div> - <div v-if="gameMode === 'yen'">TOTAL EARNINGS: <b><MkNumber :value="yenTotal ?? score"/>円</b></div> - <div v-if="gameMode === 'sweets'"><b>おにぎり<MkNumber :value="score / 130"/>個分</b></div> + <div>{{ i18n.ts._bubbleGame._score.score }}: <MkNumber :value="score"/>{{ getScoreUnit(gameMode) }}</div> + <div>{{ i18n.ts._bubbleGame._score.maxChain }}: <MkNumber :value="maxCombo"/></div> + <div v-if="gameMode === 'yen'"> + {{ i18n.ts._bubbleGame._score.scoreYen }}: + <I18n :src="i18n.ts._bubbleGame._score.yen" tag="b"> + <template #yen><MkNumber :value="yenTotal ?? score"/></template> + </I18n> + </div> + <I18n v-if="gameMode === 'sweets'" :src="i18n.ts._bubbleGame._score.scoreSweets" tag="div"> + <template #onigiriQtyWithUnit> + <I18n :src="i18n.ts._bubbleGame._score.estimatedQty" tag="b"> + <template #qty><MkNumber :value="score / 130"/></template> + </I18n> + </template> + </I18n> </div> </div> <div v-if="replaying" :class="$style.replayIndicator"><span :class="$style.replayIndicatorText"><i class="ti ti-player-play"></i> {{ i18n.ts.replaying }}</span></div> </div> - <div v-if="replaying" :class="$style.frame"> - <div :class="$style.frameInner"> + <div v-if="replaying" class="_woodenFrame"> + <div class="_woodenFrameInner"> <div style="background: #0004;"> <div style="height: 10px; background: var(--accent); will-change: width;" :style="{ width: `${(currentFrame / endedAtFrame) * 100}%` }"></div> </div> </div> - <div :class="$style.frameInner"> + <div class="_woodenFrameInner"> <div class="_buttonsCenter"> - <MkButton @click="endReplay"><i class="ti ti-player-stop"></i> END</MkButton> + <MkButton @click="endReplay"><i class="ti ti-player-stop"></i> {{ i18n.ts.endReplay }}</MkButton> <MkButton :primary="replayPlaybackRate === 4" @click="replayPlaybackRate = replayPlaybackRate === 4 ? 1 : 4"><i class="ti ti-player-track-next"></i> x4</MkButton> <MkButton :primary="replayPlaybackRate === 16" @click="replayPlaybackRate = replayPlaybackRate === 16 ? 1 : 16"><i class="ti ti-player-track-next"></i> x16</MkButton> </div> </div> </div> - <div v-if="isGameOver" :class="$style.frame"> - <div :class="$style.frameInner"> + <div v-if="isGameOver" class="_woodenFrame"> + <div class="_woodenFrameInner"> <div class="_buttonsCenter"> <MkButton primary rounded @click="backToTitle">{{ i18n.ts.backToTitle }}</MkButton> <MkButton primary rounded @click="replay">{{ i18n.ts.showReplay }}</MkButton> <MkButton primary rounded @click="share">{{ i18n.ts.share }}</MkButton> - <MkButton rounded @click="exportLog">Copy replay data</MkButton> + <MkButton rounded @click="exportLog">{{ i18n.ts.copyReplayData }}</MkButton> </div> </div> </div> <div style="display: flex;"> - <div :class="$style.frame" style="flex: 1; margin-right: 10px;"> - <div :class="$style.frameInner"> - <div>SCORE: <b><MkNumber :value="score"/>{{ getScoreUnit(gameMode) }}</b></div> - <div>HIGH SCORE: <b v-if="highScore"><MkNumber :value="highScore"/>{{ getScoreUnit(gameMode) }}</b><b v-else>-</b></div> - <div v-if="gameMode === 'yen'">TOTAL EARNINGS: <b v-if="yenTotal"><MkNumber :value="yenTotal"/>円</b><b v-else>-</b></div> + <div class="_woodenFrame" style="flex: 1; margin-right: 10px;"> + <div class="_woodenFrameInner"> + <div>{{ i18n.ts._bubbleGame._score.score }}: <MkNumber :value="score"/>{{ getScoreUnit(gameMode) }}</div> + <div>{{ i18n.ts._bubbleGame._score.highScore }}: <b v-if="highScore"><MkNumber :value="highScore"/>{{ getScoreUnit(gameMode) }}</b><b v-else>-</b></div> + <div v-if="gameMode === 'yen'"> + {{ i18n.ts._bubbleGame._score.scoreYen }}: + <I18n :src="i18n.ts._bubbleGame._score.yen" tag="b"> + <template #yen><MkNumber :value="yenTotal ?? score"/></template> + </I18n> + </div> </div> </div> - <div :class="[$style.frame]" style="margin-left: auto;"> - <div :class="$style.frameInner" style="text-align: center;"> + <div class="_woodenFrame" style="margin-left: auto;"> + <div class="_woodenFrameInner" style="text-align: center;"> <div @click="showConfig = !showConfig"><i class="ti ti-settings"></i></div> </div> </div> </div> - <div v-if="showConfig" :class="$style.frame"> - <div :class="$style.frameInner"> + <div v-if="showConfig" class="_woodenFrame"> + <div class="_woodenFrameInner"> <div class="_gaps"> <MkRange v-model="bgmVolume" :min="0" :max="1" :step="0.01" :textConverter="(v) => `${Math.floor(v * 100)}%`" :continuousUpdate="true" @dragEnded="(v) => updateSettings('bgmVolume', v)"> <template #label>BGM {{ i18n.ts.volume }}</template> @@ -153,8 +167,8 @@ SPDX-License-Identifier: AGPL-3.0-only </div> </div> - <div :class="$style.frame"> - <div :class="$style.frameInner"> + <div class="_woodenFrame"> + <div class="_woodenFrameInner"> <div>FUSION RECIPE</div> <div> <div v-for="(mono, i) in game.monoDefinitions.sort((a, b) => a.level - b.level)" :key="mono.id" style="display: inline-block;"> @@ -165,10 +179,10 @@ SPDX-License-Identifier: AGPL-3.0-only </div> </div> - <div :class="$style.frame"> - <div :class="$style.frameInner"> - <MkButton v-if="!isGameOver && !replaying" full danger @click="surrender">Surrender</MkButton> - <MkButton v-else full @click="restart">Retry</MkButton> + <div class="_woodenFrame"> + <div class="_woodenFrameInner"> + <MkButton v-if="!isGameOver && !replaying" full danger @click="surrender">{{ i18n.ts.surrender }}</MkButton> + <MkButton v-else full @click="restart">{{ i18n.ts.gameRetry }}</MkButton> </div> </div> </div> @@ -1313,38 +1327,6 @@ definePageMetadata(() => ({ max-width: 100%; } -.frame { - padding: 7px; - background: #8C4F26; - box-shadow: 0 6px 16px #0007, 0 0 1px 1px #693410, inset 0 0 2px 1px #ce8a5c; - border-radius: 10px; -} - -.frameH { - display: flex; - gap: 6px; -} - -.frameInner { - padding: 8px; - margin-top: 8px; - background: #F1E8DC; - box-shadow: 0 0 2px 1px #ce8a5c, inset 0 0 1px 1px #693410; - border-radius: 6px; - color: #693410; - - &:first-child { - margin-top: 0; - } -} - -.frameDivider { - height: 0; - border: none; - border-top: 1px solid #693410; - border-bottom: 1px solid #ce8a5c; -} - .header { position: relative; z-index: 10; diff --git a/packages/frontend/src/pages/drop-and-fusion.vue b/packages/frontend/src/pages/drop-and-fusion.vue index 1b11457988..54352c9b0d 100644 --- a/packages/frontend/src/pages/drop-and-fusion.vue +++ b/packages/frontend/src/pages/drop-and-fusion.vue @@ -15,13 +15,13 @@ SPDX-License-Identifier: AGPL-3.0-only <MkSpacer v-if="!gameStarted" :contentMax="800"> <div :class="$style.root"> <div class="_gaps"> - <div :class="$style.frame" style="text-align: center;"> - <div :class="$style.frameInner"> + <div class="_woodenFrame" style="text-align: center;"> + <div class="_woodenFrameInner"> <img src="/client-assets/drop-and-fusion/logo.png" style="display: block; max-width: 100%; max-height: 200px; margin: auto;"/> </div> </div> - <div :class="$style.frame" style="text-align: center;"> - <div :class="$style.frameInner"> + <div class="_woodenFrame" style="text-align: center;"> + <div class="_woodenFrameInner"> <div class="_gaps" style="padding: 16px;"> <MkSelect v-model="gameMode"> <option value="normal">NORMAL</option> @@ -33,7 +33,7 @@ SPDX-License-Identifier: AGPL-3.0-only <MkButton primary gradate large rounded inline @click="start">{{ i18n.ts.start }}</MkButton> </div> </div> - <div :class="$style.frameInner"> + <div class="_woodenFrameInner"> <div class="_gaps" style="padding: 16px;"> <div style="font-size: 90%;"><i class="ti ti-music"></i> {{ i18n.ts.soundWillBePlayed }}</div> <MkSwitch v-model="mute"> @@ -42,10 +42,10 @@ SPDX-License-Identifier: AGPL-3.0-only </div> </div> </div> - <div :class="$style.frame"> - <div :class="$style.frameInner"> + <div class="_woodenFrame"> + <div class="_woodenFrameInner"> <div class="_gaps_s" style="padding: 16px;"> - <div><b>{{ i18n.tsx.lastNDays({ n: 7 }) }} {{ i18n.ts.ranking }}</b> ({{ gameMode }})</div> + <div><b>{{ i18n.tsx.lastNDays({ n: 7 }) }} {{ i18n.ts.ranking }}</b> ({{ gameMode.toUpperCase() }})</div> <div v-if="ranking" class="_gaps_s"> <div v-for="r in ranking" :key="r.id" :class="$style.rankingRecord"> <MkAvatar :link="true" style="width: 24px; height: 24px; margin-right: 4px;" :user="r.user"/> @@ -57,8 +57,8 @@ SPDX-License-Identifier: AGPL-3.0-only </div> </div> </div> - <div :class="$style.frame"> - <div :class="$style.frameInner" style="padding: 16px;"> + <div class="_woodenFrame"> + <div class="_woodenFrameInner" style="padding: 16px;"> <div style="font-weight: bold;">{{ i18n.ts._bubbleGame.howToPlay }}</div> <ol> <li>{{ i18n.ts._bubbleGame._howToPlay.section1 }}</li> @@ -67,8 +67,8 @@ SPDX-License-Identifier: AGPL-3.0-only </ol> </div> </div> - <div :class="$style.frame"> - <div :class="$style.frameInner"> + <div class="_woodenFrame"> + <div class="_woodenFrameInner"> <div class="_gaps_s" style="padding: 16px;"> <div><b>Credit</b></div> <div> @@ -149,38 +149,6 @@ definePageMetadata(() => ({ } } -.frame { - padding: 7px; - background: #8C4F26; - box-shadow: 0 6px 16px #0007, 0 0 1px 1px #693410, inset 0 0 2px 1px #ce8a5c; - border-radius: 10px; -} - -.frameH { - display: flex; - gap: 6px; -} - -.frameInner { - padding: 8px; - margin-top: 8px; - background: #F1E8DC; - box-shadow: 0 0 2px 1px #ce8a5c, inset 0 0 1px 1px #693410; - border-radius: 6px; - color: #693410; - - &:first-child { - margin-top: 0; - } -} - -.frameDivider { - height: 0; - border: none; - border-top: 1px solid #693410; - border-bottom: 1px solid #ce8a5c; -} - .rankingRecord { display: flex; line-height: 24px; diff --git a/packages/frontend/src/pages/reversi/game.board.vue b/packages/frontend/src/pages/reversi/game.board.vue index 6f7f5b8f38..5259dfa29a 100644 --- a/packages/frontend/src/pages/reversi/game.board.vue +++ b/packages/frontend/src/pages/reversi/game.board.vue @@ -34,7 +34,7 @@ SPDX-License-Identifier: AGPL-3.0-only </div> </div> - <div :class="$style.board"> + <div class="_woodenFrame"> <div :class="$style.boardInner"> <div v-if="showBoardLabels" :class="$style.labelsX"> <span v-for="i in game.map[0].length" :key="i" :class="$style.labelsXLabel">{{ String.fromCharCode(64 + i) }}</span> @@ -124,8 +124,8 @@ SPDX-License-Identifier: AGPL-3.0-only <MkFolder> <template #label>{{ i18n.ts.options }}</template> <div class="_gaps_s" style="text-align: left;"> - <MkSwitch v-model="showBoardLabels">Show labels</MkSwitch> - <MkSwitch v-model="useAvatarAsStone">useAvatarAsStone</MkSwitch> + <MkSwitch v-model="showBoardLabels">{{ i18n.ts._reversi.showBoardLabels }}</MkSwitch> + <MkSwitch v-model="useAvatarAsStone">{{ i18n.ts._reversi.useAvatarAsStone }}</MkSwitch> </div> </MkFolder> @@ -500,17 +500,6 @@ $gap: 4px; text-align: center; } -.board { - width: 100%; - box-sizing: border-box; - margin: 0 auto; - - padding: 7px; - background: #8C4F26; - box-shadow: 0 6px 16px #0007, 0 0 1px 1px #693410, inset 0 0 2px 1px #ce8a5c; - border-radius: 12px; -} - .boardInner { padding: 32px; diff --git a/packages/frontend/src/style.scss b/packages/frontend/src/style.scss index cbec377277..0951a7d98d 100644 --- a/packages/frontend/src/style.scss +++ b/packages/frontend/src/style.scss @@ -417,6 +417,39 @@ rt { transition-timing-function: cubic-bezier(0,.5,.5,1); } +._woodenFrame { + padding: 7px; + background: #8C4F26; + box-shadow: 0 6px 16px #0007, 0 0 1px 1px #693410, inset 0 0 2px 1px #ce8a5c; + border-radius: 10px; + + --bg: #F1E8DC; + --panel: #fff; + --fg: #693410; + --switchOffBg: rgba(0, 0, 0, 0.1); + --switchOffFg: rgb(255, 255, 255); + --switchOnBg: var(--accent); + --switchOnFg: rgb(255, 255, 255); +} + +._woodenFrameH { + display: flex; + gap: 6px; +} + +._woodenFrameInner { + padding: 8px; + margin-top: 8px; + background: var(--bg); + box-shadow: 0 0 2px 1px #ce8a5c, inset 0 0 1px 1px #693410; + border-radius: 6px; + color: var(--fg); + + &:first-child { + margin-top: 0; + } +} + ._transition_zoom-enter-active, ._transition_zoom-leave-active { transition: opacity 0.5s, transform 0.5s !important; } |