summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorかっこかり <67428053+kakkokari-gtyih@users.noreply.github.com>2024-02-23 18:07:41 +0900
committerGitHub <noreply@github.com>2024-02-23 18:07:41 +0900
commitd8342322327924a111a8ece0a6c7eb8c9ac2f378 (patch)
tree09ee53f4b8beb95359f077a281bcaaaed5f476cf
parentenhance: リモートのフォロワーから再度Followが来た場合、ac... (diff)
downloadmisskey-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.ts62
-rw-r--r--locales/ja-JP.yml16
-rw-r--r--packages/frontend/src/pages/drop-and-fusion.game.vue120
-rw-r--r--packages/frontend/src/pages/drop-and-fusion.vue56
-rw-r--r--packages/frontend/src/pages/reversi/game.board.vue17
-rw-r--r--packages/frontend/src/style.scss33
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;
}