From 43efc8edc013a378e5bb4790a8269d354f7a2795 Mon Sep 17 00:00:00 2001 From: "arrz.dev" <55147716+arrzdev@users.noreply.github.com> Date: Sun, 1 Nov 2026 06:14:06 +0000 Subject: [PATCH] feat(game): lead the starting positions page with "abalone starting position" - Title and description name the exact phrase and both daisies. - The intro opens with the phrase and keeps the rules and opening links. - Strategy tip 5 now links to the starting positions, in every language. - The rules and opening pages swap their old link sentence for one that says what the page shows, so neither gains a second link. - Sitemap dates move for the four pages; a phone check keeps the play button on the first screen of the starting positions page. --- apps/game/src/i18n/locales/de/game.json | 4 ++-- apps/game/src/i18n/locales/en/game.json | 8 +++---- apps/game/src/i18n/locales/es/game.json | 4 ++-- apps/game/src/i18n/locales/fr/game.json | 4 ++-- apps/game/src/i18n/locales/hi/game.json | 4 ++-- apps/game/src/i18n/locales/it/game.json | 4 ++-- apps/game/src/i18n/locales/ja/game.json | 4 ++-- apps/game/src/i18n/locales/ko/game.json | 4 ++-- apps/game/src/i18n/locales/nl/game.json | 4 ++-- apps/game/src/i18n/locales/pl/game.json | 4 ++-- apps/game/src/i18n/locales/pt/game.json | 4 ++-- apps/game/src/i18n/locales/tr/game.json | 4 ++-- apps/game/src/i18n/locales/zh/game.json | 4 ++-- apps/game/src/routing/pages/strategy.page.tsx | 6 +++++ apps/game/src/routing/seo-pages.test.ts | 12 +++++----- apps/game/src/routing/seo-pages.ts | 12 +++++----- apps/game/src/routing/structured-data.test.ts | 2 +- e2e/manual-layout.spec.ts | 23 +++++++++++++++++++ e2e/seo.spec.ts | 10 ++++---- e2e/strategy-page.spec.ts | 16 +++++++++++++ 20 files changed, 91 insertions(+), 46 deletions(-) diff --git a/apps/game/src/i18n/locales/de/game.json b/apps/game/src/i18n/locales/de/game.json index 5cd66c40..2b81f171 100644 --- a/apps/game/src/i18n/locales/de/game.json +++ b/apps/game/src/i18n/locales/de/game.json @@ -157,7 +157,7 @@ "belgian_daisy": "Belgian daisy: Die Kugeln starten in vier blumenförmigen Gruppen, eine in jeder Ecke. Schwarz und Weiß wechseln sich rund um das Brett ab (Weiß oben links und unten rechts, Schwarz oben rechts und unten links). Die Armeen berühren sich schon im ersten Zug, das Spiel ist schnell und taktisch. Bei Turnieren beliebt, weil es fairer ist als die Standardaufstellung.", "german_daisy": "German daisy: Wieder vier blumenförmige Gruppen mit denselben Farben wie bei der Belgian daisy (Weiß oben links und unten rechts, Schwarz oben rechts und unten links), aber von den Ecken weg zu den Seiten versetzt. Die Gruppen starten weiter auseinander, die Eröffnung ist offener.", "others": "Weitere im Spiel: Dutch daisy, Swiss daisy, Alien, Domination, Infiltration und The Wall. Wähle eine beim Start einer Partie.", - "compare": "Im Detail verglichen: Abalone-Startaufstellungen.", + "compare": "Neu am Brett? Fang mit der richtigen Aufstellung an: Unsere Seite zu den Startaufstellungen zeigt Standard, Belgian daisy und German daisy nebeneinander.", "openings": "Du willst sicher starten? Lies die Abalone-Eröffnungszüge für Anfänger." }, "faq": { @@ -222,7 +222,7 @@ }, "opening": { "title": "5. Wähle deine Eröffnung mit Absicht", - "body": "In der Standard-Aufstellung kann im ersten Zug niemand schieben. Entwickle dich also in kleinen Schritten zur Mitte und behalte deine Dreierreihen. Bei einer Belgian daisy berühren sich die Armeen sofort: Such das erste Sumito und verteidige deine schwächste Gruppe. Probiere jede Aufstellung gegen den Computer aus, um zu sehen, was sich ändert. Du brauchst einen sicheren ersten Zug? Lies die Abalone-Eröffnungszüge." + "body": "In der Standard-Aufstellung kann im ersten Zug niemand schieben. Entwickle dich also in kleinen Schritten zur Mitte und behalte deine Dreierreihen. Bei einer Belgian daisy berühren sich die Armeen sofort: Such das erste Sumito und verteidige deine schwächste Gruppe. Probiere jede Aufstellung gegen den Computer aus, um zu sehen, was sich ändert. Du brauchst einen sicheren ersten Zug? Lies die Abalone-Eröffnungszüge. Dein erster Plan hängt von der Aufstellung ab, also sieh dir jede Abalone-Startaufstellung an, bevor du eine Eröffnung wählst." }, "attack_as_a_group": { "title": "6. Greife als Gruppe an, nicht als Held", diff --git a/apps/game/src/i18n/locales/en/game.json b/apps/game/src/i18n/locales/en/game.json index 158ae144..615cd0dc 100644 --- a/apps/game/src/i18n/locales/en/game.json +++ b/apps/game/src/i18n/locales/en/game.json @@ -158,7 +158,7 @@ "german_daisy": "German daisy: four flower-shaped clusters again, with the same colours as the Belgian daisy (white upper left and lower right, black upper right and lower left), but set in from the corners toward the sides. The clusters start further apart, so the opening is more open.", "others": "Others in the game: Dutch daisy, Swiss daisy, Alien, Domination, Infiltration and The Wall. Choose one when you start a game.", "openings": "Want a safe start? See our Abalone opening moves for beginners.", - "compare": "Compare them in detail: Abalone starting positions." + "compare": "New to the board? Start from the right layout: our starting positions page shows the standard, Belgian daisy and German daisy setups side by side." }, "faq": { "title": "Frequently asked", @@ -222,7 +222,7 @@ }, "opening": { "title": "5. Choose your opening on purpose", - "body": "In the standard layout, nobody can push on move one, so develop toward the center in small steps and keep your three-marble rows. In a Belgian daisy the armies touch at once: look for the first sumito and defend your weakest cluster. Try each layout against the computer to learn what changes. Need a safe first move? See the Abalone opening moves." + "body": "In the standard layout, nobody can push on move one, so develop toward the center in small steps and keep your three-marble rows. In a Belgian daisy the armies touch at once: look for the first sumito and defend your weakest cluster. Try each layout against the computer to learn what changes. Need a safe first move? See the Abalone opening moves. Your first plan depends on the layout, so see each Abalone starting position before you pick an opening." }, "attack_as_a_group": { "title": "6. Attack as a group, not as a hero", @@ -279,7 +279,7 @@ "intro": "The first few moves of an Abalone game set up the fight that follows. This page covers the starting position, which opening moves are safe, and how the daisy layouts change the first turns. Not sure how a push works? Read the Abalone rules first, then try these ideas in a free game against the computer. Once the opening feels familiar, read the Abalone strategy tips.", "start": { "title": "The starting position", - "body": "In the standard layout each player has 14 marbles: their two nearest rows (five and six marbles) plus three in the middle of the third row. Black sits at the bottom, white at the top, and black moves first. The armies face each other across three empty rows, so nobody can push on move one. Compare all three layouts in Abalone starting positions." + "body": "In the standard layout each player has 14 marbles: their two nearest rows (five and six marbles) plus three in the middle of the third row. Black sits at the bottom, white at the top, and black moves first. The armies face each other across three empty rows, so nobody can push on move one. Before you pick a first move, compare the starting positions: the standard layout and both daisies, each with its board." }, "safe": { "title": "Safe first moves", @@ -316,7 +316,7 @@ "positions": { "title": "Starting positions", "heading": "Abalone starting positions", - "intro": "Abalone has three main starting positions: standard, Belgian daisy and German daisy. Each player gets 14 marbles and black moves first. Standard is best for learning; in the daisies the armies meet sooner. See the rules and opening moves.", + "intro": "The Abalone starting position decides how your first moves play out. There are three main ones: standard, Belgian daisy and German daisy. Each player has 14 marbles and black moves first. Standard is the one to learn on; in the daisies the armies meet sooner. See the rules and opening moves.", "glance": { "title": "At a glance", "caption": "The three main Abalone starting positions compared", diff --git a/apps/game/src/i18n/locales/es/game.json b/apps/game/src/i18n/locales/es/game.json index 761a6bc1..41206978 100644 --- a/apps/game/src/i18n/locales/es/game.json +++ b/apps/game/src/i18n/locales/es/game.json @@ -157,7 +157,7 @@ "belgian_daisy": "Belgian daisy: las bolas empiezan en cuatro grupos con forma de flor, uno en cada esquina. Negras y blancas se alternan alrededor del tablero (blancas arriba a la izquierda y abajo a la derecha, negras arriba a la derecha y abajo a la izquierda). Los ejércitos se tocan en el primer movimiento, así que el juego es rápido y táctico. Es popular en torneos porque es más justa que la disposición estándar.", "german_daisy": "German daisy: otra vez cuatro grupos con forma de flor y los mismos colores que la Belgian daisy (blancas arriba a la izquierda y abajo a la derecha, negras arriba a la derecha y abajo a la izquierda), pero desplazados de las esquinas hacia los lados. Los grupos empiezan más separados, así que la apertura es más abierta.", "others": "Otras en el juego: Dutch daisy, Swiss daisy, Alien, Domination, Infiltration y The Wall. Elige una al empezar una partida.", - "compare": "Compáralas en detalle: posiciones iniciales de Abalone.", + "compare": "¿Nuevo en el tablero? Empieza por la disposición adecuada: nuestra página de posiciones iniciales muestra Standard, Belgian daisy y German daisy lado a lado.", "openings": "¿Quieres empezar sin riesgos? Mira las aperturas de Abalone para principiantes." }, "faq": { @@ -222,7 +222,7 @@ }, "opening": { "title": "5. Elige tu apertura a propósito", - "body": "En la disposición estándar nadie puede empujar en el primer movimiento, así que avanza hacia el centro con pasos cortos y conserva tus filas de tres. En una Belgian daisy los ejércitos se tocan de inmediato: busca el primer sumito y defiende tu grupo más débil. Prueba cada disposición contra el ordenador para ver qué cambia. ¿Necesitas una primera jugada segura? Mira las aperturas de Abalone." + "body": "En la disposición estándar nadie puede empujar en el primer movimiento, así que avanza hacia el centro con pasos cortos y conserva tus filas de tres. En una Belgian daisy los ejércitos se tocan de inmediato: busca el primer sumito y defiende tu grupo más débil. Prueba cada disposición contra el ordenador para ver qué cambia. ¿Necesitas una primera jugada segura? Mira las aperturas de Abalone. Tu primer plan depende de la disposición, así que mira cada posición inicial de Abalone antes de elegir una apertura." }, "attack_as_a_group": { "title": "6. Ataca en grupo, no como un héroe", diff --git a/apps/game/src/i18n/locales/fr/game.json b/apps/game/src/i18n/locales/fr/game.json index 71ff6fd1..6c9f7a9e 100644 --- a/apps/game/src/i18n/locales/fr/game.json +++ b/apps/game/src/i18n/locales/fr/game.json @@ -157,7 +157,7 @@ "belgian_daisy": "Belgian daisy : les billes commencent en quatre groupes en forme de fleur, un dans chaque coin. Noirs et blancs alternent autour du plateau (blancs en haut à gauche et en bas à droite, noirs en haut à droite et en bas à gauche). Les armées se touchent dès le premier coup, le jeu est donc rapide et tactique. Très utilisée en tournoi, car plus équitable que la disposition standard.", "german_daisy": "German daisy : de nouveau quatre groupes en forme de fleur, avec les mêmes couleurs que la Belgian daisy (blancs en haut à gauche et en bas à droite, noirs en haut à droite et en bas à gauche), mais décalés des coins vers les côtés. Les groupes commencent plus éloignés, l'ouverture est donc plus libre.", "others": "Autres dans le jeu : Dutch daisy, Swiss daisy, Alien, Domination, Infiltration et The Wall. Choisis-en une au début d'une partie.", - "compare": "Comparez-les en détail : positions de départ d'Abalone.", + "compare": "Nouveau sur le plateau ? Commencez par la bonne disposition : notre page sur les positions de départ montre Standard, Belgian daisy et German daisy côte à côte.", "openings": "Envie d'un départ sûr ? Voir les premiers coups d'Abalone pour débutants." }, "faq": { @@ -222,7 +222,7 @@ }, "opening": { "title": "5. Choisis ton ouverture exprès", - "body": "Dans la disposition standard, personne ne peut pousser au premier coup : avance donc vers le centre à petits pas et garde tes rangées de trois. Dans une Belgian daisy, les armées se touchent tout de suite : cherche le premier sumito et défends ton groupe le plus faible. Essaie chaque disposition contre l'ordinateur pour voir ce qui change. Besoin d'un premier coup sûr ? Voir les premiers coups d'Abalone." + "body": "Dans la disposition standard, personne ne peut pousser au premier coup : avance donc vers le centre à petits pas et garde tes rangées de trois. Dans une Belgian daisy, les armées se touchent tout de suite : cherche le premier sumito et défends ton groupe le plus faible. Essaie chaque disposition contre l'ordinateur pour voir ce qui change. Besoin d'un premier coup sûr ? Voir les premiers coups d'Abalone. Votre premier plan dépend de la disposition : regardez chaque position de départ d'Abalone avant de choisir une ouverture." }, "attack_as_a_group": { "title": "6. Attaque en groupe, pas en héros", diff --git a/apps/game/src/i18n/locales/hi/game.json b/apps/game/src/i18n/locales/hi/game.json index 34824396..3c82df8f 100644 --- a/apps/game/src/i18n/locales/hi/game.json +++ b/apps/game/src/i18n/locales/hi/game.json @@ -157,7 +157,7 @@ "belgian_daisy": "Belgian daisy: गोलियाँ फूल के आकार के चार समूहों में शुरू होती हैं, हर कोने में एक। काली और सफ़ेद बोर्ड के चारों ओर बारी-बारी से होती हैं (सफ़ेद ऊपर-बाएँ और नीचे-दाएँ, काली ऊपर-दाएँ और नीचे-बाएँ)। सेनाएँ पहली चाल में ही छू जाती हैं, इसलिए खेल तेज़ और दाँव-पेंच वाला होता है। टूर्नामेंट में लोकप्रिय है क्योंकि यह standard लेआउट से ज़्यादा निष्पक्ष है।", "german_daisy": "German daisy: फिर से फूल के आकार के चार समूह, Belgian daisy जैसे ही रंगों के साथ (सफ़ेद ऊपर-बाएँ और नीचे-दाएँ, काली ऊपर-दाएँ और नीचे-बाएँ), पर कोनों से किनारों की ओर हटकर। समूह एक-दूसरे से दूर शुरू होते हैं, इसलिए शुरुआत ज़्यादा खुली होती है।", "others": "खेल में अन्य: Dutch daisy, Swiss daisy, Alien, Domination, Infiltration और The Wall।खेल शुरू करते समय कोई एक चुनें।", - "compare": "विस्तार से तुलना करें: Abalone की शुरुआती स्थितियाँ।", + "compare": "बोर्ड पर नए हैं? सही लेआउट से शुरू करें: हमारा शुरुआती स्थितियाँ पेज Standard, Belgian daisy और German daisy को साथ-साथ दिखाता है।", "openings": "सुरक्षित शुरुआत चाहते हैं? शुरुआती खिलाड़ियों के लिए Abalone की शुरुआती चालें देखें।" }, "faq": { @@ -222,7 +222,7 @@ }, "opening": { "title": "5. शुरुआत सोच-समझकर चुनें", - "body": "Standard बनावट में पहली चाल पर कोई धक्का नहीं दे सकता, इसलिए छोटे कदमों में केंद्र की ओर बढ़ें और अपनी तीन गोलियों की कतारें बनाए रखें। Belgian daisy में दोनों सेनाएँ तुरंत छू लेती हैं: पहला sumito खोजें और अपना सबसे कमज़ोर गुच्छा बचाएँ। हर बनावट को कंप्यूटर के खिलाफ आज़माएँ, तब पता चलेगा कि क्या बदलता है। पहली चाल सुरक्षित चाहिए? Abalone की शुरुआती चालें देखें।" + "body": "Standard बनावट में पहली चाल पर कोई धक्का नहीं दे सकता, इसलिए छोटे कदमों में केंद्र की ओर बढ़ें और अपनी तीन गोलियों की कतारें बनाए रखें। Belgian daisy में दोनों सेनाएँ तुरंत छू लेती हैं: पहला sumito खोजें और अपना सबसे कमज़ोर गुच्छा बचाएँ। हर बनावट को कंप्यूटर के खिलाफ आज़माएँ, तब पता चलेगा कि क्या बदलता है। पहली चाल सुरक्षित चाहिए? Abalone की शुरुआती चालें देखें। आपकी पहली योजना लेआउट पर निर्भर करती है, इसलिए ओपनिंग चुनने से पहले हर Abalone शुरुआती स्थिति देखें।" }, "attack_as_a_group": { "title": "6. समूह में हमला करें, अकेले हीरो बनकर नहीं", diff --git a/apps/game/src/i18n/locales/it/game.json b/apps/game/src/i18n/locales/it/game.json index 2ec00e1d..c5580ea8 100644 --- a/apps/game/src/i18n/locales/it/game.json +++ b/apps/game/src/i18n/locales/it/game.json @@ -157,7 +157,7 @@ "belgian_daisy": "Belgian daisy: le biglie partono in quattro gruppi a forma di fiore, uno per angolo. Nero e bianco si alternano intorno al tabellone (bianco in alto a sinistra e in basso a destra, nero in alto a destra e in basso a sinistra). Gli eserciti si toccano già alla prima mossa, quindi il gioco è veloce e tattico. È molto usata nei tornei perché è più equa della disposizione standard.", "german_daisy": "German daisy: ancora quattro gruppi a forma di fiore, con gli stessi colori della Belgian daisy (bianco in alto a sinistra e in basso a destra, nero in alto a destra e in basso a sinistra), ma spostati dagli angoli verso i lati. I gruppi partono più lontani, quindi l'apertura è più libera.", "others": "Altre nel gioco: Dutch daisy, Swiss daisy, Alien, Domination, Infiltration e The Wall. Scegline una quando avvii una partita.", - "compare": "Confrontale nel dettaglio: posizioni iniziali di Abalone.", + "compare": "Nuovo al tabellone? Parti dalla disposizione giusta: la nostra pagina sulle posizioni iniziali mostra Standard, Belgian daisy e German daisy fianco a fianco.", "openings": "Vuoi iniziare sul sicuro? Leggi le mosse di apertura di Abalone per principianti." }, "faq": { @@ -222,7 +222,7 @@ }, "opening": { "title": "5. Scegli l'apertura di proposito", - "body": "Nella disposizione standard nessuno può spingere alla prima mossa, quindi avanza verso il centro a piccoli passi e mantieni le tue file da tre. In una Belgian daisy gli eserciti si toccano subito: cerca il primo sumito e difendi il tuo gruppo più debole. Prova ogni disposizione contro il computer per capire cosa cambia. Ti serve una prima mossa sicura? Leggi le mosse di apertura di Abalone." + "body": "Nella disposizione standard nessuno può spingere alla prima mossa, quindi avanza verso il centro a piccoli passi e mantieni le tue file da tre. In una Belgian daisy gli eserciti si toccano subito: cerca il primo sumito e difendi il tuo gruppo più debole. Prova ogni disposizione contro il computer per capire cosa cambia. Ti serve una prima mossa sicura? Leggi le mosse di apertura di Abalone. Il tuo primo piano dipende dalla disposizione, quindi guarda ogni posizione iniziale di Abalone prima di scegliere un'apertura." }, "attack_as_a_group": { "title": "6. Attacca in gruppo, non da eroe", diff --git a/apps/game/src/i18n/locales/ja/game.json b/apps/game/src/i18n/locales/ja/game.json index 4633c3d8..6346efb3 100644 --- a/apps/game/src/i18n/locales/ja/game.json +++ b/apps/game/src/i18n/locales/ja/game.json @@ -156,7 +156,7 @@ "belgian_daisy": "Belgian daisy:ボールは花の形の4つのかたまりになり、四隅に1つずつ置かれます。黒と白は盤の周りで交互になります(白が左上と右下、黒が右上と左下)。最初の手から両軍が接するので、展開が速く戦術的です。標準配置より公平なため、大会でよく使われます。", "german_daisy": "German daisy:こちらも花の形の4つのかたまりで、色の配置はBelgian daisyと同じです(白が左上と右下、黒が右上と左下)。ただし、隅から辺のほうへずらして置きます。かたまり同士が離れているので、序盤は広く展開します。", "others": "ほかの配置:Dutch daisy、Swiss daisy、Alien、Domination、Infiltration、The Wall。ゲーム開始時に選べます。", - "compare": "詳しい比較はこちら:Abalone の初期配置。", + "compare": "盤に慣れていませんか?まずは配置選びから。初期配置のページでは、Standard、Belgian daisy、German daisy を並べて見られます。", "openings": "安全に始めたいなら、初心者向けのアバロンの序盤の指し方をどうぞ。" }, "faq": { @@ -221,7 +221,7 @@ }, "opening": { "title": "5. 配置に合わせて序盤を選ぶ", - "body": "Standardでは最初の1手で押せないので、小さな歩幅で中央へ展開し、3個の列を保ちましょう。Belgian daisyでは両軍がすぐ接するので、最初のスミートを探しつつ、いちばん弱いかたまりを守りましょう。各配置をコンピューターと試すと、何が変わるかがわかります。安全な最初の一手は、アバロンの序盤の指し方を参照。" + "body": "Standardでは最初の1手で押せないので、小さな歩幅で中央へ展開し、3個の列を保ちましょう。Belgian daisyでは両軍がすぐ接するので、最初のスミートを探しつつ、いちばん弱いかたまりを守りましょう。各配置をコンピューターと試すと、何が変わるかがわかります。安全な最初の一手は、アバロンの序盤の指し方を参照。最初の作戦は配置で変わります。序盤の指し方を選ぶ前に、アバロンの初期配置をそれぞれ見ておきましょう。" }, "attack_as_a_group": { "title": "6. 一人ではなく、組で攻める", diff --git a/apps/game/src/i18n/locales/ko/game.json b/apps/game/src/i18n/locales/ko/game.json index 8cb4326c..7efa5273 100644 --- a/apps/game/src/i18n/locales/ko/game.json +++ b/apps/game/src/i18n/locales/ko/game.json @@ -156,7 +156,7 @@ "belgian_daisy": "Belgian daisy: 구슬이 꽃 모양의 네 덩어리로 모여 각 모서리에 하나씩 놓입니다. 검은 구슬과 흰 구슬이 판을 돌며 번갈아 놓입니다(흰 구슬은 왼쪽 위와 오른쪽 아래, 검은 구슬은 오른쪽 위와 왼쪽 아래). 첫 수부터 두 군대가 맞닿아 진행이 빠르고 전술적입니다. 표준 배치보다 공정해서 대회에서 인기가 있습니다.", "german_daisy": "German daisy: 이번에도 꽃 모양의 네 덩어리이고 색 배치는 Belgian daisy와 같지만(흰 구슬은 왼쪽 위와 오른쪽 아래, 검은 구슬은 오른쪽 위와 왼쪽 아래), 모서리에서 변 쪽으로 옮겨 놓습니다. 덩어리끼리 더 멀리 떨어져 시작하므로 초반이 더 트여 있습니다.", "others": "게임 속 다른 배치: Dutch daisy, Swiss daisy, Alien, Domination, Infiltration, The Wall. 게임을 시작할 때 고를 수 있습니다.", - "compare": "자세한 비교: Abalone 시작 배치.", + "compare": "처음이신가요? 알맞은 배치부터 시작하세요. 시작 배치 페이지에서 Standard, Belgian daisy, German daisy를 나란히 볼 수 있습니다.", "openings": "안전하게 시작하고 싶다면 초보자를 위한 아발론 오프닝 수를 보세요." }, "faq": { @@ -221,7 +221,7 @@ }, "opening": { "title": "5. 시작 배치에 맞춰 초반을 고르세요", - "body": "Standard 배치에서는 첫 수에 밀 수 없으니, 작은 걸음으로 가운데를 향해 전개하고 세 개짜리 줄을 지키세요. Belgian daisy에서는 두 군대가 바로 맞닿으니 첫 스미토를 찾고, 가장 약한 덩어리를 지키세요. 배치마다 컴퓨터와 해 보면 무엇이 달라지는지 알 수 있습니다. 안전한 첫 수가 필요하다면 아발론 오프닝 수를 보세요." + "body": "Standard 배치에서는 첫 수에 밀 수 없으니, 작은 걸음으로 가운데를 향해 전개하고 세 개짜리 줄을 지키세요. Belgian daisy에서는 두 군대가 바로 맞닿으니 첫 스미토를 찾고, 가장 약한 덩어리를 지키세요. 배치마다 컴퓨터와 해 보면 무엇이 달라지는지 알 수 있습니다. 안전한 첫 수가 필요하다면 아발론 오프닝 수를 보세요. 첫 계획은 배치에 따라 달라지니, 오프닝을 고르기 전에 아발론 시작 배치를 하나씩 살펴보세요." }, "attack_as_a_group": { "title": "6. 혼자가 아니라 묶음으로 공격하세요", diff --git a/apps/game/src/i18n/locales/nl/game.json b/apps/game/src/i18n/locales/nl/game.json index 89614840..5226e5f5 100644 --- a/apps/game/src/i18n/locales/nl/game.json +++ b/apps/game/src/i18n/locales/nl/game.json @@ -157,7 +157,7 @@ "belgian_daisy": "Belgian daisy: de ballen beginnen in vier bloemvormige groepen, één in elke hoek. Zwart en wit wisselen elkaar af rond het bord (wit linksboven en rechtsonder, zwart rechtsboven en linksonder). De legers raken elkaar al in de eerste zet, dus het spel is snel en tactisch. Populair op toernooien omdat het eerlijker is dan de standaardopstelling.", "german_daisy": "German daisy: weer vier bloemvormige groepen, met dezelfde kleuren als de Belgian daisy (wit linksboven en rechtsonder, zwart rechtsboven en linksonder), maar vanuit de hoeken naar de zijkanten geschoven. De groepen beginnen verder uit elkaar, dus de opening is opener.", "others": "Andere in het spel: Dutch daisy, Swiss daisy, Alien, Domination, Infiltration en The Wall. Kies er een als je een spel start.", - "compare": "Vergelijk ze in detail: Abalone-beginopstellingen.", + "compare": "Nieuw op het bord? Begin met de juiste opstelling: onze pagina over de beginopstellingen toont Standard, Belgian daisy en German daisy naast elkaar.", "openings": "Veilig beginnen? Bekijk de openingszetten van Abalone voor beginners." }, "faq": { @@ -222,7 +222,7 @@ }, "opening": { "title": "5. Kies je opening bewust", - "body": "In de standaardopstelling kan niemand in de eerste zet duwen, dus ontwikkel je in kleine stappen naar het midden en houd je rijen van drie. Bij een Belgian daisy raken de legers elkaar meteen: zoek de eerste sumito en verdedig je zwakste groep. Probeer elke opstelling tegen de computer om te zien wat er verandert. Een veilige eerste zet nodig? Bekijk de openingszetten van Abalone." + "body": "In de standaardopstelling kan niemand in de eerste zet duwen, dus ontwikkel je in kleine stappen naar het midden en houd je rijen van drie. Bij een Belgian daisy raken de legers elkaar meteen: zoek de eerste sumito en verdedig je zwakste groep. Probeer elke opstelling tegen de computer om te zien wat er verandert. Een veilige eerste zet nodig? Bekijk de openingszetten van Abalone. Je eerste plan hangt af van de opstelling, dus bekijk elke Abalone-beginopstelling voordat je een opening kiest." }, "attack_as_a_group": { "title": "6. Val aan als groep, niet als held", diff --git a/apps/game/src/i18n/locales/pl/game.json b/apps/game/src/i18n/locales/pl/game.json index 7845a006..4889f74f 100644 --- a/apps/game/src/i18n/locales/pl/game.json +++ b/apps/game/src/i18n/locales/pl/game.json @@ -158,7 +158,7 @@ "belgian_daisy": "Belgian daisy: kule zaczynają w czterech skupiskach w kształcie kwiatu, po jednym w każdym rogu. Czarne i białe występują na przemian wokół planszy (białe w lewym górnym i prawym dolnym rogu, czarne w prawym górnym i lewym dolnym). Armie stykają się już w pierwszym ruchu, więc gra jest szybka i taktyczna. Popularny na turniejach, bo jest uczciwszy niż układ standardowy.", "german_daisy": "German daisy: znowu cztery skupiska w kształcie kwiatu, w tych samych kolorach co Belgian daisy (białe w lewym górnym i prawym dolnym rogu, czarne w prawym górnym i lewym dolnym), ale odsunięte od rogów w stronę boków. Skupiska zaczynają dalej od siebie, więc otwarcie jest swobodniejsze.", "others": "Inne w grze: Dutch daisy, Swiss daisy, Alien, Domination, Infiltration i The Wall. Wybierz jeden, zaczynając partię.", - "compare": "Porównaj je dokładnie: ustawienia początkowe w Abalone.", + "compare": "Dopiero zaczynasz? Zacznij od właściwego układu: nasza strona o ustawieniach początkowych pokazuje Standard, Belgian daisy i German daisy obok siebie.", "openings": "Chcesz zacząć bezpiecznie? Zobacz otwarcia w Abalone dla początkujących." }, "faq": { @@ -223,7 +223,7 @@ }, "opening": { "title": "5. Wybierz otwarcie świadomie", - "body": "W układzie standardowym nikt nie może wypychać w pierwszym ruchu, więc rozwijaj się ku środkowi małymi krokami i trzymaj rzędy po trzy kule. W Belgian daisy armie stykają się od razu: szukaj pierwszego sumito i broń swojego najsłabszego skupiska. Wypróbuj każdy układ z komputerem, by zobaczyć, co się zmienia. Potrzebujesz bezpiecznego pierwszego ruchu? Zobacz otwarcia w Abalone." + "body": "W układzie standardowym nikt nie może wypychać w pierwszym ruchu, więc rozwijaj się ku środkowi małymi krokami i trzymaj rzędy po trzy kule. W Belgian daisy armie stykają się od razu: szukaj pierwszego sumito i broń swojego najsłabszego skupiska. Wypróbuj każdy układ z komputerem, by zobaczyć, co się zmienia. Potrzebujesz bezpiecznego pierwszego ruchu? Zobacz otwarcia w Abalone. Twój pierwszy plan zależy od układu, więc obejrzyj każde ustawienie początkowe w Abalone, zanim wybierzesz otwarcie." }, "attack_as_a_group": { "title": "6. Atakuj grupą, nie jako bohater", diff --git a/apps/game/src/i18n/locales/pt/game.json b/apps/game/src/i18n/locales/pt/game.json index 8c4bc977..085a101d 100644 --- a/apps/game/src/i18n/locales/pt/game.json +++ b/apps/game/src/i18n/locales/pt/game.json @@ -157,7 +157,7 @@ "belgian_daisy": "Belgian daisy: as bolas começam em quatro grupos em forma de flor, um em cada canto. Pretas e brancas alternam à volta do tabuleiro (brancas em cima à esquerda e em baixo à direita, pretas em cima à direita e em baixo à esquerda). Os exércitos tocam-se logo na primeira jogada, por isso o jogo é rápido e tático. Popular em torneios porque é mais justo do que a disposição standard.", "german_daisy": "German daisy: outra vez quatro grupos em forma de flor, com as mesmas cores da Belgian daisy (brancas em cima à esquerda e em baixo à direita, pretas em cima à direita e em baixo à esquerda), mas afastados dos cantos em direção aos lados. Os grupos começam mais distantes, por isso a abertura é mais livre.", "others": "Outras no jogo: Dutch daisy, Swiss daisy, Alien, Domination, Infiltration e The Wall. Escolhe uma ao começares um jogo.", - "compare": "Compara-as em detalhe: posições iniciais do Abalone.", + "compare": "És novo no tabuleiro? Começa pela disposição certa: a nossa página de posições iniciais mostra Standard, Belgian daisy e German daisy lado a lado.", "openings": "Queres um começo seguro? Vê as aberturas de Abalone para iniciantes." }, "faq": { @@ -222,7 +222,7 @@ }, "opening": { "title": "5. Escolhe a abertura de propósito", - "body": "Na disposição standard, ninguém pode empurrar na primeira jogada, por isso avança para o centro a pequenos passos e mantém as tuas filas de três bolas. Num Belgian daisy os exércitos tocam-se logo: procura o primeiro sumito e defende o teu grupo mais fraco. Experimenta cada disposição contra o computador para ver o que muda. Precisas de uma primeira jogada segura? Vê as aberturas de Abalone." + "body": "Na disposição standard, ninguém pode empurrar na primeira jogada, por isso avança para o centro a pequenos passos e mantém as tuas filas de três bolas. Num Belgian daisy os exércitos tocam-se logo: procura o primeiro sumito e defende o teu grupo mais fraco. Experimenta cada disposição contra o computador para ver o que muda. Precisas de uma primeira jogada segura? Vê as aberturas de Abalone. O teu primeiro plano depende da disposição, por isso vê cada posição inicial do Abalone antes de escolheres uma abertura." }, "attack_as_a_group": { "title": "6. Ataca em grupo, não como um herói", diff --git a/apps/game/src/i18n/locales/tr/game.json b/apps/game/src/i18n/locales/tr/game.json index acaff69c..a09302f8 100644 --- a/apps/game/src/i18n/locales/tr/game.json +++ b/apps/game/src/i18n/locales/tr/game.json @@ -156,7 +156,7 @@ "belgian_daisy": "Belgian daisy: bilyeler, her köşede bir tane olmak üzere çiçek biçiminde dört kümede başlar. Siyah ve beyaz tahtanın çevresinde dönüşümlü durur (beyaz sol üst ve sağ alt, siyah sağ üst ve sol alt). Ordular ilk hamlede birbirine değer, bu yüzden oyun hızlı ve taktikseldir. Standart dizilimden daha adil olduğu için turnuvalarda sevilir.", "german_daisy": "German daisy: yine çiçek biçiminde dört küme var, renkler Belgian daisy ile aynı (beyaz sol üst ve sağ alt, siyah sağ üst ve sol alt), ama köşelerden kenarlara doğru içeri alınmıştır. Kümeler birbirinden daha uzak başlar, bu yüzden açılış daha açıktır.", "others": "Oyundaki diğerleri: Dutch daisy, Swiss daisy, Alien, Domination, Infiltration ve The Wall. Oyuna başlarken birini seç.", - "compare": "Ayrıntılı karşılaştırma: Abalone başlangıç dizilişleri.", + "compare": "Tahtada yeni misin? Doğru dizilişle başla: başlangıç dizilişleri sayfamız Standard, Belgian daisy ve German daisy dizilişlerini yan yana gösterir.", "openings": "Güvenli başlamak ister misin? Yeni başlayanlar için Abalone açılış hamleleri sayfasına bak." }, "faq": { @@ -221,7 +221,7 @@ }, "opening": { "title": "5. Açılışını bilerek seç", - "body": "Standart dizilimde ilk hamlede kimse itemez, bu yüzden küçük adımlarla merkeze doğru ilerle ve üçlü sıralarını koru. Belgian daisy dizilişinde ordular hemen temas eder: ilk sumito fırsatını ara ve en zayıf kümeni savun. Neyin değiştiğini görmek için her dizilimi bilgisayara karşı dene. Güvenli bir ilk hamle mi lazım? Abalone açılış hamleleri sayfasına bak." + "body": "Standart dizilimde ilk hamlede kimse itemez, bu yüzden küçük adımlarla merkeze doğru ilerle ve üçlü sıralarını koru. Belgian daisy dizilişinde ordular hemen temas eder: ilk sumito fırsatını ara ve en zayıf kümeni savun. Neyin değiştiğini görmek için her dizilimi bilgisayara karşı dene. Güvenli bir ilk hamle mi lazım? Abalone açılış hamleleri sayfasına bak. İlk planın dizilişe bağlıdır, bu yüzden bir açılış seçmeden önce her Abalone başlangıç dizilişine bak." }, "attack_as_a_group": { "title": "6. Kahraman gibi değil, grup olarak saldır", diff --git a/apps/game/src/i18n/locales/zh/game.json b/apps/game/src/i18n/locales/zh/game.json index 9c0e24d0..ae248995 100644 --- a/apps/game/src/i18n/locales/zh/game.json +++ b/apps/game/src/i18n/locales/zh/game.json @@ -156,7 +156,7 @@ "belgian_daisy": "Belgian daisy:棋子从四个花朵形的棋群开始,每个角一个。黑白两色绕棋盘交替排列(白方在左上和右下,黑方在右上和左下)。双方第一步就接触,所以节奏快、战术性强。它比标准布局更公平,因此在比赛中很受欢迎。", "german_daisy": "German daisy:同样是四个花朵形的棋群,颜色与 Belgian daisy 相同(白方在左上和右下,黑方在右上和左下),但从角落向边上内移。棋群一开始离得更远,所以开局更开阔。", "others": "游戏中的其他布局:Dutch daisy、Swiss daisy、Alien、Domination、Infiltration 和 The Wall。开始游戏时任选一个。", - "compare": "详细比较:Abalone 开局布局。", + "compare": "刚接触棋盘?先选对布局:我们的开局布局页面把 Standard、Belgian daisy 和 German daisy 并排展示。", "openings": "想稳妥开局?看看适合新手的 Abalone 开局走法。" }, "faq": { @@ -221,7 +221,7 @@ }, "opening": { "title": "5. 有意识地选择开局", - "body": "在标准布局里,第一步没人能推,所以要小步向中心展开,保住三颗一排的阵型。在 Belgian daisy 里双方一开始就贴在一起:要找出第一次 sumito,同时守住你最弱的那一群。每种布局都和电脑试一试,就知道有什么不同。需要安全的第一步?看看 Abalone 开局走法。" + "body": "在标准布局里,第一步没人能推,所以要小步向中心展开,保住三颗一排的阵型。在 Belgian daisy 里双方一开始就贴在一起:要找出第一次 sumito,同时守住你最弱的那一群。每种布局都和电脑试一试,就知道有什么不同。需要安全的第一步?看看 Abalone 开局走法。你的第一个计划取决于布局,所以选开局之前,先看看每种 Abalone 开局布局。" }, "attack_as_a_group": { "title": "6. 成组进攻,不要孤军奋战", diff --git a/apps/game/src/routing/pages/strategy.page.tsx b/apps/game/src/routing/pages/strategy.page.tsx index 0f772341..449a0672 100644 --- a/apps/game/src/routing/pages/strategy.page.tsx +++ b/apps/game/src/routing/pages/strategy.page.tsx @@ -124,6 +124,12 @@ function StrategyPage() { className={TEXT_LINK_CLASS} /> ), + positions: ( + + ), }} />

diff --git a/apps/game/src/routing/seo-pages.test.ts b/apps/game/src/routing/seo-pages.test.ts index 8d539d51..8375f238 100644 --- a/apps/game/src/routing/seo-pages.test.ts +++ b/apps/game/src/routing/seo-pages.test.ts @@ -27,9 +27,9 @@ const EXPECTED_COPY = { "Abalone opening moves for beginners: the starting position, safe first moves, side steps and how the daisy layouts change the opening. Try them free.", }, "/starting-positions": { - title: "Abalone starting positions: standard and daisy layouts", + title: "Abalone Starting Position: Standard, Belgian or German Daisy", description: - "Abalone starting positions explained: the standard layout, Belgian daisy and German daisy, how they differ and which to pick. Try each one free.", + "Abalone starting position explained: standard, Belgian daisy and German daisy side by side, how they differ and which to pick. Try each free.", }, "/offline": { title: "Play Abalone vs the computer or a friend on one device", @@ -101,11 +101,11 @@ describe("SITEMAP", () => { it("dates each page by the day its text last changed", () => { expect(SITEMAP).toEqual({ "/": "2026-11-01", - "/rules": "2026-10-19", - "/strategy": "2026-10-19", + "/rules": "2026-11-01", + "/strategy": "2026-11-01", "/play-online": "2026-11-01", - "/opening-moves": "2026-10-18", - "/starting-positions": "2026-10-18", + "/opening-moves": "2026-11-01", + "/starting-positions": "2026-11-01", }) }) }) diff --git a/apps/game/src/routing/seo-pages.ts b/apps/game/src/routing/seo-pages.ts index f1c99557..4bcfcaa5 100644 --- a/apps/game/src/routing/seo-pages.ts +++ b/apps/game/src/routing/seo-pages.ts @@ -62,9 +62,9 @@ export const SEO_PAGES: Record< image: "rules", }, "/starting-positions": { - title: "Abalone starting positions: standard and daisy layouts", + title: "Abalone Starting Position: Standard, Belgian or German Daisy", description: - "Abalone starting positions explained: the standard layout, Belgian daisy and German daisy, how they differ and which to pick. Try each one free.", + "Abalone starting position explained: standard, Belgian daisy and German daisy side by side, how they differ and which to pick. Try each free.", image: "rules", }, "/offline": { @@ -96,11 +96,11 @@ export const SITEMAP: Record< string > = { "/": "2026-11-01", - "/rules": "2026-10-19", - "/strategy": "2026-10-19", + "/rules": "2026-11-01", + "/strategy": "2026-11-01", "/play-online": "2026-11-01", - "/opening-moves": "2026-10-18", - "/starting-positions": "2026-10-18", + "/opening-moves": "2026-11-01", + "/starting-positions": "2026-11-01", } /** diff --git a/apps/game/src/routing/structured-data.test.ts b/apps/game/src/routing/structured-data.test.ts index f240381c..09af6062 100644 --- a/apps/game/src/routing/structured-data.test.ts +++ b/apps/game/src/routing/structured-data.test.ts @@ -179,7 +179,7 @@ describe("structured data", () => { "@type": "Article", headline: "Abalone starting positions", description: - "Abalone starting positions explained: the standard layout, Belgian daisy and German daisy, how they differ and which to pick. Try each one free.", + "Abalone starting position explained: standard, Belgian daisy and German daisy side by side, how they differ and which to pick. Try each free.", url: `${ORIGIN}/starting-positions`, mainEntityOfPage: `${ORIGIN}/starting-positions`, image: `${ORIGIN}/images/social/og-rules.jpg`, diff --git a/e2e/manual-layout.spec.ts b/e2e/manual-layout.spec.ts index 1ade14d2..693a5040 100644 --- a/e2e/manual-layout.spec.ts +++ b/e2e/manual-layout.spec.ts @@ -492,6 +492,29 @@ test.describe("every width", () => { }) }) +// The starting positions intro is the answer to "abalone starting position", +// a line longer than the rules one, so its budget starts at the 375 phones. +test("the starting positions CTA ends inside the first screen of a phone", async ({ + page, +}) => { + for (const viewport of [ + { width: 375, height: 667 }, + { width: 375, height: 548 }, + { width: 390, height: 664 }, + ]) { + await page.setViewportSize(viewport) + await openApp(page, "/starting-positions") + const cta = page + .getByRole("link", { name: "Play against the computer" }) + .first() + const box = await cta.boundingBox() + expect( + (box?.y ?? Number.POSITIVE_INFINITY) + (box?.height ?? 0), + `${viewport.width}x${viewport.height}`, + ).toBeLessThanOrEqual(viewport.height) + } +}) + test.describe("motion", () => { test.skip( ({ browserName }) => browserName !== "chromium", diff --git a/e2e/seo.spec.ts b/e2e/seo.spec.ts index 4c411dce..511220f0 100644 --- a/e2e/seo.spec.ts +++ b/e2e/seo.spec.ts @@ -18,7 +18,7 @@ const INDEXABLE = { "/opening-moves": "Abalone opening moves: a guide for beginners", "/play-online": "Play Abalone Online With Friends: Invite by Link", "/starting-positions": - "Abalone starting positions: standard and daisy layouts", + "Abalone Starting Position: Standard, Belgian or German Daisy", } as const // What sitemap.xml lists, and the day each page's text last changed. /offline @@ -26,11 +26,11 @@ const INDEXABLE = { // page that answers "play abalone". const SITEMAP = { "/": "2026-11-01", - "/rules": "2026-10-19", - "/strategy": "2026-10-19", + "/rules": "2026-11-01", + "/strategy": "2026-11-01", "/play-online": "2026-11-01", - "/opening-moves": "2026-10-18", - "/starting-positions": "2026-10-18", + "/opening-moves": "2026-11-01", + "/starting-positions": "2026-11-01", } as const // A language's own URL: /pt, /pt/rules diff --git a/e2e/strategy-page.spec.ts b/e2e/strategy-page.spec.ts index ea598fdf..e41d8c5a 100644 --- a/e2e/strategy-page.spec.ts +++ b/e2e/strategy-page.spec.ts @@ -169,6 +169,22 @@ test.describe("served HTML", () => { linkPattern("/strategy", "Abalone strategy: 7 tips"), ) }) + + test("the content pages each link to the starting positions once", async ({ + request, + }) => { + for (const [path, text] of [ + ["/strategy", "Abalone starting position"], + ["/rules", "starting positions"], + ["/opening-moves", "starting positions"], + ] as const) { + const html = await servedHtml(request, path) + expect(html, path).toMatch(linkPattern("/starting-positions", text)) + } + //the rules setups chapter keeps a single link, not the old one beside it + const rules = await servedHtml(request, "/rules") + expect(rules.match(/href="\/starting-positions"/g)).toHaveLength(1) + }) }) // The heading a player and a screen reader get, at this project's width.