From 732a41a180d6250a03da851c57454248b23284ed Mon Sep 17 00:00:00 2001
From: Cosmo Myzrail Gorynych <admin@nersta.ru>
Date: Sun, 11 Sep 2022 16:08:55 +1200
Subject: [PATCH 01/12] :zap: Drop precision on position and scale of objects
 in the room editor. Reasonably rounds their values to more logical numbers.

---
 src/node_requires/roomEditor/common.ts            |  5 +++++
 src/node_requires/roomEditor/index.ts             | 15 ++++++++++++++-
 .../roomEditor/interactions/transformer/move.ts   |  2 ++
 .../roomEditor/interactions/transformer/rotate.ts |  2 ++
 .../roomEditor/interactions/transformer/scale.ts  |  2 ++
 5 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/src/node_requires/roomEditor/common.ts b/src/node_requires/roomEditor/common.ts
index ead9589f5..0e71ac4b5 100644
--- a/src/node_requires/roomEditor/common.ts
+++ b/src/node_requires/roomEditor/common.ts
@@ -114,3 +114,8 @@ recolorFilters[5]._loadMatrix([
 ], false);
 /* eslint-enable array-element-newline, no-underscore-dangle, no-multi-spaces*/
 
+export const toPrecision = (input: number, precision: number): number => {
+    const mantissa = input % 1;
+    const whole = input > 0 ? Math.floor(input) : Math.ceil(input);
+    return whole + Math.round(mantissa * (10 ** precision)) / (10 ** precision);
+};
diff --git a/src/node_requires/roomEditor/index.ts b/src/node_requires/roomEditor/index.ts
index e6af37242..d2324f3cb 100644
--- a/src/node_requires/roomEditor/index.ts
+++ b/src/node_requires/roomEditor/index.ts
@@ -14,7 +14,7 @@ import {ViewportRestriction} from './entityClasses/ViewportRestriction';
 import {IRoomEditorRiotTag} from './IRoomEditorRiotTag';
 import {IRoomEditorInteraction, AllowedListener, allowedListeners, interactions} from './interactions';
 import {getPixiSwatch} from './../themes';
-import {defaultTextStyle, recolorFilters, eraseCursor} from './common';
+import {defaultTextStyle, recolorFilters, eraseCursor, toPrecision} from './common';
 import {ease} from 'node_modules/pixi-ease';
 
 const roomEditorDefaults = {
@@ -359,6 +359,19 @@ class RoomEditor extends PIXI.Application {
             copy.update(this.ticker.deltaTime);
         }
     }
+    /**
+     * Rounds up the values of current selection to fix rounding errors
+     * that appear due to global-to-local transformations
+     * coming from the Transformer class.
+     */
+    dropPrecision(): void {
+        for (const elt of this.currentSelection) {
+            elt.x = toPrecision(elt.x, 8);
+            elt.y = toPrecision(elt.y, 8);
+            elt.scale.x = toPrecision(elt.scale.x, 8);
+            elt.scale.y = toPrecision(elt.scale.y, 8);
+        }
+    }
     repositionCoordLabel(): void {
         this.pointerCoords.y = this.screen.height - 30;
     }
diff --git a/src/node_requires/roomEditor/interactions/transformer/move.ts b/src/node_requires/roomEditor/interactions/transformer/move.ts
index d31176eae..dd80fe3f9 100644
--- a/src/node_requires/roomEditor/interactions/transformer/move.ts
+++ b/src/node_requires/roomEditor/interactions/transformer/move.ts
@@ -50,6 +50,8 @@ export const moveSelection: IRoomEditorInteraction<IAffixedData> = {
             this.riotEditor.refs.propertiesPanel.updatePropList();
         },
         pointerup(e, roomTag, affixedData, callback) {
+            this.dropPrecision();
+            this.riotEditor.refs.propertiesPanel.updatePropList();
             this.history.snapshotTransforms();
             callback();
         }
diff --git a/src/node_requires/roomEditor/interactions/transformer/rotate.ts b/src/node_requires/roomEditor/interactions/transformer/rotate.ts
index d77c3a3c3..bbb75681b 100644
--- a/src/node_requires/roomEditor/interactions/transformer/rotate.ts
+++ b/src/node_requires/roomEditor/interactions/transformer/rotate.ts
@@ -39,6 +39,8 @@ export const rotateSelection: IRoomEditorInteraction<void> = {
             this.riotEditor.refs.propertiesPanel.updatePropList();
         },
         pointerup(e, roomTag, affixedData, callback) {
+            this.dropPrecision();
+            this.riotEditor.refs.propertiesPanel.updatePropList();
             this.history.snapshotTransforms();
             callback();
         }
diff --git a/src/node_requires/roomEditor/interactions/transformer/scale.ts b/src/node_requires/roomEditor/interactions/transformer/scale.ts
index 75d46bc24..d37d575cb 100644
--- a/src/node_requires/roomEditor/interactions/transformer/scale.ts
+++ b/src/node_requires/roomEditor/interactions/transformer/scale.ts
@@ -147,6 +147,8 @@ export const scaleSelection: IRoomEditorInteraction<IAffixedData> = {
             this.riotEditor.refs.propertiesPanel.updatePropList();
         },
         pointerup(e, roomTag, affixedData, callback) {
+            this.dropPrecision();
+            this.riotEditor.refs.propertiesPanel.updatePropList();
             this.history.snapshotTransforms();
             callback();
         }

From 5512868bd10e753bb39eac0256ac3f9044c0c410 Mon Sep 17 00:00:00 2001
From: Cosmo Myzrail Gorynych <admin@nersta.ru>
Date: Sun, 11 Sep 2022 16:20:30 +1200
Subject: [PATCH 02/12] :bug: Fix ct.place crashing game if a collision check
 is made on a disproportionately squished circle

---
 app/data/ct.libs/place/index.js | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/app/data/ct.libs/place/index.js b/app/data/ct.libs/place/index.js
index d627888cf..02c887290 100644
--- a/app/data/ct.libs/place/index.js
+++ b/app/data/ct.libs/place/index.js
@@ -81,14 +81,14 @@
         const vertices = [];
         for (let i = 0; i < circlePrecision; i++) {
             const point = [
-                Math.sin(twoPi / circlePrecision * i) * shape.r * obj.scale.x,
-                Math.cos(twoPi / circlePrecision * i) * shape.r * obj.scale.y
+                ct.u.ldx(shape.r * obj.scale.x, 360 / circlePrecision * i),
+                ct.u.ldy(shape.r * obj.scale.y, 360 / circlePrecision * i)
             ];
             if (obj.angle !== 0) {
                 const {x, y} = ct.u.rotate(point[0], point[1], obj.angle);
-                vertices.push(x, y);
+                vertices.push(new SSCD.Vector(x, y));
             } else {
-                vertices.push(point);
+                vertices.push(new SSCD.Vector(point[0], point[1]));
             }
         }
         return new SSCD.LineStrip(position, vertices, true);

From 3a556d8695e2b49fe1e6fa06a49d5419ac4fd91d Mon Sep 17 00:00:00 2001
From: Cosmo Myzrail Gorynych <admin@nersta.ru>
Date: Sun, 11 Sep 2022 16:21:09 +1200
Subject: [PATCH 03/12] :fire: Remove now useless twoPi var in ct.place

---
 app/data/ct.libs/place/index.js | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/app/data/ct.libs/place/index.js b/app/data/ct.libs/place/index.js
index 02c887290..6fceec398 100644
--- a/app/data/ct.libs/place/index.js
+++ b/app/data/ct.libs/place/index.js
@@ -26,8 +26,7 @@
 /* global SSCD */
 /* eslint prefer-destructuring: 0 */
 (function ctPlace(ct) {
-    const circlePrecision = 16,
-          twoPi = Math.PI * 0;
+    const circlePrecision = 16;
     const debugMode = [/*%debugMode%*/][0];
 
     const getSSCDShapeFromRect = function (obj) {

From 7e95b029a4b956457d262d407b0606c260a9dc06 Mon Sep 17 00:00:00 2001
From: Cosmo Myzrail Gorynych <admin@nersta.ru>
Date: Sun, 11 Sep 2022 16:34:20 +1200
Subject: [PATCH 04/12] :bug: Escape single quotes while stringifying certain
 properties. This allows, among other things, use of ' in custom properties
 (room editor) and template names

---
 src/node_requires/exporter/rooms.ts     | 12 +++++++++---
 src/node_requires/exporter/templates.ts |  2 +-
 2 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/src/node_requires/exporter/rooms.ts b/src/node_requires/exporter/rooms.ts
index 963b0a9c9..28e9f0827 100644
--- a/src/node_requires/exporter/rooms.ts
+++ b/src/node_requires/exporter/rooms.ts
@@ -145,9 +145,15 @@ ct.rooms.templates['${r.name}'] = {
     width: ${r.width},
     height: ${r.height},` +
     /* JSON.parse is faster at loading big objects */`
-    objects: JSON.parse('${JSON.stringify(objs).replace(/\\/g, '\\\\')}'),
-    bgs: JSON.parse('${JSON.stringify(bgs).replace(/\\/g, '\\\\')}'),
-    tiles: JSON.parse('${JSON.stringify(tileLayers).replace(/\\/g, '\\\\')}'),
+    objects: JSON.parse('${JSON.stringify(objs)
+        .replace(/\\/g, '\\\\')
+        .replace(/'/g, '\\\'')}'),
+    bgs: JSON.parse('${JSON.stringify(bgs)
+        .replace(/\\/g, '\\\\')
+        .replace(/'/g, '\\\'')}'),
+    tiles: JSON.parse('${JSON.stringify(tileLayers)
+        .replace(/\\/g, '\\\\')
+        .replace(/'/g, '\\\'')}'),
     backgroundColor: '${r.backgroundColor || '#000000'}',
     ${constraints ? 'cameraConstraints: ' + JSON.stringify(constraints) + ',' : ''}
     onStep() {
diff --git a/src/node_requires/exporter/templates.ts b/src/node_requires/exporter/templates.ts
index b6fb518e9..ad52820be 100644
--- a/src/node_requires/exporter/templates.ts
+++ b/src/node_requires/exporter/templates.ts
@@ -67,7 +67,7 @@ ct.templates.templates["${template.name}"] = {
     },
     extends: ${template.extends ? JSON.stringify(getUnwrappedExtends(template.extends), null, 4) : '{}'}
 };
-ct.templates.list['${template.name}'] = [];
+ct.templates.list['${template.name.replace(/'/g, '\\\'')}'] = [];
         `;
         rootRoomOnCreate += scripts.rootRoomOnCreate;
         rootRoomOnStep += scripts.rootRoomOnStep;

From ae11a82068b019f01fce2fe8a756a9a9cdd43bda Mon Sep 17 00:00:00 2001
From: Cosmo Myzrail Gorynych <admin@nersta.ru>
Date: Sun, 11 Sep 2022 17:21:32 +1200
Subject: [PATCH 05/12] :bento: Update nw.js to v0.67.1

---
 versions.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/versions.js b/versions.js
index 168f58c1d..ceeaae210 100644
--- a/versions.js
+++ b/versions.js
@@ -32,6 +32,6 @@ if (packageVersions.pixi !== packageVersions.pixiLegacy) {
 }
 
 module.exports = {
-    nwjs: '0.59.0',
+    nwjs: '0.67.1',
     ...packageVersions
 };

From bfe24d9cebd249563616806f4118d3e666710f6f Mon Sep 17 00:00:00 2001
From: Cosmo Myzrail Gorynych <admin@nersta.ru>
Date: Sun, 11 Sep 2022 18:14:05 +1200
Subject: [PATCH 06/12] :bug: Add support for template and texture arrays to
 the context system

---
 src/node_requires/exporter/utils.js | 54 ++++++++++++++---------------
 1 file changed, 27 insertions(+), 27 deletions(-)

diff --git a/src/node_requires/exporter/utils.js b/src/node_requires/exporter/utils.js
index 0830bec16..2d8cbd191 100644
--- a/src/node_requires/exporter/utils.js
+++ b/src/node_requires/exporter/utils.js
@@ -1,3 +1,11 @@
+const {getTemplateFromId} = require('./../resources/templates');
+const {getTextureFromId} = require('./../resources/textures');
+
+const typeToGetter = {
+    template: getTemplateFromId,
+    texture: getTextureFromId
+};
+
 /**
  * Creates a copy of an extends object, turning UIDs of resources into the names of these resources.
  * Understands notations of `name@@template` and `name@@texture`.
@@ -6,8 +14,6 @@
  *
  * @returns {object} An object with unwrapped extends.
  */
-const {getTemplateFromId} = require('./../resources/templates');
-const {getTextureFromId} = require('./../resources/textures');
 const getUnwrappedExtends = function getUnwrappedExtends(exts) {
     if (typeof exts !== 'object') {
         // This is a primitive value
@@ -32,21 +38,11 @@ const getUnwrappedExtends = function getUnwrappedExtends(exts) {
             // Skip unset values
             continue;
         }
-        if (postfix === 'template') {
-            try {
-                out[key] = getTemplateFromId(exts[i]).name;
-            } catch (e) {
-                alertify.error(`Could not resolve UID ${exts[i]} for field ${key} as a template. Returning -1.`);
-                console.error(e);
-                // eslint-disable-next-line no-console
-                console.trace();
-                out[key] = -1;
-            }
-        } else if (postfix === 'texture') {
+        if (postfix === 'template' || postfix === 'texture') {
             try {
-                out[key] = getTextureFromId(exts[i]).name;
+                out[key] = typeToGetter[postfix](exts[i]).name;
             } catch (e) {
-                alertify.error(`Could not resolve UID ${exts[i]} for field ${key} as a texture. Returning -1.`);
+                alertify.error(`Could not resolve UID ${exts[i]} for field ${key} as a ${postfix}. Returning -1.`);
                 console.error(e);
                 // eslint-disable-next-line no-console
                 console.trace();
@@ -82,21 +78,25 @@ const getUnwrappedBySpec = function getUnwrappedBySpec(exts, spec) {
             // Skip unset values
             continue;
         }
-        if (fieldMap[i].type === 'template') {
-            try {
-                out[i] = getTemplateFromId(exts[i]).name;
-            } catch (e) {
-                alertify.error(`Could not resolve UID ${exts[i]} for field ${i} as a template. Returning -1. Full object: ${JSON.stringify(exts)}`);
-                console.error(e);
-                // eslint-disable-next-line no-console
-                console.trace();
-                out[i] = -1;
+        if (fieldMap[i].type === 'template' || fieldMap[i].type === 'texture') {
+            if (fieldMap[i].array) {
+                out[i] = exts[i].map(elt => {
+                    try {
+                        return typeToGetter[fieldMap[i].type](elt).name;
+                    } catch (e) {
+                        alertify.error(`Could not resolve UID ${elt} for field ${i} as a ${fieldMap[i].type}. Returning -1. Full object: ${JSON.stringify(exts)}`);
+                        console.error(e);
+                        // eslint-disable-next-line no-console
+                        console.trace();
+                        return -1;
+                    }
+                });
+                continue;
             }
-        } else if (fieldMap[i].type === 'texture') {
             try {
-                out[i] = getTextureFromId(exts[i]).name;
+                out[i] = typeToGetter[fieldMap[i].type](exts[i]).name;
             } catch (e) {
-                alertify.error(`Could not resolve UID ${exts[i]} for field ${i} as a texture. Returning -1. Full object: ${JSON.stringify(exts)}`);
+                alertify.error(`Could not resolve UID ${exts[i]} for field ${i} as a ${fieldMap[i].type}. Returning -1. Full object: ${JSON.stringify(exts)}`);
                 console.error(e);
                 // eslint-disable-next-line no-console
                 console.trace();

From 8b61abd47b6dc3ffae242c110df07f290198bac9 Mon Sep 17 00:00:00 2001
From: Cosmo Myzrail Gorynych <admin@nersta.ru>
Date: Sun, 11 Sep 2022 18:29:40 +1200
Subject: [PATCH 07/12] :bug: Room editor shortcuts must work only if the Rooms
 tab is active

---
 src/riotTags/rooms/room-editor.tag | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/riotTags/rooms/room-editor.tag b/src/riotTags/rooms/room-editor.tag
index f027ab46e..ededd1a6d 100644
--- a/src/riotTags/rooms/room-editor.tag
+++ b/src/riotTags/rooms/room-editor.tag
@@ -262,6 +262,9 @@ room-editor.aPanel.aView
             });
         };
         const triggerKeyboardEvent = e => {
+            if (!window.hotkeys.inScope('rooms')) {
+                return false;
+            }
             if (['input', 'textarea', 'select'].includes(e.target.nodeName.toLowerCase())) {
                 return false;
             }

From 9d444da4e0acc45ce3a6a3f2409cab2c21e7f7b0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9my=20Tauziac?=
 <1597669+rtauziac@users.noreply.github.com>
Date: Mon, 12 Sep 2022 10:56:09 +0200
Subject: [PATCH 08/12] :pencil: Update French translation (#366 by @rtauziac)

---
 app/data/i18n/French.json | 1384 +++++++++++++++++++------------------
 1 file changed, 707 insertions(+), 677 deletions(-)

diff --git a/app/data/i18n/French.json b/app/data/i18n/French.json
index dd9aaa98d..1c1d861e4 100644
--- a/app/data/i18n/French.json
+++ b/app/data/i18n/French.json
@@ -1,33 +1,33 @@
 {
     "me": {
         "id": "Fr",
-        "native": "Française",
+        "native": "Français",
         "eng": "French"
     },
     "colorPicker": {
         "current": "Nouveau",
         "globalPalette": "Palette Globale",
-        "old": "Vieux",
-        "projectPalette": "Palette de Projets"
+        "old": "Ancien",
+        "projectPalette": "Palette du Projet"
     },
     "curveEditor": {
         "curveLineHint": "Cliquez sur la courbe pour ajouter un point",
         "dragPointHint": "Faites glisser pour déplacer le point, faites un clic droit pour le supprimer",
-        "pointTime": "Temps:",
-        "pointValue": "Valeur:"
+        "pointTime": "Temps :",
+        "pointValue": "Valeur :"
     },
     "debuggerToolbar": {
         "pause": "Pause",
         "resume": "Reprendre le jeu",
         "restartGame": "Redémarrer le jeu",
         "restartRoom": "Redémarrer la salle",
-        "switchRoom": "Changer de salle…",
-        "toggleDevTools": "Basculer en dev mode.",
-        "screenshot": "Prendre un screenshot",
-        "enterFullscreen": "Entrer en pleine écran",
-        "exitFullscreen": "Quitter le pleine écran",
-        "links": "Liens et QR-Code",
-        "openExternal": "Ouvrir dans un navigateur",
+        "switchRoom": "Aller à la salle…",
+        "toggleDevTools": "Basculer les outils de développement",
+        "screenshot": "Prendre une capture d’écran",
+        "enterFullscreen": "Passer en plein écran",
+        "exitFullscreen": "Sortir du plein écran",
+        "links": "Liens et QR-Codes",
+        "openExternal": "Ouvrir dans le navigateur",
         "close": "Fermer"
     },
     "common": {
@@ -35,125 +35,127 @@
         "apply": "Appliquer",
         "cancel": "Annuler",
         "cannotBeEmpty": "Ceci ne peux pas rester vide",
-        "confirmDelete": "Êtes-vous certain de vouloir supprimer {0} ? C'est irréversible.",
+        "confirmDelete": "Êtes-vous certain de vouloir supprimer {0} ? Ceci est irréversible.",
         "contribute": "Contribuer",
         "copy": "Copier",
         "copyName": "Copier le nom",
         "cut": "Couper",
         "delete": "Supprimer",
         "donate": "Faire un Don",
-        "done": "Fini!",
+        "done": "Terminé !",
         "duplicate": "Dupliquer",
         "exit": "Quitter",
         "loading": "Chargement…",
-        "name": "Nom:",
+        "name": "Nom :",
         "no": "Non",
         "none": "Aucune",
-        "ok": "Valider",
+        "ok": "D’accord",
         "open": "Ouvrir",
         "paste": "Coller",
         "rename": "Renommer",
         "save": "Enregistrer",
-        "select": "Select…",
-        "sort": "Trier:",
+        "select": "Sélectionner",
+        "sort": "Trier :",
         "wrongFormat": "Mauvais format de fichier",
         "yes": "Oui",
         "zoom": "Zoom",
-        "zoomIn": "Zoom sur",
-        "zoomOut": "Zoom sur",
-        "clear": "",
-        "filter": "",
-        "selectDialogue": "",
-        "search": "",
-        "close": "",
-        "couldNotLoadFromClipboard": "",
-        "pastedFromClipboard": "",
-        "edit": "",
-        "nothingToShowFiller": "",
-        "required": "",
-        "settings": "",
+        "zoomIn": "Zoom avant",
+        "zoomOut": "Zoom arrière",
+        "clear": "Nettoyer",
+        "filter": "Filtrer :",
+        "selectDialogue": "Sélectionner…",
+        "search": "Rechercher :",
+        "close": "Fermer",
+        "couldNotLoadFromClipboard": "Impossible de charger les données du presse-papier",
+        "pastedFromClipboard": "Copié depuis le presse-papier",
+        "edit": "Modifier",
+        "nothingToShowFiller": "Rien à voir ici !",
+        "required": "Requis",
+        "settings": "Réglages",
         "fieldTypes": {
-            "checkbox": "",
-            "code": "",
-            "color": "",
-            "group": "",
-            "h1": "",
-            "h2": "",
-            "h3": "",
-            "h4": "",
-            "number": "",
-            "point2D": "",
-            "radio": "",
-            "slider": "",
-            "sliderAndNumber": "",
-            "table": "",
-            "text": "",
-            "textfield": "",
-            "texture": "",
-            "template": "",
-            "room": "",
-            "sound": "",
-            "tandem": ""
+            "checkbox": "Case à cocher",
+            "code": "Boîte de code",
+            "color": "Couleur",
+            "group": "Groupe de champs",
+            "h1": "Entête de niveau 1",
+            "h2": "Entête de niveau 2",
+            "h3": "Entête de niveau 3",
+            "h4": "Entête de niveau 4",
+            "number": "Nombre",
+            "point2D": "Point 2D",
+            "radio": "Boutons radios",
+            "slider": "Curseur",
+            "sliderAndNumber": "Curseur avec champ de saisie",
+            "table": "Table",
+            "text": "Texte court",
+            "textfield": "Boîte de texte",
+            "texture": "Texture",
+            "template": "Modèle",
+            "room": "Salle",
+            "sound": "Audio",
+            "tandem": "Système de particules"
         },
-        "newName": "Nouveau nom:",
+        "newName": "Nouveau nom :",
         "saveProject": "Sauvegarder le projet",
-        "openProject": "Ouvrir un projet...",
+        "openProject": "Ouvrir un projet…",
         "savedMessage": "Votre projet a été enregistré.",
-        "reallyExitConfirm": "Êtes-vous sur de vouloir quitter ? Tout les changements non sauvegardé seront perdu!",
-        "notFoundOrUnknown": "Fichier inconnu. Soyez sur que le fichier existe vraiment",
+        "reallyExitConfirm": "Êtes-vous sur de vouloir quitter ? Tout les changements non sauvegardés seront perdu !",
+        "notFoundOrUnknown": "Fichier inconnu. Vérifiez que le fichier existe.",
         "nameTaken": "Ce nom est déjà pris",
         "fastImport": "Import Rapide",
         "addToNotes": "Ajouter aux notes",
-        "noRooms": "Nécessite au moins une \"room\" pour compiler l'application",
-        "tileLayer": "Couche de Tuile",
+        "noRooms": "Nécessite au moins une salle pour compiler l'application.",
+        "tileLayer": "Calque de tuiles",
         "ctSite": "Page d'accueil de ct.js",
-        "docsShort": "",
-        "docsLong": "",
-        "openAssetGallery": "",
+        "docsShort": "Doc",
+        "docsLong": "Documentation",
+        "openAssetGallery": "Gallerie",
         "assetTypes": {
             "textures": [
-                "",
-                "",
-                ""
+                "texture",
+                "textures",
+                "textures"
             ],
             "templates": [
-                "",
-                "",
-                ""
+                "modèle",
+                "modèles",
+                "modèles"
             ],
             "emitterTandems": [
-                "",
-                "",
-                ""
+                "Tandem émetteur",
+                "Tandems émetteurs",
+                "Tandems émetteurs"
             ],
             "rooms": [
-                "",
-                "",
-                ""
+                "salle",
+                "salles",
+                "salles"
             ],
             "fonts": [
-                "",
-                "",
-                ""
+                "police",
+                "polices",
+                "polices"
             ],
             "styles": [
-                "",
-                "",
-                ""
+                "style",
+                "styles",
+                "styles"
             ],
             "sounds": [
-                "",
-                "",
-                ""
+                "son",
+                "sons",
+                "sons"
             ],
             "skeletons": [
-                "",
-                "",
-                ""
+                "sprite articulé",
+                "sprites articulés",
+                "sprites articulés"
             ]
         },
-        "next": "",
-        "previous": ""
+        "next": "Suivant",
+        "previous": "Précédent",
+        "undo": "Annuler",
+        "redo": "Refaire"
     },
     "exportPanel": {
         "hide": "Cacher",
@@ -162,226 +164,227 @@
         "export": "Exporter",
         "exportPanel": "Exporter le Projet",
         "log": "Journal des logs",
-        "windowsCrossBuildWarning": "Pour construire pour windows depuis Linux/MacOS, vous avez besoin de Wine :)",
-        "cannotBuildForMacOnWin": "",
-        "firstRunNotice": "Le premier lancement pour chaque plateforme sera lent car ct.js va télécharger et sauvegarder les librairies additionnels requises pour les rassembler. Cela va prendre un certain temps, mais les prochaines fois ce sera presque instantané.",
-        "projectTitleRequired": "",
-        "appIdRequired": "",
-        "noAndroidSdkFound": "",
-        "envVarNotice": "",
-        "downloadAndroidStudio": "",
-        "requiresInternetNotice": "",
-        "noJdkFound": "",
-        "downloadJDK": ""
+        "windowsCrossBuildWarning": "Pour compiler pour Windows depuis Linux/MacOS, vous avez besoin d’installer Wine. Les instructions sont différentes pour chaque système, vous en trouverez certainement de meilleures sur internet :)",
+        "cannotBuildForMacOnWin": "Malheureusement, Windows ne peut produire des archives Mac valides. Essayez depuis un système Linux, en utilisant une machine virtuelle par exemple. C’est 100% gratuit !",
+        "firstRunNotice": "La première compilation pour chaque plateforme sera lente car ct.js va télécharger et sauvegarder les librairies additionnelles nécessaires à la compilation. Cela prend un certain temps, mais les suivantes seront presque instantanées.",
+        "projectTitleRequired": "Vous devez ajouter un titre à votre projet dans la section Projet → Création → Nom",
+        "appIdRequired": "Vous devez spécifier un appId unique dans l’onglet Projet → Création → App ID pour publier cette app.",
+        "noAndroidSdkFound": "Le SDK Android n’a pas été trouvé (la variable d’environnement ANDROID_SDK_ROOT n’est pas définie). Vous pouvez obtenir le SDK Android en installant Android Studio :",
+        "envVarNotice": "Vous aurez toujours besoin de définir la variable d’environnement à la main et de redémarrer votre appareil.",
+        "downloadAndroidStudio": "Télécharger Android Studio",
+        "requiresInternetNotice": "Cette opération nécessite une connexion internet pour mettre en place les projet.",
+        "noJdkFound": "Le JDK 11 n’a pas été trouvé (la variable d’environnement JAVA_HOME n’est pas définie ou ne pointe pas vers le JDK 11). Vous pouvez l’obtenir ici :",
+        "downloadJDK": "Télécharger le JDK 11"
     },
     "intro": {
-        "loading": "Veuillez patientez: des chatons ",
+        "loading": "Veuillez patientez : nos chatons accélèrent à la vitesse de la lumière !",
         "newProject": {
-            "button": "Créer",
-            "input": "Nom du projet (Lettres et chiffres)",
+            "button": "Choisir le dossier puis créer",
+            "input": "Nom du projet (lettres et chiffres)",
             "text": "Créer un nouveau",
             "saveProjectHere": "Sauvegarder le projet ici",
-            "selectProjectFolder": "Choisissez un fichier pour sauvegarder votre projet",
-            "nameError": "Mauvais nom de projet."
+            "selectProjectFolder": "Choisissez un dossier pour sauvegarder votre projet",
+            "nameError": "Mauvais nom de projet"
         },
         "recovery": {
-            "message": "<h2 class=\"nmt\">Recovery</h2><p>ct.js has found a recovery file. Possibly, your project was not saved correctly or ct.js was shut down in case of some emergency. Here is when these files were lastly modified:</p><p>Your chosen file: {0} {1}<br/>Recovery file: {2} {3}</p><p>What file should ct.js open?</p>",
-            "loadTarget": "Fichier cible",
-            "loadRecovery": "Récupération",
-            "newer": "<b>(récent)</b>",
-            "older": "(ancien)"
+            "message": "<h2 class=\"nmt\">Récupération</h2><p>ct.js a trouvé un fichier de récupération. Votre projet n’a pas dû être sauvegardé correctement ou ct.js a quitté inopinément. Dates de dernière modification :</p><p>Fichier actuel : {0} {1}<br/>Fichier récupéré : {2} {3}</p><p>Quel fichier doit être ouvert ?</p>",
+            "loadTarget": "Utiliser le fichier actuel",
+            "loadRecovery": "Utiliser le fichier récupéré",
+            "newer": "<b>(plus récent)</b>",
+            "older": "(plus ancien)"
         },
         "loadingProject": "Chargement du projet…",
-        "loadingProjectError": "Votre projet n'a pas pu être charger pour la raison suivante:",
+        "loadingProjectError": "Votre projet n'a pas pu être chargé pour la raison suivante :",
         "homepage": "Page d'accueil",
-        "latestVersion": "La version 1$ est disponible",
+        "latestVersion": "La version $1 est disponible",
         "forgetProject": "Oublier ce projet",
         "browse": "Parcourir",
         "latest": "Derniers projets",
-        "twitter": "Chaîne Twitter",
+        "twitter": "Page Twitter",
         "discord": "Communauté Discord",
-        "unableToWriteToFolders": "Ct.js n'a pas pu trouver un endroit approprié pour vos projets! Assurez-vous de stocker l'application ct.js dans un dossier dans lequel vous avez accès à l'écriture.",
-        "examples": "",
-        "createOrBrowseJunction": "",
-        "cloneProject": "",
-        "github": "",
-        "itch": "",
-        "vkontakte": "",
-        "patreon": "",
-        "templates": "",
-        "templatesInfo": ""
+        "unableToWriteToFolders": "Ct.js n'a pas pu trouver un endroit approprié pour vos projets ! Assurez-vous que vous possédez bien les droits en écriture sur le dossier du projet.",
+        "examples": "Exemples",
+        "createOrBrowseJunction": "ou",
+        "cloneProject": "Cloner ce projet à un nouvel emplacement",
+        "github": "Ct.js sur Github",
+        "itch": "Page itch.io de Ct.js",
+        "vkontakte": "Communauté publique de Vkontakte",
+        "patreon": "Soutenez ct.js sur Patreon !",
+        "templates": "Modèles",
+        "templatesInfo": "Vous pouvez démarrer rapidement un projet grâce à un de ces modèles. Ils comportent seulement des graphismes temporaires mais les mécaniques de jeu sont fonctionnelles. Sélectionner un projet vous demandera de choisir où enregistrer votre projet dans le sélecteur de dossier.",
+        "boosty": "Soutenir ct.js sur Boosty !"
     },
     "onboarding": {
-        "hoorayHeader": "Wow! Vous venez de créer un projet!",
-        "nowWhatParagraph": "Maintenant, que devons nous faire ?",
-        "openSpaceShooterTutorial": "Apprendre comment créer un jeu Space-Shooter",
-        "openPlatformerTutorial": "Apprendre comment créer un jeu de plate-forme",
-        "doNothing": "Passer cette étape",
+        "hoorayHeader": "Incroyable ! Vous venez de créer un projet !",
+        "nowWhatParagraph": "Que devrions nous faire ?",
+        "openSpaceShooterTutorial": "Apprendre à créer un Space-Shooter",
+        "openPlatformerTutorial": "Apprendre à créer un jeu de plate-forme",
+        "doNothing": "Passer cet écran et créer un super jeu !",
         "showOnboardingCheckbox": "Afficher cet écran lors de la création d'un nouveau projet",
-        "openJettyCatTutorial": ""
+        "openJettyCatTutorial": "Apprendre à créér Jetty Cat (clone de Flappy Bird)"
     },
     "settings": {
         "actions": {
-            "heading": "Réglages des touches",
+            "heading": "Réglages des méthodes d’entrée",
             "actions": "Actions",
             "addAction": "Ajouter une action",
             "addMethod": "Ajouter une méthode d'entrée",
-            "deleteAction": "Supprimer une action",
-            "deleteMethod": "Supprimer une méthode",
+            "deleteAction": "Supprimer cette action",
+            "deleteMethod": "Supprimer cette méthode",
             "inputActionNamePlaceholder": "Nom de l'action",
-            "methodModuleMissing": "Le module pour cette méthode est introuvable",
-            "methods": "Méthode d'entrée",
-            "multiplier": "Multiplier",
-            "noActionsYet": "Les actions permettent aux développeurs d'écouter de nombreuses méthodes d'entrée à la fois et de les modifier dynamiquement, le tout avec une API uniforme. En savoir plus en cliquant sur l'icône des documents ci-dessus",
-            "makeFromScratch": "",
-            "presets": "",
-            "presetXYMovement": "",
-            "presetTouchAndMouse": "",
-            "presetCustom": "",
-            "exportActionPreset": "",
-            "importErrorMissingModules": "",
-            "importErrorNotCtJsPreset": ""
+            "methodModuleMissing": "Le module requis pour cette méthode est manquant",
+            "methods": "Méthodes d'entrée",
+            "multiplier": "Facteur",
+            "noActionsYet": "Les actions permettent aux développeurs d'écouter de nombreuses méthodes d'entrée à la fois et de les modifier dynamiquement, le tout avec une API uniforme. En savoir plus en cliquant sur l'icône de documentation ci-dessus.",
+            "makeFromScratch": "Créer à partir de zéro",
+            "presets": "Préréglages",
+            "presetXYMovement": "Déplacements génériques en XY",
+            "presetTouchAndMouse": "Souris et tactile",
+            "presetCustom": "Importer un réglage personnel",
+            "exportActionPreset": "Exporter en tant que préréglage",
+            "importErrorMissingModules": "Impossible d’importer le préréglage car il manque des modules à ct.js : $1",
+            "importErrorNotCtJsPreset": "Ce fichier ne ressemble pas à un préréglage pour ct.js."
         },
         "authoring": {
-            "heading": "Auteur",
-            "author": "Nom de l'auteur:",
-            "site": "Page d'accueil du projet:",
-            "title": "Nom du projet:",
-            "version": "Version:",
-            "versionPostfix": "Postfix:",
-            "appId": "",
-            "appIdExplanation": ""
+            "heading": "Publication",
+            "author": "Développeur :",
+            "site": "Page d'accueil du projet :",
+            "title": "Nom du projet :",
+            "version": "Version :",
+            "versionPostfix": "Postfix :",
+            "appId": "App ID",
+            "appIdExplanation": "Il est principalement utilisé pour les jeux mobiles. C’est un identifiant sous forme de texte unique à chaque jeu. Il respecte en général le format `domaine.developpeur.nomDeProjet`. Un bon exemple d’appID serait `rocks.ctjs.catsteroids`."
         },
         "rendering": {
             "heading": "Options de rendu",
             "highDensity": "Prend en charge une densité de pixels élevée (par exemple sur les écrans rétina)",
-            "framerate": "Taux d'image:",
-            "maxFPS": "Max framerate:",
-            "launchMode": "Mode de lancement:",
+            "framerate": "Taux d'images :",
+            "maxFPS": "Taux de rafraichissement maximal :",
+            "launchMode": "Mode de lancement :",
             "launchModes": {
                 "maximized": "Maximiser",
                 "fullscreen": "Plein écran",
                 "windowed": "Fenêtré"
             },
-            "desktopBuilds": "",
-            "hideCursor": "",
-            "pixelatedRender": "Désactive le lissage d'image ici et dans le projet exporté (conservez les pixels net)",
-            "usePixiLegacy": "",
-            "mobileBuilds": "",
-            "screenOrientation": "",
+            "desktopBuilds": "Export PC",
+            "hideCursor": "Masquer le curseur du système",
+            "pixelatedRender": "Désactive le lissage d'image ici et dans le projet exporté (conservez les pixels nets)",
+            "usePixiLegacy": "Utiliser une méthode de rendu basé sur le canvas pour supporter les navigateurs plus anciens (ajoute ~20Ko au jeu)",
+            "mobileBuilds": "Export mobile",
+            "screenOrientation": "Orientation de l’écran :",
             "screenOrientations": {
-                "unspecified": "",
-                "landscape": "",
-                "portrait": ""
+                "unspecified": "Toutes",
+                "landscape": "Paysage",
+                "portrait": "Portrait"
             }
         },
         "branding": {
-            "heading": "Étiqueter",
-            "icon": "Logo du jeu",
-            "iconNotice": "Votre logo doit faire au minimum 256x256 pixels.",
-            "accent": "Votre colorie",
-            "accentNotice": "Définit la couleur du chargement, ainsi que de certains autres endroits s'il est utilisé comme application mobile.",
-            "invertPreloaderScheme": "Inverser le schéma de couleurs du chargement",
-            "hideLoadingLogo": "",
-            "splashScreen": "",
-            "splashScreenNotice": "",
-            "forceSmoothIcons": "",
-            "forceSmoothSplashScreen": ""
+            "heading": "Identité visuelle",
+            "icon": "Logo du jeu :",
+            "iconNotice": "Votre logo doit être carré et faire au minimum 256x256 pixels.",
+            "accent": "Couleur d’accentuation :",
+            "accentNotice": "Définit la couleur pendant le chargement, ainsi qu’à certains autres endroits s'il est utilisé comme application mobile.",
+            "invertPreloaderScheme": "Inverser le schéma de couleurs lors du chargement",
+            "hideLoadingLogo": "Masquer \"Fait avec ct.js\" lors du chargement",
+            "splashScreen": "Écran de démarrage :",
+            "splashScreenNotice": "Cette image est utilisée pour les applications mobiles. Elle doit faire au minimum 1920×1920px et sera mise à l’échelle et rognée pour s’adapter aux formats portrait et paysage. Assurez-vous de centrer les éléments importants sur l’image.",
+            "forceSmoothIcons": "Lisser les icônes quelque soit le réglage du rendu",
+            "forceSmoothSplashScreen": "Lisser l’image de l’écran de démarrage quelque soit le réglage du rendu"
         },
         "scripts": {
             "heading": "Vos Scripts",
             "addNew": "Ajouter un nouveau Script",
             "deleteScript": "Supprimer le Script",
             "newScriptComment": "Utilisez des scripts pour définir des fonctions fréquentes et importer de petites bibliothèques",
-            "moveUp": "Montez",
-            "moveDown": "Déplacez-vous vers le bas"
+            "moveUp": "Déplacer vers le haut",
+            "moveDown": "Déplacez vers le bas"
         },
         "modules": {
-            "heading": ""
+            "heading": "Catmods"
         },
-        "catmodsSettings": "",
+        "catmodsSettings": "Réglages des Catmods",
         "export": {
-            "heading": "",
-            "functionWrap": "",
-            "codeModifier": "",
-            "obfuscateWarning": "",
-            "codeModifierAndWrapNote": "",
+            "heading": "Réglage des exports",
+            "functionWrap": "Enrober tout le code dans une fonction (rend le débogage plus compliqué mais isole le code du jeu dans un contexte externe. Il est préférable de ne pas l’activer pendant le développement du jeu).",
+            "codeModifier": "Transformations du code",
+            "obfuscateWarning": "Cette option ralentira l’exécution de 15 à 80%, mais rendra votre code extrêmement difficile à extraire et à déchiffrer.",
+            "codeModifierAndWrapNote": "À noter que ces réglages ne fonctionnent que sur les exports web et PC, car ils rallongent considérablement le temps de compilation et rendent le débogage difficile. Vous pouvez forcer le comportement dans Menu Principal  → Réglages → Forcer les réglages de production pour les exports de débogage.",
             "codeModifiers": {
-                "none": "",
-                "minify": "",
-                "obfuscate": ""
+                "none": "Aucun",
+                "minify": "Minimiser",
+                "obfuscate": "Brouiller"
             }
         },
         "content": {
-            "heading": "",
-            "addContentType": "",
-            "missingTypeName": "",
-            "unnamedContentTypeHint": "",
-            "typeName": "",
-            "typeNameHint": "",
-            "typeReadableName": "",
-            "typeReadableNameHint": "",
-            "icon": "",
-            "typeSpecification": "",
-            "fieldName": "",
-            "fieldNameHint": "",
-            "fieldReadableName": "",
-            "fieldReadableNameHint": "",
-            "fieldType": "",
-            "deleteContentType": "",
-            "confirmDeletionMessage": "",
-            "gotoEntries": "",
-            "entries": "",
-            "array": ""
+            "heading": "Éditeur de type de contenu",
+            "addContentType": "Ajouter un type de contenu",
+            "missingTypeName": "Type de contenu sans nom",
+            "unnamedContentTypeHint": "Ce type de contenu est sans nom. Il ne pourra pas être utilisé dans le jeu tant qu’il ne sera pas nommé.",
+            "typeName": "Nom du type de contenu",
+            "typeNameHint": "Le nom du type de contenu tel qu’il sera utilisé dans le code. Exemples : Equipement, CompetenceEnemie, Villes.",
+            "typeReadableName": "Nom affiché",
+            "typeReadableNameHint": "Le nom affiché du type de contenu, qui est utilisé ici et dans les éditeurs de contenus.",
+            "icon": "Icône",
+            "typeSpecification": "Structure du type de contenu",
+            "fieldName": "Nom",
+            "fieldNameHint": "Le nom du champ tel qu’il sera utilisé dans le code. Exemples : puissance, pointsDeVie, typeApparition.",
+            "fieldReadableName": "Nom affiché",
+            "fieldReadableNameHint": "La version affiché du nom, utilisé dans l’éditeur de contenu.",
+            "fieldType": "Type",
+            "deleteContentType": "Supprimer ce type de contenu",
+            "confirmDeletionMessage": "Êtes-vous sûr de vouloir supprimer ce type de contenu ? Ceci est irréversible et supprimera également tous les objets de ce type de contenu.",
+            "gotoEntries": "Voir les objets",
+            "entries": "Objets",
+            "array": "Liste"
         },
-        "contentTypes": ""
+        "contentTypes": "Types de contenu"
     },
     "modules": {
         "author": "Auteur de ce CatMod",
         "help": "Référence",
         "info": "Info",
         "license": "Licence",
-        "logs": "Changelog",
+        "logs": "Journal des modifications",
         "methods": "Méthodes",
-        "parameters": "Paramétres",
-        "logs2": "Changelog",
+        "parameters": "Paramètres",
+        "logs2": "Journal des modifications",
         "settings": "Réglages",
         "importModules": "Importer un module",
-        "dependencies": "",
-        "optionalDependencies": "",
-        "enabledModules": "",
-        "availableModules": "",
-        "filter": "",
+        "dependencies": "Dépendances:",
+        "optionalDependencies": "Dépendances optionnelles:",
+        "enabledModules": "Modules activés",
+        "availableModules": "Modules disponibles",
+        "filter": "Filtre",
         "categories": {
-            "customization": "",
-            "utilities": "",
-            "media": "",
-            "misc": "",
-            "desktop": "",
-            "motionPlanning": "",
-            "inputs": "",
-            "fx": "",
-            "mobile": "",
-            "integrations": "",
-            "tweaks": "",
-            "networking": ""
+            "customization": "Personnalisation",
+            "utilities": "Utilitaires",
+            "media": "Multimédia",
+            "misc": "Autres",
+            "desktop": "Compilations PC",
+            "motionPlanning": "Planification de mouvements",
+            "inputs": "Méthodes de saisie",
+            "fx": "Effets spéciaux",
+            "mobile": "Périphériques mobiles",
+            "integrations": "Intégrations",
+            "tweaks": "Ajustements",
+            "networking": "Réseau"
         },
-        "preview": "",
-        "previewTooltip": "",
-        "deprecatedTooltip": ""
+        "preview": "(aperçu)",
+        "previewTooltip": "Ce module n’a pas encore été publié et est réservé pour de la prévisualisation",
+        "deprecatedTooltip": "Ce module est déprécié est sera retiré dans les prochaines versions"
     },
     "texture": {
         "create": "Créer",
         "import": "Importer",
-        "skeletons": "Animation squelettique",
-        "createTemplate": "",
-        "importFromClipboard": "",
-        "generatePlaceholder": "",
-        "textures": ""
+        "skeletons": "Animation articulée",
+        "createTemplate": "S’en servir pour créer un modèle",
+        "importFromClipboard": "Importer depuis le presse-papier",
+        "generatePlaceholder": "Générer une texture de substitut",
+        "textures": "Textures"
     },
     "sounds": {
         "create": "Créer",
-        "record": ""
+        "record": "Enregistrer"
     },
     "styles": {
         "create": "Créer",
@@ -395,615 +398,642 @@
     "particleEmitters": {
         "emittersHeading": "Émetteur de particules",
         "emitterHeading": "Émetteur",
-        "from": "Depuis:",
-        "to": "Pour:",
+        "from": "Depuis :",
+        "to": "Jusqu’à :",
         "textureHeading": "Texture",
-        "selectTexture": "Sélect…",
-        "importBuiltin": "Défaut importation…",
-        "colorAndOpacityHeading": "Couleur et Opacitée",
+        "selectTexture": "Sélectionner…",
+        "importBuiltin": "Importer par défaut…",
+        "colorAndOpacityHeading": "Couleur et Opacité",
         "stepped": "Palette",
         "steppedColor": "Couleur",
         "steppedAlpha": "Opacitée",
-        "blendMode": "Mode de fusion:",
-        "regular": "Régulier",
-        "darken": "Sombre",
-        "lighten": "Lumineux",
-        "burn": "Enflammer",
-        "scalingHeading": "Mise à l'échelle",
-        "scale": "Échelle:",
-        "minimumSize": "Taille minimum:",
+        "blendMode": "Mode de combinaison:",
+        "regular": "Normal",
+        "darken": "Assombrir",
+        "lighten": "Éclaircir",
+        "burn": "Brûler",
+        "scalingHeading": "Mise à l’échelle",
+        "scale": "Échelle :",
+        "minimumSize": "Taille minimale :",
         "minimumSizeHint": "Si vous le réglez sur des valeurs inférieures, la taille de chaque particule sera aléatoire. Plus les valeurs sont faibles, plus l'effet est fort.",
         "velocityHeading": "Velocité",
-        "velocity": "Velocité:",
-        "minimumSpeed": "Vitesse minimum:",
-        "minimumSpeedHint": "Régler sur des petite valeurs réduit la vitesse des particules.",
-        "maxSpeed": "Vitesse maximal:",
+        "velocity": "Velocité :",
+        "minimumSpeed": "Vitesse minimale :",
+        "minimumSpeedHint": "Si vous le réglez sur des valeurs inférieures, la vitesse de chaque particule sera aléatoire. Plus les valeurs sont faibles, plus l'effet est fort.",
+        "maxSpeed": "Vitesse maximale :",
         "gravityHeading": "Gravité",
-        "gravityNotice": "Notez que s'il diffère de (0; 0), l'interpolation de la vitesse sera désactivée, ce qui signifie que seul le premier nœud du graphique de vitesse aura l'effet.",
+        "gravityNotice": "Notez que si elle est différente de (0; 0), l'interpolation de la vitesse sera désactivée, ce qui signifie que seul le premier nœud du graphique de vitesse sera pris en compte.",
         "directionHeading": "Direction",
         "startingDirection": "Direction de départ",
-        "preserveTextureDirection": "Préservé la rotation de la texture",
+        "preserveTextureDirection": "Préserver la direction de la texture",
         "rotationHeading": "Rotation",
         "rotationSpeed": "Vitesse de rotation",
-        "rotationAcceleration": "Accélération de la rotation:",
-        "spawningHeading": "Multiplication",
-        "timeBetweenBursts": "Temps entre les rafales:",
+        "rotationAcceleration": "Accélération de la rotation",
+        "spawningHeading": "Taux d’apparition",
+        "timeBetweenBursts": "Temps entre les rafales :",
         "spawnAtOnce": "Apparition immédiate:",
-        "chanceToSpawn": "Facteur chance d'apparition des particules:",
-        "maxParticles": "Particules Maximal:",
-        "lifetime": "Temps de vie des particule, en seconde.",
-        "emitterLifetime": "Temps de vie de l'émetteur, en seconde.:",
-        "prewarmDelay": "Prewarm / delay, sec.:",
-        "prewarmDelayNotice": "Negative values will prepare the particles of the emitter before showing it, which is useful for long effects like dust particles or mist that should already be visible on room start; positive values will delay the simulation.",
+        "chanceToSpawn": "Probabilité d'apparition des particules :",
+        "maxParticles": "Nombre maximal de particules :",
+        "lifetime": "Temps de vie des particule, en secondes.",
+        "emitterLifetime": "Temps de vie de l’émetteur, en secondes :",
+        "prewarmDelay": "Préchauffer / délais, en secondes :",
+        "prewarmDelayNotice": "Une valeur négative préparera les particules du système avant de les afficher, cela peut s’avérer pratique pour des  effets comme de la fumée ou du brouillard qui doit être visible dès le lancement de la salle. Une valeur positive retardera le début de leur affichage.",
         "shapeAndPositioningHeading": "Forme et Positionnement",
-        "spawnType": "Type de formes:",
+        "spawnType": "Type de formes :",
         "spawnShapes": {
             "point": "Point",
             "rectangle": "Rectangle",
             "circle": "Cercle",
-            "ring": "Couronne",
+            "ring": "Anneau",
             "star": "Étoile"
         },
-        "width": "Largeur:",
-        "height": "Hauteur:",
-        "radius": "Rayon:",
-        "starPoints": "Points:",
-        "startAngle": "Rotation, deg.:",
-        "relativeEmitterPosition": "Position relative pour un autre émetteur",
+        "width": "Largeur :",
+        "height": "Hauteur :",
+        "radius": "Rayon :",
+        "starPoints": "Points :",
+        "startAngle": "Rotation, en degrés:",
+        "relativeEmitterPosition": "Position relative à d’autres émétteurs",
         "addEmitter": "Ajouter un nouveau émetteur",
-        "reset": "Réinitialiser la prévisualisation",
-        "changeBg": "Changer le background",
-        "inspectorComplete": "Complet!",
-        "alreadyHasAnImportingTexture": "Vous avez déjà une texture nommer $1. Supprimez-le ou renommez-le :)",
-        "showShapeVisualizer": "",
-        "changeGrid": "",
-        "newGridSize": "",
-        "setPreviewTexture": ""
+        "reset": "Réinitialiser l’aperçu",
+        "changeBg": "Changer l’arrière plan",
+        "inspectorComplete": "Terminé !",
+        "alreadyHasAnImportingTexture": "Vous avez déjà une texture nommée $1. Supprimez-la ou renommez-la; vous avez probablement importé la même texture que précédemment  :)",
+        "showShapeVisualizer": "Afficher la forme d’apparition",
+        "changeGrid": "Définir la taille de la grille",
+        "newGridSize": "Nouvelle taille de grille :",
+        "setPreviewTexture": "Définir une texture d’aperçu"
     },
     "rooms": {
         "create": "Ajouter",
         "makeStarting": "Définir comme salle de départ"
     },
     "notepad": {
-        "local": "Note du projet",
-        "global": "Toutes les notes",
-        "backToHome": "Retourner à la documentations",
-        "modulesPages": "",
-        "helpPages": "Aides"
+        "local": "Notes du projet",
+        "global": "Notes globales",
+        "backToHome": "Retourner à l’accueil de la documentation",
+        "modulesPages": "Documentation des modules",
+        "helpPages": "Apprendre"
     },
     "docsShortcut": {
         "openDocs": "Ouvrir la documentation"
     },
     "patreon": {
-        "aboutPatrons": "Les Patrons sont des personnes qui manifestent leur soutien à CamigoGames, sous forme de dons récurrents, tout les donnateurs ne viennent pas forcément de Ct.js certain(e)s utilisent d'autres support créer par ComigoGames. Astuces si vous faites un don à ComigoGames via Patreon, vous obtiendrez un lien vers votre projet ici - c'est ma petite aide pour vos créations :)",
+        "aboutPatrons": "Les Patrons sont des personnes qui manifestent leur soutien à CamigoGames, sous forme de dons récurrents. Tout les donateurs ne viennent pas forcément de Ct.js : certain(e)s utilisent d'autres support crée par ComigoGames. Conseil : si vous êtes créateur et faites un don à ComigoGames via Patreon, vous obtiendrez un lien vers votre projet ici - c'est ma petite aide pour vos créations :)",
         "patronsHeader": "Nos Patrons",
-        "businessShuttles": "Navettes Spaciale",
-        "noShuttlesYet": "Aucune navette Spaciale pour le moment :c Votre entreprise est peut-être la première, cependant!",
-        "shuttlesDescription": "Les navettes Spaciale sont considérées comme partenaires de ct.js. Ils sont répertoriés sur la page d'accueil de ct.js et ses pages de magasin.",
-        "spacePirates": "Space Pirates",
-        "noPiratesYet": "Il n'y a pas encore de Space Pirates :c",
-        "piratesDescription": "Les Space Pirates bénéficient d'un support prioritaire sur le serveur Discord avec un rôle sympa, et obtenez la liste ici.",
-        "spaceProgrammers": "Space Programmers",
-        "programmersDescription": "\"Space Programmer\" est un niveau hérité qui était disponible avant que ct.js ne devienne open-source et n'apporte des sources de jeux de jam aux clients.",
-        "aspiringAstronauts": "Aspiring Astronauts",
-        "noAstronautsYet": "Il n'y a pas encore d'Aspiring Astronauts :c",
-        "astronautsDescription": "Les Astronauts on un rôle spécial sur le discord!",
-        "thankAllPatrons": "Merci à tout les ComigoGames patrons, actuelles et anciennes, car votre soutien permet à Comigo d'avancer et de créer de meilleures applications! :)",
-        "becomeAPatron": "Become a patron",
+        "businessShuttles": "Navette d’Affaires",
+        "noShuttlesYet": "Aucune Navette d’Affaires pour le moment :c Votre entreprise est peut-être la première, qui sait !",
+        "shuttlesDescription": "Les Navettes d’Affaires sont considérées comme des partenaires de ct.js. Ils sont répertoriés sur la page d'accueil de ct.js et ses pages de magasin.",
+        "spacePirates": "Pirates de l’espace",
+        "noPiratesYet": "Il n'y a pas encore de Pirate de l’Espace :c",
+        "piratesDescription": "Les Pirates de l’Espace bénéficient d'un support prioritaire sur le serveur Discord avec un rôle sympa, et sont listés ici.",
+        "spaceProgrammers": "Programmeurs de l’Espace",
+        "programmersDescription": "\"Programmeur de l’Espace\" est un titre hérité qui était disponible avant que ct.js ne devienne open-source et apportait les codes sources des jeux de jam aux patrons.",
+        "aspiringAstronauts": "Astronaute en herbe",
+        "noAstronautsYet": "Il n'y a pas encore d'Astronaute en herbe :c",
+        "astronautsDescription": "Les Astronautes en herbe on un rôle spécial sur le discord et sont listés ici !",
+        "thankAllPatrons": "Merci à tout les  patrons de ComigoGames, présents et passés, car votre soutien permet à Comigo d'avancer et de créer de meilleures applications ! 😊",
+        "becomeAPatron": "Devenir un patron",
         "aboutFillers": [
-            "is cool all around 😎",
-            "is nice to chat with 🤗",
-            "has yet to become a star 💫",
-            "is just a prodigy ⭐️",
-            "is a good friend 🤝",
-            "is reliable 🙏",
-            "has a golden heart 🧡",
-            "is a magician 🔮",
-            "is here to help! 💪",
-            "is a superhero 🦸‍",
-            "has yet to show 🦹‍",
-            "is an unsolved mystery 🔍",
-            "is epic! ✨",
-            "is probably a robot 🤖",
-            "is like a blazing fire! 🔥",
-            "brings light and hope 🌞",
-            "is elegant and beautiful 🎩"
+            "est toujours cool 😎",
+            "a des conversations sympas 🤗",
+            "est en passe de devenir une star 💫",
+            "est un prodige tout simplement ⭐️",
+            "est un bon ami 🤝",
+            "est digne de confiance 🙏",
+            "a un cœur en or 🧡",
+            "est un magicien 🔮",
+            "est là pour aider ! 💪",
+            "est un super héro 🦸‍",
+            "a du potentiel 🦹‍",
+            "est un mystère encore non résolu 🔍",
+            "est épique ! ✨",
+            "est probablement un robot 🤖",
+            "est un brasier ardant ! 🔥",
+            "apporte clarté et espoir 🌞",
+            "est élégant est superbe 🎩"
         ]
     },
     "docsPanel": {
-        "documentation": "",
-        "reference": ""
+        "documentation": "Documentation",
+        "reference": "Référence"
     },
     "extensionsEditor": {
-        "noEntries": "",
-        "addRow": "",
-        "actions": "",
-        "values": "",
-        "moveDown": "",
-        "moveUp": "",
-        "deleteRow": ""
+        "noEntries": "Aucun objet",
+        "addRow": "Ajouter un objet",
+        "actions": "Actions",
+        "values": "Valeurs",
+        "moveDown": "Descendre",
+        "moveUp": "Monter",
+        "deleteRow": "Supprimer l’objet"
     },
     "textureGenerator": {
-        "name": "",
-        "width": "",
-        "height": "",
-        "color": "",
-        "label": "",
-        "optional": "",
-        "createAndClose": "",
-        "createAndContinue": "",
-        "scalingAtX4": "",
-        "generationSuccessMessage": "",
-        "filler": "",
-        "fillerNone": "",
-        "fillerCross": "",
-        "fillerLabel": "",
-        "form": "",
-        "formRectangular": "",
-        "formRound": "",
-        "formDiamond": "",
-        "fillerArrow": ""
+        "name": "Nom de la texture :",
+        "width": "Largeur :",
+        "height": "Hauteur :",
+        "color": "Couleur d’arrière plan :",
+        "label": "Nom :",
+        "optional": "(optionnel)",
+        "createAndClose": "Créer et fermer",
+        "createAndContinue": "Créer et en ajouter une nouvelle",
+        "scalingAtX4": "Grossir ×4 pour une petite texture",
+        "generationSuccessMessage": "La texture $1 a bien été ajoutée au projet.",
+        "filler": "Remplissage :",
+        "fillerNone": "Aucun",
+        "fillerCross": "Croix",
+        "fillerLabel": "Label",
+        "form": "Forme",
+        "formRectangular": "Rectangle",
+        "formRound": "Rond",
+        "formDiamond": "Diamant",
+        "fillerArrow": "Flèche"
     },
     "textureInput": {
-        "jumpToTexture": "",
-        "changeTexture": ""
+        "jumpToTexture": "Aller à la texture",
+        "changeTexture": "Changer la texture"
     },
     "writableFolderPrompt": {
-        "headerSelectFolderForData": "",
-        "paragraphCouldNotPickDirectory": "",
-        "paragraphDirectoryDirections": "",
-        "selectFolder": ""
+        "headerSelectFolderForData": "Sélectionner un dossier pour les données ct.js",
+        "paragraphCouldNotPickDirectory": "Oups ! Ct.js ne trouve pas le dossier pour les projets, exports et compilations de débogage. En temps normal, Ct.js le trouve tout seul mais tous les dossiers qu’il trouve sont en lecture seule !",
+        "paragraphDirectoryDirections": "Cependant cela peut être corrigé. Cliquez sur le bouton ci-dessous et sélectionnez un dossier où enregistrer les données. En cas de doute, vous pouvez créer un dossier « ct.js » dans votre dossier Documents.",
+        "selectFolder": "Choisir un dossier…"
     },
     "writableFolderSelector": {
-        "folderDoesNotExist": "",
-        "notADirectory": "",
-        "folderNotWritable": "",
-        "complete": ""
+        "folderDoesNotExist": "Il semblerait que ce dossier n’existe pas… Comment est-ce possible ?",
+        "notADirectory": "Il semblerait que ce n’est pas un dossier ! Comment est-ce possible ?",
+        "folderNotWritable": "Vous n’avez pas les accès en écriture de ce dossier. Choisissez en un autre.",
+        "complete": "Le dossier est bien défini, tout est bon ✅"
     },
     "mainMenu": {
         "troubleshooting": {
-            "toggleDevTools": "",
-            "copySystemInfo": "",
-            "systemInfoWait": "",
-            "systemInfoDone": "",
-            "disableAcceleration": "",
-            "disableBuiltInDebugger": "",
-            "postAnIssue": "",
-            "heading": ""
+            "toggleDevTools": "Basculer les outils de développement",
+            "copySystemInfo": "Copier les informations système",
+            "systemInfoWait": "Patientez un instant, je récupère toutes les données…",
+            "systemInfoDone": "Terminé !",
+            "disableAcceleration": "Désactiver l’accélération graphique (nécessite un redémarrage)",
+            "disableBuiltInDebugger": "Désactiver le débogueur intégré",
+            "postAnIssue": "Publier un ticket sur GitHub…",
+            "heading": "Dépannage"
         },
         "deploy": {
-            "exportDesktop": "Exporter pour le bureau",
-            "successZipExport": "Exporté avec succès vers {0}",
-            "zipExport": "Exporter en .zip",
-            "heading": "",
-            "exportAndroid": ""
+            "exportDesktop": "Exporter pour PC",
+            "successZipExport": "Exporté avec succès vers {0}.",
+            "zipExport": "Exporter pour le web",
+            "heading": "Déployer",
+            "exportAndroid": "Exporter pour Android…"
         },
         "latestProjects": {
             "recentProjects": "Projets récents"
         },
         "settings": {
             "language": "Langue",
-            "translateToYourLanguage": "Traduisez ct.js dans votre langue!",
+            "translateToYourLanguage": "Traduisez ct.js dans votre langue !",
             "theme": "Thème",
             "themes": {
                 "Day": "Clair",
                 "Night": "Sombre",
-                "SpringStream": "",
-                "LucasDracula": "",
-                "Horizon": "",
-                "HCBlack": "",
-                "RosePine": "",
-                "RosePineMoon": "",
-                "RosePineDawn": ""
+                "SpringStream": "Écoulement printanier",
+                "LucasDracula": "Dracula Lucas",
+                "Horizon": "Horizon",
+                "HCBlack": "Noir fort contraste",
+                "RosePine": "Pin rosé",
+                "RosePineMoon": "Pin rosé nocturne",
+                "RosePineDawn": "Pin rosé crépuscule"
             },
-            "codeFontDefault": "Font par défault (Iosevka Light)",
-            "codeFontOldSchool": "Old school",
+            "codeFontDefault": "Police par défault (Iosevka Light)",
+            "codeFontOldSchool": "Vintage",
             "codeFontSystem": "Système",
-            "codeFontCustom": "Customiser..",
-            "newFont": "Nouvelle font:",
-            "codeFont": "Font pour codé",
-            "codeLigatures": "Liaisons",
-            "codeDense": "Épaisse disposition",
-            "heading": "Paramètres",
-            "disableSounds": "",
-            "changeDataFolder": "",
-            "forceProductionForDebug": "",
-            "prideMode": "",
-            "altTemplateLayout": ""
+            "codeFontCustom": "Personnaliser…",
+            "newFont": "Nouvelle police :",
+            "codeFont": "Police du code",
+            "codeLigatures": "Ligatures",
+            "codeDense": "Mise en page dense",
+            "heading": "Réglages",
+            "disableSounds": "Désactiver les sons de l’interface",
+            "changeDataFolder": "Définir l’emplacement des données de l’éditeur",
+            "forceProductionForDebug": "Forcer les réglages de production pour les exports de débogage",
+            "prideMode": "Mode #pride",
+            "altTemplateLayout": "Mise en page alternative pour l’éditeur de modèle"
         },
         "project": {
             "save": "Sauvegarder le projet",
             "openIncludeFolder": "Ouvrir le dossier \"include\"",
-            "openProject": "",
-            "openExample": "",
+            "openProject": "Ouvrir un projet…",
+            "openExample": "Ouvrir un projet d’exemple…",
             "startScreen": "Retourner à l'écran de démarrage",
-            "successZipProject": "Le projet à été compressé avec succès vers {0}",
+            "successZipProject": "Le projet à été compressé avec succès vers {0}.",
             "zipProject": "Compresser le projet en .zip",
-            "heading": ""
+            "heading": "Projet"
         },
         "meta": {
-            "license": "Licence",
-            "visitDiscordForGamedevSupport": "",
-            "openIconList": "",
-            "heading": "",
-            "twitter": "",
-            "vkontakte": "",
-            "ctjsForum": "",
-            "openStylebook": ""
+            "license": "Licences",
+            "visitDiscordForGamedevSupport": "Serveur Discord",
+            "openIconList": "Ouvrir la liste des icônes",
+            "heading": "Meta",
+            "twitter": "Page Twitter",
+            "vkontakte": "Communauté publique Vkontakte",
+            "ctjsForum": "Rejoindre le forum ct.js",
+            "openStylebook": "Ouvrir le livre de styles CSS"
         }
     },
     "appView": {
         "ctIDE": "ct.IDE",
-        "texture": "Graphiques",
-        "launch": "Compiler",
-        "launchHotkeys": "(F5/ Alt+F5 pour lancer votre navigateur par défaut",
+        "texture": "Textures",
+        "launch": "Lancer",
+        "launchHotkeys": "(F5/ Alt+F5 pour lancer dans votre navigateur par défaut",
         "min": "Fenêtré",
         "patrons": "Patrons",
-        "rooms": "Salons",
-        "sounds": "Sons",
+        "rooms": "Salles",
+        "sounds": "Audio",
         "ui": "IU",
-        "fx": "FX",
-        "restart": "",
-        "project": "",
-        "templates": "Types",
+        "fx": "Effets spéciaux",
+        "restart": "Relancer",
+        "project": "Projet",
+        "templates": "Modèles",
         "tour": {
-            "header": "",
-            "aboutTour": "",
-            "helpPanel": "",
-            "helpPanelTabs": "",
-            "projectResources": "",
-            "tabTextures": "",
-            "tabTexturesImport": "",
-            "tabTexturesGallery": "",
-            "tabTexturesClipboard": "",
-            "tabTexturesPlaceholders": "",
-            "tabTemplates": "",
-            "tabRooms": "",
-            "tabSounds": "",
-            "tabSoundsImport": "",
-            "tabSoundsGallery": "",
-            "tabSoundsRecord": "",
-            "tabInterlude": "",
-            "tabUI": "",
-            "tabFX": "",
-            "tabProject": "",
-            "tabProjectModules": "",
-            "tabProjectModuleDocs": "",
-            "tabMainMenu": "",
-            "tabMainMenuSettings": "",
-            "tabMainMenuMeta": "",
-            "helpPanelReminder": "",
-            "buttonStartTutorial": ""
+            "header": "Aperçu de ct.js",
+            "aboutTour": "Bienvenue dans ct.js ! Cette petite visite va vous présenter les outils principaux de l’éditeur, pour que vous puissiez configurer ct.js et créer de nouvelles ressources.",
+            "helpPanel": "Avant tout, observez ce subtil bouton. Il est très important pour apprendre ct.js !",
+            "helpPanelTabs": "Ce panneau comporte toute la documentation officielle et des tutoriels pour ct.js et ses modules, et également deux bloc notes pour conserver vos idées. Les notes globales sont partagées entre tous les projets et sont enregistrées sur votre machine. Les notes du projet sont enregistrées dans votre projet.",
+            "projectResources": "Maintenant, chaque projet comporte différent type de ressources. Chaque type de ressource possède son propre onglet. Jetons un œil aux plus importants.",
+            "tabTextures": "Les textures sons des images utilisées sur les objets intéractifs (que l’on appelle « copies »), les arrières plans et les effets spéciaux. Les textures ne font rient en soit mais sont nécessaires pour créer un jeu.",
+            "tabTexturesImport": "Vous pouvez importer des textures depuis votre appareil…",
+            "tabTexturesGallery": "…ou depuis la bibliothèque intégrée de texture prêtes à l’emploi.",
+            "tabTexturesClipboard": "Ce bouton insère les images copiées depuis le presse-papier. Plutôt pratique quand on travaille sur un éditeur d’image !",
+            "tabTexturesPlaceholders": "Vous pouvez aussi générer des images de substitut avec cet outil.",
+            "tabTemplates": "Les modèles servent à crées des copies — des objets interactifs que vous placez dans vos niveaux. Tous les objets interactifs de ct.js sont créés grâce à l’un de nos modèles. Ils utilisent vos textures et vous en définissez la logique de jeu en associant des évènements. Une fois que vous aurez créé un modèle, vous pouvez lancer son tutoriel dédié dans l’éditeur de modèles.",
+            "tabRooms": "Un autre onglet important est celui des salles. Les salles peuvent aussi être appelées niveaux ou scènes, à l’intérieur desquelles vous placez vos copies. Les salles peuvent également avoir leur propres évènements et arrière plans.",
+            "tabSounds": "Sons est, très probablement, l’onglet le plus explicite.",
+            "tabSoundsImport": "Vous pouvez créer de nouveaux sons avec ce bouton…",
+            "tabSoundsGallery": "…les importer depuis la bibliothèque intégrée de sons…",
+            "tabSoundsRecord": "…ou bien même les enregistrer avec votre micro !",
+            "tabInterlude": "Il y a aussi deux autres onglets pour des ressources plus avancées.",
+            "tabUI": "L’onglet IU (interface utilisateur) gère la police et les styles de texte. Embarquer vos polices dans votre jeu est important pour qu’il s’affiche de manière consistant sur tous les appareils. Les styles de texte ont un éditeur visuel pour créer des modèles de style. Ils produisent également du code pour la création de label.",
+            "tabFX": "L’onglet Effets Spéciaux a un éditeur pour les systèmes de particules — des effets visuels pour les explosions, la magie, la fumée, la pluie et tous ces genres d’effets.",
+            "tabProject": "C’est tout pour les ressources ! Mais en plus de ça, votre projet comporte tout un tas de réglages pour le rendu visuel, la publication, l’export et plus encore.",
+            "tabProjectModules": "Ct.js est modulaire, et vos projets auront probablement besoins de modules additionnels qui peuvent êtres installés ici.",
+            "tabProjectModuleDocs": "Toute la documentation des modules activés peut être consultée ici.",
+            "tabMainMenu": "Ct.js possède lui aussi un paquet  d’autres options, qui sont disponibles dans le menu principal.",
+            "tabMainMenuSettings": "Vous pouvez changer la langue et l’apparence de ct.js dans la section Réglages.",
+            "tabMainMenuMeta": "Si vous avez besoin d’aide dans le futur, vous pourrez trouver tous les liens et réseaux dans la section Meta.",
+            "helpPanelReminder": "N’oubliez pas, vous pouvez toujours consulter la documentation intégrée ! Nous conseillons de compléter un tutoriel officiel avant de commencer votre propre projet.",
+            "buttonStartTutorial": "Ouvrir les tutoriels"
         }
     },
     "assetViewer": {
-        "addNewGroup": "",
-        "ungrouped": "",
-        "newGroupName": "",
-        "groupDeletionConfirmation": ""
+        "addNewGroup": "Nouveau groupe",
+        "ungrouped": "Afficher ceux dans aucun groupe",
+        "newGroupName": "Nouveau groupe",
+        "groupDeletionConfirmation": "Êtes-vous sûr de vouloir supprimer ce groupe ? Toutes les ressources associées seront retiré de ce groupe."
     },
     "groupEditor": {
-        "groupEditor": "",
-        "icon": "",
-        "color": ""
+        "groupEditor": "Éditeur de groupe",
+        "icon": "Icône :",
+        "color": "Couleur :"
     },
     "soundRecorder": {
-        "recorderHeading": "",
-        "record": "",
-        "stopRecording": "",
-        "discardRecording": "",
-        "finishRecording": "",
-        "cannotRecordSound": "",
-        "troubleshootingWindows": ""
+        "recorderHeading": "Enregistreur",
+        "record": "Démarrer l’enregistrement",
+        "stopRecording": "Arrêter l’enregistrement",
+        "discardRecording": "Ignorer l’enregistrement",
+        "finishRecording": "Terminer l’enregistrement",
+        "cannotRecordSound": "Impossible de commencer l’enregistrement : Vérifiez vos paramètres audio et votre périphérique d’enregistrement.",
+        "troubleshootingWindows": "Sur Windows, vérifiez également dans Paramètres → Confidentialité → Microphone que ct.js a la permission d’accéder au micro."
     },
     "roomBackgrounds": {
-        "add": "Ajouter un background",
-        "depth": "Fond",
-        "movement": "Vitesse de mouvement (X, Y):",
-        "parallax": "Parallaxe (X, Y):",
-        "repeat": "Répétition",
-        "scale": "Échelle: (X, Y):",
-        "shift": "Décalage (X, Y):",
-        "notBackgroundTextureWarning": "",
-        "fixBackground": "",
-        "dismissWarning": ""
+        "add": "Ajouter un arrière-plan",
+        "depth": "Profondeur :",
+        "movement": "Vitesse de déplacement :",
+        "parallax": "Parallaxe :",
+        "repeat": "Répéter :",
+        "scale": "Échelle :",
+        "shift": "Décalage :",
+        "notBackgroundTextureWarning": "Cette texture n’est pas marquée comme arrière-plan. Elle aura des espacements lors de l’export.",
+        "fixBackground": "À corriger.",
+        "dismissWarning": "Ignorer."
     },
     "roomTiles": {
         "moveTileLayer": "Déplacer vers une nouvelle profondeur",
-        "show": "Montrer la couche",
-        "hide": "Cacher la couche",
-        "findTileset": "Trouver un Tileset"
+        "show": "Montrer le calque",
+        "hide": "Cacher le calque",
+        "findTileset": "Trouver un set de tuiles",
+        "addTileLayer": "Ajouter un calque de tuiles"
     },
     "roomView": {
-        "name": "Name:",
-        "width": "Largeur:",
-        "height": "Hauteur",
-        "events": "Salle events",
-        "copies": "Copier",
-        "backgrounds": "Backgrounds",
-        "tiles": "Tiles",
+        "name": "Nom :",
+        "width": "Largeur de la vue :",
+        "height": "Hauteur de la vue :",
+        "events": "Évènements",
+        "copies": "Copies",
+        "backgrounds": "Arrière-plans",
+        "tiles": "Tuiles",
         "add": "Ajouter",
         "none": "Rien",
-        "done": "Terminer",
-        "grid": "Définir la grille",
-        "hotkeysNotice": "Ctrl = Supprimer, Alt = Désactive la grille, Shift = Multiplie",
+        "done": "Terminé",
+        "grid": "Grille",
+        "hotkeysNotice": "Ctrl = Supprimer, Alt = Ignorer la grille, Shift = Sélection multiple",
         "hotkeysNoticeMovement": "Ctrl = Supprimer, Shift = Sélectionner",
-        "shift": "Décale la vue",
-        "step": "On Step",
-        "create": "On Create",
-        "leave": "On Leave",
-        "draw": "Draw",
+        "shift": "Tout décaler",
+        "step": "À l’étape logique",
+        "create": "À la création",
+        "leave": "À la sortie",
+        "draw": "À l’affichage",
         "deleteCopies": "Supprimer les copies",
-        "shiftCopies": "Définir les coordonnées",
+        "shiftCopies": "Décaler les copies",
         "selectAndMove": "Séléctionner et déplacer",
-        "findTileset": "Trouver un Tile",
-        "properties": "",
-        "isUi": "",
-        "backgroundColor": "",
-        "sortHorizontally": "",
-        "sortVertically": "",
+        "findTileset": "Trouver un set de tuiles",
+        "properties": "Propriétés",
+        "isUi": "Est un calque IU ?",
+        "backgroundColor": "Couleur d’arrière-plan :",
+        "sortHorizontally": "Trier horizontalement",
+        "sortVertically": "Trier verticalement",
         "copyProperties": {
-            "position": "",
-            "rotation": "",
-            "scale": "",
-            "multipleValues": ""
+            "position": "Position",
+            "rotation": "Rotation",
+            "scale": "Échelle",
+            "multipleValues": "(Multiples valeurs)",
+            "opacity": "Opacité",
+            "tint": "Teinte"
         },
         "copyCustomProperties": {
-            "addProperty": "",
-            "property": "",
-            "value": ""
+            "addProperty": "Ajouter une propriété",
+            "property": "Propriété",
+            "value": "Valeur",
+            "nameOccupied": "Cette propriété est utilisée par ct.js ! Essayez de trouver un autre nom."
         },
-        "customProperties": "",
-        "restrictCamera": "",
-        "minimumX": "",
-        "minimumY": "",
-        "maximumX": "",
-        "maximumY": "",
+        "customProperties": "Propriétés personnalisées",
+        "restrictCamera": "Conserver la caméra dans un rectangle",
+        "minimumX": "X minimum",
+        "minimumY": "Y minimum",
+        "maximumX": "X maximum",
+        "maximumY": "Y maximum",
         "gridOff": "Désactiver la grille",
-        "gridSize": "Taille de la grille",
+        "gridSize": "Taille de la grille :",
         "toCenter": "Au centre",
-        "shiftLabel": "Changer de vue",
-        "newDepth": "Nouvelle profondeur:",
+        "shiftLabel": "Décaler de :",
+        "newDepth": "Nouvelle profondeur :",
         "deleteCopy": "Supprimer la copie {0}",
         "changeCopyScale": "Changer l'échelle",
         "shiftCopy": "Définir les coordonnées",
-        "deleteTile": "Supprimer un Tile",
-        "deleteTiles": "Supprimer les Tiles",
-        "moveTilesToLayer": "Déplacer le calque",
-        "shiftTiles": "Déplacer les Tiles",
-        "changeCopyRotation": "",
-        "simulate": "",
-        "toggleDiagonalGrid": "",
-        "changeGridSize": "",
-        "xrayMode": "",
-        "colorizeTileLayers": "",
+        "deleteTile": "Supprimer une tuile",
+        "deleteTiles": "Supprimer les tuiles",
+        "moveTilesToLayer": "Déplacer vers le calque",
+        "shiftTiles": "Décaler les tuiles",
+        "changeCopyRotation": "Appliquer une rotation",
+        "simulate": "Simuler",
+        "toggleDiagonalGrid": "Grille en diagonale",
+        "changeGridSize": "Changer la taille des cellules",
+        "xrayMode": "Mode rayons-X",
+        "colorizeTileLayers": "Coloriser les calques de tuiles",
         "tools": {
-            "select": "",
-            "addCopies": "",
-            "addTiles": "",
-            "manageBackgrounds": "",
-            "roomProperties": ""
-        }
+            "select": "Outil de sélection",
+            "addCopies": "Ajouter des copies",
+            "addTiles": "Ajouter des tuiles",
+            "manageBackgrounds": "Gérer les arrières-plans",
+            "roomProperties": "Propriétés de la salle"
+        },
+        "resetView": "Réinitialiser la vue"
     },
     "styleView": {
-        "active": "Activer",
-        "alignment": "Alignement",
+        "active": "Actif",
+        "alignment": "Alignement :",
         "apply": "Appliquer",
         "fill": "Remplir",
         "font": "Police",
         "italic": "Italique",
-        "lineHeight": "Hauteur de ligne",
+        "lineHeight": "Hauteur de ligne :",
         "shadow": "Ombre",
-        "stroke": "Contour",
+        "stroke": "Barré",
         "textWrap": "Retour à la ligne",
-        "textWrapWidth": "Retour maximum:",
-        "useCustomFont": "",
-        "code": "",
-        "copyCode": "",
-        "fillColor": "Couleur:",
-        "fillColor1": "Couleur 1:",
-        "fillColor2": "Couleur 2:",
-        "fillGrad": "Dégrader",
-        "fillGradType": "Type de dégrader",
+        "textWrapWidth": "Largeur maximum :",
+        "useCustomFont": "Police personnalisée…",
+        "code": "Code",
+        "copyCode": "Copier",
+        "fillColor": "Couleur :",
+        "fillColor1": "Couleur 1 :",
+        "fillColor2": "Couleur 2 :",
+        "fillGrad": "Dégradé",
+        "fillGradType": "Type de dégradé :",
         "fillHorizontal": "Horizontal",
-        "fillSolid": "Incrustation",
-        "fillType": "Type de remplissage",
+        "fillSolid": "Uniforme",
+        "fillType": "Type de remplissage :",
         "fillVertical": "Vertical",
-        "fontWeight": "Épaisseur:",
-        "shadowBlur": "Estompage",
-        "shadowColor": "Couleur de l'ombre",
-        "shadowShift": "Portée de l'ombre",
-        "strokeColor": "Couleur du contour",
-        "strokeWeight": "Épaisseur du contour",
-        "testText": "Test texte 0123 +",
-        "fontFamily": "Famille de la police",
-        "fontSize": "Taille de la police"
+        "fontWeight": "Poids :",
+        "shadowBlur": "Flou :",
+        "shadowColor": "Couleur de l'ombre :",
+        "shadowShift": "Décalage :",
+        "strokeColor": "Couleur de bordure :",
+        "strokeWeight": "Épaisseur du contour :",
+        "testText": "Texte de test 0123 + éùïêçÉÙÏÊÇ",
+        "fontFamily": "Famille de police :",
+        "fontSize": "Taille de la police :"
     },
     "textureView": {
-        "center": "Axe:",
-        "cols": "Colonnes",
+        "center": "Axe :",
+        "cols": "Colonnes :",
         "done": "Appliquer",
         "fill": "Remplir",
-        "form": "Forme de ma collision:",
-        "frames": "Compteur d'images",
-        "isometrify": "Isométrie: déplacez l'axe vers le point inférieur du milieu, remplissez l'ensemble du sprite avec un masque de collision",
-        "name": "Nom:",
-        "radius": "Rayon",
+        "form": "Forme de ma collision",
+        "frames": "Compteur d'images :",
+        "isometrify": "Isométrie: déplace l'axe vers le point inférieur bas, remplit l’ensemble du sprite avec un masque de collision",
+        "name": "Nom :",
+        "radius": "Rayon :",
         "rectangle": "Rectangle",
         "reimport": "Ré-importer",
         "round": "Cercle",
-        "rows": "Rangs:",
-        "speed": "Framerate",
-        "tiled": "Utiliser comme background",
-        "corrupted": "Le fichier est corrompu ou manquant! Fermeture maintenant.",
-        "width": "Largeur:",
-        "height": "Hauteur:",
-        "strip": "Dessiner Ligne / Polygone",
-        "removePoint": "Retirer le point",
+        "rows": "Lignes :",
+        "speed": "Taux de rafraichissement :",
+        "tiled": "Utiliser comme arrière-plan :",
+        "corrupted": "Le fichier est corrompu ou manquant ! Fermeture du fichier.",
+        "width": "Largeur :",
+        "height": "Hauteur :",
+        "strip": "Ruban / Polygone",
+        "removePoint": "Enlever le point",
         "closeShape": "Fermer la forme",
         "addPoint": "Ajouter un point",
         "moveCenter": "Déplacer au centre",
-        "movePoint": "Déplacer ce point",
+        "movePoint": "Déplacer le point",
         "symmetryTool": "Outil de symétrie",
-        "padding": "Remplissage",
-        "paddingNotice": "Cela affecte la façon dont une texture est exportée: elle ajoute des pixels en double sur les bords et empêche les artefacts de saignement sur les textures en mosaïque et à l'échelle. La valeur par défaut est généralement suffisante, mais si vous réduisez fortement les textures, le saignement peut réapparaître. Augmentez cette valeur si cette texture contient des artefacts pendant le jeu.",
-        "updateFromClipboard": "",
-        "previewAnimationNotice": "",
-        "showFrameIndices": "",
-        "blankTexture": "",
-        "pasteCollisionMask": "",
-        "copyCollisionMask": "",
-        "bgColor": "Changer la couleur du background",
-        "setCenter": "Centrer l'image",
+        "padding": "Remplissage :",
+        "paddingNotice": "Cela affecte la manière dont la texture est exportée : elle duplique les pixels sur les bords et empêche les artefacts de bavure sur les textures en mosaïque et agrandies. La valeur par défaut est généralement suffisante, mais si vous réduisez fortement les textures, une bavure peut réapparaître. Augmentez cette valeur si cette texture contient des artefacts pendant le jeu.",
+        "updateFromClipboard": "Mettre à jour depuis le presse-papier",
+        "previewAnimationNotice": "Ceci est un aperçu. Utilisez la propriété `this.animationSpeed` pour la changer sur les copies.",
+        "showFrameIndices": "Afficher les indices d’images",
+        "blankTexture": "Exporter en tant que texture vierge",
+        "pasteCollisionMask": "Coller le masque de collision",
+        "copyCollisionMask": "Copier le masque de collision",
+        "bgColor": "Changer la couleur de l’arrière-plan",
+        "setCenter": "Centre de l’image",
         "replaceTexture": "Remplacer…",
-        "showMask": "Activer/Désactiver le masque",
-        "marginX": "Marge X:",
-        "marginY": "Marge Y:",
-        "offX": "Décalage X:",
-        "offY": "Décalage Y:"
+        "showMask": "Afficher le masque",
+        "marginX": "Marge X :",
+        "marginY": "Marge Y :",
+        "offX": "Décalage X :",
+        "offY": "Décalage Y :",
+        "blankTextureNotice": "Exporte l’image comme un rectangle transparent, le rendant invisible pendant le jeu. Pratique pour créer des substituts dans l’éditeur tout en économisant de la place dans l’export du jeu."
     },
     "soundView": {
         "import": "Importer",
-        "name": "Nom:",
+        "name": "Nom :",
         "save": "Sauvegarder",
         "isMusicFile": "Ceci est une piste musicale",
-        "poolSize": "Taille de la piste:"
+        "poolSize": "Taille de la piste :"
     },
     "fontView": {
         "italic": "Format italique ?",
         "reimport": "Ré-importer",
-        "generateBitmapFont": "",
-        "bitmapFont": "",
-        "bitmapFontSize": "",
-        "bitmapFontLineHeight": "",
-        "resultingBitmapFontName": "",
-        "charset": "",
+        "generateBitmapFont": "Générer également une police Bitmap",
+        "bitmapFont": "Police Bitmap",
+        "bitmapFontSize": "Taille de la police :",
+        "bitmapFontLineHeight": "Hauteur de ligne :",
+        "resultingBitmapFontName": "Nom de la ressource",
+        "charset": "Plage de caractères :",
         "charsets": {
-            "punctuation": "",
-            "basicLatin": "",
-            "latinExtended": "",
-            "cyrillic": "",
-            "greekCoptic": "",
-            "custom": "",
-            "allInFont": ""
+            "punctuation": "Numéros et ponctuation (généralement nécessaire)",
+            "basicLatin": "Latin basique",
+            "latinExtended": "Latin étendu",
+            "cyrillic": "Cyrillique",
+            "greekCoptic": "Grec et Copte",
+            "custom": "Personnalisé",
+            "allInFont": "Utiliser tout ce que prends en charge la police"
         },
-        "customCharsetHint": "",
-        "fontWeight": "Épaisseur de la police",
-        "typefaceName": "Nom de la police"
+        "customCharsetHint": "Saisir toutes les lettres et les chiffres à utiliser, en minuscule et majuscule.",
+        "fontWeight": "Épaisseur de la police :",
+        "typefaceName": "Nom de la police :"
     },
     "licensePanel": {
-        "ctjsLicense": "Ct.js License (MIT)"
+        "ctjsLicense": "License Ct.js (MIT)",
+        "faq": "Foire aux questions (section non-normative)",
+        "whoOwnsGamesQ": "Qui possède les jeux créés dans ct.js ?",
+        "whoOwnsGamesA": "Vous et vous seul. Ct.js ne possède en aucun cas ce que vous avez créé.",
+        "sellingGamesQ": "Puis-je vendre mes jeux créés dans ct.js ?",
+        "sellingGamesA": "Oui, vous pouvez vendre vos jeux et autres projets, rassembler des dons et utiliser vos jeux de n’importe quelle manière commerciale que ce soit.",
+        "possibleFeesQ": "Ai-je besoin de payer pour utiliser ct.js ? Deviendra-t-il payant ?",
+        "possibleFeesA": "Non, ct.js est gratuit et le restera pour toujours. Nous n’avons pas de frais comme sur Unity ou Unreal Engine qui demandent une part des revenus après avoir atteint un seuil. Ct.js est open-source, et si une version payante vient à voir le jour, le produit que vous avez actuellement restera toujours accessible sans frais. Vous pouvez envoyer un don ou devenir patron ! Ça aidera à payer les factures et à rendre ct.js meilleur !",
+        "useInStudioQ": "Puis-je utiliser ct.js dans mon entreprise ou à l’école ?",
+        "useInStudioA": "Bien sûr, pourquoi pas ? Ct.js peut s’utiliser pour un projet personnel, commercial, éducatif et bien plus. Juste, n’enfreignez pas la loi, d’accord ?",
+        "attributionQ": "Dois-je mentionner ct.js ou ses créateurs ? Puis-je retirer le logo sur l’écran de démarrage ?",
+        "attributionA": "Vous pouvez désactiver le logo ct.js, le code comportant déjà les mentions nécessaires.",
+        "attributionAAssets": "Quelques exemples et démos peuvent posséder du contenu nécessitant leur citation, mais cela est déjà intégré.",
+        "theLicense": "La license (document légal)"
     },
     "templates": {
         "create": "Créer"
     },
     "templateView": {
         "change": "Changer de sprite",
-        "create": "On Create",
-        "depth": "Fond",
-        "destroy": "Détruire",
-        "done": "Terminez",
-        "draw": "Draw",
-        "name": "Nom:",
-        "step": "On Step",
-        "learnAboutTypes": "En apprendre plus sur les types de codage",
-        "visible": "",
-        "appearance": "",
-        "opacity": "",
-        "blendMode": "",
-        "playAnimationOnStart": "",
+        "create": "À la création",
+        "depth": "Profondeur :",
+        "destroy": "À la destruction",
+        "done": "Terminé",
+        "draw": "À l’affichage",
+        "name": "Nom :",
+        "step": "À l’étape logique",
+        "learnAboutTypes": "En apprendre plus comment coder les modèles",
+        "visible": "Visible",
+        "appearance": "Apparence",
+        "opacity": "Opacité :",
+        "blendMode": "Mode de \ncombinaison :",
+        "playAnimationOnStart": "Lancer l’animation au démarrage",
         "blendModes": {
-            "normal": "",
-            "add": "",
-            "multiply": "",
-            "screen": ""
+            "normal": "Normal",
+            "add": "Ajouter (Brûler)",
+            "multiply": "Multiplier (assombrir)",
+            "screen": "Écran (éclaircir)"
         },
-        "animationFPS": "",
-        "loopAnimation": ""
+        "animationFPS": "Nombre d’images par secondes :",
+        "loopAnimation": "Boucler l’annimation"
     },
     "assetInput": {
-        "changeAsset": "",
-        "jumpToAsset": "",
-        "selectAssetHeader": ""
+        "changeAsset": "Cliquez pour changer de ressource",
+        "jumpToAsset": "Aller à cette ressource",
+        "selectAssetHeader": "Sélectionner une ressource"
     },
     "builtinAssetGallery": {
-        "galleryTip": "",
-        "assetGalleryHeader": "",
-        "importIntoProject": "",
-        "importAll": "",
-        "byAuthorPrefix": "",
-        "cannotImportExplanation": "",
-        "nameOccupied": "",
-        "cannotImportNameOccupied": "",
-        "visitSource": "",
-        "visitAuthorsItch": "",
-        "visitAuthorsTwitter": "",
-        "tipAuthor": ""
+        "galleryTip": "Ceci est une galerie gratuite et intégrée comportant des textures et des sons. Toutes ces ressources sont sous license CC0 ou WTFPL, ou sont publiées sous conditions spéciales pour utilisation dans ct.js. Vous pouvez utiliser ces ressources comme vous le souhaitez, dans des projets commerciaux ou autres.",
+        "assetGalleryHeader": "Ressources",
+        "importIntoProject": "Importer dans le projet actuel",
+        "importAll": "Tout importer",
+        "byAuthorPrefix": "par",
+        "cannotImportExplanation": "Le nom que prendrait cette ressource est déjà utilisé par une autre ressource. Vous devriez renommer vos assets existants, ou bien vous avez déjà importé cette ressource ?",
+        "nameOccupied": "Nom déjà pris",
+        "cannotImportNameOccupied": "Impossible d’importer $1 tant que le nom est déjà pris.",
+        "visitSource": "Ouvrir la page du magasin de cet ensemble de ressources",
+        "visitAuthorsItch": "Visiter la page itch.io de l’auteur",
+        "visitAuthorsTwitter": "Visiter la page Twitter de l’auteur",
+        "tipAuthor": "Donner un pourboire à l’auteur pour récompenser leur travail 😁"
     },
     "scriptables": {
-        "addEvent": "",
-        "removeEvent": "",
-        "removeEventConfirm": "",
-        "changeArguments": "",
-        "eventAlreadyExists": "",
-        "localEventVars": "",
-        "createEventHint": "",
+        "addEvent": "Ajouter un évènement",
+        "removeEvent": "Supprimer l’évènement",
+        "removeEventConfirm": "Êtes-vous sûr de vouloir supprimer cet évènement ? Ceci est irréversible !",
+        "changeArguments": "Changer les arguments",
+        "eventAlreadyExists": "Un même évènement existe déjà !",
+        "localEventVars": "Variables locales",
+        "createEventHint": "Créer votre premier évènement dans la colonne de gauche et définissez votre logique ici",
         "coreEventsCategories": {
-            "lifecycle": "",
-            "actions": "",
-            "pointer": "",
-            "misc": "",
-            "animation": "",
-            "timers": ""
+            "lifecycle": "Cycle de vie",
+            "actions": "Actions",
+            "pointer": "Évènement de pointeur",
+            "misc": "Divers",
+            "animation": "Animation",
+            "timers": "Décomptes"
         },
         "coreEvents": {
-            "OnCreate": "",
-            "OnRoomStart": "",
-            "OnStep": "",
-            "OnDraw": "",
-            "OnDestroy": "",
-            "OnRoomEnd": "",
-            "OnPointerClick": "",
-            "OnPointerSecondaryClick": "",
-            "OnPointerEnter": "",
-            "OnPointerLeave": "",
-            "OnPointerDown": "",
-            "OnPointerUp": "",
-            "OnPointerUpOutside": "",
-            "OnPointerWheel": "",
-            "OnActionPress": "",
-            "OnActionRelease": "",
-            "OnActionDown": "",
-            "OnFrameChange": "",
-            "OnAnimationLoop": "",
-            "OnAnimationComplete": "",
-            "Timer": ""
+            "OnCreate": "À la création",
+            "OnRoomStart": "Au lancement de la salle",
+            "OnStep": "À l’étape de logique",
+            "OnDraw": "À l’affichage",
+            "OnDestroy": "À la destruction",
+            "OnRoomEnd": "À la sortie",
+            "OnPointerClick": "Au clic",
+            "OnPointerSecondaryClick": "Au clic secondaire",
+            "OnPointerEnter": "À l’entée du curseur",
+            "OnPointerLeave": "À la sortie du curseur",
+            "OnPointerDown": "Au début du \nclic",
+            "OnPointerUp": "À la fin du clic",
+            "OnPointerUpOutside": "À la fin du clic en dehors de la zone",
+            "OnPointerWheel": "Au défilement",
+            "OnActionPress": "Au début de l’action",
+            "OnActionRelease": "À la fin de l’action",
+            "OnActionDown": "Tout le long de l’action",
+            "OnFrameChange": "Au changement d’image",
+            "OnAnimationLoop": "À la répétition de l’animation",
+            "OnAnimationComplete": "À la fin de l’animation",
+            "Timer": "Décompte $1"
         },
         "coreParameterizedNames": {
-            "OnActionPress": "",
-            "OnActionRelease": "",
-            "OnActionDown": ""
+            "OnActionPress": "Au début de l’action %%action%%",
+            "OnActionRelease": "À la fin de l’action %%action%%",
+            "OnActionDown": "Tout le long de l’action %%action%%",
+            "Timer1": "1 · %%name%% (décompte)",
+            "Timer2": "2 · %%name%% (décompte)",
+            "Timer3": "3 · %%name%% (décompte)",
+            "Timer4": "4 · %%name%% (décompte)",
+            "Timer5": "5 · %%name%% (décompte)",
+            "Timer6": "6 · %%name%% (décompte)"
         },
         "coreEventsArguments": {
-            "action": ""
+            "action": "Action",
+            "name": "Nom",
+            "isUi": "Évènement IU"
         },
         "coreEventsLocals": {
-            "OnActionDown_value": "",
-            "OnActionPress_value": ""
+            "OnActionDown_value": "Valeur de l’action courante",
+            "OnActionPress_value": "Valeur de l’action courante"
         },
         "coreEventsDescriptions": {
-            "OnCreate": "",
-            "OnRoomStart": "",
-            "OnStep": "",
-            "OnDraw": "",
-            "OnDestroy": "",
-            "OnRoomEnd": "",
-            "OnActionPress": "",
-            "OnActionRelease": "",
-            "OnActionDown": "",
-            "OnAnimationLoop": "",
-            "OnAnimationComplete": "",
-            "Timer": ""
+            "OnCreate": "Se déclenche quand la copie est créée.",
+            "OnRoomStart": "Se déclenche quand la salle est créée, soit en remplacement, soit en l’ajoutant en tant que calque.",
+            "OnStep": "Appelé avant chaque affichage.",
+            "OnDraw": "Appelé après chaque affichage. Pratique pour mettre à jour les animations.",
+            "OnDestroy": "Se déclenche entre le début et la fin de l’affichage lorsque la copie est détruite.",
+            "OnRoomEnd": "Se déclenche quand la salle est remplacée par une autre, ou quand la salle est retirée après qu’elle soit ajoutée comme calque.",
+            "OnActionPress": "Se déclenche lorsque les entrées des actions sont actives — en appuyant, cliquant, balayant le joystick etc.",
+            "OnActionRelease": "Se déclenche lorsque les entrées de l’action deviennent inactives — en relâchant les boutons, les joysticks etc.",
+            "OnActionDown": "Se déclenche à chaque image tant qu’une action est active.",
+            "OnAnimationLoop": "Se déclenche à chaque fois que l’animation redémarre.",
+            "OnAnimationComplete": "Se déclenche sur la fin d’une animation qui ne boucle pas.",
+            "Timer": "Définit la durée du décompte en secondes avec `this.timer$1 = 3;`"
         }
     }
-}
+}
\ No newline at end of file

From 0a3d2f4b54de5233ed4e3697c7467cbb9e8d4271 Mon Sep 17 00:00:00 2001
From: taxi13245 <69149297+taxi13245@users.noreply.github.com>
Date: Mon, 12 Sep 2022 18:46:27 +0900
Subject: [PATCH 09/12] :zap: :globe_with_meridians: Update Japanese
 translations (#367 by @taxi13245)

---
 app/data/i18n/Japanese.json | 402 +++++++++++++++++++-----------------
 1 file changed, 213 insertions(+), 189 deletions(-)

diff --git a/app/data/i18n/Japanese.json b/app/data/i18n/Japanese.json
index 9d008f292..6e54ff0ef 100644
--- a/app/data/i18n/Japanese.json
+++ b/app/data/i18n/Japanese.json
@@ -66,10 +66,10 @@
             "text": "テキスト",
             "textfield": "テキストボックス",
             "texture": "テクスチャー",
-            "template": "",
-            "room": "",
-            "sound": "",
-            "tandem": ""
+            "template": "テンプレート",
+            "room": "ルーム",
+            "sound": "音",
+            "tandem": "パーティクル エミッター"
         },
         "newName": "新しい名前:",
         "saveProject": "プロジェクトを保存",
@@ -86,48 +86,46 @@
         "openAssetGallery": "",
         "assetTypes": {
             "textures": [
-                "",
-                "",
-                ""
+                "テクスチャ",
+                "テクスチャ",
+                "テクスチャ"
             ],
             "templates": [
-                "",
-                "",
-                ""
+                "テンプレート",
+                "テンプレート",
+                "テンプレート"
             ],
             "emitterTandems": [
-                "",
-                "",
-                ""
+                "エミッタータンデム",
+                "エミッタータンデム",
+                "エミッタータンデム"
             ],
             "rooms": [
-                "",
-                "",
-                ""
+                "ルーム",
+                "ルーム",
+                "ルーム"
             ],
             "fonts": [
-                "",
-                "",
-                ""
+                "フォント",
+                "フォント",
+                "フォント"
             ],
             "styles": [
-                "",
-                "",
-                ""
+                "スタイル",
+                "スタイル",
+                "スタイル"
             ],
             "sounds": [
-                "",
-                "",
-                ""
+                "音",
+                "音",
+                "音"
             ],
             "skeletons": [
-                "",
-                "",
-                ""
+                "透過スプライト",
+                "透過スプライト",
+                "透過スプライト"
             ]
-        },
-        "next": "",
-        "previous": ""
+        }
     },
     "assetInput": {
         "changeAsset": "アセットを変更する",
@@ -140,6 +138,20 @@
         "newGroupName": "新しいグループ",
         "groupDeletionConfirmation": "本当にこのグループを削除しますか?そのアセットがすべてグループから外れることになります。"
     },
+    "builtinAssetGallery": {
+        "galleryTip": "これは、さまざまなテクスチャとサウンドの無料のビルトイン ギャラリーです。すべてのアセットは CC0 または WTFPL であるか、ct.js で使用するための特別な条件の下でリリースされています。これらのアセットは、商用目的のプロジェクトやその他のプロジェクトで使用することができます。",
+        "assetGalleryHeader": "アセット",
+        "importIntoProject": "現在のプロジェクトにインポート",
+        "importAll": "全てインポート",
+        "byAuthorPrefix": "by",
+        "cannotImportExplanation": "このアセットに使用されている名前は、既存のアセットの名前と被っています。既存のアセットの名前を変更する必要があります。それとも、すでにこのアセットをインポートしていますか?",
+        "nameOccupied": "すでに使用されている名前です",
+        "cannotImportNameOccupied": "その名前は既に使用されているため、$1 をインポートできません。",
+        "visitSource": "このアセットパックのストアページを開く",
+        "visitAuthorsItch": "作者の itch.io ページにアクセス",
+        "visitAuthorsTwitter": "作者のTwitterを開く",
+        "tipAuthor": "作者の労をねぎらう"
+    },
     "colorPicker": {
         "current": "新しい",
         "globalPalette": "グローバルのパレット",
@@ -195,11 +207,11 @@
     "extensionsEditor": {
         "noEntries": "まだエントリーがありません",
         "addRow": "行を追加",
-        "actions": "",
-        "values": "",
-        "moveDown": "",
-        "moveUp": "",
-        "deleteRow": ""
+        "actions": "アクション",
+        "values": "値",
+        "moveDown": "下",
+        "moveUp": "上",
+        "deleteRow": "行を削除"
     },
     "groupEditor": {
         "groupEditor": "グループエディタ",
@@ -210,7 +222,7 @@
         "loading": "しばらくお待ち下さい…光の速さで子猫を集めています!",
         "newProject": {
             "button": "フォルダを選択してプロジェクトを作成",
-            "input": "プロジェクト名(アルファベットと数字)",
+            "input": "プロジェクト名(英字と数字)",
             "text": "新規作成",
             "saveProjectHere": "プロジェクトの保存はこちら",
             "selectProjectFolder": "プロジェクトを保存するフォルダを選択",
@@ -240,8 +252,8 @@
         "vkontakte": "Vkontakte公開コミュニティ",
         "patreon": "ct.jsをPatreonで応援しよう!",
         "createOrBrowseJunction": "or",
-        "templates": "",
-        "templatesInfo": ""
+        "templates": "テンプレート",
+        "templatesInfo": "これらのテンプレートを使って、ゲーム開発を始めることができます。これらのテンプレートには、プレースホルダーのグラフィックのみが含まれていますが、動作する仕組みは備わっています。プロジェクトを選択すると、新規プロジェクト用のセーブディレクトリ選択画面が表示されます。"
     },
     "onboarding": {
         "hoorayHeader": "やったぁ!プロジェクトが出来上がりましたよ!",
@@ -317,10 +329,10 @@
             "confirmDeletionMessage": "このコンテンツタイプを本当に削除してよろしいですか?この操作は元に戻せません。",
             "gotoEntries": "エントリに移動",
             "entries": "エントリ",
-            "array": ""
+            "array": "配列"
         },
         "modules": {
-            "heading": "Catmods(追加機能)"
+            "heading": "Catmods"
         },
         "rendering": {
             "heading": "レンダリング設定",
@@ -564,7 +576,7 @@
             "は未解決のミステリー?",
             "は壮大!?",
             "はロボット?",
-            "は燃え盛る炎のようだ!",
+            "は燃え盛る炎のよう!",
             "は、光と希望をもたらす?",
             "は、エレガントで美しい?"
         ]
@@ -575,7 +587,7 @@
     },
     "writableFolderPrompt": {
         "headerSelectFolderForData": "ct.jsのデータを保存するフォルダを選択。",
-        "paragraphCouldNotPickDirectory": "おおっと。Ct.jsは、プロジェクト、パッケージビルド、デバッグ用のフォルダを見つけることができませんでした。通常、Ct.jsは自動的にフォルダを見つけますが、すべてのフォルダが読み取り専用になっていました。",
+        "paragraphCouldNotPickDirectory": "おっと。Ct.jsは、プロジェクト、パッケージビルド、デバッグ用のフォルダを見つけることができませんでした。通常、Ct.jsは自動的にフォルダを見つけますが、すべてのフォルダが読み取り専用になっていました。",
         "paragraphDirectoryDirections": "これは修正できます。下のボタンをクリックして、データを保存するフォルダを選択してください。よくわからない場合は、Documentsフォルダにct.jsというディレクトリを作成してください。",
         "selectFolder": "フォルダーを選択"
     },
@@ -616,9 +628,9 @@
                 "LucasDracula": "ルーカス・ドラキュラ",
                 "Horizon": "地平線",
                 "HCBlack": "高コントラストの黒",
-                "RosePine": "",
-                "RosePineMoon": "",
-                "RosePineDawn": ""
+                "RosePine": "ローズパイン",
+                "RosePineMoon": "ローズパインムーン",
+                "RosePineDawn": "ローズパインダウン"
             },
             "language": "言語",
             "translateToYourLanguage": "ct.jsを翻訳する!",
@@ -633,8 +645,8 @@
             "disableSounds": "UIサウンドを無効化",
             "changeDataFolder": "データフォルダの場所を設定",
             "forceProductionForDebug": "デバッグエクスポートのためのプロダクションタスクの強制",
-            "prideMode": "",
-            "altTemplateLayout": ""
+            "prideMode": "プライドモード",
+            "altTemplateLayout": "テンプレートエディターの代わりのレイアウト"
         },
         "project": {
             "heading": "プロジェクト",
@@ -672,35 +684,35 @@
         "fx": "FX",
         "templates": "テンプレート",
         "tour": {
-            "header": "",
-            "aboutTour": "",
-            "helpPanel": "",
-            "helpPanelTabs": "",
-            "projectResources": "",
-            "tabTextures": "",
-            "tabTexturesImport": "",
-            "tabTexturesGallery": "",
-            "tabTexturesClipboard": "",
-            "tabTexturesPlaceholders": "",
-            "tabTemplates": "",
-            "tabRooms": "",
-            "tabSounds": "",
-            "tabSoundsImport": "",
-            "tabSoundsGallery": "",
-            "tabSoundsRecord": "",
-            "tabInterlude": "",
-            "tabUI": "",
-            "tabFX": "",
-            "tabProject": "",
-            "tabProjectModules": "",
-            "tabProjectModuleDocs": "",
-            "tabMainMenu": "",
-            "tabMainMenuSettings": "",
-            "tabMainMenuMeta": "",
-            "helpPanelReminder": "",
-            "buttonStartTutorial": ""
+            "header": "Ct.js の概要",
+            "aboutTour": "ct.js へようこそ!この小さなツアーでは、このエディターの主なコントロールを紹介するので、ct.js を構成して新しいアセットを作成する方法を理解できます。",
+            "helpPanel": "まずは、このコッソリしたボタンにご注目ください。ct.jsを学ぶ上でとても大切なものです。",
+            "helpPanelTabs": "このパネルには、ct.js とそのモジュールのすべての公式ドキュメントとチュートリアルが保存され、また、記録用に 2 つのメモがあります。<p>グローバル メモはプロジェクト間で共有され、あなたのデバイスに保存されます。プロジェクトのメモは、あなたのプロジェクト内に保存されます。",
+            "projectResources": "さて、どのプロジェクトにも、いくつかのタイプのアセットがあります。それぞれのアセットタイプは、それぞれのタブに属します。最も重要なタブをチェックしてみましょう。",
+            "tabTextures": "テクスチャは、インタラクティブオブジェクト(コピーと呼ばれます)、背景、特殊効果に使用できる画像です。テクスチャは、それ自体では何もできませんが、必ず必要とされるアセットタイプです。",
+            "tabTexturesImport": "ファイル システムからテクスチャをインポートするか…",
+            "tabTexturesGallery": "…またはビルトインライブラリから既製のテクスチャをインポートします。",
+            "tabTexturesClipboard": "クリップボードからコピーした画像を貼り付けるボタンです。画像編集ソフトで作業しているときに、かなり便利です!",
+            "tabTexturesPlaceholders": "このツールを使用して、簡単なプレースホルダー グラフィックを生成することもできます。",
+            "tabTemplates": "テンプレートは、レベル内に配置するインタラクティブ・オブジェクトのコピーを作成するために使用されます。ct.jsのインタラクティブ・オブジェクトは、テンプレートの1つから作成されます。テンプレートは、テクスチャを使用し、イベントを作成することでゲームプレイのロジックを定義します。テンプレートを作成したら、テンプレート・エディターでin-deepツアーを実行することができます。",
+            "tabRooms": "もう 1 つの最も重要なタブはルームです。ルームは、コピーを配置するレベルまたはシーンとして呼び出すこともできます。ルームには、独自のイベントや背景を設定することもできます。",
+            "tabSounds": "サウンドは、おそらく一番わかりやすいタブです。",
+            "tabSoundsImport": "このボタンで新しいサウンドを作成したり…",
+            "tabSoundsGallery": "…ビルトイン サウンド ライブラリからインポートしたり…",
+            "tabSoundsRecord": "…マイクで録音することもできます!",
+            "tabInterlude": "より高度なアセット用の 2 つのタブもあります。",
+            "tabUI": "UIタブは、フォントとテキストスタイルを管理します。ゲームにフォントを同梱することは、どんなデバイスでも同じように表示させるために重要です。テキストスタイルには、スタイルプリセットを作成するためのビジュアルエディタがあります。また、ゲーム内でこのようなラベルを作成するためのコードも生成されます。",
+            "tabFX": "FXタブには、爆発、魔法、煙、雨など、あらゆる種類のものに対する特殊なグラフィック効果など、パーティクル システム用のエディターがあります。",
+            "tabProject": "アセットについては以上です。しかし、これら以外にも、プロジェクトにはレンダリング、ブランディング、パッケージングなど、さまざまな設定があります。",
+            "tabProjectModules": "Ct.js はモジュール式であり、プロジェクトには追加のモジュールを追加することもできます。",
+            "tabProjectModuleDocs": "有効なモジュールのすべてのドキュメントは、ここにあります。",
+            "tabMainMenu": "Ct.js 自体にも多くのオプションがあり、メイン メニューに格納されています。",
+            "tabMainMenuSettings": "[設定]セクションで言語と ct.js の外観を変更できます。",
+            "tabMainMenuMeta": "後で助けが必要な場合は、メタパネルで公式ハブ情報を見つけることができます。",
+            "helpPanelReminder": "また、ビルトイン ドキュメントも忘れないでください。独自のプロジェクトを開始する前に、公式のチュートリアルを完了することをお勧めします。",
+            "buttonStartTutorial": "チュートリアルを開く"
         }
-    },
+        },
     "roomBackgrounds": {
         "add": "背景を追加",
         "depth": "階層:",
@@ -724,7 +736,14 @@
         "width": "幅を表示:",
         "height": "高さを表示:",
         "isUi": "UIレイヤーですか?",
-        "events": "ルームイベント",
+        "simulate": "シミュレート",
+        "grid": "グリッド",
+        "toggleDiagonalGrid": "斜めグリッド",
+        "changeGridSize": "セルサイズを変更",
+        "events": "イベント",
+        "gridOff": "グリッドを無効にする",
+        "xrayMode": "X-ray モード",
+        "colorizeTileLayers": "タイル レイヤーの色付け",
         "copies": "コピー",
         "backgrounds": "背景",
         "backgroundColor": "背景色:",
@@ -733,10 +752,9 @@
         "add": "追加",
         "none": "何もなし",
         "done": "完了",
-        "grid": "グリッドを設定",
         "hotkeysNotice": "Ctrl = 削除、Alt = グリッドなし、Shift = 複数選択",
         "hotkeysNoticeMovement": "Ctrl=削除、Shift=選択",
-        "shift": "ビューを移動する",
+        "shift": "全てをシフト",
         "step": "ステップ",
         "create": "作成",
         "leave": "やめる",
@@ -748,23 +766,26 @@
         "selectAndMove": "選択して移動",
         "customProperties": "カスタムプロパティ",
         "findTileset": "タイルセットの検索",
+        "resetView": "ビューをリセット",
         "copyProperties": {
             "position": "位置",
             "rotation": "回転",
             "scale": "大きさ",
-            "multipleValues": ""
+            "opacity": "不透明度",
+            "tint": "色合い",
+            "multipleValues": "(多数)"
         },
         "copyCustomProperties": {
             "addProperty": "プロパティを追加",
             "property": "プロパティ",
-            "value": "数字"
+            "value": "数字",
+            "nameOccupied": "このプロパティは ct.js で使用されます!別の名前にしてください。"
         },
         "restrictCamera": "カメラを四角に収める",
         "minimumX": "最小 X",
         "minimumY": "最小 Y",
         "maximumX": "最大 X",
         "maximumY": "最大 Y",
-        "gridOff": "グリッドを無効化",
         "gridSize": "グリッドのサイズ:",
         "toCenter": "中央へ",
         "shiftLabel": "移動:",
@@ -777,17 +798,12 @@
         "moveTilesToLayer": "レイヤーに移動",
         "shiftTiles": "タイルに移動",
         "changeCopyRotation": "回転",
-        "simulate": "",
-        "toggleDiagonalGrid": "",
-        "changeGridSize": "",
-        "xrayMode": "",
-        "colorizeTileLayers": "",
         "tools": {
-            "select": "",
-            "addCopies": "",
-            "addTiles": "",
-            "manageBackgrounds": "",
-            "roomProperties": ""
+            "select": "選択ツール",
+            "addCopies": "コピーを追加",
+            "addTiles": "タイルを追加",
+            "manageBackgrounds": "背景を管理する",
+            "roomProperties": "ルームのプロパティ"
         }
     },
     "styleView": {
@@ -841,9 +857,10 @@
         "speed": "フレームレート:",
         "tiled": "背景として使用しますか?",
         "updateFromClipboard": "クリップボードからの更新",
-        "corrupted": "ファイルが壊れているか、見つかりません。今すぐ閉じる。",
+        "corrupted": "ファイルが壊れているか、見つかりません。今すぐ閉じます。",
         "showFrameIndices": "フレームインデックスを表示",
-        "blankTexture": "",
+        "blankTexture": "空白のテクスチャとしてエクスポート",
+        "blankTextureNotice": "画像を透明な長方形としてエクスポートするため、ゲーム内では見えません。バンドル サイズをスリムに保ちながら、ct.js エディターのプレースホルダーを作成するのに役立ちます。",
         "width": "横幅:",
         "height": "高さ:",
         "strip": "ラインストリップ/ポリゴン",
@@ -897,113 +914,120 @@
         "typefaceName": "書体名:"
     },
     "licensePanel": {
-        "ctjsLicense": "Ct.js ライセンス (MIT)"
-    },
-    "templates": {
-        "create": "作成"
-    },
-    "templateView": {
-        "change": "スプライトを変更",
-        "create": "作成",
-        "depth": "階層:",
-        "destroy": "削除",
-        "done": "完了",
-        "draw": "描く",
-        "learnAboutTypes": "コーディングテンプレートについて",
-        "name": "名前:",
-        "step": "ステップ",
-        "visible": "可視",
-        "appearance": "",
-        "opacity": "",
-        "blendMode": "",
-        "playAnimationOnStart": "",
-        "blendModes": {
-            "normal": "",
-            "add": "",
-            "multiply": "",
-            "screen": ""
-        },
-        "animationFPS": "",
-        "loopAnimation": ""
-    },
-    "builtinAssetGallery": {
-        "galleryTip": "",
-        "assetGalleryHeader": "",
-        "importIntoProject": "",
-        "importAll": "",
-        "byAuthorPrefix": "",
-        "cannotImportExplanation": "",
-        "nameOccupied": "",
-        "cannotImportNameOccupied": "",
-        "visitSource": "",
-        "visitAuthorsItch": "",
-        "visitAuthorsTwitter": "",
-        "tipAuthor": ""
+        "ctjsLicense": "Ct.js ライセンス (MIT)",
+        "faq": "よくある質問 (非規範的なセクション)",
+        "whoOwnsGamesQ": "ct.js で作成されたゲームは誰のものになりますか?",
+        "whoOwnsGamesA": "あなたです。 Ct.js は、あなたが作成したものをいかなる方法でも所有しません。",
+        "sellingGamesQ": "ct.js で作成したゲームを販売できますか?",
+        "sellingGamesA": "はい、ゲームやその他のプロジェクトを販売したり、寄付を集めたり、他の商用アプリケーションでゲームを使用したりできます。",
+        "possibleFeesQ": "ct.js に料金を支払う必要がありますか? ct.js はいつか有料になるのでしょうか?",
+        "possibleFeesA": "いいえ、ct.js は無料であり、今後も無料です。 Unity や Unreal Engine のように、特定の金額を稼いだ後に支払う必要のある隠れた料金はありません。 Ct.jsはオープンソースであり、有償版が出たとしても、今お持ちの製品はいつでも無料でご利用いただけます。ただし、寄付を送ったり、パトロンになることはできます。請求書の支払いと ct.js の改善に役立ちます。",
+        "useInStudioQ": "スタジオや学校で ct.js を使用できますか?",
+        "useInStudioA": "もちろん! Ct.js は、個人的、商業的、教育的使用などに使用できます。法律を破らないでくださいね。",
+        "attributionQ": "ct.js またはその開発者に帰属する必要がありますか?ロード画面でロゴを無効にすることはできますか?",
+        "attributionA": "ゲームのコードにはすでに必要な属性が含まれているため、ct.js ロゴを無効にすることができます。",
+        "attributionAAssets": "一部の例とデモには、帰属が必要な資料が含まれている場合がありますが、それらは既に含まれています。",
+        "theLicense": "ライセンス(法的文書)"
     },
     "scriptables": {
-        "addEvent": "",
-        "removeEvent": "",
-        "removeEventConfirm": "",
-        "changeArguments": "",
-        "eventAlreadyExists": "",
-        "localEventVars": "",
-        "createEventHint": "",
+        "addEvent": "イベントを追加",
+        "removeEvent": "イベントを削除",
+        "removeEventConfirm": "このイベントを削除してもよろしいですか?この操作は元に戻せません!",
+        "changeArguments": "引数の変更",
+        "eventAlreadyExists": "同じイベントが既に存在します!",
+        "localEventVars": "ローカル変数",
+        "createEventHint": "左の列で最初のイベントを作成し、ここでロジックを定義します",
         "coreEventsCategories": {
-            "lifecycle": "",
-            "actions": "",
-            "pointer": "",
-            "misc": "",
-            "animation": "",
-            "timers": ""
+            "lifecycle": "ライフサイクル",
+            "actions": "アクション",
+            "pointer": "ポインタのイベント",
+            "misc": "その他",
+            "animation": "アニメーション",
+            "timers": "タイマー"
         },
         "coreEvents": {
-            "OnCreate": "",
-            "OnRoomStart": "",
-            "OnStep": "",
-            "OnDraw": "",
-            "OnDestroy": "",
-            "OnRoomEnd": "",
-            "OnPointerClick": "",
-            "OnPointerSecondaryClick": "",
-            "OnPointerEnter": "",
-            "OnPointerLeave": "",
-            "OnPointerDown": "",
-            "OnPointerUp": "",
-            "OnPointerUpOutside": "",
-            "OnPointerWheel": "",
-            "OnActionPress": "",
-            "OnActionRelease": "",
-            "OnActionDown": "",
-            "OnFrameChange": "",
-            "OnAnimationLoop": "",
-            "OnAnimationComplete": "",
-            "Timer": ""
+            "OnCreate": "Creation",
+            "OnRoomStart": "ルーム開始",
+            "OnStep": "フレーム開始",
+            "OnDraw": "フレーム終了",
+            "OnDestroy": "破壊",
+            "OnRoomEnd": "ルーム終了",
+            "OnPointerClick": "クリック",
+            "OnPointerSecondaryClick": "ダブルクリック",
+            "OnPointerEnter": "ポインタ入力",
+            "OnPointerLeave": "ポインタ離脱",
+            "OnPointerDown": "ポインターが下がる",
+            "OnPointerUp": "ポインターが上がる",
+            "OnPointerUpOutside": "ポインターが上がる(外側)",
+            "OnPointerWheel": "ホイールスクロール",
+            "OnActionPress": "アクションが押される",
+            "OnActionRelease": "アクションが押されなくなる",
+            "OnActionDown": "アクションがダウンする",
+            "OnFrameChange": "フレームチェンジ",
+            "OnAnimationLoop": "アニメーションループ",
+            "OnAnimationComplete": "アニメーション完了",
+            "Timer": "Timer $1"
         },
         "coreParameterizedNames": {
-            "OnActionPress": "",
-            "OnActionRelease": "",
-            "OnActionDown": ""
+            "OnActionPress": " %%アクション%% が押される",
+            "OnActionRelease": " %%アクション%% が押されなくなる",
+            "OnActionDown": " %%アクション%% がダウンする",
+            "Timer1": "1 • %%name%% (Timer)",
+            "Timer2": "2 • %%name%% (Timer)",
+            "Timer3": "3 • %%name%% (Timer)",
+            "Timer4": "4 • %%name%% (Timer)",
+            "Timer5": "5 • %%name%% (Timer)",
+            "Timer6": "6 • %%name%% (Timer)"
         },
         "coreEventsArguments": {
-            "action": ""
+            "action": "アクション",
+            "name": "名前",
+            "isUi": "UI イベント"
         },
         "coreEventsLocals": {
-            "OnActionDown_value": "",
-            "OnActionPress_value": ""
+            "OnActionDown_value": "現在のアクションの値",
+            "OnActionPress_value": "現在のアクションの値"
         },
         "coreEventsDescriptions": {
-            "OnCreate": "",
-            "OnRoomStart": "",
-            "OnStep": "",
-            "OnDraw": "",
-            "OnDestroy": "",
-            "OnRoomEnd": "",
-            "OnActionPress": "",
-            "OnActionRelease": "",
-            "OnActionDown": "",
-            "OnAnimationLoop": "",
-            "OnAnimationComplete": "",
-            "Timer": ""
+            "OnCreate": "コピーが作成されたときにトリガーされます。",
+            "OnRoomStart": "このルームに切り替えるか、レイヤーとして追加することによって、このルームが作成されたときにトリガーされます。",
+            "OnStep": "すべてのフレームの開始時に発生します。",
+            "OnDraw": "各フレームの最後に発生します。 アニメーションの更新に適しています。",
+            "OnDestroy": "このコピーが破棄されると、\"frame start\" と \"frame end\" の間で発生します。",
+            "OnRoomEnd": "別のルームに切り替えたとき、またはレイヤーとして追加された後にこのルームが削除されたときにトリガーされます。",
+            "OnActionPress": "ジョイスティックを押す、クリックする、フリックするなどして、アクションの入力がアクティブになったときに発生します。",
+            "OnActionRelease": "ボタンを離したり、ジョイスティックを倒さないなどして、アクションの入力が非アクティブになったときに発生します。",
+            "OnActionDown": "アクションの入力がアクティブな場合、すべてのフレームで実行されます。",
+            "OnAnimationLoop": "アニメーションが再開するたびに発生します。",
+            "OnAnimationComplete": "ループしないアニメーションが終了すると発生します。",
+            "Timer": "this.timer$1 = 3; を使用して、このタイマーの期間を秒単位で設定します。"
+        }
+},
+        "templates": {
+            "create": "作成"
+        },
+        "templateView": {
+            "change": "スプライトを変更",
+            "create": "作成",
+            "depth": "階層:",
+            "destroy": "削除",
+            "done": "完了",
+            "draw": "描く",
+            "learnAboutTypes": "コーディングテンプレートについて",
+            "name": "名前:",
+            "step": "ステップ",
+            "visible": "可視",
+            "appearance": "外観",
+            "opacity": "不透明度",
+            "blendMode": "ブレンド モード:",
+            "animationFPS": "アニメーション FPS:",
+            "playAnimationOnStart": "開始時にアニメーションを再生します",
+            "loopAnimation": "ループアニメーション",
+            "blendModes": {
+                "normal": "標準",
+                "add": "追加 (burn)",
+                "multiply": "Multiply (darken)",
+                "screen": "画面 (lighten)"
+            }
         }
     }
-}

From 1b0a96502c97ce897d973cc1df2781da188b5135 Mon Sep 17 00:00:00 2001
From: Cosmo Myzrail Gorynych <admin@nersta.ru>
Date: Mon, 12 Sep 2022 22:31:12 +1200
Subject: [PATCH 10/12] :bento: Pull the latest bots

---
 docs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/docs b/docs
index 671c158a1..8c1177a84 160000
--- a/docs
+++ b/docs
@@ -1 +1 @@
-Subproject commit 671c158a1dd04f323ab0456af0546111c626555b
+Subproject commit 8c1177a84be955231a51c43e0f686cf4031a9ed9

From d1dd83c6fc057bac3c8ec430d84abce39ccc5508 Mon Sep 17 00:00:00 2001
From: Cosmo Myzrail Gorynych <admin@nersta.ru>
Date: Mon, 12 Sep 2022 22:41:49 +1200
Subject: [PATCH 11/12] :pencil: Update changelog

---
 app/Changelog.md | 40 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 40 insertions(+)

diff --git a/app/Changelog.md b/app/Changelog.md
index 7d09e0de3..c566b1956 100644
--- a/app/Changelog.md
+++ b/app/Changelog.md
@@ -1,3 +1,43 @@
+## v3.0.1
+
+*Mon Sep 12 2022*
+
+### ⚡️ General Improvements
+
+* :globe_with_meridians: Update French translation (#366 by @rtauziac)
+* :globe_with_meridians: Update Japanese translation (#367 by @taxi13245)
+* Drop precision on position and scale of objects in the room editor. Reasonably rounds their values to more logical numbers.
+
+### 🐛 Bug Fixes
+
+* Add support for template and texture arrays to the Context subsystem
+* Escape single quotes while stringifying certain properties. This allows, among other things, use of ' in custom properties (room editor) and template names
+* Fix `ct.place` crashing game if a collision check is made on a disproportionately squished circle
+* Room editor shortcuts must work only if the Rooms tab is active
+
+### 🍱 Demos, Dependencies and Stuff
+
+* Update nw.js to v0.67.1
+
+### 📝 Docs
+
+* :zap: Fix old terminology in skeletal-animation.md (by @omartek)
+* Italian translation for the working-with-editor section (by @omartek)
+
+### 🌐 Website
+
+* :bug: Fix img tag appearing in games' descriptions on the Made With page
+* :bug: Remove .DS_Store
+* :pencil: Update changelog
+* :zap: Add a working version of web installer for windows
+* :zap: Italian documentation translation is now public; add a proper link in the header!
+* :zap: Temporarily replace web installer for windows with zip archives
+* :zap: Update italian translation (@omartek)
+
+### 🤖 Misc
+
+* :fire: Remove now useless twoPi var in ct.place
+
 ## v3.0.0
 
 *Fri Sep 09 2022*

From 6a3788ab622dc16e3f5abc019918ebec1f47a50f Mon Sep 17 00:00:00 2001
From: Cosmo Myzrail Gorynych <admin@nersta.ru>
Date: Mon, 12 Sep 2022 22:42:50 +1200
Subject: [PATCH 12/12] :bookmark: Bump version number

---
 app/package.json | 2 +-
 package.json     | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/app/package.json b/app/package.json
index 0236e5bf9..be1c64879 100644
--- a/app/package.json
+++ b/app/package.json
@@ -2,7 +2,7 @@
   "main": "index.html",
   "name": "ctjs",
   "description": "ct.js — a free 2D game engine",
-  "version": "3.0.0",
+  "version": "3.0.1",
   "homepage": "https://ctjs.rocks/",
   "author": {
     "name": "Cosmo Myzrail Gorynych",
diff --git a/package.json b/package.json
index 6b9d424ed..480380914 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "ctjsbuildenvironment",
-  "version": "3.0.0",
+  "version": "3.0.1",
   "description": "",
   "directories": {
     "doc": "docs"