diff --git a/animation_animall/__init__.py b/animation_animall/__init__.py
index 944f4a2faed70a62619ecd930c6b711cedac4f23..1ff7bc698c954486b2ae2b2917a071f6f5e3003f 100644
--- a/animation_animall/__init__.py
+++ b/animation_animall/__init__.py
@@ -13,16 +13,11 @@ bl_info = {
 }
 
 import bpy
-from bpy.types import (
-        Operator,
-        Panel,
-        AddonPreferences,
-        )
-from bpy.props import (
-        BoolProperty,
-        StringProperty,
-        )
+from bpy.types import (Operator, Panel, AddonPreferences)
+from bpy.props import (BoolProperty, StringProperty)
 from bpy.app.handlers import persistent
+from bpy.app.translations import pgettext_iface
+from . import translations
 
 
 # Property Definitions
@@ -210,7 +205,7 @@ class VIEW3D_PT_animall(Panel):
                 row.prop(shape_key, "value", text=shape_key.name, icon="SHAPEKEY_DATA")
                 row.prop(obj, "show_only_shape_key", text="")
                 if shape_key.value < 1:
-                    col.label(text='Maybe set "%s" to 1.0?' % shape_key.name, icon="INFO")
+                    col.label(text=pgettext_iface('Maybe set "%s" to 1.0?') % shape_key.name, icon="INFO")
             elif shape_key is not None:
                 col = layout.column(align=True)
                 col.label(text="Cannot key on Basis Shape", icon="ERROR")
@@ -658,28 +653,23 @@ class AnimallAddonPreferences(AddonPreferences):
         col.label(text="Tab Category:")
         col.prop(self, "category", text="")
 
+register_classes, unregister_classes = bpy.utils.register_classes_factory(
+    (AnimallProperties, VIEW3D_PT_animall, ANIM_OT_insert_keyframe_animall,
+     ANIM_OT_delete_keyframe_animall, ANIM_OT_clear_animation_animall,
+     ANIM_OT_update_vertex_color_animation_animall, AnimallAddonPreferences))
 
 def register():
-    bpy.utils.register_class(AnimallProperties)
+    register_classes()
     bpy.types.Scene.animall_properties = bpy.props.PointerProperty(type=AnimallProperties)
-    bpy.utils.register_class(VIEW3D_PT_animall)
-    bpy.utils.register_class(ANIM_OT_insert_keyframe_animall)
-    bpy.utils.register_class(ANIM_OT_delete_keyframe_animall)
-    bpy.utils.register_class(ANIM_OT_clear_animation_animall)
-    bpy.utils.register_class(ANIM_OT_update_vertex_color_animation_animall)
-    bpy.utils.register_class(AnimallAddonPreferences)
     update_panel(None, bpy.context)
 
+    bpy.app.translations.register(__name__, translations.translations_dict)
 
 def unregister():
     del bpy.types.Scene.animall_properties
-    bpy.utils.unregister_class(AnimallProperties)
-    bpy.utils.unregister_class(VIEW3D_PT_animall)
-    bpy.utils.unregister_class(ANIM_OT_insert_keyframe_animall)
-    bpy.utils.unregister_class(ANIM_OT_delete_keyframe_animall)
-    bpy.utils.unregister_class(ANIM_OT_clear_animation_animall)
-    bpy.utils.unregister_class(ANIM_OT_update_vertex_color_animation_animall)
-    bpy.utils.unregister_class(AnimallAddonPreferences)
+    unregister_classes()
+
+    bpy.app.translations.unregister(__name__)
 
 if __name__ == "__main__":
     register()
diff --git a/animation_animall/translations.py b/animation_animall/translations.py
new file mode 100644
index 0000000000000000000000000000000000000000..9ced18074f21c24548652473dca7fe324f71719c
--- /dev/null
+++ b/animation_animall/translations.py
@@ -0,0 +1,250 @@
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+# Tuple of tuples:
+# ((msgctxt, msgid), (sources, gen_comments), (lang, translation, (is_fuzzy, comments)), ...)
+translations_tuple = (
+    (("*", ""),
+     ((), ()),
+     ("fr_FR", "Project-Id-Version: AnimAll 0.9.6 (0)\nReport-Msgid-Bugs-To: \nPOT-Creation-Date: 2022-06-24 00:41:10.347798\nPO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\nLast-Translator: FULL NAME <EMAIL@ADDRESS>\nLanguage-Team: LANGUAGE <LL@li.org>\nLanguage: __POT__\nMIME-Version: 1.0\nContent-Type: text/plain; charset=UTF-8\nContent-Transfer-Encoding: 8bit",
+               (False,
+                ("Blender's translation file (po format).",
+                 "Copyright (C) 2022 The Blender Foundation.",
+                 "This file is distributed under the same license as the Blender package.",
+                 "Damien Picard <dam.pic@free.fr>, 2022."))),
+    ),
+    (("*", "Tab Category"),
+     (("bpy.types.AnimallAddonPreferences.category",),
+      ()),
+     ("fr_FR", "Catégorie d’onglet",
+               (False, ())),
+    ),
+    (("*", "Choose a name for the category of the panel"),
+     (("bpy.types.AnimallAddonPreferences.category",),
+      ()),
+     ("fr_FR", "Choisir un nom pour la catégorie du panneau",
+               (False, ())),
+    ),
+    (("Operator", "Clear Animation"),
+     (("bpy.types.ANIM_OT_clear_animation_animall",),
+      ()),
+     ("fr_FR", "Effacer l’animation",
+               (False, ())),
+    ),
+    (("*", "Delete all keyframes for this object\nIf in a specific case it doesn't work\ntry to delete the keys manually"),
+     (("bpy.types.ANIM_OT_clear_animation_animall",),
+      ()),
+     ("fr_FR", "Supprimer toutes les images clés pour cet objet.\n"
+               "En cas d’échec, essayez de les supprimer manuellement",
+               (False, ())),
+    ),
+    (("*", "Insert a Keyframe"),
+     (("bpy.types.ANIM_OT_insert_keyframe_animall",),
+      ()),
+     ("fr_FR", "Insérer une image clé",
+               (False, ())),
+    ),
+    (("Operator", "Delete Key"),
+     (("bpy.types.ANIM_OT_delete_keyframe_animall",),
+      ()),
+     ("fr_FR", "Supprimer image clé",
+               (False, ())),
+    ),
+    (("*", "Delete a Keyframe"),
+     (("bpy.types.ANIM_OT_delete_keyframe_animall",),
+      ()),
+     ("fr_FR", "Supprimer une image clé",
+               (False, ())),
+    ),
+    (("*", "Animate"),
+     (("bpy.types.VIEW3D_PT_animall",),
+      ()),
+     ("fr_FR", "Animer",
+               (False, ())),
+    ),
+    (("*", "Insert keyframes on active attribute values"),
+     (("bpy.types.AnimallProperties.key_attribute",),
+      ()),
+     ("fr_FR", "Insérer des clés sur l’attribut actif",
+               (False, ())),
+    ),
+    (("*", "Insert keyframes on edge bevel weight"),
+     (("bpy.types.AnimallProperties.key_edge_bevel",),
+      ()),
+     ("fr_FR", "Insérer des clés sur les poids de biseau d’arête",
+               (False, ())),
+    ),
+    (("*", "Insert keyframes on edge creases"),
+     (("bpy.types.AnimallProperties.key_edge_crease",),
+      ()),
+     ("fr_FR", "Insérer des clés sur les plis d’arête",
+               (False, ())),
+    ),
+    (("*", "Insert keyframes on face material indices"),
+     (("bpy.types.AnimallProperties.key_material_index",),
+      ()),
+     ("fr_FR", "Insérer des clés sur les indices de matériaux",
+               (False, ())),
+    ),
+    (("*", "Insert keyframes on point locations"),
+     (("bpy.types.AnimallProperties.key_point_location",),
+      ()),
+     ("fr_FR", "Insérer des clés sur les positions des points",
+               (False, ())),
+    ),
+    (("*", "Insert keyframes on point radius (Shrink/Fatten)"),
+     (("bpy.types.AnimallProperties.key_radius",),
+      ()),
+     ("fr_FR", "Insérer des clés sur le rayon de rayon de point (épaisseur de la courbe)",
+               (False, ())),
+    ),
+    (("*", "Key Selected Only"),
+     (("bpy.types.AnimallProperties.key_selected",),
+      ()),
+     ("fr_FR", "Sélection uniquement",
+               (False, ())),
+    ),
+    (("*", "Insert keyframes only on selected elements"),
+     (("bpy.types.AnimallProperties.key_selected",),
+      ()),
+     ("fr_FR", "Insérer des images clés seulement sur les éléments sélectionnés",
+               (False, ())),
+    ),
+    (("*", "Insert keyframes on active Shape Key layer"),
+     (("bpy.types.AnimallProperties.key_shape_key",),
+      ()),
+     ("fr_FR", "Insérer des clés sur le calque de clé de forme actif",
+               (False, ())),
+    ),
+    (("*", "Insert keyframes on point tilt"),
+     (("bpy.types.AnimallProperties.key_tilt",),
+      ()),
+     ("fr_FR", "Insérer des clés sur l’inclinaison des points",
+               (False, ())),
+    ),
+    (("*", "Insert keyframes on active UV coordinates"),
+     (("bpy.types.AnimallProperties.key_uvs",),
+      ()),
+     ("fr_FR", "Insérer des clés sur les coordonnées UV actives",
+               (False, ())),
+    ),
+    (("*", "Insert keyframes on vertex bevel weight"),
+     (("bpy.types.AnimallProperties.key_vertex_bevel",),
+      ()),
+     ("fr_FR", "Insérer des clés sur les poids de biseau des sommets",
+               (False, ())),
+    ),
+    (("*", "Insert keyframes on active vertex group values"),
+     (("bpy.types.AnimallProperties.key_vertex_group",),
+      ()),
+     ("fr_FR", "Insérer des clés sur les valeurs des groupes de sommets",
+               (False, ())),
+    ),
+    (("*", "AnimAll"),
+     (("scripts/addons/animation_animall.py:142",),
+      ()),
+     ("fr_FR", "",
+               (False, ())),
+    ),
+    (("*", "Key:"),
+     (("scripts/addons/animation_animall.py:150",),
+      ()),
+     ("fr_FR", "Insérer :",
+               (False, ())),
+    ),
+    (("*", "Tab Category:"),
+     (("scripts/addons/animation_animall.py:658",),
+      ()),
+     ("fr_FR", "Catégorie d’onglet",
+               (False, ())),
+    ),
+    # (("*", "Points"),
+    #  (("scripts/addons/animation_animall.py:156",
+    #    "scripts/addons/animation_animall.py:163",
+    #    "scripts/addons/animation_animall.py:192"),
+    #   ()),
+    #  ("fr_FR", "",
+    #            (False, ())),
+    # ),
+    (("*", "Others"),
+     (("scripts/addons/animation_animall.py:159",
+       "scripts/addons/animation_animall.py:175",
+       "scripts/addons/animation_animall.py:200"),
+      ()),
+     ("fr_FR", "Autres",
+               (False, ())),
+    ),
+    # (("*", "Bevel"),
+    #  (("scripts/addons/animation_animall.py:165",
+    #    "scripts/addons/animation_animall.py:169"),
+    #   ()),
+    #  ("fr_FR", "",
+    #            (False, ())),
+    # ),
+    # (("*", "Edges"),
+    #  (("scripts/addons/animation_animall.py:168",),
+    #   ()),
+    #  ("fr_FR", "",
+    #            (False, ())),
+    # ),
+    # (("*", "Crease"),
+    #  (("scripts/addons/animation_animall.py:170",),
+    #   ()),
+    #  ("fr_FR", "",
+    #            (False, ())),
+    # ),
+    # (("*", "Faces"),
+    #  (("scripts/addons/animation_animall.py:172",),
+    #   ()),
+    #  ("fr_FR", "",
+    #            (False, ())),
+    # ),
+    (("*", "\"Location\" and \"Shape Key\" are redundant?"),
+     (("scripts/addons/animation_animall.py:222",),
+      ()),
+     ("fr_FR", "\"Position\" et \"Clé de forme\" sont redondants ?",
+               (False, ())),
+    ),
+    (("*", "Splines"),
+     (("scripts/addons/animation_animall.py:197",),
+      ()),
+     ("fr_FR", "",
+               (False, ())),
+    ),
+    (("*", "Maybe set \"%s\" to 1.0?"),
+     (("scripts/addons/animation_animall.py:213",),
+      ()),
+     ("fr_FR", "Essayez de mettre « %s » à 1.0 ?",
+               (False, ())),
+    ),
+    (("*", "Cannot key on Basis Shape"),
+     (("scripts/addons/animation_animall.py:216",),
+      ()),
+     ("fr_FR", "Impossible d’ajouter une clé sur la forme de base",
+               (False, ())),
+    ),
+    (("*", "No active Shape Key"),
+     (("scripts/addons/animation_animall.py:219",),
+      ()),
+     ("fr_FR", "Pas de clé de forme active",
+               (False, ())),
+    ),
+    (("*", "Clear Animation could not be performed"),
+     (("scripts/addons/animation_animall.py:586",),
+      ()),
+     ("fr_FR", "La suppression de l’animation n’a pas pu aboutir",
+               (False, ())),
+    ),
+    (("*", "Object includes old-style vertex colors. Consider updating them."),
+     (("scripts/addons/animation_animall.py:186",),
+      ()),
+     ("fr_FR", "L’objet contient des couleurs de sommets à l’ancien format. Veuillez les mettre à jour",
+               (False, ())),
+    ),
+)
+
+translations_dict = {}
+for msg in translations_tuple:
+    key = msg[0]
+    for lang, trans, (is_fuzzy, comments) in msg[2:]:
+        if trans and not is_fuzzy:
+            translations_dict.setdefault(lang, {})[key] = trans