[plm] 02/03: cherry-pick the translations of 2.5 upstream

Martin Quinson mquinson at moszumanska.debian.org
Thu Nov 13 16:36:30 UTC 2014


This is an automated email from the git hooks/post-receive script.

mquinson pushed a commit to branch debian
in repository plm.

commit a87f0c291b57ce19929bd560d6b4a17736c55185
Author: Martin Quinson <martin.quinson at loria.fr>
Date:   Thu Nov 13 13:53:08 2014 +0100

    cherry-pick the translations of 2.5 upstream
---
 debian/changelog         |    5 +-
 debian/patches/series    |    1 +
 debian/patches/translate | 6519 ++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 6523 insertions(+), 2 deletions(-)

diff --git a/debian/changelog b/debian/changelog
index 52eb433..e196df9 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,11 +1,12 @@
 plm (2.4.11+repack-2) UNRELEASED; urgency=medium
 
+  * Specify to jh_build that javac will encounter UTF-8 files 
+    (Closes: #768732) Thanks to L. Nussbaum for the report and fix
   * Update Standards-Version to 3.9.6 (no change needed)
   * Remove Scala from package description and rules (Closes: #722148)
     (we don't use it ATM since Debian version is too ancient)
   * Cherry-pick the new upstream logo.png to please Lintian.
-  * Specify to jh_build that javac will encounter UTF-8 files 
-    (Closes: #768732) Thanks to L. Nussbaum for the report and fix
+  * d/p/translate: cherry-pick the translations of 2.5 upstream
 
  -- Martin Quinson <mquinson at debian.org>  Sat, 01 Nov 2014 08:32:19 +0100
 
diff --git a/debian/patches/series b/debian/patches/series
index 96ea746..d6eccd6 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1,3 +1,4 @@
 system-ant-tasks
 no-scala
 no-github
+translate
diff --git a/debian/patches/translate b/debian/patches/translate
new file mode 100644
index 0000000..ebac2b7
--- /dev/null
+++ b/debian/patches/translate
@@ -0,0 +1,6519 @@
+---
+ 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<Point> [/!]getGround()[! scala]:List[Point][/!]"
+-msgstr "[!java]List<Point> [/!]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<Point> [/!]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<"
+-"Point> [/!]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<Point> [/!]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<Point> "
+-"[/!]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<Point> [/!]getGround()[! scala]:List[Point][/!]"
++#~ msgstr "[!java]List<Point> [/!]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<Point> [/!]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<"
++#~ "Point> [/!]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<Point> "
++#~ "[/!]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<Point> "
++#~ "[/!]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 ; 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 : 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 at 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\"->"
+ "\"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\"->\"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<Point> [/!]getGround()[! scala]:List[Point][/!]"
+-msgstr "[!java]List<Point> [/!]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<Point> [/!]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<Point> [/!]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<Point> [/!]getGround()[! scala]:List[Point][/!]"
++#~ msgstr "[!java]List<Point> [/!]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 at ADDRESS>\n"
+ "Language-Team: LANGUAGE <LL at 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<Point> [/!]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<Point> [/!]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<Point> [/!]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<Point> [/!]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 at ADDRESS>\n"
+ "Language-Team: LANGUAGE <LL at 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<Point> [/!]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<Point> "
+-"[/!]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<Point> "
+-"[/!]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 :</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"->"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"->"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>

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/plm.git



More information about the pkg-java-commits mailing list