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

View File

@@ -0,0 +1,939 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for Chinese (`zh`).
class AppLocalizationsZh extends AppLocalizations {
AppLocalizationsZh([String locale = 'zh']) : super(locale);
@override
String get appTitle => '冒牌者';
@override
String get subtitle => '社交推理游戏';
@override
String get loadingWords => '正在加载词汇...';
@override
String get playersRange => '3-20名玩家 • 无需联网';
@override
String get createGame => '创建游戏';
@override
String get joinGame => '加入游戏';
@override
String get howToPlay => '玩法介绍';
@override
String get settings => '设置';
@override
String get gameMode => '游戏模式';
@override
String get singleDevice => '单设备';
@override
String get multiDevice => '多设备';
@override
String get category => '分类';
@override
String get categoryAll => '全部';
@override
String get categoryAnimals => '动物';
@override
String get categoryFood => '食物';
@override
String get categoryCountries => '国家';
@override
String get categorySports => '运动';
@override
String get categoryProfessions => '职业';
@override
String get categoryObjects => '物品';
@override
String get categoryPlaces => '地点';
@override
String get categoryMovies => '电影';
@override
String get categoryMusic => '音乐';
@override
String get categoryTechnology => '科技';
@override
String playersCount(int count) {
return '玩家 ($count)';
}
@override
String get playersRangeHint => '3-20';
@override
String get playerNameHint => '玩家名称';
@override
String get playerAlreadyExists => '已存在同名玩家';
@override
String get maxPlayersReached => '最多20名玩家';
@override
String get minPlayersRequired => '至少需要3名玩家';
@override
String get configuration => '配置';
@override
String get impostors => '🎭 冒牌者';
@override
String get impostorClue => '🔍 给冒牌者的提示';
@override
String get impostorClueDescription => '冒牌者可以知道分类';
@override
String get debateTime => '⏱️ 讨论时间';
@override
String get noLimit => '不限时';
@override
String get oneMin => '1分钟';
@override
String get twoMin => '2分钟';
@override
String get threeMin => '3分钟';
@override
String get fiveMin => '5分钟';
@override
String get startGame => '开始游戏';
@override
String get seeYourWord => '查看你的词语';
@override
String get eachPlayerMustSee => '每位玩家需要秘密查看自己的词语';
@override
String roundNumber(int round) {
return '$round';
}
@override
String get alreadySeen => '已查看词语';
@override
String get tapToSee => '点击查看';
@override
String get allSeenStartDebate => '全员已查看 → 开始讨论';
@override
String playersRemaining(int count) {
return '还剩 $count 位玩家';
}
@override
String get youAreImpostor => '你是冒牌者!';
@override
String get yourWordIs => '你的词语是:';
@override
String clueCategory(String category) {
return '提示:$category';
}
@override
String get holdToSeeWord => '长按查看你的词语';
@override
String get makeSureNoOneLooks => '确保没有其他人在看';
@override
String get showingWord => '👁️ 显示中...';
@override
String get holdToSee => '👆 长按查看';
@override
String get seenMyWord => '我已看过词语';
@override
String debateRound(int round) {
return '讨论 - 第 $round';
}
@override
String get timeUp => '⏰ 时间到!';
@override
String get timeRemaining => '⏱️ 剩余时间';
@override
String get playersInDebate => '参与讨论的玩家';
@override
String activePlayersInfo(int active, int impostors) {
return '$active 名在场 • $impostors 名冒牌者潜伏中';
}
@override
String get eliminated => '已淘汰';
@override
String get notes => '笔记';
@override
String get goToVoting => '前往投票';
@override
String get voting => '🗳️ 投票';
@override
String get turnToVote => '轮到你投票:';
@override
String votesProgress(int current, int total) {
return '投票:$current/$total';
}
@override
String get whoIsImpostor => '你认为谁是冒牌者?';
@override
String get confirmVote => '确认投票';
@override
String get votingComplete => '🗳️ 投票结束';
@override
String get allVoted => '所有人已投票!';
@override
String get tapToReveal => '点击揭晓结果';
@override
String get revealResult => '揭晓结果';
@override
String get result => '结果';
@override
String get revealing => '揭晓中...';
@override
String get wasImpostor => '是冒牌者! 🎉';
@override
String get wasInnocent => '是无辜的 😱';
@override
String get votesThisRound => '本轮投票情况';
@override
String get seeEndResult => '查看最终结果';
@override
String get impostorGuessWord => '冒牌者要猜词吗?';
@override
String get nextRound => '下一轮';
@override
String get impostorGuessTitle => '🎯 冒牌者猜词';
@override
String get impostorCanGuess => '被淘汰的冒牌者可以\n尝试猜出词语';
@override
String get ifCorrectImpostorsWin => '如果猜对,冒牌者获胜!';
@override
String get guessWordHint => '你认为词语是什么?';
@override
String get dontGuess => '不猜';
@override
String get guess => '猜词';
@override
String get correctGuess => '猜对了!';
@override
String theWordWas(String word) {
return '词语是:$word';
}
@override
String get impostorsWin => '冒牌者获胜!';
@override
String get wrongGuess => '猜错了!';
@override
String get gameContinues => '游戏继续...';
@override
String get gameOver => '游戏结束';
@override
String get playersWin => '玩家获胜!';
@override
String get theSecretWordWas => '🔍 词语是:';
@override
String categoryLabel(String category) {
return '分类:$category';
}
@override
String get theImpostorWas => '🎭 冒牌者是:';
@override
String get theImpostorsWere => '🎭 冒牌者们是:';
@override
String get votingHistory => '📊 投票历史';
@override
String roundElimination(int round, String name) {
return '$round 轮:$name';
}
@override
String get rematch => '再来一局';
@override
String get mainMenu => '主菜单';
@override
String get notesTitle => '📝 笔记';
@override
String get notesSaved => '笔记已保存';
@override
String get whoAreYou => '你是谁?';
@override
String get selectYourName => '选择你的名字查看个人笔记';
@override
String notesOf(String name) {
return '$name的笔记';
}
@override
String get notesAboutPlayers => '关于每位玩家的记录';
@override
String get playerNoteHint => '他说了什么?可疑吗?';
@override
String get freeNote => '自由笔记';
@override
String get freeNoteHint => '个人记录...';
@override
String get rulesTitle => '📖 玩法介绍';
@override
String get rulesWhatIsTitle => '🎭 什么是冒牌者?';
@override
String get rulesWhatIsBody =>
'一款3-20人的社交推理游戏。每个人都会收到一个秘密词语......除了冒牌者!你的任务:找出谁在假装。';
@override
String get rulesHowToPlayTitle => '🔍 怎么玩?';
@override
String get rulesHowToPlayBody =>
'1. 分配角色:所有人收到相同的词语,但冒牌者除外。\n\n2. 讨论:轮流发言,每位玩家描述词语但不能直接说出来。冒牌者必须假装知道词语。\n\n3. 投票:讨论结束后,所有人投票选出他们认为的冒牌者。\n\n4. 淘汰:得票最多的玩家被淘汰,并揭晓其是否为冒牌者。\n\n5. 如果是冒牌者,可以尝试猜出词语。猜对则冒牌者获胜!';
@override
String get rulesWhoWinsTitle => '🏆 谁能赢?';
@override
String get rulesWhoWinsBody =>
'• 玩家:淘汰所有冒牌者即可获胜。\n• 冒牌者:如果未被识破,坚持到普通玩家人数等于或少于冒牌者人数即可获胜;或者在被淘汰时猜对词语也能获胜。';
@override
String get rulesTipsPlayersTitle => '💡 给玩家的建议';
@override
String get rulesTipsPlayersBody =>
'• 给出能证明你知道词语的微妙提示,但不要太明显以至于被冒牌者利用。\n• 留意那些给出模糊或笼统回答的人。\n• 利用笔记记录每个人说的话。\n• 不要直接说出词语,那会帮到冒牌者!';
@override
String get rulesTipsImpostorTitle => '🎭 给冒牌者的建议';
@override
String get rulesTipsImpostorBody =>
'• 仔细聆听其他人的提示。\n• 尝试推断词语,以便给出可信的提示。\n• 如果没有把握,不要第一个发言。\n• 如果给了你分类提示,好好利用它。\n• 指控别人来转移注意力。';
@override
String get rulesModesTitle => '📱 游戏模式';
@override
String get rulesModesBody =>
'• 单设备:所有人共享一台设备。每位玩家通过长按按钮查看自己的词语。\n\n• 多设备:每位玩家使用自己的设备。通过蓝牙/WiFi Direct连接无需联网。';
@override
String get rulesExampleTitle => '✏️ 游戏示例';
@override
String get rulesExampleBody =>
'秘密词语:\"披萨\"\n\n• 小明:\"趁热吃的\"\n• 小红:\"装在盒子里的\"\n• 小丽(冒牌者):\"非常受欢迎\" 🤔\n• 小刚:\"上面有芝士\"\n\n小丽的回答太笼统了......可疑!';
@override
String get joinGameTitle => '加入游戏';
@override
String get multiDeviceMode => '多设备模式';
@override
String get scanQrDescription => '扫描房主显示的二维码,通过蓝牙/WiFi Direct连接到游戏。';
@override
String get comingSoon => '即将推出';
@override
String get nearbyNotAvailable =>
'多设备连接的Nearby Connections功能需要实体Android设备。\n\n目前请使用\"单设备\"模式,在一台共享设备上进行游戏。';
@override
String get back => '返回';
@override
String get yes => '';
@override
String get no => '';
@override
String get cancel => '取消';
@override
String get accept => '确定';
@override
String get next => '下一步';
@override
String get settingsTitle => '设置';
@override
String get language => '语言';
@override
String get soundVolume => '音效音量';
@override
String get vibration => '振动';
@override
String get about => '关于';
@override
String get version => '版本';
@override
String get developer => '开发者';
@override
String get licenses => '许可证';
}
/// The translations for Chinese, as used in Taiwan (`zh_TW`).
class AppLocalizationsZhTw extends AppLocalizationsZh {
AppLocalizationsZhTw() : super('zh_TW');
@override
String get appTitle => '冒牌者';
@override
String get subtitle => '社交推理遊戲';
@override
String get loadingWords => '正在載入詞彙...';
@override
String get playersRange => '3-20 位玩家 • 無需網路';
@override
String get createGame => '建立遊戲';
@override
String get joinGame => '加入遊戲';
@override
String get howToPlay => '遊戲規則';
@override
String get settings => '設定';
@override
String get gameMode => '遊戲模式';
@override
String get singleDevice => '單機模式';
@override
String get multiDevice => '多機模式';
@override
String get category => '類別';
@override
String get categoryAll => '全部';
@override
String get categoryAnimals => '動物';
@override
String get categoryFood => '食物';
@override
String get categoryCountries => '國家';
@override
String get categorySports => '運動';
@override
String get categoryProfessions => '職業';
@override
String get categoryObjects => '物品';
@override
String get categoryPlaces => '地點';
@override
String get categoryMovies => '電影';
@override
String get categoryMusic => '音樂';
@override
String get categoryTechnology => '科技';
@override
String playersCount(int count) {
return '玩家 ($count)';
}
@override
String get playersRangeHint => '3-20';
@override
String get playerNameHint => '玩家名稱';
@override
String get playerAlreadyExists => '已有同名玩家';
@override
String get maxPlayersReached => '最多 20 位玩家';
@override
String get minPlayersRequired => '至少需要 3 位玩家';
@override
String get configuration => '設定';
@override
String get impostors => '🎭 冒牌者';
@override
String get impostorClue => '🔍 冒牌者提示';
@override
String get impostorClueDescription => '冒牌者可以知道類別';
@override
String get debateTime => '⏱️ 討論時間';
@override
String get noLimit => '無限制';
@override
String get oneMin => '1 分鐘';
@override
String get twoMin => '2 分鐘';
@override
String get threeMin => '3 分鐘';
@override
String get fiveMin => '5 分鐘';
@override
String get startGame => '開始遊戲';
@override
String get seeYourWord => '查看你的詞彙';
@override
String get eachPlayerMustSee => '每位玩家必須私下查看自己的詞彙';
@override
String roundNumber(int round) {
return '$round 回合';
}
@override
String get alreadySeen => '已查看過詞彙';
@override
String get tapToSee => '點擊查看';
@override
String get allSeenStartDebate => '全員已查看 → 開始討論';
@override
String playersRemaining(int count) {
return '還有 $count 位玩家未查看';
}
@override
String get youAreImpostor => '你是冒牌者!';
@override
String get yourWordIs => '你的詞彙是:';
@override
String clueCategory(String category) {
return '提示:$category';
}
@override
String get holdToSeeWord => '長按查看你的詞彙';
@override
String get makeSureNoOneLooks => '請確認沒有其他人在看';
@override
String get showingWord => '👁️ 顯示中...';
@override
String get holdToSee => '👆 長按查看';
@override
String get seenMyWord => '我已看過詞彙';
@override
String debateRound(int round) {
return '討論 - 第 $round 回合';
}
@override
String get timeUp => '⏰ 時間到!';
@override
String get timeRemaining => '⏱️ 剩餘時間';
@override
String get playersInDebate => '參與討論的玩家';
@override
String activePlayersInfo(int active, int impostors) {
return '$active 位在場 • $impostors 位冒牌者潛伏中';
}
@override
String get eliminated => '已淘汰';
@override
String get notes => '筆記';
@override
String get goToVoting => '前往投票';
@override
String get voting => '🗳️ 投票';
@override
String get turnToVote => '輪到你投票:';
@override
String votesProgress(int current, int total) {
return '票數:$current/$total';
}
@override
String get whoIsImpostor => '你認為誰是冒牌者?';
@override
String get confirmVote => '確認投票';
@override
String get votingComplete => '🗳️ 投票完成';
@override
String get allVoted => '所有人都已投票!';
@override
String get tapToReveal => '點擊揭曉結果';
@override
String get revealResult => '揭曉結果';
@override
String get result => '結果';
@override
String get revealing => '揭曉中...';
@override
String get wasImpostor => '是冒牌者! 🎉';
@override
String get wasInnocent => '是無辜的 😱';
@override
String get votesThisRound => '本回合票數';
@override
String get seeEndResult => '查看最終結果';
@override
String get impostorGuessWord => '冒牌者要猜詞彙嗎?';
@override
String get nextRound => '下一回合';
@override
String get impostorGuessTitle => '🎯 冒牌者猜詞';
@override
String get impostorCanGuess => '被淘汰的冒牌者可以\n嘗試猜出正確詞彙';
@override
String get ifCorrectImpostorsWin => '猜對的話,冒牌者就贏了!';
@override
String get guessWordHint => '你覺得詞彙是什麼?';
@override
String get dontGuess => '放棄猜測';
@override
String get guess => '猜測';
@override
String get correctGuess => '猜對了!';
@override
String theWordWas(String word) {
return '正確詞彙是:$word';
}
@override
String get impostorsWin => '冒牌者獲勝!';
@override
String get wrongGuess => '猜錯了!';
@override
String get gameContinues => '遊戲繼續...';
@override
String get gameOver => '遊戲結束';
@override
String get playersWin => '玩家們獲勝!';
@override
String get theSecretWordWas => '🔍 正確詞彙是:';
@override
String categoryLabel(String category) {
return '類別:$category';
}
@override
String get theImpostorWas => '🎭 冒牌者是:';
@override
String get theImpostorsWere => '🎭 冒牌者們是:';
@override
String get votingHistory => '📊 投票紀錄';
@override
String roundElimination(int round, String name) {
return '$round 回合:$name';
}
@override
String get rematch => '再來一局';
@override
String get mainMenu => '主選單';
@override
String get notesTitle => '📝 筆記';
@override
String get notesSaved => '筆記已儲存';
@override
String get whoAreYou => '你是誰?';
@override
String get selectYourName => '選擇你的名字以查看個人筆記';
@override
String notesOf(String name) {
return '$name 的筆記';
}
@override
String get notesAboutPlayers => '關於每位玩家的紀錄';
@override
String get playerNoteHint => '他說了什麼?可疑嗎?';
@override
String get freeNote => '自由筆記';
@override
String get freeNoteHint => '個人筆記...';
@override
String get rulesTitle => '📖 遊戲規則';
@override
String get rulesWhatIsTitle => '🎭 什麼是冒牌者?';
@override
String get rulesWhatIsBody =>
'一款適合 3-20 位玩家的社交推理遊戲。每個人都會收到一個秘密詞彙……除了冒牌者!你的任務:找出誰在假裝。';
@override
String get rulesHowToPlayTitle => '🔍 怎麼玩?';
@override
String get rulesHowToPlayBody =>
'1. 分配角色:所有人獲得相同的詞彙,冒牌者除外。\n\n2. 討論:玩家輪流描述該詞彙,但不能直接說出來。冒牌者必須假裝知道這個詞。\n\n3. 投票:討論結束後,所有人投票選出誰是冒牌者。\n\n4. 淘汰:得票最多的人被淘汰,並揭曉其身份。\n\n5. 如果被淘汰者是冒牌者,可以嘗試猜出詞彙。猜對的話,冒牌者獲勝!';
@override
String get rulesWhoWinsTitle => '🏆 誰會贏?';
@override
String get rulesWhoWinsBody =>
'• 玩家:淘汰所有冒牌者即可獲勝。\n• 冒牌者:如果未被發現且剩餘普通玩家人數等於或少於冒牌者人數,則獲勝;或者被淘汰時猜對詞彙也可獲勝。';
@override
String get rulesTipsPlayersTitle => '💡 玩家攻略';
@override
String get rulesTipsPlayersBody =>
'• 給出巧妙的提示來證明你知道詞彙,但不要太明顯讓冒牌者利用。\n• 注意誰給出了模糊或籠統的回答。\n• 使用筆記功能記錄每個人說了什麼。\n• 不要直接說出詞彙,那會幫到冒牌者!';
@override
String get rulesTipsImpostorTitle => '🎭 冒牌者攻略';
@override
String get rulesTipsImpostorBody =>
'• 仔細聆聽其他人的提示。\n• 嘗試推斷出詞彙,才能給出可信的描述。\n• 如果沒把握,不要第一個發言。\n• 如果獲得了類別提示,善加利用。\n• 指控他人以轉移注意力。';
@override
String get rulesModesTitle => '📱 遊戲模式';
@override
String get rulesModesBody =>
'• 單機模式:所有人共用一台裝置。每位玩家長按按鈕查看自己的詞彙。\n\n• 多機模式每位玩家使用自己的裝置透過藍牙WiFi Direct 連線,無需網路。';
@override
String get rulesExampleTitle => '✏️ 遊戲範例';
@override
String get rulesExampleBody =>
'秘密詞彙:「披薩」\n\n• 小明:「要趁熱吃」 ✓\n• 小華:「裝在盒子裡」 ✓\n• 小美(冒牌者):「很受歡迎」 🤔\n• 小強:「上面有起司」 ✓\n\n小美的回答太籠統了……有嫌疑!';
@override
String get joinGameTitle => '加入遊戲';
@override
String get multiDeviceMode => '多機模式';
@override
String get scanQrDescription => '掃描主機顯示的 QR 碼透過藍牙WiFi Direct 加入遊戲。';
@override
String get comingSoon => '即將推出';
@override
String get nearbyNotAvailable =>
'多機連線功能需要 Android 實體裝置搭配 Nearby Connections。\n\n目前請使用「單機模式」在共用裝置上進行遊戲。';
@override
String get back => '返回';
@override
String get yes => '';
@override
String get no => '';
@override
String get cancel => '取消';
@override
String get accept => '確定';
@override
String get next => '下一步';
@override
String get settingsTitle => '設定';
@override
String get language => '語言';
@override
String get soundVolume => '音效音量';
@override
String get vibration => '震動';
@override
String get about => '關於';
@override
String get version => '版本';
@override
String get developer => '開發者';
@override
String get licenses => '授權條款';
}