feat(i18n): add Old High German (goh) language support
Add Old High German as a supported language across the entire app: **Core i18n configuration:** - Add 'goh' to supported locales in routing.ts - Update Locale type in messages.ts to include 'goh' - Add language selector label "Diutisc" with 🏰 flag emoji **Translation files:** - Create goh.json for all feature domains (home, games, guide, tutorial) - Create goh.json for rithmomachia game - Update all messages.ts files to import and export goh translations - Currently using English text as placeholder (ready for translation) **Bug fixes:** - Add missing translation keys to ALL locales: - rithmomachia.guide.overview.boardCaption - rithmomachia.guide.pieces.pyramidMovement - These keys were referenced in components but missing from translation files Old High German will now appear in the language selector and can be selected. All UI text currently displays in English until proper translations are added. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
4387cce307
commit
b334a15255
|
|
@ -48,7 +48,8 @@
|
|||
"Dringen Sie ins gegnerische Gebiet vor (Reihen 1-4 für Schwarz, Reihen 5-8 für Weiß)",
|
||||
"Achten Sie auf Harmoniemöglichkeiten mit Ihren vorderen Steinen",
|
||||
"Gewinnen Sie durch eine Progression, die eine Runde übersteht!"
|
||||
]
|
||||
],
|
||||
"boardCaption": "The Rithmomachia board with initial piece setup"
|
||||
},
|
||||
"pieces": {
|
||||
"title": "Ihre Spielfiguren (25 insgesamt)",
|
||||
|
|
@ -104,7 +105,8 @@
|
|||
"movement": "Ein Feld in alle Richtungen (wie ein König)",
|
||||
"count": "Anzahl: 1"
|
||||
}
|
||||
}
|
||||
},
|
||||
"pyramidMovement": "One step any way"
|
||||
},
|
||||
"capture": {
|
||||
"title": "Wie man schlägt",
|
||||
|
|
|
|||
|
|
@ -48,7 +48,8 @@
|
|||
"Push into enemy territory (rows 1-4 for Black, rows 5-8 for White)",
|
||||
"Watch for harmony opportunities with your forward pieces",
|
||||
"Win by forming a progression that survives one turn!"
|
||||
]
|
||||
],
|
||||
"boardCaption": "The Rithmomachia board with initial piece setup"
|
||||
},
|
||||
"pieces": {
|
||||
"title": "Your Pieces (25 total)",
|
||||
|
|
@ -104,7 +105,8 @@
|
|||
"movement": "One step any way (like a king)",
|
||||
"count": "Count: 1"
|
||||
}
|
||||
}
|
||||
},
|
||||
"pyramidMovement": "One step any way"
|
||||
},
|
||||
"capture": {
|
||||
"title": "How to Capture",
|
||||
|
|
|
|||
|
|
@ -48,7 +48,8 @@
|
|||
"step2": "Busca oportunidades de captura usando relaciones matemáticas",
|
||||
"step3": "Avanza hacia territorio enemigo (filas 1-4 para Negro, filas 5-8 para Blanco)",
|
||||
"step4": "Busca oportunidades de armonía con tus piezas avanzadas",
|
||||
"step5": "¡Gana formando una progresión que sobreviva un turno!"
|
||||
"step5": "¡Gana formando una progresión que sobreviva un turno!",
|
||||
"boardCaption": "The Rithmomachia board with initial piece setup"
|
||||
},
|
||||
"pieces": {
|
||||
"title": "Tus Piezas (24 en total)",
|
||||
|
|
@ -108,7 +109,8 @@
|
|||
"pyramid": "Pirámide",
|
||||
"pyramidMove": "Un paso en cualquier dirección (como un rey)",
|
||||
"exampleValues": "Valores de ejemplo",
|
||||
"example": "Ejemplo:"
|
||||
"example": "Ejemplo:",
|
||||
"pyramidMovement": "One step any way"
|
||||
},
|
||||
"capture": {
|
||||
"title": "Cómo Capturar",
|
||||
|
|
|
|||
|
|
@ -0,0 +1,329 @@
|
|||
{
|
||||
"guide": {
|
||||
"title": "Rithmomachia Playing Guide",
|
||||
"subtitle": "Rithmomachia – The Philosopher's Game",
|
||||
"close": "Close",
|
||||
"maximize": "Maximize",
|
||||
"restore": "Restore",
|
||||
"bustOut": "Open in new window",
|
||||
"sections": {
|
||||
"overview": "Quick Start",
|
||||
"pieces": "Pieces",
|
||||
"capture": "Capture",
|
||||
"strategy": "Strategy",
|
||||
"harmony": "Harmony",
|
||||
"victory": "Victory"
|
||||
},
|
||||
"languageSelector": {
|
||||
"label": "Language",
|
||||
"en": "English",
|
||||
"de": "Deutsch",
|
||||
"ja": "日本語",
|
||||
"hi": "हिन्दी",
|
||||
"es": "Español",
|
||||
"la": "Latina"
|
||||
},
|
||||
"overview": {
|
||||
"goalTitle": "Goal of the Game",
|
||||
"goal": "Arrange 3 of your pieces in enemy territory to form a mathematical progression, survive one opponent turn, and win.",
|
||||
"goalDesc": "Arrange <strong>3 of your pieces in enemy territory</strong> to form a <strong>mathematical progression</strong>, survive one opponent turn, and win.",
|
||||
"boardTitle": "The Board",
|
||||
"boardSize": "8 rows × 16 columns (columns A-P, rows 1-8)",
|
||||
"territory": "Your half: Black controls rows 5-8, White controls rows 1-4",
|
||||
"enemyTerritory": "Enemy territory: Where you need to build your winning progression",
|
||||
"boardItems": [
|
||||
"8 rows × 16 columns (columns A-P, rows 1-8)",
|
||||
"<strong>Your half:</strong> Black controls rows 5-8, White controls rows 1-4",
|
||||
"<strong>Enemy territory:</strong> Where you need to build your winning progression"
|
||||
],
|
||||
"howToPlayTitle": "How to Play",
|
||||
"step1": "Start by moving pieces toward the center",
|
||||
"step2": "Look for capture opportunities using mathematical relations",
|
||||
"step3": "Push into enemy territory (rows 1-4 for Black, rows 5-8 for White)",
|
||||
"step4": "Watch for harmony opportunities with your forward pieces",
|
||||
"step5": "Win by forming a progression that survives one turn!",
|
||||
"howToPlayItems": [
|
||||
"Start by moving pieces toward the center",
|
||||
"Look for capture opportunities using mathematical relations",
|
||||
"Push into enemy territory (rows 1-4 for Black, rows 5-8 for White)",
|
||||
"Watch for harmony opportunities with your forward pieces",
|
||||
"Win by forming a progression that survives one turn!"
|
||||
],
|
||||
"boardCaption": "The Rithmomachia board with initial piece setup"
|
||||
},
|
||||
"pieces": {
|
||||
"title": "Your Pieces (25 total)",
|
||||
"description": "Each side has 25 pieces with different movement patterns. The shape tells you how it moves:",
|
||||
"intro": "Each piece has a <strong>number value</strong> and moves differently:",
|
||||
"count": "Count",
|
||||
"circle": "Circle",
|
||||
"circleMove": "Moves diagonally",
|
||||
"triangle": "Triangle",
|
||||
"triangleMove": "Moves in straight lines",
|
||||
"square": "Square",
|
||||
"squareMove": "Moves in any direction",
|
||||
"pyramid": "Pyramid",
|
||||
"pyramidMove": "One step any way (like a king)",
|
||||
"exampleValues": "Example values",
|
||||
"pyramidTitle": "⭐ Pyramids: The Special Piece",
|
||||
"pyramidIntro": "Pyramids are special. They have 4 different values you can choose from when you capture. This makes them super flexible!",
|
||||
"blackPyramid": "Black Pyramid Faces",
|
||||
"blackPyramidValues": "36 (6²), 25 (5²), 16 (4²), 4 (2²)",
|
||||
"whitePyramid": "White Pyramid Faces",
|
||||
"whitePyramidValues": "64 (8²), 49 (7²), 36 (6²), 25 (5²)",
|
||||
"pyramidHowItWorks": "How it works:",
|
||||
"pyramidRule1": "Pick which value to use before you capture",
|
||||
"pyramidRule2": "That value becomes your piece's number for the math",
|
||||
"pyramidRule3": "You can pick different values each time - nothing is locked in",
|
||||
"pyramidRule4": "This makes Pyramids great for surprise attacks and helping other pieces",
|
||||
"example": "Example:",
|
||||
"pyramidExample": "White's Pyramid can capture Black's 16 using face 64 (multiple: 64÷16=4), face 36 (multiple: 36÷9=4, with Black's 9), or face 25 with equality if capturing Black's 25.",
|
||||
"pyramidVisualTitle": "Visual Example: Pyramid's Multiple Capture Options",
|
||||
"pyramidVisualDesc": "White's Pyramid (faces: 64, 49, 36, 25) is positioned to capture Black pieces. Notice the flexibility:",
|
||||
"pyramidCaptureOptions": "Capture options from H5:",
|
||||
"pyramidOption1": "Move to I5: Choose face 64 → captures 16 by multiple (64÷16=4)",
|
||||
"pyramidOption2": "Move to H6: Choose face 49 → captures 49 by equality (49=49)",
|
||||
"pyramidOption3": "Move to G5: Choose face 25 → captures 25 by equality (25=25)",
|
||||
"pieceTypes": {
|
||||
"circle": {
|
||||
"name": "Circle",
|
||||
"movement": "Diagonal (like a bishop)",
|
||||
"count": "Count: 8"
|
||||
},
|
||||
"triangle": {
|
||||
"name": "Triangle",
|
||||
"movement": "Straight lines (like a rook)",
|
||||
"count": "Count: 8"
|
||||
},
|
||||
"square": {
|
||||
"name": "Square",
|
||||
"movement": "Any direction (like a queen)",
|
||||
"count": "Count: 7"
|
||||
},
|
||||
"pyramid": {
|
||||
"name": "Pyramid",
|
||||
"movement": "One step any way (like a king)",
|
||||
"count": "Count: 1"
|
||||
}
|
||||
},
|
||||
"pyramidMovement": "One step any way"
|
||||
},
|
||||
"capture": {
|
||||
"title": "How to Capture",
|
||||
"description": "You can only capture an enemy piece if your piece value has a mathematical relation to theirs:",
|
||||
"intro": "You can capture an enemy piece <strong>only if your piece's value relates mathematically</strong> to theirs:",
|
||||
"simpleTitle": "Simple Relations (no helper needed)",
|
||||
"equality": "Equal",
|
||||
"equalityExample": "Your 25 captures their 25",
|
||||
"equalityCaption": "White Circle (25) can capture Black Circle (25) by equality",
|
||||
"multiple": "Multiple / Divisor",
|
||||
"multipleExample": "Your 64 captures their 16 (64 ÷ 16 = 4)",
|
||||
"multipleCaption": "White Square (64) can capture Black Triangle (16) because 64 ÷ 16 = 4",
|
||||
"simpleEqual": {
|
||||
"name": "Equal",
|
||||
"desc": "Your 25 captures their 25"
|
||||
},
|
||||
"simpleMultiple": {
|
||||
"name": "Multiple / Divisor",
|
||||
"desc": "Your 64 captures their 16 (64 ÷ 16 = 4)"
|
||||
},
|
||||
"advancedTitle": "Advanced Relations (need one helper piece)",
|
||||
"sum": "Sum",
|
||||
"sumExample": "Your 9 + helper 16 = enemy 25",
|
||||
"sumCaption": "White Circle (9) can capture Black Circle (25) using helper Triangle (16): 9 + 16 = 25",
|
||||
"difference": "Difference",
|
||||
"differenceExample": "Your 30 - helper 10 = enemy 20",
|
||||
"differenceCaption": "White Triangle (30) can capture Black Triangle (20) using helper Circle (10): 30 - 10 = 20",
|
||||
"product": "Product",
|
||||
"productExample": "Your 5 × helper 5 = enemy 25",
|
||||
"productCaption": "White Circle (5) can capture Black Circle (25) using helper Circle (5): 5 × 5 = 25",
|
||||
"ratio": "Ratio",
|
||||
"ratioExample": "Your 20 ÷ helper 4 = enemy 5",
|
||||
"ratioCaption": "White Triangle (20) can capture Black Circle (5) using helper Circle (4): 20 ÷ 4 = 5",
|
||||
"advancedSum": {
|
||||
"name": "Sum",
|
||||
"desc": "Your 9 + helper 16 = enemy 25"
|
||||
},
|
||||
"advancedDifference": {
|
||||
"name": "Difference",
|
||||
"desc": "Your 30 - helper 10 = enemy 20"
|
||||
},
|
||||
"advancedProduct": {
|
||||
"name": "Product",
|
||||
"desc": "Your 5 × helper 5 = enemy 25"
|
||||
},
|
||||
"helpersTitle": "💡 What are helpers?",
|
||||
"helpersDescription": "Helpers are your other pieces on the board. They don't move - they just add their number to the math. The game shows you which captures work when you click a piece.",
|
||||
"helpersDesc": "Helpers are your other pieces still on the board — they don't move, just provide their value for the math. The game will show you valid captures when you select a piece.",
|
||||
"example1Title": "Example: Multiple/Divisor Capture",
|
||||
"example1Desc": "White's 64 (square) can capture Black's 16 (triangle) because 64 is a multiple of 16",
|
||||
"example2Title": "Example: Sum Capture with Helper",
|
||||
"example2Desc": "White's 9 + helper 16 = Black's 25 (9 + 16 = 25)",
|
||||
"example3Title": "Example: Difference Capture with Helper",
|
||||
"example3Desc": "White's 30 - helper 10 = Black's 20 (30 - 10 = 20)",
|
||||
"example4Title": "Example: Product Capture with Helper",
|
||||
"example4Desc": "White's 4 × helper 5 = Black's 20 (4 × 5 = 20)",
|
||||
"example5Title": "Example: Ratio Capture with Helper",
|
||||
"example5Desc": "White's 20 ÷ helper 4 = Black's 5 (20 ÷ 4 = 5)",
|
||||
"pyramidTitle": "Special: Pyramid Captures",
|
||||
"pyramidIntro": "Pyramids have 4 face values, making them incredibly versatile. You choose which face to use when attempting a capture, allowing one Pyramid to threaten multiple enemy pieces.",
|
||||
"pyramidEx1Title": "Example: Pyramid Face Selection (Equality)",
|
||||
"pyramidEx1Desc": "White's Pyramid (faces: 64, 49, 36, 25) can capture Black's 49 by choosing face 49 for equality (49 = 49)",
|
||||
"pyramidEx1Note": "<strong>Face selection:</strong> White declares face 49 → 49 = 49 (equality) → Capture succeeds! The Pyramid could also capture pieces valued 64, 36, or 25 using the corresponding faces.",
|
||||
"pyramidEx2Title": "Example: Pyramid with Helper (Sum)",
|
||||
"pyramidEx2Desc": "White's Pyramid uses face 25 + helper 20 = Black's 45 (25 + 20 = 45)",
|
||||
"pyramidEx2Note": "<strong>Face selection:</strong> White chooses face 25 and declares helper at D4 (value 20) → 25 + 20 = 45 (sum) → Capture succeeds! By selecting different faces, the same Pyramid could capture other values using various helpers.",
|
||||
"pyramidEx3Title": "Example: Pyramid Flexibility (Multiple/Divisor)",
|
||||
"pyramidEx3Desc": "Black's Pyramid (faces: 36, 25, 16, 4) can capture White's 9 using face 36 (multiple: 36 ÷ 9 = 4)",
|
||||
"pyramidEx3Note": "<strong>Face selection:</strong> Black chooses face 36 → 36 ÷ 9 = 4 (multiple) → Capture succeeds! Note: Black could also use face 4 with a helper 5 for sum (4 + 5 = 9), showing multiple valid approaches."
|
||||
},
|
||||
"harmony": {
|
||||
"title": "Harmonies: The Coolest Way to Win",
|
||||
"intro": "A Harmony is how you win the game. Get 3 of your pieces into enemy territory in a straight line. Their values must form a mathematical pattern.",
|
||||
"introDetail": "Think of it like a number sequence. There are 3 types of patterns you can make:",
|
||||
"arithmetic": "1. Arithmetic (Easiest)",
|
||||
"arithmeticDesc": "The middle number is exactly between the other two. Equal spacing.",
|
||||
"arithmeticFormula": "Middle × 2 = First + Last",
|
||||
"arithmeticTip": "Small circles (2-9) work great here. Look for equal gaps! Example: 6, 9, 12",
|
||||
"arithmeticCaption": "White pieces 6, 9, 12 in a row in enemy territory form an arithmetic progression",
|
||||
"geometric": "2. Geometric (Multiply by Same Number)",
|
||||
"geometricDesc": "Multiply by the same number each time. Equal ratios.",
|
||||
"geometricFormula": "Middle² = First × Last",
|
||||
"geometricTip": "Square numbers work great! Example: 4, 8, 16 (multiply by 2 each time)",
|
||||
"geometricCaption": "White pieces 4, 8, 16 in a row in enemy territory form a geometric progression",
|
||||
"harmonic": "3. Harmonic (Tricky!)",
|
||||
"harmonicDesc": "Based on musical harmonies. Hardest to spot.",
|
||||
"harmonicFormula": "2 × First × Last = Middle × (First + Last)",
|
||||
"harmonicTip": "These are rare. Just memorize these combos: 3-4-6, 4-6-12, 6-8-12, 6-10-15",
|
||||
"harmonicCaption": "White pieces 6, 8, 12 in a row in enemy territory form a harmonic progression",
|
||||
"howToCheck": "How to check:",
|
||||
"example": "Example:",
|
||||
"check": "Check:",
|
||||
"differences": "Differences:",
|
||||
"equal": "(equal!)",
|
||||
"ratios": "Ratios:",
|
||||
"strategyTip": "Strategy tip:",
|
||||
"rulesTitle": "⚠️ Important Rules",
|
||||
"enemyTerritoryTitle": "Must be in enemy territory:",
|
||||
"enemyTerritory": "All 3 pieces must be on opponent's side (White: rows 5-8, Black: rows 1-4)",
|
||||
"straightLineTitle": "Must be in a line:",
|
||||
"straightLine": "Row, column, or diagonal. No scattered pieces!",
|
||||
"adjacentTitle": "Must be touching:",
|
||||
"adjacent": "The 3 pieces must be next to each other with no gaps",
|
||||
"survivalTitle": "Must survive one turn:",
|
||||
"survival": "After you declare harmony, opponent gets ONE turn to break it",
|
||||
"victoryTitle": "Then you win:",
|
||||
"victoryRule": "If it survives, you win on your next turn!",
|
||||
"strategyTitle": "How to Win with Harmonies",
|
||||
"startWith2Title": "Start with 2, then add the 3rd",
|
||||
"startWith2": "Get 2 pieces deep first. Figure out which 3rd piece completes the pattern. Then push that piece forward. They might not see it coming!",
|
||||
"useCommonTitle": "Use common numbers",
|
||||
"useCommon": "Numbers like 6, 8, 9, 12, 16 work in lots of patterns. If you get these deep, check what 3rd piece finishes the job.",
|
||||
"protectTitle": "Protect your pieces",
|
||||
"protect": "While building, keep other pieces nearby to defend. One capture ruins everything!",
|
||||
"blockTitle": "Block their harmonies",
|
||||
"block": "If opponent has 2 pieces deep, figure out what 3rd piece they need. Block that spot or capture one of their pieces ASAP.",
|
||||
"calculateTitle": "Check before you declare",
|
||||
"calculate": "Before declaring, make sure opponent can't capture any of your 3 pieces. If they can, protect first or wait.",
|
||||
"quickRefTitle": "💡 Quick Reference: Common Harmonies in Your Army"
|
||||
},
|
||||
"victory": {
|
||||
"title": "How to Win",
|
||||
"harmony": "Victory #1: Harmony (Progression)",
|
||||
"harmonyDesc": "Form a mathematical progression with 3 pieces in enemy territory. If it survives your opponent's next turn, you win!",
|
||||
"exampleTitle": "Example: White Wins!",
|
||||
"exampleCaption": "White pieces 4, 8, 16 form a geometric progression in enemy territory. Black cannot break it - White wins!",
|
||||
"harmonyNote": "This is the primary victory condition in Rithmomachia",
|
||||
"exhaustion": "Victory #2: Exhaustion",
|
||||
"exhaustionDesc": "If your opponent has no legal moves at the start of their turn, they lose.",
|
||||
"strategyTitle": "Quick Tips",
|
||||
"tip1": "Control the center - easier to push forward",
|
||||
"tip2": "Small pieces are fast - circles can slip into enemy side quickly",
|
||||
"tip3": "Big pieces are powerful - harder to capture",
|
||||
"tip4": "Watch for their harmonies - don't let 3 pieces get deep",
|
||||
"tip5": "Pyramids are flexible - pick the right value for each capture"
|
||||
},
|
||||
"strategy": {
|
||||
"title": "Strategy & Tactics",
|
||||
"intro": "Rithmomachia rewards both mathematical insight and strategic planning. Success requires balancing territorial control, piece preservation, and mathematical opportunities.",
|
||||
"openingPrinciples": {
|
||||
"title": "Opening Principles",
|
||||
"controlCenter": {
|
||||
"title": "Control the Center",
|
||||
"desc": "Advance pieces toward the 8-column empty center (columns E–L). This provides mobility and creates capturing opportunities from multiple angles."
|
||||
},
|
||||
"developCircles": {
|
||||
"title": "Develop Small Circles First",
|
||||
"desc": "Your small circles (2–9) in columns D and M are mobile and versatile. Move them toward the center early to establish presence and create helper networks."
|
||||
},
|
||||
"protectPyramid": {
|
||||
"title": "Protect Your Pyramid",
|
||||
"desc": "The Pyramid is your most flexible piece (4 face values) but moves only 1 square. Keep it behind advancing lines until mid-game when mathematical threats are clear."
|
||||
},
|
||||
"knowNumbers": {
|
||||
"title": "Know Your Numbers",
|
||||
"desc": "Memorize key mathematical relationships in your army. Identify which pieces form factors, multiples, and sums—this speeds up tactical calculation."
|
||||
}
|
||||
},
|
||||
"midGame": {
|
||||
"title": "Mid-Game Tactics",
|
||||
"helperNetworks": {
|
||||
"title": "Build Helper Networks",
|
||||
"desc": "Position pieces so multiple helpers can support captures. For example, if you have pieces valued 5 and 10, you can capture 15 (sum), 5 (difference), or 50 (product) when your mover is positioned correctly."
|
||||
},
|
||||
"createThreats": {
|
||||
"title": "Create Capture Threats",
|
||||
"desc": "Force your opponent to defend multiple pieces simultaneously. Even if you can't execute all captures, the threat constrains their options and controls the tempo."
|
||||
},
|
||||
"thinkDefensively": {
|
||||
"title": "Think Defensively",
|
||||
"desc": "After each move, check which of your pieces can be captured. High-value pieces like squares (169, 225, 289, 361) are vulnerable to many relations—position them behind defenders or in protected squares."
|
||||
},
|
||||
"exchangeWhenAhead": {
|
||||
"title": "Exchange When Ahead",
|
||||
"desc": "If you've captured more pieces or higher values, simplify the position by trading pieces. This reduces your opponent's attacking options and brings you closer to exhaustion victory."
|
||||
}
|
||||
},
|
||||
"victoryPaths": {
|
||||
"title": "Paths to Victory",
|
||||
"harmony": {
|
||||
"title": "Harmony Victory (Most Elegant)",
|
||||
"desc": "Place 3 pieces in enemy territory forming an arithmetic, geometric, or harmonic progression. Common triads:",
|
||||
"arithmetic": "<strong>Arithmetic:</strong> (6, 9, 12), (5, 7, 9), (8, 12, 16)",
|
||||
"geometric": "<strong>Geometric:</strong> (4, 8, 16), (3, 9, 27), (2, 8, 32)",
|
||||
"harmonic": "<strong>Harmonic:</strong> (6, 8, 12), (10, 12, 15), (6, 10, 15)"
|
||||
},
|
||||
"exhaustion": {
|
||||
"title": "Exhaustion Victory (Attrition)",
|
||||
"desc": "Capture pieces systematically until your opponent has no legal moves. Focus on: eliminating mobile pieces (Squares and Triangles), blocking diagonals and ranks, and forcing the Pyramid into a corner."
|
||||
},
|
||||
"points": {
|
||||
"title": "Point Victory (Optional Rule)",
|
||||
"desc": "If enabled, capture 30 points worth of pieces (C=1, T=2, S=3, P=5). Hunt high-value targets and preserve your own heavy pieces. Trade advantageously."
|
||||
}
|
||||
},
|
||||
"commonMistakes": {
|
||||
"title": "⚠️ Common Mistakes to Avoid",
|
||||
"movingWithoutCalc": "<strong>Moving without calculation:</strong> Always check if your destination square is capturable by enemy pieces",
|
||||
"ignoringGeometry": "<strong>Ignoring helper geometry:</strong> Helpers can be anywhere, but you still need a legal move path to capture",
|
||||
"neglectingHarmony": "<strong>Neglecting harmony threats:</strong> If your opponent has 2 pieces in your territory forming part of a progression, block their third",
|
||||
"exposingPyramid": "<strong>Leaving the Pyramid exposed:</strong> It moves only 1 square and has limited escape options—protect it early"
|
||||
},
|
||||
"advanced": {
|
||||
"title": "Advanced Concepts",
|
||||
"sacrifices": {
|
||||
"title": "Positional Sacrifices",
|
||||
"desc": "Sometimes sacrificing a piece opens lines for your other pieces or forces your opponent into a worse position. Calculate the resulting imbalance before sacrificing."
|
||||
},
|
||||
"pyramidFaces": {
|
||||
"title": "Pyramid Face Selection",
|
||||
"desc": "Your Pyramid has 4 face values. In captures, choose the face that maximizes future flexibility. In harmony declarations, choose the face that completes the most valuable progression type."
|
||||
},
|
||||
"tempo": {
|
||||
"title": "Tempo and Initiative",
|
||||
"desc": "Each move that forces a defensive response gains tempo. String together forcing moves (captures, threats) to dictate the pace and prevent your opponent from executing their plan."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -48,7 +48,8 @@
|
|||
"step2": "गणितीय संबंधों का उपयोग करके पकड़ने के अवसर खोजें",
|
||||
"step3": "दुश्मन के क्षेत्र में धकेलें (काले के लिए पंक्तियाँ 1-4, सफेद के लिए 5-8)",
|
||||
"step4": "अपने आगे के मोहरों के साथ सद्भाव के अवसरों की तलाश करें",
|
||||
"step5": "एक चाल तक जीवित रहने वाली प्रगति बनाकर जीतें!"
|
||||
"step5": "एक चाल तक जीवित रहने वाली प्रगति बनाकर जीतें!",
|
||||
"boardCaption": "The Rithmomachia board with initial piece setup"
|
||||
},
|
||||
"pieces": {
|
||||
"title": "आपके मोहरे (कुल 24)",
|
||||
|
|
@ -108,7 +109,8 @@
|
|||
"pyramid": "पिरामिड",
|
||||
"pyramidMove": "किसी भी तरीके से एक कदम (राजा की तरह)",
|
||||
"exampleValues": "उदाहरण मान",
|
||||
"example": "उदाहरण:"
|
||||
"example": "उदाहरण:",
|
||||
"pyramidMovement": "One step any way"
|
||||
},
|
||||
"capture": {
|
||||
"title": "कैसे पकड़ें",
|
||||
|
|
|
|||
|
|
@ -47,7 +47,8 @@
|
|||
"step2": "数学的関係を使って捕獲の機会を探す",
|
||||
"step3": "敵陣に進入する(黒は1-4行、白は5-8行)",
|
||||
"step4": "前進した駒でハーモニーの機会を狙う",
|
||||
"step5": "1ターン生き残る級数を形成して勝利!"
|
||||
"step5": "1ターン生き残る級数を形成して勝利!",
|
||||
"boardCaption": "The Rithmomachia board with initial piece setup"
|
||||
},
|
||||
"pieces": {
|
||||
"title": "あなたの駒(全24個)",
|
||||
|
|
@ -125,7 +126,8 @@
|
|||
"pyramidCaptureOptions": "H5からの捕獲オプション:",
|
||||
"pyramidOption1": "I5に移動:面64を選択 → 倍数で16を捕獲(64÷16=4)",
|
||||
"pyramidOption2": "H6に移動:面49を選択 → 等式で49を捕獲(49=49)",
|
||||
"pyramidOption3": "G5に移動:面25を選択 → 等式で25を捕獲(25=25)"
|
||||
"pyramidOption3": "G5に移動:面25を選択 → 等式で25を捕獲(25=25)",
|
||||
"pyramidMovement": "One step any way"
|
||||
},
|
||||
"capture": {
|
||||
"title": "捕獲方法",
|
||||
|
|
|
|||
|
|
@ -48,7 +48,8 @@
|
|||
"In territorium hostium impelle (ordines 1-4 pro Nigro, ordines 5-8 pro Albo)",
|
||||
"Occasiones harmoniae cum tabulis tuis anterioribus specta",
|
||||
"Vince progressionem faciendo quae unum tempus supersit!"
|
||||
]
|
||||
],
|
||||
"boardCaption": "The Rithmomachia board with initial piece setup"
|
||||
},
|
||||
"pieces": {
|
||||
"title": "Tabulae Tuae (25 in summa)",
|
||||
|
|
@ -104,7 +105,8 @@
|
|||
"pyramidCaptureOptions": "Optiones capturae ex H5:",
|
||||
"pyramidOption1": "Move ad I5: Elige faciem 64 → capit 16 per multiplum (64÷16=4)",
|
||||
"pyramidOption2": "Move ad H6: Elige faciem 49 → capit 49 per aequalitatem (49=49)",
|
||||
"pyramidOption3": "Move ad G5: Elige faciem 25 → capit 25 per aequalitatem (25=25)"
|
||||
"pyramidOption3": "Move ad G5: Elige faciem 25 → capit 25 per aequalitatem (25=25)",
|
||||
"pyramidMovement": "One step any way"
|
||||
},
|
||||
"capture": {
|
||||
"title": "Quomodo Capere",
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@ import jaGuide from './i18n/locales/ja.json'
|
|||
import hiGuide from './i18n/locales/hi.json'
|
||||
import esGuide from './i18n/locales/es.json'
|
||||
import laGuide from './i18n/locales/la.json'
|
||||
import gohGuide from './i18n/locales/goh.json'
|
||||
|
||||
export const rithmomachiaMessages = {
|
||||
en: { rithmomachia: enGuide },
|
||||
|
|
@ -18,4 +19,5 @@ export const rithmomachiaMessages = {
|
|||
hi: { rithmomachia: hiGuide },
|
||||
es: { rithmomachia: esGuide },
|
||||
la: { rithmomachia: laGuide },
|
||||
goh: { rithmomachia: gohGuide },
|
||||
} as const
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@ const LANGUAGE_LABELS: Record<string, string> = {
|
|||
hi: 'हिन्दी',
|
||||
es: 'Español',
|
||||
la: 'Latina',
|
||||
goh: 'Diutisc',
|
||||
}
|
||||
|
||||
const LANGUAGE_FLAGS: Record<string, string> = {
|
||||
|
|
@ -25,6 +26,7 @@ const LANGUAGE_FLAGS: Record<string, string> = {
|
|||
hi: '🇮🇳',
|
||||
es: '🇪🇸',
|
||||
la: '🏛️',
|
||||
goh: '🏰',
|
||||
}
|
||||
|
||||
export function LanguageSelector({
|
||||
|
|
|
|||
|
|
@ -0,0 +1,65 @@
|
|||
{
|
||||
"games": {
|
||||
"hero": {
|
||||
"title": "🕹️ Soroban Arcade",
|
||||
"subtitle": "Level up your mental math powers in the most fun way possible!",
|
||||
"xpBadge": "+100 XP",
|
||||
"streakBadge": "STREAK!",
|
||||
"features": {
|
||||
"challenge": "🎯 Challenge Your Brain",
|
||||
"speed": "⚡ Build Speed",
|
||||
"achievements": "🏆 Unlock Achievements"
|
||||
}
|
||||
},
|
||||
"enterArcade": {
|
||||
"title": "🏟️ Ready for the Arena?",
|
||||
"description": "Select your champions, choose your battles, and dive into full-screen arcade action!",
|
||||
"button": "🚀 ENTER ARCADE",
|
||||
"subtitle": "Full-screen experience with immersive gameplay"
|
||||
},
|
||||
"champions": {
|
||||
"title": "🏆 Your Arcade Champions",
|
||||
"subtitle": "Track your progress and achievements!",
|
||||
"stats": {
|
||||
"gamesPlayed": "GAMES PLAYED",
|
||||
"victories": "VICTORIES",
|
||||
"level": "Level {level}",
|
||||
"xp": "{current}/{total} XP"
|
||||
}
|
||||
},
|
||||
"dashboard": {
|
||||
"headToHead": {
|
||||
"title": "🥊 Head-to-Head",
|
||||
"subtitle": "Battle Record",
|
||||
"vs": "VS",
|
||||
"wins": "WINS",
|
||||
"lastPlayed": "Last played: Memory Lightning ⚡"
|
||||
},
|
||||
"achievements": {
|
||||
"title": "🏆 Recent Achievements",
|
||||
"subtitle": "Latest unlocks",
|
||||
"firstWin": {
|
||||
"title": "🔥 First Win!",
|
||||
"description": "Victory in Battle Arena"
|
||||
},
|
||||
"speedDemon": {
|
||||
"title": "⚡ Speed Demon",
|
||||
"description": "Sub-5 second memory"
|
||||
}
|
||||
},
|
||||
"challenges": {
|
||||
"title": "⚔️ Active Challenges",
|
||||
"subtitle": "Friendly competition",
|
||||
"challengesText": "challenges",
|
||||
"exampleChallenge": "Beat my Memory Lightning score!",
|
||||
"currentBest": "Current best: {score} points",
|
||||
"createButton": "🎯 Create New Challenge"
|
||||
}
|
||||
},
|
||||
"callToAction": {
|
||||
"title": "🚀 Ready to Begin Your Journey?",
|
||||
"description": "Start with our interactive guide and unlock the secrets of the ancient calculator!",
|
||||
"button": "Start Learning →"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
import de from './de.json'
|
||||
import en from './en.json'
|
||||
import es from './es.json'
|
||||
import goh from './goh.json'
|
||||
import hi from './hi.json'
|
||||
import ja from './ja.json'
|
||||
import la from './la.json'
|
||||
|
||||
export const gamesMessages = {
|
||||
en: en.games,
|
||||
de: de.games,
|
||||
ja: ja.games,
|
||||
hi: hi.games,
|
||||
es: es.games,
|
||||
la: la.games,
|
||||
goh: goh.games,
|
||||
} as const
|
||||
|
|
@ -0,0 +1,215 @@
|
|||
{
|
||||
"guide": {
|
||||
"page": {
|
||||
"navTitle": "Interactive Guide",
|
||||
"hero": {
|
||||
"title": "📚 Complete Soroban Mastery Guide",
|
||||
"subtitle": "From basic reading to advanced arithmetic - everything you need to master the Japanese abacus"
|
||||
},
|
||||
"tabs": {
|
||||
"reading": "📖 Reading Numbers",
|
||||
"arithmetic": "🧮 Arithmetic Operations"
|
||||
}
|
||||
},
|
||||
"reading": {
|
||||
"title": "🔍 Learning to Read Soroban Numbers",
|
||||
"subtitle": "Master the fundamentals of reading numbers on the soroban with step-by-step visual tutorials",
|
||||
"structure": {
|
||||
"number": "1",
|
||||
"title": "Understanding the Structure",
|
||||
"description": "The soroban consists of two main sections divided by a horizontal bar. Understanding this structure is fundamental to reading any number.",
|
||||
"heaven": {
|
||||
"title": "🌅 Heaven Beads (Top)",
|
||||
"points": [
|
||||
"Located above the horizontal bar",
|
||||
"Each bead represents 5",
|
||||
"Only one bead per column",
|
||||
"When pushed down = active/counted"
|
||||
]
|
||||
},
|
||||
"earth": {
|
||||
"title": "🌍 Earth Beads (Bottom)",
|
||||
"points": [
|
||||
"Located below the horizontal bar",
|
||||
"Each bead represents 1",
|
||||
"Four beads per column",
|
||||
"When pushed up = active/counted"
|
||||
]
|
||||
},
|
||||
"keyConcept": "💡 Key Concept: Active beads are those touching the horizontal bar"
|
||||
},
|
||||
"singleDigits": {
|
||||
"number": "2",
|
||||
"title": "Reading Single Digits (1-9)",
|
||||
"description": "Let's learn to read single digits by understanding how heaven and earth beads combine to represent numbers 1 through 9.",
|
||||
"examples": {
|
||||
"0": "No beads active - all away from bar",
|
||||
"1": "One earth bead pushed up",
|
||||
"3": "Three earth beads pushed up",
|
||||
"5": "Heaven bead pushed down",
|
||||
"7": "Heaven bead + two earth beads"
|
||||
}
|
||||
},
|
||||
"multiDigit": {
|
||||
"number": "3",
|
||||
"title": "Multi-Digit Numbers",
|
||||
"description": "Reading larger numbers is simply a matter of reading each column from left to right, with each column representing a different place value.",
|
||||
"readingDirection": {
|
||||
"title": "📍 Reading Direction & Place Values",
|
||||
"readingOrder": {
|
||||
"title": "Reading Order:",
|
||||
"points": [
|
||||
"Always read from LEFT to RIGHT",
|
||||
"Each column is one digit",
|
||||
"Combine digits to form the complete number"
|
||||
]
|
||||
},
|
||||
"placeValues": {
|
||||
"title": "Place Values:",
|
||||
"points": [
|
||||
"Rightmost = Ones (1s)",
|
||||
"Next left = Tens (10s)",
|
||||
"Continue for hundreds, thousands, etc."
|
||||
]
|
||||
}
|
||||
},
|
||||
"examples": {
|
||||
"title": "🔢 Multi-Digit Examples",
|
||||
"23": "Two-digit: 2 in tens place + 3 in ones place",
|
||||
"58": "Heaven bead in tens (5) + heaven + earth beads in ones (8)",
|
||||
"147": "Three-digit: 1 hundred + 4 tens + 7 ones"
|
||||
}
|
||||
},
|
||||
"practice": {
|
||||
"number": "4",
|
||||
"title": "Practice Strategy",
|
||||
"learningTips": {
|
||||
"title": "🎯 Learning Tips",
|
||||
"points": [
|
||||
"Start with single digits (0-9)",
|
||||
"Practice identifying active vs. inactive beads",
|
||||
"Work on speed recognition",
|
||||
"Progress to multi-digit numbers gradually"
|
||||
]
|
||||
},
|
||||
"quickRecognition": {
|
||||
"title": "⚡ Quick Recognition",
|
||||
"points": [
|
||||
"Numbers 1-4: Only earth beads",
|
||||
"Number 5: Only heaven bead",
|
||||
"Numbers 6-9: Heaven + earth beads",
|
||||
"Zero: All beads away from bar"
|
||||
]
|
||||
},
|
||||
"readyToPractice": {
|
||||
"title": "🚀 Ready to Practice?",
|
||||
"description": "Test your newfound knowledge with interactive flashcards",
|
||||
"button": "Create Practice Flashcards →"
|
||||
}
|
||||
},
|
||||
"interactive": {
|
||||
"number": "5",
|
||||
"title": "Interactive Practice",
|
||||
"description": "Try the interactive abacus below! Click on the beads to activate them and watch the number change in real-time.",
|
||||
"howToUse": {
|
||||
"title": "🎮 How to Use the Interactive Abacus",
|
||||
"heaven": {
|
||||
"title": "Heaven Beads (Top):",
|
||||
"points": [
|
||||
"Worth 5 points each",
|
||||
"Click to toggle on/off",
|
||||
"Blue when active, gray when inactive"
|
||||
]
|
||||
},
|
||||
"earth": {
|
||||
"title": "Earth Beads (Bottom):",
|
||||
"points": [
|
||||
"Worth 1 point each",
|
||||
"Click to activate groups",
|
||||
"Green when active, gray when inactive"
|
||||
]
|
||||
}
|
||||
},
|
||||
"readyToPractice": {
|
||||
"title": "🚀 Ready to Practice?",
|
||||
"description": "Test your newfound knowledge with interactive flashcards",
|
||||
"button": "Create Practice Flashcards →"
|
||||
}
|
||||
}
|
||||
},
|
||||
"arithmetic": {
|
||||
"title": "🧮 Arithmetic Operations",
|
||||
"subtitle": "Master addition, subtraction, multiplication, and division on the soroban",
|
||||
"addition": {
|
||||
"title": "➕ Addition",
|
||||
"description": "Addition on the soroban follows the principle of moving beads toward the bar to increase values.",
|
||||
"basicSteps": {
|
||||
"title": "Basic Steps:",
|
||||
"steps": [
|
||||
"Set the first number on the soroban",
|
||||
"Add the second number by moving beads toward the bar",
|
||||
"Handle carries when a column exceeds 9",
|
||||
"Read the final result"
|
||||
]
|
||||
},
|
||||
"example": {
|
||||
"title": "Example: 3 + 4 = 7",
|
||||
"start": "Start: 3",
|
||||
"result": "Result: 7"
|
||||
}
|
||||
},
|
||||
"guidedTutorial": {
|
||||
"title": "🎯 Guided Addition Tutorial",
|
||||
"description": "Learn addition step-by-step with interactive guidance, tooltips, and error correction.",
|
||||
"editableNote": "This tutorial is now editable!",
|
||||
"editableDesc": "You can customize this tutorial using our new tutorial editor system.",
|
||||
"editableLink": "Open in Editor →"
|
||||
},
|
||||
"subtraction": {
|
||||
"title": "➖ Subtraction",
|
||||
"description": "Subtraction involves moving beads away from the bar to decrease values.",
|
||||
"basicSteps": {
|
||||
"title": "Basic Steps:",
|
||||
"steps": [
|
||||
"Set the minuend (first number) on the soroban",
|
||||
"Subtract by moving beads away from the bar",
|
||||
"Handle borrowing when needed",
|
||||
"Read the final result"
|
||||
]
|
||||
},
|
||||
"example": {
|
||||
"title": "Example: 8 - 3 = 5",
|
||||
"start": "Start: 8",
|
||||
"result": "Result: 5"
|
||||
}
|
||||
},
|
||||
"multiplicationDivision": {
|
||||
"title": "✖️➗ Multiplication & Division",
|
||||
"description": "Advanced operations that combine addition/subtraction with position shifting.",
|
||||
"multiplication": {
|
||||
"title": "Multiplication",
|
||||
"points": [
|
||||
"Break down into repeated addition",
|
||||
"Use position shifts for place values",
|
||||
"Master multiplication tables",
|
||||
"Practice with single digits first"
|
||||
]
|
||||
},
|
||||
"division": {
|
||||
"title": "Division",
|
||||
"points": [
|
||||
"Use repeated subtraction method",
|
||||
"Estimate quotients carefully",
|
||||
"Handle remainders properly",
|
||||
"Check results by multiplication"
|
||||
]
|
||||
}
|
||||
},
|
||||
"practiceTips": {
|
||||
"title": "💡 Master the Fundamentals",
|
||||
"description": "Start with simple problems and gradually increase complexity",
|
||||
"button": "Practice Arithmetic Operations →"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,6 +1,7 @@
|
|||
import de from './de.json'
|
||||
import en from './en.json'
|
||||
import es from './es.json'
|
||||
import goh from './goh.json'
|
||||
import hi from './hi.json'
|
||||
import ja from './ja.json'
|
||||
import la from './la.json'
|
||||
|
|
@ -12,4 +13,5 @@ export const guideMessages = {
|
|||
hi: hi.guide,
|
||||
es: es.guide,
|
||||
la: la.guide,
|
||||
goh: goh.guide,
|
||||
} as const
|
||||
|
|
|
|||
|
|
@ -0,0 +1,77 @@
|
|||
{
|
||||
"home": {
|
||||
"learnByDoing": {
|
||||
"title": "Learn by Doing",
|
||||
"subtitle": "Interactive tutorials teach you step-by-step. Try this example right now:"
|
||||
},
|
||||
"whatYouLearn": {
|
||||
"title": "What You'll Learn"
|
||||
},
|
||||
"skills": {
|
||||
"readNumbers": {
|
||||
"title": "📖 Read and set numbers",
|
||||
"desc": "Master abacus number representation from zero to thousands",
|
||||
"example": "0-9999",
|
||||
"badge": "Foundation",
|
||||
"tutorialTitle": "Read and Set Numbers",
|
||||
"tutorialDesc": "Master abacus number representation from zero to thousands"
|
||||
},
|
||||
"friends": {
|
||||
"title": "🤝 Friends techniques",
|
||||
"desc": "Add and subtract using complement pairs and mental shortcuts",
|
||||
"example": "5 = 2+3",
|
||||
"badge": "Core",
|
||||
"tutorialTitle": "Friends of 5",
|
||||
"tutorialDesc": "Add and subtract using complement pairs: 5 = 2+3"
|
||||
},
|
||||
"multiply": {
|
||||
"title": "✖️ Multiply & divide",
|
||||
"desc": "Fluent multi-digit calculations with advanced techniques",
|
||||
"example": "12×34",
|
||||
"badge": "Advanced",
|
||||
"tutorialTitle": "Multiplication",
|
||||
"tutorialDesc": "Fluent multi-digit calculations with advanced techniques"
|
||||
},
|
||||
"mental": {
|
||||
"title": "🧠 Mental calculation",
|
||||
"desc": "Visualize and compute without the physical tool (Anzan)",
|
||||
"example": "Speed math",
|
||||
"badge": "Expert",
|
||||
"tutorialTitle": "Mental Calculation",
|
||||
"tutorialDesc": "Visualize and compute without the physical tool (Anzan)"
|
||||
}
|
||||
},
|
||||
"arcade": {
|
||||
"title": "The Arcade",
|
||||
"subtitle": "Single-player challenges and multiplayer battles in networked rooms. Invite friends to play or watch live.",
|
||||
"soloChallenge": "Solo challenge",
|
||||
"playersCount": "{min}-{max} players"
|
||||
},
|
||||
"journey": {
|
||||
"title": "Your Journey",
|
||||
"subtitle": "Progress from beginner to master"
|
||||
},
|
||||
"flashcards": {
|
||||
"title": "Create Custom Flashcards",
|
||||
"subtitle": "Design beautiful flashcards for learning and practice",
|
||||
"features": {
|
||||
"formats": {
|
||||
"icon": "📄",
|
||||
"title": "Multiple Formats",
|
||||
"desc": "PDF, PNG, SVG, HTML"
|
||||
},
|
||||
"customizable": {
|
||||
"icon": "🎨",
|
||||
"title": "Customizable",
|
||||
"desc": "Bead shapes, colors, layouts"
|
||||
},
|
||||
"paperSizes": {
|
||||
"icon": "📐",
|
||||
"title": "All Paper Sizes",
|
||||
"desc": "A3, A4, A5, US Letter"
|
||||
}
|
||||
},
|
||||
"cta": "Create Flashcards"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,6 +1,7 @@
|
|||
import de from './de.json'
|
||||
import en from './en.json'
|
||||
import es from './es.json'
|
||||
import goh from './goh.json'
|
||||
import hi from './hi.json'
|
||||
import ja from './ja.json'
|
||||
import la from './la.json'
|
||||
|
|
@ -12,4 +13,5 @@ export const homeMessages = {
|
|||
hi: hi.home,
|
||||
es: es.home,
|
||||
la: la.home,
|
||||
goh: goh.home,
|
||||
} as const
|
||||
|
|
|
|||
|
|
@ -0,0 +1,203 @@
|
|||
{
|
||||
"tutorial": {
|
||||
"player": {
|
||||
"noSteps": "No steps available",
|
||||
"header": {
|
||||
"step": "Step {current} of {total}: {title}"
|
||||
},
|
||||
"controls": {
|
||||
"debug": "Debug",
|
||||
"steps": "Steps",
|
||||
"multiStep": {
|
||||
"label": "Multi-step: {current} / {total}",
|
||||
"first": "⏮ First",
|
||||
"prev": "⏪ Prev",
|
||||
"next": "Next ⏩"
|
||||
},
|
||||
"autoAdvance": "Auto-advance"
|
||||
},
|
||||
"sidebar": {
|
||||
"title": "Tutorial Steps",
|
||||
"empty": "No tutorial steps available"
|
||||
},
|
||||
"guidance": {
|
||||
"title": "Guidance"
|
||||
},
|
||||
"error": {
|
||||
"highlight": "That's not the highlighted bead. Try clicking the highlighted bead."
|
||||
},
|
||||
"navigation": {
|
||||
"previous": "← Previous",
|
||||
"next": "Next →",
|
||||
"complete": "Complete Tutorial",
|
||||
"stepCounter": "Step {current} of {total}"
|
||||
},
|
||||
"debugPanel": {
|
||||
"title": "Debug Panel",
|
||||
"currentState": "Current State",
|
||||
"eventLog": "Event Log",
|
||||
"step": "Step: {current}/{total}",
|
||||
"value": "Value: {value}",
|
||||
"target": "Target: {value}",
|
||||
"completed": "Completed: {status}",
|
||||
"completedStatus": {
|
||||
"yes": "Yes",
|
||||
"no": "No"
|
||||
},
|
||||
"time": "Time: {seconds}s"
|
||||
}
|
||||
},
|
||||
"coachBar": {
|
||||
"titleFallback": "Step",
|
||||
"hideAria": "Hide guidance"
|
||||
},
|
||||
"reasonTooltip": {
|
||||
"fromPrefix": "From",
|
||||
"directTitle": "Add the {place} digit — {digit} {place} ({value})",
|
||||
"directSubtitle": "From addend {addend}",
|
||||
"subtitleContext": "From {place} digit {digit} of {addend}",
|
||||
"digitChip": "Digit we're using",
|
||||
"rodChip": "Rod shows",
|
||||
"addHereChip": "So we add here",
|
||||
"sourceDigit": "Source digit",
|
||||
"reasoning": "From {addend}: use the {place} digit ({digit}).",
|
||||
"details": {
|
||||
"toggle": "More details",
|
||||
"carryPath": "Carry path:",
|
||||
"showMath": "Show the math",
|
||||
"steps": "Step-by-step breakdown"
|
||||
},
|
||||
"ruleInfo": {
|
||||
"Direct": {
|
||||
"name": "Direct Move",
|
||||
"description": "Simple bead movement"
|
||||
},
|
||||
"FiveComplement": {
|
||||
"name": "Five Friend",
|
||||
"description": "Using pairs that make 5"
|
||||
},
|
||||
"TenComplement": {
|
||||
"name": "Ten Friend",
|
||||
"description": "Using pairs that make 10"
|
||||
},
|
||||
"Cascade": {
|
||||
"name": "Chain Reaction",
|
||||
"description": "One move triggers another"
|
||||
},
|
||||
"Fallback": {
|
||||
"name": "Strategy",
|
||||
"description": "Abacus technique"
|
||||
}
|
||||
},
|
||||
"formula": "{original} becomes {expanded}",
|
||||
"devWarning": "⚠ Summary/guard mismatch: {issues}"
|
||||
},
|
||||
"steps": {
|
||||
"basic-1": {
|
||||
"title": "Basic Addition: 0 + 1",
|
||||
"description": "Start by adding your first earth bead",
|
||||
"actionDescription": "Click the first earth bead to move it up",
|
||||
"tooltip": {
|
||||
"content": "Adding earth beads",
|
||||
"explanation": "Earth beads (bottom) are worth 1 each. Push them UP to activate them."
|
||||
}
|
||||
},
|
||||
"basic-2": {
|
||||
"title": "Basic Addition: 1 + 1",
|
||||
"description": "Add the second earth bead to make 2",
|
||||
"actionDescription": "Click the second earth bead to move it up",
|
||||
"tooltip": {
|
||||
"content": "Building up earth beads",
|
||||
"explanation": "Continue adding earth beads one by one for numbers 2, 3, and 4"
|
||||
}
|
||||
},
|
||||
"basic-3": {
|
||||
"title": "Basic Addition: 2 + 1",
|
||||
"description": "Add the third earth bead to make 3",
|
||||
"actionDescription": "Click the third earth bead to move it up",
|
||||
"tooltip": {
|
||||
"content": "Adding earth beads in sequence",
|
||||
"explanation": "Continue adding earth beads one by one until you reach 4"
|
||||
}
|
||||
},
|
||||
"basic-4": {
|
||||
"title": "Basic Addition: 3 + 1",
|
||||
"description": "Add the fourth earth bead to make 4",
|
||||
"actionDescription": "Click the fourth earth bead to complete 4",
|
||||
"tooltip": {
|
||||
"content": "Maximum earth beads",
|
||||
"explanation": "Four earth beads is the maximum - next we need a different approach"
|
||||
}
|
||||
},
|
||||
"heaven-intro": {
|
||||
"title": "Heaven Bead: 0 + 5",
|
||||
"description": "Use the heaven bead to represent 5",
|
||||
"actionDescription": "Click the heaven bead to activate it",
|
||||
"tooltip": {
|
||||
"content": "Heaven bead = 5",
|
||||
"explanation": "The single bead above the bar represents 5"
|
||||
}
|
||||
},
|
||||
"heaven-plus-earth": {
|
||||
"title": "Combining: 5 + 1",
|
||||
"description": "Add 1 to 5 by activating one earth bead",
|
||||
"actionDescription": "Click the first earth bead to make 6",
|
||||
"tooltip": {
|
||||
"content": "Heaven + Earth = 6",
|
||||
"explanation": "When you have room in the earth section, simply add directly"
|
||||
}
|
||||
},
|
||||
"complement-intro": {
|
||||
"title": "Five Complement: 3 + 4",
|
||||
"description": "Need to add 4, but only have 1 earth bead space. Use complement: 4 = 5 - 1",
|
||||
"actionDescription": "First add heaven bead (5), then remove 1 earth bead",
|
||||
"tooltip": {
|
||||
"content": "Five Complement: 4 = 5 - 1",
|
||||
"explanation": "When you need to add 4 but only have 1 space, use: add 5, remove 1"
|
||||
},
|
||||
"multiStepInstructions": [
|
||||
"Click the heaven bead to add 5",
|
||||
"Click the first earth bead to remove 1"
|
||||
]
|
||||
},
|
||||
"complement-2": {
|
||||
"title": "Five Complement: 2 + 3",
|
||||
"description": "Add 3 to make 5 by using complement: 3 = 5 - 2",
|
||||
"actionDescription": "Add heaven bead (5), then remove 2 earth beads",
|
||||
"tooltip": {
|
||||
"content": "Five Complement: 3 = 5 - 2",
|
||||
"explanation": "To add 3, think: 3 = 5 - 2, so add 5 and take away 2"
|
||||
},
|
||||
"multiStepInstructions": [
|
||||
"Click the heaven bead to add 5",
|
||||
"Click the first earth bead to remove it",
|
||||
"Click the second earth bead to remove it"
|
||||
]
|
||||
},
|
||||
"complex-1": {
|
||||
"title": "Complex: 6 + 2",
|
||||
"description": "Add 2 more to 6 (which has heaven + 1 earth)",
|
||||
"actionDescription": "Add two more earth beads",
|
||||
"tooltip": {
|
||||
"content": "Direct addition when possible",
|
||||
"explanation": "When you have space in the earth section, just add directly"
|
||||
}
|
||||
},
|
||||
"complex-2": {
|
||||
"title": "Complex: 7 + 4",
|
||||
"description": "Add 4 to 7, but no room for 4 earth beads. Use complement again",
|
||||
"actionDescription": "Add tens heaven, then clear ones place: remove heaven + 2 earth",
|
||||
"tooltip": {
|
||||
"content": "Carrying to tens place",
|
||||
"explanation": "7 + 4 = 11, which needs the tens column heaven bead"
|
||||
},
|
||||
"multiStepInstructions": [
|
||||
"Click the heaven bead in the tens column (left)",
|
||||
"Click the heaven bead in the ones column to remove it",
|
||||
"Click the first earth bead to remove it",
|
||||
"Click the second earth bead to remove it"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,6 +1,7 @@
|
|||
import de from './de.json'
|
||||
import en from './en.json'
|
||||
import es from './es.json'
|
||||
import goh from './goh.json'
|
||||
import hi from './hi.json'
|
||||
import ja from './ja.json'
|
||||
import la from './la.json'
|
||||
|
|
@ -12,4 +13,5 @@ export const tutorialMessages = {
|
|||
hi: hi.tutorial,
|
||||
es: es.tutorial,
|
||||
la: la.tutorial,
|
||||
goh: goh.tutorial,
|
||||
} as const
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ import { guideMessages } from '@/i18n/locales/guide/messages'
|
|||
import { homeMessages } from '@/i18n/locales/home/messages'
|
||||
import { tutorialMessages } from '@/i18n/locales/tutorial/messages'
|
||||
|
||||
export type Locale = 'en' | 'de' | 'ja' | 'hi' | 'es' | 'la'
|
||||
export type Locale = 'en' | 'de' | 'ja' | 'hi' | 'es' | 'la' | 'goh'
|
||||
|
||||
/**
|
||||
* Deep merge messages from multiple sources
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
// Supported locales
|
||||
export const locales = ['en', 'de', 'ja', 'hi', 'es', 'la'] as const
|
||||
export const locales = ['en', 'de', 'ja', 'hi', 'es', 'la', 'goh'] as const
|
||||
export type Locale = (typeof locales)[number]
|
||||
|
||||
// Default locale
|
||||
|
|
|
|||
Loading…
Reference in New Issue