d263c7bf48
- GameGlobal.js: keep upstream SERVER_URL with /ws suffix - en.js/zh.js: merge both settings.nickname and settings.profile keys - SettingsScene.js: keep both nickname row and profile button - server/index.js: merge express app + content security proxy with noServer WebSocket mode and path validation - Add .gitignore for node_modules and .codebuddy
337 lines
13 KiB
JavaScript
337 lines
13 KiB
JavaScript
/**
|
|
* en.js
|
|
* English language pack for Tank Adventure.
|
|
*/
|
|
|
|
module.exports = {
|
|
// ============================================================
|
|
// Common
|
|
// ============================================================
|
|
'common.back': '← Back',
|
|
'common.joinBtn': 'Join',
|
|
'common.cannotConnect': 'Cannot connect to server',
|
|
'common.connectFailed': 'Connection failed',
|
|
'common.disconnected': 'Disconnected from server',
|
|
'common.paused': 'PAUSED',
|
|
'common.tapContinue': 'Tap to continue',
|
|
'common.kicked': 'You have been kicked from the team',
|
|
|
|
// ============================================================
|
|
// Menu Scene
|
|
// ============================================================
|
|
'menu.title': 'Tank Adventure',
|
|
'profile.welcome': 'Welcome {name}!',
|
|
'menu.subtitle': 'TANK WAR',
|
|
'menu.classic': 'Classic',
|
|
'menu.endless': 'Endless',
|
|
'menu.pvp': 'PVP',
|
|
'menu.team3v3': '3v3 Battle',
|
|
'menu.shop': 'Shop',
|
|
'menu.skin': 'Skins',
|
|
'menu.ranking': 'Ranking',
|
|
'menu.settings': 'Settings',
|
|
'menu.profile': 'Profile',
|
|
'menu.chat': 'Chat',
|
|
|
|
// ============================================================
|
|
// Room Scene (PVP)
|
|
// ============================================================
|
|
'room.title': 'PVP Battle',
|
|
'room.idleHint': 'Create a room or join with a code',
|
|
'room.create': 'Create Room',
|
|
'room.join': 'Join Room',
|
|
'room.connecting': 'Connecting{dots}',
|
|
'room.roomCode': 'Room Code:',
|
|
'room.waiting': 'Waiting for opponent{dots}',
|
|
'room.shareHint': 'Share the room code with your friend',
|
|
'room.inputCode': 'Enter Room Code:',
|
|
'room.opponentFound': 'Opponent found!',
|
|
'room.starting': 'Game starting...',
|
|
'room.tapBack': 'Tap anywhere to go back',
|
|
|
|
// ============================================================
|
|
// Team Room Scene (3v3)
|
|
// ============================================================
|
|
'teamRoom.title': '3v3 Team Battle',
|
|
'teamRoom.chooseMode': 'Choose how to play',
|
|
'teamRoom.createTeam': '🎮 Create Team',
|
|
'teamRoom.soloMatch': '⚡ Quick Match',
|
|
'teamRoom.teamId': 'Team: {id}',
|
|
'teamRoom.leader': 'Leader',
|
|
'teamRoom.ready': '✓ Ready',
|
|
'teamRoom.notReady': 'Not Ready',
|
|
'teamRoom.emptySlot': 'Empty',
|
|
'teamRoom.invite': '📨 Invite',
|
|
'teamRoom.startMatch': '🔍 Start Match',
|
|
'teamRoom.disband': 'Disband',
|
|
'teamRoom.readyBtn': '✓ Ready',
|
|
'teamRoom.cancelReady': 'Cancel Ready',
|
|
'teamRoom.leaveTeam': 'Leave Team',
|
|
'teamRoom.matching': 'Matching{dots}',
|
|
'teamRoom.waitTime': 'Waited {seconds}s',
|
|
'teamRoom.cancelMatch': 'Cancel Match',
|
|
'teamRoom.matchFound': 'Match found!',
|
|
'teamRoom.enterBattle': 'Entering battle...',
|
|
'teamRoom.tapBack': 'Tap anywhere to go back',
|
|
'teamRoom.shareTitle': 'Tank 3v3, join the battle!',
|
|
'teamRoom.joining': 'Joining room',
|
|
|
|
// ============================================================
|
|
// PVP Game Scene
|
|
// ============================================================
|
|
'pvp.playerLabel': 'P{slot} (You)',
|
|
'pvp.hp': 'HP x{count}',
|
|
'pvp.kills': 'Kills: {count}',
|
|
'pvp.killDeath': 'K:{kills} D:{deaths}',
|
|
'pvp.respawn': 'Respawning in {seconds}s',
|
|
'pvp.youWin': 'YOU WIN!',
|
|
'pvp.draw': 'DRAW',
|
|
'pvp.youLose': 'YOU LOSE',
|
|
'pvp.baseHpSummary': 'P1: {hp1} HP | P2: {hp2} HP',
|
|
|
|
// ============================================================
|
|
// Team Game Scene (3v3)
|
|
// ============================================================
|
|
'team.teamA': 'Team A',
|
|
'team.teamB': 'Team B',
|
|
'team.myTeam': 'You: {team} Team',
|
|
'team.killDeath': 'K:{kills} D:{deaths}',
|
|
'team.respawn': 'Respawning in {seconds}s',
|
|
'team.victory': 'VICTORY!',
|
|
'team.defeat': 'DEFEAT',
|
|
'team.baseHpSummary': 'Team A: {hpA} HP | Team B: {hpB} HP',
|
|
'team.disconnectTitle': '⚠ Connection Lost',
|
|
'team.reconnecting': 'Reconnecting{dots} ({attempts}/{max})',
|
|
'team.reconnectHint': 'Please wait, your tank will be controlled by AI',
|
|
|
|
// ============================================================
|
|
// PVP Result Scene
|
|
// ============================================================
|
|
'pvpResult.title': 'MATCH RESULT',
|
|
'pvpResult.victory': '🏆 VICTORY!',
|
|
'pvpResult.draw': '⚔️ DRAW',
|
|
'pvpResult.defeat': '😵 DEFEAT',
|
|
'pvpResult.kills': 'Kills',
|
|
'pvpResult.deaths': 'Deaths',
|
|
'pvpResult.lives': 'Lives',
|
|
'pvpResult.baseDmg': 'Base DMG',
|
|
'pvpResult.p1BaseHp': 'P1: {hp} HP',
|
|
'pvpResult.p2BaseHp': 'P2: {hp} HP',
|
|
'pvpResult.baseDestroyed': 'Base Destroyed',
|
|
'pvpResult.disconnectedReason': 'Disconnected',
|
|
'pvpResult.duration': 'Match duration: {time}',
|
|
'pvpResult.timeRemaining': 'Time remaining: {time}',
|
|
'pvpResult.rematch': 'Rematch',
|
|
'pvpResult.backMenu': 'Back to Menu',
|
|
|
|
// ============================================================
|
|
// Team Result Scene (3v3)
|
|
// ============================================================
|
|
'teamResult.title': '3v3 MATCH RESULT',
|
|
'teamResult.victory': '🏆 VICTORY!',
|
|
'teamResult.defeat': '😵 DEFEAT',
|
|
'teamResult.teamAHp': 'Team A: {hp} HP',
|
|
'teamResult.teamBHp': 'Team B: {hp} HP',
|
|
'teamResult.baseDestroyed': 'Base Destroyed',
|
|
'teamResult.disconnectedReason': 'Disconnected',
|
|
'teamResult.teamAHeader': 'Team A',
|
|
'teamResult.teamBHeader': 'Team B',
|
|
'teamResult.myTeamSuffix': ' (You)',
|
|
'teamResult.player': 'Player',
|
|
'teamResult.k': 'K',
|
|
'teamResult.d': 'D',
|
|
'teamResult.a': 'A',
|
|
'teamResult.dmg': 'DMG',
|
|
'teamResult.bot': '🤖 Bot',
|
|
'teamResult.duration': 'Match duration: {time}',
|
|
'teamResult.mvp': '⭐ MVP: {name} ({kills} kills)',
|
|
'teamResult.rankUp': '📈 Rank +{points}',
|
|
'teamResult.mvpBonus': '(MVP bonus +5)',
|
|
'teamResult.rankDown': '📉 Rank -{points}',
|
|
'teamResult.rematch': 'Rematch',
|
|
'teamResult.rematchWaiting': 'Waiting({ready}/{total})',
|
|
'teamResult.backMenu': 'Back to Menu',
|
|
|
|
// ============================================================
|
|
// Game Scene (Classic/Endless)
|
|
// ============================================================
|
|
'game.level': 'Level {level}',
|
|
'game.hp': 'HP x{count}',
|
|
'game.fireLevel': 'LV{level}',
|
|
'game.enemies': 'Enemies: {count}',
|
|
'game.score': '{score}pts',
|
|
'game.gameOver': 'GAME OVER',
|
|
'game.stageClear': 'STAGE CLEAR!',
|
|
|
|
// ============================================================
|
|
// Result Scene
|
|
// ============================================================
|
|
'result.victory': '🎉 STAGE CLEAR!',
|
|
'result.defeat': '😵 GAME OVER',
|
|
'result.level': 'Level {level}',
|
|
'result.killStats': 'Kill Statistics',
|
|
'result.tankNormal': 'Normal',
|
|
'result.tankFast': 'Fast',
|
|
'result.tankArmor': 'Armor',
|
|
'result.tankBoss': 'BOSS',
|
|
'result.totalLabel': 'Total',
|
|
'result.rowKills': 'Kills',
|
|
'result.rowScore': 'Score',
|
|
'result.totalScore': 'Total: {score}',
|
|
'result.time': 'Time: {minutes}m{seconds}s',
|
|
'result.baseAlive': 'Base: ✅ Intact',
|
|
'result.baseDestroyed': 'Base: ❌ Destroyed',
|
|
'result.newRecord': '🎊 New Record!',
|
|
'result.doubled': '2x!',
|
|
'result.share': '📤 Share Challenge',
|
|
'result.adDouble': '🎬 Watch Ad for 2x Score',
|
|
'result.nextLevel': 'Next Level →',
|
|
'result.retry': 'Retry',
|
|
'result.backMenu': 'Back to Menu',
|
|
|
|
// ============================================================
|
|
// Ranking Scene
|
|
// ============================================================
|
|
'ranking.title': '🏆 Ranking',
|
|
'ranking.personalRecord': '— Personal Records —',
|
|
'ranking.classicHigh': 'Classic Mode High Score',
|
|
'ranking.endlessHigh': 'Endless Mode High Score',
|
|
'ranking.highestLevel': 'Highest Level Cleared',
|
|
'ranking.levelSuffix': 'Lv',
|
|
'ranking.scoreSuffix': 'pts',
|
|
'ranking.friendHint': 'Friend ranking requires WeChat Open Data Domain',
|
|
|
|
// ============================================================
|
|
// Settings Scene
|
|
// ============================================================
|
|
'settings.title': 'Settings',
|
|
'settings.sound': 'Sound',
|
|
'settings.music': 'Music',
|
|
'settings.vibration': 'Vibration',
|
|
'settings.nickname': 'Display Name',
|
|
'settings.profile': 'Profile',
|
|
|
|
// ============================================================
|
|
// Shop Scene (Simplified)
|
|
// ============================================================
|
|
'shop.title': 'Shop',
|
|
'shop.goldBalance': 'Gold Balance',
|
|
'shop.adFree': 'Remove Ads',
|
|
'shop.adFreeDesc': 'Permanently remove interstitial ads',
|
|
'shop.adFreeOwned': 'Owned',
|
|
'shop.goldPack': 'Gold Pack',
|
|
'shop.goldPackDesc': '1000 Gold',
|
|
'shop.newcomerPack': 'Newcomer Pack',
|
|
'shop.newcomerPackDesc': '500 Gold',
|
|
'shop.newcomerExpired': 'Expired',
|
|
'shop.buy': 'Buy',
|
|
'shop.purchased': 'Purchased',
|
|
|
|
|
|
|
|
// ============================================================
|
|
// Profile Scene
|
|
// ============================================================
|
|
'profile.title': 'Profile',
|
|
'profile.nickname': 'Nickname',
|
|
'profile.signature': 'Signature',
|
|
'profile.description': 'Space Description',
|
|
'profile.changeAvatar': 'Change Avatar',
|
|
'profile.tapToEdit': 'Tap to edit',
|
|
'profile.save': 'Save',
|
|
|
|
// ============================================================
|
|
// Chat Room Scene
|
|
// ============================================================
|
|
'chat.title': 'Chat Room',
|
|
'chat.inputPlaceholder': 'Type a message...',
|
|
'chat.send': 'Send',
|
|
'chat.reportTitle': 'Report',
|
|
'chat.reportPolitics': 'Harmful politics',
|
|
'chat.reportPornography': 'Pornography',
|
|
'chat.reportGambling': 'Gambling & fraud',
|
|
'chat.reportOther': 'Other',
|
|
'chat.reportCancel': 'Cancel',
|
|
|
|
// ============================================================
|
|
// Content Security
|
|
// ============================================================
|
|
'contentSecurity.violation': 'Content contains prohibited information',
|
|
'contentSecurity.nicknameViolation': 'Nickname contains prohibited content',
|
|
'contentSecurity.chatViolation': 'Message failed: content violation',
|
|
'contentSecurity.muted': 'You cannot modify profile due to violation',
|
|
'contentSecurity.mutedChat': 'You are muted, remaining: {time}',
|
|
'contentSecurity.imageViolation': 'Image contains prohibited content',
|
|
'contentSecurity.checking': 'Checking...',
|
|
'contentSecurity.timeout': 'Check timeout, please retry',
|
|
'contentSecurity.reportSuccess': 'Report submitted',
|
|
'contentSecurity.reportFail': 'Report failed',
|
|
|
|
// ============================================================
|
|
// Ad System
|
|
// ============================================================
|
|
'ad.reviveTitle': 'Revive Chance',
|
|
'ad.reviveDesc': 'Choose how to revive and continue',
|
|
'ad.watchAd': '📺 Watch Ad (Free)',
|
|
'ad.goldRevive': '🪙 Gold Revive',
|
|
'ad.giveUp': 'Give Up',
|
|
'ad.doubleReward': '🎬 Watch Ad for 2x Reward',
|
|
'ad.unavailable': 'Ad temporarily unavailable',
|
|
'ad.dailyLimitReached': 'Daily ad recovery limit reached',
|
|
|
|
// ============================================================
|
|
// Currency (Simplified - Gold only)
|
|
// ============================================================
|
|
'currency.gold': 'Gold',
|
|
'currency.insufficient': 'Insufficient Gold',
|
|
'currency.full': 'Gold is full',
|
|
|
|
// ============================================================
|
|
// IAP Products (Simplified)
|
|
// ============================================================
|
|
'iap.adFree': 'Remove Ads (¥18 Permanent)',
|
|
'iap.goldPack': 'Gold Pack (¥6)',
|
|
'iap.newcomerPack': 'Newcomer Pack (¥1)',
|
|
|
|
// ============================================================
|
|
// Buff System
|
|
// ============================================================
|
|
'buff.title': 'Pre-Game Buffs',
|
|
'buff.shield': '🛡️ Shield',
|
|
'buff.shieldDesc': 'Start with a shield layer',
|
|
'buff.doubleFire': '🔥 Double Fire',
|
|
'buff.doubleFireDesc': '2x bullet power for 10s',
|
|
'buff.skip': 'Skip →',
|
|
'buff.start': 'Start Game',
|
|
'buff.purchased': 'Purchased',
|
|
'buff.goldInsufficient': 'Insufficient Gold',
|
|
|
|
// ============================================================
|
|
// Daily Gold
|
|
// ============================================================
|
|
'dailyGold.btn': '🪙 Get Gold',
|
|
'dailyGold.remaining': '{remaining}/3',
|
|
'dailyGold.exhausted': 'Come back tomorrow',
|
|
'dailyGold.reward': '+100 Gold!',
|
|
|
|
// ============================================================
|
|
// Skin System
|
|
// ============================================================
|
|
'skin.title': 'Tank Skins',
|
|
'skin.default': 'Classic',
|
|
'skin.arctic': 'Arctic',
|
|
'skin.inferno': 'Inferno',
|
|
'skin.phantom': 'Phantom',
|
|
'skin.jungle': 'Jungle',
|
|
'skin.neon': 'Neon',
|
|
'skin.nebula': 'Nebula',
|
|
'skin.royal': 'Royal',
|
|
'skin.sakura': 'Sakura',
|
|
'skin.thunder': 'Thunder',
|
|
'skin.diamond': 'Diamond',
|
|
'skin.equipped': '✓ Equipped',
|
|
'skin.owned': 'Owned',
|
|
'skin.equipSuccess': '✓ Skin equipped!',
|
|
'skin.purchaseSuccess': '✓ Skin unlocked!',
|
|
};
|