diff --git a/assets/js/api/api.js b/assets/js/api/api.js
index a4770a912e9ecfa8271321db9f40106dce042f02..ff293f8db969788945ad35a7ffd0524bf1d23573 100755
--- a/assets/js/api/api.js
+++ b/assets/js/api/api.js
@@ -15,7 +15,7 @@ if ($('#page-content.api').length > 0)
     });
 
     $('.select-categories').select2({
-      placeholder: "Selectionnez une ou plusieurs catégories",
+      placeholder: t('js.api.placeholder'),
       allowClear: true
     });
 
@@ -76,5 +76,4 @@ if ($('#page-content.api').length > 0)
        ret.push(encodeURIComponent(d) + '=' + encodeURIComponent(data[d]));
      return ret.join('&');
   }
-}
-
+}
\ No newline at end of file
diff --git a/src/Application/Sonata/UserBundle/Form/Type/RegistrationFormType.php b/src/Application/Sonata/UserBundle/Form/Type/RegistrationFormType.php
index 8e12df784142bcbdf132e4b76bbed3294484c064..49ca6685924e251138d26535f87d79f26568c581 100755
--- a/src/Application/Sonata/UserBundle/Form/Type/RegistrationFormType.php
+++ b/src/Application/Sonata/UserBundle/Form/Type/RegistrationFormType.php
@@ -77,7 +77,7 @@ class RegistrationFormType extends AbstractType
             ], $this->mergeOptions))
             ->add('newsletterFrequency', $choiceType, array_merge([
                 'label' => 'form.newsletterFrequency',
-                'translation_domain' => 'SonataUserBundle',
+                'translation_domain' => 'messages',
                    'choices' => [
                         'commons.every.week' => 1,
                         'commons.every.month' => 2,
diff --git a/src/Block/RecentElementsBlockService.php b/src/Block/RecentElementsBlockService.php
index 2fea69298005ed27b61573c3ae0c856ca663adcd..253f9dcb240f827299c86cc21bfb4f70ee93ff92 100755
--- a/src/Block/RecentElementsBlockService.php
+++ b/src/Block/RecentElementsBlockService.php
@@ -10,6 +10,7 @@ use Sonata\CoreBundle\Model\Metadata;
 use Symfony\Component\HttpFoundation\Response;
 use Symfony\Component\OptionsResolver\OptionsResolver;
 use Twig\Environment;
+use Symfony\Contracts\Translation\TranslatorInterface;
 
 /**
  * @author Thomas Rabaix <thomas.rabaix@sonata-project.org>
@@ -27,13 +28,20 @@ class RecentElementsBlockService extends AbstractBlockService
      * @param EngineInterface $templating
      * @param Pool            $adminPool
      */
-    public function __construct(Environment $twig, DocumentManager $dm, Pool $adminPool = null)
+    public function __construct(Environment $twig, DocumentManager $dm, Pool $adminPool = null, TranslatorInterface $t)
     {
         $this->manager = $dm;
         $this->adminPool = $adminPool;
         parent::__construct($twig);
+        $this->t = $t;
     }
 
+    private function trans($key, $params = [])
+    {
+        return $this->t->trans($key, $params, 'admin');
+    }
+
+
     /**
      * {@inheritdoc}
      */
@@ -62,7 +70,7 @@ class RecentElementsBlockService extends AbstractBlockService
     {
         $resolver->setDefaults([
             'number' => 5,
-            'title' => 'Derniers elements', // TODO translate
+            'title' => $this->trans('elements.recent_elements'),
             'class' => '',
             'filterStatus' => 0,
             'template' => 'admin/blocks/block_recent_elements.html.twig',
diff --git a/templates/admin/core_custom/custom-fields/filters-builder.html.twig b/templates/admin/core_custom/custom-fields/filters-builder.html.twig
index 487f7b76f62906aecd11429eb793e1b5a41c6c37..6b94cec4dea31ccf7646b4435187aa5d525bcc72 100755
--- a/templates/admin/core_custom/custom-fields/filters-builder.html.twig
+++ b/templates/admin/core_custom/custom-fields/filters-builder.html.twig
@@ -24,36 +24,44 @@
 ];
 
       var displayFilter = function(fieldData) {
-        result = fieldData.field ? "Champ utilisé : " + fieldData.field : "Veuillez choisir le champ à utiliser" // TODO translate
+        result = fieldData.field ? t('js.filters_builder.used_field', {field: fieldData.field})  : t('js.filters_builder.choose_field')
         return { field: result };
       }
       var templates = {
-        taxonomy: function(fieldData) { return { field: 'Personnaliser ce filtre dans le menu des catégories' }; }, // TODO translate
+        taxonomy: function(fieldData) { return { field: t('js.filters_builder.customize_field') }; },
         gogo_date: displayFilter,
         gogo_number: displayFilter,
       };
-      var fieldAttr = { label: "Nom du champ à utiliser", options: fieldsChoices} // TODO translate
-      var contractedAttr = { label: "Filtre replié par defaut", type: 'checkbox'} // TODO translate
-      var dateViews = { "day": "Jour", "week": "Semaine", "month": "Mois", "year": "Année", "range": "Plage" } // TODO translate
+      var fieldAttr = { label: t('js.filters_builder.field_name'), options: fieldsChoices}
+      var contractedAttr = { label: t('js.filters_builder.contracted_field'), type: 'checkbox'}
+      var dateViews = { "day": t('js.filters_builder.date_views.day'),
+                        "week": t('js.filters_builder.date_views.week'),
+                        "month": t('js.filters_builder.date_views.month'),
+                        "year": t('js.filters_builder.date_views.year'),
+                        "range": t('js.filters_builder.date_views.range')
+                      }
 
       var fieldsAttrs = {
         taxonomy: {},
         gogo_date: {
           field: fieldAttr,
-          fieldEnd: { label: "Champ pour la Date de fin (optionel)", options: fieldsChoices}, // TODO translate
+          fieldEnd: { label: t('js.filters_builder.field_end'), options: fieldsChoices},
           contracted: contractedAttr,
-          multiday: { label: "Plusieurs jours selectionnable", type: 'checkbox' }, // TODO translate
+          multiday: { label: t('js.filters_builder.multiday'), type: 'checkbox' },
           views: { label: "Hidden Views" },
-          select_views: { label: "Vues (Ctrl + Click)", options: dateViews, multiple: "multiple" }, // TODO translate
-          defaultView: { label: "Vue par défaut", options: dateViews }, // TODO translate
+          select_views: { label: t('js.filters_builder.select_views'), options: dateViews, multiple: "multiple" },
+          defaultView: { label: t('js.filters_builder.default_view'), options: dateViews },
         },
         gogo_number: {
           field: fieldAttr,
           contracted: contractedAttr,
-          min: {label: "min", type: "number", required: "true", value: "0"},
-          max: {label: "max", type: "number", required: "true", value: "100"},
-          step: {label: "step", type: "number", required: "true", value: "1"},
-          subtype: {label: "Type", options: { 'slider': 'Slider', 'value': 'Valeur' }} // TODO translate
+          min: {label: t('js.filters_builder.min'), type: "number", required: "true", value: "0"},
+          max: {label: t('js.filters_builder.max'), type: "number", required: "true", value: "100"},
+          step: {label: t('js.filters_builder.step'), type: "number", required: "true", value: "1"},
+          subtype: {label: t('js.filters_builder.type'), options: {
+            'slider': t('js.filters_builder.options.slider'),
+            'value': t('js.filters_builderoptions.value')
+          }}
         }
       };
 
@@ -70,7 +78,7 @@
         controlOrder: ['taxonomy', 'gogo_date', 'gogo_number', 'header', 'paragraph'],
         disabledAttrs: ['required', 'name', 'access', 'placeholder', 'value', 'className', 'inline', 'toggle', 'description', 'other', 'multiple'],
         formData: {{ filtersData|json_encode|raw }},
-        roles: { 1: "Administrateur" }, // TODO translate ?
+        roles: { 1: t('js.form_builder.roles.1') },
         typeUserAttrs: fieldsAttrs
       });
 
@@ -102,8 +110,8 @@
 
         // Changes icons and icones helpers
         $('a[type=remove].icon-cancel').removeClass('icon-cancel').addClass('fa fa-trash-alt');
-        $('a[type=copy].icon-copy').attr('title', 'Dupliquer'); // TODO translate
-        $('a[type=edit].icon-pencil').attr('title', 'Editer/Masquer'); // TODO translate
+        $('a[type=copy].icon-copy').attr('title', t('form_builder.copy_icon'));
+        $('a[type=edit].icon-pencil').attr('title', t('form_builder.edit_icon'));
       }, 300);
     });
   }
diff --git a/templates/admin/core_custom/custom-fields/mapping-taxonomy.html.twig b/templates/admin/core_custom/custom-fields/mapping-taxonomy.html.twig
index d205c48d06f60b73a7c178af618912d0593a1975..927de897c62f8770a580573fd3ad1a924fdb7c94 100755
--- a/templates/admin/core_custom/custom-fields/mapping-taxonomy.html.twig
+++ b/templates/admin/core_custom/custom-fields/mapping-taxonomy.html.twig
@@ -49,7 +49,7 @@
 
     var taxonomy = {{ form.vars.attr["data-options"]|raw }};
     var mappingOptionNameToId = {}
-    var formData = [{ id: "", text: "Selectionnez une catégorie existant ou entrez le nom d'une nouvelle catégorie à créer", disabled: true}] // TODO Translation
+    var formData = [{ id: "", text: t('mapping_taxonomy.selectCategory'), disabled: true}]
 
     function recursivelyAddOption(category, parentOption)
     {
@@ -79,7 +79,7 @@
             if ($(data).filter(function() {
                 return this.text.localeCompare(term)===0;
             }).length===0) {
-              return {id: `@create:${term}`, text: term + ' (Sera créé au moment de sauvegarder)'}; // TODO Translation
+              return {id: `@create:${term}`, text: t('js.mapping_taxonomy.createTerm', {term: term}) };
             }
         },
         multiple: true
@@ -98,7 +98,7 @@
       }
       else if (Object.keys(formData).filter(v => [newCategoryId, newCategoryIdIfCreated].includes(v)).length === 0) {
         newCategoryId = newCategoryIdIfCreated
-        formData.push({id: newCategoryId, text: originCategoryName + ' (Sera créé au moment de sauvegarder)'}) // TODO Translation
+        formData.push({id: newCategoryId, text: t('js.mapping_taxonomy.createTerm', {term: originCategoryName}) });
       }        
       const input = $parent.find('.category-selector:not(.select2-container)')
       input.val(newCategoryId).trigger('change');
diff --git a/templates/api/api-ui.html.twig b/templates/api/api-ui.html.twig
index 084ce758e2fd093bd93eaa569e274a53793e61db..1154896dda258d0ed9f28edb9119305efe250d8d 100755
--- a/templates/api/api-ui.html.twig
+++ b/templates/api/api-ui.html.twig
@@ -1,9 +1,10 @@
 {% extends "page-layout.html.twig" %}
+{% trans_default_domain 'admin' %}
 
 {% set pageName = 'api' %}
-{% set navTitle = "Configurer une API" %} {# TODO Translation #}
+{% set navTitle = 'api_ui._label'|trans %}
 
-{% block title %}Configurer une API{% endblock %} {# TODO Translation #}
+{% block title %}{{ 'api_ui._label'|trans }}{% endblock %}
 
 {% block stylesheets %}
 
@@ -17,22 +18,22 @@
 {# BODY CONTENT #}
 {% block body_content %}
   <section>
-    <h1>Accédez aux données via une API</h1> {# TODO Translation #}
+    <h1>{{ 'api_ui.title'|trans }}</h1> 
 
     {# FORMAT #}
     <p class="format-container">
-      <span class="forma-label">Format :</span> {# TODO Translation #}
+      <span class="forma-label">{{ 'api_ui.format'|trans }}</span>
       <input name="format" type="radio" id="format-json" data-value="json" checked class="url-update" />
-      <label for="format-json">Json</label>
+      <label for="format-json">{{ 'api_ui.json'|trans }}</label>
 
       <input name="format" type="radio" id="format-jsonld"  data-value="jsonld" class="url-update" />
-      <label for="format-jsonld">Json-LD (Sémantique)</label> {# TODO Translation #}
+      <label for="format-jsonld">{{ 'api_ui.jsonld'|trans }}</label>
     </p>
 
     {# CATEGORIES #}
     <div class="col s12 option-container">
       <input type="checkbox" name="use-categories" id="use-categories" checked class="url-update" />
-      <label id="label-use-categories" for="use-categories">Restreindre par categories</label> {# TODO Translation #}
+      <label id="label-use-categories" for="use-categories">{{ 'api_ui.use_categories'|trans }}</label>
     </div>
     <div class="select-categories-container">
       <select class="select-categories browser-default url-update" multiple>
@@ -44,30 +45,30 @@
 
     <div class="col s12 option-container">
       <input type="checkbox" name="include-external" id="include-external" checked class="url-update" />
-      <label id="label-include-external" for="include-external">Inclure les sources externes de la base de donnée</label> {# TODO Translation #}
+      <label id="label-include-external" for="include-external">{{ 'api_ui.include_external'|trans }}</label>
     </div>
 
     {# BOUNDS #}
     <div class="col s12 option-container">
       <input type="checkbox" name="use-bounds" id="use-bounds" checked class="url-update" />
-      <label id="label-use-bounds" for="use-bounds">Restreindre sur une zone géographique (dessinez un rectangle sur la carte)</label> {# TODO Translation #}
+      <label id="label-use-bounds" for="use-bounds">{{ 'api_ui.use_bounds'|trans }}</label>
     </div>
     <div id="map-bounds-select"></div>
 
     {# LIMIT #}
     <div class="col s12 option-container">
       <input type="checkbox" name="use-limit" id="use-limit" class="url-update" checked/>
-      <label id="label-use-limit" for="use-limit">Limiter le nombre de résultat</label> {# TODO Translation #}
+      <label id="label-use-limit" for="use-limit">{{ 'api_ui.use_limit'|trans }}</label>
       <input type="number" id="limit-input" class="url-update" value="100"/>
     </div>
 
     {# URL #}
-    <h2>Url de l'API</h2>
+    <h2>{{ 'api_ui.api_url'|trans }}</h2>
     <div class="col s12 input-field">
       <input type="text" id="api-url" onClick="this.setSelectionRange(0, this.value.length)"/>
     </div>
 
-    <button id="test-api" class="btn btn-primary">Tester</button> {# TODO Translation #}
+    <button id="test-api" class="btn btn-primary">{{ 'api_ui.test'|trans }}</button>
 
   </section>
 
@@ -82,7 +83,4 @@
 
     var apiUrlBase = "{{ url('gogo_api_elements_index') }}";
   </script>
-{% endblock %}
-
-
-
+{% endblock %}
\ No newline at end of file
diff --git a/templates/bundles/FOSUserBundle/Registration/register.html.twig b/templates/bundles/FOSUserBundle/Registration/register.html.twig
index 7fbd9f91b4ca79d888ae91995024f66e4280502d..0c64dbef17d6909ab9f9daceaccf46212bd0dac1 100755
--- a/templates/bundles/FOSUserBundle/Registration/register.html.twig
+++ b/templates/bundles/FOSUserBundle/Registration/register.html.twig
@@ -1,7 +1,7 @@
 {% extends "bundles/FOSUserBundle/layout.html.twig" %}
 
 {% set pageName = 'register with-section' %}
-{% set navTitle = "Créer un compte" %} {# TODO Translation #}
+{% set navTitle = 'commons.register'|trans %}
 
 {% block body_content %}
     <h1 class="panel-title">{{ 'title_user_registration'|trans({}, 'SonataUserBundle') }}</h1>
@@ -22,20 +22,20 @@
             <div class="input-field col s12">
                 <i class="material-icons gogo-icon-mail prefix"></i>
                 {{ form_widget(form.email, {'id': 'input-email', 'attr': {'class': 'validate required'}}) }}
-                <label for="input-email" class="gogo-form-label">Adresse e-mail</label> {# TODO Translation #}
+                <label for="input-email" class="gogo-form-label">{{ "commons.email"|trans }}</label>
             </div>
 
             <div class="error">{{ form_errors(form.plainPassword.first) }}</div>
             <div class="input-field col s12">
                 <i class="material-icons gogo-icon-lock prefix"></i>
                 {{ form_widget(form.plainPassword.first, {'id': 'input-plainPassword-1', 'attr': {'class': 'validate required'}}) }}
-                <label for="input-plainPassword-1" class="gogo-form-label">Mot de passe</label> {# TODO Translation #}
+                <label for="input-plainPassword-1" class="gogo-form-label">{{ "commons.password"|trans }}</label>
             </div>
             <div class="error">{{ form_errors(form.plainPassword.second) }}</div>
             <div class="input-field col s12">
                 <i class="material-icons gogo-icon-lock prefix"></i>
                 {{ form_widget(form.plainPassword.second, {'id': 'input-plainPassword-2', 'attr': {'class': 'validate required'}}) }}
-                <label for="input-plainPassword-2" class="gogo-form-label">Retapez votre mot de passe</label> {# TODO Translation #}
+                <label for="input-plainPassword-2" class="gogo-form-label">{{ "commons.check_password"|trans }}</label>
             </div>
         </section>
         <div class="divider"></div>
@@ -49,7 +49,7 @@
             <div class="input-field col s12">
                 <i class="material-icons gogo-icon-marker-symbol prefix"></i>
                 {{ form_widget(form.location, {'id': 'input-location', 'attr': {'class': 'validate'}}) }}
-                <label for="input-location" class="gogo-form-label">Votre adresse ou votre ville</label> {# TODO Translation #}
+                <label for="input-location" class="gogo-form-label">{{ "commons.location"|trans }}</label>
             </div>
 
             {#<i class="material-icons gogo-icon-filters-1 range-icon-prefix"></i>
diff --git a/templates/bundles/FOSUserBundle/Resetting/request.html.twig b/templates/bundles/FOSUserBundle/Resetting/request.html.twig
index 12a77fa900b64b62cf22bb289eb08406005c76af..2b75cda52673fb260a83e19fd0a7aad64e2817db 100755
--- a/templates/bundles/FOSUserBundle/Resetting/request.html.twig
+++ b/templates/bundles/FOSUserBundle/Resetting/request.html.twig
@@ -3,7 +3,7 @@
 {% block fos_user_content %}
 <div class="panel">
     <form action="{{ path('fos_user_resetting_send_email') }}" method="POST" class="fos_user_resetting_request">
-        <h1>Mot de passe oublié</h1> {# TODO Translation #}
+        <h1>{{ 'sonata.user.user.forgottedPassword'|trans({}, 'admin') }}</h1>
         <div>
             {% if invalid_username is defined %}
                 <p>{{ 'resetting.request.invalid_username'|trans({'%username%': invalid_username}, 'FOSUserBundle') }}</p>
diff --git a/templates/bundles/HWIOAuthBundle/Connect/login.html.twig b/templates/bundles/HWIOAuthBundle/Connect/login.html.twig
index 76b30a8c7192ef82bf5a15f2a1a91e4024df516e..f640c2d8a27332aa0219f801462bdda0f6ec46f4 100755
--- a/templates/bundles/HWIOAuthBundle/Connect/login.html.twig
+++ b/templates/bundles/HWIOAuthBundle/Connect/login.html.twig
@@ -1,4 +1,5 @@
 {% extends 'HWIOAuthBundle::layout.html.twig' %}
+{% trans_default_domain 'admin' %}
 
 {% block hwi_oauth_content %}
 
@@ -6,7 +7,7 @@
     {% if error is defined and error %}
         <div class="row">
             <div class="col-md-12 alert alert-danger text-center">
-                <span class="error">{{ error }}</span> {# TODO Translation ? #}
+                <span class="error">{{ error }}</span>
             </div>
         </div>
     {% endif %}
@@ -14,9 +15,9 @@
     {# HWIOAuthBundle integration #}
 
     <ul class="top-social">
-       <li><a class="#" href="{{ hwi_oauth_login_url('facebook') }}">Se connecter avec Facebook</a></li> {# TODO Translation #}
-       <li><a class="#" href="{{ hwi_oauth_login_url('gplus') }}">Se connecter avec Google</a></li> {# TODO Translation #}
-       <li><a class="#" href="{{ hwi_oauth_login_url('communs') }}">Se connecter avec Les communs</a></li> {# TODO Translation #}
+       <li><a class="#" href="{{ hwi_oauth_login_url('facebook') }}">{{ 'sonata.user.user.login_with'|trans({'%provider': 'Facebook'}) }}</a></li>
+       <li><a class="#" href="{{ hwi_oauth_login_url('gplus') }}">{{ 'sonata.user.user.login_with'|trans({'%provider': 'Google'}) }}</a></li>
+       <li><a class="#" href="{{ hwi_oauth_login_url('communs') }}">{{ 'sonata.user.user.login_with'|trans({'%provider': 'Les communs'}) }}</a></li>
     </ul>
 
 {% endblock hwi_oauth_content %}
diff --git a/templates/bundles/SonataAdminBundle/layout.html.twig b/templates/bundles/SonataAdminBundle/layout.html.twig
index b28869f732938cbe8da0a10af9f1cdcfcdd2e151..eb576f01b9d6ca82b8bf90e048b58fab525609d8 100755
--- a/templates/bundles/SonataAdminBundle/layout.html.twig
+++ b/templates/bundles/SonataAdminBundle/layout.html.twig
@@ -60,19 +60,19 @@
     {% spaceless %}
         <a class="logo" href="{{ path('sonata_admin_dashboard') }}">
             <img src="{{ asset('img/default-icon.png') }}">
-            <span>GoGoCarto Administration</span> {# TODO Translation #}
+            <span>{{ 'dashboard._label'|trans }}</span>
             {% set newMsgsCount = new_msgs_count() %}
             {% if newMsgsCount > 0 %}
                 <label class="label label-info" style="margin-left: 6px">
                     <i class="fa fa-bell" style="margin-right: 3px;"></i>
-                    {{ newMsgsCount }} {{ newMsgsCount == 1 ? ' message' : ' messages' }} {# TODO Translation plurals #}
+                    {{ 'dashboard.messages'|trans({'%count%': newMsgsCount}) }}
                 </label>
             {% endif %}
             {% set newErrorsCount = errors_count() %}
             {% if newErrorsCount > 0 %}
                 <label class="label label-danger" style="margin-left: 6px">
                     <i class="fa fa-warning" style="margin-right: 3px;"></i>
-                    {{ newErrorsCount }} {{ newErrorsCount == 1 ? 'erreur' : 'erreurs' }} {# TODO Translation plurals #}
+                    {{ 'dashboard.errors'|trans({'%count%': newErrorsCount}) }}
                 </label>
             {% endif %}
 
@@ -107,8 +107,8 @@
         </li>
         {% if use_as_saas and is_granted("ROLE_SUPER_ADMIN") and not is_root_project() %}
             <li>
-                <a href="{{ path('gogo_project_delete_my_project') }}" onclick="return confirm('Cette action ne peux pas être annulée. Vous allez supprimer entièrement votre projet. Etes vous sur de vouloir continuer?')"> {# TODO translate #}
-                    <button class="btn btn-sm btn-danger"><i class="fa fa-trash"></i><span>Supprimer ce projet</span></button> {# TODO translate #}
+                <a href="{{ path('gogo_project_delete_my_project') }}" onclick="return confirm('{{ 'dashboard.confirm'|trans }}')">
+                    <button class="btn btn-sm btn-danger"><i class="fa fa-trash"></i><span>{{ 'dashboard.delete'|trans }}</span></button>
                 </a>
             </li>
         {% endif %}
diff --git a/templates/emails/newsletter-show-on-map-button.html.twig b/templates/emails/newsletter-show-on-map-button.html.twig
index 9b7fe1360e86bcc7b8b3bbd98b794bc41e065ca1..577549940fb90e59f9b101bfe0975213a0357696 100755
--- a/templates/emails/newsletter-show-on-map-button.html.twig
+++ b/templates/emails/newsletter-show-on-map-button.html.twig
@@ -12,6 +12,6 @@
                 text-transform: uppercase;
                 letter-spacing: 1px;
                 border: none;
-                background-color: {{ config.primaryColor }};">Voir la carte près de chez vous</button> {# TODO Translation #}
+                background-color: {{ config.primaryColor }};">{{ 'emails.show_map'|trans }}</button>
     </a>
 {% endif %}
\ No newline at end of file
diff --git a/templates/header.html.twig b/templates/header.html.twig
index 72e3b949e43f30c0858f50197a8b247b1d2d1763..a459b9349db663091512ece1276dcccdc35f88fb 100755
--- a/templates/header.html.twig
+++ b/templates/header.html.twig
@@ -162,11 +162,11 @@ function submitAjaxLogin()
           }
           else
           {
-            $('.error-message').text("Les identifiants de connexion ne sont pas corrects").show(); // TODO  translate
+            $('.error-message').text(t('js.login.wrong_id')).show();
           }
       },
       error: function(data, status, object){
-          $('.error-message').text("Une erreur s'est produite lors de la tentative de connexion").show(); // TODO  translate
+          $('.error-message').text(t('js.login.exception')).show();
       }
   });
 }
diff --git a/templates/modals/loginModal.html.twig b/templates/modals/loginModal.html.twig
index e126f0dddc7adda8713fd560c5db05bce1f799c1..4d0a4bbaef08936233a28f3961890b03b0c1547c 100755
--- a/templates/modals/loginModal.html.twig
+++ b/templates/modals/loginModal.html.twig
@@ -23,7 +23,7 @@
           {% endif %}
           {% if config.user.loginWithFacebook and oauth_facebook != 'disabled' %}
           <a class="oauth-btn waves-effect waves-light facebook" href="{{ hwi_oauth_login_url('facebook') }}"><i class="icon gogo-icon-facebook left"></i>Facebook</a>
-          <p class="facebook-alert">ATTENTION ! Si votre mail est privé sur Facebook, vous ne serez pas informé du l'évolution de vos contributions</p> {# TODO Translation #}
+          <p class="facebook-alert"{{ 'sonata.user.user.facebook_warning'|trans }}></p>
           {% endif %}
           {#<a class="oauth-btn waves-effect waves-light yahoo" href="{{ hwi_oauth_login_url('yahoo') }}"><i class="icon gogo-icon-yahoo left"></i>Se connecter avec Yahoo</a>#}
         </div>
diff --git a/translations/admin+intl-icu.fr.yaml b/translations/admin+intl-icu.fr.yaml
index 045c7b919e88f1b13fd4632d48069a87cd35a57e..921fa0c8a6e074b4013a6451da217fe0c4b5c8f5 100755
--- a/translations/admin+intl-icu.fr.yaml
+++ b/translations/admin+intl-icu.fr.yaml
@@ -17,7 +17,7 @@ config_infobar:
       distance: "Si une adresse a été rentrée, distance entre le point et cette adresse"
       isPending: "Raccourci pour status == En attente (modifs ou ajout)"
       isDeleted: "Raccourci pour status = Refusé ou Supprimé"
-      colorOptionId: "L'id de la categorie qui donne la couleur principale de cet élément"
+      colorOptionId: "L'id de la catégorie qui donne la couleur principale de cet élément"
       images: "Tableau des urls des différentes images"
       createdAt: "Date de la création dans la base de donnée"
       updatedAt: "Date de la dernière mise à jour"
@@ -142,6 +142,7 @@ elements:
   _label: "Éléments"
   proposedBy: "Proposé par <u>{name}</u>"
   proposedAt: "le {date}"
+  recent_elements: "Derniers éléments"
   fields:
       name: "Nom"
       newsletterFrequency: "Réception newsletter"
@@ -408,7 +409,7 @@ imports:
     newTaxonomyToMap: "Nouvelles catégories à mapper"
     deletedCount: "{count} localement supprimés"
     elementsMissingGeoCount: "{count} sans géoloc"
-    elementsMissingTaxoCount: "{count} sans categories"
+    elementsMissingTaxoCount: "{count} sans catégories"
     elementsPreventImportedNoTaxo: "{count} non importés car sans catégories"
 
     # templates/admin/partials/import/list_refresh_frequency.html.twig
@@ -567,7 +568,7 @@ config_home:
     backgroundImage: "Image de fond (le nom du fichier ne doit pas contenir d'espaces ou de caractères spéciaux)"
     backgroundImage_placeholder: "Sélectionnez une image déjà importée, ou ajoutez en une !"
     home:
-      displayCategoriesToPick: "Afficher les catégories principales selectionnables pour la recherche"
+      displayCategoriesToPick: "Afficher les catégories principales sélectionnables pour la recherche"
       addElementHintText: "Texte au dessus du bouton \"Ajouter un élément\""
       addElementHintText_placeholder: "Exemple: \"Aidez nous à renrichir la base de donnée en ajoutant un élément !\""
       seeMoreButtonText: "Texte pour inviter à scroller (si des bandeaux de la page d'accueil existent)"
@@ -660,12 +661,12 @@ categories:
       Vous pouvez avoir plusieurs Groupes de catégories en parrallèle. Pour cela créez un nouveau groupe, enregistrez, puis ajoutez lui ensuite des catégories</br></br>
 
       Une catégorie peut elle même contenir un sous groupe avec des sous catégories à l''intérieur. Lorsque vous éditer une catégorie, en bas de la page vous pouvez y ajouter un sous groupe puis le remplir avec de nouvelles catégories.</br></br>
-      <b>(Groupe) GROUPE DE CATEGORIES 1</b>
+      <b>(Groupe) GROUPE DE CATÉGORIES 1</b>
       <ul>
         <li>Catégorie 1</li>
         <li>Catégorie 2</li>
       </ul>
-      <b>(Groupe) GROUPE DE CATEGORIES 2</b>
+      <b>(Groupe) GROUPE DE CATÉGORIES 2</b>
       <ul>
         <li>Catégorie 1</li>
         <li>Catégorie 2</li>
@@ -690,7 +691,7 @@ categories:
     isMandatory: "Choix obligatoire"
     isMandatory_help: "Une catégorie de ce groupe doit être obligatoirement selectionnée"
     singleOption: "Choix unique"
-    singleOption_help: "Une seule catégorie est selectionnable à la fois"
+    singleOption_help: "Une seule catégorie est sélectionnable à la fois"
     enableDescription: "Activer la description des catégories"
     enableDescription_help: "On pourra renseigner un texte pour décrire chaque catégorie. Par example, pour un catégorie Agriculture, on pourrait ajouter comme texte \"Maraîchage, produits transformés...\""
     descriptionLabel: Label pour le champ de description
@@ -1109,6 +1110,9 @@ news:
 
 sonata.user.user:
   _label: Utilisateurs
+  forgottedPassword: "Mot de passe oublié"
+  login_with: "Se connecter avec {provider}"
+  facebook_warning: "ATTENTION ! Si votre mail est privé sur Facebook, vous ne serez pas informé de l'évolution de vos contributions"
   fields:
     contributionsCount: Contributions
     votesCount: Votes
@@ -1172,6 +1176,17 @@ config_users:
       loginWithFacebook: Activer la connexion avec Facebook
 
 dashboard:
+  _label: "GoGoCarto Administration"
+  messages: "{count, plural, 
+                =1 {# message}
+                other {# messages}
+              }"
+  errors: "{count, plural, 
+                =1 {# erreur}
+                other {# erreurs}
+            }"
+  delete: "Supprimer ce projet"
+  confirm: "Cette action ne peux pas être annulée. Vous allez supprimer entièrement votre projet. Êtes vous sur de vouloir continuer ?"
   welcome: >-
       <b>Bienvenue dans votre espace Administrateur !</b></br>
       L'aventure commence tout juste pour vous, il vous faut maintenant commencer à configurer votre site :)</br>
@@ -1242,6 +1257,7 @@ config_saas:
       newProjectInstructions: "Texte personnalisé affiché en haut du formulaire de création d'un nouveau projet"
 
 emails:
+  show_map: "Voir la carte près de chez vous"
   template:
     fields:
       active: "Activé"
@@ -1267,10 +1283,26 @@ emails:
     no_subject_or_content: "Pas de sujet ou de contenu pour le mail automatique {config}"
     unknown: "Inconnu"
 
+api_ui: # templates/api/api-ui.html.twig
+    _label: "Configurer une API"
+    title: "Accédez aux données via une API"
+    format: "Format :"
+    json: "JSON"
+    jsonld: "JSON-LD (Sémantique)"
+    use_categories: "Restreindre par catégories"
+    include_external: "Inclure les sources externes de la base de donnée"
+    use_bounds: "Restreindre sur une zone géographique (dessinez un rectangle sur la carte)"
+    use_limit: "Limiter le nombre de résultat"
+    api_url: "Url de l'API"
+    test: "Tester"
+
 js: # Below keys are available to javascript  
   import:
     source_this_map: "Cette Carte"
 
+  api:
+    placeholder: "Sélectionnez une ou plusieurs catégories"      
+
   mapping_ontology: # templates/admin/core_custom/custom-fields/mapping-ontology.html.twig
     id: "Identifiant unique (dans l'ancienne base de donnée)"
     name: "Titre de la fiche"
@@ -1304,6 +1336,10 @@ js: # Below keys are available to javascript
     primary: "Non éditable"
     primary_title: "Ce champ n'est actuellement pas présent dans le formulaire public. Il sera uniquement éditable depuis l'interface administrateur. Vous pouvez modifier le formulaire public pour rendre ce champ éditable par tous"
 
+  mapping_taxonomy:
+    selectCategory: "Sélectionnez une catégorie existante ou entrez le nom d'une nouvelle catégorie à créer"
+    createTerm: "{term} (Sera créé au moment de sauvegarder)"
+
   element_form:
     geocoded_marker_text: Déplacez moi pour préciser la position</br>(au centre du bâtiment)
     geocode_error: Erreur lors de la géolocalisation de "{address}"
@@ -1367,6 +1403,28 @@ js: # Below keys are available to javascript
     taxonomy: Filtre Catégories
     gogo_date: Filtre Date
     gogo_number: Filtre Nombre
+    used_field: "Champ utilisé : {field}"
+    choose_field: "Veuillez choisir le champ à utiliser"
+    customize_field: "Personnaliser ce filtre dans le menu des catégories"
+    field_name: "Nom du champ à utiliser"
+    contracted_field: "Filtre replié par défaut"
+    date_views:
+      day: "Jour"
+      week: "Semaine"
+      month: "Mois"
+      year: "Année"
+      range: "Plage"
+    field_end: "Champ pour la Date de fin (optionel)"
+    multiday: "Plusieurs jours sélectionnable"
+    select_views: "Vues (Ctrl + Click)"
+    default_view: "Vue par défaut"
+    min: "Mini"
+    max: "Maxi"
+    step: "Pas"
+    type: "Type"
+    options:
+      slider: "Slider"
+      value: "Valeur"
 
   osm_query_builder:
-    title: Liste des requêtes dans la base OpenStreetMap
\ No newline at end of file
+    title: Liste des requêtes dans la base OpenStreetMap
diff --git a/translations/messages+intl-icu.fr.yaml b/translations/messages+intl-icu.fr.yaml
index 08198e836b9953b863074ad6263f0d207f674f94..1865113a0a6161807e4e36e4d3741cc81195ad75 100755
--- a/translations/messages+intl-icu.fr.yaml
+++ b/translations/messages+intl-icu.fr.yaml
@@ -186,38 +186,39 @@ contributor-login:
   error:
     #inactive_feature: "Désolé, cette fonctionnalité n'est pas activée pour le moment" # TODO translation pb avec ces chaines ?????
     #inactive_iframe: "Désolé, cette fonctionnalité n'est pas disponible à l'intérieur d'une iframe"
-    admin_only: Attention ! Cette fonctionnalité est reservée aux administrateur
-    invalid_email: Veuillez renseigner une adresse mail valide
-    used_email: Oups, un compte avec cette adresse email existe déjà ! Connectez-vous ou utilisez une autre adresse !
-  oauth: Connectez-vous avec votre compte
+    admin_only: "Attention ! Cette fonctionnalité est reservée aux administrateur"
+    invalid_email: V"euillez renseigner une adresse mail valide"
+    used_email: "Oups, un compte avec cette adresse email existe déjà ! Connectez-vous ou utilisez une autre adresse !"
+  oauth: "Connectez-vous avec votre compte"
   printemps: "Printemps de l'éducation"
-  communs: LesCommuns.org
-  login: Se connecter
-  email: Entrez simplement une adresse mail
+  communs: "LesCommuns.org"
+  login: "Se connecter"
+  email: "Entrez simplement une adresse mail"
     
 commons:
-  newsletter-explanation: Soyez informé par mail des nouveaux points référencés près de chez vous !
+  newsletter-explanation: "Soyez informé par mail des nouveaux points référencés près de chez vous !"
   every:
-    week: Chaque semaine
-    month: Chaque mois
-  never: Jamais
-  username: Nom d'utilisateur
-  menu: Menu
-  choose_one_option: Veuillez choisir au moins une option
-  choose_category: Choisissez {cat}
-  optional: (optionnel)
-  category_placeholder: Précisez si nécessaire
-  validation: Validation
+    week: "Chaque semaine"
+    month: "Chaque mois"
+  never: "Jamais"
+  username: "Nom d'utilisateur"
+  email: "Adresse e-mail"
+  password: "Mot de passe"
+  check_password: "Retapez votre mot de passe"
+  register: "Créer un compte"
+  location: "Votre adresse ou votre ville"
+  menu: "Menu"
+  choose_one_option: "Veuillez choisir au moins une option"
+  choose_category: "Choisissez {cat}"
+  optional: "(optionnel)"
+  category_placeholder: "Précisez si nécessaire"
+  validation: "Validation"
   errors:
-    file-too-big: Ce fichier est trop lourd, la taille maximum autorisée est {size} Mb
-    bad_email: Veuillez renseigner une adresse email valide
-    bad_url: Veuillez renseigner une url du type http://...
-    bad_number: Ceci n'est pas un nombre !
-    too_long: Oups, ce texte est un peu long !
-
-errors: # TODO erreurs ajax
-  e1: "Les identifiants de connexion ne sont pas corrects"
-  e2: "Une erreur s'est produite lors de la tentative de connexion"
+    file-too-big: "Ce fichier est trop lourd, la taille maximum autorisée est {size} Mb"
+    bad_email: "Veuillez renseigner une adresse email valide"
+    bad_url: "Veuillez renseigner une url du type http://..."
+    bad_number: "Ceci n'est pas un nombre !"
+    too_long: "Oups, ce texte est un peu long !"
 
 action:
   search: "Rechercher"
@@ -266,4 +267,7 @@ action:
 
 js: # Below keys are available to javascript  
   element_form:
-    geocoded_marker_text: Déplacez moi pour préciser la position</br>(au centre du bâtiment)
\ No newline at end of file
+    geocoded_marker_text: Déplacez moi pour préciser la position</br>(au centre du bâtiment)
+  login:
+    wrong_id: "Les identifiants de connexion ne sont pas corrects"
+    exception: "Une erreur s'est produite lors de la tentative de connexion"    
\ No newline at end of file