IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Traduction dans ArgParse [Python 3.X]


Sujet :

Python

  1. #1
    Membre éclairé
    Avatar de Le Farfadet Spatial
    Homme Profil pro
    En cours de précision…
    Inscrit en
    Avril 2008
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : En cours de précision…

    Informations forums :
    Inscription : Avril 2008
    Messages : 190
    Par défaut Traduction dans ArgParse
    Salut à tous !

    Je dois traduire la sortie d’aide produite par ArgParse pour l’application dont le dépôt est disponible à l’adresse suivante :

    https://framagit.org/python-with-fra...ref_type=heads

    (Normalement, le lien dirige vers la branche en cours de modification, où je mets en place les traductions.)

    Je parviens à traduire l’intégralité des différentes chaînes de caractères, à l’exception de la chaine « default » qui apparaît lorsqu’un paramètre de l’application a une valeur par défaut. Le fond de mon problème, c’est de trouver où est définie la chaîne de caractères à afficher pour annoncer une valeur par défaut. J’ai fait pas mal de recherche sur le net et aussi essayer de chercher dans le code source de ArgParse, mais je ne parviens pas à trouver où cette chaîne de caractère est définie.

    A priori, il faut que je fixe la bonne chaîne de caractère dans la fonction « create_parser » dans le fichier « hformatter.py ». Voici le contenu de ce fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
     
    """
    Utility class to format help text.
     
    :module: hformatter
    :author: Le*Bars, Yoann
     
    This program is free software; you can redistribute it and/or modify it under
    the terms of the GNU General Public Licence  as published by the
    Free Software Foundation; either version 3 of the Licence, or (at your
    option) any later version. See file `LICENSE` or go to:
     
    https://www.gnu.org/licenses/gpl-3.0.html
    """
     
     
    from typing import Iterable
    import argparse
     
     
    # Title for usage section.
    usage_string: str = 'Usage: '
     
     
    class HelpFormatter(argparse.ArgumentDefaultsHelpFormatter):
        """
        Class to format help output.
     
        :param str __usage_string: Title for usage section.
        """
     
        __usage_string: str
     
        def __init__(self, prog: str, indent_increment: int = 2, max_help_position: int = 24,
                     width: int | None = None) -> None:
            self.__usage_string = usage_string
            super().__init__(prog, indent_increment, max_help_position, width)
     
        def add_usage(self, usage: str, actions: Iterable[argparse.Action],
                      groups: Iterable[argparse._ArgumentGroup],
                      prefix: str | None = None) -> None:
            """
            Reformat usage message.
     
            :param str usage: Program command line description.
            :param str actions: Action identifier.
            :param str groups: Groups identifier.
            :param str prefix: Prefix to usage explanation.
     
            :returns: Object describing usage string.
            :rtype: None
            """
     
            if prefix is None:
                prefix = self.__usage_string
     
            return super().add_usage(usage, actions, groups, prefix)
     
     
    def create_parser(program_description: str, positional_name: str, optional_name: str,
                      program_version: str, version_message: str,
                      help_message: str, usage_message: str = 'Usage: ') -> argparse.ArgumentParser:
        """
        Generates an argument parser.
     
        :param str program_description: String describing the aims of the program.
        :param str positional_name: String for positional arguments title.
        :param str optional_name: String for optional arguments title.
        :param str program_version: String describing program version.
        :param str version_message: String describing the version program option.
        :param str help_message: String describing the help program option.
        :param str usage_message: Title for usage section. Default to “Usage: ”
     
        :returns: An argument parser.
        :rtype: argparse.ArgumentParser
        """
     
        global usage_string
        usage_string = usage_message
        # Command line parser.
        parser = argparse.ArgumentParser(add_help=False,
                                         formatter_class=HelpFormatter,
                                         description=program_description)
        parser._positionals.title = positional_name     # pylint: disable=protected-access
        parser._optionals.title = optional_name         # pylint: disable=protected-access
        parser.add_argument('-V', '--version', action='version', version='%(prog)s ' + program_version,
                            help=version_message)
        parser.add_argument('-h', '--help', action='help', default=argparse.SUPPRESS,
                            help=help_message)
     
        return parser
     
     
    # Defines the public names of this module.
    __all__ = ['create_parser']
    Il faut que je trouve un équivalent pour « default » à la ligne 86 (qui change le titre pour les arguments positionnels) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    parser._positionals.title = positional_name
    Est-ce que quelqu’un a une idée de comment faire ?

    À bientôt.

  2. #2
    Membre éclairé
    Avatar de Le Farfadet Spatial
    Homme Profil pro
    En cours de précision…
    Inscrit en
    Avril 2008
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : En cours de précision…

    Informations forums :
    Inscription : Avril 2008
    Messages : 190
    Par défaut
    Salut à tous !

    À tout hasard, j’essaye de relancer la question : quelqu’un a-t-il déjà traduit les sorties d’ArgParse ? Si oui, comment faire pour traduire le « default » qui s’affiche avant la valeur par défaut d’un argument ?

    À bientôt.

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 701
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 701
    Par défaut
    Salut,

    Je ne l'ai pas fait mais en cherchant un peu sur Internet, j'ai pu trouver (et vérifier) que:
    - vous n'êtes pas le premier à vouloir faire cela et qu'il existe des codes,
    - argparse utilise gettext pour traduire les messages, on doit donc pouvoir faire des choses... "normales" (ça ne veut pas dire qu'il est conforme I18N complètement).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre éclairé
    Avatar de Le Farfadet Spatial
    Homme Profil pro
    En cours de précision…
    Inscrit en
    Avril 2008
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : En cours de précision…

    Informations forums :
    Inscription : Avril 2008
    Messages : 190
    Par défaut
    Salut à tous !

    Merci pour la réponse.

    Citation Envoyé par wiztricks Voir le message
    - vous n'êtes pas le premier à vouloir faire cela et qu'il existe des codes,
    En effet et ce que j’ai déjà réalisé se base sur des codes trouvé sur le net. Cependant, je ne suis pas parvenu à trouver des renseignements concernant spécificiquement la chaîne « default », qui est donc la seule chaîne que je n’ai pas pu traduire, ce qui donne un côté pas fini. J’ai beau chercher, je ne trouve rien sur cette chaîne là spécificiquement, même si j’ai réussi à traduire tout le reste.

    - argparse utilise gettext pour traduire les messages, on doit donc pouvoir faire des choses... "normales" (ça ne veut pas dire qu'il est conforme I18N complètement).
    En l’espèce, le tout fait partie d’une application utilisant Qt (via Pyside), il est donc plus cohérent d’utiliser les fonctionnalités de traduction de Qt, d’autant que les fichiers UI géréré par Qt Designer sont prévu pour être traduit par ce moyen et pas par Gettext.

    De toute façon, j’ai essayé avec Gettext et c’est le même problème : je ne trouve pas la chaîne « default » et ne parviens donc pas à la traduire.

    Vraiment, ma question ne porte pas sur comment traduire les sorties d’Argparse en général, mais spécificiquement sur « default ».

    Pour information, comme il fallait avancer, j’ai fusionné la branche dédiée à mettre en place les traductions, le bon lien vers le projet est désormais le suivant (branche principale, ça ne changera donc jamais) : https://framagit.org/python-with-fra...ng/pure-python

    À bientôt.

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 701
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 701
    Par défaut
    Citation Envoyé par Le Farfadet Spatial Voir le message
    Vraiment, ma question ne porte pas sur comment traduire les sorties d’Argparse en général, mais spécificiquement sur « default ».
    Reste qu'il est difficile de traduire "default" sans le faire dans son contexte plus général... qui devra être compris/validé/... pour y répondre.
    Ce qui demande du temps (et de l'expertise)...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 319
    Par défaut
    bonjour
    Citation Envoyé par Le Farfadet Spatial Voir le message
    mon problème, c’est de trouver où est définie la chaîne de caractères à afficher pour annoncer une valeur par défaut. J’ai fait pas mal de recherche sur le net et aussi essayer de chercher dans le code source de ArgParse, mais je ne parviens pas à trouver où cette chaîne de caractère est définie.
    C'est pourtant extrêmement simple !

    1) dans la doc : c'est la classe ArgumentDefaultsHelpFormatter qui affiche ce mot par défaut

    https://docs.python.org/fr/3/library...sHelpFormatter
    ArgumentDefaultsHelpFormatter ajoute automatiquement l'information sur les valeurs par défaut aux messages d'aide de tous les arguments :

    - Il suffit de ne pas l'utiliser et alors ta chaine est donnée dans le paramètre help que tu traduis déjà
    - Sinon, un clic dans mon éditeur sur la classe va ouvrir le fichier source argparse.py (donné par la doc) à la bonne ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    class ArgumentDefaultsHelpFormatter(HelpFormatter):
        """Help message formatter which adds default values to argument help.
     
        Only the name of this class is considered a public API. All the methods
        provided by the class are considered an implementation detail.
        """
     
        def _get_help_string(self, action):
            """
            Add the default value to the option help message.
     
            ArgumentDefaultsHelpFormatter and BooleanOptionalAction when it isn't
            already present. This code will do that, detecting cornercases to
            prevent duplicates or cases where it wouldn't make sense to the end
            user.
            """
            help = action.help
            if help is None:
                help = ''
     
            if '%(default)' not in help:
                if action.default is not SUPPRESS:
                    defaulting_nargs = [OPTIONAL, ZERO_OR_MORE]
                    if action.option_strings or action.nargs in defaulting_nargs:
                        help += _(' (default: %(default)s)')
            return help
    L26 ici, _(xxxx) ...

    C'est ton code source ??? Tu réécris cette classe mais ne sais pas l'utiliser et n'a pas lu son code

  7. #7
    Membre éclairé
    Avatar de Le Farfadet Spatial
    Homme Profil pro
    En cours de précision…
    Inscrit en
    Avril 2008
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : En cours de précision…

    Informations forums :
    Inscription : Avril 2008
    Messages : 190
    Par défaut
    Salut à tous !

    En surchargeant la méthode « _get_help_string » dans la classe « HelpFormatter », j’ai en effet pu traduire aussi la chaîne « default ». Il faut prendre garde à ne pas cacher des variables existantes. Ce qui donne le fichier « hformatter.py » suivant*:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
     
    """
    Utility class to format help text.
     
    :module: hformatter
    :author: Le*Bars, Yoann
     
    This program is free software; you can redistribute it and/or modify it under
    the terms of the GNU General Public License  as published by the
    Free Software Foundation; either version 3 of the License, or (at your
    option) any later version. See file `LICENSE` or go to:
     
    https://www.gnu.org/licenses/gpl-3.0.html
    """
     
     
    # Defines the public names of this module.
    __all__ = ['create_parser']
     
     
    from typing import Iterable
    import argparse
     
     
    # Title for usage section.
    usage_string: str = 'Usage: '
    # Title for default value description.
    default_string: str = 'default'
     
     
    class HelpFormatter(argparse.ArgumentDefaultsHelpFormatter):
        """
        Class to format help output.
     
        :param str __usage_string: Title for usage section.
        :param str __default_string: Title for default value description.
        """
     
        __usage_string: str
        __default_string: str
     
        def __init__(self, prog: str, indent_increment: int = 2, max_help_position: int = 24,
                     width: int | None = None) -> None:
            """
            Class constructor.
     
            :param str prog: Program name.
            :param int indent_increment: Number of blank space when incrementing the text.
            :param int max_help_position: Maximum text indent.
            :param int width: Line width in help message.
            """
     
            self.__usage_string = usage_string
            self.__default_string = default_string
            super().__init__(prog, indent_increment, max_help_position, width)
     
        def _get_help_string(self, action: argparse.Action) -> str | None:
            """
            Create the help message for a given action.
     
            :param argparse.Action action: Action descriptor.
            """
     
            help_string: str | None = action.help
            if '%(default)' not in action.help:
                if action.default is not argparse.SUPPRESS:
                    defaulting_nargs = [argparse.OPTIONAL, argparse.ZERO_OR_MORE]
                    if action.option_strings or action.nargs in defaulting_nargs:
                        help_string += f' ({self.__default_string}: %(default)s)'
            return help_string
     
        def add_usage(self, usage: str, actions: Iterable[argparse.Action],
                      groups: Iterable[argparse._ArgumentGroup],
                      prefix: str | None = None) -> None:
            """
            Reformat usage message.
     
            :param str usage: Program command line description.
            :param str actions: Action identifier.
            :param str groups: Groups identifier.
            :param str prefix: Prefix to usage explanation.
     
            :returns: Object describing usage string.
            :rtype: None
            """
     
            if prefix is None:
                prefix = self.__usage_string
     
            return super().add_usage(usage, actions, groups, prefix)
     
     
    def create_parser(program_description: str, positional_name: str, optional_name: str,       # pylint: disable=too-many-arguments
                      program_version: str, version_message: str,
                      help_message: str, usage_message: str = usage_string,                     # pylint: disable=used-prior-global-declaration
                      default_message: str = default_string) -> argparse.ArgumentParser:        # pylint: disable=used-prior-global-declaration
        """
        Generates an argument parser.
     
        :param str program_description: String describing the aims of the program.
        :param str positional_name: String for positional arguments title.
        :param str optional_name: String for optional arguments title.
        :param str program_version: String describing program version.
        :param str version_message: String describing the version program option.
        :param str help_message: String describing the help program option.
        :param str usage_message: Title for usage section. Default to “Usage: ”
        :param str usage_message: Title for default value description. Default to “default”
     
        :returns: An argument parser.
        :rtype: argparse.ArgumentParser
        """
     
        global usage_string, default_string     # pylint: disable=global-statement
        usage_string = usage_message
        default_string = default_message
        # Command line parser.
        parser = argparse.ArgumentParser(add_help=False,
                                         formatter_class=HelpFormatter,
                                         description=program_description)
        parser._positionals.title = positional_name     # pylint: disable=protected-access
        parser._optionals.title = optional_name         # pylint: disable=protected-access
        parser.add_argument('-V', '--version', action='version', version='%(prog)s ' + program_version,
                            help=version_message)
        parser.add_argument('-h', '--help', action='help', default=argparse.SUPPRESS,
                            help=help_message)
     
        return parser
    J’ai mis à jour le dépôt de l’application.

    Problème résolu.

    À bientôt.

  8. #8
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 053
    Par défaut
    Bonjour,

    Vous devriez visiter les sites qui parlent des modules Fire et Typer.

    Se sont d'excellents modules pour créer des applications CLI et qui font économiser pas mal de lignes.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 12/06/2010, 12h35
  2. gestion de traduction dans la base de donné
    Par yacine.dev dans le forum Merise
    Réponses: 3
    Dernier message: 28/01/2010, 16h34
  3. Association traduction dans code ?
    Par rad_hass dans le forum Diagrammes de Classes
    Réponses: 2
    Dernier message: 02/04/2009, 12h19
  4. Problème de traduction dans un panel
    Par nitrous007 dans le forum C#
    Réponses: 2
    Dernier message: 24/10/2007, 11h36
  5. Traductions dans BDS2006
    Par Patrick Seuret dans le forum C++Builder
    Réponses: 3
    Dernier message: 13/04/2006, 08h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo