---
 l10n/engine/fr.po                                                   |  215 +
 l10n/engine/pt_BR.po                                                |   43 
 l10n/missions/fr.po                                                 | 1289 +++++----
 l10n/missions/it.po                                                 |  444 ---
 l10n/missions/plm.pot                                               |  371 --
 l10n/missions/pt_BR.po                                              | 1290 ++++++----
 po4a.conf                                                           |    6 
 src/lessons/maze/island/IslandMaze.pt_BR.html                       |   75 
 src/lessons/maze/short_desc.pt_BR.html                              |    7 
 src/lessons/recursion/cons/AllDifferent.fr.html                     |   11 
 src/lessons/recursion/cons/ButLast.fr.html                          |    8 
 src/lessons/recursion/cons/ButNfirst.fr.html                        |    8 
 src/lessons/recursion/cons/ButNlast.fr.html                         |   14 
 src/lessons/recursion/cons/Concat.fr.html                           |   14 
 src/lessons/recursion/cons/Increasing.fr.html                       |    9 
 src/lessons/recursion/cons/IsMember.fr.html                         |    8 
 src/lessons/recursion/cons/Last.fr.html                             |    7 
 src/lessons/recursion/cons/Length.fr.html                           |    8 
 src/lessons/recursion/cons/Main.fr.html                             |   32 
 src/lessons/recursion/cons/Main.pt_BR.html                          |   24 
 src/lessons/recursion/cons/Min.fr.html                              |    9 
 src/lessons/recursion/cons/Nfirst.fr.html                           |   11 
 src/lessons/recursion/cons/Nlast.fr.html                            |   14 
 src/lessons/recursion/cons/Nth.fr.html                              |    9 
 src/lessons/recursion/cons/Occurrence.fr.html                       |    9 
 src/lessons/recursion/cons/PlusOne.fr.html                          |    8 
 src/lessons/recursion/cons/Remove.fr.html                           |    9 
 src/lessons/recursion/cons/Reverse.fr.html                          |   15 
 src/lessons/recursion/cons/universe/ConsWorld.fr.html               |   36 
 src/lessons/recursion/koch/Koch.fr.html                             |   19 
 src/lessons/recursion/short_desc.pt_BR.html                         |    7 
 src/lessons/recursion/tree/Tree.fr.html                             |   18 
 src/lessons/sort/baseball/Main.pt_BR.html                           |   50 
 src/lessons/sort/basic/Main.pt_BR.html                              |   24 
 src/lessons/sort/basic/bubble/AlgBubbleSort1.pt_BR.html             |   17 
 src/lessons/sort/basic/cocktail/AlgCocktailSort1.pt_BR.html         |   27 
 src/lessons/sort/basic/cocktail/AlgCocktailSort2.pt_BR.html         |   19 
 src/lessons/sort/basic/cocktail/AlgCocktailSort3.pt_BR.html         |   10 
 src/lessons/sort/basic/comb/AlgCombSort.pt_BR.html                  |   37 
 src/lessons/sort/basic/comb/AlgCombSort11.pt_BR.html                |    9 
 src/lessons/sort/basic/gnome/AlgGnomeSort.pt_BR.html                |   17 
 src/lessons/sort/basic/insertion/AlgInsertionSort.pt_BR.html        |   60 
 src/lessons/sort/basic/selection/AlgSelectionSort.pt_BR.html        |   23 
 src/lessons/sort/basic/shell/AlgShellSort.pt_BR.html                |   48 
 src/lessons/sort/basic/short_desc.pt_BR.html                        |    8 
 src/lessons/sort/dutchflag/DutchFlagAlgo.pt_BR.html                 |   33 
 src/lessons/sort/dutchflag/Main.pt_BR.html                          |   22 
 src/lessons/sort/dutchflag/short_desc.pt_BR.html                    |    6 
 src/lessons/sort/dutchflag/universe/DutchFlagWorld.pt_BR.html       |    2 
 src/lessons/sort/pancake/BasicPancake.fr.html                       |    7 
 src/lessons/sort/pancake/Main.pt_BR.html                            |    6 
 src/lessons/turmites/Main.pt_BR.html                                |   36 
 src/lessons/turmites/helloturmite/HelloTurmite.pt_BR.html           |    2 
 src/lessons/turmites/langton/Langton.pt_BR.html                     |   49 
 src/lessons/turmites/langtoncolors/LangtonColors.pt_BR.html         |   43 
 src/lessons/turmites/short_desc.pt_BR.html                          |    7 
 src/lessons/turtleart/Main.pt_BR.html                               |   28 
 src/lessons/welcome/traversal/column/TraversalByColumn.pt_BR.html   |   17 
 src/lessons/welcome/traversal/diagonal/TraversalDiagonal.pt_BR.html |   10 
 src/lessons/welcome/traversal/line/TraversalByLine.pt_BR.html       |   14 
 src/lessons/welcome/traversal/zigzag/TraversalZigZag.pt_BR.html     |    5 
 62 files changed, 2999 insertions(+), 1936 deletions(-)

--- a/l10n/missions/fr.po
+++ b/l10n/missions/fr.po
@@ -6,7 +6,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PLM mission texts\n"
-"POT-Creation-Date: 2014-10-06 17:06+0200\n"
+"POT-Creation-Date: 2014-11-13 13:47+0100\n"
 "PO-Revision-Date: 2014-10-08 00:04+0200\n"
 "Last-Translator: Martin Quinson\n"
 "Language-Team: French <>\n"
@@ -5807,7 +5807,6 @@
 
 #. type: Content of: <p>
 #: src/lessons/welcome/methods/picture/PatternPicture.html:11
-#: src/lessons/lander/lvl1_lander_101/Lander101.html:41
 msgid "Good luck!"
 msgstr "Bon courage !"
 
@@ -9593,7 +9592,6 @@
 
 #. type: Content of: <h2>
 #: src/lessons/sort/dutchflag/universe/DutchFlagWorld.html:9
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:8
 msgid "Provided functions"
 msgstr "Fonctions fournies"
 
@@ -9904,16 +9902,10 @@
 
 #. type: Content of: <p>
 #: src/lessons/sort/pancake/BasicPancake.html:13
-#, fuzzy
-#| msgid ""
-#| "Your work is to help this poor guy sorting his stack by flipping the "
-#| "pancakes. Each pancake is defined by its radius and rank within the "
-#| "stack, with the top-most pancake is at rank 0, and the one below at rank "
-#| "1."
 msgid ""
 "Your work is to help this poor guy sorting his stack by flipping the "
 "pancakes. Each pancake is defined by its radius and rank within the stack, "
-"where the bottom pancake is at rank 0, and the one above at rank 1."
+"with the top-most pancake is at rank 0, and the one below at rank 1."
 msgstr ""
 "Vous devez aider ce pauvre homme à trier sa pile en retournant des crêpes. "
 "Chaque crêpe est définie par son rayon et son rang dans la pile. La pile la "
@@ -11264,7 +11256,6 @@
 
 #. type: Content of: <pre>
 #: src/plm/universe/turtles/TurtleWorld.html:22
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:10
 #, no-wrap
 msgid ""
 "[!java|c]double [/!]getX()[!scala]:Double[/!]\n"
@@ -11572,6 +11563,15 @@
 "tail</code>. Of course, the empty list has no head nor the tail, so trying "
 "to access these elements will result in an (unpleasant) error message."
 msgstr ""
+"Une telle liste peut être soit la liste vide (notée <code>[!scala]Nil[/!][!"
+"java]null[/!][!python]None[/!]</code>), soit un entier suivi d'une liste. Si "
+"une liste n'est pas vide, vous pouvez retrouver son premier entier avec "
+"<code>list.head</code>. On dit qu'on extrait alors la tête de la liste.La "
+"liste contenant ses autres éléments (tous sauf la tête) peut être retrouvée "
+"avec <code>list.tail</code>. On dit qu'on extrait la suite de la liste.Bien "
+"entendu, la liste vide n'a ni tête ni suite, et vous ne devriez pas tenter "
+"d'accéder à ces éléments sous peine d'obtenir un message d'erreur "
+"(particulièrement déplaisant)."
 
 #. type: Content of: <p>
 #: src/lessons/recursion/cons/universe/ConsWorld.html:20
@@ -11581,6 +11581,10 @@
 "tail</code> Note that <code>::</code> is a generic operator in Scala to "
 "build lists.[/!]"
 msgstr ""
+"Pour construire votre propre liste, vous devez concaténer une tête et une "
+"suite comme suit : [!java|python]<code>cons(tête, suite)</code>[/!] [!"
+"scala]<code>tête::suite</code>. Il se trouve que <code>::</code> est un "
+"opérateur générique du langage Scala pour construire des listes.[/!]"
 
 #. type: Content of: <p>
 #: src/lessons/recursion/cons/universe/ConsWorld.html:26
@@ -11588,6 +11592,8 @@
 "So, in summary, you can solve every exercises of this lesson with the "
 "following constructs."
 msgstr ""
+"En résumé, vous pouvez résoudre tous les exercices de cette leçon avec les "
+"constructions suivantes :"
 
 #. type: Content of: <ul><li>
 #: src/lessons/recursion/cons/universe/ConsWorld.html:30
@@ -11603,24 +11609,24 @@
 #. type: Content of: <ul><li>
 #: src/lessons/recursion/cons/universe/ConsWorld.html:31
 msgid "<b>Get the first element of <code>l</code></b>"
-msgstr ""
+msgstr "<b>Obtenir le premier élément de <code>l</code></b>"
 
 #. type: Content of: <ul><li><pre>
 #: src/lessons/recursion/cons/universe/ConsWorld.html:31
 #, no-wrap
 msgid "l.head"
-msgstr ""
+msgstr "l.head"
 
 #. type: Content of: <ul><li>
 #: src/lessons/recursion/cons/universe/ConsWorld.html:32
 msgid "<b>Get the rest of the list</b>, when the first element is removed:"
-msgstr ""
+msgstr "<b>Obtenir la suite de la liste</b>, privée de son premier élément:"
 
 #. type: Content of: <ul><li><pre>
 #: src/lessons/recursion/cons/universe/ConsWorld.html:32
 #, no-wrap
 msgid "l.tail"
-msgstr ""
+msgstr "l.tail"
 
 #. type: Content of: <ul><li>
 #: src/lessons/recursion/cons/universe/ConsWorld.html:33
@@ -11628,18 +11634,20 @@
 "<b>Build a list</b> from a <code>value</code> and a <code>list</code>: [!"
 "java|python]"
 msgstr ""
+"<b>Construire une liste</b> à partir d'une <code>valeur</code> et d'une "
+"<code>liste</code>: [!java|python]"
 
 #. type: Content of: <ul><li><pre>
 #: src/lessons/recursion/cons/universe/ConsWorld.html:34
 #, no-wrap
 msgid "cons(value, list)"
-msgstr ""
+msgstr "cons(valeur, liste)"
 
 #. type: Content of: <ul><li><pre>
 #: src/lessons/recursion/cons/universe/ConsWorld.html:35
 #, no-wrap
 msgid "value::list"
-msgstr ""
+msgstr "valeur::liste"
 
 #. type: Content of: <h1>
 #: src/lessons/recursion/cons/Main.html:2
@@ -11653,6 +11661,10 @@
 "is certainly not the most pleasant lesson to do, but I think that it is the "
 "easiest of the PLM lessons dealing with recursion."
 msgstr ""
+"Cette leçon propose un paquet d'exercices classiques sur les listes "
+"récursives. Il ne s'agit certainement pas de la leçon la plus drôle de la "
+"PLM, mais il s'agit certainement de la plus simple des leçons PLM sur la "
+"récursivité."
 
 #. type: Content of: <ul><li>
 #: src/lessons/recursion/cons/Main.html:10
@@ -11661,6 +11673,10 @@
 "Teaching/TOP/02-td-recursivite-enonce.pdf If you know some others, please "
 "report them as an issue."
 msgstr ""
+"De nouveaux exercices pourraient être proposés, par exemple inspirés de "
+"http://webloria.loria.fr/~quinson/Teaching/TOP/02-td-recursivite-enonce.pdf "
+"Si vous en connaissez d'autres, nous vous serions reconnaissant de nous en "
+"parler dans un rapport d'anomalie."
 
 #. type: Content of: <ul><li>
 #: src/lessons/recursion/cons/Main.html:13
@@ -11675,11 +11691,22 @@
 "pass a given threshold, but that sounds very difficult too. Any idea is "
 "welcome."
 msgstr ""
+"Il serait intéressant de vérifier la complexité algorithmique du code "
+"proposé par les étudiants, mais cela semble assez difficile à faire. En "
+"Python et Java, nous proposons un type de donnée spécifique (les "
+"<code>RecList</code>) alors nous pourrions compter le nombre de cons "
+"réalisés dans chaque exercice, mais il risque d'être compliqué de trouver le "
+"test auquel rattacher chaque opération. En Scala, cela s'annonce encore plus "
+"difficile car nous utilisons directement des mots-clés du langage. Il serait "
+"probablement difficile d'y injecter un mécanisme comptant les opérations. On "
+"pourrait vouloir assurer que la pile d'appel ne dépasse pas une profondeur "
+"donnée, mais cela semble également difficile à implémenter. Si vous avez des "
+"idées, merci de nous en faire part."
 
 #. type: Content of: <h1>
 #: src/lessons/recursion/cons/Length.html:2
 msgid "Length"
-msgstr ""
+msgstr "Longueur"
 
 #. type: Content of: outside any tag (error?)
 #: src/lessons/recursion/cons/Length.html:3
@@ -11687,6 +11714,9 @@
 "Given a [!scala]List[Int][/!][!java|python]recursive list[/!], return its "
 "length[!scala] (without using its <code>size</code> method, of course)[/!]."
 msgstr ""
+"Étant donnée une [!scala]List[Int][/!][java|python]liste récursive[/!] "
+"retournez sa longueur[!scala], sans utiliser la méthode <code>size</code> de "
+"la liste, bien entendu[/!]."
 
 #. type: Content of: <p>
 #: src/lessons/recursion/cons/Length.html:5
@@ -11700,12 +11730,12 @@
 #: src/lessons/recursion/cons/Remove.html:8
 #: src/lessons/recursion/cons/ButNfirst.html:6
 msgid "Your solution should be linear in time."
-msgstr ""
+msgstr "Votre solution devrait être linéaire en temps."
 
 #. type: Content of: <h1>
 #: src/lessons/recursion/cons/IsMember.html:2
 msgid "IsMember"
-msgstr ""
+msgstr "EstMembre"
 
 #. type: Content of: outside any tag (error?)
 #: src/lessons/recursion/cons/IsMember.html:3
@@ -11714,6 +11744,9 @@
 "integer, return true if the given integer is one of the elements of the "
 "list, or false if it cannot be found."
 msgstr ""
+"Étant donnée une [!scala]List[Int][/!][java|python]liste récursive[/!] et un "
+"entier,retournez <code>true</code> si cet entier fait partie des éléments de "
+"la liste, et <code>false</code> sinon."
 
 #. type: Content of: <h1>
 #: src/lessons/recursion/cons/Occurrence.html:2
@@ -11728,6 +11761,9 @@
 "If the integer is not a member of the list, the function should thus return "
 "0."
 msgstr ""
+"Étant donnée une [!scala]List[Int][/!][java|python]liste récursive[/!] et un "
+"entier,retournez le nombre d'occurences de cet entier dans la liste. Si "
+"l'entier n'est pas membre de la liste, la fonction doit renvoyer 0."
 
 #. type: Content of: <h1>
 #: src/lessons/recursion/cons/Last.html:2
@@ -11740,11 +11776,14 @@
 "Given a [!scala]List[Int][/!][!java|python]recursive list[/!], return its "
 "last element.  You can assume that the list is not empty."
 msgstr ""
+"Étant donnée une [!scala]List[Int][/!][java|python]liste récursive[/!],"
+"retournez son dernier élément. Vous pouvez supposer que la liste n'est pas "
+"vide."
 
 #. type: Content of: <h1>
 #: src/lessons/recursion/cons/Min.html:2
 msgid "Min"
-msgstr ""
+msgstr "Min"
 
 #. type: Content of: outside any tag (error?)
 #: src/lessons/recursion/cons/Min.html:3
@@ -11753,11 +11792,15 @@
 "smallest of its values.  You will probably need an extra function, even if "
 "you can assume that the list is not empty."
 msgstr ""
+"Étant donnée une [!scala]List[Int][/!][java|python]liste récursive[/!],"
+"retournez la plus petite de ses valeurs. Vous aurez probablement besoin "
+"d'une fonction supplémentaire, mais vous pouvez supposer que la liste n'est "
+"pas vide."
 
 #. type: Content of: <h1>
 #: src/lessons/recursion/cons/Increasing.html:2
 msgid "Increasing"
-msgstr ""
+msgstr "Croissante"
 
 #. type: Content of: outside any tag (error?)
 #: src/lessons/recursion/cons/Increasing.html:3
@@ -11766,6 +11809,9 @@
 "whether its elements form an increasing sequence (i.e., if the elements are "
 "sorted from the smallest to the largest one)."
 msgstr ""
+"Étant donnée une [!scala]List[Int][/!][java|python]liste récursive[/!],"
+"retournez <code>true</code> si ses éléments forment une suite croissante "
+"(c'est-à-dire si ses éléments sont classés du plus petit au plus grand)."
 
 #. type: Content of: <h1>
 #: src/lessons/recursion/cons/ButLast.html:2
@@ -11779,11 +11825,14 @@
 "list containing every elements but the last one.  You can assume that the "
 "list is not empty."
 msgstr ""
+"Étant donnée une [!scala]List[Int][/!][java|python]liste récursive[/!],"
+"retournez la liste contenant tous ses éléments sauf le dernier. Vous pouvez "
+"supposer que la liste n'est pas vide."
 
 #. type: Content of: <h1>
 #: src/lessons/recursion/cons/PlusOne.html:2
 msgid "PlusOne"
-msgstr ""
+msgstr "PlusUn"
 
 #. type: Content of: outside any tag (error?)
 #: src/lessons/recursion/cons/PlusOne.html:3
@@ -11791,11 +11840,14 @@
 "Given a [!scala]List[Int][/!][!java|python]recursive list[/!], return a new "
 "list containing all elements of your parameter incremented by one."
 msgstr ""
+"Étant donnée une [!scala]List[Int][/!][java|python]liste récursive[/!],"
+"retournez une nouvelle liste dont les éléments sont ceux de votre paramètre, "
+"incrémentés de un."
 
 #. type: Content of: <h1>
 #: src/lessons/recursion/cons/Remove.html:2
 msgid "Remove"
-msgstr ""
+msgstr "Retire"
 
 #. type: Content of: outside any tag (error?)
 #: src/lessons/recursion/cons/Remove.html:4
@@ -11808,7 +11860,7 @@
 #. type: Content of: <h1>
 #: src/lessons/recursion/cons/Nth.html:2
 msgid "Nth"
-msgstr ""
+msgstr "Nième"
 
 #. type: Content of: outside any tag (error?)
 #: src/lessons/recursion/cons/Nth.html:3
@@ -11824,11 +11876,14 @@
 "You can assume that the list is long enough, i.e. that there is at least "
 "<code>N</code> elements.  Your solution should be linear in time."
 msgstr ""
+"Vous pouvez supposer que la liste est suffisamment longue, c'est à dire "
+"qu'elle contient au moins <code>N</code> éléments. Votre solution devrait "
+"être linéaire en temps."
 
 #. type: Content of: <h1>
 #: src/lessons/recursion/cons/Nfirst.html:2
 msgid "Nfirst"
-msgstr ""
+msgstr "nPremiers"
 
 #. type: Content of: outside any tag (error?)
 #: src/lessons/recursion/cons/Nfirst.html:3
@@ -11838,11 +11893,15 @@
 "elements. You can assume that the list is long enough, i.e. that there is at "
 "least <code>N</code> elements."
 msgstr ""
+"Étant donnée une [!scala]List[Int][/!][java|python]liste récursive[/!] et un "
+"entier <code>N</code>, retournez la liste constituée de ses <code>N</code> "
+"premiers éléments. Vous pouvez supposer que la liste est suffisamment "
+"longue, c'est à dire qu'elle contient au moins <code>N</code> éléments."
 
 #. type: Content of: <h1>
 #: src/lessons/recursion/cons/Nlast.html:2
 msgid "Nlast"
-msgstr ""
+msgstr "nDerniers"
 
 #. type: Content of: outside any tag (error?)
 #: src/lessons/recursion/cons/Nlast.html:3
@@ -11850,6 +11909,9 @@
 "Given a [!scala]List[Int][/!][!java|python]recursive list[/!] and an integer "
 "<code>N</code>, return the list with only the <code>N</code> last elements."
 msgstr ""
+"Étant donnée une [!scala]List[Int][/!][java|python]liste récursive[/!] et un "
+"entier <code>N</code>, retournez la liste constituée de ses <code>N</code> "
+"derniers éléments. "
 
 #. type: Content of: <p>
 #: src/lessons/recursion/cons/Nlast.html:6
@@ -11858,6 +11920,8 @@
 "Your solution should be linear in time, but you will probably need to define "
 "several functions to achieve that complexity."
 msgstr ""
+"Votre solution devrait être linéaire en temps, mais vous aurez probablement "
+"besoin de définir plusieurs fonctions pour atteindre cette complexité."
 
 #. type: Attribute 'alt' of: <div>
 #: src/lessons/recursion/cons/Nlast.html:8
@@ -11865,7 +11929,7 @@
 #: src/lessons/recursion/cons/Reverse.html:8
 #: src/lessons/recursion/cons/Concat.html:8
 msgid "I cannot do it in linear time"
-msgstr ""
+msgstr "Je n'arrive pas à le faire en temps linéaire"
 
 #. type: Content of: <div>
 #: src/lessons/recursion/cons/Nlast.html:9
@@ -11874,11 +11938,13 @@
 "The trick is to compute only once (and beforehand) how many elements you "
 "should keep."
 msgstr ""
+"L'astuce est de calculer une seule fois (et à l'avance) combien d'éléments "
+"il faut garder."
 
 #. type: Content of: <h1>
 #: src/lessons/recursion/cons/ButNfirst.html:2
 msgid "But Nfirst"
-msgstr ""
+msgstr "Sauf nPremiers"
 
 #. type: Content of: outside any tag (error?)
 #: src/lessons/recursion/cons/ButNfirst.html:3
@@ -11886,11 +11952,14 @@
 "Given a [!scala]List[Int][/!][!java|python]recursive list[/!] and an integer "
 "<code>N</code>, return the list without the <code>N</code> first elements."
 msgstr ""
+"Étant donnée une [!scala]List[Int][/!][java|python]liste récursive[/!] et un "
+"entier <code>N</code>, retournez la liste privée de ses <code>N</code> "
+"premiers éléments. "
 
 #. type: Content of: <h1>
 #: src/lessons/recursion/cons/ButNlast.html:2
 msgid "But Nlast"
-msgstr ""
+msgstr "Sauf nDerniers"
 
 #. type: Content of: outside any tag (error?)
 #: src/lessons/recursion/cons/ButNlast.html:3
@@ -11898,6 +11967,9 @@
 "Given a [!scala]List[Int][/!][!java|python]recursive list[/!] and an integer "
 "<code>N</code>, return the list without the <code>N</code> last elements."
 msgstr ""
+"Étant donnée une [!scala]List[Int][/!][java|python]liste récursive[/!] et un "
+"entier <code>N</code>, retournez la liste privée de ses <code>N</code> "
+"derniers éléments."
 
 #. type: Content of: <h1>
 #: src/lessons/recursion/cons/Reverse.html:2
@@ -11910,6 +11982,8 @@
 "Given a [!scala]List[Int][/!][!java|python]recursive list[/!], return a new "
 "list with all elements in reverse order."
 msgstr ""
+"Étant donnée une [!scala]List[Int][/!][java|python]liste récursive[/!], "
+"retournez la liste constituée de ses éléments en ordre inverse."
 
 #. type: Content of: <p>
 #: src/lessons/recursion/cons/Reverse.html:5
@@ -11917,6 +11991,9 @@
 "This function is very important and you should not pass that challenge.  "
 "Your solution should be linear in time, with the help of helper functions."
 msgstr ""
+"Cette fonction est très importante et vous ne devriez pas passer ce défi "
+"sans trouver la réponse, qui doit être linéaire grâce à l'aide de fonctions "
+"supplémentaires."
 
 #. type: Content of: <div>
 #: src/lessons/recursion/cons/Reverse.html:9
@@ -11924,11 +12001,13 @@
 "You need an helper function in which the result is accumulated (built) at "
 "each step."
 msgstr ""
+"Il faut réaliser une fonction d'aide dont le résultat est accumulé "
+"(construit) à chaque étape."
 
 #. type: Content of: <h1>
 #: src/lessons/recursion/cons/Concat.html:2
 msgid "Concat"
-msgstr ""
+msgstr "Concaténation"
 
 #. type: Content of: outside any tag (error?)
 #: src/lessons/recursion/cons/Concat.html:3
@@ -11937,6 +12016,10 @@
 "code> and <code>l2</code>, return a new list with all elements of <code>l1</"
 "code> followed by the elements of <code>l2</code>."
 msgstr ""
+"Étant donnée deux [!scala]List[Int][/!][java|python]listes récursives[/!] "
+"<code>l1</code> et <code>l2</code>, retournez la liste constituée de tous "
+"les éléments de <code>l1</code> suivis de tous les éléments de <code>l2</"
+"code>."
 
 #. type: Content of: <p>
 #: src/lessons/recursion/cons/Concat.html:6
@@ -11950,11 +12033,13 @@
 "You need to modify <code>l1</code> beforehand so that the computations at "
 "each step of the recursion are in constant time."
 msgstr ""
+"Il faut modifier <code>l1</code> au préalable pour s'assurer que chaque "
+"étape récursive soit en temps constant."
 
 #. type: Content of: <h1>
 #: src/lessons/recursion/cons/AllDifferent.html:2
 msgid "All Different"
-msgstr ""
+msgstr "Tous différents"
 
 #. type: Content of: outside any tag (error?)
 #: src/lessons/recursion/cons/AllDifferent.html:3
@@ -11963,6 +12048,9 @@
 "if any two elements of the list are different (ie, if no element appears "
 "more than once in the list)."
 msgstr ""
+"Étant donnée une [!scala]List[Int][/!][java|python]liste récursive[/!], "
+"retournez <code>false</code> si deux éléments ont la même valeur, et "
+"<code>true</code> si tous les éléments sont différents deux à deux."
 
 #. type: Content of: <p>
 #: src/lessons/recursion/cons/AllDifferent.html:6
@@ -11971,6 +12059,10 @@
 "You will probably have to define one extra function for that.  Another much "
 "more complex solution runs in O(n log(n))."
 msgstr ""
+"La solution la plus simple est en O(n²), ce qui veut dire qu'elle s'exécute "
+"en temps quadratique. Vous aurez probablement besoin de définir une fonction "
+"supplémentaire pour cela. Une autre solution bien plus complexe s'exécute en "
+"O(n log(n))."
 
 #. type: Content of: <h1>
 #: src/lessons/recursion/Main.html:2
@@ -12312,6 +12404,13 @@
 "  Turn 60 degrees to the left\n"
 "  Draw recursively a smaller segment\n"
 msgstr ""
+"Dessiner récursivement un segment plus petit\n"
+"Tourner à 60 degrés vers la gauche\n"
+"Dessiner récursivement un segment plus petit\n"
+"Tourner à 120 degrés vers la droite\n"
+"Dessiner récursivement un segment plus petit\n"
+"Tourner à 60 degrés vers la gauche\n"
+"Dessiner récursivement un segment plus petit\n"
 
 #. type: Content of: <p>
 #: src/lessons/recursion/koch/Koch.html:30
@@ -12319,6 +12418,9 @@
 "As you can see, the function forward() is not called from the recursive "
 "case, only in the base case when there is no recursive call."
 msgstr ""
+"Comme vous pouvez le constater, la fonction avance() n'est pas appelée dans "
+"le cas récursif, mais seulement dans le cas de base, quand il n'y a plus "
+"d'appel récursif."
 
 #. type: Attribute 'alt' of: <p><div>
 #: src/lessons/recursion/koch/Koch.html:34
@@ -12552,6 +12654,8 @@
 "At the end, here is the pseudo-code of the general case (you should add the "
 "base case yourself):"
 msgstr ""
+"Au final, voici le pseudo-code du cas général de la récursivité (il manque "
+"bien sûr le cas de base, laissé en exercice)."
 
 #. type: Content of: <p><p><p><p><pre>
 #: src/lessons/recursion/tree/Tree.html:18
@@ -12562,6 +12666,10 @@
 "  Draw (recursively) the left subtree\n"
 "  Move back to your initial position\n"
 msgstr ""
+"Avancer de la longueur désirée\n"
+"Dessiner (récursivement) le sous-arbre de droite\n"
+"Dessiner (récursivement) le sous-arbre de gauche\n"
+"Reculer de la longueur désirée pour retourner au point de départ\n"
 
 #. type: Content of: <p><p><p><p><p>
 #: src/lessons/recursion/tree/Tree.html:23
@@ -12570,6 +12678,9 @@
 "infinite loop.  Then, drawing the right subtree comes down to turn right and "
 "then draw the subtree."
 msgstr ""
+"N'oubliez pas d'ajouter le cas de base dans votre code, ou la buggle va "
+"entrer en boucle infinie. De plus, dessiner le sous-arbre droit revient à "
+"tourner à droite puis dessiner un sous-arbre."
 
 #. type: Content of: <p><p><p><p><p>
 #: src/lessons/recursion/tree/Tree.html:26
@@ -15274,506 +15385,6 @@
 "à la place du 'a'). Les différentes chaînes \"yak\" ne se chevauchent pas."
 
 #. type: Content of: <h2>
-#: src/lessons/lander/Main.html:2 src/lessons/lander/short_desc.html:2
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:2
-msgid "Lunar Lander"
-msgstr "Alunisseur"
-
-#. type: Content of: <p>
-#: src/lessons/lander/Main.html:4 src/lessons/lander/short_desc.html:4
-msgid ""
-"In this lesson you pilot a lunar landing module in increasingly complex "
-"situations."
-msgstr ""
-"Dans cette leçon, vous pilotez un alunisseur dans des situations de plus en "
-"plus complexes."
-
-#. type: Content of: <p>
-#: src/lessons/lander/Main.html:7
-msgid ""
-"At each step of the simulation, the player issues a command controlling how "
-"much the angle and thrust of the lander should change"
-msgstr ""
-"À chaque pas de la simulation, le joueur donne des commandes contrôlant "
-"l'angle et la poussée du module d'alunissage."
-
-#. type: Content of: <p>
-#: src/lessons/lander/Main.html:10
-msgid "Ideas concerning the progression of exercises:"
-msgstr "Idées d'exercices à ajouter à la progression proposée :"
-
-#. type: Content of: <ul><li>
-#: src/lessons/lander/Main.html:12
-msgid ""
-"A lander in vertical position above flat ground, the player can only control "
-"thrust (done)"
-msgstr ""
-"Un alunisseur en position verticale au dessus d'un sol plat. Le joueur ne "
-"peut régler que la poussée (c'est fait)."
-
-#. type: Content of: <ul><li>
-#: src/lessons/lander/Main.html:14
-msgid ""
-"A lander in vertical position not above flat ground, the player control "
-"thrust and angle (done)"
-msgstr ""
-"Un alunisseur en position verticale pas au dessus d'un sol plat. Le joueur "
-"peut régler la poussée et l'angle (c'est fait)."
-
-#. type: Content of: <ul><li>
-#: src/lessons/lander/Main.html:16
-msgid ""
-"A lander with difficult angle and speed not above flat ground, the player "
-"control thrust and angle"
-msgstr ""
-"Un alunisseur avec un angle et une vitesse difficile, pas au dessus d'un sol "
-"plat. Le joueur contrôle la poussée et l'angle."
-
-#. type: Content of: <ul><li>
-#: src/lessons/lander/Main.html:18
-msgid ""
-"A lander with difficult angle and speed not above flat ground, with "
-"difficult ground, the player control thrust and angle"
-msgstr ""
-"Un alunisseur avec un angle et une vitesse difficile, pas au dessus d'un sol "
-"plat dans une configuration difficile. Le joueur contrôle la poussée et "
-"l'angle."
-
-#. type: Content of: <ul><li>
-#: src/lessons/lander/Main.html:20
-msgid "Same with wind?"
-msgstr "La même chose avec du vent ?"
-
-#. type: Content of: <p>
-#: src/lessons/lander/short_desc.html:7
-msgid "This lesson assumes some basic programming and physics skills."
-msgstr ""
-"Vous êtes supposé maîtriser les bases de la programmation et posséder "
-"quelques notions de mécanique du point avant de tenter cette leçon."
-
-#. type: Content of: <p>
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:4
-msgid ""
-"In this universe you pilot a lunar lander. At each simulation step you're "
-"given the lander's position, speed, angle and thrust and must issue a "
-"command adjusting its angle and thrust."
-msgstr ""
-"Dans cet univers, vous contrôlez un module d'alunissage. À chaque pas de la "
-"simulation, vous avez accès à la position du module, sa vitesse, son angle "
-"et la poussée de son moteur. Vous devez alors décider de l'angle et de la "
-"poussée pour l'étape suivante. "
-
-#. type: Content of: outside any tag (error?)
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:12
-msgid "Get the X and Y position of the lander."
-msgstr "Retourne la position en X et Y du module d'alunissage."
-
-#. type: Content of: <pre>
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:13
-#, no-wrap
-msgid ""
-"[!java|c]double [/!]getSpeedX()[!scala]:Double[/!]\n"
-"[!java|c]double [/!]getSpeedY()[!scala]:Double[/!]"
-msgstr ""
-"[!java|c]double [/!]getVitesseX()[!scala]:Double[/!]\n"
-"[!java|c]double [/!]getVitesseY()[!scala]:Double[/!]"
-
-#. type: Content of: outside any tag (error?)
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:15
-msgid "Get the horizontal and vertical speed of the lander."
-msgstr "Obtenir les vitesses horizontale et verticale du module."
-
-#. type: Content of: <pre>
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:17
-#, no-wrap
-msgid ""
-"[!java|c]double [/!]getAngle()[!scala]:Double[/!]\n"
-"[!java|c]void [/!]setDesiredAngle([!java|c]double [/!]desiredAngle[!scala]:Double[/!])"
-msgstr ""
-"[!java|c]double [/!]getAngle()[!scala]:Double[/!]\n"
-"[!java|c]void [/!]setAngleDesire([!java|c]double [/!]angle[!scala]:Double[/!])"
-
-#. type: Content of: outside any tag (error?)
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:19
-msgid "Get or set the angle of the lander."
-msgstr "Retourne ou fixe l'angle du module d'alunissage."
-
-#. type: Content of: outside any tag (error?)
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:20
-msgid ""
-"An angle of 0° denotes a vertical position where the \"head\" of the lander "
-"points up.  This is the angle you must land with. A positive angle denotes a "
-"left-leaning lander, a negative angle a right-leaning one. You cannot lean "
-"more than by ±90°, and the angle can vary by at most ±5° in one step."
-msgstr ""
-"Un angle de O° dénote une position verticale, avec le sommet du module "
-"dirigé vers le haut. C'est l'angle avec lequel vous devez vous poser. Un "
-"angle positif indique que le module penche vers la gauche tandis qu'un angle "
-"négatif indique au contraire qu'il penche à droite. Il est impossible de se "
-"pencher à plus de ±90°, et on ne peut pas pencher le module de plus de ±5° "
-"en une fois."
-
-#. type: Content of: <pre>
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:25
-#, no-wrap
-msgid ""
-"[!java|c]int [/!]getThrust()[!scala]:Int[/!]\n"
-"[!java|c]void [/!]setDesiredThrust([!java|c]int [/!]thrust[!scala]:Int[/!])"
-msgstr ""
-"[!java|c]int [/!]getPoussee()[!scala]:Int[/!]\n"
-"[!java|c]void [/!]setPousseeDesiree([!java|c]int [/!]poussée[!scala]:Int[/!])"
-
-#. type: Content of: outside any tag (error?)
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:27
-msgid "Get or set the thrust of the lander."
-msgstr "Retourne ou fixe la poussée du module."
-
-#. type: Content of: outside any tag (error?)
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:27
-msgid ""
-"You can only increment or decrement the thrust by 1 between two simulation "
-"steps, so if the current thrust is 2 and you ask for 4, you'll only get 3 in "
-"the next step. If you ask for less than 0 (resp. more than 4), everything "
-"will be as if you had asked for 0 (resp. 4)."
-msgstr ""
-"Vous ne pouvez incrémenter ou décrémenter la poussée que d'une unité à "
-"chaque fois. Si votre poussée actuelle est de 2 et que vous demandez une "
-"poussée de 4, vous n'obtiendrez que 3 au prochain pas de temps. Si vous "
-"demandez moins que 0 (ou plus que 4), tout se passera comme si vous "
-"demandiez 0 (ou 4)."
-
-#. type: Content of: <pre>
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:33
-#, no-wrap
-msgid "[!java|c]int [/!]getFuel()[!scala]:Int[/!]"
-msgstr "[!java|c]int [/!]getFuel()[!scala]:Int[/!]"
-
-#. type: Content of: outside any tag (error?)
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:34
-msgid ""
-"Get the remaining fuel in the lander.  At each step of the simulation the "
-"lander consumes as many fuel units as the current thrust. Once you run out "
-"of fuel you're in free fall so beware!"
-msgstr ""
-"Obtient la quantité de fuel restant dans le réservoir. À chaque pas de "
-"simulation, le module consomme entre 0 et 4 unités de fuel, en fonction de "
-"sa poussée. Une fois que vous avez utilisé tout votre carburant, vous êtes "
-"en chute libre alors prenez garde !"
-
-#. type: Content of: <pre>
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:38
-#, no-wrap
-msgid "[!java]List&lt;Point&gt; [/!]getGround()[! scala]:List[Point][/!]"
-msgstr "[!java]List&lt;Point&gt; [/!]getSol()[! scala]:List[Point][/!]"
-
-#. type: Content of: outside any tag (error?)
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:39
-msgid ""
-"Get the vertices of the ground's profile from left to right.  [!java|"
-"scala]You can retrieve the X and Y coordinates of each point with the "
-"corresponding methods of your point: <code>p.x()</code> and <code>p.y()</"
-"code>.[!/] [!python]Each point is an array of two integers denoting "
-"respectively the X and Y coordinates of that point.[/!]"
-msgstr ""
-"Obtenir les points du sol de gauche à droite. [!java|scala]Vous pouvez "
-"retrouver les coordonnées X et Y de chaque point avec les méthodes "
-"correspondantes de votre point : <code>p.x()</code> et <code>p.y()</code>."
-"[/!] [!python]Chaque point est un tableau de deux entiers représentant "
-"respectivement les coordonnées X et Y de chaque point.[/!]"
-
-#. type: Content of: <h1>
-#: src/lessons/lander/lvl1_lander_101/Lander101.html:2
-msgid "Lander 101"
-msgstr "Se poser pour les nuls"
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl1_lander_101/Lander101.html:4
-msgid ""
-"Congratulations! You won a (one-way) trip to Mars in a cereal box. NASA was "
-"kind enough to donate the Lunar Excursion Module for this mission, so that's "
-"what you'll be flying."
-msgstr ""
-"Bravo ! Vous avez gagné dans une boîte de céréales un voyage (aller simple) "
-"pour Mars. La NASA vous a même fourni un module d'excursion lunaire pour "
-"l'occasion, et c'est donc avec ce véhicule que vous voyagerez."
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl1_lander_101/Lander101.html:8
-msgid ""
-"Before you take off, you must go through some basic landing simulation. You "
-"shouldn't have to fly the lander if all goes as planned but, as they say, "
-"\"better safe than sorry\"."
-msgstr ""
-"Avant le décollage, vous devez vous entraîner sur simulateur aux bases de "
-"l'alunissage. Si tout se passe comme prévu, vous ne devriez pas avoir à "
-"voler en mode manuel, mais mieux vaut prévenir que guérir, comme ils disent."
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl1_lander_101/Lander101.html:12
-msgid ""
-"Your mission is to <b>land the lander with a vertical speed of at most 10 m/"
-"s.</b> There are two ways you can influence the lander's course: by "
-"adjusting its angle or by adjusting its thrust. In this simulation we only "
-"care about adjusting the thrust, expressed in m/s²."
-msgstr ""
-"Votre mission est de <b>poser le module avec une vitesse verticale "
-"inférieure à 10 m/s</b>. Il y a deux façons d'influer sur la trajectoire du "
-"module : en modifiant son angle, ou en réglant la poussée de son moteur. "
-"Dans cette simulation, nous ne nous intéressons qu'à la poussée, exprimée en "
-"m/s²."
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl1_lander_101/Lander101.html:17
-msgid ""
-"The [!python]<code>step()</code> function[/!][!scala|java|c]code[/!] that "
-"you should write now will be called every 0.1 second during the simulation. "
-"It should set the desired thrust of the next simulation step, by calling "
-"<code>[!java]void [/!]setDesiredThrust([!java]int [/!]desiredThrust[!scala]:"
-"Integer[/!])</code> where <code>desiredThrust</code> is some integer between "
-"0 and 4 (that is, a thrust between 0 m/s² and 4 m/s²). You can only "
-"increment or decrement the thrust by 1 between two simulation steps, so if "
-"the current thrust is 2 and you ask for 4, you'll only get 3 in the next "
-"step. If you ask for less than 0 (resp. more than 4), everything will be as "
-"if you had asked for 0 (resp. 4)."
-msgstr ""
-"Vous devez écrire le [!python]corps de la fonction <code>step()</code>, qui "
-"sera appelée[/!][!scala|java|c]code qui sera appellé[/!] tous les dixièmes "
-"de seconde pendant la simulation. Il faut ajuster la poussée du moteur en "
-"utilisant la fonction <code>[!java]void [/!]setPousseeDesiree([!java]int "
-"[/!]poussee[!scala]:Integer[/!])</code> où <code>poussee</code> est un "
-"entier entre 0 et 4 (représentant une poussée entre 0 m/s² et 4 m/s²). Vous "
-"ne pouvez incrémenter ou décrémenter la poussée que de 1 entre deux pas de "
-"la simulation. Ainsi, si la poussée du moteur est actuellement de 2 et que "
-"vous demandez 4, vous n'aurez que 3 à la prochaine étape. Si vous demandez "
-"une valeur inférieure à 0 (ou supérieure à 4), tout se passera comme si vous "
-"aviez demandé 0 (ou 4)."
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl1_lander_101/Lander101.html:27
-msgid ""
-"In order to take informed decisions, you can query the lander's state. In "
-"this simulation you'll probably be interested in its vertical position: "
-"<code>[!java]double [/!]getY()[!scala]:Double[/!]</code>, and its vertical "
-"speed: <code>[!java]double [/!]getSpeedY()[!scala]:Double[/!]</code>. You "
-"can also ask for the thrust via <code>[!java]int [/!]getThrust()[!scala]:"
-"Integer[/!]</code> in case you don't remember what you asked for. Remember "
-"that Mars' gravity is 3.711 m/s², it might come in handy."
-msgstr ""
-"Afin de prendre des décisions informées, vous pouvez demander des "
-"informations sur l'état actuel du module. Dans cette simulation, vous ne "
-"serez probablement intéressé que par sa position verticale (accessible grâce "
-"à <code>[!java]double [/!]getY()[!scala]:Double[/!]</code>) et sa vitesse "
-"verticale (accessible grâce à <code>[!java]double [/!]getVitesseY()[!scala]:"
-"Double[/!]</code>). Vous pouvez également demander la poussée actuelle du "
-"moteur (avec <code>[!java]int [/!]getPoussee()[!scala]:Integer[/!]</code>) "
-"si vous avez oublié ce que vous avez demandé. Rappelez vous que la gravité "
-"martienne est de 3.711 m/s², cela peut vous être utile."
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl1_lander_101/Lander101.html:35
-msgid ""
-"One last thing: the lander is pretty small so you don't have much fuel. At "
-"each step of the simulation the lander consumes as many fuel units as the "
-"current thrust. Once you run out of fuel you're in free fall so beware! You "
-"can consult the remaining amount of available fuel units using <code>[!"
-"java]int [/!]getFuel()[!scala]:Integer[/!]</code>."
-msgstr ""
-"Une dernière chose : le module est plutôt petit, et vous n'avez pas tant de "
-"carburant que cela. À chaque pas de simulation, il consomme autant d'unité "
-"de carburant que la poussée actuelle du moteur. Si vous tombez en panne "
-"sèche, vous serez en chute libre alors attention ! Vous pouvez consulter le "
-"niveau du réservoir avec <code>[!java]int [/!]getFuel()[!scala]:Integer[/!]</"
-"code>."
-
-#. type: Content of: <h2>
-#: src/lessons/lander/lvl2_locate_landing_zone/LocateLandingZone.html:2
-msgid "Locate a Landing Zone"
-msgstr "Repérer une zone plate"
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl2_locate_landing_zone/LocateLandingZone.html:4
-msgid ""
-"After 200 days of traveling space and eating cereals you finally reach Mars. "
-"Time to land at last!"
-msgstr ""
-"Après 200 jours de voyage intersidéral à manger des céréales, vous êtes "
-"enfin parvenu à la planète rouge. Il est enfin temps de se poser !"
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl2_locate_landing_zone/LocateLandingZone.html:7
-msgid ""
-"The lander is on autopilot and all you have to do is look around and tell it "
-"where to land. The lander must <b>land on a flat zone</b> it you want to "
-"remain in one piece. You indicate the lander where to land by modifying the "
-"<code>getLandingZone</code> function so that it returns a [!java|"
-"scala]<code>Segment</code> representing the zone of your choice."
-msgstr ""
-"Le module est en pilote automatique, et vous n'avez qu'à regarder autour de "
-"vous pour sélectionner une zone d'alunissage. Vous devez vous poser sur "
-"<b>une zone plate</b> si vous ne voulez pas vous scratcher. Vous indiquez au "
-"pilote automatique où se poser en modifiant la fonction "
-"<code>getLandingZone</code> de façon à ce qu'elle retourne [!java|scala]un "
-"Segment représentant la zone de votre choix."
-
-#. type: Content of: <p><p>
-#: src/lessons/lander/lvl2_locate_landing_zone/LocateLandingZone.html:13
-msgid ""
-"A segment is composed of two <code>Point</code>s, each of them composed of "
-"two <code>double</code>s. A segment is built via the <code>Segment([!"
-"java]Point [/!]start[!scala]:Point[/!], [!java]Point [/!]end[!scala]:"
-"Point[/!])</code> constructor.  A point is built via the <code>Point([!"
-"java]double [/!]x[!scala]:Double[/!], [!java]double [/!]y[!scala]:"
-"Double[/!])</code> constructor. A point's coordinates are accessible via its "
-"<code>[!java]double [/!]x()[!scala]:Double[/!]</code> and <code>[!"
-"java]double [/!]y()[!scala]:Double[/!]</code> methods."
-msgstr ""
-"Un Segment est composé de deux <code>Point</code>s, chacun composé de deux "
-"doubles. On construit un nouveau segment de la façon suivante : "
-"<code>Segment([!java]Point [/!]debut[!scala]:Point[/!], [!java]Point "
-"[/!]fin[!scala]:Point[/!])</code>. Pour créer de nouveaux points, il faut "
-"utiliser le constructeur <code>Point([!java]double [/!]x[!scala]:Double[/!], "
-"[!java]double [/!]y[!scala]:Double[/!])</code>. Les coordonnées d'un point "
-"sont accessibles grâce à ses méthodes <code>[!java]double [/!]x()[!scala]:"
-"Double[/!]</code> et <code>[!java]double [/!]y()[!scala]:Double[/!]</code>."
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl2_locate_landing_zone/LocateLandingZone.html:18
-msgid ""
-"[/!] [!python]tuple of two X coordinates representing the zone of your "
-"choice.[/!]"
-msgstr ""
-"[/!] [!python]tuple de deux coordonnées X délimitant la zone de votre choix."
-"[/!]"
-
-#. type: Content of: <p><p>
-#: src/lessons/lander/lvl2_locate_landing_zone/LocateLandingZone.html:22
-msgid ""
-"In order to determine which zone to return, you'll need to call <code>[!"
-"java]List&lt;Point&gt; [/!]getGround()[!scala]List[Point][/!]</code>, which "
-"returns the vertices of the ground's profile as a list of [!java|"
-"scala]<code>Point</code>[/!] [!python]tuples (x,y)[/!]."
-msgstr ""
-"Pour déterminer la zone cible, vous devez appeler <code>[!java]List&lt;"
-"Point&gt; [/!]getSol()[!scala]:List[Point][/!]</code>, qui retourne les "
-"points qui composent la surface sous la forme d'une list de [!java|"
-"scala]<code>Point</code>[/!] [!python]tuples (x,y)[/!]."
-
-#. type: Content of: <p><p>
-#: src/lessons/lander/lvl2_locate_landing_zone/LocateLandingZone.html:27
-msgid ""
-"One more thing: your function should return a valid flat zone in any kind of "
-"situation, not just for the currently visualized one. That's because it will "
-"be not only tested against that world, but also against the one we had in "
-"the previous exercise. As usual, you can see the other existing worlds with "
-"the appropriate combobox."
-msgstr ""
-"Une dernière chose : votre fonction doit retourner une zone valide dans "
-"toutes les situations, pas seulement celle que l'on voit en ce moment. C'est "
-"que votre code sera utilisé dans ce cas, mais également dans la "
-"configuration que nous avions dans l'exercice précédent. Comme d'habitude, "
-"vous pouvez voir les autres mondes en les sélectionnant dans le combobox au "
-"dessus de la vue du monde."
-
-#. type: Content of: <p><p>
-#: src/lessons/lander/lvl2_locate_landing_zone/LocateLandingZone.html:33
-msgid ""
-"Have a safe landing! Don't forget to put on your space suit on your way out."
-msgstr ""
-"Bon alunissage ! N'oubliez pas de mettre votre combinaison spatiale en "
-"sortant."
-
-#. type: Content of: <h1>
-#: src/lessons/lander/lvl3_fly_the_lander/FlyTheLander.html:2
-msgid "Fly the Lander!"
-msgstr "Aux commandes du module"
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl3_fly_the_lander/FlyTheLander.html:4
-msgid ""
-"After 30 days of staring at rocks and eating cereals you decide it's time to "
-"go explore other parts of the planet."
-msgstr ""
-"Après 30 jours à regarder des cailloux en mangeant des céréales, vous "
-"décidez qu'il est temps d'aller explorer d'autres coins de cette planète."
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl3_fly_the_lander/FlyTheLander.html:7
-msgid ""
-"You fly for a while and suddenly realize you're almost out of fuel.  "
-"Unfortunately you're in a delicate situation and the autopilot is helpless.  "
-"You will have to pilot the lander yourself. Your mission is to <b>land the "
-"lander on a flat zone with a vertical speed less than 10 m/s, an horizontal "
-"speed less than 5 m/s and an angle of 0°.</b>"
-msgstr ""
-"Vous volez un moment, avant de réaliser soudain que vous êtes presque à "
-"court d'essence. Le pilote automatique est malheureusement inutile dans ce "
-"genre de situation périlleuse, et vous allez devoir vous poser en mode "
-"manuel. Votre mission et de vous <b>poser sur une zone plate, avec une "
-"vitesse verticale inférieure à 10 m/s, une vitesse horizontale inférieure à "
-"5 m/s et un angle de 0°</b>."
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl3_fly_the_lander/FlyTheLander.html:13
-msgid ""
-"You must define two functions: <code>[!java]void [/!]initialize()</code> and "
-"<code>[!java]void [/!]step()</code>. <code>initialize()</code> is called "
-"once just after you press \"Run\". You can use it to chose some flat zone. "
-"As before, <code>step()</code> is called every 0.1 second and is used for "
-"adjusting the lander's thrust and angle. As in the first exercise the "
-"lander's thrust is adjusted via <code>[!java]void [/!]setDesiredThrust([!"
-"java]int [/!]desiredThrust[!scala]:Integer[/!])</code>.  But you can also "
-"control its angle via <code>[!java]void [/!]setDesiredAngle([!java]double "
-"[/!]desiredAngle[!scala]:Double[/!])</code>.  An angle of 0° denotes a "
-"vertical position where the \"head\" of the lander points up.  This is the "
-"angle you must land with. A positive angle denotes a left-leaning lander, a "
-"negative angle a right-leaning one. You cannot lean more than by ±90°, and "
-"the angle can vary by at most ±5° in one step."
-msgstr ""
-"Vous devez définir deux fonctions : <code>[!java]void [/!]initialize()</"
-"code> et <code>[!java]void [/!]step()</code>. <code>initialize()</code> est "
-"appelée au moment où l'on appuie sur le bouton «Exécuter». Vous pouvez "
-"l'utiliser pour choisir une zone plate. Comme avant, <code>step()</code> est "
-"appelée tous les dixièmes de seconde pour vous permettre d'ajuster la "
-"poussée (avec la fonction  <code>[!java]void [/!]setPousseedesiree([!"
-"java]int [/!]poussee[!scala]:Integer[/!])</code>). Vous pouvez également "
-"contrôler l'angle du module avec la fonction <code>[!java]void "
-"[/!]setAngleDesire([!java]double [/!]angle[!scala]:Double[/!])</code>. Un "
-"angle de O° dénote une position verticale, avec le sommet du module dirigé "
-"vers le haut. C'est l'angle avec lequel vous devez vous poser. Un angle "
-"positif indique que le module penche vers la gauche tandis qu'un angle "
-"négatif indique au contraire qu'il penche à droite. Il est impossible de se "
-"pencher à plus de ±90°, et on ne peut pas pencher le module de plus de ±5° "
-"en une fois."
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl3_fly_the_lander/FlyTheLander.html:26
-msgid ""
-"As in the previous exercise, <code>[!java]List&lt;Point&gt; [/!]getGround()[!"
-"scala]:List[Point][/!]</code> returns the vertices of the ground's profile "
-"from left to right.  Please refer to the documentation (Help/About this "
-"world) for a reference manual of your lunar lander."
-msgstr ""
-"Comme dans les exercices précédents, <code>[!java]List&lt;Point&gt; "
-"[/!]getSol()[!scala]:List[Point][/!]</code> retourne les points qui "
-"composent l'horizon. Le manuel de référence de votre module est disponible "
-"dans la documentation (Aide/À propos de ce monde)."
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl3_fly_the_lander/FlyTheLander.html:30
-msgid ""
-"As before, your program must safely land the lander in all the situations "
-"encountered so far in addition to this new one."
-msgstr ""
-"Comme d'habitude, votre programme doit se poser sans heurt dans toutes les "
-"situations que nous avons rencontré jusqu'à présent, ainsi que dans ce "
-"nouveau cas."
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl3_fly_the_lander/FlyTheLander.html:33
-msgid "Good luck, try not to crash!"
-msgstr "Bonne chance. Essayez de ne pas vous scratcher ;)"
-
-#. type: Content of: <h2>
 #: lib/doc/MainWindow.html:1
 msgid "The PLM Main Window"
 msgstr "La fenêtre principale de PLM"
@@ -16012,6 +15623,620 @@
 "Le bouton <b>marquer</b> demande à votre buggle de faire un trait au sol "
 "quand elle avance."
 
+#, fuzzy
+#~| msgid ""
+#~| "Your work is to help this poor guy sorting his stack by flipping the "
+#~| "pancakes. Each pancake is defined by its radius and rank within the "
+#~| "stack, with the top-most pancake is at rank 0, and the one below at rank "
+#~| "1."
+#~ msgid ""
+#~ "Your work is to help this poor guy sorting his stack by flipping the "
+#~ "pancakes. Each pancake is defined by its radius and rank within the "
+#~ "stack, where the bottom pancake is at rank 0, and the one above at rank 1."
+#~ msgstr ""
+#~ "Vous devez aider ce pauvre homme à trier sa pile en retournant des "
+#~ "crêpes. Chaque crêpe est définie par son rayon et son rang dans la pile. "
+#~ "La pile la plus haute est de rang 0, et celle placée au dessous d'elle "
+#~ "est de rang 1."
+
+#~ msgid "Lunar Lander"
+#~ msgstr "Alunisseur"
+
+#~ msgid ""
+#~ "In this lesson you pilot a lunar landing module in increasingly complex "
+#~ "situations."
+#~ msgstr ""
+#~ "Dans cette leçon, vous pilotez un alunisseur dans des situations de plus "
+#~ "en plus complexes."
+
+#~ msgid ""
+#~ "At each step of the simulation, the player issues a command controlling "
+#~ "how much the angle and thrust of the lander should change"
+#~ msgstr ""
+#~ "À chaque pas de la simulation, le joueur donne des commandes contrôlant "
+#~ "l'angle et la poussée du module d'alunissage."
+
+#~ msgid "Ideas concerning the progression of exercises:"
+#~ msgstr "Idées d'exercices à ajouter à la progression proposée :"
+
+#~ msgid ""
+#~ "A lander in vertical position above flat ground, the player can only "
+#~ "control thrust (done)"
+#~ msgstr ""
+#~ "Un alunisseur en position verticale au dessus d'un sol plat. Le joueur ne "
+#~ "peut régler que la poussée (c'est fait)."
+
+#~ msgid ""
+#~ "A lander in vertical position not above flat ground, the player control "
+#~ "thrust and angle (done)"
+#~ msgstr ""
+#~ "Un alunisseur en position verticale pas au dessus d'un sol plat. Le "
+#~ "joueur peut régler la poussée et l'angle (c'est fait)."
+
+#~ msgid ""
+#~ "A lander with difficult angle and speed not above flat ground, the player "
+#~ "control thrust and angle"
+#~ msgstr ""
+#~ "Un alunisseur avec un angle et une vitesse difficile, pas au dessus d'un "
+#~ "sol plat. Le joueur contrôle la poussée et l'angle."
+
+#~ msgid ""
+#~ "A lander with difficult angle and speed not above flat ground, with "
+#~ "difficult ground, the player control thrust and angle"
+#~ msgstr ""
+#~ "Un alunisseur avec un angle et une vitesse difficile, pas au dessus d'un "
+#~ "sol plat dans une configuration difficile. Le joueur contrôle la poussée "
+#~ "et l'angle."
+
+#~ msgid "Same with wind?"
+#~ msgstr "La même chose avec du vent ?"
+
+#~ msgid "This lesson assumes some basic programming and physics skills."
+#~ msgstr ""
+#~ "Vous êtes supposé maîtriser les bases de la programmation et posséder "
+#~ "quelques notions de mécanique du point avant de tenter cette leçon."
+
+#~ msgid ""
+#~ "In this universe you pilot a lunar lander. At each simulation step you're "
+#~ "given the lander's position, speed, angle and thrust and must issue a "
+#~ "command adjusting its angle and thrust."
+#~ msgstr ""
+#~ "Dans cet univers, vous contrôlez un module d'alunissage. À chaque pas de "
+#~ "la simulation, vous avez accès à la position du module, sa vitesse, son "
+#~ "angle et la poussée de son moteur. Vous devez alors décider de l'angle et "
+#~ "de la poussée pour l'étape suivante. "
+
+#~ msgid "Get the X and Y position of the lander."
+#~ msgstr "Retourne la position en X et Y du module d'alunissage."
+
+#~ msgid ""
+#~ "[!java|c]double [/!]getSpeedX()[!scala]:Double[/!]\n"
+#~ "[!java|c]double [/!]getSpeedY()[!scala]:Double[/!]"
+#~ msgstr ""
+#~ "[!java|c]double [/!]getVitesseX()[!scala]:Double[/!]\n"
+#~ "[!java|c]double [/!]getVitesseY()[!scala]:Double[/!]"
+
+#~ msgid "Get the horizontal and vertical speed of the lander."
+#~ msgstr "Obtenir les vitesses horizontale et verticale du module."
+
+#~ msgid ""
+#~ "[!java|c]double [/!]getAngle()[!scala]:Double[/!]\n"
+#~ "[!java|c]void [/!]setDesiredAngle([!java|c]double [/!]desiredAngle[!scala]:Double[/!])"
+#~ msgstr ""
+#~ "[!java|c]double [/!]getAngle()[!scala]:Double[/!]\n"
+#~ "[!java|c]void [/!]setAngleDesire([!java|c]double [/!]angle[!scala]:Double[/!])"
+
+#~ msgid "Get or set the angle of the lander."
+#~ msgstr "Retourne ou fixe l'angle du module d'alunissage."
+
+#~ msgid ""
+#~ "An angle of 0° denotes a vertical position where the \"head\" of the "
+#~ "lander points up.  This is the angle you must land with. A positive angle "
+#~ "denotes a left-leaning lander, a negative angle a right-leaning one. You "
+#~ "cannot lean more than by ±90°, and the angle can vary by at most ±5° in "
+#~ "one step."
+#~ msgstr ""
+#~ "Un angle de O° dénote une position verticale, avec le sommet du module "
+#~ "dirigé vers le haut. C'est l'angle avec lequel vous devez vous poser. Un "
+#~ "angle positif indique que le module penche vers la gauche tandis qu'un "
+#~ "angle négatif indique au contraire qu'il penche à droite. Il est "
+#~ "impossible de se pencher à plus de ±90°, et on ne peut pas pencher le "
+#~ "module de plus de ±5° en une fois."
+
+#~ msgid ""
+#~ "[!java|c]int [/!]getThrust()[!scala]:Int[/!]\n"
+#~ "[!java|c]void [/!]setDesiredThrust([!java|c]int [/!]thrust[!scala]:Int[/!])"
+#~ msgstr ""
+#~ "[!java|c]int [/!]getPoussee()[!scala]:Int[/!]\n"
+#~ "[!java|c]void [/!]setPousseeDesiree([!java|c]int [/!]poussée[!scala]:Int[/!])"
+
+#~ msgid "Get or set the thrust of the lander."
+#~ msgstr "Retourne ou fixe la poussée du module."
+
+#~ msgid ""
+#~ "You can only increment or decrement the thrust by 1 between two "
+#~ "simulation steps, so if the current thrust is 2 and you ask for 4, you'll "
+#~ "only get 3 in the next step. If you ask for less than 0 (resp. more than "
+#~ "4), everything will be as if you had asked for 0 (resp. 4)."
+#~ msgstr ""
+#~ "Vous ne pouvez incrémenter ou décrémenter la poussée que d'une unité à "
+#~ "chaque fois. Si votre poussée actuelle est de 2 et que vous demandez une "
+#~ "poussée de 4, vous n'obtiendrez que 3 au prochain pas de temps. Si vous "
+#~ "demandez moins que 0 (ou plus que 4), tout se passera comme si vous "
+#~ "demandiez 0 (ou 4)."
+
+#~ msgid "[!java|c]int [/!]getFuel()[!scala]:Int[/!]"
+#~ msgstr "[!java|c]int [/!]getFuel()[!scala]:Int[/!]"
+
+#~ msgid ""
+#~ "Get the remaining fuel in the lander.  At each step of the simulation the "
+#~ "lander consumes as many fuel units as the current thrust. Once you run "
+#~ "out of fuel you're in free fall so beware!"
+#~ msgstr ""
+#~ "Obtient la quantité de fuel restant dans le réservoir. À chaque pas de "
+#~ "simulation, le module consomme entre 0 et 4 unités de fuel, en fonction "
+#~ "de sa poussée. Une fois que vous avez utilisé tout votre carburant, vous "
+#~ "êtes en chute libre alors prenez garde !"
+
+#~ msgid "[!java]List&lt;Point&gt; [/!]getGround()[! scala]:List[Point][/!]"
+#~ msgstr "[!java]List&lt;Point&gt; [/!]getSol()[! scala]:List[Point][/!]"
+
+#~ msgid ""
+#~ "Get the vertices of the ground's profile from left to right.  [!java|"
+#~ "scala]You can retrieve the X and Y coordinates of each point with the "
+#~ "corresponding methods of your point: <code>p.x()</code> and <code>p.y()</"
+#~ "code>.[!/] [!python]Each point is an array of two integers denoting "
+#~ "respectively the X and Y coordinates of that point.[/!]"
+#~ msgstr ""
+#~ "Obtenir les points du sol de gauche à droite. [!java|scala]Vous pouvez "
+#~ "retrouver les coordonnées X et Y de chaque point avec les méthodes "
+#~ "correspondantes de votre point : <code>p.x()</code> et <code>p.y()</code>."
+#~ "[/!] [!python]Chaque point est un tableau de deux entiers représentant "
+#~ "respectivement les coordonnées X et Y de chaque point.[/!]"
+
+#~ msgid "Lander 101"
+#~ msgstr "Se poser pour les nuls"
+
+#~ msgid ""
+#~ "Congratulations! You won a (one-way) trip to Mars in a cereal box. NASA "
+#~ "was kind enough to donate the Lunar Excursion Module for this mission, so "
+#~ "that's what you'll be flying."
+#~ msgstr ""
+#~ "Bravo ! Vous avez gagné dans une boîte de céréales un voyage (aller "
+#~ "simple) pour Mars. La NASA vous a même fourni un module d'excursion "
+#~ "lunaire pour l'occasion, et c'est donc avec ce véhicule que vous "
+#~ "voyagerez."
+
+#~ msgid ""
+#~ "Before you take off, you must go through some basic landing simulation. "
+#~ "You shouldn't have to fly the lander if all goes as planned but, as they "
+#~ "say, \"better safe than sorry\"."
+#~ msgstr ""
+#~ "Avant le décollage, vous devez vous entraîner sur simulateur aux bases de "
+#~ "l'alunissage. Si tout se passe comme prévu, vous ne devriez pas avoir à "
+#~ "voler en mode manuel, mais mieux vaut prévenir que guérir, comme ils "
+#~ "disent."
+
+#~ msgid ""
+#~ "Your mission is to <b>land the lander with a vertical speed of at most 10 "
+#~ "m/s.</b> There are two ways you can influence the lander's course: by "
+#~ "adjusting its angle or by adjusting its thrust. In this simulation we "
+#~ "only care about adjusting the thrust, expressed in m/s²."
+#~ msgstr ""
+#~ "Votre mission est de <b>poser le module avec une vitesse verticale "
+#~ "inférieure à 10 m/s</b>. Il y a deux façons d'influer sur la trajectoire "
+#~ "du module : en modifiant son angle, ou en réglant la poussée de son "
+#~ "moteur. Dans cette simulation, nous ne nous intéressons qu'à la poussée, "
+#~ "exprimée en m/s²."
+
+#~ msgid ""
+#~ "The [!python]<code>step()</code> function[/!][!scala|java|c]code[/!] that "
+#~ "you should write now will be called every 0.1 second during the "
+#~ "simulation. It should set the desired thrust of the next simulation step, "
+#~ "by calling <code>[!java]void [/!]setDesiredThrust([!java]int "
+#~ "[/!]desiredThrust[!scala]:Integer[/!])</code> where <code>desiredThrust</"
+#~ "code> is some integer between 0 and 4 (that is, a thrust between 0 m/s² "
+#~ "and 4 m/s²). You can only increment or decrement the thrust by 1 between "
+#~ "two simulation steps, so if the current thrust is 2 and you ask for 4, "
+#~ "you'll only get 3 in the next step. If you ask for less than 0 (resp. "
+#~ "more than 4), everything will be as if you had asked for 0 (resp. 4)."
+#~ msgstr ""
+#~ "Vous devez écrire le [!python]corps de la fonction <code>step()</code>, "
+#~ "qui sera appelée[/!][!scala|java|c]code qui sera appellé[/!] tous les "
+#~ "dixièmes de seconde pendant la simulation. Il faut ajuster la poussée du "
+#~ "moteur en utilisant la fonction <code>[!java]void [/!]setPousseeDesiree([!"
+#~ "java]int [/!]poussee[!scala]:Integer[/!])</code> où <code>poussee</code> "
+#~ "est un entier entre 0 et 4 (représentant une poussée entre 0 m/s² et 4 m/"
+#~ "s²). Vous ne pouvez incrémenter ou décrémenter la poussée que de 1 entre "
+#~ "deux pas de la simulation. Ainsi, si la poussée du moteur est "
+#~ "actuellement de 2 et que vous demandez 4, vous n'aurez que 3 à la "
+#~ "prochaine étape. Si vous demandez une valeur inférieure à 0 (ou "
+#~ "supérieure à 4), tout se passera comme si vous aviez demandé 0 (ou 4)."
+
+#~ msgid ""
+#~ "In order to take informed decisions, you can query the lander's state. In "
+#~ "this simulation you'll probably be interested in its vertical position: "
+#~ "<code>[!java]double [/!]getY()[!scala]:Double[/!]</code>, and its "
+#~ "vertical speed: <code>[!java]double [/!]getSpeedY()[!scala]:Double[/!]</"
+#~ "code>. You can also ask for the thrust via <code>[!java]int "
+#~ "[/!]getThrust()[!scala]:Integer[/!]</code> in case you don't remember "
+#~ "what you asked for. Remember that Mars' gravity is 3.711 m/s², it might "
+#~ "come in handy."
+#~ msgstr ""
+#~ "Afin de prendre des décisions informées, vous pouvez demander des "
+#~ "informations sur l'état actuel du module. Dans cette simulation, vous ne "
+#~ "serez probablement intéressé que par sa position verticale (accessible "
+#~ "grâce à <code>[!java]double [/!]getY()[!scala]:Double[/!]</code>) et sa "
+#~ "vitesse verticale (accessible grâce à <code>[!java]double "
+#~ "[/!]getVitesseY()[!scala]:Double[/!]</code>). Vous pouvez également "
+#~ "demander la poussée actuelle du moteur (avec <code>[!java]int "
+#~ "[/!]getPoussee()[!scala]:Integer[/!]</code>) si vous avez oublié ce que "
+#~ "vous avez demandé. Rappelez vous que la gravité martienne est de 3.711 m/"
+#~ "s², cela peut vous être utile."
+
+#~ msgid ""
+#~ "One last thing: the lander is pretty small so you don't have much fuel. "
+#~ "At each step of the simulation the lander consumes as many fuel units as "
+#~ "the current thrust. Once you run out of fuel you're in free fall so "
+#~ "beware! You can consult the remaining amount of available fuel units "
+#~ "using <code>[!java]int [/!]getFuel()[!scala]:Integer[/!]</code>."
+#~ msgstr ""
+#~ "Une dernière chose : le module est plutôt petit, et vous n'avez pas tant "
+#~ "de carburant que cela. À chaque pas de simulation, il consomme autant "
+#~ "d'unité de carburant que la poussée actuelle du moteur. Si vous tombez en "
+#~ "panne sèche, vous serez en chute libre alors attention ! Vous pouvez "
+#~ "consulter le niveau du réservoir avec <code>[!java]int [/!]getFuel()[!"
+#~ "scala]:Integer[/!]</code>."
+
+#~ msgid "Locate a Landing Zone"
+#~ msgstr "Repérer une zone plate"
+
+#~ msgid ""
+#~ "After 200 days of traveling space and eating cereals you finally reach "
+#~ "Mars. Time to land at last!"
+#~ msgstr ""
+#~ "Après 200 jours de voyage intersidéral à manger des céréales, vous êtes "
+#~ "enfin parvenu à la planète rouge. Il est enfin temps de se poser !"
+
+#~ msgid ""
+#~ "The lander is on autopilot and all you have to do is look around and tell "
+#~ "it where to land. The lander must <b>land on a flat zone</b> it you want "
+#~ "to remain in one piece. You indicate the lander where to land by "
+#~ "modifying the <code>getLandingZone</code> function so that it returns a [!"
+#~ "java|scala]<code>Segment</code> representing the zone of your choice."
+#~ msgstr ""
+#~ "Le module est en pilote automatique, et vous n'avez qu'à regarder autour "
+#~ "de vous pour sélectionner une zone d'alunissage. Vous devez vous poser "
+#~ "sur <b>une zone plate</b> si vous ne voulez pas vous scratcher. Vous "
+#~ "indiquez au pilote automatique où se poser en modifiant la fonction "
+#~ "<code>getLandingZone</code> de façon à ce qu'elle retourne [!java|"
+#~ "scala]un Segment représentant la zone de votre choix."
+
+#~ msgid ""
+#~ "A segment is composed of two <code>Point</code>s, each of them composed "
+#~ "of two <code>double</code>s. A segment is built via the <code>Segment([!"
+#~ "java]Point [/!]start[!scala]:Point[/!], [!java]Point [/!]end[!scala]:"
+#~ "Point[/!])</code> constructor.  A point is built via the <code>Point([!"
+#~ "java]double [/!]x[!scala]:Double[/!], [!java]double [/!]y[!scala]:"
+#~ "Double[/!])</code> constructor. A point's coordinates are accessible via "
+#~ "its <code>[!java]double [/!]x()[!scala]:Double[/!]</code> and <code>[!"
+#~ "java]double [/!]y()[!scala]:Double[/!]</code> methods."
+#~ msgstr ""
+#~ "Un Segment est composé de deux <code>Point</code>s, chacun composé de "
+#~ "deux doubles. On construit un nouveau segment de la façon suivante : "
+#~ "<code>Segment([!java]Point [/!]debut[!scala]:Point[/!], [!java]Point "
+#~ "[/!]fin[!scala]:Point[/!])</code>. Pour créer de nouveaux points, il faut "
+#~ "utiliser le constructeur <code>Point([!java]double [/!]x[!scala]:"
+#~ "Double[/!], [!java]double [/!]y[!scala]:Double[/!])</code>. Les "
+#~ "coordonnées d'un point sont accessibles grâce à ses méthodes <code>[!"
+#~ "java]double [/!]x()[!scala]:Double[/!]</code> et <code>[!java]double "
+#~ "[/!]y()[!scala]:Double[/!]</code>."
+
+#~ msgid ""
+#~ "[/!] [!python]tuple of two X coordinates representing the zone of your "
+#~ "choice.[/!]"
+#~ msgstr ""
+#~ "[/!] [!python]tuple de deux coordonnées X délimitant la zone de votre "
+#~ "choix.[/!]"
+
+#~ msgid ""
+#~ "In order to determine which zone to return, you'll need to call <code>[!"
+#~ "java]List&lt;Point&gt; [/!]getGround()[!scala]List[Point][/!]</code>, "
+#~ "which returns the vertices of the ground's profile as a list of [!java|"
+#~ "scala]<code>Point</code>[/!] [!python]tuples (x,y)[/!]."
+#~ msgstr ""
+#~ "Pour déterminer la zone cible, vous devez appeler <code>[!java]List&lt;"
+#~ "Point&gt; [/!]getSol()[!scala]:List[Point][/!]</code>, qui retourne les "
+#~ "points qui composent la surface sous la forme d'une list de [!java|"
+#~ "scala]<code>Point</code>[/!] [!python]tuples (x,y)[/!]."
+
+#~ msgid ""
+#~ "One more thing: your function should return a valid flat zone in any kind "
+#~ "of situation, not just for the currently visualized one. That's because "
+#~ "it will be not only tested against that world, but also against the one "
+#~ "we had in the previous exercise. As usual, you can see the other existing "
+#~ "worlds with the appropriate combobox."
+#~ msgstr ""
+#~ "Une dernière chose : votre fonction doit retourner une zone valide dans "
+#~ "toutes les situations, pas seulement celle que l'on voit en ce moment. "
+#~ "C'est que votre code sera utilisé dans ce cas, mais également dans la "
+#~ "configuration que nous avions dans l'exercice précédent. Comme "
+#~ "d'habitude, vous pouvez voir les autres mondes en les sélectionnant dans "
+#~ "le combobox au dessus de la vue du monde."
+
+#~ msgid ""
+#~ "Have a safe landing! Don't forget to put on your space suit on your way "
+#~ "out."
+#~ msgstr ""
+#~ "Bon alunissage ! N'oubliez pas de mettre votre combinaison spatiale en "
+#~ "sortant."
+
+#~ msgid "Fly the Lander!"
+#~ msgstr "Aux commandes du module"
+
+#~ msgid ""
+#~ "After 30 days of staring at rocks and eating cereals you decide it's time "
+#~ "to go explore other parts of the planet."
+#~ msgstr ""
+#~ "Après 30 jours à regarder des cailloux en mangeant des céréales, vous "
+#~ "décidez qu'il est temps d'aller explorer d'autres coins de cette planète."
+
+#~ msgid ""
+#~ "You fly for a while and suddenly realize you're almost out of fuel.  "
+#~ "Unfortunately you're in a delicate situation and the autopilot is "
+#~ "helpless.  You will have to pilot the lander yourself. Your mission is to "
+#~ "<b>land the lander on a flat zone with a vertical speed less than 10 m/s, "
+#~ "an horizontal speed less than 5 m/s and an angle of 0°.</b>"
+#~ msgstr ""
+#~ "Vous volez un moment, avant de réaliser soudain que vous êtes presque à "
+#~ "court d'essence. Le pilote automatique est malheureusement inutile dans "
+#~ "ce genre de situation périlleuse, et vous allez devoir vous poser en mode "
+#~ "manuel. Votre mission et de vous <b>poser sur une zone plate, avec une "
+#~ "vitesse verticale inférieure à 10 m/s, une vitesse horizontale inférieure "
+#~ "à 5 m/s et un angle de 0°</b>."
+
+#~ msgid ""
+#~ "You must define two functions: <code>[!java]void [/!]initialize()</code> "
+#~ "and <code>[!java]void [/!]step()</code>. <code>initialize()</code> is "
+#~ "called once just after you press \"Run\". You can use it to chose some "
+#~ "flat zone. As before, <code>step()</code> is called every 0.1 second and "
+#~ "is used for adjusting the lander's thrust and angle. As in the first "
+#~ "exercise the lander's thrust is adjusted via <code>[!java]void "
+#~ "[/!]setDesiredThrust([!java]int [/!]desiredThrust[!scala]:Integer[/!])</"
+#~ "code>.  But you can also control its angle via <code>[!java]void "
+#~ "[/!]setDesiredAngle([!java]double [/!]desiredAngle[!scala]:Double[/!])</"
+#~ "code>.  An angle of 0° denotes a vertical position where the \"head\" of "
+#~ "the lander points up.  This is the angle you must land with. A positive "
+#~ "angle denotes a left-leaning lander, a negative angle a right-leaning "
+#~ "one. You cannot lean more than by ±90°, and the angle can vary by at most "
+#~ "±5° in one step."
+#~ msgstr ""
+#~ "Vous devez définir deux fonctions : <code>[!java]void [/!]initialize()</"
+#~ "code> et <code>[!java]void [/!]step()</code>. <code>initialize()</code> "
+#~ "est appelée au moment où l'on appuie sur le bouton «Exécuter». Vous "
+#~ "pouvez l'utiliser pour choisir une zone plate. Comme avant, <code>step()</"
+#~ "code> est appelée tous les dixièmes de seconde pour vous permettre "
+#~ "d'ajuster la poussée (avec la fonction  <code>[!java]void "
+#~ "[/!]setPousseedesiree([!java]int [/!]poussee[!scala]:Integer[/!])</"
+#~ "code>). Vous pouvez également contrôler l'angle du module avec la "
+#~ "fonction <code>[!java]void [/!]setAngleDesire([!java]double [/!]angle[!"
+#~ "scala]:Double[/!])</code>. Un angle de O° dénote une position verticale, "
+#~ "avec le sommet du module dirigé vers le haut. C'est l'angle avec lequel "
+#~ "vous devez vous poser. Un angle positif indique que le module penche vers "
+#~ "la gauche tandis qu'un angle négatif indique au contraire qu'il penche à "
+#~ "droite. Il est impossible de se pencher à plus de ±90°, et on ne peut pas "
+#~ "pencher le module de plus de ±5° en une fois."
+
+#~ msgid ""
+#~ "As in the previous exercise, <code>[!java]List&lt;Point&gt; "
+#~ "[/!]getGround()[!scala]:List[Point][/!]</code> returns the vertices of "
+#~ "the ground's profile from left to right.  Please refer to the "
+#~ "documentation (Help/About this world) for a reference manual of your "
+#~ "lunar lander."
+#~ msgstr ""
+#~ "Comme dans les exercices précédents, <code>[!java]List&lt;Point&gt; "
+#~ "[/!]getSol()[!scala]:List[Point][/!]</code> retourne les points qui "
+#~ "composent l'horizon. Le manuel de référence de votre module est "
+#~ "disponible dans la documentation (Aide/À propos de ce monde)."
+
+#~ msgid ""
+#~ "As before, your program must safely land the lander in all the situations "
+#~ "encountered so far in addition to this new one."
+#~ msgstr ""
+#~ "Comme d'habitude, votre programme doit se poser sans heurt dans toutes "
+#~ "les situations que nous avons rencontré jusqu'à présent, ainsi que dans "
+#~ "ce nouveau cas."
+
+#~ msgid "Good luck, try not to crash!"
+#~ msgstr "Bonne chance. Essayez de ne pas vous scratcher ;)"
+
+#~ msgid ""
+#~ "Note that the point (0,0) is on the top left corner, as it is often the "
+#~ "case in Computer Science."
+#~ msgstr ""
+#~ "L'origine (0, 0) est dans le coin en haut à gauche, comme c'est souvent "
+#~ "le cas en informatique."
+
+#~ msgid ""
+#~ "Look at the documentation (in \"Help/About this world\") for the full "
+#~ "list of buggles' methods."
+#~ msgstr ""
+#~ "Référez-vous à la documentation (dans le menu \"Aide/À propos de ce monde"
+#~ "\") pour la liste complète des méthodes comprises par les buggles."
+
+#~ msgid ""
+#~ "This exercise was converted to PLM from the excellent exercising site "
+#~ "http://codingbat.com/"
+#~ msgstr ""
+#~ "Cet exercice a été extrait pour PLM depuis l'excellent site d'exercices "
+#~ "http://codingbat.com/"
+
+#~ msgid ""
+#~ "We will now write our own methods. It somehow comes down to extending the "
+#~ "buggle vocabulary by teaching it new tricks."
+#~ msgstr ""
+#~ "Nous allons maintenant voir comment écrire nos propres méthodes. Il "
+#~ "s'agit en quelque sorte d'étendre le vocabulaire de la buggle en lui "
+#~ "apprenant à faire de nouvelles choses."
+
+#~ msgid ""
+#~ "We now would like to teach the buggle to build a doghouse. The naive "
+#~ "approach consists in directly writing the needed code as follows.  This "
+#~ "works because the buggle of this exercise leaves a red path as it moves."
+#~ msgstr ""
+#~ "Nous souhaitons maintenant apprendre à la buggle à se faire une niche.  "
+#~ "La première approche, la plus simple au premier abord, est d'écrire "
+#~ "directement le code permettant de le faire, comme ci-dessous (cela marche "
+#~ "car la buggle de cet exercice laisse une traînée rouge dans son sillage "
+#~ "quand elle se déplace)."
+
+#~ msgid ""
+#~ "After these races, it's time to party! For that, we will teach the "
+#~ "buggles to play Dance Revolution, this game beloved of some students: The "
+#~ "player has to move the feet on the carpet according to the instructions "
+#~ "presented on the screen, and following the music. But before that, we "
+#~ "have some details to study first."
+#~ msgstr ""
+#~ "Après toutes ces courses, il est temps de faire la fête ! Pour cela, nous "
+#~ "allons apprendre à nos buggles à jouer à Dance Revolution, ce jeu très "
+#~ "prisé de certains étudiants où le joueur doit bouger sur un tapis prévu à "
+#~ "cet effet en fonction des consignes présentées à l'écran en rythme avec "
+#~ "la musique. Mais avant cela, nous avons quelques détails à étudier."
+
+#~ msgid ""
+#~ "The goal is then to organize a BDR game between the buggles by teaching "
+#~ "them to move according to the instructions written on the ground. These "
+#~ "instructions are messages written on the ground, with the following "
+#~ "signification:"
+#~ msgstr ""
+#~ "L'objectif est donc d'organiser une partie de BDR entre les buggles en "
+#~ "leur apprenant à bouger en fonction des indications écrites par terre.  "
+#~ "Ces indications sont des messages au sol, avec le code suivant:"
+
+#~ msgid ""
+#~ "Beware, the first line and column are numbered 0 and not 1, and the point "
+#~ "(0,0)  is on the top left corner. This may seem surprising, but it is "
+#~ "very often so in Computer Science."
+#~ msgstr ""
+#~ "Attention, la première ligne et la première colonne sont numérotées 0 au "
+#~ "lieu de 1, et l'origine (0, 0) est dans le coin en haut à gauche. Cela "
+#~ "peut sembler étonnant, mais ces choses sont traditionnelles en "
+#~ "informatique."
+
+#~ msgid ""
+#~ "Gnome Sort is based on the technique used by the standard Dutch Garden "
+#~ "Gnome (Du.: tuinkabouter). Here is how a garden gnome sorts a line of "
+#~ "flower pots. Basically, he looks at the flower pot next to him and the "
+#~ "one immediately after ; if they are in the right order he steps one pot "
+#~ "forward, otherwise he swaps them and steps one pot backwards. Boundary "
+#~ "conditions: if there is no previous pot, he steps forwards; if there is "
+#~ "no pot next to him, he is done.  <i>—Dick Grune</i>"
+#~ msgstr ""
+#~ "L'algorithme de tri du gnome repose sur la manière habituelle de "
+#~ "travailler des nains de jardin pour trier une ligne de pots de fleurs: Le "
+#~ "nain regarde le pot de fleur qui est à côté de lui et il regarde "
+#~ "également le pot de fleurs juste après&nbsp;; si ces deux pots sont "
+#~ "alignés dans le bon ordre, le nain se déplace en avant d'un pot de "
+#~ "fleurs, sinon il les échange et se déplace en arrière d'un pot de fleur. "
+#~ "Condition aux limites&nbsp;: si il n'y a pas de pot de fleurs précédent, "
+#~ "le nain avance ; si il n'y a pas de pot suivant alors il a terminé sa "
+#~ "tâche."
+
+#~ msgid ""
+#~ "Returns the current position of the turtle.  Note that the point (0,0) is "
+#~ "on the top left corner, as it is often the case in Computer Science."
+#~ msgstr ""
+#~ "Renvoie la position courante de la tortue. L'origine (0; 0) est dans le "
+#~ "coin en haut à gauche, comme c'est souvent le cas en informatique."
+
+#~ msgid ""
+#~ "This world allows you to experiment with the recursive lists, as they "
+#~ "were first introduced in Lisp. It is very similar to the BatWorld, but "
+#~ "you are supposed to write recursive functions working on [!python|"
+#~ "java]recursive strings. Since [!thelang] does not provide such a "
+#~ "construct natively, the ConsWorld defines recursive lists of type "
+#~ "<code>RecList</code>.[/!] [!scala]lists of integers (<code>List[Int]</"
+#~ "code>).[/!]"
+#~ msgstr ""
+#~ "Ce monde vous permettra d'expérimenter avec les listes récursives, telles "
+#~ "qu'elles ont été définies en Lisp à l'origine. Ce monde est assez "
+#~ "similaire au BatWorld, mais vous êtes supposé écrire des fonctions "
+#~ "récursives agissant sur des [!python|java]listes récursives. Comme [!"
+#~ "thelang] ne propose rien de tel en natif, ce monde défini un nouveau type "
+#~ "nommé <code>RecList</code> pour cela.[/!] [!scala]listes d'entiers "
+#~ "(<code>List[Int]</code>).[/!]"
+
+#~ msgid "<b>The empty list:</b>"
+#~ msgstr "<b>La liste vide:</b>"
+
+#~ msgid ""
+#~ "Given a [!scala]List[Int][/!][!java|python]recursive list[/!] <code>L</"
+#~ "code>and an integer, return a new list containing all elements of "
+#~ "<code>L</code> that are not equal to the value received as parameter."
+#~ msgstr ""
+#~ "Étant donnée une [!scala]List[Int][/!][java|python]liste récursive[/!] "
+#~ "<code>L</code> et un entier,retournez une nouvelle liste contenant tous "
+#~ "les éléments de <code>L</code> n'étant pas égaux à l'entier passé en "
+#~ "paramètre."
+
+#~ msgid ""
+#~ "Given a [!scala]List[Int][/!][!java|python]recursive list[/!] and an "
+#~ "integer <code>N</code>, return the <code>N</code>th element of the list."
+#~ msgstr ""
+#~ "Étant donnée une [!scala]List[Int][/!][java|python]liste récursive[/!] et "
+#~ "un entier <code>N</code>, retournez le <code>N</code>ième élément de la "
+#~ "liste."
+
+#~ msgid ""
+#~ "A very good introduction to this type is available here: http://codingbat."
+#~ "com/doc/java-if-boolean-logic.html"
+#~ msgstr ""
+#~ "Une très bonne introduction à ce type est disponible ici : http://"
+#~ "codingbat.com/doc/java-if-boolean-logic.html"
+
+#~ msgid ""
+#~ "Strings are the simplest of the complex data types :) They provide "
+#~ "several operations, such as getting the length of the string, or a "
+#~ "substring of it."
+#~ msgstr ""
+#~ "Les chaînes de caractères (\"String\") sont les plus simples des types de "
+#~ "données complexes :) Elles fournissent différentes opérations, comme "
+#~ "obtenir la longueur de la chaîne ou une sous-chaîne."
+
+#~ msgid ""
+#~ "A very good introduction to this type is available here: http://codingbat."
+#~ "com/doc/java-string-introduction.html"
+#~ msgstr ""
+#~ "Une très bonne introduction à ce type est disponible ici : http://"
+#~ "codingbat.com/doc/java-string-introduction.html"
+
+#~ msgid ""
+#~ "The [!python]<code>step()</code> function[/!][!scala|java|c]code[/!] that "
+#~ "you should write now will be called every 0.1 second during the "
+#~ "simulation. Make sure that your code does not last too long, with no "
+#~ "while loop! It should only set the desired thrust of the next simulation "
+#~ "step, by calling <code>[!java]void [/!]setDesiredThrust([!java]int "
+#~ "[/!]desiredThrust[!scala]:Integer[/!])</code> where <code>desiredThrust</"
+#~ "code> is some integer between 0 and 4 (that is, a thrust between 0 m/s² "
+#~ "and 4 m/s²). You can only increment or decrement the thrust by 1 between "
+#~ "two simulation steps, so if the current thrust is 2 and you ask for 4, "
+#~ "you'll only get 3 in the next step. If you ask for less than 0 (resp. "
+#~ "more than 4), everything will be as if you had asked for 0 (resp. 4)."
+#~ msgstr ""
+#~ "Vous devez écrire le [!python]corps de la fonction <code>step()</code>, "
+#~ "qui sera appelée[/!][!scala|java|c]code qui sera appellé[/!] tous les "
+#~ "dixièmes de seconde pendant la simulation. Assurez vous que votre code ne "
+#~ "dure pas trop longtemps, et évitez en particulier les boucles "
+#~ "<code>while</code>. Il faut juste ajuster la poussée du moteur en "
+#~ "utilisant la fonction <code>[!java]void [/!]setPousseeDesiree([!java]int "
+#~ "[/!]poussee[!scala]:Integer[/!])</code> où <code>poussee</code> est un "
+#~ "entier entre 0 et 4 (représentant une poussée entre 0 m/s² et 4 m/s²). "
+#~ "Vous ne pouvez incrémenter ou décrémenter la poussée que de 1 entre deux "
+#~ "pas de la simulation. Ainsi, si la poussée du moteur est actuellement de "
+#~ "2 et que vous demandez 4, vous n'aurez que 3 à la prochaine étape. Si "
+#~ "vous demandez une valeur inférieure à 0 (ou supérieure à 4), tout se "
+#~ "passera comme si vous aviez demandé 0 (ou 4)."
+
 #~ msgid ""
 #~ "When you don't want to follow the proposed exercises but draw your own "
 #~ "stuff, the \"you failed\" message really gets annoying.  We should have a "
--- a/l10n/missions/pt_BR.po
+++ b/l10n/missions/pt_BR.po
@@ -6,7 +6,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PLM mission texts\n"
-"POT-Creation-Date: 2014-09-16 17:00+0200\n"
+"POT-Creation-Date: 2014-11-13 13:47+0100\n"
 "PO-Revision-Date: 2014-10-05 10:25-0300\n"
 "Last-Translator: Fred maranhão <fred.maranhao@gmail.com>\n"
 "Language-Team: none\n"
@@ -808,7 +808,7 @@
 
 #. type: Content of: <h2>
 #: src/lessons/welcome/Main.html:229
-#: src/lessons/welcome/methods/picture/PictureMono.html:2
+#: src/lessons/welcome/methods/picture/PictureMono1.html:2
 msgid "Methodically drawing"
 msgstr "desenhando metodicamente"
 
@@ -1113,6 +1113,7 @@
 #: src/lessons/turmites/langton/Langton.html:32
 #: src/lessons/turmites/helloturmite/HelloTurmite.html:65
 #: src/lessons/sort/basic/comb/AlgCombSort.html:39
+#: src/lessons/recursion/cons/universe/ConsWorld.html:35
 #: src/lessons/recursion/square/FourSquare.html:46
 #: src/lessons/maze/pledge/PledgeMaze.html:68
 #: src/lessons/welcome/bat/bool1/Max1020.html:6
@@ -2144,10 +2145,11 @@
 msgid "x = 5"
 msgstr "x = 5"
 
-#. type: Content of: outside any tag (error?)
+#. type: Content of: <ul><li>
 #: src/lessons/welcome/variables/Variables.html:40
 #: src/lessons/welcome/loopfor/LoopFor.html:68
 #: src/lessons/welcome/bdr/BDR2.html:83
+#: src/lessons/recursion/cons/universe/ConsWorld.html:34
 msgid "[/!] [!scala]"
 msgstr "[/!] [!scala]"
 
@@ -4981,7 +4983,7 @@
 "construir várias casas de cachorro neste mundo."
 
 #. type: Content of: outside any tag (error?)
-#: src/lessons/welcome/methods/picture/PictureMono.html:4
+#: src/lessons/welcome/methods/picture/PictureMono1.html:4
 #: src/lessons/welcome/methods/picture/MethodsPicture.html:4
 msgid ""
 "In this exercise, we will reproduce the geometric drawing that you can see "
@@ -4991,7 +4993,7 @@
 "aba \"Objetivo\"."
 
 #. type: Content of: <p>
-#: src/lessons/welcome/methods/picture/PictureMono.html:7
+#: src/lessons/welcome/methods/picture/PictureMono1.html:7
 #: src/lessons/welcome/methods/picture/MethodsPicture.html:7
 msgid ""
 "Your goal (here and in any well written program) is to write the simplest "
@@ -5003,7 +5005,7 @@
 "passos e escrever métodos específicos para cada sub-passo."
 
 #. type: Content of: <p>
-#: src/lessons/welcome/methods/picture/PictureMono.html:11
+#: src/lessons/welcome/methods/picture/PictureMono1.html:11
 msgid ""
 "If you observe carefully the picture to draw, it is constituted of four "
 "parts depicting a sort of V. A possible decomposition is to write a method "
@@ -5016,7 +5018,7 @@
 "Seu protótipo pode ser: <code>[!java|c]void [/!]fazerV()</code>"
 
 #. type: Content of: <p>
-#: src/lessons/welcome/methods/picture/PictureMono.html:16
+#: src/lessons/welcome/methods/picture/PictureMono1.html:16
 msgid ""
 "In this method, you should use the methods <code>brushUp()</code> and "
 "<code>brushDown()</code> to mark the ground (you may want to factorize this "
@@ -5030,7 +5032,7 @@
 "para o próximo V."
 
 #. type: Content of: <p>
-#: src/lessons/welcome/methods/picture/PictureMono.html:21
+#: src/lessons/welcome/methods/picture/PictureMono1.html:21
 msgid ""
 "Your turn. Your code should not be longer than 4 lines (not counting "
 "<code>makeV</code>)..."
@@ -5740,7 +5742,6 @@
 
 #. type: Content of: <p>
 #: src/lessons/welcome/methods/picture/PatternPicture.html:11
-#: src/lessons/lander/lvl1_lander_101/Lander101.html:41
 msgid "Good luck!"
 msgstr "Boa Sorte!"
 
@@ -7049,7 +7050,8 @@
 #. type: Content of: <p>
 #: src/lessons/welcome/traversal/Snake.html:17
 msgid "We reached the final position if and only if both conditions are true:"
-msgstr "Chegamos na posição final se e apenas se ambas as condições são verdadeiras:"
+msgstr ""
+"Chegamos na posição final se e apenas se ambas as condições são verdadeiras:"
 
 #. type: Content of: <ul><li>
 #: src/lessons/welcome/traversal/Snake.html:19
@@ -7103,10 +7105,16 @@
 
 #. type: Content of: <p>
 #: src/lessons/welcome/traversal/Snake.html:33
+#, fuzzy
+#| msgid ""
+#| "Hint: the main loop of your code must continue while the testing function "
+#| "returns false. Their is thus two way of writing it:"
 msgid ""
 "Hint: the main loop of your code must continue while the testing function "
-"returns false. Their is thus two way of writing it:"
-msgstr "Dica: o loop principal do seu código deve continuar enquanto a função de teste retorna falso. Existe portanto entretanto duas formas de fazer isto:"
+"returns false. There is two ways of writing it:"
+msgstr ""
+"Dica: o loop principal do seu código deve continuar enquanto a função de "
+"teste retorna falso. Existe portanto entretanto duas formas de fazer isto:"
 
 #. type: Content of: <pre>
 #: src/lessons/welcome/traversal/Snake.html:35
@@ -7237,6 +7245,11 @@
 "by one at each step (for example with <code>counter += 1;</code>).  Then, "
 "you have to use <code>writeMessage()</code> to write the value on the ground."
 msgstr ""
+"Agora é hora de escrever os números das células. Para isto, você vai\n"
+"precisar de um contador iniciando em zero no começo do seu código, e\n"
+"incrementar de um em cada passo (por exemplo com <code>counter +=\n"
+"1;</code>).  Então, você terá que usar <code>escreverMensagem()</code>\n"
+"para escrever o valor no chão."
 
 #. type: Content of: <p>
 #: src/lessons/welcome/traversal/column/TraversalByColumn.html:45
@@ -7245,6 +7258,10 @@
 "the main loop [!java|scala|c], depending on whether you prefer to use a "
 "<code>while</code> or a <code>do/while</code> one[/!]."
 msgstr ""
+"Você provavelmente vai precisar escrever o primeiro [!java|scala|c]ou\n"
+"último [/!]valor fora do loop principal [!java|scala|c], dependendo se\n"
+"você prefere usar um <code>while</code> ou um\n"
+"<code>do/while</code>[/!]."
 
 #. type: Content of: outside any tag (error?)
 #: src/lessons/welcome/traversal/line/TraversalByLine.html:4
@@ -7256,6 +7273,14 @@
 "correctly updated: if you are at the right of a line, you have to go to the "
 "beginning of the next one. If not, you have to go to the right cell."
 msgstr ""
+"Mais uma vez você terá que deixar o buggle percorrer o mundo numerando\n"
+"as células no caminho, mas o objetivo do exercício é escrever uma\n"
+"linha transversal. A maioria do código que você escreveu para\n"
+"exercícios anteriores continua útil aqui. Simplesmente, o método\n"
+"calculando as coordenadas da próxima posição do buggle tem que ser\n"
+"atualizado corretamente: se você estiver a direita de uma linha, você\n"
+"terá que ir para o começo da próxima. Senão, você terá que ir para a\n"
+"célula da direita."
 
 #. type: Content of: <p>
 #: src/lessons/welcome/traversal/diagonal/TraversalDiagonal.html:4
@@ -7264,6 +7289,9 @@
 "Have a look at the objective world for more details on the requested "
 "traversal order."
 msgstr ""
+"Agora é para você atravessar o mundo uma diagonal depois da outra. Dê\n"
+"uma olhada no mundo objetivo para maiores detalhes quanto à ordem a\n"
+"percorrer pedida."
 
 #. type: Content of: <p>
 #: src/lessons/welcome/traversal/diagonal/TraversalDiagonal.html:8
@@ -7271,6 +7299,8 @@
 "You may find useful to use an integer variable <code>diag</code> storing the "
 "number of the diagonal you are traversing."
 msgstr ""
+"Pode ser útil usar uma variável inteira <code>diag</code> guardando o\n"
+"número da diagonal que você está atravessando."
 
 #. type: Content of: outside any tag (error?)
 #: src/lessons/welcome/traversal/zigzag/TraversalZigZag.html:4
@@ -7278,11 +7308,14 @@
 "This time, you have to zigzag on the way up. Have a look at the objective "
 "world for more details on the requested traversal order."
 msgstr ""
+"Desta vez, você vai ter que fazer um zigzag no caminho para cima. Dê\n"
+"uma olhada no mundo objetivo para mais detalhes da ordem a percorrer\n"
+"pedida."
 
 #. type: Content of: <h3>
 #: src/lessons/turmites/Main.html:2 src/lessons/turmites/short_desc.html:2
 msgid "The turmites"
-msgstr ""
+msgstr "Os turmites"
 
 #. type: Content of: <p>
 #: src/lessons/turmites/Main.html:4
@@ -7291,6 +7324,10 @@
 "machines. They constitute very simple application problems, achievable by "
 "beginners, and open the door to an amazing world."
 msgstr ""
+"Este conjunto de atividades é para você brincar com formigas de\n"
+"Langton, que são máquinas de Turing 2D. Elas constituem problemas bem\n"
+"simples, bons para iniciantes, e abrem as portas para um mundo\n"
+"fantástico."
 
 #. type: Content of: <p>
 #: src/lessons/turmites/Main.html:8
@@ -7302,6 +7339,14 @@
 "universal computation. Put simply, any possible computation can be achieved "
 "using a turmite as a computing device. Yet another subject of fascination..."
 msgstr ""
+"Este mecanismo foi inventado em 1986 por Chris Langton, e depois\n"
+"generalizado em várias formas (como veremos nos próximos\n"
+"exercícios). Foi provado que Turmites e máquinas de Turing têm o mesmo\n"
+"poder: Uma trajetória de formiga pode ser usada para calcular qualquer\n"
+"circuito booleano, e logo uma formiga é capaz de qualquer cálculo\n"
+"universal. resumindo, qualquer cálculo possível pode ser alcançado\n"
+"usando uma turmite como dispocitivo computacional. Ainda outro assunto\n"
+"fascinante..."
 
 #. type: Content of: <p>
 #: src/lessons/turmites/Main.html:14
@@ -7311,6 +7356,10 @@
 "identical letters (LL and RR) produce symmetric patterns. This fact was even "
 "formally proved."
 msgstr ""
+"formigas de Langton multicoloridas foram descobertas em 1995 por Propp\n"
+"et Al. Outro fato divertido é que as formigas cujos nomes é uma lista\n"
+"de pares consecutivos de letras idênticas (LL e RR) produzem padrões\n"
+"simétricos. Este fato foi até mesmo provado formalmente."
 
 #. type: Content of: <p>
 #: src/lessons/turmites/Main.html:19
@@ -7318,6 +7367,8 @@
 "Check the corresponding wikipedia web page, of which this exercise is "
 "inspired, for further details."
 msgstr ""
+"Verifique a página da wikipédia correspondente, na qual este exercício\n"
+"é inspirado, para maiores detalhes."
 
 #. type: Content of: <h3>
 #: src/lessons/turmites/Main.html:22 src/lessons/sort/basic/Main.html:15
@@ -7325,17 +7376,20 @@
 #: src/lessons/sort/pancake/Main.html:30
 #: src/lessons/sort/baseball/Main.html:28 src/lessons/turtleart/Main.html:12
 msgid "What can I do to improve this PLM universe?"
-msgstr ""
+msgstr "O que eu posso fazer para melhorar este universo do PLM?"
 
 #. type: Content of: <p>
 #: src/lessons/turmites/Main.html:24 src/lessons/sort/basic/Main.html:17
 #: src/lessons/sort/dutchflag/Main.html:11
 #: src/lessons/sort/pancake/Main.html:32
 #: src/lessons/sort/baseball/Main.html:30 src/lessons/turtleart/Main.html:14
+#: src/lessons/recursion/cons/Main.html:7
 msgid ""
 "As usual, there are several things that could be done in the code of this "
 "universe to improve it:"
 msgstr ""
+"Como sempre, existem várias coisas que podem ser feitas no código\n"
+"deste universo para melhorá-lo:"
 
 #. type: Content of: <ul><li>
 #: src/lessons/turmites/Main.html:26
@@ -7343,16 +7397,19 @@
 "We are probably missing some good exercises. The turmite creator exercise is "
 "a bit harsh: we could introduce the patterns in a more friendly manner."
 msgstr ""
+"Alguns bons exercícios estão provavelmente faltando. O exercício de\n"
+"criador de turmite é um pouco pé-duro: podemos introduzir os padrões\n"
+"de uma forma mais amigável."
 
 #. type: Content of: <ul><li>
 #: src/lessons/turmites/Main.html:28
 msgid "We may want to write an exercise on the busy beaver, maybe?"
-msgstr ""
+msgstr "Quem sabe não escrevemos um exercício sobre os busy beavers?"
 
 #. type: Content of: <p>
 #: src/lessons/turmites/short_desc.html:3
 msgid "Discover the Langton's ants, that are 2D turing machines."
-msgstr ""
+msgstr "Descubra as formigas de Langton, que são máquinas de Turing 2D."
 
 #. type: Content of: <p>
 #: src/lessons/turmites/short_desc.html:5
@@ -7360,11 +7417,13 @@
 "These activities are very simple application problems, achievable by "
 "beginners, and open the door to an amazing world."
 msgstr ""
+"Estas atividades são problemas bem simples, bons para iniciantes, e\n"
+"abrema a porta para um mundo fantástico."
 
 #. type: Content of: <h2>
 #: src/lessons/turmites/langton/Langton.html:2
 msgid "Langton's ant"
-msgstr ""
+msgstr "formiga de Langton"
 
 #. type: Content of: <p>
 #: src/lessons/turmites/langton/Langton.html:4
@@ -7374,6 +7433,11 @@
 "simple rules that depend only on their local environment, and after a period "
 "of apparent chaotic behavior, a general pattern <i>emerges</i>."
 msgstr ""
+"Neste exercício, você vai transformar seu buggle numa <i>formiga de\n"
+"Langton</i>. Estes pequenos animais artificiais são bastante\n"
+"interessantes por que eles recebem regras simples que dependem apenas\n"
+"do seu ambiente local, e depois de um período de aparente\n"
+"comportamento caótico, um padrão geral <i>surge</i>."
 
 #. type: Content of: <p>
 #: src/lessons/turmites/langton/Langton.html:9
@@ -7384,6 +7448,11 @@
 "right and move forward by one cell. If the ground is currently black, change "
 "it to white, turn left and move forward by one cell."
 msgstr ""
+"As regras são absolutamente triviais: para calcular qual o próximo\n"
+"passo, você verifica a cor atual do chão (usando\n"
+"<code>getGroundColor()</code>). Se for branco, mude para preto, vire à\n"
+"direita e mova uma célula. Se for preto mude para branco, vire a\n"
+"esquerda e ande uma célula."
 
 #. type: Content of: <p>
 #: src/lessons/turmites/langton/Langton.html:15
@@ -7403,6 +7472,9 @@
 "are not scalar values but objects. Instead, you need to write something like "
 "the following:"
 msgstr ""
+"Para comparar cores, você não pode usar o símbolo de igualdade (==),\n"
+"pois estas coisas não são valores escalares, mas objetos. Ao invés\n"
+"disto, você precisa escrever algo como o seguinte:"
 
 #. type: Content of: <pre>
 #: src/lessons/turmites/langton/Langton.html:25
@@ -7415,6 +7487,12 @@
 "  /* that was not equal */\n"
 "}\n"
 msgstr ""
+"Cor c /* = alguma inicialização */;\n"
+"if (c.equals(Cor.preto)) {\n"
+"  /* é igual */\n"
+"} else {\n"
+"  /* não é igual */\n"
+"}\n"
 
 #. type: Content of: <p>
 #: src/lessons/turmites/langton/Langton.html:34
@@ -7444,11 +7522,17 @@
 "from the chaos is rather fascinating, isn't it? Move on to the next exercise "
 "to see more of them."
 msgstr ""
+"Como você pode ver da execução deste exercício, o interessante neste\n"
+"algoritmo é que depois de uns 10000 passos de comportamento\n"
+"relativamente caótico, a formiga começa a construir um padrão\n"
+"regular. O surgimento deste padrão regular em meio ao caos é bastante\n"
+"fascinante, não acha? Mova para o próximo exercício para ver mais\n"
+"disto."
 
 #. type: Content of: <h2>
 #: src/lessons/turmites/langtoncolors/LangtonColors.html:2
 msgid "Multicolor Langton's ant"
-msgstr ""
+msgstr "formiga de Langton multicolorida"
 
 #. type: Content of: <p>
 #: src/lessons/turmites/langtoncolors/LangtonColors.html:4
@@ -7472,6 +7556,11 @@
 "a square, LLRRRLRLRLLR draws a convoluted regular pattern after a period of "
 "seemingly chaotic behavior, and RRLLLRLLLRRR seems to fill a hour glass..."
 msgstr ""
+"Algumas destas formigas desenham padrões fascinantes (alterne o mundo\n"
+"para vê-los): LLRR constrói uma figura simétrica semelhante a uma\n"
+"bola, LRRRRRLLR desenha um quadrado, LLRRRLRLRLLR desenha um padrão\n"
+"regular convolucionado depois de um período de aparente caos, e\n"
+"RRLLLRLLLRRR parece preencher uma ampulheta..."
 
 #. type: Content of: <p>
 #: src/lessons/turmites/langtoncolors/LangtonColors.html:18
@@ -7487,16 +7576,28 @@
 "'L')</code> and <code>Array(Color.white, Color.black)</code>[/!] as "
 "arguments."
 msgstr ""
+"Transformar seu buggle numa formiga de Langton genérica não é muito\n"
+"complicado, embora não seja totalmente trivial. Como anteriormente,\n"
+"você tem que escrever uma função <code>step</code>. Mas desta vez, ela\n"
+"recebe duas arrays como parâmetros. A primeira define as regras para\n"
+"seguir dependendo da cor do chão enquanto a segunda dá a sequência de\n"
+"cores a usar. Por exemplo, a formiga básica deve ter\n"
+"[!java]<code>{'R', 'L'}</code> e <code>{Cor.branco,\n"
+"Cor.preto}</code>[/!] [!python]<code>['R', 'L']</code> e\n"
+"<code>[Cor.branco, Cor.preto]</code>[/!] [!scala]<code>Array('R',\n"
+"'L')</code> e <code>Array(Cor.branco, Cor.preto)</code>[/!] como\n"
+"argumentos."
 
 #. type: Content of: <p>
 #: src/lessons/turmites/langtoncolors/LangtonColors.html:29
 msgid "At each step, you thus have to apply the following pseudo-code:"
 msgstr ""
+"Em cada passo, você deve então ter que aplicar o seguinte pseudo-código:"
 
 #. type: Content of: <ul><li>
 #: src/lessons/turmites/langtoncolors/LangtonColors.html:31
 msgid "Find the position of the ground color in the color sequence;"
-msgstr ""
+msgstr "Encontre a posição da cor do chão na sequência de cores;"
 
 #. type: Content of: <ul><li>
 #: src/lessons/turmites/langtoncolors/LangtonColors.html:32
@@ -7504,6 +7605,8 @@
 "Turn left or right depending on the content of the rule array at that "
 "position;"
 msgstr ""
+"Vire a esquerda ou direita dependendo do conteúdo da array de regras\n"
+"nesta posição;"
 
 #. type: Content of: <ul><li>
 #: src/lessons/turmites/langtoncolors/LangtonColors.html:33
@@ -7515,18 +7618,18 @@
 #. type: Content of: <ul><li>
 #: src/lessons/turmites/langtoncolors/LangtonColors.html:34
 msgid "Move forward by one step."
-msgstr ""
+msgstr "ande um passo para frente."
 
 #. type: Content of: <p>
 #: src/lessons/turmites/langtoncolors/LangtonColors.html:37
 #: src/lessons/turmites/helloturmite/HelloTurmite.html:67
 msgid "You now should have enough information to succeed."
-msgstr ""
+msgstr "Você agora tem informação o suficiente para conseguir."
 
 #. type: Content of: <h2>
 #: src/lessons/turmites/helloturmite/HelloTurmite.html:2
 msgid "Turmites"
-msgstr ""
+msgstr "Turmites"
 
 #. type: Content of: <p>
 #: src/lessons/turmites/helloturmite/HelloTurmite.html:4
@@ -7681,7 +7784,7 @@
 #: src/lessons/turmites/turmitecreator/TurmiteCreator.html:42
 #: src/lessons/turmites/turmitecreator/TurmiteCreator.html:43
 msgid "0"
-msgstr ""
+msgstr "0"
 
 #. type: Content of: <table><tr><td>
 #: src/lessons/turmites/turmitecreator/TurmiteCreator.html:15
@@ -7691,7 +7794,7 @@
 #: src/lessons/turmites/turmitecreator/TurmiteCreator.html:38
 #: src/lessons/turmites/turmitecreator/TurmiteCreator.html:45
 msgid "1"
-msgstr ""
+msgstr "1"
 
 #. type: Content of: <table><tr><th>
 #: src/lessons/turmites/turmitecreator/TurmiteCreator.html:19
@@ -8210,7 +8313,7 @@
 #. type: Content of: <h3>
 #: src/lessons/sort/basic/Main.html:2 src/lessons/sort/basic/short_desc.html:2
 msgid "Sorting Algorithms"
-msgstr ""
+msgstr "Algoritmos de Ordenação"
 
 #. type: Content of: outside any tag (error?)
 #: src/lessons/sort/basic/Main.html:4
@@ -8222,6 +8325,13 @@
 "\"races\" between these algorithms to experiment in practice what the "
 "different asymptotical complexity mean."
 msgstr ""
+"Esta lição permite a experimentação com alguns algoritmos de ordenação\n"
+"clássicos (e algumas variações menos comuns deles). E temos um duplo\n"
+"objetivo: você pode primeiro compreender melhor a ideia destes\n"
+"algoritmos escrevendo eles por si só. Mas mesmo se você não codificar\n"
+"os algoritmos, você pode usar o modo de demonstração para organizar\n"
+"\"corridas\" entre os algoritmos para experimentar na prática o que\n"
+"significam diferentes complexidades assintóticas."
 
 #. type: Content of: <p>
 #: src/lessons/sort/basic/Main.html:11
@@ -8230,6 +8340,9 @@
 "(such as QuickSort and MergeSort) or using other microworlds to apply these "
 "algorithms to other contexts."
 msgstr ""
+"Mais exercícios estão previstos para o futuro, sobre os algoritmos de\n"
+"ordenação recursivos (como o QuickSort e o MergeSort) ou usando outros\n"
+"micromundos para aplicar estes algoritmos a outros contextos."
 
 #. type: Content of: <ul><li>
 #: src/lessons/sort/basic/Main.html:19
@@ -8237,6 +8350,8 @@
 "Other graphical representations could be proposed, such as the ones "
 "presented at <a href=\"http://sorting.at/\">http://sorting.at/</a>."
 msgstr ""
+"Outras representações gráficas podem ser propostas, como aquelas\n"
+"apresentadas em <a href=\"http://sorting.at/\">http://sorting.at/</a>."
 
 #. type: Content of: <p>
 #: src/lessons/sort/basic/short_desc.html:4
@@ -8244,18 +8359,20 @@
 "This lesson allows to experiment with some classical sorting algorithms (and "
 "some less common variant of them :)"
 msgstr ""
+"Esta lição permite a experimentação com alguns algotimos de ordenação\n"
+"clássicos (e algumas variantes menos comuns deles :)"
 
 #. type: Content of: <p>
 #: src/lessons/sort/basic/short_desc.html:7
 #: src/lessons/recursion/short_desc.html:6 src/lessons/maze/short_desc.html:6
 msgid ""
 "You are supposed to master the bases of programming to take this lesson."
-msgstr ""
+msgstr "Para fazer esta lição você deve dominar as bases da programação."
 
 #. type: Content of: <h1>
 #: src/lessons/sort/basic/bubble/AlgBubbleSort1.html:2
 msgid "BubbleSort"
-msgstr ""
+msgstr "BubbleSort"
 
 #. type: Content of: <p>
 #: src/lessons/sort/basic/bubble/AlgBubbleSort1.html:4
@@ -8265,6 +8382,10 @@
 "algorithms is available in the world reference documentation (\"Help\"-&gt;"
 "\"About this world\")."
 msgstr ""
+"Bem vindo ao universo da ordenação. Ele permite que você experimente\n"
+"os algoritmos de ordenação existentes. A lista de \"buildins\" que você\n"
+"pode usar nos seus algoritmos está disponível na documentação de\n"
+"referência do mundo (\"Ajuda\"-&gt;\"Sobre este mundo\")."
 
 #. type: Content of: <p>
 #: src/lessons/sort/basic/bubble/AlgBubbleSort1.html:8
@@ -8274,6 +8395,11 @@
 "checking that your algorithm needs the same amount of read and write "
 "operations to sort the array."
 msgstr ""
+"Não é suficiente ordenar a array para passar nos exercícios. Sua\n"
+"solução deve seguir estritamente o comportamento esperado em cada\n"
+"exercício. Isto é reforçado verificando que seu algoritmo precisa da\n"
+"mesma quantidade de operações de escrita e leitura para ordenar a\n"
+"array."
 
 #. type: Content of: <p>
 #: src/lessons/sort/basic/bubble/AlgBubbleSort1.html:13
@@ -8437,6 +8563,12 @@
 "thus traditionally referred to as \"rabbits\" and \"turtles\" respectively "
 "for big fast values and small slow ones."
 msgstr ""
+"Para melhorar ainda mais o algoritmo BubbleSort, precisamos ver seu\n"
+"comportamente bem de perto. Você pode perceber que os elementos\n"
+"grandes se movem bem rápido enquanto os pequenos se movem lentamente\n"
+"para seus destinos. Eles são então tradicionalmente chamados de\n"
+"\"coelhos\" e \"tartarugas\" respectivamente para valores grandes e\n"
+"rápidos e valores pequenos e lentos."
 
 #. type: Content of: <p>
 #: src/lessons/sort/basic/cocktail/AlgCocktailSort1.html:10
@@ -8444,6 +8576,9 @@
 "To help the turtles moving faster, the cocktail sort traverse alternatively "
 "the array from right to left and from left to right. Here is the pseudo-code:"
 msgstr ""
+"Para ajudar as tartarugas a se mover rápido, o cocktail sort percorre\n"
+"alternativamente a array da direita para a esquerda e da esquerda para\n"
+"a direita. Aqui está o pseudo-código:"
 
 #. type: Content of: <pre>
 #: src/lessons/sort/basic/cocktail/AlgCocktailSort1.html:15
@@ -8468,7 +8603,7 @@
 #. type: Content of: <h1>
 #: src/lessons/sort/basic/cocktail/AlgCocktailSort2.html:2
 msgid "CocktailSort (take 2)"
-msgstr ""
+msgstr "CocktailSort (take 2)"
 
 #. type: Content of: <p>
 #: src/lessons/sort/basic/cocktail/AlgCocktailSort2.html:4
@@ -8478,6 +8613,10 @@
 "sorted yet, and traverse it alternatively from left to right and from right "
 "to left:"
 msgstr ""
+"Vamos agora aplicar ao CocktailSort a mesma otimização que o\n"
+"BubbleSort2 faz no BubbleSort. Devemos lembrar que os limites da parte\n"
+"do array que não está ordenada ainda, e percorrer ela alternativamente\n"
+"da esquerda para a direita e da diretia para a esquerda:"
 
 #. type: Content of: <pre>
 #: src/lessons/sort/basic/cocktail/AlgCocktailSort2.html:9
@@ -8497,7 +8636,7 @@
 #. type: Content of: <h1>
 #: src/lessons/sort/basic/cocktail/AlgCocktailSort3.html:2
 msgid "CocktailSort (take 3)"
-msgstr ""
+msgstr "CocktailSort (3o tempo)"
 
 #. type: Content of: <p>
 #: src/lessons/sort/basic/cocktail/AlgCocktailSort3.html:4
@@ -8509,11 +8648,17 @@
 "can stop if the upward traversal found something to swap, but not the "
 "downwards one."
 msgstr ""
+"Mesmo se a complexidade assintótica de CocktailSort2 for a mesma do\n"
+"BubbleSort, Ele parece melhor na prática. É até mesmo possível\n"
+"melhorar um pouco mais parando ele na primeira rodada que não\n"
+"encontrar nada para trocar, se realizar a rodada para baixo. Da mesma\n"
+"forma, podemos parar se a rodade para cima encontrar algo para trocar\n"
+"mas a rodada para baixo não."
 
 #. type: Content of: <h1>
 #: src/lessons/sort/basic/insertion/AlgInsertionSort.html:2
 msgid "InsertionSort"
-msgstr ""
+msgstr "InsertionSort"
 
 #. type: Content of: <p>
 #: src/lessons/sort/basic/insertion/AlgInsertionSort.html:5
@@ -8523,6 +8668,11 @@
 "it is more efficient in practice (linear in best case, ie when the array is "
 "already sorted, and N2/4 on average)."
 msgstr ""
+"Este algoritmo de ordenação é muito simples de entender e escrever,\n"
+"mesmo se não for o mais eficiente possível. Sua complexidade\n"
+"assintótica é O(n2), mas ele é mais eficiente na prática (linear no\n"
+"melhor caso, ie quando a array já está ordenada, e N2/4 no caso\n"
+"médio)."
 
 #. type: Content of: <p>
 #: src/lessons/sort/basic/insertion/AlgInsertionSort.html:10
@@ -8533,16 +8683,21 @@
 "left of the array are already sorted, and we have to insert x at its "
 "position in the array."
 msgstr ""
+"A ideia é percorrer todos os elementos da array, e inserir cada um\n"
+"deles em sua posição correta numa parte já ordenada da array. Quando\n"
+"nós olhamos para um elemento x, a situação é a seguinte: qualquer\n"
+"elemento da esquerda da array já está ordenado, e temos que inserir x\n"
+"na sua posição na array."
 
 #. type: Content of: <p>
 #: src/lessons/sort/basic/insertion/AlgInsertionSort.html:18
 msgid "Once this is done, the situation is the following:"
-msgstr ""
+msgstr "Uma vez isto feito, a situação é a seguinte:"
 
 #. type: Content of: <p>
 #: src/lessons/sort/basic/insertion/AlgInsertionSort.html:22
 msgid "The pseudo-code of this algorithm is thus the following:"
-msgstr ""
+msgstr "O pseudo-código deste algoritmo é então o seguinte:"
 
 #. type: Content of: <pre>
 #: src/lessons/sort/basic/insertion/AlgInsertionSort.html:23
@@ -8564,6 +8719,9 @@
 "Naturally, you should use a loop to write the big permutation within the "
 "given loop. Writing it this way would be really ... counter-productive."
 msgstr ""
+"Naturalmente, você deve usar um loop para escrever a grande permutação\n"
+"dentro do loop. Escrever ela desta forma deve ser na verdade\n"
+"... improdutivo."
 
 #. type: Content of: <p>
 #: src/lessons/sort/basic/insertion/AlgInsertionSort.html:36
@@ -8572,11 +8730,15 @@
 "here is part of the answer: They improve fundamental algorithms so that "
 "others can write efficient programs."
 msgstr ""
+"Se você já se perguntou o que cientistas da computação fazem nos dias\n"
+"de hoje, aqui está uma parte da resposta: Eles melhoram algoritmos\n"
+"fundamentais para que outras pessoas possam escrever programas\n"
+"eficientes."
 
 #. type: Content of: <h2>
 #: src/lessons/sort/basic/insertion/AlgInsertionSort.html:40
 msgid "Other variation of insertion sort"
-msgstr ""
+msgstr "Outra variação do insertion sort"
 
 #. type: Content of: <p>
 #: src/lessons/sort/basic/insertion/AlgInsertionSort.html:42
@@ -8586,6 +8748,11 @@
 "algorithm here since understanding its behavior requires to know what a "
 "binary tree is, what is beyond our present goals."
 msgstr ""
+"TreeSort constrói uma árvore de busca binária para ordená-la. Ele\n"
+"consegue O(n log(n)) no caso médio, mas O(n^2) nos piores casos. Não\n"
+"vamos estudar este algoritmo aqui pois para entendê-lo temos que\n"
+"entender o que uma árvore binária é, o que está além de nossos\n"
+"objetivos atuais."
 
 #. type: Content of: <p>
 #: src/lessons/sort/basic/insertion/AlgInsertionSort.html:47
@@ -8597,6 +8764,12 @@
 "since it provide a time complexity of O(n log(n)) but needs to store some "
 "more data."
 msgstr ""
+"Existem variações do insertion sort, tais como o PatienceSort que\n"
+"constrói pilhas de valores e ordena cada pilha depois. Este algoritmo\n"
+"apresenta um tempo 0(n log(n)) no pior caso e uma complexidade de\n"
+"espaço de 0(n). LibrarySort (proposto em 2004) também troca um pouco\n"
+"de espaço por tempo já que tem uma complexidade de tempo de O(n\n"
+"log(n)) mas precisa armazenar um pouco mais de dados."
 
 #. type: Content of: <p>
 #: src/lessons/sort/basic/insertion/AlgInsertionSort.html:54
@@ -8604,14 +8777,28 @@
 "Wikipedia provides a detailled description of all these algorithms we cannot "
 "present here because of time constraints."
 msgstr ""
+"A Wikipédia fornece uma descrição detalhada de cada um destes\n"
+"algoritmos que não apresentamos aqui devido a limitações de tempo."
 
 #. type: Content of: <h2>
 #: src/lessons/sort/basic/shell/AlgShellSort.html:2
 msgid "ShellSort"
-msgstr ""
+msgstr "ShellSort"
 
 #. type: Content of: outside any tag (error?)
 #: src/lessons/sort/basic/shell/AlgShellSort.html:4
+#, fuzzy
+#| msgid ""
+#| "This algorithm is named after its author, Donald Shell, who published it "
+#| "in 1959. It can be seen as an application of the CombSort idea (let "
+#| "elements having a long path to travel take shortcuts) to the insertion "
+#| "sort (CombSort is a variation of BubbleSort). Instead of comparing "
+#| "adjacent values during the insertion sort, it compares values separated "
+#| "by a bigger gap. The bigger the gap, the faster the elements are moved to "
+#| "their final destination, but also the less precise is this move. It is "
+#| "thus mandatory to apply the algorithm with a serie of decreasing gaps. At "
+#| "the last step, when the gap is 1, InsertionSort is used, but onto an "
+#| "array which is almost already sorted by previous steps."
 msgid ""
 "This algorithm is named after its author, Donald Shell, who published it in "
 "1959. It can be seen as an application of the CombSort idea (let elements "
@@ -8621,9 +8808,21 @@
 "the gap, the faster the elements are moved to their final destination, but "
 "also the less precise is this move. It is thus mandatory to apply the "
 "algorithm with a serie of decreasing gaps. At the last step, when the gap is "
-"1, InsertionSort is used, but onto an array which is almost already sorted "
+"one, InsertionSort is used, but onto an array which is almost already sorted "
 "by previous steps."
 msgstr ""
+"Este algoritmo é batizado em homenagem a seu autor, Donald Shell, que\n"
+"o publicou em 1959. Ele pode ser visto como uma aplicação da ideia do\n"
+"CombSort (faça com que elementos que tem um longo caminho pegarem\n"
+"atalhos) ao insertion sort (CombSort é uma variação do BubbleSort). Ao\n"
+"invés de comparar valores adjacentes durante o insertion sort, ele\n"
+"compara valores separados por um intervalo maior. Quanto maior o\n"
+"intervalo, mais rápido os elementos se movem para seu destino final,\n"
+"mas também menos preciso fica o movimento. É portanto essencial que o\n"
+"algoritmo vá sendo aplicado numa série de intervalos cada vez\n"
+"menor. No último passo, quando o intervalo for 1, o InsertionSort será\n"
+"usado, mas numa array que estará praticamente ordenada pelos passos\n"
+"anteriores."
 
 #. type: Content of: <p>
 #: src/lessons/sort/basic/shell/AlgShellSort.html:15
@@ -8631,6 +8830,9 @@
 "Donald Shell propose <code>len/2</code> as initial value of the gap, and "
 "then to divide it by 2 at each step. The pseudo-code is thus the following:"
 msgstr ""
+"Donald Shell propôs <code>len/2</code> como o valor inicial do\n"
+"intervalo, e ir dividindo por 2 a cada passo. O pseudo-código é o\n"
+"seguinte:"
 
 #. type: Content of: <p><pre>
 #: src/lessons/sort/basic/shell/AlgShellSort.html:18
@@ -8654,6 +8856,16 @@
 "ShellSort is a valid candidate for array of several hundred thousands when "
 "correctly implemented."
 msgstr ""
+"Assim como no CombSort, a sequência de valores pega pelo intervalo é\n"
+"crucial para a performance do Shell sort. Em alguns casos patológicos\n"
+"raros, a sequência que usamos pode levar a uma performance\n"
+"O(n^2). Outras sequências foram propostas: os incrementos de Hibbard\n"
+"de 2k − 1 levam a uma complexidade de O(n^(3/2)) em casos\n"
+"ruins. incrementos de Pratt 2^i3^j levam a uma performance de\n"
+"O(nlog(n)log(n) nos piores casos. A existência de uma sequência\n"
+"levando a O(n log(n)) foi excluída por Poonen, Plaxton e Suel. Graças\n"
+"a esta performance, ShellSort é um candidato válido para arrays de\n"
+"várias centenas de milhares quando corretamente implementado."
 
 #. type: Content of: <p><p>
 #: src/lessons/sort/basic/shell/AlgShellSort.html:33
@@ -8663,6 +8875,10 @@
 "targeted serie still smaller than the array size, and then use decreasing "
 "values of the serie."
 msgstr ""
+"No nosso caso, a array é pequena demais para se beneficiar destas\n"
+"otimizações. Se você ainda assim quiser, tome o intervalo inicial como\n"
+"o maior valor da série alvo ainda menor que o tamanho do array, e\n"
+"então use valores decrescentes da série."
 
 #. type: Content of: <p><p>
 #: src/lessons/sort/basic/shell/AlgShellSort.html:38
@@ -8675,11 +8891,19 @@
 "International Symposium on Fundamentals of Computation Theory, LNCS 2001; "
 "Vol. 2138)."
 msgstr ""
+"Determinar a melhor sequência de intervalos para o shell sort se\n"
+"tornou um tema de pesquisa de nosso século em ciência da\n"
+"computação. Por exemplo, um artigo de 2001 introduz a seguinte\n"
+"sequência, que parece ser a melhor na prática para arrays de tamanho\n"
+"até 10^5: {1, 4, 10, 23, 57, 132, 301, 701, 1750} (Marcin Ciura, Best\n"
+"Increments for the Average Case of Shellsort, 13th International\n"
+"Symposium on Fundamentals of Computation Theory, LNCS 2001;\n"
+"Vol. 2138)."
 
 #. type: Content of: <h1>
 #: src/lessons/sort/basic/selection/AlgSelectionSort.html:2
 msgid "Selection Sort"
-msgstr ""
+msgstr "Selection Sort"
 
 #. type: Content of: outside any tag (error?)
 #: src/lessons/sort/basic/selection/AlgSelectionSort.html:4
@@ -8687,42 +8911,69 @@
 "In this exercise we will implement another classical algorithm: selection "
 "sort."
 msgstr ""
+"Neste exercício vamos implementar outro algoritmo clássico: selection sort."
 
 #. type: Content of: <p>
 #: src/lessons/sort/basic/selection/AlgSelectionSort.html:7
+#, fuzzy
+#| msgid ""
+#| "The idea is simply to select for each cell of the array the smallest "
+#| "value from the part not already sorted. Thus for the first cell, it takes "
+#| "the smallest value over the whole array. For the second one, it takes the "
+#| "second smallest value, which is the smallest value from the cell not "
+#| "already sorted."
 msgid ""
 "The idea is simply to select for each cell of the array the smallest value "
 "from the part not already sorted. Thus for the first cell, it takes the "
 "smallest value over the whole array. For the second one, it takes the second "
-"smallest value, which is the smallest value from the cell not already sorted."
-msgstr ""
+"smallest value, which is the smallest value from the cell not already "
+"sorted. You of course don't have to sort the last cell of the array, that is "
+"already sorted when you consider it."
+msgstr ""
+"A ideia é simplesmente selecionar para cada célula da array o menor\n"
+"valor da parte ainda não ordenada. Então para a primeira célula,\n"
+"pegamos o menor valor da array toda. Para a segunda, pegamos o segundo\n"
+"menor valor, que é o menor valor da célula ainda não ordenado."
 
 #. type: Content of: <p><p>
-#: src/lessons/sort/basic/selection/AlgSelectionSort.html:13
+#: src/lessons/sort/basic/selection/AlgSelectionSort.html:14
+#, fuzzy
+#| msgid ""
+#| "More generally, for the cell N, it looks the cell M in [n;len] containing "
+#| "the smallest possible value of the interval. Then, it swaps the content "
+#| "of cell N with the one of cell M."
 msgid ""
-"More generally, for the cell N, it looks the cell M in [n;len] containing "
+"More generally, for the cell N, it looks the cell M in [N;len] containing "
 "the smallest possible value of the interval. Then, it swaps the content of "
 "cell N with the one of cell M."
 msgstr ""
+"De forma mais geral, para a célula N, ele busca a célula M em [n;len]\n"
+"contendo o menor valor possível do intervalo. Então, troca o conteúdo\n"
+"da célula N com o da célula M."
 
 #. type: Content of: <p><p><h2>
-#: src/lessons/sort/basic/selection/AlgSelectionSort.html:17
+#: src/lessons/sort/basic/selection/AlgSelectionSort.html:18
 msgid "Existing variations"
-msgstr ""
+msgstr "Variações existentes"
 
 #. type: Content of: <p><p>
-#: src/lessons/sort/basic/selection/AlgSelectionSort.html:18
+#: src/lessons/sort/basic/selection/AlgSelectionSort.html:19
 msgid ""
 "Another classical algorithm which idea is based on the selection of good "
 "elements is HeapSort, but it uses a heap data structure which we did not see "
 "yet. Simply remember that HeapSort provides a O(n log n) performance in "
 "worst case, which is why it is a very interesting algorithm in practice."
 msgstr ""
+"Outro algoritmo clássico cuja ideia é baseada na seleção de bons\n"
+"elementos é o HeapSort, mas ele usa uma estrutura de dados heap que\n"
+"ainda não vimos. Simplesmente lembre que o HeapSort fornece um\n"
+"desempenho O(n log n) no pior caso, que é o motivo para ele ser bem\n"
+"interessante na prática."
 
 #. type: Content of: <h1>
 #: src/lessons/sort/basic/comb/AlgCombSort.html:2
 msgid "CombSort"
-msgstr ""
+msgstr "CombSort"
 
 #. type: Content of: <p>
 #: src/lessons/sort/basic/comb/AlgCombSort.html:4
@@ -8759,7 +9010,7 @@
 #: src/lessons/maze/island/IslandMaze.html:67
 #: src/lessons/welcome/bat/bool1/Max1020.html:6
 msgid "[!scala]"
-msgstr ""
+msgstr "[!scala]"
 
 #. type: Content of: <p>
 #: src/lessons/sort/basic/comb/AlgCombSort.html:27
@@ -8771,12 +9022,19 @@
 "the operation, and then convert the result back to Int to store it into gap. "
 "This should be written this way:"
 msgstr ""
+"Um detalhe perigoso é que temos que dividir o intervalo, que é um\n"
+"inteiro (ou do tipo Int), por 1.3, que é um Double. O sistema de tipos\n"
+"do scala não nos deixa fazer isto, por que tal discrepância\n"
+"normalmente significa um erro de programação. Como isto não é um erro\n"
+"neste caso, vamos ter que converter o intervalo para Double para o\n"
+"momento da operação, e então converter o resultado de volta para Int\n"
+"para armazená-lo no intervalo. Isto deve ser escrito desta forma:"
 
 #. type: Content of: <pre>
 #: src/lessons/sort/basic/comb/AlgCombSort.html:31
 #, no-wrap
 msgid "gap = (gap.asInstanceOf[Double] / 1.3).asInstanceOf[Int]"
-msgstr ""
+msgstr "gap = (gap.asInstanceOf[Double] / 1.3).asInstanceOf[Int]"
 
 #. type: Content of: <p>
 #: src/lessons/sort/basic/comb/AlgCombSort.html:32
@@ -8787,12 +9045,18 @@
 "been a pain to debug if not catch by the type checker. And since the Scala's "
 "authors are pragmatic, the previous expression can be simplified:"
 msgstr ""
+"Isto é meio exagerado, mas na verdade, esta notação não é muito\n"
+"complexa. E lembre que o verificador de sintaxe é seu amigo. Ele às\n"
+"vezes é chato e irritante (como neste caso), mas frequentemente pega\n"
+"bugs esquisitos que seriam trabalhosos para depurar se não fosse o\n"
+"verificador de sintaxe. E como os autores do Scala são pragmáticos, a\n"
+"expressão anterior pode ser simplificada:"
 
 #. type: Content of: <pre>
 #: src/lessons/sort/basic/comb/AlgCombSort.html:36
 #, no-wrap
 msgid "gap = (gap.toDouble / 1.3).toInt"
-msgstr ""
+msgstr "gap = (gap.toDouble / 1.3).toInt"
 
 #. type: Content of: <p>
 #: src/lessons/sort/basic/comb/AlgCombSort.html:37
@@ -8801,6 +9065,10 @@
 "corresponding expressions <code>asInstanceOf[Double]</code> and "
 "<code>asInstanceOf[Int]</code>. It's not very generic, but it's very handy."
 msgstr ""
+"<code>toDouble</code> e <code>toInt</code> são apenas atalhos para as\n"
+"expressões correspondentes <code>asInstanceOf[Double]</code> e\n"
+"<code>asInstanceOf[Int]</code>. Não é muito genérico, mas é bem\n"
+"prático."
 
 #. type: Content of: <p>
 #: src/lessons/sort/basic/comb/AlgCombSort.html:41
@@ -8809,11 +9077,14 @@
 "rediscovered and popularized by Stephen Lacey and Richard Box, who described "
 "it in Byte Magazine in April 1991."
 msgstr ""
+"Este algoritmo foi inventanndo por Wlodek Dobosiewicz em 1980, e\n"
+"depois redescoberto e popularizado por Stephen Lacey e Richard Box,\n"
+"que o descreveram na Byte Magazine em Abril de 1991."
 
 #. type: Content of: <h1>
 #: src/lessons/sort/basic/comb/AlgCombSort11.html:2
 msgid "CombSort11"
-msgstr ""
+msgstr "CombSort11"
 
 #. type: Content of: <p>
 #: src/lessons/sort/basic/comb/AlgCombSort11.html:4
@@ -8824,11 +9095,16 @@
 "CombSort to ensure just after the gap update that if it is 9 or 10, we "
 "should use 11 instead."
 msgstr ""
+"Os autores deste algoritmo observaram que o desempenho é aumentado se\n"
+"nos certificarmos que os últimos valores do intervalo são (11, 8, 6,\n"
+"4, 3, 2, 1) ao invés de (9, 6, 4, 3, 2, 1) ou (10, 7, 5, 3, 2,\n"
+"1). Retrabalhar o código do CombSort para garantir apenas que depois\n"
+"da atualização do intervalo que se ele for 9 ou 10, devemos usar 11."
 
 #. type: Content of: <h1>
 #: src/lessons/sort/basic/gnome/AlgGnomeSort.html:2
 msgid "GnomeSort"
-msgstr ""
+msgstr "GnomeSort"
 
 #. type: Content of: <p>
 #: src/lessons/sort/basic/gnome/AlgGnomeSort.html:4
@@ -8838,6 +9114,11 @@
 "supposed behavior of garden gnomes when they sort flower pots. Here is a "
 "description of the algorithm by its author:"
 msgstr ""
+"O Gnome sort é similar ao insertion sort, mas os elementos são movidos\n"
+"de poisção por uma série de trocas que se parecem com o bubble sort. O\n"
+"nome veio do suposto comportamento que gnomos de jardim tem quando\n"
+"ordenam vasos de flores. Aqui está uma descrição do algoritmo por seu\n"
+"autor:"
 
 #. type: Content of: <p>
 #: src/lessons/sort/basic/gnome/AlgGnomeSort.html:9
@@ -8857,7 +9138,7 @@
 #: src/lessons/sort/dutchflag/DutchFlagAlgo.html:2
 #: src/lessons/sort/dutchflag/universe/DutchFlagWorld.html:2
 msgid "The Dutch Flag Problem"
-msgstr ""
+msgstr "O problema da bandeira holandesa"
 
 #. type: Content of: <p>
 #: src/lessons/sort/dutchflag/Main.html:4
@@ -8869,11 +9150,18 @@
 "complexity is not trivial, but not complex either.  It can easily be "
 "formally proven, but it's not absolutely trivial either."
 msgstr ""
+"Este problema foi proposto primeiro por E.W Dijkstra em 1976 (no\n"
+"capítulo 14 de seu livro \"A Discipline of Programming\"). É uma\n"
+"variação clássica de algoritmos de ordenação desde então. Ele é às\n"
+"vezes útil em vida real, mas se tornou famosos por suas propriedades\n"
+"pedagógicas: sua complexidade não é trivial, mas não é muito\n"
+"complexo. Pode ser provados formalmente com facilidade, mas não é de\n"
+"forma alguma trivial."
 
 #. type: Content of: <ul><li>
 #: src/lessons/sort/dutchflag/Main.html:13
 msgid "A temporal view could be welcomed."
-msgstr ""
+msgstr "Uma visão temporal pode ser bem-vinda."
 
 #. type: Content of: <ul><li>
 #: src/lessons/sort/dutchflag/Main.html:14
@@ -8881,6 +9169,8 @@
 "Other exercises, for example with 2 colors only or with more than 3 colors, "
 "could generalize the proposed approach."
 msgstr ""
+"Outros exercícios, por exemplo com 2 cores apenas ou com mais de 3\n"
+"cores, podem generalizar a abordagem proposta."
 
 #. type: Content of: <ul><li>
 #: src/lessons/sort/dutchflag/Main.html:15
@@ -8974,7 +9264,6 @@
 
 #. type: Content of: <h2>
 #: src/lessons/sort/dutchflag/universe/DutchFlagWorld.html:9
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:8
 msgid "Provided functions"
 msgstr ""
 
@@ -9227,7 +9516,7 @@
 msgid ""
 "Your work is to help this poor guy sorting his stack by flipping the "
 "pancakes. Each pancake is defined by its radius and rank within the stack, "
-"where the bottom pancake is at rank 0, and the one above at rank 1."
+"with the top-most pancake is at rank 0, and the one below at rank 1."
 msgstr ""
 
 #. type: Content of: <p>
@@ -10207,7 +10496,6 @@
 
 #. type: Content of: <pre>
 #: src/plm/universe/turtles/TurtleWorld.html:22
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:10
 #, no-wrap
 msgid ""
 "[!java|c]double [/!]getX()[!scala]:Double[/!]\n"
@@ -10465,6 +10753,439 @@
 msgstr ""
 
 #. type: Content of: <h1>
+#: src/lessons/recursion/cons/universe/ConsWorld.html:2
+#, fuzzy
+#| msgid "Sorting World"
+msgid "ConsWorld"
+msgstr "Mundo da ordenação"
+
+#. type: Content of: <p>
+#: src/lessons/recursion/cons/universe/ConsWorld.html:4
+msgid ""
+"This world allows you to experiment with the recursive strings, as they were "
+"first defined in Lisp. It is very similar to the BatWorld, but you are "
+"supposed to write recursive functions working on [!python|java]recursive "
+"strings. Since [!thelang] does not provide such a construct natively, the "
+"ConsWorld defines recursive lists of type <code>RecList</code>.[/!] [!"
+"scala]lists of integers (<code>List[Int]</code>)."
+msgstr ""
+
+#. type: Content of: <p>
+#: src/lessons/recursion/cons/universe/ConsWorld.html:12
+msgid ""
+"Any given such list is either the empty list (noted <code>[!scala]Nil[/!][!"
+"java]null[/!][!python]None[/!]</code>), or an integer followed by a list. If "
+"a list is not empty, you can retrieve its first integer with <code>list."
+"head</code> and the list containing its other parameters with <code>list."
+"tail</code>. Of course, the empty list has no head nor the tail, so trying "
+"to access these elements will result in an (unpleasant) error message."
+msgstr ""
+
+#. type: Content of: <p>
+#: src/lessons/recursion/cons/universe/ConsWorld.html:20
+msgid ""
+"To build your own list, you need to concatenate a head and a tail as "
+"follows: [!java|python]<code>cons(head, tail)</code>[/!] [!scala]<code>head::"
+"tail</code> Note that <code>::</code> is a generic operator in Scala to "
+"build lists.[/!]"
+msgstr ""
+
+#. type: Content of: <p>
+#: src/lessons/recursion/cons/universe/ConsWorld.html:26
+msgid ""
+"So, in summary, you can solve every exercises of this lesson with the "
+"following constructs."
+msgstr ""
+
+#. type: Content of: <ul><li>
+#: src/lessons/recursion/cons/universe/ConsWorld.html:30
+msgid "<b>The empty string:</b>"
+msgstr ""
+
+#. type: Content of: <ul><li><pre>
+#: src/lessons/recursion/cons/universe/ConsWorld.html:30
+#, fuzzy, no-wrap
+#| msgid "[!java|c]'R'[/!][!scala|python]\"R\"[/!]"
+msgid "[!java]null[/!][!scala]Nil[/!][!python]None[/!]"
+msgstr "[!java|c]'R'[/!][!scala|python]\"R\"[/!]"
+
+#. type: Content of: <ul><li>
+#: src/lessons/recursion/cons/universe/ConsWorld.html:31
+msgid "<b>Get the first element of <code>l</code></b>"
+msgstr ""
+
+#. type: Content of: <ul><li><pre>
+#: src/lessons/recursion/cons/universe/ConsWorld.html:31
+#, no-wrap
+msgid "l.head"
+msgstr ""
+
+#. type: Content of: <ul><li>
+#: src/lessons/recursion/cons/universe/ConsWorld.html:32
+msgid "<b>Get the rest of the list</b>, when the first element is removed:"
+msgstr ""
+
+#. type: Content of: <ul><li><pre>
+#: src/lessons/recursion/cons/universe/ConsWorld.html:32
+#, no-wrap
+msgid "l.tail"
+msgstr ""
+
+#. type: Content of: <ul><li>
+#: src/lessons/recursion/cons/universe/ConsWorld.html:33
+msgid ""
+"<b>Build a list</b> from a <code>value</code> and a <code>list</code>: [!"
+"java|python]"
+msgstr ""
+
+#. type: Content of: <ul><li><pre>
+#: src/lessons/recursion/cons/universe/ConsWorld.html:34
+#, no-wrap
+msgid "cons(value, list)"
+msgstr ""
+
+#. type: Content of: <ul><li><pre>
+#: src/lessons/recursion/cons/universe/ConsWorld.html:35
+#, no-wrap
+msgid "value::list"
+msgstr ""
+
+#. type: Content of: <h1>
+#: src/lessons/recursion/cons/Main.html:2
+msgid "Recursive Lists"
+msgstr ""
+
+#. type: Content of: <p>
+#: src/lessons/recursion/cons/Main.html:3
+msgid ""
+"This lesson contains a bunch of classical exercises on recursive lists.  It "
+"is certainly not the most pleasant lesson to do, but I think that it is the "
+"easiest of the PLM lessons dealing with recursion."
+msgstr ""
+
+#. type: Content of: <ul><li>
+#: src/lessons/recursion/cons/Main.html:10
+msgid ""
+"New exercises could be proposed, such as http://webloria.loria.fr/~quinson/"
+"Teaching/TOP/02-td-recursivite-enonce.pdf If you know some others, please "
+"report them as an issue."
+msgstr ""
+
+#. type: Content of: <ul><li>
+#: src/lessons/recursion/cons/Main.html:13
+msgid ""
+"It would be interesting to check the asymptotic complexity of the student's "
+"code, but that does not sound easy to do. In Python and Java (where we "
+"provide a hand-made RecList class), we could count the amount of cons per "
+"exercise, but it won't be easy to relate this to the right BatTest. For "
+"Scala, it sounds even more difficult as we use the classical :: operators of "
+"the language. That will be difficult to override to add a counting "
+"mechanism. Another solution would be to ensure that the call stack does not "
+"pass a given threshold, but that sounds very difficult too. Any idea is "
+"welcome."
+msgstr ""
+
+#. type: Content of: <h1>
+#: src/lessons/recursion/cons/Length.html:2
+msgid "Length"
+msgstr ""
+
+#. type: Content of: outside any tag (error?)
+#: src/lessons/recursion/cons/Length.html:3
+msgid ""
+"Given a [!scala]List[Int][/!][!java|python]recursive list[/!], return its "
+"length[!scala] (without using its <code>size</code> method, of course)[/!]."
+msgstr ""
+
+#. type: Content of: <p>
+#: src/lessons/recursion/cons/Length.html:5
+#: src/lessons/recursion/cons/IsMember.html:7
+#: src/lessons/recursion/cons/Occurrence.html:7
+#: src/lessons/recursion/cons/Last.html:6
+#: src/lessons/recursion/cons/Min.html:6
+#: src/lessons/recursion/cons/Increasing.html:6
+#: src/lessons/recursion/cons/ButLast.html:6
+#: src/lessons/recursion/cons/PlusOne.html:5
+#: src/lessons/recursion/cons/Remove.html:8
+#: src/lessons/recursion/cons/ButNfirst.html:6
+msgid "Your solution should be linear in time."
+msgstr ""
+
+#. type: Content of: <h1>
+#: src/lessons/recursion/cons/IsMember.html:2
+msgid "IsMember"
+msgstr ""
+
+#. type: Content of: outside any tag (error?)
+#: src/lessons/recursion/cons/IsMember.html:3
+msgid ""
+"Given a [!scala]List[Int][/!][!java|python]recursive list[/!] and an "
+"integer, return true if the given integer is one of the elements of the "
+"list, or false if it cannot be found."
+msgstr ""
+
+#. type: Content of: <h1>
+#: src/lessons/recursion/cons/Occurrence.html:2
+#, fuzzy
+#| msgid "Occurrence of a value"
+msgid "Occurrences"
+msgstr "Ocorrência de um valor"
+
+#. type: Content of: outside any tag (error?)
+#: src/lessons/recursion/cons/Occurrence.html:3
+msgid ""
+"Given a [!scala]List[Int][/!][!java|python]recursive list[/!] and an "
+"integer, return the amount of occurrences of the given integer in the list. "
+"If the integer is not a member of the list, the function should thus return "
+"0."
+msgstr ""
+
+#. type: Content of: <h1>
+#: src/lessons/recursion/cons/Last.html:2
+msgid "Last"
+msgstr ""
+
+#. type: Content of: outside any tag (error?)
+#: src/lessons/recursion/cons/Last.html:3
+msgid ""
+"Given a [!scala]List[Int][/!][!java|python]recursive list[/!], return its "
+"last element.  You can assume that the list is not empty."
+msgstr ""
+
+#. type: Content of: <h1>
+#: src/lessons/recursion/cons/Min.html:2
+msgid "Min"
+msgstr ""
+
+#. type: Content of: outside any tag (error?)
+#: src/lessons/recursion/cons/Min.html:3
+msgid ""
+"Given a [!scala]List[Int][/!][!java|python]recursive list[/!], return the "
+"smallest of its values.  You will probably need an extra function, even if "
+"you can assume that the list is not empty."
+msgstr ""
+
+#. type: Content of: <h1>
+#: src/lessons/recursion/cons/Increasing.html:2
+msgid "Increasing"
+msgstr ""
+
+#. type: Content of: outside any tag (error?)
+#: src/lessons/recursion/cons/Increasing.html:3
+msgid ""
+"Given a [!scala]List[Int][/!][!java|python]recursive list[/!], return "
+"whether its elements form an increasing sequence (i.e., if the elements are "
+"sorted from the smallest to the largest one)."
+msgstr ""
+
+#. type: Content of: <h1>
+#: src/lessons/recursion/cons/ButLast.html:2
+msgid "But Last"
+msgstr ""
+
+#. type: Content of: outside any tag (error?)
+#: src/lessons/recursion/cons/ButLast.html:3
+msgid ""
+"Given a [!scala]List[Int][/!][!java|python]recursive list[/!], return the "
+"list containing every elements but the last one.  You can assume that the "
+"list is not empty."
+msgstr ""
+
+#. type: Content of: <h1>
+#: src/lessons/recursion/cons/PlusOne.html:2
+msgid "PlusOne"
+msgstr ""
+
+#. type: Content of: outside any tag (error?)
+#: src/lessons/recursion/cons/PlusOne.html:3
+msgid ""
+"Given a [!scala]List[Int][/!][!java|python]recursive list[/!], return a new "
+"list containing all elements of your parameter incremented by one."
+msgstr ""
+
+#. type: Content of: <h1>
+#: src/lessons/recursion/cons/Remove.html:2
+msgid "Remove"
+msgstr ""
+
+#. type: Content of: outside any tag (error?)
+#: src/lessons/recursion/cons/Remove.html:4
+msgid ""
+"Given a [!scala]List[Int][/!][!java|python]recursive list[/!] <code>L</"
+"code>and an integer, return a new list containing all elements of L that are "
+"not equal to the value received as parameter."
+msgstr ""
+
+#. type: Content of: <h1>
+#: src/lessons/recursion/cons/Nth.html:2
+msgid "Nth"
+msgstr ""
+
+#. type: Content of: outside any tag (error?)
+#: src/lessons/recursion/cons/Nth.html:3
+msgid ""
+"Given a [!scala]List[Int][/!][!java|python]recursive list[/!] and an integer "
+"<code>N</code>, return its <code>N</code>th element."
+msgstr ""
+
+#. type: Content of: <p>
+#: src/lessons/recursion/cons/Nth.html:6
+#: src/lessons/recursion/cons/Nfirst.html:7
+msgid ""
+"You can assume that the list is long enough, i.e. that there is at least "
+"<code>N</code> elements.  Your solution should be linear in time."
+msgstr ""
+
+#. type: Content of: <h1>
+#: src/lessons/recursion/cons/Nfirst.html:2
+msgid "Nfirst"
+msgstr ""
+
+#. type: Content of: outside any tag (error?)
+#: src/lessons/recursion/cons/Nfirst.html:3
+msgid ""
+"Given a [!scala]List[Int][/!][!java|python]recursive list[/!] and an integer "
+"<code>N</code>, return the list constituted of the first <code>N</code> "
+"elements. You can assume that the list is long enough, i.e. that there is at "
+"least <code>N</code> elements."
+msgstr ""
+
+#. type: Content of: <h1>
+#: src/lessons/recursion/cons/Nlast.html:2
+msgid "Nlast"
+msgstr ""
+
+#. type: Content of: outside any tag (error?)
+#: src/lessons/recursion/cons/Nlast.html:3
+msgid ""
+"Given a [!scala]List[Int][/!][!java|python]recursive list[/!] and an integer "
+"<code>N</code>, return the list with only the <code>N</code> last elements."
+msgstr ""
+
+#. type: Content of: <p>
+#: src/lessons/recursion/cons/Nlast.html:6
+#: src/lessons/recursion/cons/ButNlast.html:6
+msgid ""
+"Your solution should be linear in time, but you will probably need to define "
+"several functions to achieve that complexity."
+msgstr ""
+
+#. type: Attribute 'alt' of: <div>
+#: src/lessons/recursion/cons/Nlast.html:8
+#: src/lessons/recursion/cons/ButNlast.html:8
+#: src/lessons/recursion/cons/Reverse.html:8
+#: src/lessons/recursion/cons/Concat.html:8
+msgid "I cannot do it in linear time"
+msgstr ""
+
+#. type: Content of: <div>
+#: src/lessons/recursion/cons/Nlast.html:9
+#: src/lessons/recursion/cons/ButNlast.html:9
+msgid ""
+"The trick is to compute only once (and beforehand) how many elements you "
+"should keep."
+msgstr ""
+
+#. type: Content of: <h1>
+#: src/lessons/recursion/cons/ButNfirst.html:2
+msgid "But Nfirst"
+msgstr ""
+
+#. type: Content of: outside any tag (error?)
+#: src/lessons/recursion/cons/ButNfirst.html:3
+msgid ""
+"Given a [!scala]List[Int][/!][!java|python]recursive list[/!] and an integer "
+"<code>N</code>, return the list without the <code>N</code> first elements."
+msgstr ""
+
+#. type: Content of: <h1>
+#: src/lessons/recursion/cons/ButNlast.html:2
+msgid "But Nlast"
+msgstr ""
+
+#. type: Content of: outside any tag (error?)
+#: src/lessons/recursion/cons/ButNlast.html:3
+msgid ""
+"Given a [!scala]List[Int][/!][!java|python]recursive list[/!] and an integer "
+"<code>N</code>, return the list without the <code>N</code> last elements."
+msgstr ""
+
+#. type: Content of: <h1>
+#: src/lessons/recursion/cons/Reverse.html:2
+#, fuzzy
+#| msgid "Inverse"
+msgid "Reverse"
+msgstr "Inversa"
+
+#. type: Content of: outside any tag (error?)
+#: src/lessons/recursion/cons/Reverse.html:3
+msgid ""
+"Given a [!scala]List[Int][/!][!java|python]recursive list[/!], return a new "
+"list with all elements in reverse order."
+msgstr ""
+
+#. type: Content of: <p>
+#: src/lessons/recursion/cons/Reverse.html:5
+msgid ""
+"This function is very important and you should not pass that challenge.  "
+"Your solution should be linear in time, with the help of helper functions."
+msgstr ""
+
+#. type: Content of: <div>
+#: src/lessons/recursion/cons/Reverse.html:9
+msgid ""
+"You need an helper function in which the result is accumulated (built) at "
+"each step."
+msgstr ""
+
+#. type: Content of: <h1>
+#: src/lessons/recursion/cons/Concat.html:2
+msgid "Concat"
+msgstr ""
+
+#. type: Content of: outside any tag (error?)
+#: src/lessons/recursion/cons/Concat.html:3
+msgid ""
+"Given two [!scala]List[Int][/!][!java|python]recursive list[/!] <code>l1</"
+"code> and <code>l2</code>, return a new list with all elements of <code>l1</"
+"code> followed by the elements of <code>l2</code>."
+msgstr ""
+
+#. type: Content of: <p>
+#: src/lessons/recursion/cons/Concat.html:6
+msgid ""
+"Your solution should be linear in time, with the help of helper functions."
+msgstr ""
+
+#. type: Content of: <div>
+#: src/lessons/recursion/cons/Concat.html:9
+msgid ""
+"You need to modify <code>l1</code> beforehand so that the computations at "
+"each step of the recursion are in constant time."
+msgstr ""
+
+#. type: Content of: <h1>
+#: src/lessons/recursion/cons/AllDifferent.html:2
+msgid "All Different"
+msgstr ""
+
+#. type: Content of: outside any tag (error?)
+#: src/lessons/recursion/cons/AllDifferent.html:3
+msgid ""
+"Given a [!scala]List[Int][/!][!java|python]recursive list[/!], return true "
+"if any two elements of the list are different (ie, if no element appears "
+"more than once in the list)."
+msgstr ""
+
+#. type: Content of: <p>
+#: src/lessons/recursion/cons/AllDifferent.html:6
+msgid ""
+"The simplest solution is in O(n²), meaning that it runs in quadratic time.  "
+"You will probably have to define one extra function for that.  Another much "
+"more complex solution runs in O(n log(n))."
+msgstr ""
+
+#. type: Content of: <h1>
 #: src/lessons/recursion/Main.html:2
 msgid "Recursive algorithms"
 msgstr ""
@@ -10707,19 +11428,46 @@
 "two sides of an equilateral triangle."
 msgstr ""
 
-#. type: Attribute 'alt' of: <p><div>
+#. type: Content of: <p>
 #: src/lessons/recursion/koch/Koch.html:20
+#, fuzzy
+#| msgid "The pseudo-code of this algorithm is thus the following:"
+msgid "The pseudo-code of the general case is the following:"
+msgstr "O pseudo-código deste algoritmo é então o seguinte:"
+
+#. type: Content of: <pre>
+#: src/lessons/recursion/koch/Koch.html:22
+#, no-wrap
+msgid ""
+"  Draw recursively a smaller segment\n"
+"  Turn 60 degrees to the left\n"
+"  Draw recursively a smaller segment  \n"
+"  Turn 120 degrees to the right\n"
+"  Draw recursively a smaller segment\n"
+"  Turn 60 degrees to the left\n"
+"  Draw recursively a smaller segment\n"
+msgstr ""
+
+#. type: Content of: <p>
+#: src/lessons/recursion/koch/Koch.html:30
+msgid ""
+"As you can see, the function forward() is not called from the recursive "
+"case, only in the base case when there is no recursive call."
+msgstr ""
+
+#. type: Attribute 'alt' of: <p><div>
+#: src/lessons/recursion/koch/Koch.html:34
 msgid "Too much letters. Please picture it."
 msgstr ""
 
 #. type: Content of: <p><div><p>
-#: src/lessons/recursion/koch/Koch.html:21
+#: src/lessons/recursion/koch/Koch.html:35
 #: src/lessons/recursion/koch/SquareKoch.html:9
 msgid "Here are the results of the first levels of recursion."
 msgstr ""
 
 #. type: Content of: <p>
-#: src/lessons/recursion/koch/Koch.html:25
+#: src/lessons/recursion/koch/Koch.html:39
 msgid ""
 "You must write the <code>snowSide()</code> method, which is recursive but "
 "<b>do not call snowFlake from snowSide</b>, or you will get very strange and "
@@ -10884,6 +11632,31 @@
 #. type: Content of: <p><p><p><p><p>
 #: src/lessons/recursion/tree/Tree.html:16
 msgid ""
+"At the end, here is the pseudo-code of the general case (you should add the "
+"base case yourself):"
+msgstr ""
+
+#. type: Content of: <p><p><p><p><pre>
+#: src/lessons/recursion/tree/Tree.html:18
+#, no-wrap
+msgid ""
+"  Move forward of the desired length\n"
+"  Draw (recursively) the right subtree\n"
+"  Draw (recursively) the left subtree\n"
+"  Move back to your initial position\n"
+msgstr ""
+
+#. type: Content of: <p><p><p><p><p>
+#: src/lessons/recursion/tree/Tree.html:23
+msgid ""
+"Don't forget to add the base case to your code, or your buggle will enter an "
+"infinite loop.  Then, drawing the right subtree comes down to turn right and "
+"then draw the subtree."
+msgstr ""
+
+#. type: Content of: <p><p><p><p><p>
+#: src/lessons/recursion/tree/Tree.html:26
+msgid ""
 "As you can see, each recursion level is represented by a distinctive color. "
 "For that, you have to call the <code>current(step)</code>, passing the "
 "current recursion level as a parameter. This will pick the right color for "
@@ -10892,7 +11665,7 @@
 msgstr ""
 
 #. type: Content of: <p><p><p><p><p>
-#: src/lessons/recursion/tree/Tree.html:20
+#: src/lessons/recursion/tree/Tree.html:30
 msgid ""
 "If you get your function wrong, this can easily become hairly to debug as "
 "your errors will appear at each level of the recursion, completely changing "
@@ -11017,12 +11790,12 @@
 msgid ""
 "Here are some of the figures that you can produce with your <code>Spiral</"
 "code> function, provided that you come with the right parameters. You can "
-"switch to the creative mode (from the Session menu)  to disable the world "
+"switch to the creative mode (from the Exercise menu)  to disable the world "
 "comparison when you explore with these spirals."
 msgstr ""
 
 #. type: Content of: <p>
-#: src/lessons/recursion/spiral/SpiralUse.html:19
+#: src/lessons/recursion/spiral/SpiralUse.html:21
 msgid ""
 "If you discover a cool figure, don't forget to send your parameters (menu "
 "Help/feedback) so that we can add it to the list!"
@@ -12954,370 +13727,6 @@
 msgstr ""
 
 #. type: Content of: <h2>
-#: src/lessons/lander/Main.html:2 src/lessons/lander/short_desc.html:2
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:2
-msgid "Lunar Lander"
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/Main.html:4 src/lessons/lander/short_desc.html:4
-msgid ""
-"In this lesson you pilot a lunar landing module in increasingly complex "
-"situations."
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/Main.html:7
-msgid ""
-"At each step of the simulation, the player issues a command controlling how "
-"much the angle and thrust of the lander should change"
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/Main.html:10
-msgid "Ideas concerning the progression of exercises:"
-msgstr ""
-
-#. type: Content of: <ul><li>
-#: src/lessons/lander/Main.html:12
-msgid ""
-"A lander in vertical position above flat ground, the player can only control "
-"thrust (done)"
-msgstr ""
-
-#. type: Content of: <ul><li>
-#: src/lessons/lander/Main.html:14
-msgid ""
-"A lander in vertical position not above flat ground, the player control "
-"thrust and angle (done)"
-msgstr ""
-
-#. type: Content of: <ul><li>
-#: src/lessons/lander/Main.html:16
-msgid ""
-"A lander with difficult angle and speed not above flat ground, the player "
-"control thrust and angle"
-msgstr ""
-
-#. type: Content of: <ul><li>
-#: src/lessons/lander/Main.html:18
-msgid ""
-"A lander with difficult angle and speed not above flat ground, with "
-"difficult ground, the player control thrust and angle"
-msgstr ""
-
-#. type: Content of: <ul><li>
-#: src/lessons/lander/Main.html:20
-msgid "Same with wind?"
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/short_desc.html:7
-msgid "This lesson assumes some basic programming and physics skills."
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:4
-msgid ""
-"In this universe you pilot a lunar lander. At each simulation step you're "
-"given the lander's position, speed, angle and thrust and must issue a "
-"command adjusting its angle and thrust."
-msgstr ""
-
-#. type: Content of: outside any tag (error?)
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:12
-msgid "Get the X and Y position of the lander."
-msgstr "Obter (Get) as posições X e Y do \"lander\"."
-
-#. type: Content of: <pre>
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:13
-#, no-wrap
-msgid ""
-"[!java|c]double [/!]getSpeedX()[!scala]:Double[/!]\n"
-"[!java|c]double [/!]getSpeedY()[!scala]:Double[/!]"
-msgstr ""
-"[!java|c]double [/!]getVelocidadeX()[!scala]:Double[/!]\n"
-"[!java|c]double [/!]getVelocidadeY()[!scala]:Double[/!]"
-
-#. type: Content of: outside any tag (error?)
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:15
-msgid "Get the horizontal and vertical speed of the lander."
-msgstr ""
-
-#. type: Content of: <pre>
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:17
-#, no-wrap
-msgid ""
-"[!java|c]double [/!]getAngle()[!scala]:Double[/!]\n"
-"[!java|c]void [/!]setDesiredAngle([!java|c]double [/!]desiredAngle[!scala]:Double[/!])"
-msgstr ""
-"[!java|c]double [/!]getÂngulo()[!scala]:Double[/!]\n"
-"[!java|c]void [/!]setÂnguloDesejado([!java|c]double [/!]ÂnguloDesejado[!scala]:Double[/!])"
-
-#. type: Content of: outside any tag (error?)
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:19
-msgid "Get or set the angle of the lander."
-msgstr ""
-
-#. type: Content of: outside any tag (error?)
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:20
-msgid ""
-"An angle of 0° denotes a vertical position where the \"head\" of the lander "
-"points up.  This is the angle you must land with. A positive angle denotes a "
-"left-leaning lander, a negative angle a right-leaning one. You cannot lean "
-"more than by ±90°, and the angle can vary by at most ±5° in one step."
-msgstr ""
-
-#. type: Content of: <pre>
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:25
-#, no-wrap
-msgid ""
-"[!java|c]int [/!]getThrust()[!scala]:Int[/!]\n"
-"[!java|c]void [/!]setDesiredThrust([!java|c]int [/!]thrust[!scala]:Int[/!])"
-msgstr ""
-"[!java|c]int [/!]getImpulso()[!scala]:Int[/!]\n"
-"[!java|c]void [/!]setImpulsoDesejado([!java|c]int [/!]thrust[!scala]:Int[/!])"
-
-#. type: Content of: outside any tag (error?)
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:27
-msgid "Get or set the thrust of the lander."
-msgstr ""
-
-#. type: Content of: outside any tag (error?)
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:27
-msgid ""
-"You can only increment or decrement the thrust by 1 between two simulation "
-"steps, so if the current thrust is 2 and you ask for 4, you'll only get 3 in "
-"the next step. If you ask for less than 0 (resp. more than 4), everything "
-"will be as if you had asked for 0 (resp. 4)."
-msgstr ""
-
-#. type: Content of: <pre>
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:33
-#, no-wrap
-msgid "[!java|c]int [/!]getFuel()[!scala]:Int[/!]"
-msgstr "[!java|c]int [/!]getCombustível()[!scala]:Int[/!]"
-
-#. type: Content of: outside any tag (error?)
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:34
-msgid ""
-"Get the remaining fuel in the lander.  At each step of the simulation the "
-"lander consumes as many fuel units as the current thrust. Once you run out "
-"of fuel you're in free fall so beware!"
-msgstr ""
-
-#. type: Content of: <pre>
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:38
-#, no-wrap
-msgid "[!java]List&lt;Point&gt; [/!]getGround()[! scala]:List[Point][/!]"
-msgstr "[!java]List&lt;Point&gt; [/!]getChão()[! scala]:List[Point][/!]"
-
-#. type: Content of: outside any tag (error?)
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:39
-msgid ""
-"Get the vertices of the ground's profile from left to right.  [!java|"
-"scala]You can retrieve the X and Y coordinates of each point with the "
-"corresponding methods of your point: <code>p.x()</code> and <code>p.y()</"
-"code>.[!/] [!python]Each point is an array of two integers denoting "
-"respectively the X and Y coordinates of that point.[/!]"
-msgstr ""
-
-#. type: Content of: <h1>
-#: src/lessons/lander/lvl1_lander_101/Lander101.html:2
-msgid "Lander 101"
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl1_lander_101/Lander101.html:4
-msgid ""
-"Congratulations! You won a (one-way) trip to Mars in a cereal box. NASA was "
-"kind enough to donate the Lunar Excursion Module for this mission, so that's "
-"what you'll be flying."
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl1_lander_101/Lander101.html:8
-msgid ""
-"Before you take off, you must go through some basic landing simulation. You "
-"shouldn't have to fly the lander if all goes as planned but, as they say, "
-"\"better safe than sorry\"."
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl1_lander_101/Lander101.html:12
-msgid ""
-"Your mission is to <b>land the lander with a vertical speed of at most 10 m/"
-"s.</b> There are two ways you can influence the lander's course: by "
-"adjusting its angle or by adjusting its thrust. In this simulation we only "
-"care about adjusting the thrust, expressed in m/s²."
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl1_lander_101/Lander101.html:17
-msgid ""
-"The [!python]<code>step()</code> function[/!][!scala|java|c]code[/!] that "
-"you should write now will be called every 0.1 second during the simulation. "
-"It should set the desired thrust of the next simulation step, by calling "
-"<code>[!java]void [/!]setDesiredThrust([!java]int [/!]desiredThrust[!scala]:"
-"Integer[/!])</code> where <code>desiredThrust</code> is some integer between "
-"0 and 4 (that is, a thrust between 0 m/s² and 4 m/s²). You can only "
-"increment or decrement the thrust by 1 between two simulation steps, so if "
-"the current thrust is 2 and you ask for 4, you'll only get 3 in the next "
-"step. If you ask for less than 0 (resp. more than 4), everything will be as "
-"if you had asked for 0 (resp. 4)."
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl1_lander_101/Lander101.html:27
-msgid ""
-"In order to take informed decisions, you can query the lander's state. In "
-"this simulation you'll probably be interested in its vertical position: "
-"<code>[!java]double [/!]getY()[!scala]:Double[/!]</code>, and its vertical "
-"speed: <code>[!java]double [/!]getSpeedY()[!scala]:Double[/!]</code>. You "
-"can also ask for the thrust via <code>[!java]int [/!]getThrust()[!scala]:"
-"Integer[/!]</code> in case you don't remember what you asked for. Remember "
-"that Mars' gravity is 3.711 m/s², it might come in handy."
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl1_lander_101/Lander101.html:35
-msgid ""
-"One last thing: the lander is pretty small so you don't have much fuel. At "
-"each step of the simulation the lander consumes as many fuel units as the "
-"current thrust. Once you run out of fuel you're in free fall so beware! You "
-"can consult the remaining amount of available fuel units using <code>[!"
-"java]int [/!]getFuel()[!scala]:Integer[/!]</code>."
-msgstr ""
-
-#. type: Content of: <h2>
-#: src/lessons/lander/lvl2_locate_landing_zone/LocateLandingZone.html:2
-msgid "Locate a Landing Zone"
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl2_locate_landing_zone/LocateLandingZone.html:4
-msgid ""
-"After 200 days of traveling space and eating cereals you finally reach Mars. "
-"Time to land at last!"
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl2_locate_landing_zone/LocateLandingZone.html:7
-msgid ""
-"The lander is on autopilot and all you have to do is look around and tell it "
-"where to land. The lander must <b>land on a flat zone</b> it you want to "
-"remain in one piece. You indicate the lander where to land by modifying the "
-"<code>getLandingZone</code> function so that it returns a [!java|"
-"scala]<code>Segment</code> representing the zone of your choice."
-msgstr ""
-
-#. type: Content of: <p><p>
-#: src/lessons/lander/lvl2_locate_landing_zone/LocateLandingZone.html:13
-msgid ""
-"A segment is composed of two <code>Point</code>s, each of them composed of "
-"two <code>double</code>s. A segment is built via the <code>Segment([!"
-"java]Point [/!]start[!scala]:Point[/!], [!java]Point [/!]end[!scala]:"
-"Point[/!])</code> constructor.  A point is built via the <code>Point([!"
-"java]double [/!]x[!scala]:Double[/!], [!java]double [/!]y[!scala]:"
-"Double[/!])</code> constructor. A point's coordinates are accessible via its "
-"<code>[!java]double [/!]x()[!scala]:Double[/!]</code> and <code>[!"
-"java]double [/!]y()[!scala]:Double[/!]</code> methods."
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl2_locate_landing_zone/LocateLandingZone.html:18
-msgid ""
-"[/!] [!python]tuple of two X coordinates representing the zone of your "
-"choice.[/!]"
-msgstr ""
-
-#. type: Content of: <p><p>
-#: src/lessons/lander/lvl2_locate_landing_zone/LocateLandingZone.html:22
-msgid ""
-"In order to determine which zone to return, you'll need to call <code>[!"
-"java]List&lt;Point&gt; [/!]getGround()[!scala]List[Point][/!]</code>, which "
-"returns the vertices of the ground's profile as a list of [!java|"
-"scala]<code>Point</code>[/!] [!python]tuples (x,y)[/!]."
-msgstr ""
-
-#. type: Content of: <p><p>
-#: src/lessons/lander/lvl2_locate_landing_zone/LocateLandingZone.html:27
-msgid ""
-"One more thing: your function should return a valid flat zone in any kind of "
-"situation, not just for the currently visualized one. That's because it will "
-"be not only tested against that world, but also against the one we had in "
-"the previous exercise. As usual, you can see the other existing worlds with "
-"the appropriate combobox."
-msgstr ""
-
-#. type: Content of: <p><p>
-#: src/lessons/lander/lvl2_locate_landing_zone/LocateLandingZone.html:33
-msgid ""
-"Have a safe landing! Don't forget to put on your space suit on your way out."
-msgstr ""
-
-#. type: Content of: <h1>
-#: src/lessons/lander/lvl3_fly_the_lander/FlyTheLander.html:2
-msgid "Fly the Lander!"
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl3_fly_the_lander/FlyTheLander.html:4
-msgid ""
-"After 30 days of staring at rocks and eating cereals you decide it's time to "
-"go explore other parts of the planet."
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl3_fly_the_lander/FlyTheLander.html:7
-msgid ""
-"You fly for a while and suddenly realize you're almost out of fuel.  "
-"Unfortunately you're in a delicate situation and the autopilot is helpless.  "
-"You will have to pilot the lander yourself. Your mission is to <b>land the "
-"lander on a flat zone with a vertical speed less than 10 m/s, an horizontal "
-"speed less than 5 m/s and an angle of 0°.</b>"
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl3_fly_the_lander/FlyTheLander.html:13
-msgid ""
-"You must define two functions: <code>[!java]void [/!]initialize()</code> and "
-"<code>[!java]void [/!]step()</code>. <code>initialize()</code> is called "
-"once just after you press \"Run\". You can use it to chose some flat zone. "
-"As before, <code>step()</code> is called every 0.1 second and is used for "
-"adjusting the lander's thrust and angle. As in the first exercise the "
-"lander's thrust is adjusted via <code>[!java]void [/!]setDesiredThrust([!"
-"java]int [/!]desiredThrust[!scala]:Integer[/!])</code>.  But you can also "
-"control its angle via <code>[!java]void [/!]setDesiredAngle([!java]double "
-"[/!]desiredAngle[!scala]:Double[/!])</code>.  An angle of 0° denotes a "
-"vertical position where the \"head\" of the lander points up.  This is the "
-"angle you must land with. A positive angle denotes a left-leaning lander, a "
-"negative angle a right-leaning one. You cannot lean more than by ±90°, and "
-"the angle can vary by at most ±5° in one step."
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl3_fly_the_lander/FlyTheLander.html:26
-msgid ""
-"As in the previous exercise, <code>[!java]List&lt;Point&gt; [/!]getGround()[!"
-"scala]:List[Point][/!]</code> returns the vertices of the ground's profile "
-"from left to right.  Please refer to the documentation (Help/About this "
-"world) for a reference manual of your lunar lander."
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl3_fly_the_lander/FlyTheLander.html:30
-msgid ""
-"As before, your program must safely land the lander in all the situations "
-"encountered so far in addition to this new one."
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl3_fly_the_lander/FlyTheLander.html:33
-msgid "Good luck, try not to crash!"
-msgstr "Boa sorte, tente não cair!"
-
-#. type: Content of: <h2>
 #: lib/doc/MainWindow.html:1
 msgid "The PLM Main Window"
 msgstr "A Janela Principal do PLM"
@@ -13553,6 +13962,39 @@
 "O botão <b>Marcar</b> pede que o seu \"buggle\" deixe uma marca atrás dele "
 "depois que sair."
 
+#~ msgid "Get the X and Y position of the lander."
+#~ msgstr "Obter (Get) as posições X e Y do \"lander\"."
+
+#~ msgid ""
+#~ "[!java|c]double [/!]getSpeedX()[!scala]:Double[/!]\n"
+#~ "[!java|c]double [/!]getSpeedY()[!scala]:Double[/!]"
+#~ msgstr ""
+#~ "[!java|c]double [/!]getVelocidadeX()[!scala]:Double[/!]\n"
+#~ "[!java|c]double [/!]getVelocidadeY()[!scala]:Double[/!]"
+
+#~ msgid ""
+#~ "[!java|c]double [/!]getAngle()[!scala]:Double[/!]\n"
+#~ "[!java|c]void [/!]setDesiredAngle([!java|c]double [/!]desiredAngle[!scala]:Double[/!])"
+#~ msgstr ""
+#~ "[!java|c]double [/!]getÂngulo()[!scala]:Double[/!]\n"
+#~ "[!java|c]void [/!]setÂnguloDesejado([!java|c]double [/!]ÂnguloDesejado[!scala]:Double[/!])"
+
+#~ msgid ""
+#~ "[!java|c]int [/!]getThrust()[!scala]:Int[/!]\n"
+#~ "[!java|c]void [/!]setDesiredThrust([!java|c]int [/!]thrust[!scala]:Int[/!])"
+#~ msgstr ""
+#~ "[!java|c]int [/!]getImpulso()[!scala]:Int[/!]\n"
+#~ "[!java|c]void [/!]setImpulsoDesejado([!java|c]int [/!]thrust[!scala]:Int[/!])"
+
+#~ msgid "[!java|c]int [/!]getFuel()[!scala]:Int[/!]"
+#~ msgstr "[!java|c]int [/!]getCombustível()[!scala]:Int[/!]"
+
+#~ msgid "[!java]List&lt;Point&gt; [/!]getGround()[! scala]:List[Point][/!]"
+#~ msgstr "[!java]List&lt;Point&gt; [/!]getChão()[! scala]:List[Point][/!]"
+
+#~ msgid "Good luck, try not to crash!"
+#~ msgstr "Boa sorte, tente não cair!"
+
 #~ msgid "This code is then perfectly equivalent to the following one."
 #~ msgstr "Este código é então complemtamente equivalente ao seguinte."
 
--- a/l10n/engine/fr.po
+++ b/l10n/engine/fr.po
@@ -20,12 +20,12 @@
 
 #: src/lessons/lightbot/universe/LightBotExercise.java:56
 msgid "A light is still off."
-msgstr ""
+msgstr "Une lumière est encore éteinte."
 
 #: src/lessons/lightbot/universe/LightBotExercise.java:58
 #, java-format
 msgid "{0} lights (out of {1}) are still off."
-msgstr ""
+msgstr "{0} lampes (sur {1}) sont encore éteintes."
 
 #: src/lessons/maze/island/IslandMazeEntity.java:10
 #: src/lessons/maze/pledge/PledgeMazeEntity.java:10
@@ -337,6 +337,8 @@
 "Sorry Dave, you cannot run backward that way. Exercising is hard enough -- "
 "please don't overplay."
 msgstr ""
+"Désolé Dave, je ne peux pas te laisser courir à reculons. Faire du footing "
+"est déjà assez dur comme ça, pas besoin de sur-jouer de la sorte."
 
 #: src/lessons/welcome/loopfor/LoopCourseForestEntity.java:39
 msgid "You fall into water."
@@ -439,12 +441,22 @@
 "within the\n"
 "provided method."
 msgstr ""
+"Votre entité n'a pas démarré. Auriez-vous oublié de placer votre code dans "
+"une méthode ? Ce problème survient souvent quand l'exercice s'attend à ce "
+"que vous placiez votre code dans une méthode (nommée run() ou autrement) "
+"mais que vous placez malgré tout des instructions comme avance() en dehors "
+"de toute méthode. La solution la plus simple pour corriger ce problème est "
+"de copier tout votre code (Ctrl-A Ctrl-C) puis d'utiliser la fonctionnalité "
+"\"Exercice / réinitialiser\" du menu pour rétablir le code proposé. Ensuite, "
+"collez votre code (Ctrl-V) à l'intérieur de la méthode fournie."
 
 #: src/plm/core/lang/JVMCompiledLang.java:60
 msgid ""
 "Your entity failed to start. Your constructor seems to be broken, but I have "
 "no clue."
 msgstr ""
+"Votre entité n'a pas démarré. Votre constructeur semble cassé, mais je ne "
+"sais pas du tout pourquoi."
 
 #: src/plm/core/lang/JVMCompiledLang.java:83
 #: src/plm/core/lang/LangLightbot.java:39
@@ -501,13 +513,13 @@
 "Utilisez les touches TAB et majuscule-TAB pour nettoyer votre indentation.\n"
 
 #: src/plm/core/lang/LangPython.java:66
-#, fuzzy
 msgid ""
 "You interrupted the execution, did you fall into an infinite loop ?\n"
 "Your program must stop by itself to successfully pass the exercise.\n"
 msgstr ""
-"Vous avez interrompu l'exécution.\n"
-"Votre programme doit s'arrêter de lui-même pour réussir l'exercice.\n"
+"Vous avez interrompu l'exécution. Seriez-vous tombé dans une \n"
+"boucle infinie ? Votre programme doit s'arrêter de lui-même pour \n"
+"réussir l'exercice.\n"
 
 #: src/plm/core/lang/LangPython.java:72
 msgid ""
@@ -722,10 +734,9 @@
 msgid "The lesson "
 msgstr "Sélectionner une leçon"
 
-#: src/plm/core/model/Game.java:379
-#, fuzzy
+#: src/plm/core/model/Game.java:380
 msgid "Broken lesson"
-msgstr "Charger une leçon"
+msgstr "Leçon cassée"
 
 #: src/plm/core/model/Game.java:504
 #, java-format
@@ -828,9 +839,8 @@
 msgstr "L''utilisateur est maintenant {0}"
 
 #: src/plm/core/model/Users.java:175
-#, fuzzy
 msgid "A new PLM user has been created for you!"
-msgstr "Un nouvel utilisateur a été créé pour vous !"
+msgstr "Un nouvel utilisateur PLM a été créé pour vous !"
 
 #: src/plm/core/model/lesson/Exercise.java:78
 #, java-format
@@ -919,9 +929,10 @@
 msgstr "Le monde {0} est cassé ({1}). Recalcule tous les mondes solutions."
 
 #: src/plm/core/model/lesson/ExerciseTemplated.java:410
-#, fuzzy, java-format
+#, java-format
 msgid "Cache file {0} is missing. Recompute all answer worlds."
-msgstr "Le monde {0} est cassé ({1}). Recalcule tous les mondes solutions."
+msgstr ""
+"Le fichier de cache {0} est manquant. Recalcule tous les mondes solutions."
 
 #: src/plm/core/model/lesson/ExerciseTemplated.java:414
 #, java-format
@@ -970,6 +981,8 @@
 "Something weird happened. Your session was not created/reloaded properly. "
 "Please report this issue."
 msgstr ""
+"Il s'est passé quelque chose de bizarre. Votre session n'a pas été créée et "
+"rechargée correctement. Merci de faire un rapport d'anomalie."
 
 #: src/plm/core/model/session/ZipSessionKit.java:252
 msgid "Ok, quit and lose my data"
@@ -1048,42 +1061,44 @@
 "Vous avez trouvé un bogue dans la PLM. Veuillez faire un rapport avec tous "
 "les détails possibles (y compris la pile d'exécution ci-dessous)."
 
-#: src/plm/core/model/tracking/GitSpy.java:139
+#: src/plm/core/model/tracking/GitSpy.java:160
 msgid "Pushing to the remote repository before exiting"
-msgstr ""
+msgstr "Envoi de vos changements sur le serveur avant de quitter."
 
-#: src/plm/core/model/tracking/GitUtils.java:74
+#: src/plm/core/model/tracking/GitUtils.java:76
 msgid "Retrieving your session from the servers..."
-msgstr ""
+msgstr "Récupération de votre session depuis le serveur..."
 
-#: src/plm/core/model/tracking/GitUtils.java:117
+#: src/plm/core/model/tracking/GitUtils.java:119
 msgid "Can't retrieve data stored on server."
-msgstr ""
+msgstr "Impossible de récupérer les données sauvegardées sur le serveur."
 
-#: src/plm/core/model/tracking/GitUtils.java:125
-#, fuzzy
+#: src/plm/core/model/tracking/GitUtils.java:127
 msgid "last session data successfully retrieved"
-msgstr "L''utilisateur {0} a été supprimé avec succès"
+msgstr "Les données de la session précédente ont été récupérées."
 
-#: src/plm/core/model/tracking/GitUtils.java:128
-#, fuzzy
+#: src/plm/core/model/tracking/GitUtils.java:130
 msgid "last session data successfully merged"
-msgstr "L''utilisateur {0} a été supprimé avec succès"
+msgstr "Les données de la session précédente ont été fusionnées avec succès."
 
-#: src/plm/core/model/tracking/GitUtils.java:131
+#: src/plm/core/model/tracking/GitUtils.java:133
 msgid ""
 "Conflicts have been detected while synchronizing with last session data, "
 "trying to resolve it..."
 msgstr ""
+"Des conflits d'édition ont été détectés lors de la synchronisation de vos "
+"données. Tentative de résolution en cours..."
 
 #. TODO: handle this case
 #: src/plm/core/model/tracking/GitUtils.java:159
 msgid "Cancelled the merge operation because of the following failures:"
 msgstr ""
 
-#: src/plm/core/model/tracking/GitUtils.java:166
+#: src/plm/core/model/tracking/GitUtils.java:168
 msgid "Can't merge data retrieved from server with local session data."
 msgstr ""
+"Impossible de fusionner les données reçues du serveur avec votre session "
+"locale."
 
 #: src/plm/core/model/tracking/GitUtils.java:201
 msgid "Cannot synchronize your session with the servers (network down)."
@@ -1091,27 +1106,31 @@
 "Impossible de synchroniser votre session avec les serveurs (le réseau est "
 "inutilisable)."
 
-#: src/plm/core/model/tracking/GitUtils.java:224
+#: src/plm/core/model/tracking/GitUtils.java:226
 msgid "Your session has been successfully saved into the clouds."
-msgstr ""
+msgstr "Votre session a été sauvegardée avec succès dans les nuages."
 
 #. An error occurred while pushing
 #. Try to synchronize with the remote branch before pushing again
-#: src/plm/core/model/tracking/GitUtils.java:229
+#: src/plm/core/model/tracking/GitUtils.java:231
 msgid "Fetching the server's last version..."
-msgstr ""
+msgstr "Récupération de la dernière version depuis le serveur..."
 
-#: src/plm/core/model/tracking/GitUtils.java:233
+#: src/plm/core/model/tracking/GitUtils.java:235
 msgid ""
 "Fetching the data's last version didn't solve the issue, please report this "
 "bug."
 msgstr ""
+"Récupérer la dernière version depuis le serveur n'a pas suffit. Merci de "
+"faire un rapport d'anomalie."
 
-#: src/plm/core/model/tracking/GitUtils.java:236
+#: src/plm/core/model/tracking/GitUtils.java:238
 msgid ""
 "A bug occurred while synchronizing your data with the server, please report "
 "the following error:"
 msgstr ""
+"Un bug est apparu lors de la synchronisation de vos données avec le serveur. "
+"Merci de rapporter l'erreur suivante :"
 
 #: src/plm/core/ui/AboutLessonDialog.java:20
 msgid "About lesson - "
@@ -1387,36 +1406,33 @@
 msgstr "Bravo"
 
 #: src/plm/core/ui/ExercisePassedDialog.java:46
-#, fuzzy, java-format
+#, java-format
 msgid ""
 "<html>Congratulations, you passed this exercise.<br>{0} tests passed.</html>"
 msgstr ""
-"Félicitations, vous avez réussi cet exercice.\n"
-"{0} tests passés."
+"<html>Félicitations, vous avez réussi cet exercice.<br>{0} tests passés.</"
+"html>"
 
 #: src/plm/core/ui/ExercisePassedDialog.java:49
-#, fuzzy
 msgid "<html>Congratulations, you passed this exercise.</html>"
-msgstr "Félicitations, vous avez réussi cet exercice."
+msgstr "<html>Félicitations, vous avez réussi cet exercice.</html>"
 
 #: src/plm/core/ui/ExercisePassedDialog.java:59
-#, fuzzy, java-format
+#, java-format
 msgid ""
 "<html>Congratulations, you passed this exercise.<br>({0} tests "
 "passed)<br>Which exercise will you do now?</html>"
 msgstr ""
-"Félicitations, vous avez réussi cet exercice.\n"
-"({0} tests passés)\n"
-"Par quel exercice voulez vous continuer ?"
+"<html>Félicitations, vous avez réussi cet exercice.<bbr>({0} tests "
+"passés)<br>Par quel exercice voulez vous continuer ?</html>"
 
 #: src/plm/core/ui/ExercisePassedDialog.java:62
-#, fuzzy
 msgid ""
 "<html>Congratulations, you passed this exercise.<br>Which exercise will you "
 "do now?</html>"
 msgstr ""
-"Félicitations, vous avez réussi cet exercice.\n"
-"Par quel exercice voulez vous continuer ?"
+"<html>Félicitations, vous avez réussi cet exercice.<br>Par quel exercice "
+"voulez vous continuer ?</html>"
 
 #: src/plm/core/ui/ExercisePassedDialog.java:72
 msgid "Give feedback"
@@ -1929,28 +1945,30 @@
 msgid "World cannot be reset right now"
 msgstr "Le monde ne peut être réinitialisé pour l'instant"
 
-#: src/plm/core/ui/action/RevertExercise.java:25
+#: src/plm/core/ui/action/RevertExercise.java:20
 msgid "OK"
-msgstr ""
+msgstr "OK"
 
-#: src/plm/core/ui/action/RevertExercise.java:28
+#: src/plm/core/ui/action/RevertExercise.java:23
 msgid ""
 "Reverting this exercise will erase all your work and cannot be undone.\n"
 " Are you sure that you want to proceed?"
 msgstr ""
+"Réinitialiser cet exercice effacera tout votre travail et ne peut pas être "
+"annulé. Êtes vous sûr de vouloir le faire ?"
 
-#: src/plm/core/ui/action/RevertExercise.java:29
+#: src/plm/core/ui/action/RevertExercise.java:24
 msgid "Warning"
-msgstr ""
+msgstr "Attention"
 
-#: src/plm/core/ui/action/RevertExercise.java:33
+#: src/plm/core/ui/action/RevertExercise.java:28
 msgid "Revert canceled on user request -- your work was preserved."
 msgstr ""
+"Réinitialisation annulée à votre demande -- votre travail a été préservé."
 
-#: src/plm/core/ui/action/RevertExercise.java:51
-#, fuzzy
+#: src/plm/core/ui/action/RevertExercise.java:39
 msgid "Exercise reverted"
-msgstr "Exercice"
+msgstr "Exercice réinitialisé"
 
 #: src/plm/core/ui/action/StartExecution.java:32
 msgid "Launch the execution of your code"
@@ -2179,29 +2197,27 @@
 #: src/plm/universe/bat/BatEntity.java:38
 #, java-format
 msgid "Exception {0}: {1}"
-msgstr ""
+msgstr "Exception {0} : {1}"
 
 #: src/plm/universe/bugglequest/AbstractBuggle.java:156
 #: src/plm/universe/bugglequest/SimpleBuggle.java:31
 #: src/plm/universe/turtles/Turtle.java:216
-#, fuzzy
 msgid ""
 "Sorry Dave, I cannot let you use Left() with an uppercase. Use left() "
 "instead."
 msgstr ""
-"Désolé Dave, je ne peux pas pouvoir te laisser utiliser droite() dans cet "
-"exercice. Utilise plutôt gauche()."
+"Désolé Dave, je ne peux pas pouvoir te laisser utiliser Left() avec une "
+"majuscule. Utilise plutôt left() ou gauche()."
 
 #: src/plm/universe/bugglequest/AbstractBuggle.java:159
 #: src/plm/universe/bugglequest/SimpleBuggle.java:36
 #: src/plm/universe/turtles/Turtle.java:219
-#, fuzzy
 msgid ""
 "Sorry Dave, I cannot let you use Right() with an uppercase. Use right() "
 "instead."
 msgstr ""
-"Désolé Dave, je ne peux pas pouvoir te laisser utiliser droite() dans cet "
-"exercice. Utilise plutôt gauche()."
+"Désolé Dave, je ne peux pas pouvoir te laisser utiliser Right() avec une "
+"majuscule. Utilise plutôt right() ou droite()."
 
 #: src/plm/universe/bugglequest/AbstractBuggle.java:179
 #, java-format
@@ -2398,10 +2414,10 @@
 msgid "  In ({0},{1})"
 msgstr "  En ({0},{1})"
 
-#: src/plm/universe/bugglequest/BuggleWorld.java:563
-#, fuzzy, java-format
+#: src/plm/universe/bugglequest/BuggleWorld.java:567
+#, java-format
 msgid "  There is {0} entities where {1} were expected."
-msgstr "  Il n''y a que {0} formes là où {1} formes étaient attendues\n"
+msgstr "  Il y a {0} formes là où {1} formes étaient attendues"
 
 #: src/plm/universe/bugglequest/BuggleWorld.java:567
 #, java-format
@@ -2614,48 +2630,99 @@
 msgstr "Je ne vois pas de différence (merci de rapporter cette anomalie)."
 
 #: src/plm/universe/turtles/Line.java:120
-#, fuzzy
 msgid "That's not a line (please report this bug)."
-msgstr "Je ne vois pas de différence (merci de rapporter cette anomalie)."
+msgstr "Ce n'est pas une ligne (merci de rapporter cette anomalie)."
 
 #: src/plm/universe/turtles/Turtle.java:401
 #, java-format
 msgid "The turtle {0} is not heading to the right direction."
-msgstr ""
+msgstr "La tortue {0} n''a pas la bonne orientation."
 
 #: src/plm/universe/turtles/Turtle.java:403
 #, java-format
 msgid "The turtle {0} is at the right location."
-msgstr ""
+msgstr "La tortue {0} est à l''emplacement attendu."
 
 #: src/plm/universe/turtles/TurtleWorld.java:359
-#, fuzzy, java-format
+#, java-format
 msgid "  There is {0} entities, but {1} entities were expected\n"
-msgstr "  Il n''y a que {0} formes là où {1} formes étaient attendues\n"
+msgstr "  Il y a {0} entités là où {1} entités étaient attendues\n"
 
 #: src/plm/universe/turtles/TurtleWorld.java:388
-#, fuzzy, java-format
+#, java-format
 msgid "  There is {0} shapes, but only {1} shapes were expected\n"
-msgstr "  Il n''y a que {0} formes là où {1} formes étaient attendues\n"
+msgstr "  Il y a {0} formes là où seulement {1} formes étaient attendues\n"
 
 #: src/plm/universe/turtles/TurtleWorld.java:390
-#, fuzzy, java-format
+#, java-format
 msgid "  There is only {0} shapes, but {1} shapes were expected\n"
 msgstr "  Il n''y a que {0} formes là où {1} formes étaient attendues\n"
 
 #: src/plm/universe/turtles/TurtleWorld.java:417
 msgid "Superflous shapes in your solution:\n"
-msgstr ""
+msgstr "Formes superflues dans votre solution : \n"
 
 #: src/plm/universe/turtles/TurtleWorld.java:422
 msgid "Missing shapes in your solution:\n"
-msgstr ""
+msgstr "Formes manquantes dans votre solution : \n"
 
 #: src/plm/universe/turtles/TurtleWorld.java:433
 #, java-format
 msgid "  {0} (got {1} instead of {2})\n"
 msgstr "  {0} (trouvé {1} au lieu de {2})\n"
 
+#: src/plm/core/model/Game.java:379
+#, java-format
+msgid ""
+"The lesson {0} encountered an issue while loading its exercises, please "
+"report the issue and choose another lesson."
+msgstr ""
+"La leçon {0} a rencontré un problème lors du chargement de ses exercices. "
+"Veuillez faire un rapport d'anomalie et choisir une autre leçon."
+
+#. TODO: handle this case
+#: src/plm/core/model/tracking/GitUtils.java:161
+msgid "Canceled the merge operation because of the following failures:"
+msgstr "L'opération de fusion a rencontré les problèmes suivants :"
+
+#: src/plm/core/ui/FeedbackDialog.java:154
+msgid ""
+"Your feedback needs some little changes before being send,\n"
+"please fix the following issue(s):\n"
+"\n"
+msgstr ""
+"Votre rapport d'anomalie doit être légèrement modifié avant \n"
+"de pouvoir l'envoyer. Merci de corriger les points suivants : \n"
+"\n"
+
+#: src/plm/core/ui/FeedbackDialog.java:155
+msgid "Incorrect feedback"
+msgstr "Rapport d'anomalie invalide"
+
+#: src/plm/core/ui/FeedbackDialog.java:180
+msgid ""
+"The feedback's title is still the default one, please specify a relevant "
+"one.\n"
+msgstr ""
+"Le titre est encore celui par défaut. Merci de résumer votre problème dans "
+"le titre. \n"
+
+#: src/plm/core/ui/FeedbackDialog.java:184
+msgid "The current title is empty, please specify a relevant title.\n"
+msgstr "Le titre est vide. Merci de résumer votre problème dans le titre. \n"
+
+#: src/plm/core/ui/FeedbackDialog.java:188
+msgid ""
+"The feedback still contains the explanatory text (above the line of "
+"---------), please remove it.\n"
+msgstr ""
+"Le corps du message contient encore le texte explicatif (au dessus de la "
+"ligne de -------------), merci de le retirer. \n"
+
+#: src/plm/core/ui/MainFrame.java:619
+msgid "Please wait, while the PLM is saving your session data."
+msgstr "Veuillez patienter pendant que la PLM sauvegarde votre session."
+
 #, fuzzy
 #~ msgid "Don't save code remotely, as the network seems unreachable."
 #~ msgstr ""
--- a/l10n/engine/pt_BR.po
+++ b/l10n/engine/pt_BR.po
@@ -2343,3 +2343,46 @@
 #, java-format
 msgid "  {0} (got {1} instead of {2})\n"
 msgstr ""
+
+#: src/plm/core/model/Game.java:379
+#, java-format
+msgid ""
+"The lesson {0} encountered an issue while loading its exercises, please "
+"report the issue and choose another lesson."
+msgstr ""
+
+#. TODO: handle this case
+#: src/plm/core/model/tracking/GitUtils.java:161
+msgid "Canceled the merge operation because of the following failures:"
+msgstr ""
+
+#: src/plm/core/ui/FeedbackDialog.java:154
+msgid ""
+"Your feedback needs some little changes before being send,\n"
+"please fix the following issue(s):\n"
+"\n"
+msgstr ""
+
+#: src/plm/core/ui/FeedbackDialog.java:155
+msgid "Incorrect feedback"
+msgstr ""
+
+#: src/plm/core/ui/FeedbackDialog.java:180
+msgid ""
+"The feedback's title is still the default one, please specify a relevant "
+"one.\n"
+msgstr ""
+
+#: src/plm/core/ui/FeedbackDialog.java:184
+msgid "The current title is empty, please specify a relevant title.\n"
+msgstr ""
+
+#: src/plm/core/ui/FeedbackDialog.java:188
+msgid ""
+"The feedback still contains the explanatory text (above the line of "
+"---------), please remove it.\n"
+msgstr ""
+
+#: src/plm/core/ui/MainFrame.java:619
+msgid "Please wait, while the PLM is saving your session data."
+msgstr ""
--- a/l10n/missions/it.po
+++ b/l10n/missions/it.po
@@ -7,7 +7,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2014-10-06 17:06+0200\n"
+"POT-Creation-Date: 2014-11-13 13:47+0100\n"
 "PO-Revision-Date: 2014-07-07 23:00+0200\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -6215,7 +6215,6 @@
 
 #. type: Content of: <p>
 #: src/lessons/welcome/methods/picture/PatternPicture.html:11
-#: src/lessons/lander/lvl1_lander_101/Lander101.html:41
 msgid "Good luck!"
 msgstr "Buona fortuna!"
 
@@ -9687,7 +9686,6 @@
 
 #. type: Content of: <h2>
 #: src/lessons/sort/dutchflag/universe/DutchFlagWorld.html:9
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:8
 msgid "Provided functions"
 msgstr ""
 
@@ -9974,7 +9972,7 @@
 msgid ""
 "Your work is to help this poor guy sorting his stack by flipping the "
 "pancakes. Each pancake is defined by its radius and rank within the stack, "
-"where the bottom pancake is at rank 0, and the one above at rank 1."
+"with the top-most pancake is at rank 0, and the one below at rank 1."
 msgstr ""
 
 #. type: Content of: <p>
@@ -10967,7 +10965,6 @@
 
 #. type: Content of: <pre>
 #: src/plm/universe/turtles/TurtleWorld.html:22
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:10
 #, fuzzy, no-wrap
 #| msgid ""
 #| "[!java]double [/!]divideByTwo([!java]double [/!]x[!scala]: Double[/!])[!scala]: Double =[/!] [!java|scala]{[/!][!python]:[/!]\n"
@@ -14437,389 +14434,6 @@
 msgstr ""
 
 #. type: Content of: <h2>
-#: src/lessons/lander/Main.html:2 src/lessons/lander/short_desc.html:2
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:2
-msgid "Lunar Lander"
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/Main.html:4 src/lessons/lander/short_desc.html:4
-msgid ""
-"In this lesson you pilot a lunar landing module in increasingly complex "
-"situations."
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/Main.html:7
-msgid ""
-"At each step of the simulation, the player issues a command controlling how "
-"much the angle and thrust of the lander should change"
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/Main.html:10
-msgid "Ideas concerning the progression of exercises:"
-msgstr ""
-
-#. type: Content of: <ul><li>
-#: src/lessons/lander/Main.html:12
-msgid ""
-"A lander in vertical position above flat ground, the player can only control "
-"thrust (done)"
-msgstr ""
-
-#. type: Content of: <ul><li>
-#: src/lessons/lander/Main.html:14
-msgid ""
-"A lander in vertical position not above flat ground, the player control "
-"thrust and angle (done)"
-msgstr ""
-
-#. type: Content of: <ul><li>
-#: src/lessons/lander/Main.html:16
-msgid ""
-"A lander with difficult angle and speed not above flat ground, the player "
-"control thrust and angle"
-msgstr ""
-
-#. type: Content of: <ul><li>
-#: src/lessons/lander/Main.html:18
-msgid ""
-"A lander with difficult angle and speed not above flat ground, with "
-"difficult ground, the player control thrust and angle"
-msgstr ""
-
-#. type: Content of: <ul><li>
-#: src/lessons/lander/Main.html:20
-msgid "Same with wind?"
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/short_desc.html:7
-msgid "This lesson assumes some basic programming and physics skills."
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:4
-msgid ""
-"In this universe you pilot a lunar lander. At each simulation step you're "
-"given the lander's position, speed, angle and thrust and must issue a "
-"command adjusting its angle and thrust."
-msgstr ""
-
-#. type: Content of: outside any tag (error?)
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:12
-msgid "Get the X and Y position of the lander."
-msgstr ""
-
-#. type: Content of: <pre>
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:13
-#, fuzzy, no-wrap
-#| msgid ""
-#| "[!java]double [/!]divideByTwo([!java]double [/!]x[!scala]: Double[/!])[!scala]: Double =[/!] [!java|scala]{[/!][!python]:[/!]\n"
-#| "     return x / 2[!java];[/!]\n"
-#| "[!scala|java]}[/!]"
-msgid ""
-"[!java|c]double [/!]getSpeedX()[!scala]:Double[/!]\n"
-"[!java|c]double [/!]getSpeedY()[!scala]:Double[/!]"
-msgstr ""
-"[!java]double [/!]divisionePerDue([!java]double [/!]x[!scala]: Double[/!])[!scala]: Double =[/!] [!java|scala]{[/!][!python]:[/!]\n"
-"     return x / 2[!java];[/!]\n"
-"[!scala|java]}[/!]"
-
-#. type: Content of: outside any tag (error?)
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:15
-msgid "Get the horizontal and vertical speed of the lander."
-msgstr ""
-
-#. type: Content of: <pre>
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:17
-#, fuzzy, no-wrap
-#| msgid ""
-#| "[!java]double [/!]divideByTwo([!java]double [/!]x[!scala]: Double[/!])[!scala]: Double =[/!] [!java|scala]{[/!][!python]:[/!]\n"
-#| "     return x / 2[!java];[/!]\n"
-#| "[!scala|java]}[/!]"
-msgid ""
-"[!java|c]double [/!]getAngle()[!scala]:Double[/!]\n"
-"[!java|c]void [/!]setDesiredAngle([!java|c]double [/!]desiredAngle[!scala]:Double[/!])"
-msgstr ""
-"[!java]double [/!]divisionePerDue([!java]double [/!]x[!scala]: Double[/!])[!scala]: Double =[/!] [!java|scala]{[/!][!python]:[/!]\n"
-"     return x / 2[!java];[/!]\n"
-"[!scala|java]}[/!]"
-
-#. type: Content of: outside any tag (error?)
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:19
-#, fuzzy
-#| msgid "One letter before the end of the alphabet"
-msgid "Get or set the angle of the lander."
-msgstr "Ultima lettera dell'alfabeto"
-
-#. type: Content of: outside any tag (error?)
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:20
-msgid ""
-"An angle of 0° denotes a vertical position where the \"head\" of the lander "
-"points up.  This is the angle you must land with. A positive angle denotes a "
-"left-leaning lander, a negative angle a right-leaning one. You cannot lean "
-"more than by ±90°, and the angle can vary by at most ±5° in one step."
-msgstr ""
-
-#. type: Content of: <pre>
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:25
-#, fuzzy, no-wrap
-#| msgid ""
-#| "[!java]double [/!]divideByTwo([!java]double [/!]x[!scala]: Double[/!])[!scala]: Double =[/!] [!java|scala]{[/!][!python]:[/!]\n"
-#| "     return x / 2[!java];[/!]\n"
-#| "[!scala|java]}[/!]"
-msgid ""
-"[!java|c]int [/!]getThrust()[!scala]:Int[/!]\n"
-"[!java|c]void [/!]setDesiredThrust([!java|c]int [/!]thrust[!scala]:Int[/!])"
-msgstr ""
-"[!java]double [/!]divisionePerDue([!java]double [/!]x[!scala]: Double[/!])[!scala]: Double =[/!] [!java|scala]{[/!][!python]:[/!]\n"
-"     return x / 2[!java];[/!]\n"
-"[!scala|java]}[/!]"
-
-#. type: Content of: outside any tag (error?)
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:27
-msgid "Get or set the thrust of the lander."
-msgstr ""
-
-#. type: Content of: outside any tag (error?)
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:27
-msgid ""
-"You can only increment or decrement the thrust by 1 between two simulation "
-"steps, so if the current thrust is 2 and you ask for 4, you'll only get 3 in "
-"the next step. If you ask for less than 0 (resp. more than 4), everything "
-"will be as if you had asked for 0 (resp. 4)."
-msgstr ""
-
-#. type: Content of: <pre>
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:33
-#, fuzzy, no-wrap
-#| msgid "[!java]int[] T;[/!][!scala]var T:Array[Int][/!]"
-msgid "[!java|c]int [/!]getFuel()[!scala]:Int[/!]"
-msgstr "[!java]int[] T;[/!][!scala]var T:Array[Int][/!]"
-
-#. type: Content of: outside any tag (error?)
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:34
-msgid ""
-"Get the remaining fuel in the lander.  At each step of the simulation the "
-"lander consumes as many fuel units as the current thrust. Once you run out "
-"of fuel you're in free fall so beware!"
-msgstr ""
-
-#. type: Content of: <pre>
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:38
-#, fuzzy, no-wrap
-#| msgid "[!java]int[] T;[/!][!scala]var T:Array[Int][/!]"
-msgid "[!java]List&lt;Point&gt; [/!]getGround()[! scala]:List[Point][/!]"
-msgstr "[!java]int[] T;[/!][!scala]var T:Array[Int][/!]"
-
-#. type: Content of: outside any tag (error?)
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:39
-msgid ""
-"Get the vertices of the ground's profile from left to right.  [!java|"
-"scala]You can retrieve the X and Y coordinates of each point with the "
-"corresponding methods of your point: <code>p.x()</code> and <code>p.y()</"
-"code>.[!/] [!python]Each point is an array of two integers denoting "
-"respectively the X and Y coordinates of that point.[/!]"
-msgstr ""
-
-#. type: Content of: <h1>
-#: src/lessons/lander/lvl1_lander_101/Lander101.html:2
-msgid "Lander 101"
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl1_lander_101/Lander101.html:4
-msgid ""
-"Congratulations! You won a (one-way) trip to Mars in a cereal box. NASA was "
-"kind enough to donate the Lunar Excursion Module for this mission, so that's "
-"what you'll be flying."
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl1_lander_101/Lander101.html:8
-msgid ""
-"Before you take off, you must go through some basic landing simulation. You "
-"shouldn't have to fly the lander if all goes as planned but, as they say, "
-"\"better safe than sorry\"."
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl1_lander_101/Lander101.html:12
-msgid ""
-"Your mission is to <b>land the lander with a vertical speed of at most 10 m/"
-"s.</b> There are two ways you can influence the lander's course: by "
-"adjusting its angle or by adjusting its thrust. In this simulation we only "
-"care about adjusting the thrust, expressed in m/s²."
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl1_lander_101/Lander101.html:17
-msgid ""
-"The [!python]<code>step()</code> function[/!][!scala|java|c]code[/!] that "
-"you should write now will be called every 0.1 second during the simulation. "
-"It should set the desired thrust of the next simulation step, by calling "
-"<code>[!java]void [/!]setDesiredThrust([!java]int [/!]desiredThrust[!scala]:"
-"Integer[/!])</code> where <code>desiredThrust</code> is some integer between "
-"0 and 4 (that is, a thrust between 0 m/s² and 4 m/s²). You can only "
-"increment or decrement the thrust by 1 between two simulation steps, so if "
-"the current thrust is 2 and you ask for 4, you'll only get 3 in the next "
-"step. If you ask for less than 0 (resp. more than 4), everything will be as "
-"if you had asked for 0 (resp. 4)."
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl1_lander_101/Lander101.html:27
-msgid ""
-"In order to take informed decisions, you can query the lander's state. In "
-"this simulation you'll probably be interested in its vertical position: "
-"<code>[!java]double [/!]getY()[!scala]:Double[/!]</code>, and its vertical "
-"speed: <code>[!java]double [/!]getSpeedY()[!scala]:Double[/!]</code>. You "
-"can also ask for the thrust via <code>[!java]int [/!]getThrust()[!scala]:"
-"Integer[/!]</code> in case you don't remember what you asked for. Remember "
-"that Mars' gravity is 3.711 m/s², it might come in handy."
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl1_lander_101/Lander101.html:35
-msgid ""
-"One last thing: the lander is pretty small so you don't have much fuel. At "
-"each step of the simulation the lander consumes as many fuel units as the "
-"current thrust. Once you run out of fuel you're in free fall so beware! You "
-"can consult the remaining amount of available fuel units using <code>[!"
-"java]int [/!]getFuel()[!scala]:Integer[/!]</code>."
-msgstr ""
-
-#. type: Content of: <h2>
-#: src/lessons/lander/lvl2_locate_landing_zone/LocateLandingZone.html:2
-msgid "Locate a Landing Zone"
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl2_locate_landing_zone/LocateLandingZone.html:4
-msgid ""
-"After 200 days of traveling space and eating cereals you finally reach Mars. "
-"Time to land at last!"
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl2_locate_landing_zone/LocateLandingZone.html:7
-msgid ""
-"The lander is on autopilot and all you have to do is look around and tell it "
-"where to land. The lander must <b>land on a flat zone</b> it you want to "
-"remain in one piece. You indicate the lander where to land by modifying the "
-"<code>getLandingZone</code> function so that it returns a [!java|"
-"scala]<code>Segment</code> representing the zone of your choice."
-msgstr ""
-
-#. type: Content of: <p><p>
-#: src/lessons/lander/lvl2_locate_landing_zone/LocateLandingZone.html:13
-msgid ""
-"A segment is composed of two <code>Point</code>s, each of them composed of "
-"two <code>double</code>s. A segment is built via the <code>Segment([!"
-"java]Point [/!]start[!scala]:Point[/!], [!java]Point [/!]end[!scala]:"
-"Point[/!])</code> constructor.  A point is built via the <code>Point([!"
-"java]double [/!]x[!scala]:Double[/!], [!java]double [/!]y[!scala]:"
-"Double[/!])</code> constructor. A point's coordinates are accessible via its "
-"<code>[!java]double [/!]x()[!scala]:Double[/!]</code> and <code>[!"
-"java]double [/!]y()[!scala]:Double[/!]</code> methods."
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl2_locate_landing_zone/LocateLandingZone.html:18
-msgid ""
-"[/!] [!python]tuple of two X coordinates representing the zone of your "
-"choice.[/!]"
-msgstr ""
-
-#. type: Content of: <p><p>
-#: src/lessons/lander/lvl2_locate_landing_zone/LocateLandingZone.html:22
-msgid ""
-"In order to determine which zone to return, you'll need to call <code>[!"
-"java]List&lt;Point&gt; [/!]getGround()[!scala]List[Point][/!]</code>, which "
-"returns the vertices of the ground's profile as a list of [!java|"
-"scala]<code>Point</code>[/!] [!python]tuples (x,y)[/!]."
-msgstr ""
-
-#. type: Content of: <p><p>
-#: src/lessons/lander/lvl2_locate_landing_zone/LocateLandingZone.html:27
-msgid ""
-"One more thing: your function should return a valid flat zone in any kind of "
-"situation, not just for the currently visualized one. That's because it will "
-"be not only tested against that world, but also against the one we had in "
-"the previous exercise. As usual, you can see the other existing worlds with "
-"the appropriate combobox."
-msgstr ""
-
-#. type: Content of: <p><p>
-#: src/lessons/lander/lvl2_locate_landing_zone/LocateLandingZone.html:33
-msgid ""
-"Have a safe landing! Don't forget to put on your space suit on your way out."
-msgstr ""
-
-#. type: Content of: <h1>
-#: src/lessons/lander/lvl3_fly_the_lander/FlyTheLander.html:2
-msgid "Fly the Lander!"
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl3_fly_the_lander/FlyTheLander.html:4
-msgid ""
-"After 30 days of staring at rocks and eating cereals you decide it's time to "
-"go explore other parts of the planet."
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl3_fly_the_lander/FlyTheLander.html:7
-msgid ""
-"You fly for a while and suddenly realize you're almost out of fuel.  "
-"Unfortunately you're in a delicate situation and the autopilot is helpless.  "
-"You will have to pilot the lander yourself. Your mission is to <b>land the "
-"lander on a flat zone with a vertical speed less than 10 m/s, an horizontal "
-"speed less than 5 m/s and an angle of 0°.</b>"
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl3_fly_the_lander/FlyTheLander.html:13
-msgid ""
-"You must define two functions: <code>[!java]void [/!]initialize()</code> and "
-"<code>[!java]void [/!]step()</code>. <code>initialize()</code> is called "
-"once just after you press \"Run\". You can use it to chose some flat zone. "
-"As before, <code>step()</code> is called every 0.1 second and is used for "
-"adjusting the lander's thrust and angle. As in the first exercise the "
-"lander's thrust is adjusted via <code>[!java]void [/!]setDesiredThrust([!"
-"java]int [/!]desiredThrust[!scala]:Integer[/!])</code>.  But you can also "
-"control its angle via <code>[!java]void [/!]setDesiredAngle([!java]double "
-"[/!]desiredAngle[!scala]:Double[/!])</code>.  An angle of 0° denotes a "
-"vertical position where the \"head\" of the lander points up.  This is the "
-"angle you must land with. A positive angle denotes a left-leaning lander, a "
-"negative angle a right-leaning one. You cannot lean more than by ±90°, and "
-"the angle can vary by at most ±5° in one step."
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl3_fly_the_lander/FlyTheLander.html:26
-msgid ""
-"As in the previous exercise, <code>[!java]List&lt;Point&gt; [/!]getGround()[!"
-"scala]:List[Point][/!]</code> returns the vertices of the ground's profile "
-"from left to right.  Please refer to the documentation (Help/About this "
-"world) for a reference manual of your lunar lander."
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl3_fly_the_lander/FlyTheLander.html:30
-msgid ""
-"As before, your program must safely land the lander in all the situations "
-"encountered so far in addition to this new one."
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl3_fly_the_lander/FlyTheLander.html:33
-msgid "Good luck, try not to crash!"
-msgstr ""
-
-#. type: Content of: <h2>
 #: lib/doc/MainWindow.html:1
 msgid "The PLM Main Window"
 msgstr ""
@@ -14993,6 +14607,60 @@
 "it goes."
 msgstr ""
 
+#, fuzzy
+#~| msgid ""
+#~| "[!java]double [/!]divideByTwo([!java]double [/!]x[!scala]: Double[/!])[!scala]: Double =[/!] [!java|scala]{[/!][!python]:[/!]\n"
+#~| "     return x / 2[!java];[/!]\n"
+#~| "[!scala|java]}[/!]"
+#~ msgid ""
+#~ "[!java|c]double [/!]getSpeedX()[!scala]:Double[/!]\n"
+#~ "[!java|c]double [/!]getSpeedY()[!scala]:Double[/!]"
+#~ msgstr ""
+#~ "[!java]double [/!]divisionePerDue([!java]double [/!]x[!scala]: Double[/!])[!scala]: Double =[/!] [!java|scala]{[/!][!python]:[/!]\n"
+#~ "     return x / 2[!java];[/!]\n"
+#~ "[!scala|java]}[/!]"
+
+#, fuzzy
+#~| msgid ""
+#~| "[!java]double [/!]divideByTwo([!java]double [/!]x[!scala]: Double[/!])[!scala]: Double =[/!] [!java|scala]{[/!][!python]:[/!]\n"
+#~| "     return x / 2[!java];[/!]\n"
+#~| "[!scala|java]}[/!]"
+#~ msgid ""
+#~ "[!java|c]double [/!]getAngle()[!scala]:Double[/!]\n"
+#~ "[!java|c]void [/!]setDesiredAngle([!java|c]double [/!]desiredAngle[!scala]:Double[/!])"
+#~ msgstr ""
+#~ "[!java]double [/!]divisionePerDue([!java]double [/!]x[!scala]: Double[/!])[!scala]: Double =[/!] [!java|scala]{[/!][!python]:[/!]\n"
+#~ "     return x / 2[!java];[/!]\n"
+#~ "[!scala|java]}[/!]"
+
+#, fuzzy
+#~| msgid "One letter before the end of the alphabet"
+#~ msgid "Get or set the angle of the lander."
+#~ msgstr "Ultima lettera dell'alfabeto"
+
+#, fuzzy
+#~| msgid ""
+#~| "[!java]double [/!]divideByTwo([!java]double [/!]x[!scala]: Double[/!])[!scala]: Double =[/!] [!java|scala]{[/!][!python]:[/!]\n"
+#~| "     return x / 2[!java];[/!]\n"
+#~| "[!scala|java]}[/!]"
+#~ msgid ""
+#~ "[!java|c]int [/!]getThrust()[!scala]:Int[/!]\n"
+#~ "[!java|c]void [/!]setDesiredThrust([!java|c]int [/!]thrust[!scala]:Int[/!])"
+#~ msgstr ""
+#~ "[!java]double [/!]divisionePerDue([!java]double [/!]x[!scala]: Double[/!])[!scala]: Double =[/!] [!java|scala]{[/!][!python]:[/!]\n"
+#~ "     return x / 2[!java];[/!]\n"
+#~ "[!scala|java]}[/!]"
+
+#, fuzzy
+#~| msgid "[!java]int[] T;[/!][!scala]var T:Array[Int][/!]"
+#~ msgid "[!java|c]int [/!]getFuel()[!scala]:Int[/!]"
+#~ msgstr "[!java]int[] T;[/!][!scala]var T:Array[Int][/!]"
+
+#, fuzzy
+#~| msgid "[!java]int[] T;[/!][!scala]var T:Array[Int][/!]"
+#~ msgid "[!java]List&lt;Point&gt; [/!]getGround()[! scala]:List[Point][/!]"
+#~ msgstr "[!java]int[] T;[/!][!scala]var T:Array[Int][/!]"
+
 #~ msgid "This code is then perfectly equivalent to the following one."
 #~ msgstr ""
 #~ "Il codice precedente è perfettamente equivalente a quello che segue:"
--- a/l10n/missions/plm.pot
+++ b/l10n/missions/plm.pot
@@ -7,7 +7,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2014-10-06 17:06+0200\n"
+"POT-Creation-Date: 2014-11-13 13:47+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -4175,7 +4175,7 @@
 msgstr ""
 
 #. type: Content of: <p>
-#: src/lessons/welcome/methods/picture/PatternPicture.html:11 src/lessons/lander/lvl1_lander_101/Lander101.html:41
+#: src/lessons/welcome/methods/picture/PatternPicture.html:11
 msgid "Good luck!"
 msgstr ""
 
@@ -6932,7 +6932,7 @@
 msgstr ""
 
 #. type: Content of: <h2>
-#: src/lessons/sort/dutchflag/universe/DutchFlagWorld.html:9 src/lessons/lander/universe/DelegatingLanderWorld.html:8
+#: src/lessons/sort/dutchflag/universe/DutchFlagWorld.html:9
 msgid "Provided functions"
 msgstr ""
 
@@ -7188,7 +7188,7 @@
 msgid ""
 "Your work is to help this poor guy sorting his stack by flipping the "
 "pancakes. Each pancake is defined by its radius and rank within the stack, "
-"where the bottom pancake is at rank 0, and the one above at rank 1."
+"with the top-most pancake is at rank 0, and the one below at rank 1."
 msgstr ""
 
 #. type: Content of: <p>
@@ -8151,7 +8151,7 @@
 msgstr ""
 
 #. type: Content of: <pre>
-#: src/plm/universe/turtles/TurtleWorld.html:22 src/lessons/lander/universe/DelegatingLanderWorld.html:10
+#: src/plm/universe/turtles/TurtleWorld.html:22
 #, no-wrap
 msgid ""
 "[!java|c]double [/!]getX()[!scala]:Double[/!]\n"
@@ -11345,367 +11345,6 @@
 msgstr ""
 
 #. type: Content of: <h2>
-#: src/lessons/lander/Main.html:2 src/lessons/lander/short_desc.html:2 src/lessons/lander/universe/DelegatingLanderWorld.html:2
-msgid "Lunar Lander"
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/Main.html:4 src/lessons/lander/short_desc.html:4
-msgid ""
-"In this lesson you pilot a lunar landing module in increasingly complex "
-"situations."
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/Main.html:7
-msgid ""
-"At each step of the simulation, the player issues a command controlling how "
-"much the angle and thrust of the lander should change"
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/Main.html:10
-msgid "Ideas concerning the progression of exercises:"
-msgstr ""
-
-#. type: Content of: <ul><li>
-#: src/lessons/lander/Main.html:12
-msgid ""
-"A lander in vertical position above flat ground, the player can only control "
-"thrust (done)"
-msgstr ""
-
-#. type: Content of: <ul><li>
-#: src/lessons/lander/Main.html:14
-msgid ""
-"A lander in vertical position not above flat ground, the player control "
-"thrust and angle (done)"
-msgstr ""
-
-#. type: Content of: <ul><li>
-#: src/lessons/lander/Main.html:16
-msgid ""
-"A lander with difficult angle and speed not above flat ground, the player "
-"control thrust and angle"
-msgstr ""
-
-#. type: Content of: <ul><li>
-#: src/lessons/lander/Main.html:18
-msgid ""
-"A lander with difficult angle and speed not above flat ground, with "
-"difficult ground, the player control thrust and angle"
-msgstr ""
-
-#. type: Content of: <ul><li>
-#: src/lessons/lander/Main.html:20
-msgid "Same with wind?"
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/short_desc.html:7
-msgid "This lesson assumes some basic programming and physics skills."
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:4
-msgid ""
-"In this universe you pilot a lunar lander. At each simulation step you're "
-"given the lander's position, speed, angle and thrust and must issue a "
-"command adjusting its angle and thrust."
-msgstr ""
-
-#. type: Content of: outside any tag (error?)
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:12
-msgid "Get the X and Y position of the lander."
-msgstr ""
-
-#. type: Content of: <pre>
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:13
-#, no-wrap
-msgid ""
-"[!java|c]double [/!]getSpeedX()[!scala]:Double[/!]\n"
-"[!java|c]double [/!]getSpeedY()[!scala]:Double[/!]"
-msgstr ""
-
-#. type: Content of: outside any tag (error?)
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:15
-msgid "Get the horizontal and vertical speed of the lander."
-msgstr ""
-
-#. type: Content of: <pre>
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:17
-#, no-wrap
-msgid ""
-"[!java|c]double [/!]getAngle()[!scala]:Double[/!]\n"
-"[!java|c]void [/!]setDesiredAngle([!java|c]double "
-"[/!]desiredAngle[!scala]:Double[/!])"
-msgstr ""
-
-#. type: Content of: outside any tag (error?)
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:19
-msgid "Get or set the angle of the lander."
-msgstr ""
-
-#. type: Content of: outside any tag (error?)
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:20
-msgid ""
-"An angle of 0° denotes a vertical position where the \"head\" of the lander "
-"points up.  This is the angle you must land with. A positive angle denotes a "
-"left-leaning lander, a negative angle a right-leaning one. You cannot lean "
-"more than by ±90°, and the angle can vary by at most ±5° in one step."
-msgstr ""
-
-#. type: Content of: <pre>
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:25
-#, no-wrap
-msgid ""
-"[!java|c]int [/!]getThrust()[!scala]:Int[/!]\n"
-"[!java|c]void [/!]setDesiredThrust([!java|c]int [/!]thrust[!scala]:Int[/!])"
-msgstr ""
-
-#. type: Content of: outside any tag (error?)
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:27
-msgid "Get or set the thrust of the lander."
-msgstr ""
-
-#. type: Content of: outside any tag (error?)
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:27
-msgid ""
-"You can only increment or decrement the thrust by 1 between two simulation "
-"steps, so if the current thrust is 2 and you ask for 4, you'll only get 3 in "
-"the next step. If you ask for less than 0 (resp. more than 4), everything "
-"will be as if you had asked for 0 (resp. 4)."
-msgstr ""
-
-#. type: Content of: <pre>
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:33
-#, no-wrap
-msgid "[!java|c]int [/!]getFuel()[!scala]:Int[/!]"
-msgstr ""
-
-#. type: Content of: outside any tag (error?)
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:34
-msgid ""
-"Get the remaining fuel in the lander.  At each step of the simulation the "
-"lander consumes as many fuel units as the current thrust. Once you run out "
-"of fuel you're in free fall so beware!"
-msgstr ""
-
-#. type: Content of: <pre>
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:38
-#, no-wrap
-msgid "[!java]List&lt;Point&gt; [/!]getGround()[! scala]:List[Point][/!]"
-msgstr ""
-
-#. type: Content of: outside any tag (error?)
-#: src/lessons/lander/universe/DelegatingLanderWorld.html:39
-msgid ""
-"Get the vertices of the ground's profile from left to right.  "
-"[!java|scala]You can retrieve the X and Y coordinates of each point with the "
-"corresponding methods of your point: <code>p.x()</code> and "
-"<code>p.y()</code>.[!/] [!python]Each point is an array of two integers "
-"denoting respectively the X and Y coordinates of that point.[/!]"
-msgstr ""
-
-#. type: Content of: <h1>
-#: src/lessons/lander/lvl1_lander_101/Lander101.html:2
-msgid "Lander 101"
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl1_lander_101/Lander101.html:4
-msgid ""
-"Congratulations! You won a (one-way) trip to Mars in a cereal box. NASA was "
-"kind enough to donate the Lunar Excursion Module for this mission, so that's "
-"what you'll be flying."
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl1_lander_101/Lander101.html:8
-msgid ""
-"Before you take off, you must go through some basic landing simulation. You "
-"shouldn't have to fly the lander if all goes as planned but, as they say, "
-"\"better safe than sorry\"."
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl1_lander_101/Lander101.html:12
-msgid ""
-"Your mission is to <b>land the lander with a vertical speed of at most 10 "
-"m/s.</b> There are two ways you can influence the lander's course: by "
-"adjusting its angle or by adjusting its thrust. In this simulation we only "
-"care about adjusting the thrust, expressed in m/s²."
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl1_lander_101/Lander101.html:17
-msgid ""
-"The [!python]<code>step()</code> function[/!][!scala|java|c]code[/!] that "
-"you should write now will be called every 0.1 second during the "
-"simulation. It should set the desired thrust of the next simulation step, by "
-"calling <code>[!java]void [/!]setDesiredThrust([!java]int "
-"[/!]desiredThrust[!scala]:Integer[/!])</code> where "
-"<code>desiredThrust</code> is some integer between 0 and 4 (that is, a "
-"thrust between 0 m/s² and 4 m/s²). You can only increment or decrement the "
-"thrust by 1 between two simulation steps, so if the current thrust is 2 and "
-"you ask for 4, you'll only get 3 in the next step. If you ask for less than "
-"0 (resp. more than 4), everything will be as if you had asked for 0 "
-"(resp. 4)."
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl1_lander_101/Lander101.html:27
-msgid ""
-"In order to take informed decisions, you can query the lander's state. In "
-"this simulation you'll probably be interested in its vertical position: "
-"<code>[!java]double [/!]getY()[!scala]:Double[/!]</code>, and its vertical "
-"speed: <code>[!java]double [/!]getSpeedY()[!scala]:Double[/!]</code>. You "
-"can also ask for the thrust via <code>[!java]int "
-"[/!]getThrust()[!scala]:Integer[/!]</code> in case you don't remember what "
-"you asked for. Remember that Mars' gravity is 3.711 m/s², it might come in "
-"handy."
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl1_lander_101/Lander101.html:35
-msgid ""
-"One last thing: the lander is pretty small so you don't have much fuel. At "
-"each step of the simulation the lander consumes as many fuel units as the "
-"current thrust. Once you run out of fuel you're in free fall so beware! You "
-"can consult the remaining amount of available fuel units using "
-"<code>[!java]int [/!]getFuel()[!scala]:Integer[/!]</code>."
-msgstr ""
-
-#. type: Content of: <h2>
-#: src/lessons/lander/lvl2_locate_landing_zone/LocateLandingZone.html:2
-msgid "Locate a Landing Zone"
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl2_locate_landing_zone/LocateLandingZone.html:4
-msgid ""
-"After 200 days of traveling space and eating cereals you finally reach "
-"Mars. Time to land at last!"
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl2_locate_landing_zone/LocateLandingZone.html:7
-msgid ""
-"The lander is on autopilot and all you have to do is look around and tell it "
-"where to land. The lander must <b>land on a flat zone</b> it you want to "
-"remain in one piece. You indicate the lander where to land by modifying the "
-"<code>getLandingZone</code> function so that it returns a "
-"[!java|scala]<code>Segment</code> representing the zone of your choice."
-msgstr ""
-
-#. type: Content of: <p><p>
-#: src/lessons/lander/lvl2_locate_landing_zone/LocateLandingZone.html:13
-msgid ""
-"A segment is composed of two <code>Point</code>s, each of them composed of "
-"two <code>double</code>s. A segment is built via the "
-"<code>Segment([!java]Point [/!]start[!scala]:Point[/!], [!java]Point "
-"[/!]end[!scala]:Point[/!])</code> constructor.  A point is built via the "
-"<code>Point([!java]double [/!]x[!scala]:Double[/!], [!java]double "
-"[/!]y[!scala]:Double[/!])</code> constructor. A point's coordinates are "
-"accessible via its <code>[!java]double [/!]x()[!scala]:Double[/!]</code> and "
-"<code>[!java]double [/!]y()[!scala]:Double[/!]</code> methods."
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl2_locate_landing_zone/LocateLandingZone.html:18
-msgid ""
-"[/!] [!python]tuple of two X coordinates representing the zone of your "
-"choice.[/!]"
-msgstr ""
-
-#. type: Content of: <p><p>
-#: src/lessons/lander/lvl2_locate_landing_zone/LocateLandingZone.html:22
-msgid ""
-"In order to determine which zone to return, you'll need to call "
-"<code>[!java]List&lt;Point&gt; "
-"[/!]getGround()[!scala]List[Point][/!]</code>, which returns the vertices of "
-"the ground's profile as a list of [!java|scala]<code>Point</code>[/!] "
-"[!python]tuples (x,y)[/!]."
-msgstr ""
-
-#. type: Content of: <p><p>
-#: src/lessons/lander/lvl2_locate_landing_zone/LocateLandingZone.html:27
-msgid ""
-"One more thing: your function should return a valid flat zone in any kind of "
-"situation, not just for the currently visualized one. That's because it will "
-"be not only tested against that world, but also against the one we had in "
-"the previous exercise. As usual, you can see the other existing worlds with "
-"the appropriate combobox."
-msgstr ""
-
-#. type: Content of: <p><p>
-#: src/lessons/lander/lvl2_locate_landing_zone/LocateLandingZone.html:33
-msgid "Have a safe landing! Don't forget to put on your space suit on your way out."
-msgstr ""
-
-#. type: Content of: <h1>
-#: src/lessons/lander/lvl3_fly_the_lander/FlyTheLander.html:2
-msgid "Fly the Lander!"
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl3_fly_the_lander/FlyTheLander.html:4
-msgid ""
-"After 30 days of staring at rocks and eating cereals you decide it's time to "
-"go explore other parts of the planet."
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl3_fly_the_lander/FlyTheLander.html:7
-msgid ""
-"You fly for a while and suddenly realize you're almost out of fuel.  "
-"Unfortunately you're in a delicate situation and the autopilot is helpless.  "
-"You will have to pilot the lander yourself. Your mission is to <b>land the "
-"lander on a flat zone with a vertical speed less than 10 m/s, an horizontal "
-"speed less than 5 m/s and an angle of 0°.</b>"
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl3_fly_the_lander/FlyTheLander.html:13
-msgid ""
-"You must define two functions: <code>[!java]void [/!]initialize()</code> and "
-"<code>[!java]void [/!]step()</code>. <code>initialize()</code> is called "
-"once just after you press \"Run\". You can use it to chose some flat "
-"zone. As before, <code>step()</code> is called every 0.1 second and is used "
-"for adjusting the lander's thrust and angle. As in the first exercise the "
-"lander's thrust is adjusted via <code>[!java]void "
-"[/!]setDesiredThrust([!java]int "
-"[/!]desiredThrust[!scala]:Integer[/!])</code>.  But you can also control its "
-"angle via <code>[!java]void [/!]setDesiredAngle([!java]double "
-"[/!]desiredAngle[!scala]:Double[/!])</code>.  An angle of 0° denotes a "
-"vertical position where the \"head\" of the lander points up.  This is the "
-"angle you must land with. A positive angle denotes a left-leaning lander, a "
-"negative angle a right-leaning one. You cannot lean more than by ±90°, and "
-"the angle can vary by at most ±5° in one step."
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl3_fly_the_lander/FlyTheLander.html:26
-msgid ""
-"As in the previous exercise, <code>[!java]List&lt;Point&gt; "
-"[/!]getGround()[!scala]:List[Point][/!]</code> returns the vertices of the "
-"ground's profile from left to right.  Please refer to the documentation "
-"(Help/About this world) for a reference manual of your lunar lander."
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl3_fly_the_lander/FlyTheLander.html:30
-msgid ""
-"As before, your program must safely land the lander in all the situations "
-"encountered so far in addition to this new one."
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/lander/lvl3_fly_the_lander/FlyTheLander.html:33
-msgid "Good luck, try not to crash!"
-msgstr ""
-
-#. type: Content of: <h2>
 #: lib/doc/MainWindow.html:1
 msgid "The PLM Main Window"
 msgstr ""
--- a/po4a.conf
+++ b/po4a.conf
@@ -242,11 +242,5 @@
 [type: html] src/lessons/bat/string1/StringX.html       $lang:src/lessons/bat/string1/StringX.$lang.html
 [type: html] src/lessons/bat/string1/StringYak.html     $lang:src/lessons/bat/string1/StringYak.$lang.html
 
-[type: html] src/lessons/lander/Main.html        			$lang:src/lessons/lander/Main.$lang.html
-[type: html] src/lessons/lander/short_desc.html  			$lang:src/lessons/lander/short_desc.$lang.html
-[type: html] src/lessons/lander/universe/DelegatingLanderWorld.html     $lang:src/lessons/lander/universe/DelegatingLanderWorld.$lang.html
-[type: html] src/lessons/lander/lvl1_lander_101/Lander101.html		$lang:src/lessons/lander/lvl1_lander_101/Lander101.$lang.html
-[type: html] src/lessons/lander/lvl2_locate_landing_zone/LocateLandingZone.html $lang:src/lessons/lander/lvl2_locate_landing_zone/LocateLandingZone.$lang.html
-[type: html] src/lessons/lander/lvl3_fly_the_lander/FlyTheLander.html	$lang:src/lessons/lander/lvl3_fly_the_lander/FlyTheLander.$lang.html
 
 [type: html] lib/doc/MainWindow.html	$lang:lib/doc/MainWindow.$lang.html
--- /dev/null
+++ b/src/lessons/maze/island/IslandMaze.pt_BR.html
@@ -0,0 +1,75 @@
+
+<!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
+<h2>Lost between islands</h2>
+
+<p>You thought that your algorithm was enough to escape mazes? Well, not every
+mazes...
+</p>
+
+<p>The <i>wall follower algorithm</i> we used so far only works if the entry
+and the exit are placed near to walls connected to the external wall. But if
+the buggle begins in the middle of the maze, it may exist wall sections
+disconnected from the external wall.
+
+<p>That is why the previous strategy would let the buggle round around for
+ever. Indeed, the maze you should now escape from contains islands, and the
+buggle does not start along one of the external walls. Just give it a try if
+you want: copy your code over, push the run button and see your previous
+solution failing miserabily.</p>
+
+<p>The method of following a wall is still good and allow to escape very
+efficiently some sections of the maze, so we do not want to remove it
+entierely. Instead, we want to stop following the wall under some
+conditions. Notice that the baggle lays near to the external border of the
+maze. So, we want to reach the border and then follow that wall. We need for
+example to search for the north wall before following it to the baggle.
+
+<p>To find the north wall, you simply run to the north as long as it's
+possible, and when facing an obstacle, you avoid it (using previous method).</p>
+
+<div class="tip" id="tip-1" alt="I'm lost now, please give me some extra indications">
+	Our new run() method will consist in two modes: our buggle will alternate
+between the "north runner mode" and the "left follower mode". You begin in
+"north runner mode", and switch to "left follower" when you have a wall at
+the north (do not forget to make sure you have a wall at your left before
+switching to "left follower" mode). You switch to "north runner" as soon as
+your buggle is facing north and is not in front of a wall during its trip
+around its left wall. The easiest way to write such a state machine is
+something like 
+<pre>[!scala]var state=0;
+state match  {
+  case 0 => // North runner
+     ...
+     state = 1;
+  case 1 => // Left follower
+     ...
+     state = 0;
+  case _ => println("This case should not happen. Please fix me")
+}[/!][!java|c]int state=0;
+switch (state) {
+  case 0: // North runner
+     ...
+     state = 1;
+     break;
+  case 1: // Left follower
+     ...
+     state = 0;
+     break;
+}[/!][!python]northRunner = True
+if northRunner:
+     ...
+     northRunner = False
+else: # left follower
+     ...
+     northRunner = True[/!]</pre>
+     
+[!scala]<br/>Don't forget the default case (matching _), or scala will issue an error
+since your matching would be incomplete.[/!]
+</div>
+	
+<p>Don't forget to let the buggle pick the baggle at the end of your code.</p>
+	
+	
+<p>You're up. That should be enough for you to figure out how to escape this
+maze, but if not, you can always request for the tip. But you do not need
+any more help, do you?</p>
--- /dev/null
+++ b/src/lessons/maze/short_desc.pt_BR.html
@@ -0,0 +1,7 @@
+
+<!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
+<h3>Labyrinths</h3>
+
+<p>This lesson proposes several exercises about labyrinths in the buggle world.</p>
+
+<p>Para fazer esta lição você deve dominar as bases da programação.</p>
--- /dev/null
+++ b/src/lessons/recursion/cons/AllDifferent.fr.html
@@ -0,0 +1,11 @@
+
+<!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
+<h1>Tous différents</h1>
+Étant donnée une [!scala]List[Int][/!][java|python]liste récursive[/!],
+retournez <code>false</code> si deux éléments ont la même valeur, et
+<code>true</code> si tous les éléments sont différents deux à deux.
+
+<p>La solution la plus simple est en O(n²), ce qui veut dire qu'elle s'exécute
+en temps quadratique. Vous aurez probablement besoin de définir une fonction
+supplémentaire pour cela. Une autre solution bien plus complexe s'exécute en
+O(n log(n)).</p>
--- a/src/lessons/recursion/cons/ButLast.fr.html
+++ b/src/lessons/recursion/cons/ButLast.fr.html
@@ -1,8 +1,8 @@
 
 <!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
 <h1>Sauf Dernier</h1>
-Given a [!scala]List[Int][/!][!java|python]recursive list[/!], return the
-list containing every elements but the last one.  You can assume that the
-list is not empty.
+Étant donnée une [!scala]List[Int][/!][java|python]liste
+récursive[/!],retournez la liste contenant tous ses éléments sauf le
+dernier. Vous pouvez supposer que la liste n'est pas vide.
 
-<p>Your solution should be linear in time.</p>
+<p>Votre solution devrait être linéaire en temps.</p>
--- /dev/null
+++ b/src/lessons/recursion/cons/ButNfirst.fr.html
@@ -0,0 +1,8 @@
+
+<!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
+<h1>Sauf nPremiers</h1>
+Étant donnée une [!scala]List[Int][/!][java|python]liste récursive[/!] et un
+entier <code>N</code>, retournez la liste privée de ses <code>N</code>
+premiers éléments. 
+
+<p>Votre solution devrait être linéaire en temps.</p>
--- /dev/null
+++ b/src/lessons/recursion/cons/ButNlast.fr.html
@@ -0,0 +1,14 @@
+
+<!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
+<h1>Sauf nDerniers</h1>
+Étant donnée une [!scala]List[Int][/!][java|python]liste récursive[/!] et un
+entier <code>N</code>, retournez la liste privée de ses <code>N</code>
+derniers éléments.
+
+<p>Votre solution devrait être linéaire en temps, mais vous aurez probablement
+besoin de définir plusieurs fonctions pour atteindre cette complexité.</p>
+
+<div class="tip" id="tip-1" alt="Je n'arrive pas à le faire en temps linéaire">
+L'astuce est de calculer une seule fois (et à l'avance) combien d'éléments
+il faut garder.
+</div>
\ No newline at end of file
--- /dev/null
+++ b/src/lessons/recursion/cons/Concat.fr.html
@@ -0,0 +1,14 @@
+
+<!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
+<h1>Concaténation</h1>
+Étant donnée deux [!scala]List[Int][/!][java|python]listes récursives[/!]
+<code>l1</code> et <code>l2</code>, retournez la liste constituée de tous
+les éléments de <code>l1</code> suivis de tous les éléments de
+<code>l2</code>. 
+
+<p>Your solution should be linear in time, with the help of helper functions.</p>
+
+<div class="tip" id="tip-1" alt="Je n'arrive pas à le faire en temps linéaire">
+Il faut modifier <code>l1</code> au préalable pour s'assurer que chaque
+étape récursive soit en temps constant.
+</div>
\ No newline at end of file
--- /dev/null
+++ b/src/lessons/recursion/cons/Increasing.fr.html
@@ -0,0 +1,9 @@
+
+<!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
+<h1>Croissante</h1>
+Étant donnée une [!scala]List[Int][/!][java|python]liste
+récursive[/!],retournez <code>true</code> si ses éléments forment une suite
+croissante (c'est-à-dire si ses éléments sont classés du plus petit au plus
+grand). 
+
+<p>Votre solution devrait être linéaire en temps.</p>
--- /dev/null
+++ b/src/lessons/recursion/cons/IsMember.fr.html
@@ -0,0 +1,8 @@
+
+<!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
+<h1>EstMembre</h1>
+Étant donnée une [!scala]List[Int][/!][java|python]liste récursive[/!] et un
+entier,retournez <code>true</code> si cet entier fait partie des éléments de
+la liste, et <code>false</code> sinon.
+
+<p>Votre solution devrait être linéaire en temps.</p>
--- a/src/lessons/recursion/cons/Last.fr.html
+++ b/src/lessons/recursion/cons/Last.fr.html
@@ -1,7 +1,8 @@
 
 <!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
 <h1>Dernier</h1>
-Given a [!scala]List[Int][/!][!java|python]recursive list[/!], return its
-last element.  You can assume that the list is not empty.
+Étant donnée une [!scala]List[Int][/!][java|python]liste
+récursive[/!],retournez son dernier élément. Vous pouvez supposer que la
+liste n'est pas vide.
 
-<p>Your solution should be linear in time.</p>
+<p>Votre solution devrait être linéaire en temps.</p>
--- /dev/null
+++ b/src/lessons/recursion/cons/Length.fr.html
@@ -0,0 +1,8 @@
+
+<!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
+<h1>Longueur</h1>
+Étant donnée une [!scala]List[Int][/!][java|python]liste récursive[/!]
+retournez sa longueur[!scala], sans utiliser la méthode <code>size</code> de
+la liste, bien entendu[/!].
+
+<p>Votre solution devrait être linéaire en temps.</p>
--- a/src/lessons/recursion/cons/Main.fr.html
+++ b/src/lessons/recursion/cons/Main.fr.html
@@ -1,24 +1,28 @@
 
 <!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
 <h1>Algorithmes récursifs</h1>
-<p>This lesson contains a bunch of classical exercises on recursive lists.  It
-is certainly not the most pleasant lesson to do, but I think that it is the
-easiest of the PLM lessons dealing with recursion.</p>
+<p>Cette leçon propose un paquet d'exercices classiques sur les listes
+récursives. Il ne s'agit certainement pas de la leçon la plus drôle de la
+PLM, mais il s'agit certainement de la plus simple des leçons PLM sur la
+récursivité.</p>
 
 <p>Comme souvent, plusieurs points pourraient être améliorés dans le code de
 cet univers pour l'améliorer&nbsp;:</p>
 
 <ul>
-<li>New exercises could be proposed, such as
+<li>De nouveaux exercices pourraient être proposés, par exemple inspirés de
 http://webloria.loria.fr/~quinson/Teaching/TOP/02-td-recursivite-enonce.pdf
-If you know some others, please report them as an issue.</li>
-<li>It would be interesting to check the asymptotic complexity of the student's
-code, but that does not sound easy to do. In Python and Java (where we
-provide a hand-made RecList class), we could count the amount of cons per
-exercise, but it won't be easy to relate this to the right BatTest. For
-Scala, it sounds even more difficult as we use the classical :: operators of
-the language. That will be difficult to override to add a counting
-mechanism. Another solution would be to ensure that the call stack does not
-pass a given threshold, but that sounds very difficult too. Any idea is
-welcome.</li>
+Si vous en connaissez d'autres, nous vous serions reconnaissant de nous en
+parler dans un rapport d'anomalie.</li>
+<li>Il serait intéressant de vérifier la complexité algorithmique du code
+proposé par les étudiants, mais cela semble assez difficile à faire. En
+Python et Java, nous proposons un type de donnée spécifique (les
+<code>RecList</code>) alors nous pourrions compter le nombre de cons
+réalisés dans chaque exercice, mais il risque d'être compliqué de trouver le
+test auquel rattacher chaque opération. En Scala, cela s'annonce encore plus
+difficile car nous utilisons directement des mots-clés du langage. Il serait
+probablement difficile d'y injecter un mécanisme comptant les opérations. On
+pourrait vouloir assurer que la pile d'appel ne dépasse pas une profondeur
+donnée, mais cela semble également difficile à implémenter. Si vous avez des
+idées, merci de nous en faire part.</li>
 <ul>
--- /dev/null
+++ b/src/lessons/recursion/cons/Main.pt_BR.html
@@ -0,0 +1,24 @@
+
+<!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
+<h1>Recursive Lists</h1>
+<p>This lesson contains a bunch of classical exercises on recursive lists.  It
+is certainly not the most pleasant lesson to do, but I think that it is the
+easiest of the PLM lessons dealing with recursion.</p>
+
+<p>Como sempre, existem várias coisas que podem ser feitas no código
+deste universo para melhorá-lo:</p>
+
+<ul>
+<li>New exercises could be proposed, such as
+http://webloria.loria.fr/~quinson/Teaching/TOP/02-td-recursivite-enonce.pdf
+If you know some others, please report them as an issue.</li>
+<li>It would be interesting to check the asymptotic complexity of the student's
+code, but that does not sound easy to do. In Python and Java (where we
+provide a hand-made RecList class), we could count the amount of cons per
+exercise, but it won't be easy to relate this to the right BatTest. For
+Scala, it sounds even more difficult as we use the classical :: operators of
+the language. That will be difficult to override to add a counting
+mechanism. Another solution would be to ensure that the call stack does not
+pass a given threshold, but that sounds very difficult too. Any idea is
+welcome.</li>
+<ul>
--- /dev/null
+++ b/src/lessons/recursion/cons/Min.fr.html
@@ -0,0 +1,9 @@
+
+<!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
+<h1>Min</h1>
+Étant donnée une [!scala]List[Int][/!][java|python]liste
+récursive[/!],retournez la plus petite de ses valeurs. Vous aurez
+probablement besoin d'une fonction supplémentaire, mais vous pouvez supposer
+que la liste n'est pas vide. 
+
+<p>Votre solution devrait être linéaire en temps.</p>
--- /dev/null
+++ b/src/lessons/recursion/cons/Nfirst.fr.html
@@ -0,0 +1,11 @@
+
+<!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
+<h1>nPremiers</h1>
+Étant donnée une [!scala]List[Int][/!][java|python]liste récursive[/!] et un
+entier <code>N</code>, retournez la liste constituée de ses <code>N</code>
+premiers éléments. Vous pouvez supposer que la liste est suffisamment
+longue, c'est à dire qu'elle contient au moins <code>N</code> éléments.
+
+<p>Vous pouvez supposer que la liste est suffisamment longue, c'est à dire
+qu'elle contient au moins <code>N</code> éléments. Votre solution devrait
+être linéaire en temps.</p>
--- /dev/null
+++ b/src/lessons/recursion/cons/Nlast.fr.html
@@ -0,0 +1,14 @@
+
+<!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
+<h1>nDerniers</h1>
+Étant donnée une [!scala]List[Int][/!][java|python]liste récursive[/!] et un
+entier <code>N</code>, retournez la liste constituée de ses <code>N</code>
+derniers éléments. 
+
+<p>Votre solution devrait être linéaire en temps, mais vous aurez probablement
+besoin de définir plusieurs fonctions pour atteindre cette complexité.</p>
+
+<div class="tip" id="tip-1" alt="Je n'arrive pas à le faire en temps linéaire">
+L'astuce est de calculer une seule fois (et à l'avance) combien d'éléments
+il faut garder.
+</div>
\ No newline at end of file
--- /dev/null
+++ b/src/lessons/recursion/cons/Nth.fr.html
@@ -0,0 +1,9 @@
+
+<!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
+<h1>Nième</h1>
+Given a [!scala]List[Int][/!][!java|python]recursive list[/!] and an integer
+<code>N</code>, return its <code>N</code>th element. 
+
+<p>Vous pouvez supposer que la liste est suffisamment longue, c'est à dire
+qu'elle contient au moins <code>N</code> éléments. Votre solution devrait
+être linéaire en temps.</p>
--- a/src/lessons/recursion/cons/Occurrence.fr.html
+++ b/src/lessons/recursion/cons/Occurrence.fr.html
@@ -1,9 +1,8 @@
 
 <!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
 <h1>Occurrences</h1>
-Given a [!scala]List[Int][/!][!java|python]recursive list[/!] and an
-integer, return the amount of occurrences of the given integer in the
-list. If the integer is not a member of the list, the function should thus
-return 0.
+Étant donnée une [!scala]List[Int][/!][java|python]liste récursive[/!] et un
+entier,retournez le nombre d'occurences de cet entier dans la liste. Si
+l'entier n'est pas membre de la liste, la fonction doit renvoyer 0.
 
-<p>Your solution should be linear in time.</p>
+<p>Votre solution devrait être linéaire en temps.</p>
--- /dev/null
+++ b/src/lessons/recursion/cons/PlusOne.fr.html
@@ -0,0 +1,8 @@
+
+<!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
+<h1>PlusUn</h1>
+Étant donnée une [!scala]List[Int][/!][java|python]liste
+récursive[/!],retournez une nouvelle liste dont les éléments sont ceux de
+votre paramètre, incrémentés de un.
+
+<p>Votre solution devrait être linéaire en temps.</p>
--- /dev/null
+++ b/src/lessons/recursion/cons/Remove.fr.html
@@ -0,0 +1,9 @@
+
+<!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
+<h1>Retire</h1>
+
+Given a [!scala]List[Int][/!][!java|python]recursive list[/!]
+<code>L</code>and an integer, return a new list containing all elements of L
+that are not equal to the value received as parameter. 
+
+<p>Votre solution devrait être linéaire en temps.</p>
--- a/src/lessons/recursion/cons/Reverse.fr.html
+++ b/src/lessons/recursion/cons/Reverse.fr.html
@@ -1,13 +1,14 @@
 
 <!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
 <h1>Inverse</h1>
-Given a [!scala]List[Int][/!][!java|python]recursive list[/!], return a new
-list with all elements in reverse order. 
+Étant donnée une [!scala]List[Int][/!][java|python]liste récursive[/!],
+retournez la liste constituée de ses éléments en ordre inverse. 
 
-<p>This function is very important and you should not pass that challenge.
-Your solution should be linear in time, with the help of helper functions.</p>
+<p>Cette fonction est très importante et vous ne devriez pas passer ce défi
+sans trouver la réponse, qui doit être linéaire grâce à l'aide de fonctions
+supplémentaires.</p>
 
-<div class="tip" id="tip-1" alt="I cannot do it in linear time">
-You need an helper function in which the result is accumulated (built) at
-each step.
+<div class="tip" id="tip-1" alt="Je n'arrive pas à le faire en temps linéaire">
+Il faut réaliser une fonction d'aide dont le résultat est accumulé
+(construit) à chaque étape.
 </div>
\ No newline at end of file
--- a/src/lessons/recursion/cons/universe/ConsWorld.fr.html
+++ b/src/lessons/recursion/cons/universe/ConsWorld.fr.html
@@ -9,26 +9,28 @@
 ConsWorld defines recursive lists of type <code>RecList</code>.[/!]
 [!scala]lists of integers (<code>List[Int]</code>).</p>
 
-<p>Any given such list is either the empty list (noted
-<code>[!scala]Nil[/!][!java]null[/!][!python]None[/!]</code>), or an integer
-followed by a list. If a list is not empty, you can retrieve its first
-integer with <code>list.head</code> and the list containing its other
-parameters with <code>list.tail</code>. Of course, the empty list has no
-head nor the tail, so trying to access these elements will result in an
-(unpleasant) error message.</p>
+<p>Une telle liste peut être soit la liste vide (notée
+<code>[!scala]Nil[/!][!java]null[/!][!python]None[/!]</code>), soit un
+entier suivi d'une liste. Si une liste n'est pas vide, vous pouvez retrouver
+son premier entier avec <code>list.head</code>. On dit qu'on extrait alors
+la tête de la liste.La liste contenant ses autres éléments (tous sauf la
+tête) peut être retrouvée avec <code>list.tail</code>. On dit qu'on extrait
+la suite de la liste.Bien entendu, la liste vide n'a ni tête ni suite, et
+vous ne devriez pas tenter d'accéder à ces éléments sous peine d'obtenir un
+message d'erreur (particulièrement déplaisant).</p>
 
-<p>To build your own list, you need to concatenate a head and a tail as
-follows: [!java|python]<code>cons(head, tail)</code>[/!]
-[!scala]<code>head::tail</code> Note that <code>::</code> is a generic
-operator in Scala to build lists.[/!]</p>
+<p>Pour construire votre propre liste, vous devez concaténer une tête et une
+suite comme suit : [!java|python]<code>cons(tête, suite)</code>[/!]
+[!scala]<code>tête::suite</code>. Il se trouve que <code>::</code> est un
+opérateur générique du langage Scala pour construire des listes.[/!]</p>
 
-<p>So, in summary, you can solve every exercises of this lesson with the
-following constructs.</p>
+<p>En résumé, vous pouvez résoudre tous les exercices de cette leçon avec les
+constructions suivantes :</p>
 
 <ul>
 <li><b>The empty string:</b> <pre>[!java|c]null[/!][!scala]Nil[/!][python]None[/!]</pre></li>
-<li><b>Get the first element of <code>l</code></b> <pre>l.head</pre></li>
-<li><b>Get the rest of the list</b>, when the first element is removed: <pre>l.tail</pre></li>
-<li><b>Build a list</b> from a <code>value</code> and a <code>list</code>:
-[!java|python]<pre>cons(value, list)</pre>[/!] [!scala]<pre>value::list</pre>[/!]</li>
+<li><b>Obtenir le premier élément de <code>l</code></b> <pre>l.head</pre></li>
+<li><b>Obtenir la suite de la liste</b>, privée de son premier élément: <pre>l.tail</pre></li>
+<li><b>Construire une liste</b> à partir d'une <code>valeur</code> et d'une
+<code>liste</code>: [!java|python]<pre>cons(valeur, liste)</pre>[/!] [!scala]<pre>valeur::liste</pre>[/!]</li>
 </ul>
--- a/src/lessons/recursion/koch/Koch.fr.html
+++ b/src/lessons/recursion/koch/Koch.fr.html
@@ -25,16 +25,17 @@
 
 <p>Le pseudo-code du cas général est le suivant :</p>
 <pre>
-  Draw recursively a smaller segment
-  Turn 60 degrees to the left
-  Draw recursively a smaller segment  
-  Turn 120 degrees to the right
-  Draw recursively a smaller segment
-  Turn 60 degrees to the left
-  Draw recursively a smaller segment
+Dessiner récursivement un segment plus petit
+Tourner à 60 degrés vers la gauche
+Dessiner récursivement un segment plus petit
+Tourner à 120 degrés vers la droite
+Dessiner récursivement un segment plus petit
+Tourner à 60 degrés vers la gauche
+Dessiner récursivement un segment plus petit
 </pre>
-<p>As you can see, the function forward() is not called from the recursive
-case, only in the base case when there is no recursive call.</p>
+<p>Comme vous pouvez le constater, la fonction avance() n'est pas appelée dans
+le cas récursif, mais seulement dans le cas de base, quand il n'y a plus
+d'appel récursif.</p>
 
 
 <p><div class="tip" id="tip-1" alt="TL;DR. Vous pouvez me dessiner tout ça ?">
--- /dev/null
+++ b/src/lessons/recursion/short_desc.pt_BR.html
@@ -0,0 +1,7 @@
+
+<!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
+<h3>Bases of recursion</h3>
+<p>Discover the recursive way of thinking by drawing trees and other figures
+with the Logo turtle.</p>
+
+<p>Para fazer esta lição você deve dominar as bases da programação.</p>
--- a/src/lessons/recursion/tree/Tree.fr.html
+++ b/src/lessons/recursion/tree/Tree.fr.html
@@ -15,17 +15,17 @@
 <p>Si le tronc d'un arbre mesure length à l'étage N, il mesure shrink*length à
 l'étage N+1.<p>
 
-<p>At the end, here is the pseudo-code of the general case (you should add the
-base case yourself):</p>
+<p>Au final, voici le pseudo-code du cas général de la récursivité (il manque
+bien sûr le cas de base, laissé en exercice).</p>
 <pre>
-  Move forward of the desired length
-  Draw (recursively) the right subtree
-  Draw (recursively) the left subtree
-  Move back to your initial position
+Avancer de la longueur désirée
+Dessiner (récursivement) le sous-arbre de droite
+Dessiner (récursivement) le sous-arbre de gauche
+Reculer de la longueur désirée pour retourner au point de départ
 </pre> 
-<p>Don't forget to add the base case to your code, or your buggle will enter an
-infinite loop.  Then, drawing the right subtree comes down to turn right and
-then draw the subtree.</p>
+<p>N'oubliez pas d'ajouter le cas de base dans votre code, ou la buggle va
+entrer en boucle infinie. De plus, dessiner le sous-arbre droit revient à
+tourner à droite puis dessiner un sous-arbre.</p>
 
 <p>Comme vous pouvez le voir, chaque étage de la récursion est représenté par
 une couleur distinctive. Pour cela, appelez la fonction
--- /dev/null
+++ b/src/lessons/sort/baseball/Main.pt_BR.html
@@ -0,0 +1,50 @@
+
+<!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
+<h1>The Rainbow Baseball Game</h1>
+
+<p>This activity is inspired from the orange game, from the "Computer Science
+Unplugged" activities repository.  It was however heavily since then, first
+for the CSIRL (my repository of <i>free</i> unplugged activities to
+introduce computer science, available at
+http://www.loria.fr/~quinson/Mediation/SMN/) and now for PLM.</p>
+
+<p>In the literature, the generalized form of this problem is known as the
+pebble motion problem (the bases can be connected by any kind of graph, and
+the affinity of pebbles with bases may be different). Another variant of
+this problem is the well known 15-puzzle, with one player per base, and a
+two dimensional square grid. Much more information about these problems can
+be found on wikipedia, as usual.</p>
+
+<h3>How do you know that the naive algorithm won't loop on that initial
+situation?</h3>
+
+<p>Well, we simply tested all possible situations to see when this algorithm
+loops and when it finds the correct solution. We found that it works for all
+situations where no player is at home (there is 84 such situations for 4
+bases, once you take the symmetries into account). It obviously works for
+some situations that do not respect this criteria (such as all situations it
+encounters from one of those 84 boards to the final state), but that's
+another story. Having such a criteria allows us to generate pseudo-random
+initial situations for the first exercise for which the algorithm we propose
+is guarenteed to work.</p>
+
+<p>We also explored bigger instances of the problem, and unfortunately, we have
+no such criteria for them.  With 5 bases, the algorithm wrongly loops for 24
+of the 1824 possible boards where no player is home (that's 1.31%).  With 6
+bases, it fails on 1251 of the 58860 such boards (2.12%). With 7 bases, it
+fails for 84444 out of 2633940 (that's 3.2%). I am still looking for a
+criteria ensuring that the algorithm won't loop. If you discover one, please
+report it. Ideally, it would be simple to enforce manually so that we can
+use it during our unplugged activities.</p>
+
+<h3>O que eu posso fazer para melhorar este universo do PLM?</h3>
+
+<p>Como sempre, existem várias coisas que podem ser feitas no código
+deste universo para melhorá-lo:</p>
+<ul>
+  <li>Other graphical representations could be proposed, such as a linear one (for
+the existing exercises) or other ones (such as a grid or a tree, if an
+exercise on this kind of graph proves interesting).</li>
+  <li>Other exercises on other algorithms on this variant, or on other variants
+such as the 15-puzzle.</li>
+</ul>
--- /dev/null
+++ b/src/lessons/sort/basic/Main.pt_BR.html
@@ -0,0 +1,24 @@
+
+<!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
+<h1>Algoritmos de Ordenação</h1>
+
+Esta lição permite a experimentação com alguns algoritmos de ordenação
+clássicos (e algumas variações menos comuns deles). E temos um duplo
+objetivo: você pode primeiro compreender melhor a ideia destes
+algoritmos escrevendo eles por si só. Mas mesmo se você não codificar
+os algoritmos, você pode usar o modo de demonstração para organizar
+"corridas" entre os algoritmos para experimentar na prática o que
+significam diferentes complexidades assintóticas. 
+
+<p>Mais exercícios estão previstos para o futuro, sobre os algoritmos de
+ordenação recursivos (como o QuickSort e o MergeSort) ou usando outros
+micromundos para aplicar estes algoritmos a outros contextos.</p>
+
+<h3>O que eu posso fazer para melhorar este universo do PLM?</h3>
+
+<p>Como sempre, existem várias coisas que podem ser feitas no código
+deste universo para melhorá-lo:</p>
+<ul>
+  <li>Outras representações gráficas podem ser propostas, como aquelas
+apresentadas em <a href="http://sorting.at/">http://sorting.at/</a>.</li>
+</ul>
--- a/src/lessons/sort/basic/bubble/AlgBubbleSort1.pt_BR.html
+++ b/src/lessons/sort/basic/bubble/AlgBubbleSort1.pt_BR.html
@@ -2,15 +2,16 @@
 <!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
 <h1>BubbleSort</h1>
 
-<p>Welcome to the sorting universe. It allows you to experiment with the
-existing sorting algorithms. The list of buildins that you can use in your
-algorithms is available in the world reference documentation
-("Help"-&gt;"About this world").</p>
+<p>Bem vindo ao universo da ordenação. Ele permite que você experimente
+os algoritmos de ordenação existentes. A lista de "buildins" que você
+pode usar nos seus algoritmos está disponível na documentação de
+referência do mundo ("Ajuda"-&gt;"Sobre este mundo").</p>
 
-<p>It is not enough to sort the array to pass the exercises. Your solution must
-strictly follow the expected behavior of each exercise. This is enforced by
-checking that your algorithm needs the same amount of read and write
-operations to sort the array. </p>
+<p>Não é suficiente ordenar a array para passar nos exercícios. Sua
+solução deve seguir estritamente o comportamento esperado em cada
+exercício. Isto é reforçado verificando que seu algoritmo precisa da
+mesma quantidade de operações de escrita e leitura para ordenar a
+array. </p>
 
 <p>When your algorithm diverges from the expectation, understanding the
 difference between your code and the expected solution can reveal very
--- /dev/null
+++ b/src/lessons/sort/basic/cocktail/AlgCocktailSort1.pt_BR.html
@@ -0,0 +1,27 @@
+
+<!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
+<h1>CocktailSort</h1>
+
+<p>Para melhorar ainda mais o algoritmo BubbleSort, precisamos ver seu
+comportamente bem de perto. Você pode perceber que os elementos
+grandes se movem bem rápido enquanto os pequenos se movem lentamente
+para seus destinos. Eles são então tradicionalmente chamados de
+"coelhos" e "tartarugas" respectivamente para valores grandes e
+rápidos e valores pequenos e lentos.</p>
+
+<p>Para ajudar as tartarugas a se mover rápido, o cocktail sort percorre
+alternativamente a array da direita para a esquerda e da esquerda para
+a direita. Aqui está o pseudo-código:</p>
+
+<pre>
+Do
+  For all i in [0,len-2], do:
+    if i and i+1 must be swapped, do it
+  For all i in [len-2,0] (downward), do:
+    if i and i+1 must be swapped, do it
+while at least one of the traversal swapped an element
+</pre>
+
+<p>One can see that cocktail sort achieves exactly the same amount of swaps
+than the bubble sort, but improves slightly on read amount. It is however
+still worse than BubbleSort2 to that extend.</p> 
--- /dev/null
+++ b/src/lessons/sort/basic/cocktail/AlgCocktailSort2.pt_BR.html
@@ -0,0 +1,19 @@
+
+<!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
+<h1>CocktailSort (take 2)</h1>
+
+<p>Vamos agora aplicar ao CocktailSort a mesma otimização que o
+BubbleSort2 faz no BubbleSort. Devemos lembrar que os limites da parte
+do array que não está ordenada ainda, e percorrer ela alternativamente
+da esquerda para a direita e da diretia para a esquerda:</p>
+<pre>
+beg=0; end=len-2
+do
+  For all Pour i in [beg,end], do:
+      If cells i and i+1 must be swapped, do it    
+  end -= 1 (this means end = end - 1)
+  For all Pour i in [beg,end] (downwards), do:
+      If cells i and i+1 must be swapped, do it    
+  beg += 1 (this means beg = beg + 1)
+while at least one of the traversal swapped an element
+</pre>
--- /dev/null
+++ b/src/lessons/sort/basic/cocktail/AlgCocktailSort3.pt_BR.html
@@ -0,0 +1,10 @@
+
+<!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
+<h1>CocktailSort (3o tempo)</h1>
+
+<p>Mesmo se a complexidade assintótica de CocktailSort2 for a mesma do
+BubbleSort, Ele parece melhor na prática. É até mesmo possível
+melhorar um pouco mais parando ele na primeira rodada que não
+encontrar nada para trocar, se realizar a rodada para baixo. Da mesma
+forma, podemos parar se a rodade para cima encontrar algo para trocar
+mas a rodada para baixo não.</p> 
--- a/src/lessons/sort/basic/comb/AlgCombSort.pt_BR.html
+++ b/src/lessons/sort/basic/comb/AlgCombSort.pt_BR.html
@@ -25,24 +25,27 @@
 while the gap is bigger than 1 or the last traversal swapped at least one pair
 </pre>
 
-[!scala]<p>One tricky part is that we want to divide gap, that is an integer (of type
-Int), by 1.3, that is a Double.  The type system of scala won't let us do
-this, because such discrepancy usually denotes a programmer error.  As this
-is not an error this time, we have to convert gap to Double for the time of
-the operation, and then convert the result back to Int to store it into
-gap. This should be written this way:</p>
+[!scala]<p>Um detalhe perigoso é que temos que dividir o intervalo, que é um
+inteiro (ou do tipo Int), por 1.3, que é um Double. O sistema de tipos
+do scala não nos deixa fazer isto, por que tal discrepância
+normalmente significa um erro de programação. Como isto não é um erro
+neste caso, vamos ter que converter o intervalo para Double para o
+momento da operação, e então converter o resultado de volta para Int
+para armazená-lo no intervalo. Isto deve ser escrito desta forma:</p>
 <pre>gap = (gap.asInstanceOf[Double] / 1.3).asInstanceOf[Int]</pre>
-<p>This is rather verbose, but actually, this notation is not very complex. And
-remember that the type checker is your friend. It's picky and sometimes
-annoying (as on this one), but it often catches weird bugs that would have
-been a pain to debug if not catch by the type checker. And since the Scala's
-authors are pragmatic, the previous expression can be simplified:</p>
+<p>Isto é meio exagerado, mas na verdade, esta notação não é muito
+complexa. E lembre que o verificador de sintaxe é seu amigo. Ele às
+vezes é chato e irritante (como neste caso), mas frequentemente pega
+bugs esquisitos que seriam trabalhosos para depurar se não fosse o
+verificador de sintaxe. E como os autores do Scala são pragmáticos, a
+expressão anterior pode ser simplificada:</p>
 <pre>gap = (gap.toDouble / 1.3).toInt</pre>
-<p><code>toDouble</code> and <code>toInt</code> are just shortcuts for the
-corresponding expressions <code>asInstanceOf[Double]</code> and
-<code>asInstanceOf[Int]</code>. It's not very generic, but it's very handy.</p>
+<p><code>toDouble</code> e <code>toInt</code> são apenas atalhos para as
+expressões correspondentes <code>asInstanceOf[Double]</code> e
+<code>asInstanceOf[Int]</code>. Não é muito genérico, mas é bem
+prático.</p>
 [/!]
 
-<p>This algorithm was invented by Wlodek Dobosiewicz in 1980, and later
-rediscovered and popularized by Stephen Lacey and Richard Box, who described
-it in Byte Magazine in April 1991.</p>
+<p>Este algoritmo foi inventanndo por Wlodek Dobosiewicz em 1980, e
+depois redescoberto e popularizado por Stephen Lacey e Richard Box,
+que o descreveram na Byte Magazine em Abril de 1991.</p>
--- /dev/null
+++ b/src/lessons/sort/basic/comb/AlgCombSort11.pt_BR.html
@@ -0,0 +1,9 @@
+
+<!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
+<h1>CombSort11</h1>
+ 
+<p>Os autores deste algoritmo observaram que o desempenho é aumentado se
+nos certificarmos que os últimos valores do intervalo são (11, 8, 6,
+4, 3, 2, 1) ao invés de (9, 6, 4, 3, 2, 1) ou (10, 7, 5, 3, 2,
+1). Retrabalhar o código do CombSort para garantir apenas que depois
+da atualização do intervalo que se ele for 9 ou 10, devemos usar 11.</p> 
--- /dev/null
+++ b/src/lessons/sort/basic/gnome/AlgGnomeSort.pt_BR.html
@@ -0,0 +1,17 @@
+
+<!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
+<h1>GnomeSort</h1>
+
+<p>O Gnome sort é similar ao insertion sort, mas os elementos são movidos
+de poisção por uma série de trocas que se parecem com o bubble sort. O
+nome veio do suposto comportamento que gnomos de jardim tem quando
+ordenam vasos de flores. Aqui está uma descrição do algoritmo por seu
+autor:</p>
+
+<p>Gnome Sort is based on the technique used by the standard Dutch Garden Gnome
+(Du.: tuinkabouter). Here is how a garden gnome sorts a line of flower
+pots. Basically, he looks at the flower pot next to him and the previous
+one; if they are in the right order he steps one pot forward, otherwise he
+swaps them and steps one pot backwards. Boundary conditions: if there is no
+previous pot, he steps forwards; if there is no pot next to him, he is
+done.  <i>—Dick Grune</i></p>
--- /dev/null
+++ b/src/lessons/sort/basic/insertion/AlgInsertionSort.pt_BR.html
@@ -0,0 +1,60 @@
+
+<!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
+<h1>InsertionSort</h1>
+
+<p>
+Este algoritmo de ordenação é muito simples de entender e escrever,
+mesmo se não for o mais eficiente possível. Sua complexidade
+assintótica é O(n2), mas ele é mais eficiente na prática (linear no
+melhor caso, ie quando a array já está ordenada, e N2/4 no caso
+médio).
+</p>
+<p>A ideia é percorrer todos os elementos da array, e inserir cada um
+deles em sua posição correta numa parte já ordenada da array. Quando
+nós olhamos para um elemento x, a situação é a seguinte: qualquer
+elemento da esquerda da array já está ordenado, e temos que inserir x
+na sua posição na array.</p>
+<div style="text-align:center">
+	<img src="lessons/sort/basic/insertion/InsertionsortBefore.png"/>
+</div>
+<p>Uma vez isto feito, a situação é a seguinte:</p>
+<div style="text-align:center">
+	<img src="lessons/sort/basic/insertion/InsertionsortAfter.png"/>
+</div>
+<p>O pseudo-código deste algoritmo é então o seguinte:</p>
+<pre>For each i in [1,len-1]
+  store the value of i in a variable v
+  copy the cell i-1 into i if i-1 contains a value bigger than v
+  copy the cell i-2 into i-1 if i-2 contains a value bigger than v
+  copy the cell i-3 into i-2 if i-3 contains a value bigger than v
+  copy the cell i-4 into i-3 if i-4 contains a value bigger than v
+  ...
+  copy v into the last cell copied above
+</pre>
+<p>
+Naturalmente, você deve usar um loop para escrever a grande permutação
+dentro do loop. Escrever ela desta forma deve ser na verdade
+... improdutivo.
+</p>
+<p>Se você já se perguntou o que cientistas da computação fazem nos dias
+de hoje, aqui está uma parte da resposta: Eles melhoram algoritmos
+fundamentais para que outras pessoas possam escrever programas
+eficientes.</p>
+
+<h2>Outra variação do insertion sort</h2>
+<p>
+TreeSort constrói uma árvore de busca binária para ordená-la. Ele
+consegue O(n log(n)) no caso médio, mas O(n^2) nos piores casos. Não
+vamos estudar este algoritmo aqui pois para entendê-lo temos que
+entender o que uma árvore binária é, o que está além de nossos
+objetivos atuais. 
+</p>
+<p>Existem variações do insertion sort, tais como o PatienceSort que
+constrói pilhas de valores e ordena cada pilha depois. Este algoritmo
+apresenta um tempo 0(n log(n)) no pior caso e uma complexidade de
+espaço de 0(n). LibrarySort (proposto em 2004) também troca um pouco
+de espaço por tempo já que tem uma complexidade de tempo de O(n
+log(n)) mas precisa armazenar um pouco mais de dados.</p>
+ 
+<p>A Wikipédia fornece uma descrição detalhada de cada um destes
+algoritmos que não apresentamos aqui devido a limitações de tempo.</p> 
--- /dev/null
+++ b/src/lessons/sort/basic/selection/AlgSelectionSort.pt_BR.html
@@ -0,0 +1,23 @@
+
+<!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
+<h1>Selection Sort</h1>
+
+Neste exercício vamos implementar outro algoritmo clássico: selection sort.
+
+<p>The idea is simply to select for each cell of the array the smallest value
+from the part not already sorted. Thus for the first cell, it takes the
+smallest value over the whole array. For the second one, it takes the second
+smallest value, which is the smallest value from the cell not already
+sorted. You of course don't have to sort the last cell of the array, that is
+already sorted when you consider it.
+
+<p>More generally, for the cell N, it looks the cell M in [N;len] containing
+the smallest possible value of the interval. Then, it swaps the content of
+cell N with the one of cell M. 
+
+<h2>Variações existentes</h2>
+Outro algoritmo clássico cuja ideia é baseada na seleção de bons
+elementos é o HeapSort, mas ele usa uma estrutura de dados heap que
+ainda não vimos. Simplesmente lembre que o HeapSort fornece um
+desempenho O(n log n) no pior caso, que é o motivo para ele ser bem
+interessante na prática. 
--- /dev/null
+++ b/src/lessons/sort/basic/shell/AlgShellSort.pt_BR.html
@@ -0,0 +1,48 @@
+
+<!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
+<h2>ShellSort</h2>
+ 
+This algorithm is named after its author, Donald Shell, who published it in
+1959. It can be seen as an application of the CombSort idea (let elements
+having a long path to travel take shortcuts) to the insertion sort (CombSort
+is a variation of BubbleSort). Instead of comparing adjacent values during
+the insertion sort, it compares values separated by a bigger gap. The bigger
+the gap, the faster the elements are moved to their final destination, but
+also the less precise is this move. It is thus mandatory to apply the
+algorithm with a serie of decreasing gaps. At the last step, when the gap is
+one, InsertionSort is used, but onto an array which is almost already sorted
+by previous steps.
+
+<p>Donald Shell propôs <code>len/2</code> como o valor inicial do
+intervalo, e ir dividindo por 2 a cada passo. O pseudo-código é o
+seguinte:
+<pre>
+gap=len/2
+while gap>0:
+  apply InsertionSort, comparing i-gap and i, then i-2gap and i-gap, then i-3gap and i-2gap, etc.
+</pre>
+
+<p>Assim como no CombSort, a sequência de valores pega pelo intervalo é
+crucial para a performance do Shell sort. Em alguns casos patológicos
+raros, a sequência que usamos pode levar a uma performance
+O(n^2). Outras sequências foram propostas: os incrementos de Hibbard
+de 2k − 1 levam a uma complexidade de O(n^(3/2)) em casos
+ruins. incrementos de Pratt 2^i3^j levam a uma performance de
+O(nlog(n)log(n) nos piores casos. A existência de uma sequência
+levando a O(n log(n)) foi excluída por Poonen, Plaxton e Suel. Graças
+a esta performance, ShellSort é um candidato válido para arrays de
+várias centenas de milhares quando corretamente implementado.</p>
+
+<p>No nosso caso, a array é pequena demais para se beneficiar destas
+otimizações. Se você ainda assim quiser, tome o intervalo inicial como
+o maior valor da série alvo ainda menor que o tamanho do array, e
+então use valores decrescentes da série.</p>
+
+<p>Determinar a melhor sequência de intervalos para o shell sort se
+tornou um tema de pesquisa de nosso século em ciência da
+computação. Por exemplo, um artigo de 2001 introduz a seguinte
+sequência, que parece ser a melhor na prática para arrays de tamanho
+até 10^5: {1, 4, 10, 23, 57, 132, 301, 701, 1750} (Marcin Ciura, Best
+Increments for the Average Case of Shellsort, 13th International
+Symposium on Fundamentals of Computation Theory, LNCS 2001;
+Vol. 2138).</p> 
--- /dev/null
+++ b/src/lessons/sort/basic/short_desc.pt_BR.html
@@ -0,0 +1,8 @@
+
+<!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
+<h3>Algoritmos de Ordenação</h3>
+
+<p>Esta lição permite a experimentação com alguns algotimos de ordenação
+clássicos (e algumas variantes menos comuns deles :)</p>
+
+<p>Para fazer esta lição você deve dominar as bases da programação.</p>
--- /dev/null
+++ b/src/lessons/sort/dutchflag/DutchFlagAlgo.pt_BR.html
@@ -0,0 +1,33 @@
+
+<!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
+<h1>O problema da bandeira holandesa</h1>
+
+<p>Your work is to sort all the colors of the Dutch flag, and the only provided
+primitive is to exchange two given lines.  In addition, you should not
+create any additional variables (but a few indices).</p>
+
+<p>If you think carefully, this can be done in linear time, where you sort a
+line at each iteration of the loop.  You may want to check again the <a
+href="plm://lessons.sort.basic/insertion.AlgInsertionSort">insertion
+sort</a>, of which the Dutch Flag sort is a variation. The main difference
+is that you have 3 insertion points, not only one...</p>
+
+ <div class="tip" id="tip-1" alt="I need an hint to start">
+ Do a traversal over your data, saving 3 indices:
+ <ul>
+  <li><code>afterBlue</code> is initialized to 0. Make sure that every cell below
+<code>afterBlue</code> is filled with blue elements.</li>
+  <li><code>whiteRed</code> is initialized to size-1. Make sure that every cell
+after <code>whiteRed</code> is filled with red elements.</li>
+  <li><code>beforeWhite</code> is initialized to size-1. Make sure that every cell
+after <code>beforeWhite</code> and before <code>whiteRed</code> is filled
+with while elements.</li>
+ </ul> 
+ Note that the unsorted cells are always between <code>afterBlue</code> and
+<code>beforeWhite</code>.<br/>
+ 
+ At each step of your traversal, check the color of the cell at
+<code>afterBlue</code> and do the required exchanges.  The loop ending
+condition is when <code>afterBlue</code> becomes larger than
+<code>beforeWhite</code>.<br/>
+ </div>
--- /dev/null
+++ b/src/lessons/sort/dutchflag/Main.pt_BR.html
@@ -0,0 +1,22 @@
+
+<!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
+<h1>O problema da bandeira holandesa</h1>
+
+<p>Este problema foi proposto primeiro por E.W Dijkstra em 1976 (no
+capítulo 14 de seu livro "A Discipline of Programming"). É uma
+variação clássica de algoritmos de ordenação desde então. Ele é às
+vezes útil em vida real, mas se tornou famosos por suas propriedades
+pedagógicas: sua complexidade não é trivial, mas não é muito
+complexo. Pode ser provados formalmente com facilidade, mas não é de
+forma alguma trivial. </p>  
+
+<h3>O que eu posso fazer para melhorar este universo do PLM?</h3>
+
+<p>Como sempre, existem várias coisas que podem ser feitas no código
+deste universo para melhorá-lo:</p>
+<ul>
+  <li>Uma visão temporal pode ser bem-vinda.</li>
+  <li>Outros exercícios, por exemplo com 2 cores apenas ou com mais de 3
+cores, podem generalizar a abordagem proposta.</li>
+  <li>This problem could be solved recursively.</li>
+</ul> 
--- /dev/null
+++ b/src/lessons/sort/dutchflag/short_desc.pt_BR.html
@@ -0,0 +1,6 @@
+
+<!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
+<h3>O problema da bandeira holandesa</h3>
+
+<p>This is a classical sorting problem, constituting a variation over the
+insertion sort.</p>
--- a/src/lessons/sort/dutchflag/universe/DutchFlagWorld.pt_BR.html
+++ b/src/lessons/sort/dutchflag/universe/DutchFlagWorld.pt_BR.html
@@ -1,6 +1,6 @@
 
 <!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
-<h1>The Dutch Flag Problem</h1>
+<h1>O problema da bandeira holandesa</h1>
 
 <h2>Provided values</h2>
 
--- a/src/lessons/sort/pancake/BasicPancake.fr.html
+++ b/src/lessons/sort/pancake/BasicPancake.fr.html
@@ -19,9 +19,10 @@
 sommet
 de la pile.</p>
 
-<p>Your work is to help this poor guy sorting his stack by flipping the
-pancakes. Each pancake is defined by its radius and rank within the stack,
-with the top-most pancake is at rank 0, and the one below at rank 1.</p>
+<p>Vous devez aider ce pauvre homme à trier sa pile en retournant des
+crêpes. Chaque crêpe est définie par son rayon et son rang dans la pile. La
+pile la plus haute est de rang 0, et celle placée au dessous d'elle est de
+rang 1.</p>
 
 <p>Il est conseillé de commencer par jouer physiquement avec des bouts de
 papier ou de carton pour bien comprendre le problème. C'est même l'une des
--- a/src/lessons/sort/pancake/Main.pt_BR.html
+++ b/src/lessons/sort/pancake/Main.pt_BR.html
@@ -33,10 +33,10 @@
 run the unplugged activities before implementing these algorithms in PLM.</p>
 
 
-<h3>What can I do to improve this PLM universe?</h3>
+<h3>O que eu posso fazer para melhorar este universo do PLM?</h3>
 
-<p>As usual, there are several things that could be done in the code of this
-universe to improve it:</p>
+<p>Como sempre, existem várias coisas que podem ser feitas no código
+deste universo para melhorá-lo:</p>
 <ul>
   <li>A temporal view similar to the sorting universe could be helpful</li>
   <li>Other exercises, for example on the Roti sorting, with a pile of Roti that
--- /dev/null
+++ b/src/lessons/turmites/Main.pt_BR.html
@@ -0,0 +1,36 @@
+
+<!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
+<h1>Os turmites</h1>
+
+<p>Este conjunto de atividades é para você brincar com formigas de
+Langton, que são máquinas de Turing 2D. Elas constituem problemas bem
+simples, bons para iniciantes, e abrem as portas para um mundo
+fantástico.</p>
+
+<p>Este mecanismo foi inventado em 1986 por Chris Langton, e depois
+generalizado em várias formas (como veremos nos próximos
+exercícios). Foi provado que Turmites e máquinas de Turing têm o mesmo
+poder: Uma trajetória de formiga pode ser usada para calcular qualquer
+circuito booleano, e logo uma formiga é capaz de qualquer cálculo
+universal. resumindo, qualquer cálculo possível pode ser alcançado
+usando uma turmite como dispocitivo computacional. Ainda outro assunto
+fascinante...</p>
+
+<p>formigas de Langton multicoloridas foram descobertas em 1995 por Propp
+et Al. Outro fato divertido é que as formigas cujos nomes é uma lista
+de pares consecutivos de letras idênticas (LL e RR) produzem padrões
+simétricos. Este fato foi até mesmo provado formalmente.</p>
+
+<p>Verifique a página da wikipédia correspondente, na qual este exercício
+é inspirado, para maiores detalhes.</p>
+
+<h3>O que eu posso fazer para melhorar este universo do PLM?</h3>
+
+<p>Como sempre, existem várias coisas que podem ser feitas no código
+deste universo para melhorá-lo:</p>
+<ul>
+  <li>Alguns bons exercícios estão provavelmente faltando. O exercício de
+criador de turmite é um pouco pé-duro: podemos introduzir os padrões
+de uma forma mais amigável.</li>
+  <li>Quem sabe não escrevemos um exercício sobre os busy beavers?</li>
+</ul>
--- a/src/lessons/turmites/helloturmite/HelloTurmite.pt_BR.html
+++ b/src/lessons/turmites/helloturmite/HelloTurmite.pt_BR.html
@@ -67,7 +67,7 @@
 construct to keep your code readable.  If you can't remember what it is,
 check <a href="plm://lessons.welcome/bdr.BDR2">this exercise</a>.</p>[/!]
 
-<p>You now should have enough information to succeed.</p>
+<p>Você agora tem informação o suficiente para conseguir.</p>
 
 <h2>Bibliographical notes</h2>
 <p>According to wikipedia, turmites were invented independently by the end of
--- a/src/lessons/turmites/langton/Langton.pt_BR.html
+++ b/src/lessons/turmites/langton/Langton.pt_BR.html
@@ -1,18 +1,18 @@
 
 <!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
-<h2>Langton's ant</h2>
+<h2>formiga de Langton</h2>
 
-<p>In this exercise, you will turn your buggle into a <i>Langton's
-ant</i>. These artificial little animals are very interesting because they
-are given simple rules that depend only on their local environment, and
-after a period of apparent chaotic behavior, a general pattern
-<i>emerges</i>.</p>
-
-<p>The rules are absolutely trivial: to compute what the next step should be,
-you should check the current color of the ground (using
-<code>getGroundColor()</code>). If it's white, change it to black, turn
-right and move forward by one cell. If the ground is currently black, change
-it to white, turn left and move forward by one cell.</p> 
+<p>Neste exercício, você vai transformar seu buggle numa <i>formiga de
+Langton</i>. Estes pequenos animais artificiais são bastante
+interessantes por que eles recebem regras simples que dependem apenas
+do seu ambiente local, e depois de um período de aparente
+comportamento caótico, um padrão geral <i>surge</i>.</p>
+
+<p>As regras são absolutamente triviais: para calcular qual o próximo
+passo, você verifica a cor atual do chão (usando
+<code>getGroundColor()</code>). Se for branco, mude para preto, vire à
+direita e mova uma célula. Se for preto mude para branco, vire a
+esquerda e ande uma célula.</p> 
 
 <p>It's hard to come up with simpler rules isn't it? Well, let's go and code it
 now. You have to complete the <code>step()</code> method, which encodes the
@@ -22,15 +22,15 @@
 <code>Color.black</code> and <code>Color.white</code>.</p>
 
 [!java]
-<p>To compare colors, you cannot use the equal signs (==), because these things
-are not scalar values but objects. Instead, you need to write something like
-the following:</p> 
+<p>Para comparar cores, você não pode usar o símbolo de igualdade (==),
+pois estas coisas não são valores escalares, mas objetos. Ao invés
+disto, você precisa escrever algo como o seguinte:</p> 
 <pre>
-Color c /* = some initialization */;
-if (c.equals(Color.black)) {
-  /* that's equal */
+Cor c /* = alguma inicialização */;
+if (c.equals(Cor.preto)) {
+  /* é igual */
 } else {
-  /* that was not equal */
+  /* não é igual */
 }
 </pre>
 [/!]
@@ -43,9 +43,10 @@
 código da forma que quiser, mas você deve querer escrever um método
 <code>setCorDoChão(color)</code> para separar um pouco as coisas.</p>
 
-<p>As you can see from the execution of this exercise, the interest in this
-algorithm is that after about 10000 steps of relative chaotic behavior, the
-ant start building a regular pattern. This emergence of a regular pattern
-from the chaos is rather fascinating, isn't it? Move on to the next exercise
-to see more of them.</p>   
+<p>Como você pode ver da execução deste exercício, o interessante neste
+algoritmo é que depois de uns 10000 passos de comportamento
+relativamente caótico, a formiga começa a construir um padrão
+regular. O surgimento deste padrão regular em meio ao caos é bastante
+fascinante, não acha? Mova para o próximo exercício para ver mais
+disto.</p>   
 
--- /dev/null
+++ b/src/lessons/turmites/langtoncolors/LangtonColors.pt_BR.html
@@ -0,0 +1,43 @@
+
+<!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
+<h2>formiga de Langton multicolorida</h2>
+
+<p>There is several ways to extend the concept of Langton's ant. In this
+exercise, we explore first one, using more than two colors. It remains very
+similar to the base case: the behavior at each step still depends on the
+ground color, but you have more than 2 possibilities. It allows to have more
+than one kind of ant, depending on what you decide to do for each color. For
+example, the ant LRL takes 3 colors. It turns left on the first color, right
+on the second one and left on the third color. According to this definition,
+the basic ant is a RL (since it turns right on white cells and left on black
+ones).</p>
+
+<p>Algumas destas formigas desenham padrões fascinantes (alterne o mundo
+para vê-los): LLRR constrói uma figura simétrica semelhante a uma
+bola, LRRRRRLLR desenha um quadrado, LLRRRLRLRLLR desenha um padrão
+regular convolucionado depois de um período de aparente caos, e
+RRLLLRLLLRRR parece preencher uma ampulheta...</p>  
+
+<p>Transformar seu buggle numa formiga de Langton genérica não é muito
+complicado, embora não seja totalmente trivial. Como anteriormente,
+você tem que escrever uma função <code>step</code>. Mas desta vez, ela
+recebe duas arrays como parâmetros. A primeira define as regras para
+seguir dependendo da cor do chão enquanto a segunda dá a sequência de
+cores a usar. Por exemplo, a formiga básica deve ter
+[!java]<code>{'R', 'L'}</code> e <code>{Cor.branco,
+Cor.preto}</code>[/!] [!python]<code>['R', 'L']</code> e
+<code>[Cor.branco, Cor.preto]</code>[/!] [!scala]<code>Array('R',
+'L')</code> e <code>Array(Cor.branco, Cor.preto)</code>[/!] como
+argumentos.</p>
+
+<p>Em cada passo, você deve então ter que aplicar o seguinte pseudo-código:</p>
+<ul>
+ <li>Encontre a posição da cor do chão na sequência de cores;</li>
+ <li>Vire a esquerda ou direita dependendo do conteúdo da array de regras
+nesta posição;</li>
+ <li>Mark the current ground with the next color in the sequence (the last color
+being followed by the first one);</li>
+ <li>ande um passo para frente.</li>
+</ul> 
+
+<p>Você agora tem informação o suficiente para conseguir.</p>
--- /dev/null
+++ b/src/lessons/turmites/short_desc.pt_BR.html
@@ -0,0 +1,7 @@
+
+<!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
+<h3>Os turmites</h3>
+<p>Descubra as formigas de Langton, que são máquinas de Turing 2D.</p>
+
+<p>Estas atividades são problemas bem simples, bons para iniciantes, e
+abrema a porta para um mundo fantástico.</p>
--- /dev/null
+++ b/src/lessons/turtleart/Main.pt_BR.html
@@ -0,0 +1,28 @@
+
+<!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
+<h1>Turtle Art</h1>
+
+<p>Since its inception in the 60's, the LOGO turtle fascinates by its ability
+to draw nice figures on computer.  This lesson allows you to explore some of
+the classical figures, and draw your own.</p>
+
+<p>The language's syntax is absolutely not presented, but if you know a bit of
+it or if someone tells you, you can take these exercises even if you are an
+absolute beginner in programming.</p>
+
+<p>Please send us your best contributions so that they get added to this
+gallery to inspire the next ones.</p>
+
+<h3>O que eu posso fazer para melhorar este universo do PLM?</h3>
+
+<p>Como sempre, existem várias coisas que podem ser feitas no código
+deste universo para melhorá-lo:</p>
+<ul>
+  <li>Other exercises should be added. A whole lot of exercises are available from
+<a
+href="http://neoparaiso.com/logo/#sect4">http://neoparaiso.com/logo/#sect4</a>
+or from <a
+href="http://billkerr2.blogspot.fr/2009/08/40-maths-shapes-challenges.html.">http://billkerr2.blogspot.fr/2009/08/40-maths-shapes-challenges.html</a>.</li>
+  <li>Missing: the built-ins arc() and arcTo(), that draw an arc, either w/o
+moving or by moving to the end of the arc.</li> 
+</ul>
--- a/src/lessons/welcome/traversal/column/TraversalByColumn.pt_BR.html
+++ b/src/lessons/welcome/traversal/column/TraversalByColumn.pt_BR.html
@@ -41,15 +41,16 @@
 tem que parar. Use oo botão <b>stop</b> se o buggle não parar
 corretamente.</p>
 
-<p>It is now time to write down the cell numbers. For that, you will need a
-counter initialiser to zero at the beginning of your code, and incremented
-by one at each step (for example with <code>counter += 1;</code>).  Then,
-you have to use <code>writeMessage()</code> to write the value on the
-ground.
+<p>Agora é hora de escrever os números das células. Para isto, você vai
+precisar de um contador iniciando em zero no começo do seu código, e
+incrementar de um em cada passo (por exemplo com <code>counter +=
+1;</code>).  Então, você terá que usar <code>escreverMensagem()</code>
+para escrever o valor no chão.
 </p>
 
-<p>You probably need to write the first [!java|scala|c]or last [/!]value out of
-the main loop [!java|scala|c], depending on whether you prefer to use a
-<code>while</code> or a <code>do/while</code> one[/!].</p>
+<p>Você provavelmente vai precisar escrever o primeiro [!java|scala|c]ou
+último [/!]valor fora do loop principal [!java|scala|c], dependendo se
+você prefere usar um <code>while</code> ou um
+<code>do/while</code>[/!].</p>
 
 <p>Sua vez...</p>
--- a/src/lessons/welcome/traversal/diagonal/TraversalDiagonal.pt_BR.html
+++ b/src/lessons/welcome/traversal/diagonal/TraversalDiagonal.pt_BR.html
@@ -2,11 +2,11 @@
 <!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
 <h2>Percorrer na diagonal</h2>
 
-<p>This time, you are asked to traverse the world one diagonal after the
-other. Have a look at the objective world for more details on the requested
-traversal order.</p>
+<p>Agora é para você atravessar o mundo uma diagonal depois da outra. Dê
+uma olhada no mundo objetivo para maiores detalhes quanto à ordem a
+percorrer pedida.</p>
 	
-<p>You may find useful to use an integer variable <code>diag</code> storing the
-number of the diagonal you are traversing.</p>
+<p>Pode ser útil usar uma variável inteira <code>diag</code> guardando o
+número da diagonal que você está atravessando.</p>
 
 <p>Sua vez...</p>
--- a/src/lessons/welcome/traversal/line/TraversalByLine.pt_BR.html
+++ b/src/lessons/welcome/traversal/line/TraversalByLine.pt_BR.html
@@ -2,11 +2,13 @@
 <!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
 <h2>Percorrer pelas linhas</h2>
 
-You once again have to let the buggle traverse the world numbering the cells
-on its way, but the goal of this exercise is to write a line traversal. Most
-of the code you wrote for previous exercise remains usable here. Simply, the
-method computing the coordinates of the next buggle position has to be
-correctly updated: if you are at the right of a line, you have to go to the
-beginning of the next one. If not, you have to go to the right cell.
+Mais uma vez você terá que deixar o buggle percorrer o mundo numerando
+as células no caminho, mas o objetivo do exercício é escrever uma
+linha transversal. A maioria do código que você escreveu para
+exercícios anteriores continua útil aqui. Simplesmente, o método
+calculando as coordenadas da próxima posição do buggle tem que ser
+atualizado corretamente: se você estiver a direita de uma linha, você
+terá que ir para o começo da próxima. Senão, você terá que ir para a
+célula da direita.
 
 <p>Sua vez...</p>
--- a/src/lessons/welcome/traversal/zigzag/TraversalZigZag.pt_BR.html
+++ b/src/lessons/welcome/traversal/zigzag/TraversalZigZag.pt_BR.html
@@ -2,7 +2,8 @@
 <!-- Please don't translate this file but l10n/missions/plm.pot (see https://github.com/oster/PLM/wiki/Working-on-translations) -->
 <h2>Percorrer em zig-zag</h2>
 
-This time, you have to zigzag on the way up. Have a look at the objective
-world for more details on the requested traversal order.
+Desta vez, você vai ter que fazer um zigzag no caminho para cima. Dê
+uma olhada no mundo objetivo para mais detalhes da ordem a percorrer
+pedida.
 
 <p>Sua vez...</p>
