vpoulailleau/padpo

View on GitHub
padpo/checkers/glossary.py

Summary

Maintainability
B
6 hrs
Test Coverage
"""Checker for glossary usage."""

import re

from padpo.checkers.baseclass import Checker
from padpo.pofile import PoItem


class GlossaryChecker(Checker):
    """Checker for glossary usage."""

    name = "Glossary"

    def check_item(self, item: PoItem):
        """Check an item in a `*.po` file."""
        if not item.msgstr_full_content:
            return  # no warning
        original_content = item.msgid_rst2txt.lower()
        original_content = re.sub(r"« .*? »", "", original_content)
        translated_content = item.msgstr_full_content.lower()
        for word, translations in glossary.items():
            if re.match(fr"\b{word.lower()}\b", original_content):
                for translated_word in translations:
                    if translated_word.lower() in translated_content:
                        break
                else:
                    possibilities = '"'
                    possibilities += '", "'.join(translations[:-1])
                    if len(translations) > 1:
                        possibilities += '" or "'
                    possibilities += translations[-1]
                    possibilities += '"'
                    item.add_warning(
                        self.name,
                        f'Found "{word}" that is not translated in '
                        f"{possibilities} in ###{item.msgstr_full_content}"
                        "###.",
                    )


# https://github.com/python/python-docs-fr/blob/
# 662b4ec48b27daa4fbef05cddc43da0d894b29e7/CONTRIBUTING.rst
glossary = {
    "-like": ["-compatible"],
    "abstract data type": ["type abstrait"],
    "abstract data types": ["types abstraits"],
    "argument": ["argument"],
    "arguments": ["arguments"],
    "backport": ["rétroporter"],
    "backslash": ["antislash", "*backslash*"],
    "backslashes": ["antislashs", "*backslashes*"],
    "backtrace": ["trace d'appels", "trace de pile"],
    "backtraces": ["traces d'appels", "traces de pile"],
    "big-endian": ["gros-boutiste"],
    "bound": ["lié"],
    "bug": ["bogue"],
    "bugs": ["bogues"],
    "built-in": ["native", "natif"],
    "built-ins": ["fonctions natives"],
    "bytecode": ["code intermédiaire"],
    "callback": ["fonction de rappel"],
    "callbacks": ["fonctions de rappel"],
    "call stack": ["pile d'appels"],
    "call stacks": ["piles d'appels"],
    "caught": ["interceptée", "interceptées"],  # exception
    "debugging": ["débogage"],
    "deep copy": ["copie récursive", "copie profonde"],
    "double quote": ["guillemet"],
    "double quotes": ["guillemets"],
    "deprecated": ["obsolète"],
    "e.g.": ["p. ex.", "par exemple"],
    "et al.": ["et autre", "et autres", "et ailleurs"],
    "export": ["exporter", "exportation"],
    "exports": ["exportations"],
    "expression": ["expression"],
    "expressions": ["expressions"],
    "framework": ["cadriciel"],
    "frozen package": ["paquet figé"],
    "frozen packages": ["paquets figés"],
    "frozen set": ["ensemble figé"],
    "frozen sets": ["ensembles figés"],
    "garbage collector": ["ramasse-miettes"],
    "getter": ["accesseur"],
    "getters": ["accesseurs"],
    "i.e": ["c.-à-d.", "c'est-à-dire"],
    "identifier": ["identifiant"],
    "identifiers": ["identifiants"],
    "index": ["indice"],  # chaînes de caractères
    "indexes": ["indices"],  # chaînes de caractères
    "immutable": ["immuable"],
    "import": ["importer", "importation"],
    "imports": ["importations"],
    "installer": ["installateur"],
    "installers": ["installateurs"],
    "interpreter": ["interpréteur"],
    "interpreters": ["interpréteurs"],
    "keyword(?! argument)": ["mot clé"],
    "keywords": ["mots clés"],
    "keyword argument": ["argument nommé"],
    "keyword arguments": ["arguments nommés"],
    "library": ["bibliothèque"],
    "libraries": ["bibliothèques"],
    "list comprehension": ["liste en compréhension"],
    "list comprehensions": ["listes en compréhension"],
    "little-endian": ["petit-boutiste"],
    "mixin type": ["type de mélange"],
    "mixin types": ["types de mélange"],
    "mutable": ["muable"],
    "namespace": ["espace de nommage", "espace de noms"],
    "namespaces": ["espaces de nommage", "espaces de noms"],
    "parameter": ["paramètre"],
    "parameters": ["paramètres"],
    "pickle": ["sérialiser"],
    "prompt": ["invite"],
    "raise": ["lever"],
    "raised": ["levé"],
    "regular expression": ["expression rationnelle", "expression régulière"],
    "regular expressions": [
        "expressions rationnelles",
        "expressions régulières",
    ],
    "return": ["renvoie"],
    "returns": ["renvoie"],
    "returned": ["renvoyé", "renvoyée", "renvoyés", "renvoyées"],
    "roughly": ["approximativement", "à peu près"],
    "setter": ["mutateur"],
    "setters": ["mutateurs"],
    "simple quote": ["guillemet simple"],
    "simple quotes": ["guillemets simples"],
    "socket": ["connecteur", "interface de connexion"],
    "sockets": ["connecteurs", "interfaces de connexion"],
    "specify": ["définir", "préciser"],
    "statement": ["instruction"],
    "statements": ["instructions"],
    "subprocess": ["sous-processus"],
    "subprocesses": ["sous-processus"],
    "support": [
        "prendre en charge",
        "prend en charge",
        "prennent en charge",
        "implémenter",
        "implémente",
        "implémentent",
    ],
    "thread": ["fil d'exécution"],
    "threads": ["fils d'exécution"],
    "traceback": ["trace d'appels", "trace de pile"],
    "tracebacks": ["traces d'appels", "traces de pile"],
    "(?<![-])tuple": ["*n*-uplet"],
    "(?<![-])tuples": ["*n*-uplets"],
    "2-tuple": ["paire", "couple"],
    "3-tuple": ["triplet"],
    "4-tuple": ["quadruplet"],
    "5-tuple": ["quintuplet"],
    "6-tuple": ["sextuplet"],
    "7-tuple": ["heptuplet"],  # …
    "typically": ["normalement", "habituellement", "comme d'habitude"],
    "underscore": ["tiret bas", "*underscore*", "sous-tiret"],
    "underscores": ["tirets bas", "*underscores*", "sous-tiret"],
    "whitespace": ["caractère d'espacement"],
    "whitespaces": ["caractères d'espacement"],
}

# https://github.com/python/python-docs-fr/blob/
# 25e6bb0dc12c0c22c1053e5c0861a163a84b9c02/glossary.po
glossary.update(
    {
        "abstract base class": ["classe de base abstraite"],
        "abstract base classes": ["classes de base abstraites"],
        "annotation": ["annotation"],
        "annotations": ["annotations"],
        "asynchronous context manager": ["gestionnaire de contexte asynchrone"],
        "asynchronous context managers": ["gestionnaires de contexte asynchrone"],
        "asynchronous generator": ["générateur asynchrone"],
        "asynchronous generators": ["générateurs asynchrones"],
        "asynchronous iterable": ["itérable asynchrone"],
        "asynchronous iterables": ["itérables asynchrones"],
        "asynchronous": ["asynchrone"],
        "attribute": ["attribut"],
        "attributes": ["attributs"],
        "awaitable": ["*awaitable*"],
        "BDFL": ["*BDFL*"],
        "binary file": ["fichier binaire"],
        "binary files": ["fichiers binaires"],
        "bytes-like object": ["objet octet-compatible"],
        "bytes-like objects": ["objets octet-compatible"],
        "bytecode": ["code intermédiaire", "*bytecode*"],
        "class": ["classe"],
        "classes": ["classes"],
        "class variable": ["variable de classe"],
        "class variables": ["variables de classe"],
        "coercion": ["coercition"],
        "coercions": ["coercitions"],
        "complex number": ["nombre complexe"],
        "complex numbers": ["nombres complexes"],
        "context manager": ["gestionnaire de contexte"],
        "context managers": ["gestionnaires de contexte"],
        "context variable": ["variable de contexte"],
        "context variables": ["variables de contexte"],
        "contiguous": ["contigu"],
        "coroutine": ["coroutine"],
        "coroutines": ["coroutines"],
        "CPython": ["CPython"],
        "decorator": ["décorateur"],
        "decorators": ["décorateurs"],
        "descriptor": ["descripteur"],
        "descriptors": ["descripteurs"],
        "dictionary": ["dictionnaire"],
        "dictionaries": ["dictionnaires"],
        "dictionary comprehension": [
            "dictionnaire en compréhension",
            "dictionnaire en intention",
        ],
        "dictionary view": ["vue de dictionnaire"],
        "dictionary views": ["vues de dictionnaire"],
        "docstring": ["*docstring*", "chaîne de documentation"],
        "docstrings": ["*docstrings*", "chaînes de documentation"],
        "duck-typing": ["*duck-typing*"],
        "extension module": ["module d'extension"],
        "extension modules": ["modules d'extension"],
        "f-string": ["f-string"],
        "f-strings": ["f-strings"],
        "file object": ["objet fichier"],
        "file objects": ["objets fichier"],
        "file-like object": ["objet fichier-compatible"],
        "file-like objects": ["objets fichier-compatible"],
        "finder": ["chercheur"],
        "finders": ["chercheurs"],
        "floor division": ["division entière"],
        "floor divisions": ["divisions entières"],
        "function": ["fonction"],
        "functions": ["fonctions"],
        "function annotation": ["annotation de fonction"],
        "function annotations": ["annotations de fonction"],
        "__future__": ["__future__"],
        "garbage collection": ["ramasse-miettes"],
        "generator": ["générateur", "génératrice"],
        "generators": ["générateurs"],
        "generator iterator": ["itérateur de générateur"],
        "generator iterators": ["iterateurs de générateur"],
        "generator expression": ["expression génératrice"],
        "generator expressions": ["expressions génératrices"],
        "generic function": ["fonction générique"],
        "generic functions": ["fonctions génériques"],
        "generic type": ["type générique"],
        "generic types": ["types génériques"],
        "GIL": ["GIL"],
        "global interpreter lock": ["verrou global de l'interpréteur"],
        "hash-based pyc": ["*pyc* utilisant le hachage"],
        "hashable": ["hachable"],
        # "IDLE": ["IDLE"],  # confusion with "idle"
        "immutable": ["immuable"],
        "import path": ["chemin des importations"],
        "import paths": ["chemins des importations"],
        "importing": ["importer", "important", "importation"],
        "importer": ["importateur"],
        "importers": ["importateurs"],
        "interactive": ["interactif", "interactive"],
        "interpreted": ["interprété"],
        "interpreter shutdown": ["arrêt de l'interpréteur"],
        "iterable": ["itérable"],
        "iterables": ["itérables"],
        "iterator": ["itérateur"],
        "iterators": ["itérateurs"],
        "key function": ["fonction clé"],
        "key functions": ["fonctions clé"],
        "keyword argument": ["argument nommé"],
        "keyword arguments": ["arguments nommés"],
        "lambda": ["lambda"],
        "list": ["*list*", "liste"],
        "lists": ["listes"],
        "list comprehension": ["liste en compréhension", "liste en intention"],
        "loader": ["chargeur"],
        "loaders": ["chargeurs"],
        "magic method": ["méthode magique"],
        "magic methods": ["méthodes magiques"],
        "mapping": ["tableau de correspondance"],
        "mappings": ["tableaux de correspondance"],
        "meta path finder": ["chercheur dans les méta-chemins"],
        "meta path finders": ["chercheurs dans les méta-chemins"],
        "metaclass": ["métaclasse"],
        "metaclasses": ["métaclasses"],
        "method": ["méthode"],
        "methods": ["méthodes"],
        "method resolution order": ["ordre de résolution des méthodes"],
        "module": ["module"],
        "modules": ["modules"],
        "module spec": ["spécificateur de module"],
        "module specs": ["spécificateurs de module"],
        "MRO": ["MRO"],
        "mutable": ["muable"],
        "named tuple": ["*n*-uplet nommé"],
        "named tuples": ["*n*-uplets nommés"],
        # "tuple": already in glossary
        # "tuples": already in glossary
        "namespace": ["espace de nommage", "espace de noms"],
        "namespaces": ["espaces de nommage", "espaces de noms"],
        "namespace package": ["paquet-espace de nommage"],
        "namespace packages": ["paquets-espace de nommage"],
        "nested scope": ["portée imbriquée"],
        "nested scopes": ["portées imbriquées"],
        "new-style class": ["nouvelle classe"],
        "new-style classes": ["nouvelles classes"],
        "object": ["objet"],
        "objects": ["objets"],
        "package": ["paquet"],
        "packages": ["paquets"],
        "parameter": ["paramètre"],
        "parameters": ["paramètres"],
        "path entry": ["entrée de chemin"],
        "path entries": ["entrées de chemin"],
        "path entry finder": ["chercheur de chemins"],
        "path entry finders": ["chercheurs de chemins"],
        "path entry hook": ["point d'entrée pour la recherche dans *path*"],
        "path entry hooks": ["points d'entrée pour la recherche dans *path*"],
        "path based finder": ["chercheur basé sur les chemins"],
        "path based finders": ["chercheurs basés sur les chemins"],
        "path-like object": ["objet simili-chemin"],
        "path-like objects": ["objets simili-chemin"],
        "PEP": ["PEP"],
        "portion": ["portion"],
        "portions": ["portions"],
        "positional argument": ["argument positionnel"],
        "positional arguments": ["arguments positionnels"],
        "provisional API": ["API provisoire"],
        "provisional package": ["paquet provisoire"],
        "provisional packages": ["paquets provisoires"],
        "pythonic": ["*pythonique*", "*pythoniques*"],
        "qualified name": ["nom qualifié"],
        "qualified names": ["noms qualifiés"],
        "reference count": ["nombre de références"],
        "regular package": ["paquet classique"],
        "regular packages": ["paquets classiques"],
        "__slots__": ["``__slots__``"],
        "sequence": ["séquence"],
        "sequences": ["séquences"],
        "set comprehension": ["ensemble en compréhension", "ensemble en intention"],
        "single dispatch": ["distribution simple"],
        "slice": ["tranche"],
        "slices": ["tranches"],
        "special method": ["méthode spéciale"],
        "special methods": ["méthodes spéciales"],
        "statement": ["instruction"],
        "statements": ["instructions"],
        "text encoding": ["encodage de texte"],
        "text encodings": ["encodages de texte"],
        "text file": ["fichier texte"],
        "text files": ["fichiers texte"],
        "triple quoted string": ["chaîne entre triple guillemets"],
        "triple quoted strings": ["chaîne entre triple guillemets"],
        "type": ["type"],
        "types": ["types"],
        "type alias": ["alias de type"],
        "type aliases": ["alias de type"],
        "type hint": ["indication de type"],
        "type hints": ["indications de type"],
        "universal newlines": ["retours à la ligne universels"],
        "variable annotation": ["annotation de variable"],
        "variable annotations": ["annotations de variables"],
        "virtual environment": ["environnement virtuel"],
        "virtual environments": ["environnements virtuels"],
        "virtual machine": ["machine virtuelle"],
        "virtual machines": ["machines virtuelles"],
        "zen of Python": ["le zen de Python"],
    }
)