From e081ffe361b06ca74db0a36bf72dd73602abf57b Mon Sep 17 00:00:00 2001
From: Benjamin Auder <benjamin.auder@somewhere>
Date: Sun, 23 Dec 2018 23:45:20 +0100
Subject: [PATCH] Advance on Spanish translation (still 13 rules to translate)

---
 public/images/flags/de.svg                |  5 --
 public/images/flags/it.svg                |  7 --
 public/javascripts/components/game.js     |  4 +-
 public/javascripts/components/problems.js |  4 +-
 routes/all.js                             |  2 +-
 views/index.pug                           |  9 ++-
 views/{langNames/fr.pug => langNames.pug} |  3 +-
 views/langNames/en.pug                    |  5 --
 views/modal-help/en.pug                   |  2 +-
 views/modal-help/es.pug                   | 23 +++++++
 views/modal-help/fr.pug                   |  2 +-
 views/modal-lang/es.pug                   | 25 +++++++
 views/rules/Alice/en.pug                  |  4 +-
 views/rules/Alice/es.pug                  | 62 +++++++++++++++++
 views/rules/Alice/fr.pug                  |  4 +-
 views/rules/Antiking/en.pug               |  2 +-
 views/rules/Antiking/fr.pug               |  2 +-
 views/rules/Atomic/en.pug                 |  6 +-
 views/rules/Atomic/fr.pug                 |  4 +-
 views/rules/Crazyhouse/en.pug             |  2 +-
 views/rules/Crazyhouse/fr.pug             |  2 +-
 views/rules/Extinction/en.pug             |  2 +-
 views/rules/Extinction/fr.pug             |  2 +-
 views/rules/Grand/en.pug                  |  2 +-
 views/rules/Grand/fr.pug                  |  2 +-
 views/rules/Loser/en.pug                  |  2 +-
 views/rules/Loser/fr.pug                  |  2 +-
 views/rules/Magnetic/en.pug               |  2 +-
 views/rules/Magnetic/fr.pug               |  2 +-
 views/rules/Switching/en.pug              |  2 +-
 views/rules/Switching/fr.pug              |  2 +-
 views/rules/Ultima/en.pug                 |  2 +-
 views/rules/Ultima/fr.pug                 |  2 +-
 views/rules/Wildebeest/en.pug             |  2 +-
 views/rules/Wildebeest/fr.pug             |  2 +-
 views/rules/Zen/en.pug                    |  2 +-
 views/rules/Zen/fr.pug                    |  2 +-
 views/translations/en.pug                 | 12 ++--
 views/translations/es.pug                 | 82 +++++++++++++++++++++++
 views/translations/fr.pug                 | 12 ++--
 views/variant.pug                         | 10 +--
 views/welcome/es.pug                      | 54 +++++++++++++++
 views/welcome/fr.pug                      |  2 +-
 43 files changed, 307 insertions(+), 76 deletions(-)
 delete mode 100644 public/images/flags/de.svg
 delete mode 100644 public/images/flags/it.svg
 rename views/{langNames/fr.pug => langNames.pug} (53%)
 delete mode 100644 views/langNames/en.pug
 create mode 100644 views/modal-help/es.pug
 create mode 100644 views/modal-lang/es.pug
 create mode 100644 views/rules/Alice/es.pug
 create mode 100644 views/translations/es.pug
 create mode 100644 views/welcome/es.pug

diff --git a/public/images/flags/de.svg b/public/images/flags/de.svg
deleted file mode 100644
index 1acf302d..00000000
--- a/public/images/flags/de.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" id="flag-icon-css-de" viewBox="0 0 640 480">
-  <path fill="#ffce00" d="M0 320h640v160H0z"/>
-  <path d="M0 0h640v160H0z"/>
-  <path fill="#d00" d="M0 160h640v160H0z"/>
-</svg>
diff --git a/public/images/flags/it.svg b/public/images/flags/it.svg
deleted file mode 100644
index 5cb92aaa..00000000
--- a/public/images/flags/it.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" id="flag-icon-css-it" viewBox="0 0 640 480">
-  <g fill-rule="evenodd" stroke-width="1pt">
-    <path fill="#fff" d="M0 0h640v480H0z"/>
-    <path fill="#009246" d="M0 0h213.3v480H0z"/>
-    <path fill="#ce2b37" d="M426.7 0H640v480H426.7z"/>
-  </g>
-</svg>
diff --git a/public/javascripts/components/game.js b/public/javascripts/components/game.js
index d9960160..88b193ff 100644
--- a/public/javascripts/components/game.js
+++ b/public/javascripts/components/game.js
@@ -415,7 +415,7 @@ Vue.component('my-game', {
 					h('button',
 						{
 							on: { click: () => { this.mycolor = this.vr.getOppCol(this.mycolor) } },
-							attrs: { "aria-label": translations['Flip'] },
+							attrs: { "aria-label": translations['Flip board'] },
 							"class": {
 								"play": true,
 								"spaceleft": true,
@@ -568,7 +568,7 @@ Vue.component('my-game', {
 								{
 									attrs: { "id": "titleFenedit" },
 									"class": { "section": true },
-									domProps: { innerHTML: translations["Position + flags (FEN):"] },
+									domProps: { innerHTML: translations["Game state (FEN):"] },
 								}
 							),
 							h('input',
diff --git a/public/javascripts/components/problems.js b/public/javascripts/components/problems.js
index ef017e59..63f06e55 100644
--- a/public/javascripts/components/problems.js
+++ b/public/javascripts/components/problems.js
@@ -39,7 +39,7 @@ Vue.component('my-problems', {
 						<fieldset>
 							<label for="newpbFen">FEN</label>
 							<input id="newpbFen" type="text" v-model="newProblem.fen"
-								:placeholder='translate("Full FEN string")'/>
+								:placeholder='translate("Full FEN description")'/>
 						</fieldset>
 						<fieldset>
 							<p class="emphasis">{{ translate("Safe HTML tags allowed") }}</p>
@@ -105,7 +105,7 @@ Vue.component('my-problems', {
 		},
 		previewNewProblem: function() {
 			if (!V.IsGoodFen(this.newProblem.fen))
-				return alert(translations["Bad FEN string"]);
+				return alert(translations["Bad FEN description"]);
 			if (this.newProblem.instructions.trim().length == 0)
 				return alert(translations["Empty instructions"]);
 			if (this.newProblem.solution.trim().length == 0)
diff --git a/routes/all.js b/routes/all.js
index 54f1611d..79f7c3d8 100644
--- a/routes/all.js
+++ b/routes/all.js
@@ -7,7 +7,7 @@ const db = new sqlite3.Database(DbPath);
 const sanitizeHtml = require('sanitize-html');
 const MaxNbProblems = 20;
 
-const supportedLang = ["fr","en"];
+const supportedLang = ["en","es","fr"];
 function selectLanguage(req, res)
 {
 	// If preferred language already set:
diff --git a/views/index.pug b/views/index.pug
index 66c434a0..34c059b4 100644
--- a/views/index.pug
+++ b/views/index.pug
@@ -5,17 +5,20 @@ block css
 
 block content
 	.container#indexPage
-		// Modals
+		include langNames.pug
 		case lang
 			when "en"
 				include translations/en.pug
-				include langNames/en.pug
 				include welcome/en.pug
 				include modal-lang/en.pug
 				include modal-help/en.pug
+			when "es"
+				include translations/es.pug
+				include welcome/es.pug
+				include modal-lang/es.pug
+				include modal-help/es.pug
 			when "fr"
 				include translations/fr.pug
-				include langNames/fr.pug
 				include welcome/fr.pug
 				include modal-lang/fr.pug
 				include modal-help/fr.pug
diff --git a/views/langNames/fr.pug b/views/langNames.pug
similarity index 53%
rename from views/langNames/fr.pug
rename to views/langNames.pug
index cab58c80..997e5830 100644
--- a/views/langNames/fr.pug
+++ b/views/langNames.pug
@@ -1,5 +1,6 @@
 -
 	var langName = {
+		"en": "English",
+		"es": "Español",
 		"fr": "Français",
-		"en": "Anglais",
 	};
diff --git a/views/langNames/en.pug b/views/langNames/en.pug
deleted file mode 100644
index fc1f7e56..00000000
--- a/views/langNames/en.pug
+++ /dev/null
@@ -1,5 +0,0 @@
--
-	var langName = {
-		"en": "English",
-		"fr": "French",
-	};
diff --git a/views/modal-help/en.pug b/views/modal-help/en.pug
index 53112759..95413552 100644
--- a/views/modal-help/en.pug
+++ b/views/modal-help/en.pug
@@ -6,7 +6,7 @@ div(role="dialog")
 			ol
 				li Click on a variant,
 				li Read the rules (in the upper left corner),
-				li Back to playing mode (click on "Play!")
+				li Back to playing mode (click on "Play")
 				li Click on "new live game", and then, while waiting
 				li Click on "new computer game" (just next).
 			p Reminder:
diff --git a/views/modal-help/es.pug b/views/modal-help/es.pug
new file mode 100644
index 00000000..28ff4c3e
--- /dev/null
+++ b/views/modal-help/es.pug
@@ -0,0 +1,23 @@
+input#modalHelp.modal(type="checkbox")
+div(role="dialog")
+	#help.card
+		label.modal-close(for="modalHelp")
+		.section
+			ol
+				li Haga clic en una variante,
+				li Lee las reglas (arriba a la izquierda),
+				li Volver al modo de juego (haga clic en "Jugar"),
+				li Haga clic en "nuevo juego en vivo", luego, mientras tanto,
+				li Haga clic en "nuevo juego contra la computadora" (siguiente).
+			p Recordatorio :
+			ul
+				li Todas las partes comienzan con una posición aleatoria asimétrica.
+				li Los juegos no están cronometrados, y se juegan anónimamente.
+				li No charla durante el juego, para concentrarse en los movimientos.
+		.section
+			h3.red Informe de bug
+			p
+				| Por favor envíe un correo electrónico (en inglés o francés) a 
+				a(href="mailto:contact@vchess.club?subject=[vchess.club] bug report")
+					| contact@vchess.club
+				| .
diff --git a/views/modal-help/fr.pug b/views/modal-help/fr.pug
index 3d60e8b2..54c607c0 100644
--- a/views/modal-help/fr.pug
+++ b/views/modal-help/fr.pug
@@ -6,7 +6,7 @@ div(role="dialog")
 			ol
 				li Cliquez sur une variante,
 				li Lisez les règles (en haut à gauche),
-				li Revenez en mode jeu (cliquer sur "Jouer!")
+				li Revenez en mode jeu (cliquer sur "Jouer")
 				li Cliquez sur "nouvelle partie en direct", puis, en attendant
 				li Cliquez sur "nouvelle partie contre l'ordinateur" (à côté).
 			p Rappel :
diff --git a/views/modal-lang/es.pug b/views/modal-lang/es.pug
new file mode 100644
index 00000000..114bbd0a
--- /dev/null
+++ b/views/modal-lang/es.pug
@@ -0,0 +1,25 @@
+input#modalLang.modal(type="checkbox")
+div(role="dialog")
+	#language.card
+		label.modal-close(for="modalLang")
+		.section
+			fieldset
+				label(for="langSelect") ¿ Idioma preferido ?
+				select#langSelect(onChange="setLanguage(event)")
+					each langCode in languages
+						option(value=langCode selected=(lang==langCode))
+							=langName[langCode]
+		.section
+			h3.blue Contribuir
+			p
+				| ¿ Tu idioma favorito no está disponible ? Entonces...
+				| Navegar por el 
+				a(href="https://github.com/yagu0/vchess/tree/master/views")
+					| repositorio github
+				| &nbsp;: tiene que traducir todos los ficheros en los archivos langNames/,
+				| modal-help/, modal-lang/, translations/ y welcome/.
+				| Además, y esa es la parte principal del trabajo, tiene que traducir todas
+				| las reglas en rules/. Una vez hecho esto, envíame los archivos : 
+				a(href="mailto:contact@vchess.club?subject=[vchess.club] translation")
+					| contact@vchess.club
+				| . ¡ Gracias !
diff --git a/views/rules/Alice/en.pug b/views/rules/Alice/en.pug
index 4e9ab6a3..726e58c0 100644
--- a/views/rules/Alice/en.pug
+++ b/views/rules/Alice/en.pug
@@ -50,10 +50,10 @@ p.
 	occur on board 2, because it would mean king and rook moved). Moreover, the
 	king cannot be in check on board 2 after castling.
 
-h3 Credits
+h3 More information
 
 p
-	| Alice chess pages on 
+	| See the Alice chess pages on 
 	a(href="https://www.chessvariants.com/other.dir/alice.html") chessvariants.com
 	| &nbsp;and on 
 	a(href="https://www.schemingmind.com/journalarticle.aspx?article_id=9")
diff --git a/views/rules/Alice/es.pug b/views/rules/Alice/es.pug
new file mode 100644
index 00000000..808b78f9
--- /dev/null
+++ b/views/rules/Alice/es.pug
@@ -0,0 +1,62 @@
+p.boxed
+	| Cada pieza movida llega a otra tabla ("en el otro lado del espejo").
+	| Hay dos tableros. Todas las piezas comienzan en el tablero 1.
+
+h3 Especificaciones
+
+ul
+	li Tablero : estándar.
+	li Matériel : estándar + piezas Alice.
+	li Movimientos simples : estándar.
+	li Movimientos especiales : estándar.
+	li Capturas : estándar (en el mismo tablero).
+	li Final de partida : estándar.
+
+h3 Lo esencial
+
+p.
+	En esta variante se utilizan dos tableros.
+	Las piezas del tablero 2 están representadas al revés.
+	Cada movimiento jugado debe ser válido en su tablero (en el sentido habitual)
+	Además, la casilla de llegada no debe estar ocupado por una pieza en el otro
+	tablero (es lo que hace posible representar todo en 64 cajas).
+
+p La notación de las "piezas Alice" es la siguiente :
+ul
+	li Peon : S
+	li Torre : U
+	li Caballo : O
+	li Alfil : C
+	li Dama : T
+	li Rey : L
+
+figure.diagram-container
+	.diagram
+		| fen:rnbqkbnr/ppp1pppp/8/8/2p5/5O2/PP1PPPPP/RNBQKB1R:
+	figcaption Despues de los movimientos 1.Nf3 Pd5 2.Pc4 Sxc4
+
+h3 Final de partida
+
+p.
+	Al igual que con el ajedrez ortodoxo, jaque mate es una victoria.
+	El rey contrario no debe ser capaz de contrarrestar el jaque, ni siquiera mientras
+	se escapa en el otro tablero de ajedrez.
+
+p.
+	Nota : la captura en-passant y el enroque se hacen como en el juego ortodoxo.
+	Más precisamente, uno puede tomar en-passant cualquiera que sea el mundo de
+	salida y llegada de los peones.
+	Esto se justifica por el paso de los peones "a través del espejo": se pueden
+	capturar justo antes o después del espejo. El enroque debe ser legal en el
+	tablero de partida (necesariamente 1, de lo contrario el rey se ha movido y el
+	enroque ya no es legal), y el rey no debe estar bajo control en el tablero de llegada.
+
+h3 Más información
+
+p
+	| Ver las páginas dedicadas a esta variante en 
+	a(href="https://www.chessvariants.com/other.dir/alice.html") chessvariants.com
+	| &nbsp;y 
+	a(href="https://www.schemingmind.com/journalarticle.aspx?article_id=9")
+		| schemingmind.com
+	| .
diff --git a/views/rules/Alice/fr.pug b/views/rules/Alice/fr.pug
index b187abb5..d9353be9 100644
--- a/views/rules/Alice/fr.pug
+++ b/views/rules/Alice/fr.pug
@@ -51,10 +51,10 @@ p.
 	(forcément le 1, sinon le roi a bougé et le roque n'est plus légal),
 	et le roi ne doit pas être en échec sur l'échiquier d'arrivée.
 
-h3 Liens
+h3 Plus d'information
 
 p
-	| Les pages dédiées à cette variante sur 
+	| Voir les pages dédiées à cette variante sur 
 	a(href="https://www.chessvariants.com/other.dir/alice.html") chessvariants.com
 	| &nbsp;et 
 	a(href="https://www.schemingmind.com/journalarticle.aspx?article_id=9")
diff --git a/views/rules/Antiking/en.pug b/views/rules/Antiking/en.pug
index d31ddd0b..80b8521d 100644
--- a/views/rules/Antiking/en.pug
+++ b/views/rules/Antiking/en.pug
@@ -41,7 +41,7 @@ p.
 	Note 2: since it would allow a basic tactic (keep antiking touching opponent's
 	king), kings do not attack antikings.
 
-h3 Credits
+h3 Source
 
 p
 	a(href="https://www.chessvariants.com/diffobjective.dir/anti-king-chess.html")
diff --git a/views/rules/Antiking/fr.pug b/views/rules/Antiking/fr.pug
index 2337aefc..839cf2a6 100644
--- a/views/rules/Antiking/fr.pug
+++ b/views/rules/Antiking/fr.pug
@@ -43,7 +43,7 @@ p.
 	En effet ceci permettrait d'appliquer une méthode simple pour ne jamais
 	être en "anti-échec" : rester collé au roi adverse.
 
-h3 Liens
+h3 Source
 
 p
 	| La 
diff --git a/views/rules/Atomic/en.pug b/views/rules/Atomic/en.pug
index b52aab55..ee8ae9e0 100644
--- a/views/rules/Atomic/en.pug
+++ b/views/rules/Atomic/en.pug
@@ -37,10 +37,10 @@ p.
 	Note: suicide is forbidden. Thus a king can touch the opponent king -
 	and become immune to checks.
 
-h3 Credits
+h3 More information
 
 p.
-	Many resources can be found on the web (this variation is played on lichess and
-	FICS, among others).
+	Many resources can be found on the web ("Google it"; this variation is played on
+	lichess and FICS, among others).
 	This game was played first in 1995 at the German Internet Chess Server (GICS)
 	according to Wikipedia.
diff --git a/views/rules/Atomic/fr.pug b/views/rules/Atomic/fr.pug
index 0226b75e..894155b0 100644
--- a/views/rules/Atomic/fr.pug
+++ b/views/rules/Atomic/fr.pug
@@ -37,10 +37,10 @@ p.
 	Note : le suicide est interdit. Ainsi, le roi peut toucher le roi adverse
 	et devenir invulnérable aux échecs.
 
-h3 Liens
+h3 Plus d'information
 
 p.
-	Beaucoup d'informations sont disponibles sur cette variante
+	Beaucoup d'informations sont disponibles sur cette variante : "Google it"
 	(elle est jouée sur lichess et sur FICS, entre autres).
 	Celle-ci est née en 1995 sur le German Internet Chess Server (GICS)
 	à en croire Wikipedia.
diff --git a/views/rules/Crazyhouse/en.pug b/views/rules/Crazyhouse/en.pug
index 5dda3e2b..4409473b 100644
--- a/views/rules/Crazyhouse/en.pug
+++ b/views/rules/Crazyhouse/en.pug
@@ -35,7 +35,7 @@ p.
 	not the promoted piece. This is to allow to gain material on last rank without
 	fear of giving a queen to the opponent.
 
-h3 Credits
+h3 More information
 
 p
 	| This variant is very popular, a possible starting point is 
diff --git a/views/rules/Crazyhouse/fr.pug b/views/rules/Crazyhouse/fr.pug
index 370d4a4b..77bd4c60 100644
--- a/views/rules/Crazyhouse/fr.pug
+++ b/views/rules/Crazyhouse/fr.pug
@@ -37,7 +37,7 @@ p.
 	joueur capturant, et non pas la pièce capturée. Ceci permet de promouvoir
 	ses pions sans craindre de donner une dame à l'adversaire.
 
-h3 Liens
+h3 Plus d'information
 
 p
 	| Cette variante est très populaire ; vous pouvez par exemple commencer par 
diff --git a/views/rules/Extinction/en.pug b/views/rules/Extinction/en.pug
index d01b89d8..c93f9c04 100644
--- a/views/rules/Extinction/en.pug
+++ b/views/rules/Extinction/en.pug
@@ -33,7 +33,7 @@ figure.diagram-container
 		| fen:n3brk1/5ppp/3q4/8/8/8/1Q3PPP/K1R1B1N1:
 	figcaption White can win in 2 moves: 1.Qb7, 2.QxN
 
-h3 Credits
+h3 Source
 
 p
 	a(href="https://www.chessvariants.com/winning.dir/extinction.html") Extinction chess 
diff --git a/views/rules/Extinction/fr.pug b/views/rules/Extinction/fr.pug
index 37b9a24c..303bc247 100644
--- a/views/rules/Extinction/fr.pug
+++ b/views/rules/Extinction/fr.pug
@@ -33,7 +33,7 @@ figure.diagram-container
 		| fen:n3brk1/5ppp/3q4/8/8/8/1Q3PPP/K1R1B1N1:
 	figcaption Les blancs peuvent gagner en deux coups : 1.Qb7, 2.QxN
 
-h3 Liens
+h3 Source
 
 p
 	| La 
diff --git a/views/rules/Grand/en.pug b/views/rules/Grand/en.pug
index 381d3133..26fe75c7 100644
--- a/views/rules/Grand/en.pug
+++ b/views/rules/Grand/en.pug
@@ -50,7 +50,7 @@ p.
 	Thus the castling rule was introduced compared to the rules described
 	on chessvariants.com.
 
-h3 Credits
+h3 Source
 
 p
 	| Grand chess page on 
diff --git a/views/rules/Grand/fr.pug b/views/rules/Grand/fr.pug
index c75b357b..30dee721 100644
--- a/views/rules/Grand/fr.pug
+++ b/views/rules/Grand/fr.pug
@@ -51,7 +51,7 @@ p.
 	variantes). Du coup la règle du roque a été ajoutée comparée aux règles
 	décrites initialement.
 
-h3 Liens
+h3 Source
 
 p
 	| La page dédiée à la variante Grand sur 
diff --git a/views/rules/Loser/en.pug b/views/rules/Loser/en.pug
index babf89a6..bf4ba820 100644
--- a/views/rules/Loser/en.pug
+++ b/views/rules/Loser/en.pug
@@ -37,7 +37,7 @@ p.
 	Win by losing all material or be stalemated (for example with only blocked pawns
 	remaining on board).
 
-h3 Credits
+h3 More information
 
 p
 	| This is a popular variant, played in many places on the web.
diff --git a/views/rules/Loser/fr.pug b/views/rules/Loser/fr.pug
index a9575103..cfa3ae5d 100644
--- a/views/rules/Loser/fr.pug
+++ b/views/rules/Loser/fr.pug
@@ -39,7 +39,7 @@ p.
 	Gagnez en perdant tout votre matériel ou en étant pat (par exemple avec
 	uniquement des pions bloqués restant sur l'échiquier).
 
-h3 Liens
+h3 Plus d'information
 
 p
 	| Cette variante est très populaire, et est jouée en divers endroits sur internet.
diff --git a/views/rules/Magnetic/en.pug b/views/rules/Magnetic/en.pug
index 668cb8d7..4d61b10d 100644
--- a/views/rules/Magnetic/en.pug
+++ b/views/rules/Magnetic/en.pug
@@ -41,7 +41,7 @@ p Win by capturing opponent's king. There is no notion of check or stalemate her
 
 p Note: while castling, the changes are made by the rook movement.
 
-h3 Credits
+h3 Source
 
 p
 	a(href="https://www.chessvariants.com/other.dir/magnetic.html") Magnetic chess 
diff --git a/views/rules/Magnetic/fr.pug b/views/rules/Magnetic/fr.pug
index 13e232ab..86451cbd 100644
--- a/views/rules/Magnetic/fr.pug
+++ b/views/rules/Magnetic/fr.pug
@@ -42,7 +42,7 @@ p Gagnez en capturant le roi adverse. Il n'y a pas de notion d'échec ou de pat.
 
 p Note : lors du roque, les effets magnétiques sont appliqués par la tour en mouvement.
 
-h3 Liens
+h3 Source
 
 p
 	| La 
diff --git a/views/rules/Switching/en.pug b/views/rules/Switching/en.pug
index f3433bfd..7eb011a6 100644
--- a/views/rules/Switching/en.pug
+++ b/views/rules/Switching/en.pug
@@ -35,7 +35,7 @@ p.
 	from the king are triggered in the same way. Castling takes priority:
 	if you wanna switch, use the rook.
 
-h3 Credits
+h3 Source
 
 p
 	a(href="https://www.chessvariants.com/diffmove.dir/switching.html") Switching chess 
diff --git a/views/rules/Switching/fr.pug b/views/rules/Switching/fr.pug
index 6e4e4351..256cf883 100644
--- a/views/rules/Switching/fr.pug
+++ b/views/rules/Switching/fr.pug
@@ -36,7 +36,7 @@ p.
 	l'échange peuvent parfois être déclenchés de la même façon. Le roque étant
 	prioritaire, l'échange s'effectue en sélectionnant d'abord la tour.
 
-h3 Liens
+h3 Source
 
 p
 	| La
diff --git a/views/rules/Ultima/en.pug b/views/rules/Ultima/en.pug
index 16df02c9..e2876fdf 100644
--- a/views/rules/Ultima/en.pug
+++ b/views/rules/Ultima/en.pug
@@ -157,7 +157,7 @@ figure.diagram-container
 		| fen:7k/8/8/p4r/4K3/8/8/8 e5:
 	figcaption 1.Ke5 is impossible
 
-h3 Credits
+h3 More information
 
 p.
 	| A good starting point is the 
diff --git a/views/rules/Ultima/fr.pug b/views/rules/Ultima/fr.pug
index 19addaad..006df693 100644
--- a/views/rules/Ultima/fr.pug
+++ b/views/rules/Ultima/fr.pug
@@ -163,7 +163,7 @@ figure.diagram-container
 		| fen:7k/8/8/p4r/4K3/8/8/8 e5:
 	figcaption 1.Ke5 est impossible
 
-h3 Liens
+h3 Plus d'information
 
 p
 	| La 
diff --git a/views/rules/Wildebeest/en.pug b/views/rules/Wildebeest/en.pug
index c22bb407..30516c9a 100644
--- a/views/rules/Wildebeest/en.pug
+++ b/views/rules/Wildebeest/en.pug
@@ -43,7 +43,7 @@ p.
 	Note: the castling rule is more restrictive than described in the original rules.
 	The game seems OK like that, but this may change soon enough.
 
-h3 Credits
+h3 Source
 
 p
 	| The 
diff --git a/views/rules/Wildebeest/fr.pug b/views/rules/Wildebeest/fr.pug
index 1fcb3541..c4894f3d 100644
--- a/views/rules/Wildebeest/fr.pug
+++ b/views/rules/Wildebeest/fr.pug
@@ -43,7 +43,7 @@ p.
 	Note : la règle du roque est plus restrictive que celle décrite par les règles
 	originelles. Le jeu semble OK comme ça, mais cela pourrait changer assez vite.
 
-h3 Liens
+h3 Source
 
 p
 	| La
diff --git a/views/rules/Zen/en.pug b/views/rules/Zen/en.pug
index 9fa22191..a5dab4d9 100644
--- a/views/rules/Zen/en.pug
+++ b/views/rules/Zen/en.pug
@@ -37,7 +37,7 @@ figure.diagram-container
 	figcaption.
 		The king cannot take on a8 because it's guarded by the knight: it's checkmate
 
-h3 Credits
+h3 Source
 
 p.
 	Very few resources about this variation: 
diff --git a/views/rules/Zen/fr.pug b/views/rules/Zen/fr.pug
index ef4fdd32..bc3566fc 100644
--- a/views/rules/Zen/fr.pug
+++ b/views/rules/Zen/fr.pug
@@ -36,7 +36,7 @@ figure.diagram-container
 	figcaption.
 		Le roi ne peut prendre en a8, case gardée par le cavalier : c'est mat
 
-h3 Liens
+h3 Source
 
 p.
 	Très peu d'informations sur le web à propos de cette variante : 
diff --git a/views/translations/en.pug b/views/translations/en.pug
index 5138e77f..5253c976 100644
--- a/views/translations/en.pug
+++ b/views/translations/en.pug
@@ -25,7 +25,7 @@
 		"New game": "New game",
 		"Waiting for opponent...": "Waiting for opponent...",
 		"Rules": "Rules",
-		"Play!": "Play!",
+		"Play": "Play",
 		"Problems": "Problems",
 		"White win": "White win",
 		"Black win": "Black win",
@@ -38,9 +38,8 @@
 		"Settings": "Settings",
 		"Resign": "Resign",
 		"Undo": "Undo",
-		"Play": "Play",
-		"Flip": "Flip",
-		"Position + flags (FEN):": "Position + flags (FEN):",
+		"Flip board": "Flip board",
+		"Game state (FEN):": "Game state (FEN):",
 		"Ok": "Ok",
 		"Random": "Random",
 		"Preferences": "Preferences",
@@ -52,7 +51,6 @@
 		"blue": "blue",
 		"Play sounds?": "Play sounds?",
 		"None": "None",
-		"New game": "New game",
 		"All": "All",
 		"Chat with ": "Chat with ",
 		"Type here": "Type here",
@@ -63,7 +61,7 @@
 		"Load next problems": "Load next problems",
 		"New": "New",
 		"Add a problem": "Add a problem",
-		"Full FEN string": "Full FEN string",
+		"Full FEN description": "Full FEN description",
 		"Safe HTML tags allowed": "Safe HTML tags allowed",
 		"Instructions": "Instructions",
 		"Describe the problem goal": "Describe the problem goal",
@@ -72,7 +70,7 @@
 		"Preview": "Preview",
 		"Cancel": "Cancel",
 		"Solve": "Solve",
-		"Bad FEN string": "Bad FEN string",
+		"Bad FEN description": "Bad FEN description",
 		"Empty instructions": "Empty instructions",
 		"Empty solution": "Empty solution",
 		"Already playing a game in this variant on another tab!":
diff --git a/views/translations/es.pug b/views/translations/es.pug
new file mode 100644
index 00000000..a839ef81
--- /dev/null
+++ b/views/translations/es.pug
@@ -0,0 +1,82 @@
+-
+	var translations =
+	{
+		// Index page:
+		"Help": "Ayuda",
+		"First visit?": "¿ Primera visita ?",
+		">>> Please read this <<<": ">>> Por favor lee esto <<<",
+		// Variants boxes:
+		"Both sides of the mirror": "Ambos lados del espejo",
+		"Keep antiking in check": "Mantener el antirey en jaque",
+		"Explosive captures": "Capturas explosivas",
+		"Shared pieces": "Piezas compartidas",
+		"Standard rules": "Reglas estandar",
+		"Captures reborn": "Las capturas renacen",
+		"Capture all of a kind": "Capturar todo del mismo tipo",
+		"Big board": "Gran tablero",
+		"Lose all pieces": "Perder todas las piezas",
+		"Laws of attraction": "Las leyes de las atracciones",
+		"Exchange pieces positions": "Intercambiar las posiciones de las piezas",
+		"Exotic captures": "Capturas exóticas",
+		"Balanced sliders & leapers": "Modos de desplazamiento equilibrados",
+		"Reverse captures": "Capturas invertidas",
+
+		// Variant page:
+		"New game": "Nueva partida",
+		"Waiting for opponent...": "Esperando a un oponente...",
+		"Rules": "Reglas",
+		"Play": "Jugar",
+		"Problems": "Problemas",
+		"White win": "Las blancas ganan",
+		"Black win": "Las negras ganan",
+		"Draw": "Empate",
+		"New live game": "Nueva partida en vivo",
+		"New game versus computer": "Nueva partida contra la computadora",
+		"Analysis mode": "Modo de análisis",
+		"Start chat": "Iniciar chat",
+		"Clear game versus computer": "Borrar la partida contra la computadora",
+		"Settings": "Ajustes",
+		"Resign": "Abandonar",
+		"Undo": "Deshacer",
+		"Flip board": "Girar el tablero",
+		"Game state (FEN):": "Estado del juego (FEN) :",
+		"Ok": "Ok",
+		"Random": "Aleatorio",
+		"Preferences": "Preferencias",
+		"My name is...": "Mi nombre es...",
+		"Show hints?": "Ayudas visuales ?",
+		"Board colors": "Colores del tablero",
+		"brown": "marrón",
+		"green": "verde",
+		"blue": "azul",
+		"Play sounds?": "¿ Tocar los sonidos ?",
+		"None": "No",
+		"All": "Todos",
+		"Chat with ": "Hablar con ",
+		"Type here": "Escribe aqui",
+		"Send": "Enviar",
+		"Download game": "Descargar la partida",
+		"Show solution": "Mostrar la solucion",
+		"Load previous problems": "Cargar los problemas anteriores",
+		"Load next problems": "Cargar los siguientes problemas",
+		"New": "Nuevo",
+		"Add a problem": "Añadir un problema",
+		"Full FEN description": "Descripción FEN completa",
+		"Safe HTML tags allowed": "HTML 'seguro' autorizado",
+		"Instructions": "Instrucciones",
+		"Describe the problem goal": "Describe el objetivo del problema",
+		"Solution": "Solución",
+		"How to solve the problem?": "¿ Como resolver el problema ?",
+		"Preview": "Previsualizar",
+		"Cancel": "Anular",
+		"Solve": "Resolver",
+		"Bad FEN string": "Mala descripción FEN",
+		"Empty instructions": "Instrucciones vacias",
+		"Empty solution": "Solución vacía",
+		"Already playing a game in this variant on another tab!":
+			"¡ Una partida está en progreso en esta variante en otra pestaña !",
+		"Finish your ": "¡ Termina tu ",
+		" game first!": " partida primero !",
+		": unfinished computer game will be erased":
+			" : una partida inconclusa contra la computadora será borrado",
+	};
diff --git a/views/translations/fr.pug b/views/translations/fr.pug
index 8e4f66a2..c4229fe8 100644
--- a/views/translations/fr.pug
+++ b/views/translations/fr.pug
@@ -11,7 +11,7 @@
 		"Explosive captures": "Captures explosives",
 		"Shared pieces": "Pièces partagées",
 		"Standard rules": "Règles usuelles",
-		"Captures reborn": "Captures ressucitées",
+		"Captures reborn": "Les captures renaissent",
 		"Capture all of a kind": "Capturez tout d'un même type",
 		"Big board": "Grand échiquier",
 		"Lose all pieces": "Perdez toutes les pièces",
@@ -25,7 +25,7 @@
 		"New game": "Nouvelle partie",
 		"Waiting for opponent...": "En attente d'un adversaire...",
 		"Rules": "Règles",
-		"Play!": "Jouer!",
+		"Play": "Jouer",
 		"Problems": "Problèmes",
 		"White win": "Les blancs gagnent",
 		"Black win": "Les noirs gagnent",
@@ -38,9 +38,8 @@
 		"Settings": "Réglages",
 		"Resign": "Abandonner",
 		"Undo": "Annuler",
-		"Play": "Jouer",
-		"Flip": "Retourner",
-		"Position + flags (FEN):": "Position + drapeaux (FEN) :",
+		"Flip board": "Tourner l'échiquier",
+		"Game state (FEN):": "État de la partie (FEN) :",
 		"Ok": "Ok",
 		"Random": "Aléatoire",
 		"Preferences": "Préférences",
@@ -52,7 +51,6 @@
 		"blue": "bleu",
 		"Play sounds?": "Jouer les sons ?",
 		"None": "Aucun",
-		"New game": "Nouvelle partie",
 		"All": "Tous",
 		"Chat with ": "Discuter avec ",
 		"Type here": "Écrivez ici",
@@ -63,7 +61,7 @@
 		"Load next problems": "Charger les problèmes suivants",
 		"New": "Nouveau",
 		"Add a problem": "Ajouter un problème",
-		"Full FEN string": "Chaîne FEN complète",
+		"Full FEN description": "Description FEN complète",
 		"Safe HTML tags allowed": "HTML 'sûr' autorisé",
 		"Instructions": "Instructions",
 		"Describe the problem goal": "Décrire le but du problème",
diff --git a/views/variant.pug b/views/variant.pug
index 62e9d76d..23e70766 100644
--- a/views/variant.pug
+++ b/views/variant.pug
@@ -6,16 +6,18 @@ block css
 
 block content
 	.container#variantPage
-		// Modals
+		include langNames.pug
 		case lang
 			when "en"
 				include translations/en.pug
-				include langNames/en.pug
 				include modal-lang/en.pug
 				include modal-help/en.pug
+			when "es"
+				include translations/es.pug
+				include modal-lang/es.pug
+				include modal-help/es.pug
 			when "fr"
 				include translations/fr.pug
-				include langNames/fr.pug
 				include modal-lang/fr.pug
 				include modal-help/fr.pug
 		input#modal-newgame.modal(type="checkbox")
@@ -36,7 +38,7 @@ block content
 						a(href="#rules" @click="setDisplay('rules')")
 							=translations["Rules"]
 						a(href="#play" @click="setDisplay('play')")
-							=translations["Play!"]
+							=translations["Play"]
 						a(href="#problems" @click="setDisplay('problems')") 
 							=translations["Problems"]
 					#flagMenu.clickable(
diff --git a/views/welcome/es.pug b/views/welcome/es.pug
new file mode 100644
index 00000000..19d903e1
--- /dev/null
+++ b/views/welcome/es.pug
@@ -0,0 +1,54 @@
+input#modalWelcome.modal(type="checkbox")
+div(role="dialog")
+	#welcome.card.text-center
+		label.modal-close(for="modalWelcome")
+		h3.blue.section ¡ Bienvenido a v[ariant]chess.club !
+		.section
+			p Un sitio donde jugar variantes del juego de ajedrez en vivo.
+			p Pero espera... ¿ qué es una "variante" ?
+			img(src="/images/Hexagonal_chess.svg")
+			p.
+				Como lo sugiere la imagen, el punto de inicio de una variante generalmente
+				se ve como un tablero de ajedrez con las piezas habituales.
+				(sino ya no es una variante, pero un nuevo juego).
+			p.emphasis.purple Sin embargo...
+			p Cada variante tiene sus propias reglas, que pueden definir
+			table.list-table
+				tbody
+					tr
+						td * diferentes desplazamientos de piezas
+					tr
+						td * differentes(s) tablero(s)
+					tr
+						td * nuevas piezas
+					tr
+						td * efectos de borde en los movimientos
+					tr
+						td ...etc
+		.section
+			p.
+				Ejemplo : Imagina que una captura es una explosión atómica que destruye
+				todo en los 8 hexes cercanos, excepto los peones, que como las cucarachas
+				se resisten a este tipo de cosas.
+			p Define también un objetivo : hacer explotar al rey del adversario.
+			p.
+				&rarr; ¡ Bien hecho, acabas de describir el ajedrez atómico !
+				(Se puede jugar aquí)
+		.section
+			p.emphasis.purple
+				| OK, parece interesante, pero ¿ por qué sería divertido ?!
+			p.
+				Como todas las partidas comienzan con una posición aleatoria :
+				¡ terminadas las laboriosas memorizaciones de aperturas, puedes expresar
+				tus habilidades de ajedrez desde el primer movimiento ! Ninguna partida
+				es como otra.
+			-
+				var wikipediaUrl = "https://en.wikipedia.org/wiki/" +
+					"List_of_chess_variants#/media/File:Hexagonal_chess.svg";
+			p.
+				Pour s'informer sur des centaines de variantes (au moins), je vous invite à
+				visiter l'excellent site
+				#[a(href="https://www.chessvariants.com/") chessvariants].
+		p#disableMsg.clickable(@click="markAsVisited")
+			| Haga clic aquí para no mostrar este mensaje la próxima vez.
+		p.smallfont Credito de imagen : #[a(href=wikipediaUrl) Wikipedia]
diff --git a/views/welcome/fr.pug b/views/welcome/fr.pug
index 33b5fb6f..3821f896 100644
--- a/views/welcome/fr.pug
+++ b/views/welcome/fr.pug
@@ -48,4 +48,4 @@ div(role="dialog")
 				#[a(href="https://www.chessvariants.com/") chessvariants].
 		p#disableMsg.clickable(@click="markAsVisited")
 			| Cliquer ici pour ne pas montrer ce message la prochaine fois
-		p.smallfont Crédit image: #[a(href=wikipediaUrl) Wikipedia]
+		p.smallfont Crédit image : #[a(href=wikipediaUrl) Wikipedia]
-- 
2.44.0