From be9fc77605cdd71d4fd0241117dd7c97262f1447 Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Tue, 23 Dec 2025 16:11:12 -0600 Subject: [PATCH] Signed-off-by: Matt Bruce --- Blackjack/Blackjack/Engine/GameState.swift | 214 +- Blackjack/Blackjack/Models/GameResult.swift | 49 + Blackjack/Blackjack/Models/GameSettings.swift | 8 + Blackjack/Blackjack/Models/SideBet.swift | 229 + .../Blackjack/Resources/Localizable.xcstrings | 8095 +++++++++-------- .../Blackjack/Storage/BlackjackGameData.swift | 2 + .../Blackjack/Views/Game/GameTableView.swift | 9 +- .../Views/Sheets/ResultBannerView.swift | 91 + .../Views/Sheets/RulesHelpView.swift | 37 + .../Blackjack/Views/Sheets/SettingsView.swift | 10 + .../Views/Table/BettingZoneView.swift | 140 +- .../Views/Table/BlackjackTableView.swift | 56 +- .../Views/Table/PlayerHandView.swift | 9 +- .../Views/Table/SideBetToastView.swift | 141 + .../Views/Table/SideBetZoneView.swift | 163 + 15 files changed, 5217 insertions(+), 4036 deletions(-) create mode 100644 Blackjack/Blackjack/Models/SideBet.swift create mode 100644 Blackjack/Blackjack/Views/Table/SideBetToastView.swift create mode 100644 Blackjack/Blackjack/Views/Table/SideBetZoneView.swift diff --git a/Blackjack/Blackjack/Engine/GameState.swift b/Blackjack/Blackjack/Engine/GameState.swift index 6430204..fae7647 100644 --- a/Blackjack/Blackjack/Engine/GameState.swift +++ b/Blackjack/Blackjack/Engine/GameState.swift @@ -36,6 +36,23 @@ final class GameState { /// Insurance bet amount. var insuranceBet: Int = 0 + // MARK: - Side Bets + + /// Perfect Pairs side bet amount. + var perfectPairsBet: Int = 0 + + /// 21+3 side bet amount. + var twentyOnePlusThreeBet: Int = 0 + + /// Result of Perfect Pairs bet (set after deal). + var perfectPairsResult: PerfectPairsResult? + + /// Result of 21+3 bet (set after deal). + var twentyOnePlusThreeResult: TwentyOnePlusThreeResult? + + /// Whether to show side bet toast notifications. + var showSideBetToasts: Bool = false + /// Whether a reshuffle notification should be shown. var showReshuffleNotification: Bool = false @@ -105,8 +122,57 @@ final class GameState { /// Whether player can place a bet. /// True if in betting phase, have balance, and haven't hit max bet. - var canBet: Bool { - currentPhase == .betting && balance > 0 && currentBet < settings.maxBet + /// Whether in betting phase (matches Baccarat's canPlaceBet). + var canPlaceBet: Bool { + currentPhase == .betting + } + + /// Whether the main bet can accept more chips of the given amount. + /// Matches Baccarat's canAddToBet pattern. + func canAddToMainBet(amount: Int) -> Bool { + currentBet + amount <= settings.maxBet + } + + /// Whether a specific side bet can accept more chips of the given amount. + /// Matches Baccarat's canAddToBet pattern. + func canAddToSideBet(type: SideBetType, amount: Int) -> Bool { + guard settings.sideBetsEnabled else { return false } + let currentAmount: Int + switch type { + case .perfectPairs: + currentAmount = perfectPairsBet + case .twentyOnePlusThree: + currentAmount = twentyOnePlusThreeBet + } + return currentAmount + amount <= settings.maxBet + } + + /// Whether a bet type is at max. + func isAtMax(main: Bool = false, sideType: SideBetType? = nil) -> Bool { + if main { + return currentBet >= settings.maxBet + } + if let type = sideType { + switch type { + case .perfectPairs: + return perfectPairsBet >= settings.maxBet + case .twentyOnePlusThree: + return twentyOnePlusThreeBet >= settings.maxBet + } + } + return false + } + + /// The minimum bet level across all active bet types. + /// Used by chip selector to determine if chips should be enabled. + /// Returns the smallest bet so chips stay enabled if ANY bet type can accept more. + var minBetForChipSelector: Int { + if settings.sideBetsEnabled { + // Return the minimum of all bet types so chips stay enabled if any can be increased + return min(currentBet, perfectPairsBet, twentyOnePlusThreeBet) + } else { + return currentBet + } } /// Whether the current hand can hit. @@ -315,24 +381,49 @@ final class GameState { // MARK: - Betting - /// Places a bet. + /// Places a main bet. + /// Places a main bet. Matches Baccarat's placeBet pattern. func placeBet(amount: Int) { - guard canBet else { return } - guard currentBet + amount <= settings.maxBet else { return } + guard canPlaceBet else { return } guard balance >= amount else { return } + guard canAddToMainBet(amount: amount) else { return } currentBet += amount balance -= amount sound.play(.chipPlace) } - /// Clears the current bet. - func clearBet() { - balance += currentBet - currentBet = 0 + /// Places a side bet (Perfect Pairs or 21+3). + /// Matches Baccarat's placeBet pattern for side bets. + func placeSideBet(type: SideBetType, amount: Int) { + guard canPlaceBet else { return } + guard balance >= amount else { return } + guard canAddToSideBet(type: type, amount: amount) else { return } + + switch type { + case .perfectPairs: + perfectPairsBet += amount + case .twentyOnePlusThree: + twentyOnePlusThreeBet += amount + } + balance -= amount sound.play(.chipPlace) } + /// Clears all bets (main and side bets). + func clearBet() { + balance += currentBet + perfectPairsBet + twentyOnePlusThreeBet + currentBet = 0 + perfectPairsBet = 0 + twentyOnePlusThreeBet = 0 + sound.play(.chipPlace) + } + + /// Total amount bet (main + side bets). + var totalBetAmount: Int { + currentBet + perfectPairsBet + twentyOnePlusThreeBet + } + // MARK: - Dealing /// Whether the player can deal (betting phase with valid bet). @@ -360,6 +451,8 @@ final class GameState { dealerHand = BlackjackHand() activeHandIndex = 0 insuranceBet = 0 + perfectPairsResult = nil + twentyOnePlusThreeResult = nil let delay = settings.showAnimations ? 0.3 * settings.dealingSpeed : 0 @@ -381,6 +474,9 @@ final class GameState { } } + // Evaluate side bets after initial cards are dealt + evaluateSideBets() + // Check for insurance offer (only in American style with hole card) if !settings.noHoleCard, let upCard = dealerUpCard, engine.shouldOfferInsurance(dealerUpCard: upCard) { currentPhase = .insurance @@ -652,6 +748,66 @@ final class GameState { await completeRound() } + // MARK: - Side Bets + + /// Evaluates side bets based on the initial deal. + private func evaluateSideBets() { + guard settings.sideBetsEnabled else { return } + + let playerCards = playerHands[0].cards + guard playerCards.count >= 2 else { return } + + // Evaluate Perfect Pairs + if perfectPairsBet > 0 { + perfectPairsResult = SideBetEvaluator.evaluatePerfectPairs( + card1: playerCards[0], + card2: playerCards[1] + ) + } + + // Evaluate 21+3 (requires dealer upcard) + if twentyOnePlusThreeBet > 0, let dealerUpCard = dealerUpCard { + twentyOnePlusThreeResult = SideBetEvaluator.evaluateTwentyOnePlusThree( + playerCard1: playerCards[0], + playerCard2: playerCards[1], + dealerUpcard: dealerUpCard + ) + } + + // Show toast notifications if any side bets were placed + if perfectPairsBet > 0 || twentyOnePlusThreeBet > 0 { + showSideBetToasts = true + + // Play sound for side bet result + let ppWon = perfectPairsResult?.isWin ?? false + let topWon = twentyOnePlusThreeResult?.isWin ?? false + if ppWon || topWon { + sound.play(.win) + } + + // Auto-hide toasts after delay + Task { + try? await Task.sleep(for: .seconds(3)) + showSideBetToasts = false + } + } + } + + /// Calculates winnings from side bets. + var sideBetWinnings: Int { + var winnings = 0 + + if let ppResult = perfectPairsResult, ppResult.isWin { + winnings += perfectPairsBet * ppResult.payout + } + + if let topResult = twentyOnePlusThreeResult, topResult.isWin { + winnings += twentyOnePlusThreeBet * topResult.payout + } + + return winnings + } + // MARK: - Round Completion /// Completes the round and calculates payouts. @@ -712,6 +868,17 @@ final class GameState { } } + // Calculate side bet results + let sideBetsTotal = perfectPairsBet + twentyOnePlusThreeBet + let sideBetsWon = sideBetWinnings + if sideBetsWon > 0 { + balance += sideBetsWon + sideBetsTotal // Return bet + winnings + roundWinnings += sideBetsWon + } else if sideBetsTotal > 0 { + // Side bets lost - account for the loss in round winnings + roundWinnings -= sideBetsTotal + } + // Update statistics totalWinnings += roundWinnings if roundWinnings > biggestWin { @@ -727,13 +894,33 @@ final class GameState { bustCount += 1 } - // Create round result with all hand results and per-hand winnings + // Create round result with all hand results, per-hand winnings, and side bets let allHandResults = playerHands.map { $0.result ?? .lose } + + // Calculate individual side bet winnings + let ppWinnings: Int + if let ppResult = perfectPairsResult, perfectPairsBet > 0 { + ppWinnings = ppResult.isWin ? perfectPairsBet * ppResult.payout : -perfectPairsBet + } else { + ppWinnings = 0 + } + + let topWinnings: Int + if let topResult = twentyOnePlusThreeResult, twentyOnePlusThreeBet > 0 { + topWinnings = topResult.isWin ? twentyOnePlusThreeBet * topResult.payout : -twentyOnePlusThreeBet + } else { + topWinnings = 0 + } + lastRoundResult = RoundResult( handResults: allHandResults, handWinnings: perHandWinnings, insuranceResult: insResult, insuranceWinnings: insWinnings, + perfectPairsResult: perfectPairsBet > 0 ? perfectPairsResult : nil, + perfectPairsWinnings: ppWinnings, + twentyOnePlusThreeResult: twentyOnePlusThreeBet > 0 ? twentyOnePlusThreeResult : nil, + twentyOnePlusThreeWinnings: topWinnings, totalWinnings: roundWinnings, wasBlackjack: wasBlackjack ) @@ -782,6 +969,13 @@ final class GameState { // Reset bets currentBet = 0 insuranceBet = 0 + perfectPairsBet = 0 + twentyOnePlusThreeBet = 0 + + // Reset side bet results + perfectPairsResult = nil + twentyOnePlusThreeResult = nil + showSideBetToasts = false // Reset UI state showResultBanner = false diff --git a/Blackjack/Blackjack/Models/GameResult.swift b/Blackjack/Blackjack/Models/GameResult.swift index b83c4f0..83726f0 100644 --- a/Blackjack/Blackjack/Models/GameResult.swift +++ b/Blackjack/Blackjack/Models/GameResult.swift @@ -76,6 +76,17 @@ struct RoundResult: Equatable { let totalWinnings: Int let wasBlackjack: Bool + // MARK: - Side Bets + + /// Perfect Pairs result (nil if no bet placed) + let perfectPairsResult: PerfectPairsResult? + /// Perfect Pairs winnings (positive if won, negative if lost) + let perfectPairsWinnings: Int + /// 21+3 result (nil if no bet placed) + let twentyOnePlusThreeResult: TwentyOnePlusThreeResult? + /// 21+3 winnings (positive if won, negative if lost) + let twentyOnePlusThreeWinnings: Int + /// Convenience initializer without per-hand winnings (backwards compatibility) init(handResults: [HandResult], insuranceResult: HandResult?, totalWinnings: Int, wasBlackjack: Bool) { self.handResults = handResults @@ -84,6 +95,10 @@ struct RoundResult: Equatable { self.insuranceWinnings = 0 self.totalWinnings = totalWinnings self.wasBlackjack = wasBlackjack + self.perfectPairsResult = nil + self.perfectPairsWinnings = 0 + self.twentyOnePlusThreeResult = nil + self.twentyOnePlusThreeWinnings = 0 } /// Full initializer with per-hand winnings @@ -94,6 +109,35 @@ struct RoundResult: Equatable { self.insuranceWinnings = insuranceWinnings self.totalWinnings = totalWinnings self.wasBlackjack = wasBlackjack + self.perfectPairsResult = nil + self.perfectPairsWinnings = 0 + self.twentyOnePlusThreeResult = nil + self.twentyOnePlusThreeWinnings = 0 + } + + /// Full initializer with side bets + init( + handResults: [HandResult], + handWinnings: [Int], + insuranceResult: HandResult?, + insuranceWinnings: Int, + perfectPairsResult: PerfectPairsResult?, + perfectPairsWinnings: Int, + twentyOnePlusThreeResult: TwentyOnePlusThreeResult?, + twentyOnePlusThreeWinnings: Int, + totalWinnings: Int, + wasBlackjack: Bool + ) { + self.handResults = handResults + self.handWinnings = handWinnings + self.insuranceResult = insuranceResult + self.insuranceWinnings = insuranceWinnings + self.perfectPairsResult = perfectPairsResult + self.perfectPairsWinnings = perfectPairsWinnings + self.twentyOnePlusThreeResult = twentyOnePlusThreeResult + self.twentyOnePlusThreeWinnings = twentyOnePlusThreeWinnings + self.totalWinnings = totalWinnings + self.wasBlackjack = wasBlackjack } /// The main/best result for display purposes (first hand, or best if split) @@ -112,6 +156,11 @@ struct RoundResult: Equatable { handResults.count > 1 } + /// Whether this round had any side bets + var hadSideBets: Bool { + perfectPairsResult != nil || twentyOnePlusThreeResult != nil + } + /// Legacy accessor for backwards compatibility var splitHandResult: HandResult? { handResults.count > 1 ? handResults[1] : nil diff --git a/Blackjack/Blackjack/Models/GameSettings.swift b/Blackjack/Blackjack/Models/GameSettings.swift index b1459ea..5234a77 100644 --- a/Blackjack/Blackjack/Models/GameSettings.swift +++ b/Blackjack/Blackjack/Models/GameSettings.swift @@ -132,6 +132,11 @@ final class GameSettings { /// Speed of card dealing (1.0 = normal) var dealingSpeed: Double = 1.0 { didSet { save() } } + // MARK: - Side Bets + + /// Whether side bets (Perfect Pairs, 21+3) are enabled. + var sideBetsEnabled: Bool = false { didSet { save() } } + // MARK: - Display Settings /// Whether to show the cards remaining indicator. @@ -232,6 +237,7 @@ final class GameSettings { self.noHoleCard = data.noHoleCard self.blackjackPayout = data.blackjackPayout self.insuranceAllowed = data.insuranceAllowed + self.sideBetsEnabled = data.sideBetsEnabled self.showAnimations = data.showAnimations self.dealingSpeed = data.dealingSpeed self.showCardsRemaining = data.showCardsRemaining @@ -257,6 +263,7 @@ final class GameSettings { noHoleCard: noHoleCard, blackjackPayout: blackjackPayout, insuranceAllowed: insuranceAllowed, + sideBetsEnabled: sideBetsEnabled, showAnimations: showAnimations, dealingSpeed: dealingSpeed, showCardsRemaining: showCardsRemaining, @@ -283,6 +290,7 @@ final class GameSettings { noHoleCard = false blackjackPayout = 1.5 insuranceAllowed = true + sideBetsEnabled = false showAnimations = true dealingSpeed = 1.0 showCardsRemaining = true diff --git a/Blackjack/Blackjack/Models/SideBet.swift b/Blackjack/Blackjack/Models/SideBet.swift new file mode 100644 index 0000000..a0b2b65 --- /dev/null +++ b/Blackjack/Blackjack/Models/SideBet.swift @@ -0,0 +1,229 @@ +// +// SideBet.swift +// Blackjack +// +// Side bet types and evaluation for Perfect Pairs and 21+3. +// + +import Foundation +import CasinoKit + +// MARK: - Side Bet Types + +/// Available side bet types in Blackjack. +enum SideBetType: String, CaseIterable, Identifiable { + case perfectPairs = "perfectPairs" + case twentyOnePlusThree = "21+3" + + var id: String { rawValue } + + var displayName: String { + switch self { + case .perfectPairs: return String(localized: "Perfect Pairs") + case .twentyOnePlusThree: return String(localized: "21+3") + } + } + + var shortName: String { + switch self { + case .perfectPairs: return "PP" + case .twentyOnePlusThree: return "21+3" + } + } + + var description: String { + switch self { + case .perfectPairs: + return String(localized: "Bet on your first two cards forming a pair") + case .twentyOnePlusThree: + return String(localized: "Poker hand from your first two cards + dealer's upcard") + } + } +} + +// MARK: - Perfect Pairs Results + +/// Perfect Pairs side bet outcomes. +enum PerfectPairsResult: CaseIterable { + case perfectPair // Same rank AND same suit (e.g., K♠ K♠) + case coloredPair // Same rank, same color, different suit (e.g., K♠ K♣) + case mixedPair // Same rank, different color (e.g., K♠ K♥) + case noPair // No pair + + var displayName: String { + switch self { + case .perfectPair: return String(localized: "Perfect Pair") + case .coloredPair: return String(localized: "Colored Pair") + case .mixedPair: return String(localized: "Mixed Pair") + case .noPair: return String(localized: "No Pair") + } + } + + /// Payout multiplier (e.g., 25 means 25:1) + var payout: Int { + switch self { + case .perfectPair: return 25 + case .coloredPair: return 12 + case .mixedPair: return 6 + case .noPair: return 0 + } + } + + var isWin: Bool { + self != .noPair + } +} + +// MARK: - 21+3 Results + +/// 21+3 side bet outcomes (poker hands). +enum TwentyOnePlusThreeResult: CaseIterable { + case suitedTrips // Three of a kind, same suit (e.g., 7♠ 7♠ 7♠) + case straightFlush // Straight + Flush (e.g., 5♠ 6♠ 7♠) + case threeOfAKind // Three of a kind, different suits (e.g., 7♠ 7♥ 7♦) + case straight // Three consecutive ranks (e.g., 5♠ 6♥ 7♦) + case flush // Three cards of same suit (e.g., 2♠ 7♠ K♠) + case nothing // No qualifying hand + + var displayName: String { + switch self { + case .suitedTrips: return String(localized: "Suited Trips") + case .straightFlush: return String(localized: "Straight Flush") + case .threeOfAKind: return String(localized: "Three of a Kind") + case .straight: return String(localized: "Straight") + case .flush: return String(localized: "Flush") + case .nothing: return String(localized: "No Hand") + } + } + + /// Payout multiplier (e.g., 100 means 100:1) + var payout: Int { + switch self { + case .suitedTrips: return 100 + case .straightFlush: return 40 + case .threeOfAKind: return 30 + case .straight: return 10 + case .flush: return 5 + case .nothing: return 0 + } + } + + var isWin: Bool { + self != .nothing + } +} + +// MARK: - Side Bet Evaluation + +/// Evaluates side bet outcomes. +enum SideBetEvaluator { + + /// Evaluates Perfect Pairs bet from player's first two cards. + static func evaluatePerfectPairs(card1: Card, card2: Card) -> PerfectPairsResult { + // Must be same rank for any pair + guard card1.rank == card2.rank else { + return .noPair + } + + // Perfect Pair: same suit + if card1.suit == card2.suit { + return .perfectPair + } + + // Colored Pair: same color (both red or both black), different suit + if card1.suit.isRed == card2.suit.isRed { + return .coloredPair + } + + // Mixed Pair: different color + return .mixedPair + } + + /// Evaluates 21+3 bet from player's first two cards + dealer's upcard. + static func evaluateTwentyOnePlusThree(playerCard1: Card, playerCard2: Card, dealerUpcard: Card) -> TwentyOnePlusThreeResult { + let cards = [playerCard1, playerCard2, dealerUpcard] + let ranks = cards.map { $0.rank } + let suits = cards.map { $0.suit } + + let isFlush = suits.allSatisfy { $0 == suits[0] } + let isStraight = checkStraight(ranks: ranks) + let isThreeOfAKind = ranks.allSatisfy { $0 == ranks[0] } + + // Check from highest payout to lowest + if isThreeOfAKind && isFlush { + return .suitedTrips + } + + if isStraight && isFlush { + return .straightFlush + } + + if isThreeOfAKind { + return .threeOfAKind + } + + if isStraight { + return .straight + } + + if isFlush { + return .flush + } + + return .nothing + } + + /// Checks if three ranks form a straight (consecutive values). + /// Handles A-2-3 and Q-K-A straights. + private static func checkStraight(ranks: [Rank]) -> Bool { + // Convert to numeric values (Ace can be 1 or 14) + let values = ranks.map { rankValue($0) }.sorted() + + // Check normal straight (consecutive) + if values[2] - values[1] == 1 && values[1] - values[0] == 1 { + return true + } + + // Check A-2-3 (values would be [1, 2, 3] after converting Ace to 1) + // But our rankValue gives Ace = 14, so check [2, 3, 14] + let sortedRanks = ranks.sorted { rankValue($0) < rankValue($1) } + let hasAce = sortedRanks.contains(.ace) + let hasTwo = sortedRanks.contains(.two) + let hasThree = sortedRanks.contains(.three) + + if hasAce && hasTwo && hasThree { + return true + } + + return false + } + + /// Converts rank to numeric value for straight checking. + private static func rankValue(_ rank: Rank) -> Int { + switch rank { + case .ace: return 14 // High ace for Q-K-A + case .two: return 2 + case .three: return 3 + case .four: return 4 + case .five: return 5 + case .six: return 6 + case .seven: return 7 + case .eight: return 8 + case .nine: return 9 + case .ten: return 10 + case .jack: return 11 + case .queen: return 12 + case .king: return 13 + } + } +} + +// MARK: - Suit Extension for Color + +extension Suit { + /// Whether this suit is red (hearts, diamonds). + var isRed: Bool { + self == .hearts || self == .diamonds + } +} + diff --git a/Blackjack/Blackjack/Resources/Localizable.xcstrings b/Blackjack/Blackjack/Resources/Localizable.xcstrings index dd1e49f..c4bc264 100644 --- a/Blackjack/Blackjack/Resources/Localizable.xcstrings +++ b/Blackjack/Blackjack/Resources/Localizable.xcstrings @@ -1,6136 +1,6285 @@ { - "sourceLanguage": "en", - "strings": { - "-$%lld": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "-$%lld" + "sourceLanguage" : "en", + "strings" : { + "-$%lld" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "-$%lld" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "-$%lld" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "-$%lld" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "-%lld $" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "-%lld $" } } } }, - "%@": { - "comment": "A label displaying the current true count for a card counting practice session. The argument is the true count, formatted to one decimal place.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "%@" + "%@" : { + "comment" : "A label displaying the current true count for a card counting practice session. The argument is the true count, formatted to one decimal place.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "%@" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "%@" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@" } } } }, - "%lld": { - "comment": "A label displaying the amount wagered in the current hand. The argument is the amount wagered in the current hand.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "%lld" + "%@ bet, pays up to %@" : { + "comment" : "An accessibility label describing the side bet type, the payout, and the current bet amount (if any).", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "%1$@ bet, pays up to %2$@" + } + } + } + }, + "%lld" : { + "comment" : "A label displaying the amount wagered in the current hand. The argument is the amount wagered in the current hand.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "%lld" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "%lld" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld" } } } }, - "%lld.": { - "comment": "A numbered list item with a callout number and accompanying text. The first argument is the number of the item. The second argument is the text of the item.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "%lld." + "%lld." : { + "comment" : "A numbered list item with a callout number and accompanying text. The first argument is the number of the item. The second argument is the text of the item.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "%lld." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "%lld." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld." } } } }, - "%lldpx": { - "comment": "A text label displaying the size of the app icon. The argument is the size of the icon in pixels.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "%lldpx" + "%lldpx" : { + "comment" : "A text label displaying the size of the app icon. The argument is the size of the icon in pixels.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lldpx" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "%lldpx" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lldpx" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "%lldpx" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lldpx" } } } }, - "•": { - "comment": "A bullet point symbol used in lists.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "•" + "•" : { + "comment" : "A bullet point symbol used in lists.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "•" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "•" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "•" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "•" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "•" } } } }, - "• Add to Assets.xcassets/AppIcon": { - "comment": "A bullet point describing how to add an app icon to Xcode's asset catalog.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "• Add to Assets.xcassets/AppIcon" + "• Add to Assets.xcassets/AppIcon" : { + "comment" : "A bullet point describing how to add an app icon to Xcode's asset catalog.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "• Add to Assets.xcassets/AppIcon" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "• Agregar a Assets.xcassets/AppIcon" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "• Agregar a Assets.xcassets/AppIcon" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "• Ajouter à Assets.xcassets/AppIcon" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "• Ajouter à Assets.xcassets/AppIcon" } } } }, - "• Call IconRenderer.renderAppIcon(config: .blackjack)": { - "comment": "A bullet point in the \"Option 2: Use IconRenderer in Code\" section of the BrandingPreviewView.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "• Call IconRenderer.renderAppIcon(config: .blackjack)" + "• Call IconRenderer.renderAppIcon(config: .blackjack)" : { + "comment" : "A bullet point in the \"Option 2: Use IconRenderer in Code\" section of the BrandingPreviewView.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "• Call IconRenderer.renderAppIcon(config: .blackjack)" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "• Llamar IconRenderer.renderAppIcon(config: .blackjack)" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "• Llamar IconRenderer.renderAppIcon(config: .blackjack)" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "• Appeler IconRenderer.renderAppIcon(config: .blackjack)" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "• Appeler IconRenderer.renderAppIcon(config: .blackjack)" } } } }, - "• Run the preview in Xcode": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "• Run the preview in Xcode" + "• Run the preview in Xcode" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "• Run the preview in Xcode" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "• Ejecutar la vista previa en Xcode" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "• Ejecutar la vista previa en Xcode" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "• Exécuter l'aperçu dans Xcode" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "• Exécuter l'aperçu dans Xcode" } } } }, - "• Save the resulting UIImage to files": { - "comment": "A step in the process of exporting app icons.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "• Save the resulting UIImage to files" + "• Save the resulting UIImage to files" : { + "comment" : "A step in the process of exporting app icons.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "• Save the resulting UIImage to files" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "• Guardar la UIImage resultante en archivos" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "• Guardar la UIImage resultante en archivos" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "• Enregistrer l'UIImage résultante dans les fichiers" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "• Enregistrer l'UIImage résultante dans les fichiers" } } } }, - "• Screenshot the 1024px icon": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "• Screenshot the 1024px icon" + "• Screenshot the 1024px icon" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "• Screenshot the 1024px icon" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "• Capturar el icono de 1024px" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "• Capturar el icono de 1024px" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "• Capturer l'icône 1024px" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "• Capturer l'icône 1024px" } } } }, - "• Use an online tool to generate all sizes": { - "comment": "A step in the process of exporting app icons.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "• Use an online tool to generate all sizes" + "• Use an online tool to generate all sizes" : { + "comment" : "A step in the process of exporting app icons.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "• Use an online tool to generate all sizes" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "• Usar una herramienta en línea para generar todos los tamaños" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "• Usar una herramienta en línea para generar todos los tamaños" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "• Utiliser un outil en ligne pour générer toutes les tailles" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "• Utiliser un outil en ligne pour générer toutes les tailles" } } } }, - "+%@": { - "comment": "A label showing the true count for card counting. The number is formatted to one decimal place.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "+%@" + "+%@" : { + "comment" : "A label showing the true count for card counting. The number is formatted to one decimal place.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "+%@" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "+%@" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "+%@" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "+%@" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "+%@" } } } }, - "+%lld": { - "comment": "A label that displays the running count of cards in a Hi-Lo card counting practice session. The text inside the label changes color based on whether the count is positive or negative.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "+%lld" + "+%lld" : { + "comment" : "A label that displays the running count of cards in a Hi-Lo card counting practice session. The text inside the label changes color based on whether the count is positive or negative.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "+%lld" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "+%lld" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "+%lld" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "+%lld" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "+%lld" } } } }, - "+$%lld": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "+$%lld" + "+$%lld" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "+$%lld" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "+$%lld" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "+$%lld" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "+%lld $" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "+%lld $" } } } }, - "1 Deck: Lowest house edge (~0.17%), rare to find.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "1 Deck: Lowest house edge (~0.17%), rare to find." + "1 Deck: Lowest house edge (~0.17%), rare to find." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "1 Deck: Lowest house edge (~0.17%), rare to find." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "1 Baraja: Ventaja más baja (~0.17%), difícil de encontrar." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "1 Baraja: Ventaja más baja (~0.17%), difícil de encontrar." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "1 Jeu: Avantage le plus bas (~0.17%), rare à trouver." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "1 Jeu: Avantage le plus bas (~0.17%), rare à trouver." } } } }, - "2 Decks: Low house edge (~0.35%), common online.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "2 Decks: Low house edge (~0.35%), common online." + "2 Decks: Low house edge (~0.35%), common online." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "2 Decks: Low house edge (~0.35%), common online." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "2 Barajas: Ventaja baja (~0.35%), común en línea." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "2 Barajas: Ventaja baja (~0.35%), común en línea." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "2 Jeux: Faible avantage (~0.35%), courant en ligne." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "2 Jeux: Faible avantage (~0.35%), courant en ligne." } } } }, - "2-6: +1 (low cards favor house)": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "2-6: +1 (low cards favor house)" + "2-6: +1 (low cards favor house)" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "2-6: +1 (low cards favor house)" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "2-6: +1 (cartas bajas favorecen la casa)" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "2-6: +1 (cartas bajas favorecen la casa)" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "2-6: +1 (les cartes basses favorisent la maison)" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "2-6: +1 (les cartes basses favorisent la maison)" } } } }, - "2-10: Face value": { - "comment": "Description of the card values for cards with values 2 through 10.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "2-10: Face value" + "2-10: Face value" : { + "comment" : "Description of the card values for cards with values 2 through 10.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "2-10: Face value" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "2-10: Valor nominal" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "2-10: Valor nominal" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "2-10: Valeur faciale" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "2-10: Valeur faciale" } } } }, - "4 Decks: Moderate house edge (~0.45%).": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "4 Decks: Moderate house edge (~0.45%)." + "4 Decks: Moderate house edge (~0.45%)." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "4 Decks: Moderate house edge (~0.45%)." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "4 Barajas: Ventaja moderada (~0.45%)." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "4 Barajas: Ventaja moderada (~0.45%)." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "4 Jeux: Avantage modéré (~0.45%)." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "4 Jeux: Avantage modéré (~0.45%)." } } } }, - "6 decks shuffled together.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "6 decks shuffled together." + "6 decks shuffled together." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "6 decks shuffled together." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "6 barajas mezcladas." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "6 barajas mezcladas." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "6 jeux mélangés ensemble." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "6 jeux mélangés ensemble." } } } }, - "6 Decks: Standard in Vegas (~0.50%).": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "6 Decks: Standard in Vegas (~0.50%)." + "6 Decks: Standard in Vegas (~0.50%)." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "6 Decks: Standard in Vegas (~0.50%)." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "6 Barajas: Estándar en Vegas (~0.50%)." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "6 Barajas: Estándar en Vegas (~0.50%)." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "6 Jeux: Standard à Vegas (~0.50%)." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "6 Jeux: Standard à Vegas (~0.50%)." } } } }, - "6:5 Blackjack (avoid!): Increases house edge by ~1.4%.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "6:5 Blackjack (avoid!): Increases house edge by ~1.4%." + "6:5 Blackjack (avoid!): Increases house edge by ~1.4%." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "6:5 Blackjack (avoid!): Increases house edge by ~1.4%." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Blackjack 6:5 (¡evitar!): Aumenta la ventaja en ~1.4%." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Blackjack 6:5 (¡evitar!): Aumenta la ventaja en ~1.4%." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Blackjack 6:5 (éviter!): Augmente l'avantage de ~1.4%." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Blackjack 6:5 (éviter!): Augmente l'avantage de ~1.4%." } } } }, - "7-9: 0 (neutral cards)": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "7-9: 0 (neutral cards)" + "7-9: 0 (neutral cards)" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "7-9: 0 (neutral cards)" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "7-9: 0 (cartas neutrales)" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "7-9: 0 (cartas neutrales)" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "7-9: 0 (cartes neutres)" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "7-9: 0 (cartes neutres)" } } } }, - "8 decks shuffled together.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "8 decks shuffled together." + "8 decks shuffled together." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "8 decks shuffled together." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "8 barajas mezcladas." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "8 barajas mezcladas." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "8 jeux mélangés ensemble." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "8 jeux mélangés ensemble." } } } }, - "8 Decks: Standard in Atlantic City (~0.55%).": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "8 Decks: Standard in Atlantic City (~0.55%)." + "8 Decks: Standard in Atlantic City (~0.55%)." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "8 Decks: Standard in Atlantic City (~0.55%)." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "8 Barajas: Estándar en Atlantic City (~0.55%)." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "8 Barajas: Estándar en Atlantic City (~0.55%)." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "8 Jeux: Standard à Atlantic City (~0.55%)." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "8 Jeux: Standard à Atlantic City (~0.55%)." } } } }, - "10-A: -1 (high cards favor player)": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "10-A: -1 (high cards favor player)" + "10-A: -1 (high cards favor player)" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "10-A: -1 (high cards favor player)" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "10-A: -1 (cartas altas favorecen al jugador)" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "10-A: -1 (cartas altas favorecen al jugador)" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "10-A: -1 (les cartes hautes favorisent le joueur)" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "10-A: -1 (les cartes hautes favorisent le joueur)" } } } }, - "A 'soft' hand has an Ace counting as 11.": { - "comment": "Explanation of how an Ace can be counted as either 1 or 11 in a hand.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "A 'soft' hand has an Ace counting as 11." + "21+3" : { + "comment" : "Description of the 21+3 side bet type.", + "isCommentAutoGenerated" : true + }, + "21+3: Poker hand from your cards + dealer's upcard." : { + + }, + "A 'soft' hand has an Ace counting as 11." : { + "comment" : "Explanation of how an Ace can be counted as either 1 or 11 in a hand.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "A 'soft' hand has an Ace counting as 11." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Una mano 'suave' tiene un As contando como 11." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Una mano 'suave' tiene un As contando como 11." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Une main 'souple' a un As comptant comme 11." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Une main 'souple' a un As comptant comme 11." } } } }, - "Ace: 1 or 11 (whichever helps your hand)": { - "comment": "Description of how an Ace can be counted as either 1 or 11 in a blackjack hand.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Ace: 1 or 11 (whichever helps your hand)" + "Ace: 1 or 11 (whichever helps your hand)" : { + "comment" : "Description of how an Ace can be counted as either 1 or 11 in a blackjack hand.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ace: 1 or 11 (whichever helps your hand)" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "As: 1 u 11 (lo que ayude a tu mano)" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "As: 1 u 11 (lo que ayude a tu mano)" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "As: 1 ou 11 (selon ce qui aide votre main)" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "As: 1 ou 11 (selon ce qui aide votre main)" } } } }, - "Actions": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Actions" + "Aces can be high or low in straights (A-2-3 or Q-K-A)." : { + + }, + "Actions" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Actions" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Acciones" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Acciones" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Actions" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Actions" } } } }, - "Add $%lld more to meet minimum": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Add $%lld more to meet minimum" + "Add $%lld more to meet minimum" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Add $%lld more to meet minimum" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Añade $%lld más para alcanzar el mínimo" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Añade $%lld más para alcanzar el mínimo" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Ajoutez %lld$ de plus pour atteindre le minimum" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ajoutez %lld$ de plus pour atteindre le minimum" } } } }, - "After generating:": { - "comment": "A heading for instructions on how to use the IconGeneratorView.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "After generating:" + "After generating:" : { + "comment" : "A heading for instructions on how to use the IconGeneratorView.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "After generating:" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Después de generar:" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Después de generar:" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Après la génération:" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Après la génération:" } } } }, - "All Sizes": { - "comment": "A heading that describes the various sizes of the app icon.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "All Sizes" + "All Sizes" : { + "comment" : "A heading that describes the various sizes of the app icon.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "All Sizes" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Todos los tamaños" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Todos los tamaños" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Toutes les tailles" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Toutes les tailles" } } } }, - "Allow doubling on split hands": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Allow doubling on split hands" + "Allow doubling on split hands" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Allow doubling on split hands" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Permitir doblar en manos divididas" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Permitir doblar en manos divididas" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Permettre de doubler sur les mains séparées" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Permettre de doubler sur les mains séparées" } } } }, - "Allow splitting aces again": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Allow splitting aces again" + "Allow splitting aces again" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Allow splitting aces again" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Permitir dividir ases nuevamente" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Permitir dividir ases nuevamente" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Permettre de re-séparer les as" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Permettre de re-séparer les as" } } } }, - "Alternative: Use an online tool": { - "comment": "A section header that suggests using an online tool to generate app icons.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Alternative: Use an online tool" + "Alternative: Use an online tool" : { + "comment" : "A section header that suggests using an online tool to generate app icons.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alternative: Use an online tool" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Alternativa: Usa una herramienta en línea" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alternativa: Usa una herramienta en línea" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Alternative: Utilisez un outil en ligne" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alternative: Utilisez un outil en ligne" } } } }, - "Always split Aces and 8s.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Always split Aces and 8s." + "Always split Aces and 8s." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Always split Aces and 8s." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Siempre divide Ases y 8s." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Siempre divide Ases y 8s." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Toujours séparer les As et les 8." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Toujours séparer les As et les 8." } } } }, - "An Ace + 10-value card dealt initially is 'Blackjack'.": { - "comment": "Description of a blackjack hand.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "An Ace + 10-value card dealt initially is 'Blackjack'." + "An Ace + 10-value card dealt initially is 'Blackjack'." : { + "comment" : "Description of a blackjack hand.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "An Ace + 10-value card dealt initially is 'Blackjack'." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Un As + carta de valor 10 repartidos inicialmente es 'Blackjack'." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Un As + carta de valor 10 repartidos inicialmente es 'Blackjack'." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Un As + carte valant 10 distribués initialement est un 'Blackjack'." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Un As + carte valant 10 distribués initialement est un 'Blackjack'." } } } }, - "App Icon": { - "comment": "A label displayed above the preview of the app icon.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "App Icon" + "App Icon" : { + "comment" : "A label displayed above the preview of the app icon.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "App Icon" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Icono de la app" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Icono de la app" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Icône de l'app" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Icône de l'app" } } } }, - "App Icon Preview": { - "comment": "A title for the preview of the app icon.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "App Icon Preview" + "App Icon Preview" : { + "comment" : "A title for the preview of the app icon.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "App Icon Preview" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Vista previa del icono" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vista previa del icono" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Aperçu de l'icône" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aperçu de l'icône" } } } }, - "Atlantic City": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Atlantic City" + "Atlantic City" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Atlantic City" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Atlantic City" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Atlantic City" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Atlantic City" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Atlantic City" } } } }, - "Baccarat": { - "comment": "The name of a casino game.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Baccarat" + "Baccarat" : { + "comment" : "The name of a casino game.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Baccarat" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Baccarat" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Baccarat" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Baccarat" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Baccarat" } } } }, - "Balance": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Balance" + "Balance" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Balance" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Saldo" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Saldo" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Solde" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Solde" } } } }, - "Basic Strategy": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Basic Strategy" + "Basic Strategy" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basic Strategy" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Estrategia Básica" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Estrategia Básica" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Stratégie de Base" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stratégie de Base" } } } }, - "Basic strategy suggestions": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Basic strategy suggestions" + "Basic strategy suggestions" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basic strategy suggestions" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Sugerencias de estrategia básica" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sugerencias de estrategia básica" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Suggestions de stratégie de base" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Suggestions de stratégie de base" } } } }, - "Beat the dealer by getting a hand value closer to 21 without going over.": { - "comment": "Text for the objective of the game.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Beat the dealer by getting a hand value closer to 21 without going over." + "Beat the dealer by getting a hand value closer to 21 without going over." : { + "comment" : "Text for the objective of the game.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Beat the dealer by getting a hand value closer to 21 without going over." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Vence al crupier obteniendo un valor de mano más cercano a 21 sin pasarte." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vence al crupier obteniendo un valor de mano más cercano a 21 sin pasarte." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Battez le croupier en obtenant une valeur de main plus proche de 21 sans dépasser." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Battez le croupier en obtenant une valeur de main plus proche de 21 sans dépasser." } } } }, - "Best": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Best" + "Best" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Best" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Mejor" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mejor" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Meilleur" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Meilleur" } } } }, - "Bet 2x minimum": { - "comment": "Betting recommendation based on a true count of 1.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Bet 2x minimum" + "Bet 2x minimum" : { + "comment" : "Betting recommendation based on a true count of 1.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bet 2x minimum" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Apuesta 2x mínimo" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Apuesta 2x mínimo" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Mise 2x minimum" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mise 2x minimum" } } } }, - "Bet 4x minimum": { - "comment": "Betting recommendation based on the true count of 4.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Bet 4x minimum" + "Bet 4x minimum" : { + "comment" : "Betting recommendation based on the true count of 4.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bet 4x minimum" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Apuesta 4x mínimo" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Apuesta 4x mínimo" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Mise 4x minimum" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mise 4x minimum" } } } }, - "Bet 6x minimum": { - "comment": "Betting recommendation based on a true count of 3.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Bet 6x minimum" + "Bet 6x minimum" : { + "comment" : "Betting recommendation based on a true count of 3.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bet 6x minimum" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Apuesta 6x mínimo" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Apuesta 6x mínimo" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Mise 6x minimum" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mise 6x minimum" } } } }, - "Bet 8x minimum": { - "comment": "Betting recommendation based on the true count of 4.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Bet 8x minimum" + "Bet 8x minimum" : { + "comment" : "Betting recommendation based on the true count of 4.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bet 8x minimum" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Apuesta 8x mínimo" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Apuesta 8x mínimo" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Mise 8x minimum" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mise 8x minimum" } } } }, - "Bet maximum!": { - "comment": "Betting recommendation to bet the maximum amount when the true count is 5 or higher.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Bet maximum!" + "Bet maximum!" : { + "comment" : "Betting recommendation to bet the maximum amount when the true count is 5 or higher.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bet maximum!" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "¡Apuesta máximo!" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "¡Apuesta máximo!" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Mise maximum!" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mise maximum!" } } } }, - "Bet minimum": { - "comment": "Betting recommendation to bet the minimum amount.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Bet minimum" + "Bet minimum" : { + "comment" : "Betting recommendation to bet the minimum amount.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bet minimum" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Apuesta mínimo" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Apuesta mínimo" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Mise minimum" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mise minimum" } } } }, - "Bet minimum (neutral)": { - "comment": "Betting hint when the true count is 0.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Bet minimum (neutral)" + "Bet minimum (neutral)" : { + "comment" : "Betting hint when the true count is 0.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bet minimum (neutral)" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Apuesta mínimo (neutral)" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Apuesta mínimo (neutral)" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Mise minimum (neutre)" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mise minimum (neutre)" } } } }, - "Bet minimum or sit out": { - "comment": "Betting recommendation to bet the minimum amount or to sit out when the true count is -2 or lower.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Bet minimum or sit out" + "Bet minimum or sit out" : { + "comment" : "Betting recommendation to bet the minimum amount or to sit out when the true count is -2 or lower.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bet minimum or sit out" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Apuesta mínimo o no juegues" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Apuesta mínimo o no juegues" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Mise minimum ou passez" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mise minimum ou passez" } } } }, - "Betting Hint": { - "comment": "A label describing the view that shows betting recommendations.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Betting Hint" + "Bet on your first two cards forming a pair" : { + "comment" : "Description of the Perfect Pairs side bet.", + "isCommentAutoGenerated" : true + }, + "Bet on your first two cards forming a pair." : { + + }, + "Betting Hint" : { + "comment" : "A label describing the view that shows betting recommendations.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Betting Hint" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Consejo de apuesta" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Consejo de apuesta" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Conseil de mise" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Conseil de mise" } } } }, - "BIGGEST SWINGS": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "BIGGEST SWINGS" + "BIGGEST SWINGS" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "BIGGEST SWINGS" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "MAYORES CAMBIOS" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "MAYORES CAMBIOS" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "PLUS GRANDS ÉCARTS" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "PLUS GRANDS ÉCARTS" } } } }, - "Blackjack": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Blackjack" + "Blackjack" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Blackjack" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Blackjack" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Blackjack" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Blackjack" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Blackjack" } } } }, - "BLACKJACK": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "BLACKJACK" + "BLACKJACK" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "BLACKJACK" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "BLACKJACK" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "BLACKJACK" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "BLACKJACK" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "BLACKJACK" } } } }, - "Blackjack pays 3:2 (1.5x your bet).": { - "comment": "Description of the payout for blackjack in the Blackjack rules help view.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Blackjack pays 3:2 (1.5x your bet)." + "Blackjack pays 3:2 (1.5x your bet)." : { + "comment" : "Description of the payout for blackjack in the Blackjack rules help view.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Blackjack pays 3:2 (1.5x your bet)." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Blackjack paga 3:2 (1.5x tu apuesta)." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Blackjack paga 3:2 (1.5x tu apuesta)." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Le Blackjack paie 3:2 (1.5x votre mise)." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Le Blackjack paie 3:2 (1.5x votre mise)." } } } }, - "Blackjack pays 3:2.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Blackjack pays 3:2." + "Blackjack pays 3:2." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Blackjack pays 3:2." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Blackjack paga 3:2." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Blackjack paga 3:2." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Le Blackjack paie 3:2." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Le Blackjack paie 3:2." } } } }, - "Blackjack: 3:2": { - "comment": "Payout description for a Blackjack win.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Blackjack: 3:2" + "Blackjack: 3:2" : { + "comment" : "Payout description for a Blackjack win.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Blackjack: 3:2" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Blackjack: 3:2" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Blackjack: 3:2" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Blackjack: 3:2" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Blackjack: 3:2" } } } }, - "BLACKJACK!": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "BLACKJACK!" + "BLACKJACK!" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "BLACKJACK!" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "¡BLACKJACK!" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "¡BLACKJACK!" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "BLACKJACK!" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "BLACKJACK!" } } } }, - "Blackjacks": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Blackjacks" + "Blackjacks" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Blackjacks" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Blackjacks" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Blackjacks" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Blackjacks" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Blackjacks" } } } }, - "BUST": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "BUST" + "BUST" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "BUST" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "PASADO" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "PASADO" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "SAUTÉ" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "SAUTÉ" } } } }, - "BUST!": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "BUST!" + "BUST!" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "BUST!" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "¡PASADO!" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "¡PASADO!" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "SAUTÉ!" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "SAUTÉ!" } } } }, - "Busts": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Busts" + "Busts" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Busts" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Pasados" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pasados" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Sautés" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sautés" } } } }, - "Cancel": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Cancel" + "Cancel" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancel" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Cancelar" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancelar" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Annuler" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Annuler" } } } }, - "Card Count": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Card Count" + "Card Count" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Card Count" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Conteo de cartas" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Conteo de cartas" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Compte des cartes" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Compte des cartes" } } } }, - "Card Counting": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Card Counting" + "Card Counting" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Card Counting" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Conteo de Cartas" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Conteo de Cartas" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Comptage des Cartes" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Comptage des Cartes" } } } }, - "Card dealing animations": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Card dealing animations" + "Card dealing animations" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Card dealing animations" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Animaciones de reparto" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Animaciones de reparto" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Animations de distribution" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Animations de distribution" } } } }, - "Card Values": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Card Values" + "Card Values" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Card Values" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Valores de cartas" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Valores de cartas" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Valeurs des cartes" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Valeurs des cartes" } } } }, - "Cards Remaining": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Cards Remaining" + "Cards Remaining" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cards Remaining" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Cartas restantes" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cartas restantes" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Cartes restantes" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cartes restantes" } } } }, - "Chips, cards, and results": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Chips, cards, and results" + "Chips, cards, and results" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chips, cards, and results" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Fichas, cartas y resultados" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fichas, cartas y resultados" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Jetons, cartes et résultats" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Jetons, cartes et résultats" } } } }, - "Clear": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Clear" + "Clear" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Clear" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Limpiar" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Limpiar" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Effacer" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Effacer" } } } }, - "Clear All Data": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Clear All Data" + "Clear All Data" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Clear All Data" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Borrar todos los datos" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Borrar todos los datos" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Effacer toutes les données" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Effacer toutes les données" } } } }, - "Clear All Data?": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Clear All Data?" + "Clear All Data?" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Clear All Data?" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "¿Borrar todos los datos?" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "¿Borrar todos los datos?" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Effacer toutes les données?" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Effacer toutes les données?" } } } }, - "CLOUD SYNC": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "CLOUD SYNC" + "CLOUD SYNC" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "CLOUD SYNC" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "SINCRONIZACIÓN EN LA NUBE" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "SINCRONIZACIÓN EN LA NUBE" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "SYNCHRONISATION CLOUD" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "SYNCHRONISATION CLOUD" } } } }, - "Common shoe game": { - "comment": "Description of a deck count option when the user selects 4 decks.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Common shoe game" + "Colored Pair" : { + "comment" : "Description of a Perfect Pairs side bet result when the first two cards form a pair of the same rank but different suit.", + "isCommentAutoGenerated" : true + }, + "Colored Pair (same color): 12:1" : { + + }, + "Common shoe game" : { + "comment" : "Description of a deck count option when the user selects 4 decks.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Common shoe game" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Juego de zapato común" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Juego de zapato común" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Jeu de sabot courant" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Jeu de sabot courant" } } } }, - "Cost: $%lld (half your bet)": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Cost: $%lld (half your bet)" + "Cost: $%lld (half your bet)" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cost: $%lld (half your bet)" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Costo: $%lld (mitad de tu apuesta)" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Costo: $%lld (mitad de tu apuesta)" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Coût: %lld$ (la moitié de votre mise)" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Coût: %lld$ (la moitié de votre mise)" } } } }, - "Costs half your original bet.": { - "comment": "Description of the cost of insurance in the rules help view.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Costs half your original bet." + "Costs half your original bet." : { + "comment" : "Description of the cost of insurance in the rules help view.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Costs half your original bet." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Cuesta la mitad de tu apuesta original." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cuesta la mitad de tu apuesta original." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Coûte la moitié de votre mise initiale." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Coûte la moitié de votre mise initiale." } } } }, - "Count reset to 0": { - "comment": "A description of what happens when the shoe is reshuffled in Blackjack.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Count reset to 0" + "Count reset to 0" : { + "comment" : "A description of what happens when the shoe is reshuffled in Blackjack.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Count reset to 0" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Conteo reiniciado a 0" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Conteo reiniciado a 0" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Compte remis à 0" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Compte remis à 0" } } } }, - "Count resets to 0 when the shoe is shuffled.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Count resets to 0 when the shoe is shuffled." + "Count resets to 0 when the shoe is shuffled." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Count resets to 0 when the shoe is shuffled." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "El conteo se reinicia a 0 cuando se mezcla el zapato." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "El conteo se reinicia a 0 cuando se mezcla el zapato." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Le compte se réinitialise à 0 quand le sabot est mélangé." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Le compte se réinitialise à 0 quand le sabot est mélangé." } } } }, - "Custom": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Custom" + "Current bet $%lld" : { + "comment" : "A hint that appears when a user taps on a side bet zone. The text varies depending on whether a bet is currently placed or not.", + "isCommentAutoGenerated" : true + }, + "Custom" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Custom" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Personalizado" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Personalizado" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Personnalisé" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Personnalisé" } } } }, - "Customize all rules": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Customize all rules" + "Customize all rules" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Customize all rules" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Personalizar todas las reglas" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Personalizar todas las reglas" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Personnaliser toutes les règles" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Personnaliser toutes les règles" } } } }, - "DATA": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "DATA" + "DATA" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "DATA" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "DATOS" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "DATOS" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "DONNÉES" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "DONNÉES" } } } }, - "Deal": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Deal" + "Deal" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Deal" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Repartir" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Repartir" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Distribuer" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Distribuer" } } } }, - "DEALER": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "DEALER" + "DEALER" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "DEALER" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "CRUPIER" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "CRUPIER" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "CROUPIER" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "CROUPIER" } } } }, - "Dealer Hits Soft 17": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Dealer Hits Soft 17" + "Dealer Hits Soft 17" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dealer Hits Soft 17" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Crupier pide en 17 suave" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Crupier pide en 17 suave" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Croupier tire sur 17 souple" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Croupier tire sur 17 souple" } } } }, - "Dealer Hits Soft 17: Increases house edge by ~0.2%.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Dealer Hits Soft 17: Increases house edge by ~0.2%." + "Dealer Hits Soft 17: Increases house edge by ~0.2%." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dealer Hits Soft 17: Increases house edge by ~0.2%." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Crupier pide carta en 17 suave: Aumenta la ventaja en ~0.2%." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Crupier pide carta en 17 suave: Aumenta la ventaja en ~0.2%." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Croupier tire sur 17 souple: Augmente l'avantage de ~0.2%." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Croupier tire sur 17 souple: Augmente l'avantage de ~0.2%." } } } }, - "Dealer must hit on 16 or less.": { - "comment": "Description of the dealer's rule to hit if the hand value is 16 or less.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Dealer must hit on 16 or less." + "Dealer must hit on 16 or less." : { + "comment" : "Description of the dealer's rule to hit if the hand value is 16 or less.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dealer must hit on 16 or less." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "El crupier debe pedir carta con 16 o menos." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "El crupier debe pedir carta con 16 o menos." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Le croupier doit tirer sur 16 ou moins." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Le croupier doit tirer sur 16 ou moins." } } } }, - "Dealer must stand on 17 or more (varies by rules).": { - "comment": "Description of the dealer's rule for standing on a hand value of 17 or higher. Note that this text can vary depending on the specific rules of the game being played.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Dealer must stand on 17 or more (varies by rules)." + "Dealer must stand on 17 or more (varies by rules)." : { + "comment" : "Description of the dealer's rule for standing on a hand value of 17 or higher. Note that this text can vary depending on the specific rules of the game being played.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dealer must stand on 17 or more (varies by rules)." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "El crupier debe plantarse con 17 o más (varía según las reglas)." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "El crupier debe plantarse con 17 o más (varía según las reglas)." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Le croupier doit rester sur 17 ou plus (varie selon les règles)." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Le croupier doit rester sur 17 ou plus (varie selon les règles)." } } } }, - "Dealer Rules": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Dealer Rules" + "Dealer Rules" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dealer Rules" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Reglas del crupier" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Reglas del crupier" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Règles du croupier" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Règles du croupier" } } } }, - "Dealer showing Ace": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Dealer showing Ace" + "Dealer showing Ace" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dealer showing Ace" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "El crupier muestra un As" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "El crupier muestra un As" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Le croupier montre un As" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Le croupier montre un As" } } } }, - "Dealer stands on all 17s (including soft 17).": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Dealer stands on all 17s (including soft 17)." + "Dealer stands on all 17s (including soft 17)." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dealer stands on all 17s (including soft 17)." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "El crupier se planta en todos los 17 (incluyendo 17 suave)." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "El crupier se planta en todos los 17 (incluyendo 17 suave)." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Le croupier reste sur tous les 17 (y compris 17 souple)." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Le croupier reste sur tous les 17 (y compris 17 souple)." } } } }, - "Dealer stands on all 17s.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Dealer stands on all 17s." + "Dealer stands on all 17s." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dealer stands on all 17s." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "El crupier se planta en todos los 17." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "El crupier se planta en todos los 17." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Le croupier reste sur tous les 17." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Le croupier reste sur tous les 17." } } } }, - "Dealer stands on soft 17, double after split, 3:2 blackjack": { - "comment": "Description of the \"Vegas Strip\" blackjack rule variation.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Dealer stands on soft 17, double after split, 3:2 blackjack" + "Dealer stands on soft 17, double after split, 3:2 blackjack" : { + "comment" : "Description of the \"Vegas Strip\" blackjack rule variation.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dealer stands on soft 17, double after split, 3:2 blackjack" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Crupier se planta en 17 suave, doblar después de dividir, blackjack 3:2" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Crupier se planta en 17 suave, doblar después de dividir, blackjack 3:2" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Croupier reste sur 17 souple, doubler après séparation, blackjack 3:2" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Croupier reste sur 17 souple, doubler après séparation, blackjack 3:2" } } } }, - "Dealer stands on soft 17, late surrender, 8 decks": { - "comment": "Description of the \"Atlantic City\" blackjack rule variation.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Dealer stands on soft 17, late surrender, 8 decks" + "Dealer stands on soft 17, late surrender, 8 decks" : { + "comment" : "Description of the \"Atlantic City\" blackjack rule variation.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dealer stands on soft 17, late surrender, 8 decks" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Crupier se planta en 17 suave, rendición tardía, 8 barajas" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Crupier se planta en 17 suave, rendición tardía, 8 barajas" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Croupier reste sur 17 souple, abandon tardif, 8 jeux" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Croupier reste sur 17 souple, abandon tardif, 8 jeux" } } } }, - "Dealer: %@. Value: %@": { - "comment": "Accessibility label for the dealer's hand in the Blackjack game. The text includes a list of the dealer's visible cards and their total value.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Dealer: %1$@. Value: %2$@" + "Dealer: %@. Value: %@" : { + "comment" : "Accessibility label for the dealer's hand in the Blackjack game. The text includes a list of the dealer's visible cards and their total value.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Dealer: %1$@. Value: %2$@" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Crupier: %@. Valor: %@" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Crupier: %@. Valor: %@" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Croupier: %@. Valeur: %@" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Croupier: %@. Valeur: %@" } } } }, - "Dealer: No cards": { - "comment": "Accessibility label for the dealer hand when there are no cards visible.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Dealer: No cards" + "Dealer: No cards" : { + "comment" : "Accessibility label for the dealer hand when there are no cards visible.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dealer: No cards" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Crupier: Sin cartas" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Crupier: Sin cartas" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Croupier: Pas de cartes" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Croupier: Pas de cartes" } } } }, - "Deck Count": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Deck Count" + "Deck Count" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Deck Count" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Número de barajas" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Número de barajas" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Nombre de jeux" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nombre de jeux" } } } }, - "DECK SETTINGS": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "DECK SETTINGS" + "DECK SETTINGS" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "DECK SETTINGS" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "CONFIGURACIÓN DE BARAJAS" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "CONFIGURACIÓN DE BARAJAS" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "PARAMÈTRES DES JEUX" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "PARAMÈTRES DES JEUX" } } } }, - "Decrease bets when the count is negative.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Decrease bets when the count is negative." + "Decrease bets when the count is negative." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Decrease bets when the count is negative." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Disminuye las apuestas cuando el conteo es negativo." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Disminuye las apuestas cuando el conteo es negativo." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Diminuez les mises quand le compte est négatif." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Diminuez les mises quand le compte est négatif." } } } }, - "DISPLAY": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "DISPLAY" + "DISPLAY" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "DISPLAY" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "PANTALLA" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "PANTALLA" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "AFFICHAGE" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "AFFICHAGE" } } } }, - "Done": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Done" + "Done" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Done" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Listo" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Listo" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Terminé" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Terminé" } } } }, - "Double": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Double" + "Double" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Double" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Doblar" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Doblar" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Doubler" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Doubler" } } } }, - "Double After Split": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Double After Split" + "Double After Split" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Double After Split" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Doblar después de dividir" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Doblar después de dividir" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Doubler après séparation" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Doubler après séparation" } } } }, - "Double after split (DAS) allowed.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Double after split (DAS) allowed." + "Double after split (DAS) allowed." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Double after split (DAS) allowed." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Doblar después de dividir (DAS) permitido." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Doblar después de dividir (DAS) permitido." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Doubler après séparation (DAS) autorisé." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Doubler après séparation (DAS) autorisé." } } } }, - "Double After Split (DAS): Reduces house edge by ~0.15%.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Double After Split (DAS): Reduces house edge by ~0.15%." + "Double After Split (DAS): Reduces house edge by ~0.15%." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Double After Split (DAS): Reduces house edge by ~0.15%." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Doblar después de dividir (DAS): Reduce la ventaja en ~0.15%." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Doblar después de dividir (DAS): Reduce la ventaja en ~0.15%." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Doubler après séparation (DAS): Réduit l'avantage de ~0.15%." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Doubler après séparation (DAS): Réduit l'avantage de ~0.15%." } } } }, - "Double after split allowed.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Double after split allowed." + "Double after split allowed." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Double after split allowed." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Doblar después de dividir permitido." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Doblar después de dividir permitido." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Doubler après séparation autorisé." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Doubler après séparation autorisé." } } } }, - "Double Down": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Double Down" + "Double Down" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Double Down" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Doblar" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Doblar" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Doubler" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Doubler" } } } }, - "Double down allowed on any two cards.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Double down allowed on any two cards." + "Double down allowed on any two cards." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Double down allowed on any two cards." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Doblar permitido con cualquier par de cartas." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Doblar permitido con cualquier par de cartas." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Doubler autorisé sur n'importe quelles deux cartes." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Doubler autorisé sur n'importe quelles deux cartes." } } } }, - "Double down on any two cards.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Double down on any two cards." + "Double down on any two cards." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Double down on any two cards." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Doblar con cualquier par de cartas." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Doblar con cualquier par de cartas." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Doubler sur n'importe quelles deux cartes." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Doubler sur n'importe quelles deux cartes." } } } }, - "Double Down: Double your bet, take one card, then stand": { - "comment": "Action available in Blackjack when the player wants to double their bet, take one more card, and then stand.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Double Down: Double your bet, take one card, then stand" + "Double Down: Double your bet, take one card, then stand" : { + "comment" : "Action available in Blackjack when the player wants to double their bet, take one more card, and then stand.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Double Down: Double your bet, take one card, then stand" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Doblar: Duplica tu apuesta, toma una carta, luego plántate" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Doblar: Duplica tu apuesta, toma una carta, luego plántate" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Doubler: Doublez votre mise, prenez une carte, puis restez" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Doubler: Doublez votre mise, prenez une carte, puis restez" } } } }, - "Double instead of Hit (TC %@, deck favors doubling)": { - "comment": "Text explaining a Blackjack strategy recommendation to double down when the true count is favorable. The argument is the formatted true count.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Double instead of Hit (TC %@, deck favors doubling)" + "Double instead of Hit (TC %@, deck favors doubling)" : { + "comment" : "Text explaining a Blackjack strategy recommendation to double down when the true count is favorable. The argument is the formatted true count.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Double instead of Hit (TC %@, deck favors doubling)" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Doblar en vez de Pedir (TC %@, la baraja favorece doblar)" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Doblar en vez de Pedir (TC %@, la baraja favorece doblar)" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Doubler au lieu de Tirer (TC %@, le jeu favorise le double)" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Doubler au lieu de Tirer (TC %@, le jeu favorise le double)" } } } }, - "Double instead of Hit (TC %@, high cards favor you)": { - "comment": "A hint to double down when the true count and the dealer's upcard favor it. The argument is the formatted true count.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Double instead of Hit (TC %@, high cards favor you)" + "Double instead of Hit (TC %@, high cards favor you)" : { + "comment" : "A hint to double down when the true count and the dealer's upcard favor it. The argument is the formatted true count.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Double instead of Hit (TC %@, high cards favor you)" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Doblar en vez de Pedir (TC %@, las cartas altas te favorecen)" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Doblar en vez de Pedir (TC %@, las cartas altas te favorecen)" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Doubler au lieu de Tirer (TC %@, les cartes hautes vous favorisent)" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Doubler au lieu de Tirer (TC %@, les cartes hautes vous favorisent)" } } } }, - "Double instead of Hit (TC %@, slight edge to double)": { - "comment": "Text explaining a situation where doubling is recommended in Blackjack, based on the true count and the dealer's upcard. The argument is the formatted true count.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Double instead of Hit (TC %@, slight edge to double)" + "Double instead of Hit (TC %@, slight edge to double)" : { + "comment" : "Text explaining a situation where doubling is recommended in Blackjack, based on the true count and the dealer's upcard. The argument is the formatted true count.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Double instead of Hit (TC %@, slight edge to double)" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Doblar en vez de Pedir (TC %@, ligera ventaja para doblar)" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Doblar en vez de Pedir (TC %@, ligera ventaja para doblar)" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Doubler au lieu de Tirer (TC %@, léger avantage à doubler)" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Doubler au lieu de Tirer (TC %@, léger avantage à doubler)" } } } }, - "Double on 9, 10, or 11 only (some venues).": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Double on 9, 10, or 11 only (some venues)." + "Double on 9, 10, or 11 only (some venues)." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Double on 9, 10, or 11 only (some venues)." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Doblar solo con 9, 10 u 11 (algunos lugares)." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Doblar solo con 9, 10 u 11 (algunos lugares)." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Doubler sur 9, 10 ou 11 seulement (certains casinos)." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Doubler sur 9, 10 ou 11 seulement (certains casinos)." } } } }, - "Double on 10 vs dealer 2-9.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Double on 10 vs dealer 2-9." + "Double on 10 vs dealer 2-9." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Double on 10 vs dealer 2-9." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Doblar con 10 contra crupier 2-9." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Doblar con 10 contra crupier 2-9." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Doubler sur 10 contre croupier 2-9." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Doubler sur 10 contre croupier 2-9." } } } }, - "Double on 11 vs dealer 2-10.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Double on 11 vs dealer 2-10." + "Double on 11 vs dealer 2-10." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Double on 11 vs dealer 2-10." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Doblar con 11 contra crupier 2-10." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Doblar con 11 contra crupier 2-10." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Doubler sur 11 contre croupier 2-10." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Doubler sur 11 contre croupier 2-10." } } } }, - "Double tap to add chips": { - "comment": "A hint that appears when a user taps on the betting zone, instructing them to double-tap to add chips.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Double tap to add chips" + "Double tap to add chips" : { + "comment" : "A hint that appears when a user taps on the betting zone, instructing them to double-tap to add chips.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Double tap to add chips" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Toca dos veces para agregar fichas" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Toca dos veces para agregar fichas" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Appuyez deux fois pour ajouter des jetons" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Appuyez deux fois pour ajouter des jetons" } } } }, - "Enable 'Card Count' in Settings to practice.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Enable 'Card Count' in Settings to practice." + "Double tap to place bet" : { + "comment" : "A hint text that describes the action to take to place a side bet.", + "isCommentAutoGenerated" : true + }, + "Enable 'Card Count' in Settings to practice." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Enable 'Card Count' in Settings to practice." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Activa 'Conteo de cartas' en Configuración para practicar." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Activa 'Conteo de cartas' en Configuración para practicar." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Activez 'Compte des cartes' dans Paramètres pour pratiquer." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Activez 'Compte des cartes' dans Paramètres pour pratiquer." } } } }, - "European": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "European" + "Enable in Settings to play side bets." : { + + }, + "Enable Side Bets" : { + + }, + "European" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "European" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Europeo" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Europeo" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Européen" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Européen" } } } }, - "Fewer decks = easier to count accurately.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Fewer decks = easier to count accurately." + "Example: K♠ K♠ = Perfect Pair" : { + + }, + "Example: K♠ K♣ = Colored Pair (both black)" : { + + }, + "Example: K♠ K♥ = Mixed Pair (red/black)" : { + + }, + "Fewer decks = easier to count accurately." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fewer decks = easier to count accurately." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Menos barajas = más fácil contar con precisión." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Menos barajas = más fácil contar con precisión." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Moins de jeux = plus facile de compter précisément." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Moins de jeux = plus facile de compter précisément." } } } }, - "Fewer decks favor the player slightly.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Fewer decks favor the player slightly." + "Fewer decks favor the player slightly." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fewer decks favor the player slightly." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Menos barajas favorecen ligeramente al jugador." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Menos barajas favorecen ligeramente al jugador." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Moins de jeux favorisent légèrement le joueur." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Moins de jeux favorisent légèrement le joueur." } } } }, - "GAME STYLE": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "GAME STYLE" + "Flush" : { + "comment" : "Description of a 21+3 side bet outcome when the user has a flush.", + "isCommentAutoGenerated" : true + }, + "Flush (same suit): 5:1" : { + + }, + "Forms a poker hand: your 2 cards + dealer upcard." : { + + }, + "GAME STYLE" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "GAME STYLE" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "ESTILO DE JUEGO" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "ESTILO DE JUEGO" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "STYLE DE JEU" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "STYLE DE JEU" } } } }, - "Generally not recommended by basic strategy.": { - "comment": "Note about the insurance strategy, not directly related to the content of the rule page.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Generally not recommended by basic strategy." + "Generally not recommended by basic strategy." : { + "comment" : "Note about the insurance strategy, not directly related to the content of the rule page.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Generally not recommended by basic strategy." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Generalmente no recomendado por la estrategia básica." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Generalmente no recomendado por la estrategia básica." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Généralement non recommandé par la stratégie de base." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Généralement non recommandé par la stratégie de base." } } } }, - "Generate & Save Icons": { - "comment": "A button label that triggers icon generation and saving.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Generate & Save Icons" + "Generate & Save Icons" : { + "comment" : "A button label that triggers icon generation and saving.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Generate & Save Icons" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Generar y guardar iconos" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Generar y guardar iconos" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Générer et enregistrer les icônes" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Générer et enregistrer les icônes" } } } }, - "Generated Icons:": { - "comment": "A label describing the list of icons that have been successfully generated.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Generated Icons:" + "Generated Icons:" : { + "comment" : "A label describing the list of icons that have been successfully generated.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Generated Icons:" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Iconos generados:" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Iconos generados:" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Icônes générées:" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Icônes générées:" } } } }, - "Generating...": { - "comment": "A label indicating that the app is currently generating icons.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Generating..." + "Generating..." : { + "comment" : "A label indicating that the app is currently generating icons.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Generating..." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Generando..." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Generando..." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Génération..." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Génération..." } } } }, - "H17 rule, increases house edge": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "H17 rule, increases house edge" + "H17 rule, increases house edge" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "H17 rule, increases house edge" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Regla H17, aumenta ventaja de la casa" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Regla H17, aumenta ventaja de la casa" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Règle H17, augmente l'avantage de la maison" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Règle H17, augmente l'avantage de la maison" } } } }, - "Hand %lld": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Hand %lld" + "Hand %lld" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hand %lld" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Mano %lld" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mano %lld" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Main %lld" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Main %lld" } } } }, - "Haptic Feedback": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Haptic Feedback" + "Haptic Feedback" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Haptic Feedback" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Vibración" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vibración" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Retour haptique" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Retour haptique" } } } }, - "Hi-Lo is the most popular counting system.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Hi-Lo is the most popular counting system." + "Hi-Lo is the most popular counting system." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hi-Lo is the most popular counting system." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Hi-Lo es el sistema de conteo más popular." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hi-Lo es el sistema de conteo más popular." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Hi-Lo est le système de comptage le plus populaire." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hi-Lo est le système de comptage le plus populaire." } } } }, - "Higher house edge due to no hole card.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Higher house edge due to no hole card." + "Higher house edge due to no hole card." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Higher house edge due to no hole card." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Mayor ventaja de la casa debido a la ausencia de carta oculta." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mayor ventaja de la casa debido a la ausencia de carta oculta." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Avantage de la maison plus élevé en raison de l'absence de carte cachée." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Avantage de la maison plus élevé en raison de l'absence de carte cachée." } } } }, - "Hint": { - "comment": "A general label for a gameplay hint.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Hint" + "Hint" : { + "comment" : "A general label for a gameplay hint.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hint" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Consejo" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Consejo" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Conseil" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Conseil" } } } }, - "Hint: %@": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Hint: %@" + "Hint: %@" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hint: %@" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Consejo: %@" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Consejo: %@" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Conseil: %@" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Conseil: %@" } } } }, - "Hit": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Hit" + "Hit" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hit" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Pedir" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pedir" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Tirer" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tirer" } } } }, - "Hit instead of Stand (TC %@, deck is poor)": { - "comment": "A hint to the player based on the true count, suggesting they should hit instead of stand. The argument is the true count, displayed with a plus sign if positive.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Hit instead of Stand (TC %@, deck is poor)" + "Hit instead of Stand (TC %@, deck is poor)" : { + "comment" : "A hint to the player based on the true count, suggesting they should hit instead of stand. The argument is the true count, displayed with a plus sign if positive.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hit instead of Stand (TC %@, deck is poor)" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Pedir en vez de Plantarse (TC %@, la baraja es pobre)" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pedir en vez de Plantarse (TC %@, la baraja es pobre)" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Tirer au lieu de Rester (TC %@, le jeu est pauvre)" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tirer au lieu de Rester (TC %@, le jeu est pauvre)" } } } }, - "Hit instead of Stand (TC %@, deck is very poor)": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Hit instead of Stand (TC %@, deck is very poor)" + "Hit instead of Stand (TC %@, deck is very poor)" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hit instead of Stand (TC %@, deck is very poor)" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Pedir en vez de Plantarse (TC %@, la baraja es muy pobre)" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pedir en vez de Plantarse (TC %@, la baraja es muy pobre)" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Tirer au lieu de Rester (TC %@, le jeu est très pauvre)" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tirer au lieu de Rester (TC %@, le jeu est très pauvre)" } } } }, - "Hit on soft 17 or less.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Hit on soft 17 or less." + "Hit on soft 17 or less." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hit on soft 17 or less." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Pide carta con 17 suave o menos." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pide carta con 17 suave o menos." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Tirez sur 17 souple ou moins." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tirez sur 17 souple ou moins." } } } }, - "Hit: Take another card": { - "comment": "Action available in Blackjack: Hit (take another card).", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Hit: Take another card" + "Hit: Take another card" : { + "comment" : "Action available in Blackjack: Hit (take another card).", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hit: Take another card" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Pedir: Toma otra carta" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pedir: Toma otra carta" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Tirer: Prenez une autre carte" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tirer: Prenez une autre carte" } } } }, - "How to Export Icons": { - "comment": "A section header explaining how to export app icons.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "How to Export Icons" + "How to Export Icons" : { + "comment" : "A section header explaining how to export app icons.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "How to Export Icons" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Cómo exportar iconos" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cómo exportar iconos" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Comment exporter les icônes" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Comment exporter les icônes" } } } }, - "How to Play": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "How to Play" + "How to Play" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "How to Play" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Cómo jugar" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cómo jugar" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Comment jouer" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Comment jouer" } } } }, - "iCloud Sync": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "iCloud Sync" + "iCloud Sync" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "iCloud Sync" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Sincronización iCloud" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sincronización iCloud" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Synchronisation iCloud" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Synchronisation iCloud" } } } }, - "iCloud Unavailable": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "iCloud Unavailable" + "iCloud Unavailable" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "iCloud Unavailable" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "iCloud no disponible" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "iCloud no disponible" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "iCloud non disponible" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "iCloud non disponible" } } } }, - "Icon": { - "comment": "The label for the tab item representing the app icon preview.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Icon" + "Icon" : { + "comment" : "The label for the tab item representing the app icon preview.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Icon" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Icono" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Icono" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Icône" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Icône" } } } }, - "Icon Generator": { - "comment": "The title of the Icon Generator view.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Icon Generator" + "Icon Generator" : { + "comment" : "The title of the Icon Generator view.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Icon Generator" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Generador de iconos" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Generador de iconos" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Générateur d'icônes" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Générateur d'icônes" } } } }, - "If both you and dealer have Blackjack, it's a push (tie).": { - "comment": "Description of the outcome when both the player and the dealer have a Blackjack.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "If both you and dealer have Blackjack, it's a push (tie)." + "If both you and dealer have Blackjack, it's a push (tie)." : { + "comment" : "Description of the outcome when both the player and the dealer have a Blackjack.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "If both you and dealer have Blackjack, it's a push (tie)." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Si ambos tienen Blackjack, es empate." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Si ambos tienen Blackjack, es empate." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Si vous et le croupier avez un Blackjack, c'est une égalité." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Si vous et le croupier avez un Blackjack, c'est une égalité." } } } }, - "If the dealer busts and you haven't, you win.": { - "comment": "Description of the outcome when the dealer busts and the player does not.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "If the dealer busts and you haven't, you win." + "If the dealer busts and you haven't, you win." : { + "comment" : "Description of the outcome when the dealer busts and the player does not.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "If the dealer busts and you haven't, you win." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Si el crupier se pasa y tú no, ganas." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Si el crupier se pasa y tú no, ganas." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Si le croupier dépasse et pas vous, vous gagnez." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Si le croupier dépasse et pas vous, vous gagnez." } } } }, - "If you go over 21, you 'bust' and lose immediately.": { - "comment": "Description of the outcome when a player's hand value exceeds 21.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "If you go over 21, you 'bust' and lose immediately." + "If you go over 21, you 'bust' and lose immediately." : { + "comment" : "Description of the outcome when a player's hand value exceeds 21.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "If you go over 21, you 'bust' and lose immediately." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Si te pasas de 21, te 'pasas' y pierdes inmediatamente." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Si te pasas de 21, te 'pasas' y pierdes inmediatamente." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Si vous dépassez 21, vous 'sautez' et perdez immédiatement." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Si vous dépassez 21, vous 'sautez' et perdez immédiatement." } } } }, - "Increase bets when the count is positive.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Increase bets when the count is positive." + "Increase bets when the count is positive." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Increase bets when the count is positive." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Aumenta las apuestas cuando el conteo es positivo." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aumenta las apuestas cuando el conteo es positivo." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Augmentez les mises quand le compte est positif." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Augmentez les mises quand le compte est positif." } } } }, - "Insurance": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Insurance" + "Insurance" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Insurance" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Seguro" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Seguro" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Assurance" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Assurance" } } } }, - "INSURANCE LOSES": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "INSURANCE LOSES" + "INSURANCE LOSES" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "INSURANCE LOSES" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "SEGURO PIERDE" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "SEGURO PIERDE" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "ASSURANCE PERDUE" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "ASSURANCE PERDUE" } } } }, - "INSURANCE WINS": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "INSURANCE WINS" + "INSURANCE WINS" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "INSURANCE WINS" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "SEGURO GANA" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "SEGURO GANA" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "ASSURANCE GAGNÉE" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "ASSURANCE GAGNÉE" } } } }, - "Insurance: 2:1": { - "comment": "Description of the payout for insurance in the game rules guide.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Insurance: 2:1" + "Insurance: 2:1" : { + "comment" : "Description of the payout for insurance in the game rules guide.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Insurance: 2:1" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Seguro: 2:1" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Seguro: 2:1" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Assurance: 2:1" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Assurance: 2:1" } } } }, - "INSURANCE?": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "INSURANCE?" + "INSURANCE?" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "INSURANCE?" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "¿SEGURO?" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "¿SEGURO?" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "ASSURANCE?" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "ASSURANCE?" } } } }, - "Jack, Queen, King: 10": { - "comment": "Card value description for face cards (Jack, Queen, King).", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Jack, Queen, King: 10" + "Jack, Queen, King: 10" : { + "comment" : "Card value description for face cards (Jack, Queen, King).", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Jack, Queen, King: 10" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Jota, Reina, Rey: 10" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Jota, Reina, Rey: 10" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Valet, Dame, Roi: 10" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Valet, Dame, Roi: 10" } } } }, - "Last Synced": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Last Synced" + "Last Synced" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Last Synced" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Última sincronización" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Última sincronización" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Dernière synchronisation" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dernière synchronisation" } } } }, - "Late Surrender": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Late Surrender" + "Late Surrender" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Late Surrender" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Rendición tardía" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rendición tardía" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Abandon tardif" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abandon tardif" } } } }, - "Late surrender available.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Late surrender available." + "Late surrender available." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Late surrender available." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Rendición tardía disponible." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rendición tardía disponible." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Abandon tardif disponible." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abandon tardif disponible." } } } }, - "Late Surrender: Reduces house edge by ~0.07%.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Late Surrender: Reduces house edge by ~0.07%." + "Late Surrender: Reduces house edge by ~0.07%." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Late Surrender: Reduces house edge by ~0.07%." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Rendición tardía: Reduce la ventaja en ~0.07%." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rendición tardía: Reduce la ventaja en ~0.07%." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Abandon tardif: Réduit l'avantage de ~0.07%." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abandon tardif: Réduit l'avantage de ~0.07%." } } } }, - "Launch": { - "comment": "A tab in the BrandingPreviewView that links to the launch screen preview.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Launch" + "Launch" : { + "comment" : "A tab in the BrandingPreviewView that links to the launch screen preview.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Launch" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Lanzamiento" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lanzamiento" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Lancement" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lancement" } } } }, - "LEGAL": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "LEGAL" + "LEGAL" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "LEGAL" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "LEGAL" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "LEGAL" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "LÉGAL" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "LÉGAL" } } } }, - "LOSE": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "LOSE" + "LOSE" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "LOSE" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "PIERDE" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "PIERDE" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "PERDU" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "PERDU" } } } }, - "Losses": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Losses" + "Losses" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Losses" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Pérdidas" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pérdidas" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Pertes" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pertes" } } } }, - "Lower house edge": { - "comment": "Description of a deck count option when the user selects 2 decks.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Lower house edge" + "Lower house edge" : { + "comment" : "Description of a deck count option when the user selects 2 decks.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lower house edge" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Menor ventaja de la casa" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Menor ventaja de la casa" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Avantage maison plus faible" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Avantage maison plus faible" } } } }, - "Main Bet": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Main Bet" + "Main Bet" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Main Bet" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Apuesta principal" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Apuesta principal" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Mise principale" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mise principale" } } } }, - "Main Hand": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Main Hand" + "Main Hand" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Main Hand" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Mano principal" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mano principal" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Main principale" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Main principale" } } } }, - "Max: $%@": { - "comment": "A label displaying the maximum bet amount. The argument is the maximum bet amount.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Max: $%@" + "MAX" : { + "comment" : "The text displayed in the center of the chip badge when it represents the maximum bet.", + "isCommentAutoGenerated" : true + }, + "Max: $%@" : { + "comment" : "A label displaying the maximum bet amount. The argument is the maximum bet amount.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Max: $%@" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Máx: $%@" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Máx: $%@" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Max: %@ $" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Max: %@ $" } } } }, - "Maximum penetration": { - "comment": "Description of a deck count option when the user selects 8 decks.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Maximum penetration" + "Maximum penetration" : { + "comment" : "Description of a deck count option when the user selects 8 decks.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Maximum penetration" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Penetración máxima" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Penetración máxima" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Pénétration maximale" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pénétration maximale" } } } }, - "Min: $%lld": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Min: $%lld" + "Min: $%lld" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Min: $%lld" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Mín: $%lld" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mín: $%lld" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Min: $%lld" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Min: $%lld" } } } }, - "More decks = harder to count cards.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "More decks = harder to count cards." + "Mixed Pair" : { + "comment" : "Description of a Perfect Pairs side bet outcome when the first two cards have the same rank but different color.", + "isCommentAutoGenerated" : true + }, + "Mixed Pair (diff. color): 6:1" : { + + }, + "More decks = harder to count cards." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "More decks = harder to count cards." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Más barajas = más difícil contar cartas." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Más barajas = más difícil contar cartas." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Plus de jeux = plus difficile de compter les cartes." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Plus de jeux = plus difficile de compter les cartes." } } } }, - "Most popular style on the Las Vegas Strip.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Most popular style on the Las Vegas Strip." + "Most popular style on the Las Vegas Strip." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Most popular style on the Las Vegas Strip." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Estilo más popular en el Strip de Las Vegas." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Estilo más popular en el Strip de Las Vegas." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Style le plus populaire sur le Strip de Las Vegas." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Style le plus populaire sur le Strip de Las Vegas." } } } }, - "Net": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Net" + "Net" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Net" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Neto" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Neto" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Net" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Net" } } } }, - "Never": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Never" + "Never" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Never" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Nunca" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nunca" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Jamais" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Jamais" } } } }, - "Never split 10s or 5s.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Never split 10s or 5s." + "Never split 10s or 5s." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Never split 10s or 5s." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Nunca dividas 10s o 5s." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nunca dividas 10s o 5s." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Ne jamais séparer les 10 ou les 5." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ne jamais séparer les 10 ou les 5." } } } }, - "New Round": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "New Round" + "New Round" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "New Round" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Nueva ronda" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nueva ronda" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Nouvelle partie" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nouvelle partie" } } } }, - "No hole card, dealer stands on soft 17, no surrender": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "No hole card, dealer stands on soft 17, no surrender" + "No Hand" : { + "comment" : "Description of a 21+3 side bet outcome when there is no qualifying hand.", + "isCommentAutoGenerated" : true + }, + "No hole card, dealer stands on soft 17, no surrender" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "No hole card, dealer stands on soft 17, no surrender" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Sin carta oculta, crupier se planta en 17 suave, sin rendición" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sin carta oculta, crupier se planta en 17 suave, sin rendición" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Pas de carte cachée, croupier reste sur 17 souple, pas d'abandon" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pas de carte cachée, croupier reste sur 17 souple, pas d'abandon" } } } }, - "No hole card: dealer takes second card after player acts.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "No hole card: dealer takes second card after player acts." + "No hole card: dealer takes second card after player acts." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "No hole card: dealer takes second card after player acts." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Sin carta oculta: el crupier toma la segunda carta después de que el jugador actúe." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sin carta oculta: el crupier toma la segunda carta después de que el jugador actúe." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Pas de carte cachée: le croupier prend sa seconde carte après l'action du joueur." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pas de carte cachée: le croupier prend sa seconde carte après l'action du joueur." } } } }, - "No surrender option.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "No surrender option." + "No Pair" : { + "comment" : "Description of a 21+3 side bet outcome when there is no qualifying hand.", + "isCommentAutoGenerated" : true + }, + "No surrender option." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "No surrender option." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Sin opción de rendición." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sin opción de rendición." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Pas d'option d'abandon." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pas d'option d'abandon." } } } }, - "No Thanks": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "No Thanks" + "No Thanks" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "No Thanks" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "No, gracias" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "No, gracias" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Non merci" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Non merci" } } } }, - "Objective": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Objective" + "Objective" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Objective" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Objetivo" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Objetivo" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Objectif" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Objectif" } } } }, - "Offered when dealer shows an Ace.": { - "comment": "Description of the insurance option in blackjack.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Offered when dealer shows an Ace." + "Offered when dealer shows an Ace." : { + "comment" : "Description of the insurance option in blackjack.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Offered when dealer shows an Ace." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Ofrecido cuando el crupier muestra un As." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ofrecido cuando el crupier muestra un As." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Offert quand le croupier montre un As." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Offert quand le croupier montre un As." } } } }, - "Option 1: Screenshot from Preview": { - "comment": "A description of one method for exporting app icons.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Option 1: Screenshot from Preview" + "Option 1: Screenshot from Preview" : { + "comment" : "A description of one method for exporting app icons.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Option 1: Screenshot from Preview" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Opción 1: Captura desde la vista previa" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Opción 1: Captura desde la vista previa" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Option 1: Capture depuis l'aperçu" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Option 1: Capture depuis l'aperçu" } } } }, - "Option 2: Use IconRenderer in Code": { - "comment": "A subheading within the instructions section of the BrandingPreviewView.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Option 2: Use IconRenderer in Code" + "Option 2: Use IconRenderer in Code" : { + "comment" : "A subheading within the instructions section of the BrandingPreviewView.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Option 2: Use IconRenderer in Code" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Opción 2: Usa IconRenderer en código" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Opción 2: Usa IconRenderer en código" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Option 2: Utilisez IconRenderer dans le code" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Option 2: Utilisez IconRenderer dans le code" } } } }, - "Other Game Icons": { - "comment": "A label displayed above a section of the BrandingPreviewView that shows icons for other games.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Other Game Icons" + "Optional bets placed before the deal." : { + + }, + "Other Game Icons" : { + "comment" : "A label displayed above a section of the BrandingPreviewView that shows icons for other games.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Other Game Icons" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Otros iconos de juegos" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Otros iconos de juegos" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Autres icônes de jeux" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Autres icônes de jeux" } } } }, - "Others": { - "comment": "A tab label for the section displaying icons for other games.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Others" + "Others" : { + "comment" : "A tab label for the section displaying icons for other games.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Others" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Otros" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Otros" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Autres" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Autres" } } } }, - "OUTCOMES": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "OUTCOMES" + "OUTCOMES" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "OUTCOMES" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "RESULTADOS" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "RESULTADOS" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "RÉSULTATS" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "RÉSULTATS" } } } }, - "Payouts": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Payouts" + "Payouts" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Payouts" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Pagos" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pagos" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Paiements" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Paiements" } } } }, - "Pays 2:1 if dealer has Blackjack.": { - "comment": "Description of the insurance payout when the player wins.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Pays 2:1 if dealer has Blackjack." + "Pays 2:1 if dealer has Blackjack." : { + "comment" : "Description of the insurance payout when the player wins.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pays 2:1 if dealer has Blackjack." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Paga 2:1 si el crupier tiene Blackjack." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Paga 2:1 si el crupier tiene Blackjack." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Paie 2:1 si le croupier a un Blackjack." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Paie 2:1 si le croupier a un Blackjack." } } } }, - "Play Again": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Play Again" + "Perfect Pair" : { + "comment" : "Name of the side bet outcome where the first two cards form a perfect pair.", + "isCommentAutoGenerated" : true + }, + "Perfect Pair (same suit): 25:1" : { + + }, + "Perfect Pairs" : { + "comment" : "Name of the Perfect Pairs side bet type.", + "isCommentAutoGenerated" : true + }, + "Perfect Pairs (25:1) and 21+3 (100:1)" : { + + }, + "Perfect Pairs: Bet on your first two cards being a pair." : { + + }, + "Play Again" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Play Again" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Jugar de nuevo" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Jugar de nuevo" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Rejouer" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rejouer" } } } }, - "Player hand: %@. Value: %@": { - "comment": "A user-readable string describing a player's blackjack hand, including the card values and any relevant game results. The argument is a comma-separated list of the card descriptions in the player's hand.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Player hand: %1$@. Value: %2$@" + "Player hand: %@. Value: %@" : { + "comment" : "A user-readable string describing a player's blackjack hand, including the card values and any relevant game results. The argument is a comma-separated list of the card descriptions in the player's hand.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Player hand: %1$@. Value: %2$@" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Mano del jugador: %@. Valor: %@" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mano del jugador: %@. Valor: %@" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Main du joueur: %@. Valeur: %@" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Main du joueur: %@. Valeur: %@" } } } }, - "Poker": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Poker" + "Poker" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Poker" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Póker" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Póker" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Poker" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Poker" } } } }, - "Positive count = more high cards remain = player advantage.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Positive count = more high cards remain = player advantage." + "Poker hand from your first two cards + dealer's upcard" : { + "comment" : "Description of the 21+3 side bet type.", + "isCommentAutoGenerated" : true + }, + "Positive count = more high cards remain = player advantage." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Positive count = more high cards remain = player advantage." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Conteo positivo = más cartas altas = ventaja del jugador." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Conteo positivo = más cartas altas = ventaja del jugador." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Compte positif = plus de cartes hautes = avantage joueur." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Compte positif = plus de cartes hautes = avantage joueur." } } } }, - "Privacy Policy": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Privacy Policy" + "Privacy Policy" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Privacy Policy" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Política de privacidad" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Política de privacidad" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Politique de confidentialité" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Politique de confidentialité" } } } }, - "PUSH": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "PUSH" + "PUSH" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "PUSH" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "EMPATE" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "EMPATE" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "ÉGALITÉ" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "ÉGALITÉ" } } } }, - "Push: Bet returned": { - "comment": "Description of the payout when the player and the dealer have the same hand value.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Push: Bet returned" + "Push: Bet returned" : { + "comment" : "Description of the payout when the player and the dealer have the same hand value.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Push: Bet returned" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Empate: Apuesta devuelta" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Empate: Apuesta devuelta" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Égalité: Mise retournée" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Égalité: Mise retournée" } } } }, - "Pushes": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Pushes" + "Pushes" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pushes" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Empates" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Empates" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Égalités" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Égalités" } } } }, - "Re-split Aces": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Re-split Aces" + "Re-split Aces" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Re-split Aces" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Re-dividir ases" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Re-dividir ases" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Re-séparer les as" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Re-séparer les as" } } } }, - "Re-split aces allowed.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Re-split aces allowed." + "Re-split aces allowed." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Re-split aces allowed." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Re-dividir ases permitido." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Re-dividir ases permitido." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Re-séparer les as autorisé." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Re-séparer les as autorisé." } } } }, - "Re-split Aces: Reduces house edge by ~0.05%.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Re-split Aces: Reduces house edge by ~0.05%." + "Re-split Aces: Reduces house edge by ~0.05%." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Re-split Aces: Reduces house edge by ~0.05%." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Re-dividir Ases: Reduce la ventaja en ~0.05%." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Re-dividir Ases: Reduce la ventaja en ~0.05%." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Re-séparer les As: Réduit l'avantage de ~0.05%." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Re-séparer les As: Réduit l'avantage de ~0.05%." } } } }, - "Reset to Defaults": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Reset to Defaults" + "Reset to Defaults" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Reset to Defaults" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Restablecer valores predeterminados" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Restablecer valores predeterminados" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Réinitialiser par défaut" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Réinitialiser par défaut" } } } }, - "Roulette": { - "comment": "The name of a roulette card.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Roulette" + "Roulette" : { + "comment" : "The name of a roulette card.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Roulette" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Ruleta" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ruleta" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Roulette" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Roulette" } } } }, - "Round result: %@": { - "comment": "An accessibility label for the round result banner, describing the main hand result.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Round result: %@" + "Round result: %@" : { + "comment" : "An accessibility label for the round result banner, describing the main hand result.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Round result: %@" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Resultado de la ronda: %@" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Resultado de la ronda: %@" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Résultat de la manche: %@" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Résultat de la manche: %@" } } } }, - "Rounds": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Rounds" + "Rounds" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rounds" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Rondas" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rondas" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Parties" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Parties" } } } }, - "Rounds Played": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Rounds Played" + "Rounds Played" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rounds Played" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Rondas jugadas" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rondas jugadas" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Manches jouées" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Manches jouées" } } } }, - "Rule Variations": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Rule Variations" + "Rule Variations" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rule Variations" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Variaciones de reglas" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Variaciones de reglas" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Variations de règles" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Variations de règles" } } } }, - "RULES": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "RULES" + "RULES" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "RULES" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "REGLAS" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "REGLAS" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "RÈGLES" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "RÈGLES" } } } }, - "Running": { - "comment": "The text \"Running\" displayed in the card count view.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Running" + "Running" : { + "comment" : "The text \"Running\" displayed in the card count view.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Running" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Corriendo" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Corriendo" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Courant" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Courant" } } } }, - "Running %lld, True %@": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Running %lld, True %@" + "Running %lld, True %@" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Running %lld, True %@" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Actual %lld, Verdadero %@" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Actual %lld, Verdadero %@" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Courant %lld, Vrai %@" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Courant %lld, Vrai %@" } } } }, - "Running Count: Sum of all card values seen.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Running Count: Sum of all card values seen." + "Running Count: Sum of all card values seen." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Running Count: Sum of all card values seen." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Conteo corriente: Suma de todos los valores de cartas vistas." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Conteo corriente: Suma de todos los valores de cartas vistas." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Compte courant: Somme de toutes les valeurs de cartes vues." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Compte courant: Somme de toutes les valeurs de cartes vues." } } } }, - "SESSION SUMMARY": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "SESSION SUMMARY" + "SESSION SUMMARY" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "SESSION SUMMARY" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "RESUMEN DE SESIÓN" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "RESUMEN DE SESIÓN" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "RÉSUMÉ DE SESSION" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "RÉSUMÉ DE SESSION" } } } }, - "Settings": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Settings" + "Settings" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Settings" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Configuración" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configuración" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Paramètres" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Paramètres" } } } }, - "Shoe reshuffled": { - "comment": "A description of the action of reshuffling a shoe.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Shoe reshuffled" + "Shoe reshuffled" : { + "comment" : "A description of the action of reshuffling a shoe.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Shoe reshuffled" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Zapato mezclado" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zapato mezclado" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Sabot mélangé" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sabot mélangé" } } } }, - "Shoe Reshuffled": { - "comment": "A title for the reshuffle notification.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Shoe Reshuffled" + "Shoe Reshuffled" : { + "comment" : "A title for the reshuffle notification.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Shoe Reshuffled" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Zapato mezclado" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zapato mezclado" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Sabot mélangé" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sabot mélangé" } } } }, - "Shoe reshuffled, count reset to zero": { - "comment": "A description of the accessibility label for the reshuffle notification view when the card count is reset.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Shoe reshuffled, count reset to zero" + "Shoe reshuffled, count reset to zero" : { + "comment" : "A description of the accessibility label for the reshuffle notification view when the card count is reset.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Shoe reshuffled, count reset to zero" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Zapato mezclado, conteo reiniciado a cero" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zapato mezclado, conteo reiniciado a cero" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Sabot mélangé, compte remis à zéro" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sabot mélangé, compte remis à zéro" } } } }, - "Show Animations": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Show Animations" + "Show Animations" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Show Animations" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Mostrar animaciones" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar animaciones" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Afficher les animations" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Afficher les animations" } } } }, - "Show cards left in shoe": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Show cards left in shoe" + "Show cards left in shoe" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Show cards left in shoe" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Mostrar cartas en el zapato" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar cartas en el zapato" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Afficher cartes restantes" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Afficher cartes restantes" } } } }, - "Show Hi-Lo running count & card values": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Show Hi-Lo running count & card values" + "Show Hi-Lo running count & card values" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Show Hi-Lo running count & card values" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Mostrar conteo Hi-Lo y valores de cartas" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar conteo Hi-Lo y valores de cartas" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Afficher le compte Hi-Lo et les valeurs des cartes" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Afficher le compte Hi-Lo et les valeurs des cartes" } } } }, - "Show Hints": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Show Hints" + "Show Hints" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Show Hints" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Mostrar consejos" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar consejos" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Afficher les conseils" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Afficher les conseils" } } } }, - "Sign in to iCloud to sync progress": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Sign in to iCloud to sync progress" + "Side Bets" : { + + }, + "SIDE BETS" : { + + }, + "Side bets have higher house edge than main game." : { + + }, + "Sign in to iCloud to sync progress" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sign in to iCloud to sync progress" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Inicia sesión en iCloud para sincronizar progreso" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inicia sesión en iCloud para sincronizar progreso" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Connectez-vous à iCloud pour synchroniser la progression" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Connectez-vous à iCloud pour synchroniser la progression" } } } }, - "Single deck, higher variance": { - "comment": "Description of a deck count option when the user selects one deck.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Single deck, higher variance" + "Single deck, higher variance" : { + "comment" : "Description of a deck count option when the user selects one deck.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Single deck, higher variance" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Una baraja, mayor varianza" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Una baraja, mayor varianza" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Un seul jeu, variance plus élevée" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Un seul jeu, variance plus élevée" } } } }, - "Some games: Dealer hits on 'soft 17' (Ace + 6).": { - "comment": "Description of a rule where the dealer must hit on a 'soft 17' (Ace + 6) in some blackjack games.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Some games: Dealer hits on 'soft 17' (Ace + 6)." + "Some games: Dealer hits on 'soft 17' (Ace + 6)." : { + "comment" : "Description of a rule where the dealer must hit on a 'soft 17' (Ace + 6) in some blackjack games.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Some games: Dealer hits on 'soft 17' (Ace + 6)." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Algunos juegos: El crupier pide carta con '17 suave' (As + 6)." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Algunos juegos: El crupier pide carta con '17 suave' (As + 6)." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Certains jeux: Le croupier tire sur '17 souple' (As + 6)." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Certains jeux: Le croupier tire sur '17 souple' (As + 6)." } } } }, - "SOUND & HAPTICS": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "SOUND & HAPTICS" + "SOUND & HAPTICS" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "SOUND & HAPTICS" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "SONIDO Y VIBRACIÓN" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "SONIDO Y VIBRACIÓN" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "SON ET HAPTIQUE" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "SON ET HAPTIQUE" } } } }, - "Sound Effects": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Sound Effects" + "Sound Effects" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sound Effects" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Efectos de sonido" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Efectos de sonido" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Effets sonores" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Effets sonores" } } } }, - "Split": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Split" + "Split" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Split" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Dividir" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dividir" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Séparer" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Séparer" } } } }, - "Split instead of Stand (TC %@, dealer very likely to bust)": { - "comment": "A hint to split a pair of 10s when the true count is high enough.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Split instead of Stand (TC %@, dealer very likely to bust)" + "Split instead of Stand (TC %@, dealer very likely to bust)" : { + "comment" : "A hint to split a pair of 10s when the true count is high enough.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Split instead of Stand (TC %@, dealer very likely to bust)" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Dividir en vez de Plantarse (TC %@, el crupier probablemente se pase)" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dividir en vez de Plantarse (TC %@, el crupier probablemente se pase)" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Séparer au lieu de Rester (TC %@, le croupier va probablement sauter)" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Séparer au lieu de Rester (TC %@, le croupier va probablement sauter)" } } } }, - "Split up to 4 hands, but not aces.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Split up to 4 hands, but not aces." + "Split up to 4 hands, but not aces." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Split up to 4 hands, but not aces." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Divide hasta 4 manos, pero no ases." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Divide hasta 4 manos, pero no ases." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Séparez jusqu'à 4 mains, mais pas les as." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Séparez jusqu'à 4 mains, mais pas les as." } } } }, - "Split: If you have two cards of the same value, split into two hands": { - "comment": "Description of the 'Split' action in the game rules.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Split: If you have two cards of the same value, split into two hands" + "Split: If you have two cards of the same value, split into two hands" : { + "comment" : "Description of the 'Split' action in the game rules.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Split: If you have two cards of the same value, split into two hands" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Dividir: Si tienes dos cartas del mismo valor, divide en dos manos" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dividir: Si tienes dos cartas del mismo valor, divide en dos manos" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Séparer: Si vous avez deux cartes de même valeur, séparez en deux mains" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Séparer: Si vous avez deux cartes de même valeur, séparez en deux mains" } } } }, - "Stand": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Stand" + "Stand" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stand" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Plantarse" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Plantarse" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Rester" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rester" } } } }, - "Stand instead of Hit (TC %@, dealer likely to bust)": { - "comment": "Text explaining a Blackjack strategy recommendation based on the true count. The argument is the formatted true count.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Stand instead of Hit (TC %@, dealer likely to bust)" + "Stand instead of Hit (TC %@, dealer likely to bust)" : { + "comment" : "Text explaining a Blackjack strategy recommendation based on the true count. The argument is the formatted true count.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stand instead of Hit (TC %@, dealer likely to bust)" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Plantarse en vez de Pedir (TC %@, el crupier probablemente se pase)" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Plantarse en vez de Pedir (TC %@, el crupier probablemente se pase)" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Rester au lieu de Tirer (TC %@, le croupier va probablement sauter)" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rester au lieu de Tirer (TC %@, le croupier va probablement sauter)" } } } }, - "Stand instead of Hit (TC %@, deck is extremely rich)": { - "comment": "Text provided in the \"Count Adjusted\" hint section of the Blackjack game UI, explaining a recommended action based on the true count and the current game state. The argument is the formatted true count.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Stand instead of Hit (TC %@, deck is extremely rich)" + "Stand instead of Hit (TC %@, deck is extremely rich)" : { + "comment" : "Text provided in the \"Count Adjusted\" hint section of the Blackjack game UI, explaining a recommended action based on the true count and the current game state. The argument is the formatted true count.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stand instead of Hit (TC %@, deck is extremely rich)" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Plantarse en vez de Pedir (TC %@, la baraja es extremadamente rica)" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Plantarse en vez de Pedir (TC %@, la baraja es extremadamente rica)" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Rester au lieu de Tirer (TC %@, le jeu est extrêmement riche)" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rester au lieu de Tirer (TC %@, le jeu est extrêmement riche)" } } } }, - "Stand instead of Hit (TC %@, deck is neutral/rich)": { - "comment": "Explanation of a count-based deviation from the basic strategy, including the true count and a description of the deck situation.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Stand instead of Hit (TC %@, deck is neutral/rich)" + "Stand instead of Hit (TC %@, deck is neutral/rich)" : { + "comment" : "Explanation of a count-based deviation from the basic strategy, including the true count and a description of the deck situation.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stand instead of Hit (TC %@, deck is neutral/rich)" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Plantarse en vez de Pedir (TC %@, la baraja es neutral/rica)" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Plantarse en vez de Pedir (TC %@, la baraja es neutral/rica)" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Rester au lieu de Tirer (TC %@, le jeu est neutre/riche)" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rester au lieu de Tirer (TC %@, le jeu est neutre/riche)" } } } }, - "Stand instead of Hit (TC %@, deck is very rich)": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Stand instead of Hit (TC %@, deck is very rich)" + "Stand instead of Hit (TC %@, deck is very rich)" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stand instead of Hit (TC %@, deck is very rich)" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Plantarse en vez de Pedir (TC %@, la baraja es muy rica)" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Plantarse en vez de Pedir (TC %@, la baraja es muy rica)" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Rester au lieu de Tirer (TC %@, le jeu est très riche)" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rester au lieu de Tirer (TC %@, le jeu est très riche)" } } } }, - "Stand on 17+ always.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Stand on 17+ always." + "Stand on 17+ always." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stand on 17+ always." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Plántate siempre con 17+." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Plántate siempre con 17+." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Restez toujours sur 17+." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Restez toujours sur 17+." } } } }, - "Stand: Keep your current hand": { - "comment": "Action to keep your current hand in Blackjack.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Stand: Keep your current hand" + "Stand: Keep your current hand" : { + "comment" : "Action to keep your current hand in Blackjack.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stand: Keep your current hand" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Plantarse: Mantén tu mano actual" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Plantarse: Mantén tu mano actual" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Rester: Gardez votre main actuelle" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rester: Gardez votre main actuelle" } } } }, - "Standard casino": { - "comment": "Description of a deck count option when the user selects 6 decks.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Standard casino" + "Standard casino" : { + "comment" : "Description of a deck count option when the user selects 6 decks.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Standard casino" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Casino estándar" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Casino estándar" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Casino standard" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Casino standard" } } } }, - "Standard rules on the East Coast.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Standard rules on the East Coast." + "Standard rules on the East Coast." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Standard rules on the East Coast." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Reglas estándar en la Costa Este." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Reglas estándar en la Costa Este." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Règles standard sur la Côte Est." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Règles standard sur la Côte Est." } } } }, - "STARTING BALANCE": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "STARTING BALANCE" + "STARTING BALANCE" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "STARTING BALANCE" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "SALDO INICIAL" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "SALDO INICIAL" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "SOLDE DE DÉPART" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "SOLDE DE DÉPART" } } } }, - "Statistics": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Statistics" + "Statistics" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Statistics" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Estadísticas" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Estadísticas" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Statistiques" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Statistiques" } } } }, - "Surrender": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Surrender" + "Straight" : { + "comment" : "Name of a 21+3 result when the user has three consecutive ranks.", + "isCommentAutoGenerated" : true + }, + "Straight (consecutive): 10:1" : { + + }, + "Straight Flush" : { + "comment" : "Description of a 21+3 side bet outcome when the player has a straight flush.", + "isCommentAutoGenerated" : true + }, + "Straight Flush: 40:1" : { + + }, + "Suited Trips" : { + "comment" : "Name of a 21+3 side bet outcome when the user has three cards of the same rank and suit.", + "isCommentAutoGenerated" : true + }, + "Suited Trips (same rank & suit): 100:1" : { + + }, + "Surrender" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Surrender" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Rendirse" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rendirse" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Abandonner" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abandonner" } } } }, - "SURRENDER": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "SURRENDER" + "SURRENDER" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "SURRENDER" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "RENDICIÓN" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "RENDICIÓN" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "ABANDON" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "ABANDON" } } } }, - "Surrender 16 vs dealer 9, 10, Ace.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Surrender 16 vs dealer 9, 10, Ace." + "Surrender 16 vs dealer 9, 10, Ace." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Surrender 16 vs dealer 9, 10, Ace." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Rendirse con 16 contra crupier 9, 10, As." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rendirse con 16 contra crupier 9, 10, As." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Abandonner 16 contre croupier 9, 10, As." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abandonner 16 contre croupier 9, 10, As." } } } }, - "Surrender after dealer checks for blackjack": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Surrender after dealer checks for blackjack" + "Surrender after dealer checks for blackjack" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Surrender after dealer checks for blackjack" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Rendirse después de que el crupier revise blackjack" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rendirse después de que el crupier revise blackjack" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Abandonner après vérification du blackjack" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abandonner après vérification du blackjack" } } } }, - "Surrender: Give up half your bet and end the hand": { - "comment": "Description of the 'Surrender' action in the game rules.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Surrender: Give up half your bet and end the hand" + "Surrender: Give up half your bet and end the hand" : { + "comment" : "Description of the 'Surrender' action in the game rules.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Surrender: Give up half your bet and end the hand" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Rendirse: Cede la mitad de tu apuesta y termina la mano" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rendirse: Cede la mitad de tu apuesta y termina la mano" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Abandonner: Cédez la moitié de votre mise et terminez la main" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abandonner: Cédez la moitié de votre mise et terminez la main" } } } }, - "Surrender: Half bet returned": { - "comment": "Description of the payout for surrendering in Blackjack.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Surrender: Half bet returned" + "Surrender: Half bet returned" : { + "comment" : "Description of the payout for surrendering in Blackjack.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Surrender: Half bet returned" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Rendición: Mitad de la apuesta devuelta" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rendición: Mitad de la apuesta devuelta" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Abandon: Moitié de la mise retournée" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abandon: Moitié de la mise retournée" } } } }, - "Surrenders": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Surrenders" + "Surrenders" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Surrenders" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Rendiciones" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rendiciones" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Abandons" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abandons" } } } }, - "Sync Now": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Sync Now" + "Sync Now" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sync Now" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Sincronizar ahora" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sincronizar ahora" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Synchroniser maintenant" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Synchroniser maintenant" } } } }, - "Sync progress across devices": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Sync progress across devices" + "Sync progress across devices" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sync progress across devices" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Sincronizar progreso entre dispositivos" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sincronizar progreso entre dispositivos" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Synchroniser la progression entre appareils" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Synchroniser la progression entre appareils" } } } }, - "TABLE LIMITS": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "TABLE LIMITS" + "TABLE LIMITS" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "TABLE LIMITS" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "LÍMITES DE MESA" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "LÍMITES DE MESA" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "LIMITES DE TABLE" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "LIMITES DE TABLE" } } } }, - "TAP TO BET": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "TAP TO BET" + "TAP TO BET" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "TAP TO BET" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "TOCA PARA APOSTAR" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "TOCA PARA APOSTAR" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "TOUCHEZ POUR MISER" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "TOUCHEZ POUR MISER" } } } }, - "These show how the same pattern works for other games": { - "comment": "A description below the section of the view that previews icons for other games.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "These show how the same pattern works for other games" + "These show how the same pattern works for other games" : { + "comment" : "A description below the section of the view that previews icons for other games.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "These show how the same pattern works for other games" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Estos muestran cómo funciona el mismo patrón para otros juegos" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Estos muestran cómo funciona el mismo patrón para otros juegos" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Ceux-ci montrent comment le même modèle fonctionne pour d'autres jeux" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ceux-ci montrent comment le même modèle fonctionne pour d'autres jeux" } } } }, - "This will delete all saved progress, statistics, and reset your balance. This cannot be undone.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "This will delete all saved progress, statistics, and reset your balance. This cannot be undone." + "This will delete all saved progress, statistics, and reset your balance. This cannot be undone." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "This will delete all saved progress, statistics, and reset your balance. This cannot be undone." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Esto eliminará todo el progreso guardado, estadísticas y reiniciará tu saldo. Esto no se puede deshacer." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Esto eliminará todo el progreso guardado, estadísticas y reiniciará tu saldo. Esto no se puede deshacer." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Cela supprimera toute la progression sauvegardée, les statistiques et réinitialisera votre solde. Cette action est irréversible." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cela supprimera toute la progression sauvegardée, les statistiques et réinitialisera votre solde. Cette action est irréversible." } } } }, - "Total Winnings": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Total Winnings" + "Three of a Kind" : { + "comment" : "Description of a 21+3 side bet outcome when they have three of a kind.", + "isCommentAutoGenerated" : true + }, + "Three of a Kind: 30:1" : { + + }, + "Total Winnings" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Total Winnings" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Ganancias totales" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ganancias totales" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Gains totaux" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gains totaux" } } } }, - "Traditional European casino style.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Traditional European casino style." + "Traditional European casino style." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Traditional European casino style." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Estilo tradicional de casino europeo." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Estilo tradicional de casino europeo." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Style traditionnel de casino européen." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Style traditionnel de casino européen." } } } }, - "True": { - "comment": "A label displayed above the true count of a card counting practice session.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "True" + "True" : { + "comment" : "A label displayed above the true count of a card counting practice session.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "True" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Verdadero" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Verdadero" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Vrai" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vrai" } } } }, - "True count of +2 or higher favors the player.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "True count of +2 or higher favors the player." + "True count of +2 or higher favors the player." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "True count of +2 or higher favors the player." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Cuenta verdadera de +2 o más favorece al jugador." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cuenta verdadera de +2 o más favorece al jugador." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Un compte vrai de +2 ou plus favorise le joueur." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Un compte vrai de +2 ou plus favorise le joueur." } } } }, - "True Count: Running count ÷ decks remaining.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "True Count: Running count ÷ decks remaining." + "True Count: Running count ÷ decks remaining." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "True Count: Running count ÷ decks remaining." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Cuenta Verdadera: Cuenta actual ÷ mazos restantes." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cuenta Verdadera: Cuenta actual ÷ mazos restantes." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Compte Vrai: Compte courant ÷ paquets restants." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Compte Vrai: Compte courant ÷ paquets restants." } } } }, - "Upload the 1024px icon to appicon.co or makeappicon.com to generate all sizes automatically.": { - "comment": "A description of an alternative method for generating app icons.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Upload the 1024px icon to appicon.co or makeappicon.com to generate all sizes automatically." + "Upload the 1024px icon to appicon.co or makeappicon.com to generate all sizes automatically." : { + "comment" : "A description of an alternative method for generating app icons.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Upload the 1024px icon to appicon.co or makeappicon.com to generate all sizes automatically." } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Sube el icono de 1024px a appicon.co o makeappicon.com para generar todos los tamaños automáticamente." + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sube el icono de 1024px a appicon.co o makeappicon.com para generar todos los tamaños automáticamente." } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Téléversez l'icône 1024px sur appicon.co ou makeappicon.com pour générer toutes les tailles automatiquement." + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Téléversez l'icône 1024px sur appicon.co ou makeappicon.com pour générer toutes les tailles automatiquement." } } } }, - "Using the Count": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Using the Count" + "Using the Count" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Using the Count" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Usando el conteo" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Usando el conteo" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Utilisation du compte" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Utilisation du compte" } } } }, - "Vegas Strip": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Vegas Strip" + "Vegas Strip" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vegas Strip" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Vegas Strip" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vegas Strip" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Vegas Strip" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vegas Strip" } } } }, - "Vibration on actions": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Vibration on actions" + "Vibration on actions" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vibration on actions" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Vibración en acciones" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vibración en acciones" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Vibration sur les actions" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vibration sur les actions" } } } }, - "Win Rate": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Win Rate" + "Win Rate" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Win Rate" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Tasa de victoria" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tasa de victoria" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Taux de victoire" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Taux de victoire" } } } }, - "Win: 1:1 (even money)": { - "comment": "Payout description for a win in Blackjack.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Win: 1:1 (even money)" + "Win: 1:1 (even money)" : { + "comment" : "Payout description for a win in Blackjack.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Win: 1:1 (even money)" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Victoria: 1:1 (dinero par)" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Victoria: 1:1 (dinero par)" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Victoire: 1:1 (argent égal)" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Victoire: 1:1 (argent égal)" } } } }, - "WIN!": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "WIN!" + "WIN!" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "WIN!" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "¡GANA!" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "¡GANA!" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "GAGNÉ!" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "GAGNÉ!" } } } }, - "Wins": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Wins" + "Wins" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wins" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Victorias" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Victorias" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Victoires" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Victoires" } } } }, - "Worst": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Worst" + "Worst" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Worst" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Peor" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Peor" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Pire" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pire" } } } }, - "Yes ($%lld)": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Yes ($%lld)" + "Yes ($%lld)" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yes ($%lld)" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "Sí ($%lld)" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sí ($%lld)" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Oui ($%lld)" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Oui ($%lld)" } } } }, - "You've run out of chips!": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "You've run out of chips!" + "You've run out of chips!" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "You've run out of chips!" } }, - "es-MX": { - "stringUnit": { - "state": "translated", - "value": "¡Te quedaste sin fichas!" + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "¡Te quedaste sin fichas!" } }, - "fr-CA": { - "stringUnit": { - "state": "translated", - "value": "Vous n'avez plus de jetons!" + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vous n'avez plus de jetons!" } } } } }, - "version": "1.1" + "version" : "1.1" } \ No newline at end of file diff --git a/Blackjack/Blackjack/Storage/BlackjackGameData.swift b/Blackjack/Blackjack/Storage/BlackjackGameData.swift index fdf7181..44ff6c7 100644 --- a/Blackjack/Blackjack/Storage/BlackjackGameData.swift +++ b/Blackjack/Blackjack/Storage/BlackjackGameData.swift @@ -66,6 +66,7 @@ struct BlackjackSettingsData: PersistableGameData { noHoleCard: false, blackjackPayout: 1.5, insuranceAllowed: true, + sideBetsEnabled: false, showAnimations: true, dealingSpeed: 1.0, showCardsRemaining: true, @@ -89,6 +90,7 @@ struct BlackjackSettingsData: PersistableGameData { var noHoleCard: Bool var blackjackPayout: Double var insuranceAllowed: Bool + var sideBetsEnabled: Bool var showAnimations: Bool var dealingSpeed: Double var showCardsRemaining: Bool diff --git a/Blackjack/Blackjack/Views/Game/GameTableView.swift b/Blackjack/Blackjack/Views/Game/GameTableView.swift index d675be7..e458051 100644 --- a/Blackjack/Blackjack/Views/Game/GameTableView.swift +++ b/Blackjack/Blackjack/Views/Game/GameTableView.swift @@ -125,7 +125,7 @@ struct GameTableView: View { // Table layout - fills available space BlackjackTableView( state: state, - onPlaceBet: { placeBet(state: state) }, + selectedChip: selectedChip, fullScreenSize: fullScreenSize ) .frame(maxWidth: maxContentWidth) @@ -138,7 +138,7 @@ struct GameTableView: View { ChipSelectorView( selectedChip: $selectedChip, balance: state.balance, - currentBet: state.currentBet, + currentBet: state.minBetForChipSelector, // Use min bet so chips stay enabled if any bet type can accept more maxBet: state.settings.maxBet ) .frame(maxWidth: maxContentWidth) @@ -191,11 +191,6 @@ struct GameTableView: View { } } - // MARK: - Betting - - private func placeBet(state: GameState) { - state.placeBet(amount: selectedChip.rawValue) - } } // MARK: - Preview diff --git a/Blackjack/Blackjack/Views/Sheets/ResultBannerView.swift b/Blackjack/Blackjack/Views/Sheets/ResultBannerView.swift index ccdc2eb..ed2734e 100644 --- a/Blackjack/Blackjack/Views/Sheets/ResultBannerView.swift +++ b/Blackjack/Blackjack/Views/Sheets/ResultBannerView.swift @@ -94,6 +94,25 @@ struct ResultBannerView: View { amount: showInsAmount ? result.insuranceWinnings : nil ) } + + // Side bet results + if let ppResult = result.perfectPairsResult { + SideBetResultRow( + label: String(localized: "Perfect Pairs"), + resultText: ppResult.displayName, + isWin: ppResult.isWin, + amount: result.perfectPairsWinnings + ) + } + + if let topResult = result.twentyOnePlusThreeResult { + SideBetResultRow( + label: String(localized: "21+3"), + resultText: topResult.displayName, + isWin: topResult.isWin, + amount: result.twentyOnePlusThreeWinnings + ) + } } .padding(Design.Spacing.medium) .background( @@ -245,6 +264,57 @@ struct ResultRow: View { } } +// MARK: - Side Bet Result Row + +struct SideBetResultRow: View { + let label: String + let resultText: String + let isWin: Bool + let amount: Int + + private var amountText: String { + if amount > 0 { + return "+$\(amount)" + } else if amount < 0 { + return "-$\(abs(amount))" + } else { + return "$0" + } + } + + private var amountColor: Color { + if amount > 0 { return .green } + if amount < 0 { return .red } + return .blue + } + + private var resultColor: Color { + isWin ? .green : .red + } + + var body: some View { + HStack { + Text(label) + .font(.system(size: Design.BaseFontSize.body)) + .foregroundStyle(.white.opacity(Design.Opacity.strong)) + + Spacer() + + Text(amountText) + .font(.system(size: Design.BaseFontSize.body, weight: .semibold, design: .rounded)) + .foregroundStyle(amountColor) + .frame(width: 70, alignment: .trailing) + + Text(resultText) + .font(.system(size: Design.BaseFontSize.body, weight: .bold)) + .foregroundStyle(resultColor) + .frame(width: 100, alignment: .trailing) + .lineLimit(1) + .minimumScaleFactor(Design.MinScaleFactor.comfortable) + } + } +} + #Preview("Single Hand") { ResultBannerView( result: RoundResult( @@ -296,3 +366,24 @@ struct ResultRow: View { ) } +#Preview("With Side Bets") { + ResultBannerView( + result: RoundResult( + handResults: [.win], + handWinnings: [100], + insuranceResult: nil, + insuranceWinnings: 0, + perfectPairsResult: .coloredPair, + perfectPairsWinnings: 300, + twentyOnePlusThreeResult: .nothing, + twentyOnePlusThreeWinnings: -25, + totalWinnings: 375, + wasBlackjack: false + ), + currentBalance: 1375, + minBet: 10, + onNewRound: {}, + onPlayAgain: {} + ) +} + diff --git a/Blackjack/Blackjack/Views/Sheets/RulesHelpView.swift b/Blackjack/Blackjack/Views/Sheets/RulesHelpView.swift index 6b24f6e..e32959b 100644 --- a/Blackjack/Blackjack/Views/Sheets/RulesHelpView.swift +++ b/Blackjack/Blackjack/Views/Sheets/RulesHelpView.swift @@ -82,6 +82,43 @@ struct RulesHelpView: View { String(localized: "Surrender: Half bet returned") ] ), + RulePage( + title: String(localized: "Side Bets"), + icon: "plus.circle.fill", + content: [ + String(localized: "Optional bets placed before the deal."), + String(localized: "Perfect Pairs: Bet on your first two cards being a pair."), + String(localized: "21+3: Poker hand from your cards + dealer's upcard."), + String(localized: "Side bets have higher house edge than main game."), + String(localized: "Enable in Settings to play side bets.") + ] + ), + RulePage( + title: String(localized: "Perfect Pairs"), + icon: "suit.heart.fill", + content: [ + String(localized: "Bet on your first two cards forming a pair."), + String(localized: "Mixed Pair (diff. color): 6:1"), + String(localized: "Colored Pair (same color): 12:1"), + String(localized: "Perfect Pair (same suit): 25:1"), + String(localized: "Example: K♠ K♠ = Perfect Pair"), + String(localized: "Example: K♠ K♣ = Colored Pair (both black)"), + String(localized: "Example: K♠ K♥ = Mixed Pair (red/black)") + ] + ), + RulePage( + title: String(localized: "21+3"), + icon: "dice.fill", + content: [ + String(localized: "Forms a poker hand: your 2 cards + dealer upcard."), + String(localized: "Flush (same suit): 5:1"), + String(localized: "Straight (consecutive): 10:1"), + String(localized: "Three of a Kind: 30:1"), + String(localized: "Straight Flush: 40:1"), + String(localized: "Suited Trips (same rank & suit): 100:1"), + String(localized: "Aces can be high or low in straights (A-2-3 or Q-K-A).") + ] + ), RulePage( title: String(localized: "Vegas Strip"), icon: "sparkles", diff --git a/Blackjack/Blackjack/Views/Sheets/SettingsView.swift b/Blackjack/Blackjack/Views/Sheets/SettingsView.swift index 3d2aba2..3933a9b 100644 --- a/Blackjack/Blackjack/Views/Sheets/SettingsView.swift +++ b/Blackjack/Blackjack/Views/Sheets/SettingsView.swift @@ -81,6 +81,16 @@ struct SettingsView: View { TableLimitsPicker(selection: $settings.tableLimits) } + // 3.5. Side Bets + SheetSection(title: String(localized: "SIDE BETS"), icon: "dollarsign.arrow.trianglehead.counterclockwise.rotate.90") { + SettingsToggle( + title: String(localized: "Enable Side Bets"), + subtitle: String(localized: "Perfect Pairs (25:1) and 21+3 (100:1)"), + isOn: $settings.sideBetsEnabled, + accentColor: accent + ) + } + // 4. Deck Settings SheetSection(title: String(localized: "DECK SETTINGS"), icon: "rectangle.portrait.on.rectangle.portrait") { DeckCountPicker(selection: $settings.deckCount) diff --git a/Blackjack/Blackjack/Views/Table/BettingZoneView.swift b/Blackjack/Blackjack/Views/Table/BettingZoneView.swift index 4149f03..be86ca1 100644 --- a/Blackjack/Blackjack/Views/Table/BettingZoneView.swift +++ b/Blackjack/Blackjack/Views/Table/BettingZoneView.swift @@ -8,23 +8,93 @@ import SwiftUI import CasinoKit +/// Main betting zone view - adapts layout based on whether side bets are enabled. +/// Follows Baccarat's betting pattern exactly. struct BettingZoneView: View { - let betAmount: Int - let minBet: Int - let maxBet: Int - let onTap: () -> Void + @Bindable var state: GameState + let selectedChip: ChipDenomination @ScaledMetric(relativeTo: .headline) private var labelFontSize: CGFloat = Design.Size.handLabelFontSize @ScaledMetric(relativeTo: .caption) private var detailFontSize: CGFloat = Design.Size.handNumberFontSize @ScaledMetric(relativeTo: .body) private var chipSize: CGFloat = Design.Size.bettingChipSize @ScaledMetric(relativeTo: .body) private var zoneHeight: CGFloat = CasinoDesign.Size.bettingZoneHeight - private var isAtMax: Bool { - betAmount >= maxBet + // MARK: - Computed Properties (matches Baccarat's pattern) + + /// Whether a bet can be added to main bet (matches Baccarat's canAddBet) + private var canAddMainBet: Bool { + state.canPlaceBet && + state.balance >= selectedChip.rawValue && + state.canAddToMainBet(amount: selectedChip.rawValue) + } + + /// Whether a bet can be added to Perfect Pairs + private var canAddPerfectPairs: Bool { + state.canPlaceBet && + state.balance >= selectedChip.rawValue && + state.canAddToSideBet(type: .perfectPairs, amount: selectedChip.rawValue) + } + + /// Whether a bet can be added to 21+3 + private var canAddTwentyOnePlusThree: Bool { + state.canPlaceBet && + state.balance >= selectedChip.rawValue && + state.canAddToSideBet(type: .twentyOnePlusThree, amount: selectedChip.rawValue) + } + + private var isMainAtMax: Bool { + state.currentBet >= state.settings.maxBet + } + + private var isPPAtMax: Bool { + state.perfectPairsBet >= state.settings.maxBet + } + + private var is21PlusThreeAtMax: Bool { + state.twentyOnePlusThreeBet >= state.settings.maxBet } var body: some View { - Button(action: onTap) { + if state.settings.sideBetsEnabled { + // Horizontal layout: PP | Main Bet | 21+3 + HStack(spacing: Design.Spacing.small) { + // Perfect Pairs + SideBetZoneView( + betType: .perfectPairs, + betAmount: state.perfectPairsBet, + isEnabled: canAddPerfectPairs, + isAtMax: isPPAtMax, + onTap: { state.placeSideBet(type: .perfectPairs, amount: selectedChip.rawValue) } + ) + .frame(width: Design.Size.sideBetZoneWidth) + + // Main bet (center, takes remaining space) + mainBetZone + + // 21+3 + SideBetZoneView( + betType: .twentyOnePlusThree, + betAmount: state.twentyOnePlusThreeBet, + isEnabled: canAddTwentyOnePlusThree, + isAtMax: is21PlusThreeAtMax, + onTap: { state.placeSideBet(type: .twentyOnePlusThree, amount: selectedChip.rawValue) } + ) + .frame(width: Design.Size.sideBetZoneWidth) + } + .frame(height: zoneHeight) + } else { + // Simple layout: just main bet + mainBetZone + .frame(height: zoneHeight) + } + } + + private var mainBetZone: some View { + Button { + if canAddMainBet { + state.placeBet(amount: selectedChip.rawValue) + } + } label: { ZStack { // Background RoundedRectangle(cornerRadius: Design.CornerRadius.large) @@ -35,9 +105,9 @@ struct BettingZoneView: View { ) // Content - if betAmount > 0 { + if state.currentBet > 0 { // Show chip with amount (scaled) - ChipOnTableView(amount: betAmount, showMax: isAtMax, size: chipSize) + ChipOnTableView(amount: state.currentBet, showMax: isMainAtMax, size: chipSize) } else { // Empty state VStack(spacing: Design.Spacing.small) { @@ -46,11 +116,11 @@ struct BettingZoneView: View { .foregroundStyle(.white.opacity(Design.Opacity.medium)) HStack(spacing: Design.Spacing.medium) { - Text(String(localized: "Min: $\(minBet)")) + Text(String(localized: "Min: $\(state.settings.minBet)")) .font(.system(size: detailFontSize, weight: .medium)) .foregroundStyle(.white.opacity(Design.Opacity.light)) - Text(String(localized: "Max: $\(maxBet.formatted())")) + Text(String(localized: "Max: $\(state.settings.maxBet.formatted())")) .font(.system(size: detailFontSize, weight: .medium)) .foregroundStyle(.white.opacity(Design.Opacity.light)) } @@ -58,50 +128,64 @@ struct BettingZoneView: View { } } .frame(maxWidth: .infinity) - .frame(height: zoneHeight) } .buttonStyle(.plain) - .accessibilityLabel(betAmount > 0 ? "$\(betAmount) bet" + (isAtMax ? ", maximum" : "") : "Place bet") + .accessibilityLabel(state.currentBet > 0 ? "$\(state.currentBet) bet" + (isMainAtMax ? ", maximum" : "") : "Place bet") .accessibilityHint("Double tap to add chips") } } +// MARK: - Design Constants Extension + +extension Design.Size { + /// Width of side bet zones + static let sideBetZoneWidth: CGFloat = 70 +} + // MARK: - Previews -#Preview("Empty") { +#Preview("Empty - No Side Bets") { ZStack { Color.Table.felt.ignoresSafeArea() BettingZoneView( - betAmount: 0, - minBet: 10, - maxBet: 1000, - onTap: {} + state: GameState(settings: GameSettings()), + selectedChip: .hundred ) .padding() } } -#Preview("With Bet") { +#Preview("With Side Bets") { ZStack { Color.Table.felt.ignoresSafeArea() BettingZoneView( - betAmount: 250, - minBet: 10, - maxBet: 1000, - onTap: {} + state: { + let settings = GameSettings() + settings.sideBetsEnabled = true + let state = GameState(settings: settings) + state.placeBet(amount: 100) + return state + }(), + selectedChip: .twentyFive ) .padding() } } -#Preview("Max Bet") { +#Preview("All Bets Placed") { ZStack { Color.Table.felt.ignoresSafeArea() BettingZoneView( - betAmount: 1000, - minBet: 10, - maxBet: 1000, - onTap: {} + state: { + let settings = GameSettings() + settings.sideBetsEnabled = true + let state = GameState(settings: settings) + state.placeBet(amount: 250) + state.placeSideBet(type: .perfectPairs, amount: 25) + state.placeSideBet(type: .twentyOnePlusThree, amount: 50) + return state + }(), + selectedChip: .hundred ) .padding() } diff --git a/Blackjack/Blackjack/Views/Table/BlackjackTableView.swift b/Blackjack/Blackjack/Views/Table/BlackjackTableView.swift index 3d6152d..60d467b 100644 --- a/Blackjack/Blackjack/Views/Table/BlackjackTableView.swift +++ b/Blackjack/Blackjack/Views/Table/BlackjackTableView.swift @@ -10,7 +10,7 @@ import CasinoKit struct BlackjackTableView: View { @Bindable var state: GameState - let onPlaceBet: () -> Void + let selectedChip: ChipDenomination /// Full screen size passed from parent (stable - measured from TableBackgroundView) let fullScreenSize: CGSize @@ -99,14 +99,46 @@ struct BlackjackTableView: View { // Player hands area - only show when there are cards dealt if state.playerHands.first?.cards.isEmpty == false { - PlayerHandsView( - hands: state.playerHands, - activeHandIndex: state.activeHandIndex, - isPlayerTurn: state.isPlayerTurn, - showCardCount: showCardCount, - cardWidth: cardWidth, - cardSpacing: cardSpacing - ) + ZStack { + PlayerHandsView( + hands: state.playerHands, + activeHandIndex: state.activeHandIndex, + isPlayerTurn: state.isPlayerTurn, + showCardCount: showCardCount, + cardWidth: cardWidth, + cardSpacing: cardSpacing + ) + + // Side bet toasts (positioned on left/right sides to not cover cards) + if state.settings.sideBetsEnabled && state.showSideBetToasts { + HStack { + // PP on left + if state.perfectPairsBet > 0, let ppResult = state.perfectPairsResult { + SideBetToastView( + title: "PP", + result: ppResult.displayName, + isWin: ppResult.isWin, + amount: ppResult.isWin ? state.perfectPairsBet * ppResult.payout : -state.perfectPairsBet, + showOnLeft: true + ) + } + + Spacer() + + // 21+3 on right + if state.twentyOnePlusThreeBet > 0, let topResult = state.twentyOnePlusThreeResult { + SideBetToastView( + title: "21+3", + result: topResult.displayName, + isWin: topResult.isWin, + amount: topResult.isWin ? state.twentyOnePlusThreeBet * topResult.payout : -state.twentyOnePlusThreeBet, + showOnLeft: false + ) + } + } + .padding(.horizontal, Design.Spacing.small) + } + } .padding(.bottom, 5) .transition(.opacity) .debugBorder(showDebugBorders, color: .green, label: "Player") @@ -118,10 +150,8 @@ struct BlackjackTableView: View { .debugBorder(showDebugBorders, color: .yellow, label: "Spacer2") BettingZoneView( - betAmount: state.currentBet, - minBet: state.settings.minBet, - maxBet: state.settings.maxBet, - onTap: onPlaceBet + state: state, + selectedChip: selectedChip ) .transition(.scale.combined(with: .opacity)) .debugBorder(showDebugBorders, color: .blue, label: "BetZone") diff --git a/Blackjack/Blackjack/Views/Table/PlayerHandView.swift b/Blackjack/Blackjack/Views/Table/PlayerHandView.swift index 5f5405c..aff1d12 100644 --- a/Blackjack/Blackjack/Views/Table/PlayerHandView.swift +++ b/Blackjack/Blackjack/Views/Table/PlayerHandView.swift @@ -44,13 +44,11 @@ struct PlayerHandsView: View { .id(index) } } - .padding(.horizontal, Design.Spacing.large) - .containerRelativeFrame(.horizontal) { length, _ in - length // Ensures content fills container width for centering - } + .padding(.horizontal, Design.Spacing.xxLarge) // More padding for scrolling } .scrollClipDisabled() - .scrollBounceBehavior(.basedOnSize) + .scrollBounceBehavior(.always) // Always allow bouncing for better scroll feel + .defaultScrollAnchor(.center) // Center the content by default .onChange(of: activeHandIndex) { _, newIndex in scrollToHand(proxy: proxy, index: newIndex) } @@ -66,6 +64,7 @@ struct PlayerHandsView: View { scrollToHand(proxy: proxy, index: activeHandIndex) } } + .frame(maxWidth: .infinity) } private func scrollToHand(proxy: ScrollViewProxy, index: Int) { diff --git a/Blackjack/Blackjack/Views/Table/SideBetToastView.swift b/Blackjack/Blackjack/Views/Table/SideBetToastView.swift new file mode 100644 index 0000000..55e0a25 --- /dev/null +++ b/Blackjack/Blackjack/Views/Table/SideBetToastView.swift @@ -0,0 +1,141 @@ +// +// SideBetToastView.swift +// Blackjack +// +// Animated toast notifications for side bet results that appear after dealing. +// + +import SwiftUI +import CasinoKit + +/// Toast notification for a single side bet result with built-in animation. +struct SideBetToastView: View { + let title: String + let result: String + let isWin: Bool + let amount: Int + let showOnLeft: Bool + + @State private var isShowing = false + + @ScaledMetric(relativeTo: .caption) private var titleFontSize: CGFloat = 10 + @ScaledMetric(relativeTo: .caption2) private var resultFontSize: CGFloat = 11 + @ScaledMetric(relativeTo: .caption2) private var amountFontSize: CGFloat = 13 + + private var backgroundColor: Color { + isWin ? Color.green.opacity(Design.Opacity.heavy) : Color.red.opacity(Design.Opacity.heavy) + } + + private var borderColor: Color { + isWin ? Color.green : Color.red + } + + private var amountText: String { + if amount > 0 { + return "+$\(amount)" + } else { + return "-$\(abs(amount))" + } + } + + var body: some View { + VStack(spacing: Design.Spacing.xxSmall) { + // Title (PP or 21+3) + Text(title) + .font(.system(size: titleFontSize, weight: .bold, design: .rounded)) + .foregroundStyle(.white.opacity(Design.Opacity.strong)) + + // Result + Text(result) + .font(.system(size: resultFontSize, weight: .semibold, design: .rounded)) + .foregroundStyle(.white) + .lineLimit(1) + .minimumScaleFactor(Design.MinScaleFactor.comfortable) + + // Amount + Text(amountText) + .font(.system(size: amountFontSize, weight: .black, design: .rounded)) + .foregroundStyle(isWin ? .yellow : .white) + } + .padding(.horizontal, Design.Spacing.small) + .padding(.vertical, Design.Spacing.xSmall) + .background( + RoundedRectangle(cornerRadius: Design.CornerRadius.medium) + .fill(backgroundColor) + .overlay( + RoundedRectangle(cornerRadius: Design.CornerRadius.medium) + .strokeBorder(borderColor, lineWidth: Design.LineWidth.medium) + ) + ) + .shadow(color: borderColor.opacity(Design.Opacity.medium), radius: Design.Shadow.radiusMedium) + .scaleEffect(isShowing ? 1.0 : 0.5) + .opacity(isShowing ? 1.0 : 0) + .offset(x: isShowing ? 0 : (showOnLeft ? -50 : 50)) + .onAppear { + withAnimation(.spring(duration: Design.Animation.springDuration, bounce: 0.4).delay(showOnLeft ? 0 : Design.Animation.staggerDelay1)) { + isShowing = true + } + } + } +} + +// MARK: - Previews + +#Preview("Win Toast Left") { + ZStack { + Color.Table.felt.ignoresSafeArea() + HStack { + SideBetToastView( + title: "PP", + result: "Perfect Pair", + isWin: true, + amount: 625, + showOnLeft: true + ) + Spacer() + } + .padding() + } +} + +#Preview("Lose Toast Right") { + ZStack { + Color.Table.felt.ignoresSafeArea() + HStack { + Spacer() + SideBetToastView( + title: "21+3", + result: "No Hand", + isWin: false, + amount: -25, + showOnLeft: false + ) + } + .padding() + } +} + +#Preview("Both Toasts") { + ZStack { + Color.Table.felt.ignoresSafeArea() + HStack { + SideBetToastView( + title: "PP", + result: "Colored Pair", + isWin: true, + amount: 300, + showOnLeft: true + ) + Spacer() + SideBetToastView( + title: "21+3", + result: "Flush", + isWin: true, + amount: 125, + showOnLeft: false + ) + } + .padding() + } +} + diff --git a/Blackjack/Blackjack/Views/Table/SideBetZoneView.swift b/Blackjack/Blackjack/Views/Table/SideBetZoneView.swift new file mode 100644 index 0000000..fecf366 --- /dev/null +++ b/Blackjack/Blackjack/Views/Table/SideBetZoneView.swift @@ -0,0 +1,163 @@ +// +// SideBetZoneView.swift +// Blackjack +// +// Side bet zone for Perfect Pairs and 21+3. +// + +import SwiftUI +import CasinoKit + +/// A tappable zone for placing side bets. +struct SideBetZoneView: View { + let betType: SideBetType + let betAmount: Int + let isEnabled: Bool + let isAtMax: Bool + let onTap: () -> Void + + @ScaledMetric(relativeTo: .caption) private var labelFontSize: CGFloat = 11 + @ScaledMetric(relativeTo: .caption2) private var payoutFontSize: CGFloat = 9 + + private var backgroundColor: Color { + switch betType { + case .perfectPairs: + return Color.SideBet.perfectPairs + case .twentyOnePlusThree: + return Color.SideBet.twentyOnePlusThree + } + } + + private var payoutText: String { + switch betType { + case .perfectPairs: + return "25:1" // Best payout shown + case .twentyOnePlusThree: + return "100:1" // Best payout shown + } + } + + var body: some View { + Button { + if isEnabled { onTap() } + } label: { + ZStack { + // Background + RoundedRectangle(cornerRadius: Design.CornerRadius.medium) + .fill(backgroundColor) + .overlay( + RoundedRectangle(cornerRadius: Design.CornerRadius.medium) + .strokeBorder( + Color.white.opacity(Design.Opacity.hint), + lineWidth: Design.LineWidth.thin + ) + ) + + // Content + VStack(spacing: Design.Spacing.xxSmall) { + Text(betType.shortName) + .font(.system(size: labelFontSize, weight: .black, design: .rounded)) + .foregroundStyle(.yellow) + + Text(payoutText) + .font(.system(size: payoutFontSize, weight: .medium, design: .rounded)) + .foregroundStyle(.white.opacity(Design.Opacity.strong)) + } + + // Chip indicator - top right + if betAmount > 0 { + VStack { + HStack { + Spacer() + ChipBadgeView(amount: betAmount, isMax: isAtMax) + .padding(Design.Spacing.xSmall) + } + Spacer() + } + } + } + } + .buttonStyle(.plain) + .opacity(isEnabled ? 1.0 : Design.Opacity.medium) + .accessibilityLabel("\(betType.displayName) bet, pays up to \(payoutText)") + .accessibilityHint(betAmount > 0 ? "Current bet $\(betAmount)" : "Double tap to place bet") + } +} + +/// Small chip badge for side bet indicators. +struct ChipBadgeView: View { + let amount: Int + let isMax: Bool + + var body: some View { + ZStack { + Circle() + .fill(isMax ? Color.gray : Color.yellow) + .frame(width: CasinoDesign.Size.chipBadge, height: CasinoDesign.Size.chipBadge) + + Circle() + .strokeBorder(Color.white.opacity(Design.Opacity.almostFull), lineWidth: Design.LineWidth.thin) + .frame(width: CasinoDesign.Size.chipBadgeInner, height: CasinoDesign.Size.chipBadgeInner) + + if isMax { + Text("MAX") + .font(.system(size: Design.BaseFontSize.xxSmall, weight: .black)) + .foregroundStyle(.white) + } else { + Text(formatCompact(amount)) + .font(.system(size: Design.BaseFontSize.small, weight: .bold, design: .rounded)) + .foregroundStyle(.black) + } + } + .shadow(color: .black.opacity(Design.Opacity.light), radius: Design.Shadow.radiusSmall, y: Design.Shadow.offsetSmall) + } + + private func formatCompact(_ value: Int) -> String { + if value >= 1000 { + return "\(value / 1000)K" + } + return "\(value)" + } +} + +// MARK: - Side Bet Colors + +extension Color { + enum SideBet { + /// Perfect Pairs - purple theme + static let perfectPairs = Color(red: 0.4, green: 0.2, blue: 0.5) + /// 21+3 - teal/cyan theme + static let twentyOnePlusThree = Color(red: 0.1, green: 0.4, blue: 0.5) + } +} + +// MARK: - Previews + +#Preview("Perfect Pairs") { + ZStack { + Color.Table.felt.ignoresSafeArea() + SideBetZoneView( + betType: .perfectPairs, + betAmount: 0, + isEnabled: true, + isAtMax: false, + onTap: {} + ) + .frame(width: 80, height: 70) + } +} + +#Preview("21+3 with Bet") { + ZStack { + Color.Table.felt.ignoresSafeArea() + SideBetZoneView( + betType: .twentyOnePlusThree, + betAmount: 25, + isEnabled: true, + isAtMax: false, + onTap: {} + ) + .frame(width: 80, height: 70) + } +} +