v0.2.0: i18n 18 idiomas + pantalla ajustes + bancos multiidioma

Internacionalización completa:
- 18 ficheros .arb: es, en, fr, pt, de, it, ru, ja, ko, zh, zh_TW, ar, hi, tr, pl, nl, ca, eu
- Todos los strings extraídos de todas las pantallas
- Detección automática de idioma del sistema
- Selector manual en pantalla de ajustes

Pantalla de ajustes nueva:
- Selector de idioma con banderas emoji
- Vibración ON/OFF
- Acerca de (versión, desarrollador)

Bancos de palabras multiidioma:
- palabras.json (castellano, 1000 palabras)
- palabras_en.json (inglés, 1000 palabras)
- palabras_fr.json (francés, 1000 palabras)
- Fallback a castellano si no hay banco del idioma

13138 líneas Dart, 39 ficheros, 0 issues en flutter analyze
This commit is contained in:
ShanaiaBot
2026-04-04 01:18:09 +02:00
parent de2c8ffa18
commit 1bca50af1d
56 changed files with 14389 additions and 201 deletions

224
lib/l10n/app_ja.arb Normal file
View File

@@ -0,0 +1,224 @@
{
"@@locale": "ja",
"appTitle": "インポスター",
"subtitle": "正体推理ゲーム",
"loadingWords": "ワードを読み込み中...",
"playersRange": "3-20人 • インターネット不要",
"createGame": "ゲームを作成",
"joinGame": "ゲームに参加",
"howToPlay": "遊び方",
"settings": "設定",
"gameMode": "ゲームモード",
"singleDevice": "1台で遊ぶ",
"multiDevice": "複数台で遊ぶ",
"category": "カテゴリー",
"categoryAll": "すべて",
"categoryAnimals": "動物",
"categoryFood": "食べ物",
"categoryCountries": "国",
"categorySports": "スポーツ",
"categoryProfessions": "職業",
"categoryObjects": "物",
"categoryPlaces": "場所",
"categoryMovies": "映画",
"categoryMusic": "音楽",
"categoryTechnology": "テクノロジー",
"playersCount": "プレイヤー ({count})",
"@playersCount": {
"placeholders": {
"count": {"type": "int"}
}
},
"playersRangeHint": "3-20",
"playerNameHint": "プレイヤー名",
"playerAlreadyExists": "同じ名前のプレイヤーがすでにいます",
"maxPlayersReached": "最大20人までです",
"minPlayersRequired": "最低3人必要です",
"configuration": "設定",
"impostors": "🎭 インポスター",
"impostorClue": "🔍 インポスターへのヒント",
"impostorClueDescription": "インポスターにカテゴリーが表示されます",
"debateTime": "⏱️ 議論の時間",
"noLimit": "制限なし",
"oneMin": "1分",
"twoMin": "2分",
"threeMin": "3分",
"fiveMin": "5分",
"startGame": "ゲーム開始",
"seeYourWord": "自分のワードを見る",
"eachPlayerMustSee": "各プレイヤーは秘密にワードを確認してください",
"roundNumber": "ラウンド {round}",
"@roundNumber": {
"placeholders": {
"round": {"type": "int"}
}
},
"alreadySeen": "ワードを確認済み",
"tapToSee": "タップして確認",
"allSeenStartDebate": "全員確認済み → 議論を開始",
"playersRemaining": "残り {count} 人",
"@playersRemaining": {
"placeholders": {
"count": {"type": "int"}
}
},
"youAreImpostor": "あなたはインポスターです!",
"yourWordIs": "あなたのワード:",
"clueCategory": "ヒント: {category}",
"@clueCategory": {
"placeholders": {
"category": {"type": "String"}
}
},
"holdToSeeWord": "長押しでワードを確認",
"makeSureNoOneLooks": "他の人に見られないようにしてください",
"showingWord": "👁️ 表示中...",
"holdToSee": "👆 長押しで確認",
"seenMyWord": "ワードを確認しました",
"debateRound": "議論 - ラウンド {round}",
"@debateRound": {
"placeholders": {
"round": {"type": "int"}
}
},
"timeUp": "⏰ 時間切れ!",
"timeRemaining": "⏱️ 残り時間",
"playersInDebate": "議論中のプレイヤー",
"activePlayersInfo": "{active} 人参加中 • {impostors} 人のインポスターが潜伏中",
"@activePlayersInfo": {
"placeholders": {
"active": {"type": "int"},
"impostors": {"type": "int"}
}
},
"eliminated": "脱落",
"notes": "メモ",
"goToVoting": "投票へ進む",
"voting": "🗳️ 投票",
"turnToVote": "投票の番:",
"votesProgress": "投票: {current}/{total}",
"@votesProgress": {
"placeholders": {
"current": {"type": "int"},
"total": {"type": "int"}
}
},
"whoIsImpostor": "誰がインポスターだと思いますか?",
"confirmVote": "投票を確定",
"votingComplete": "🗳️ 投票完了",
"allVoted": "全員が投票しました!",
"tapToReveal": "タップして結果を見る",
"revealResult": "結果を発表",
"result": "結果",
"revealing": "発表中...",
"wasImpostor": "インポスターでした! 🎉",
"wasInnocent": "一般市民でした 😱",
"votesThisRound": "このラウンドの投票",
"seeEndResult": "最終結果を見る",
"impostorGuessWord": "インポスターがワードを当てる?",
"nextRound": "次のラウンドへ",
"impostorGuessTitle": "🎯 インポスターの推理",
"impostorCanGuess": "脱落したインポスターは\nワードを当てることができます",
"ifCorrectImpostorsWin": "正解すればインポスターの勝ちです!",
"guessWordHint": "ワードは何だと思いますか?",
"dontGuess": "推理しない",
"guess": "当てる",
"correctGuess": "正解!",
"theWordWas": "ワードは: {word}",
"@theWordWas": {
"placeholders": {
"word": {"type": "String"}
}
},
"impostorsWin": "インポスターの勝利!",
"wrongGuess": "不正解!",
"gameContinues": "ゲームは続きます...",
"gameOver": "ゲーム終了",
"playersWin": "プレイヤーの勝利!",
"theSecretWordWas": "🔍 ワードは:",
"categoryLabel": "カテゴリー: {category}",
"@categoryLabel": {
"placeholders": {
"category": {"type": "String"}
}
},
"theImpostorWas": "🎭 インポスターは:",
"theImpostorsWere": "🎭 インポスターたちは:",
"votingHistory": "📊 投票の履歴",
"roundElimination": "ラウンド {round}: {name}",
"@roundElimination": {
"placeholders": {
"round": {"type": "int"},
"name": {"type": "String"}
}
},
"rematch": "もう一度",
"mainMenu": "メインメニュー",
"notesTitle": "📝 メモ",
"notesSaved": "メモを保存しました",
"whoAreYou": "あなたは誰?",
"selectYourName": "名前を選んで自分のメモを見る",
"notesOf": "{name}のメモ",
"@notesOf": {
"placeholders": {
"name": {"type": "String"}
}
},
"notesAboutPlayers": "各プレイヤーについてのメモ",
"playerNoteHint": "何を言った?怪しい?",
"freeNote": "フリーメモ",
"freeNoteHint": "個人メモ...",
"rulesTitle": "📖 遊び方",
"rulesWhatIsTitle": "🎭 インポスターとは?",
"rulesWhatIsBody": "3〜20人で遊べる正体推理ゲームです。全員にお題のワードが配られますが…インポスターだけは知りませんあなたの使命誰がなりすましているかを見抜くことです。",
"rulesHowToPlayTitle": "🔍 遊び方は?",
"rulesHowToPlayBody": "1. 役割の配布:全員に同じワードが配られますが、インポスターには配られません。\n\n2. 議論:順番に、各プレイヤーがワードを直接言わずに説明します。インポスターは知っているフリをしなければなりません。\n\n3. 投票:議論が終わったら、全員がインポスターだと思う人に投票します。\n\n4. 脱落:最も票を集めた人が脱落し、インポスターかどうかが明かされます。\n\n5. インポスターだった場合、ワードを当てるチャンスがあります。当たればインポスターの勝ち!",
"rulesWhoWinsTitle": "🏆 誰が勝つ?",
"rulesWhoWinsBody": "• プレイヤー:すべてのインポスターを脱落させれば勝利。\n• インポスター:正体がバレずに一般プレイヤーと同数以下になるまで残れば勝利。また、脱落時にワードを当てても勝利。",
"rulesTipsPlayersTitle": "💡 プレイヤーへのアドバイス",
"rulesTipsPlayersBody": "• ワードを知っていると証明できるさりげないヒントを出しましょう。ただし、インポスターに利用されるほど分かりやすくしないこと。\n• 曖昧で抽象的な回答をする人に注目しましょう。\n• メモを活用して各自の発言を記録しましょう。\n• ワードを直接言ってはいけません。インポスターを助けることになります!",
"rulesTipsImpostorTitle": "🎭 インポスターへのアドバイス",
"rulesTipsImpostorBody": "• 他のプレイヤーのヒントをよく聞きましょう。\n• ワードを推測して、もっともらしいヒントを出しましょう。\n• 自信がなければ最初に話さないようにしましょう。\n• カテゴリーがヒントとして出されたら、それを利用しましょう。\n• 他の人を疑って注意をそらしましょう。",
"rulesModesTitle": "📱 ゲームモード",
"rulesModesBody": "• 1台で遊ぶ端末を全員で共有します。各プレイヤーはボタンを長押しして自分のワードを確認します。\n\n• 複数台で遊ぶ各プレイヤーが自分の端末を使います。Bluetooth/WiFi Directで接続、インターネット不要。",
"rulesExampleTitle": "✏️ ゲームの例",
"rulesExampleBody": "お題のワード:「ピザ」\n\n• さくら:「温かいうちに食べる」 ✓\n• たくや:「箱に入って届く」 ✓\n• ゆい(インポスター):「とても人気がある」 🤔\n• けんと:「チーズがのっている」 ✓\n\nゆいの答えはあまりにも曖昧... 怪しい!",
"joinGameTitle": "ゲームに参加",
"multiDeviceMode": "複数台モード",
"scanQrDescription": "ホストが表示するQRコードをスキャンして、Bluetooth/WiFi Direct経由でゲームに接続します。",
"comingSoon": "近日公開",
"nearbyNotAvailable": "複数台接続のNearby Connectionsには、物理的なAndroid端末が必要です。\n\n現時点では「1台で遊ぶ」モードをご利用ください。",
"back": "戻る",
"yes": "はい",
"no": "いいえ",
"cancel": "キャンセル",
"accept": "OK",
"next": "次へ",
"settingsTitle": "設定",
"language": "言語",
"soundVolume": "効果音の音量",
"vibration": "バイブレーション",
"about": "アプリについて",
"version": "バージョン",
"developer": "開発者",
"licenses": "ライセンス"
}