2017-09-29 14 views
-1

Je suis un utilisateur de lecteur seulement depuis longtemps, et je suis reconnaissant pour toutes les questions répondues par cette grande communauté.Comment faire un @property par défaut pour tous les attributs d'une classe?

J'ai deux questions connexes, l'une concerne la programmation et l'autre le processus de traduction.

Je veux développer une application et multilangue avec ma petite connaissance que je l'ai fait ce qui suit dans dialog.py:

LANGUAGE = 'es-Es' # Get this variable from a conf file if defined 

class Dialog: 
    SUPPORTED_LANGUAGES = ['es-ES', 'en-GB'] 
    def __init__(self, lan): 
     if lan in SUPPORTED_LANGUAGES: 
      self.lan = lan 
     else: 
      self.lan = 'es-ES' # Use a default conf here 

    _OPEN_MENU={ 
     'es-ES': 'Abrir...', 
     'en-GB': 'Open...', 
    } 


    _CLOSE_MENU={ 
     'es-ES': 'Cerrar', 
     'en-GB': 'Close', 
    } 

    _QUIT_APP_MENU={ 
     'es-ES': 'Salir', 
     'en-GB': 'Quit', 
    } 

      . 
      . 
      . 

    @property 
    def OPEN_MENU(self): 
     return self._OPEN_MENU[self.lan] 

    @property 
    def CLOSE_MENU(self): 
     return self._CLOSE_MENU[self.lan] 

    @property 
    def QUIT_APP_MENU(self): 
     return self._QUIT_APP_MENU[self.lan] 

      . 
      . 
      . 

dialog = Dialog(LANGUAGE) 

Disons donc que dans main.py je peux utiliser:

from dialog import dialog 

dialog.OPEN_MENU # With actual conf this returns 'Abrir...' 
dialog.CLOSE_MENU # 'Cerrar' 
dialog.QUIT_APP_MENU # 'Salir' 

Le premier question, y at-il un moyen de faire quelque chose comme ça sans décorer et répéter le code pour chacune des chaînes (ce n'est pas très pythonique)? Le but final est d'avoir un code aussi sympa dans le fichier principal, afin qu'il ne soit pas en désordre. La seconde, je connais peu de choses sur le développement d'applications, est-ce la façon dont je suis supposé travailler ou y a-t-il un meilleur moyen que je n'ai pas trouvé? Comment les développeurs gèrent-ils cette situation?

Merci beaucoup!

+1

Désolé, mais votre question n'est pas vraiment évidente pour moi - "La première question, est-il possible de faire quelque chose comme ça sans décorer et répéter le code pour chacune des chaînes (ce n'est pas très pythonique)? " décorer et répéter le code? Quel code? Pour quelles cordes? Pouvez-vous * nous montrer ce que vous voulez dire *? –

+0

Oui, donnez-moi quelques minutes pour modifier la question. Le problème fondamental est que j'ai plusieurs chaînes que je veux être multilingue, donc je dois répéter la définition de la propriété pour chacun d'eux. –

+0

Vous ré-inventez la roue. Le module gettext fournit des services d'internationalisation (I18N) et de localisation (L10N) pour vos modules et applications Python. https://docs.python.org/3/library/gettext.html http://zetcode.com/wxpython/in18/ –

Répondre

0

Vous semblez essayer très fort de créer une classe pour stocker des données. C'est juste de créer une structure de données pour stocker des données.

Vous pouvez créer des paires valeur/clé pour chaque langue. Enregistrez-les dans des fichiers json et utilisez la clé de langue pour lire le bon fichier json. Déférence du texte avec la clé d'un dictionnaire plutôt que la propriété d'un objet.

+0

Merci, je veux éviter des choses comme DIALOGS [OPEN_MENU] [LANGUAGE], mais il est plus facile de fais, tu as raison. Edit: J'ai raté, vous voulez dire avoir des fichiers différents pour différentes langues, c'est aussi bien. –