diff --git a/app/api/assiduites.py b/app/api/assiduites.py
index c1efe25b8e4fbbed415a6306e57d33f5da3270d6..d44e0c6b1519df241417c8c3bc6147bd33d7065f 100644
--- a/app/api/assiduites.py
+++ b/app/api/assiduites.py
@@ -337,7 +337,7 @@ def assiduites_group(with_query: bool = False):
     try:
         etuds = [int(etu) for etu in etuds]
     except ValueError:
-        return json_error(404, "Le champs etudids n'est pas correctement formé")
+        return json_error(404, "Le champ etudids n'est pas correctement formé")
 
     # Vérification que tous les étudiants sont du même département
     query = Identite.query.filter(Identite.id.in_(etuds))
diff --git a/app/forms/formation/ue_parcours_ects.py b/app/forms/formation/ue_parcours_ects.py
index 4d25557dc14a8b82fbe1df73af551ef37406c8c5..05f4844085a4ef37470508d32fb02e124d902092 100644
--- a/app/forms/formation/ue_parcours_ects.py
+++ b/app/forms/formation/ue_parcours_ects.py
@@ -17,7 +17,7 @@ def UEParcoursECTSForm(ue: UniteEns) -> FlaskForm:
         pass
 
     parcours: list[ApcParcours] = ue.formation.referentiel_competence.parcours
-    # Initialise un champs de saisie par parcours
+    # Initialise un champ de saisie par parcours
     for parcour in parcours:
         ects = ue.get_ects(parcour, only_parcours=True)
         setattr(
diff --git a/app/forms/main/config_cas.py b/app/forms/main/config_cas.py
index a85a9b1a6c374a40dce2801147375452a89d83cd..41c639bcf05470a109840b1a877605c7f0905827 100644
--- a/app/forms/main/config_cas.py
+++ b/app/forms/main/config_cas.py
@@ -82,7 +82,7 @@ class ConfigCASForm(FlaskForm):
 
     cas_attribute_id = StringField(
         label="Attribut CAS utilisé comme id (laissez vide pour prendre l'id par défaut)",
-        description="""Le champs CAS qui sera considéré comme l'id unique des
+        description="""Le champ CAS qui sera considéré comme l'id unique des
         comptes utilisateurs.""",
     )
 
diff --git a/app/models/config.py b/app/models/config.py
index 0397c6a4e66bff777fba4a6e00d81df7d403ac48..7429926d8232af83415fe05c00c89d332eed51e9 100644
--- a/app/models/config.py
+++ b/app/models/config.py
@@ -297,7 +297,7 @@ class ScoDocSiteConfig(db.Model):
 
     @classmethod
     def _get_int_field(cls, name: str, default=None) -> int:
-        """Valeur d'un champs integer"""
+        """Valeur d'un champ integer"""
         cfg = ScoDocSiteConfig.query.filter_by(name=name).first()
         if (cfg is None) or cfg.value is None:
             return default
@@ -311,7 +311,7 @@ class ScoDocSiteConfig(db.Model):
         default=None,
         range_values: tuple = (),
     ) -> bool:
-        """Set champs integer. True si changement."""
+        """Set champ integer. True si changement."""
         if value != cls._get_int_field(name, default=default):
             if not isinstance(value, int) or (
                 range_values and (value < range_values[0]) or (value > range_values[1])
diff --git a/app/scodoc/TrivialFormulator.py b/app/scodoc/TrivialFormulator.py
index 944566a077888789f8f5e5ea03452a665bb35544..fe71c12bdbed46b7231010b0798e24d43c6d7986 100644
--- a/app/scodoc/TrivialFormulator.py
+++ b/app/scodoc/TrivialFormulator.py
@@ -396,7 +396,7 @@ class TF(object):
                         self.values[field] = int(self.values[field])
                     except ValueError:
                         msg.append(
-                            f"valeur invalide ({self.values[field]}) pour le champs {field}"
+                            f"valeur invalide ({self.values[field]}) pour le champ {field}"
                         )
                         ok = False
                 elif typ == "float" or typ == "real":
@@ -404,7 +404,7 @@ class TF(object):
                         self.values[field] = float(self.values[field].replace(",", "."))
                     except ValueError:
                         msg.append(
-                            f"valeur invalide ({self.values[field]}) pour le champs {field}"
+                            f"valeur invalide ({self.values[field]}) pour le champ {field}"
                         )
                         ok = False
         if ok:
diff --git a/app/scodoc/notesdb.py b/app/scodoc/notesdb.py
index 57f03bd3e79ea2adc20759ffe9abd886e825d6af..e0f2460646b0c32f1599b3773d624c17b7e06c98 100644
--- a/app/scodoc/notesdb.py
+++ b/app/scodoc/notesdb.py
@@ -265,7 +265,7 @@ def DBUpdateArgs(cnx, table, vals, where=None, commit=False, convert_empty_to_nu
         # log('vals=%s\n'%vals)
     except psycopg2.errors.StringDataRightTruncation as exc:
         cnx.rollback()
-        raise ScoValueError("champs de texte trop long !") from exc
+        raise ScoValueError("champ de texte trop long !") from exc
     except:
         cnx.rollback()  # get rid of this transaction
         log('Exception in DBUpdateArgs:\n\treq="%s"\n\tvals="%s"\n' % (req, vals))
diff --git a/app/scodoc/sco_bulletins_pdf.py b/app/scodoc/sco_bulletins_pdf.py
index adac2988d9e8db59a033a232d946587800b97048..c8887fc580bac0d37a3953453dcad9c361e3561c 100644
--- a/app/scodoc/sco_bulletins_pdf.py
+++ b/app/scodoc/sco_bulletins_pdf.py
@@ -166,9 +166,9 @@ def process_field(
         values={pprint.pformat(cdict)}
         """
         )
-        text = f"""<para><i>format invalide: champs</i> {missing_key} <i>inexistant !</i></para>"""
+        text = f"""<para><i>format invalide: champ</i> {missing_key} <i>inexistant !</i></para>"""
         scu.flash_once(
-            f"Attention: format PDF invalide (champs {field}, clef {missing_key})"
+            f"Attention: format PDF invalide (champ {field}, clef {missing_key})"
         )
         raise
     except:  # pylint: disable=bare-except
diff --git a/app/scodoc/sco_portal_apogee.py b/app/scodoc/sco_portal_apogee.py
index 9a46edb261fb3411d726de78ba205109a0d90296..ec2ed1329f6669d229a309b52bc4f00d77b43e3a 100644
--- a/app/scodoc/sco_portal_apogee.py
+++ b/app/scodoc/sco_portal_apogee.py
@@ -494,7 +494,7 @@ def _normalize_apo_fields(infolist):
     infolist: liste de dict renvoyés par le portail Apogee
 
     recode les champs: paiementinscription (-> booleen), datefinalisationinscription (date)
-    ajoute le champs 'paiementinscription_str' : 'ok', 'Non' ou '?'
+    ajoute le champ 'paiementinscription_str' : 'ok', 'Non' ou '?'
     ajoute les champs 'etape' (= None) et 'prenom' ('') s'ils ne sont pas présents.
     ajoute le champ 'civilite_etat_civil' (=''), et 'prenom_etat_civil' (='') si non présent.
     """
diff --git a/app/scodoc/sco_synchro_etuds.py b/app/scodoc/sco_synchro_etuds.py
index dca27e64f45fa14e82e83e8eebbf1a6a88f380db..5cab9c870024a90b0161399fad3449c3c88bce06 100644
--- a/app/scodoc/sco_synchro_etuds.py
+++ b/app/scodoc/sco_synchro_etuds.py
@@ -342,13 +342,15 @@ def _build_page(
         "\n".join(options),
         """</select>
         """,
-        ""
-        if read_only
-        else f"""
+        (
+            ""
+            if read_only
+            else f"""
         <input type="hidden" name="formsemestre_id" value="{sem['formsemestre_id']}"/>
         <input type="submit" name="submitted" value="Appliquer les modifications"/>
         &nbsp;<a href="#help">aide</a>
-        """,
+        """
+        ),
         sco_inscr_passage.etuds_select_boxes(
             etuds_by_cat,
             sel_inscrits=False,
@@ -356,9 +358,11 @@ def _build_page(
             base_url=base_url,
             read_only=read_only,
         ),
-        ""
-        if read_only
-        else """<p/><input type="submit" name="submitted" value="Appliquer les modifications"/>""",
+        (
+            ""
+            if read_only
+            else """<p/><input type="submit" name="submitted" value="Appliquer les modifications"/>"""
+        ),
         formsemestre_synchro_etuds_help(sem),
         """</form>""",
     ]
@@ -420,9 +424,9 @@ def list_synch(sem, annee_apogee=None):
                     log(f"XXX key2etud etudid={etudid}, type {type(etudid)}")
                 etud = etuds[0]
                 etud["inscrit"] = is_inscrit  # checkbox state
-                etud[
-                    "datefinalisationinscription"
-                ] = date_finalisation_inscr_by_nip.get(key, None)
+                etud["datefinalisationinscription"] = (
+                    date_finalisation_inscr_by_nip.get(key, None)
+                )
                 if key in etudsapo_ident:
                     etud["etape"] = etudsapo_ident[key].get("etape", "")
             else:
@@ -855,7 +859,7 @@ def formsemestre_import_etud_admission(
                 if import_email:
                     if not "mail" in data_apo:
                         raise ScoValueError(
-                            "la réponse portail n'a pas le champs requis 'mail'"
+                            "la réponse portail n'a pas le champ requis 'mail'"
                         )
                     if (
                         adresse.email != data_apo["mail"]
diff --git a/app/scodoc/sco_utils.py b/app/scodoc/sco_utils.py
index 64ff0e68e7c63821e0c9b2b04446dd3d27e775da..6b3850997565b4bd31458ea95e7638b05ac9acf0 100644
--- a/app/scodoc/sco_utils.py
+++ b/app/scodoc/sco_utils.py
@@ -1018,7 +1018,7 @@ def flash_errors(form):
     """Flashes form errors (version sommaire)"""
     for field, errors in form.errors.items():
         flash(
-            "Erreur: voir le champs %s" % (getattr(form, field).label.text,),
+            "Erreur: voir le champ %s" % (getattr(form, field).label.text,),
             "warning",
         )
         # see https://getbootstrap.com/docs/4.0/components/alerts/
diff --git a/app/templates/formsemestre/edt_help_config.j2 b/app/templates/formsemestre/edt_help_config.j2
index c620aef33e26ef439a1752f52f1b44b21860c2d3..867a96c93b5029630d864c03b8be0e61f2df1822 100644
--- a/app/templates/formsemestre/edt_help_config.j2
+++ b/app/templates/formsemestre/edt_help_config.j2
@@ -49,7 +49,7 @@ table#edt2group tbody tr.active-row {
         </div>
 
         {% if ScoDocSiteConfig.get("edt_ics_group_field") %}
-        <div>Les groupes sont extrait du champs <b>{{ScoDocSiteConfig.get("edt_ics_group_field")}}</b>
+        <div>Les groupes sont extrait du champ <b>{{ScoDocSiteConfig.get("edt_ics_group_field")}}</b>
         à l'aide de l'expression régulière: <tt>{{ScoDocSiteConfig.get("edt_ics_group_regexp")}}</tt>
         </div>
         {% else %}