def FusionneFichiers(code="en_GB"): # Lecture du fichier xlang fichier = shelve.open(UTILS_Fichiers.GetRepLang(u"%s.xlang" % code), "r") dictDonnees = {} for texte, traduction in fichier.items(): if texte != "###INFOS###": dictDonnees[texte] = traduction fichier.close() # Lecture du fichier lang fichier = shelve.open(UTILS_Fichiers.GetRepLang(u"%s.lang" % code), "w") for texte, traduction in dictDonnees.items(): fichier[texte] = traduction fichier.close() print("Fusion de %d traductions terminee !" % len(dictDonnees))
def GetTracks(self): """ Récupération des données """ # Langues existantes dictLangues = {} for rep in (Chemins.GetStaticPath("Lang"), UTILS_Fichiers.GetRepLang()) : for nomFichier in os.listdir(rep) : if nomFichier.endswith("lang") : code, extension = nomFichier.split(".") fichier = shelve.open(os.path.join(rep, nomFichier), "r") dictInfos = fichier["###INFOS###"] nom = dictInfos["nom_langue"] code = dictInfos["code_langue"] nbreTextes = len(fichier) - 1 fichier.close() if dictLangues.has_key(code) == False : dictLangues[code] = {"nom" : nom, "initial" : 0, "perso" : 0} if extension == "lang" : dictLangues[code]["initial"] = nbreTextes else : dictLangues[code]["perso"] = nbreTextes # Remplissage listeListeView = [] for code, valeurs in dictLangues.iteritems() : dictDonnees = {"code" : code, "initial" : valeurs["initial"], "perso" : valeurs["perso"], "nom" : valeurs["nom"]} listeListeView.append(Track(dictDonnees)) return listeListeView
def OnBoutonOk(self, event): # Récupération des paramètres nom_langue = self.ctrl_nom_langue.GetValue() code_langue = self.ctrl_code_langue.GetValue() # Récupération des traductions perso dictTraductions = self.ctrl_traductions.GetDictTraductionsPerso() # Création du fichier de traduction perso nomFichier = UTILS_Fichiers.GetRepLang(u"%s.xlang" % code_langue) if os.path.isfile(nomFichier): flag = "w" else: flag = "n" fichier = shelve.open(nomFichier, flag) fichier.clear() # Remplissage du fichier fichier["###INFOS###"] = { "nom_langue": nom_langue, "code_langue": code_langue } for texte, traduction in dictTraductions.iteritems(): fichier[texte] = traduction # Clôture du fichier fichier.close() # Fermeture self.EndModal(wx.ID_OK)
def OnBoutonEnvoyer(self, event): # Récupération des commentaires commentaires = self.ctrl_commentaires.GetValue() # Récupération des fichiers à envoyer listeSelections = self.ctrl_fichiers.GetCheckedStrings() listeFichiers = [] for nomFichier in listeSelections: listeFichiers.append( UTILS_Fichiers.GetRepLang(u"%s.xlang" % nomFichier)) if len(listeFichiers) == 0: dlg = wx.MessageDialog( self, _(u"Vous devez obligatoirement cocher un ou plusieurs fichiers de traduction personnalisés à envoyer !" ), _(u"Erreur"), wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() return False # Confirmation dlg = wx.MessageDialog( self, _(u"Confirmez-vous l'envoi de ce message ?"), _(u"Envoi d'une traduction"), wx.YES_NO | wx.NO_DEFAULT | wx.CANCEL | wx.ICON_INFORMATION) reponse = dlg.ShowModal() dlg.Destroy() if reponse != wx.ID_YES: return False # Envoi de l'email resultat = self.EnvoyerEmail(commentaires, listeFichiers) if resultat == True: self.EndModal(wx.ID_OK)
def __init__(self, parent, texteRapport=u""): wx.Dialog.__init__(self, parent, -1, style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER|wx.MAXIMIZE_BOX|wx.MINIMIZE_BOX) self.parent = parent self.texteRapport = texteRapport self.SetTitle(_(u"Envoyer un fichier de traduction")) self.label_ligne_1 = wx.StaticText(self, wx.ID_ANY, _(u"Vos fichiers seront envoyés pour validation au concepteur de Noethys\npuis intégrés dans la prochaine version du logiciel. En effectuant cette\ndémarche, vous acceptez que votre traduction soit diffusée auprès de\nla communauté sous la licence libre GNU GPL.")) self.label_ligne_2 = wx.StaticText(self, wx.ID_ANY, _(u"Cochez le ou les fichiers de traduction à envoyer :")) listeFichiers = os.listdir(UTILS_Fichiers.GetRepLang()) listeFichiersTemp = [] for nomFichier in listeFichiers : if nomFichier.endswith(".xlang") : listeFichiersTemp.append(nomFichier[:-6]) self.ctrl_fichiers = wx.CheckListBox(self, -1, choices=listeFichiersTemp) self.label_ligne_3 = wx.StaticText(self, wx.ID_ANY, _(u"Vous pouvez ajouter ci-dessous des commentaires, remarques ou \ncompléments d'informations avant de l'envoyer au concepteur de Noethys.")) self.ctrl_commentaires = wx.TextCtrl(self, wx.ID_ANY, "", style=wx.TE_MULTILINE) self.bouton_aide = CTRL_Bouton_image.CTRL(self, texte=_(u"Aide"), cheminImage="Images/32x32/Aide.png") self.bouton_envoyer = CTRL_Bouton_image.CTRL(self, texte=_(u"Envoyer l'Email"), cheminImage="Images/32x32/Emails_exp.png") self.bouton_annuler = CTRL_Bouton_image.CTRL(self, texte=_(u"Annuler"), cheminImage="Images/32x32/Annuler.png") self.__set_properties() self.__do_layout() self.Bind(wx.EVT_BUTTON, self.OnBoutonAide, self.bouton_aide) self.Bind(wx.EVT_BUTTON, self.OnBoutonEnvoyer, self.bouton_envoyer) self.Bind(wx.EVT_BUTTON, self.OnBoutonAnnuler, self.bouton_annuler)
def Supprimer(self, event): if len(self.Selection()) == 0: dlg = wx.MessageDialog( self, _(u"Vous n'avez sélectionné aucun fichier de traduction à supprimer dans la liste !" ), _(u"Erreur de saisie"), wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() return track = self.Selection()[0] if track.perso == 0: dlg = wx.MessageDialog( self, _(u"Il n'y a aucune traduction personnalisée à supprimer !"), _(u"Erreur"), wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() return dlg = wx.MessageDialog( self, _(u"Souhaitez-vous vraiment supprimer ce fichier de traduction personnalisé (%d traductions) ?\n\nAttention, toute suppression est irréversible." ) % track.perso, _(u"Suppression"), wx.YES_NO | wx.NO_DEFAULT | wx.CANCEL | wx.ICON_INFORMATION) if dlg.ShowModal() == wx.ID_YES: nomFichier = UTILS_Fichiers.GetRepLang(u"%s.xlang" % track.code) os.remove(nomFichier) self.MAJ() dlg.Destroy()
def __init__(self, parent): wx.Panel.__init__(self, parent, id=-1, style=wx.TAB_TRAVERSAL) self.staticbox_staticbox = wx.StaticBox(self, -1, _(u"Interface*")) # Thème self.liste_labels_theme = [] self.liste_codes_theme = [] for code, label in UTILS_Interface.THEMES: self.liste_labels_theme.append(label) self.liste_codes_theme.append(code) self.label_theme = wx.StaticText(self, -1, _(u"Thème :")) self.ctrl_theme = wx.Choice(self, -1, choices=self.liste_labels_theme) self.ctrl_theme.SetSelection(0) # Langue self.liste_labels_langue = [ u"Français (par défaut)", ] self.liste_codes_langue = [ None, ] for rep in (Chemins.GetStaticPath("Lang"), UTILS_Fichiers.GetRepLang()): for nomFichier in os.listdir(rep): if nomFichier.endswith("lang"): code, extension = nomFichier.split(".") fichier = shelve.open(os.path.join(rep, nomFichier), "r") dictInfos = fichier["###INFOS###"] nom = dictInfos["nom_langue"] code = dictInfos["code_langue"] fichier.close() if code not in self.liste_codes_langue: self.liste_codes_langue.append(code) self.liste_labels_langue.append(nom) self.label_langue = wx.StaticText(self, -1, _(u"Langue :")) self.ctrl_langue = wx.Choice(self, -1, choices=self.liste_labels_langue) self.ctrl_langue.SetSelection(0) self.__set_properties() self.__do_layout() # Init self.Importation()
def GetTraductionsExistantes(self): """ Recherche le fichier de langage par défaut ".lang" puis un éventuel fichier perso ".xlang" """ if self.code == None: return {}, {} dictTraductionsInitiales = {} dictTraductionsPerso = {} for extension, dictTemp in [("lang", dictTraductionsInitiales), ("xlang", dictTraductionsPerso)]: nomFichier = UTILS_Fichiers.GetRepLang(u"%s.%s" % (self.code, extension)) if os.path.isfile(nomFichier): fichier = shelve.open(nomFichier, "r") for key, valeur in fichier.items(): dictTemp[key] = valeur fichier.close() return dictTraductionsInitiales, dictTraductionsPerso
def GetTraductionsExistantes(self): """ Recherche le fichier de langage par défaut ".lang" puis un éventuel fichier perso ".xlang" """ if self.code == None: return {}, {} dictTraductionsInitiales = {} dictTraductionsPerso = {} for extension, rep, dictTemp in [ ("lang", Chemins.GetStaticPath("Lang"), dictTraductionsInitiales), ("xlang", UTILS_Fichiers.GetRepLang(), dictTraductionsPerso) ]: nomFichier = os.path.join(rep, u"%s.%s" % (self.code, extension)) if os.path.isfile(nomFichier): data = UTILS_Json.Lire(nomFichier, conversion_auto=True) for key, valeur in data.items(): dictTemp[key] = valeur return dictTraductionsInitiales, dictTraductionsPerso
def ChargeTraduction(nom=""): """ Charge un fichier de langage """ global DICT_TRADUCTIONS dictTraductions = {} # Recherche le fichier de langage par défaut ".lang" puis un éventuel fichier perso ".xlang" for extension in ("lang", "xlang"): nomFichier = UTILS_Fichiers.GetRepLang(u"%s.%s" % (nom, extension)) if os.path.isfile(nomFichier): fichier = shelve.open(nomFichier, "r") for key, valeur in fichier.items(): key = key.decode("iso-8859-15") dictTraductions[key] = valeur fichier.close() # Mémorise les traductions DICT_TRADUCTIONS = dictTraductions
def Exporter(self, event): """ Exporter le modèle sélectionné """ if len(self.Selection()) == 0 : dlg = wx.MessageDialog(self, _(u"Vous n'avez sélectionné aucune langue dans la liste !"), _(u"Erreur"), wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() return track = self.Selection()[0] if track.perso == 0 : dlg = wx.MessageDialog(self, _(u"Il n'y a aucune traduction personnalisée à exporter !"), _(u"Erreur"), wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() return nomFichier = track.code + ".xlang" # Demande le chemin pour la sauvegarde du fichier standardPath = wx.StandardPaths.Get() dlg = wx.FileDialog(self, message=_(u"Envoyer le fichier de traduction personnalisé vers..."), defaultDir = standardPath.GetDocumentsDir(), defaultFile=nomFichier, wildcard="Fichier de traduction (*.xlang)|*.xlang", style=wx.SAVE) if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() else : path = None dlg.Destroy() if path == None : return # Le fichier de destination existe déjà : if os.path.isfile(path) == True : dlg = wx.MessageDialog(None, _(u"Un fichier portant ce nom existe déjà. \n\nVoulez-vous le remplacer ?"), "Attention !", wx.YES_NO | wx.NO_DEFAULT | wx.ICON_EXCLAMATION) if dlg.ShowModal() == wx.ID_NO : return False dlg.Destroy() else: dlg.Destroy() # Exportation shutil.copyfile(UTILS_Fichiers.GetRepLang(nomFichier), path) # Confirmation dlg = wx.MessageDialog(self, _(u"Le fichier de traduction a été exporté avec succès !"), _(u"Exportation"), wx.OK | wx.ICON_INFORMATION) dlg.ShowModal() dlg.Destroy()
def MAJ(self): self.listeLabels = [] self.listeDonnees = [] # Recherche les fichiers de langues existants listeCodes = [] for rep in (Chemins.GetStaticPath("Lang"), UTILS_Fichiers.GetRepLang()): for nomFichier in os.listdir(rep): if nomFichier.endswith("lang"): code, extension = nomFichier.split(".") fichier = shelve.open(os.path.join(rep, nomFichier), "r") # Lecture des caractéristiques dictInfos = fichier["###INFOS###"] nom = dictInfos["nom_langue"] code = dictInfos["code_langue"] # Lecture des textes listeTextes = [] for texte, traduction in fichier.iteritems(): if texte != "###INFOS###": listeTextes.append(texte) # Fermeture du fichier fichier.close() label = u"%s (%s)" % (nom, code) if code not in listeCodes: listeCodes.append(code) self.listeLabels.append(label) self.listeDonnees.append({ "nom": nom, "code": code, "textes": listeTextes }) # Remplissage du contrôle if len(self.listeLabels) == 0: self.Enable(False) self.SetItems(self.listeLabels)
def OnBoutonOk(self, event): # Récupération des paramètres nom_langue = self.ctrl_nom_langue.GetValue() code_langue = self.ctrl_code_langue.GetValue() # Récupération des traductions perso dictTraductions = self.ctrl_traductions.GetDictTraductionsPerso() # Création du fichier de traduction perso nomFichier = UTILS_Fichiers.GetRepLang(u"%s.xlang" % code_langue) data = {} data["###INFOS###"] = { "nom_langue": nom_langue, "code_langue": code_langue } for texte, traduction in dictTraductions.items(): data[texte] = traduction UTILS_Json.Ecrire(nomFichier, data=data) # Fermeture self.EndModal(wx.ID_OK)
def OnBoutonImporter(self, event): # Récupération de la langue dictLangue = self.ctrl_langues.GetCode() if dictLangue == None: dlg = wx.MessageDialog( self, _(u"Vous devez sélectionner une langue dans la liste !"), _(u"Erreur"), wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() return nom_langue = dictLangue["nom"] code_langue = dictLangue["code"] textes_langue = dictLangue["textes"] # Récupération des fichiers fichier_original = self.ctrl_fichier_importer_original.GetValue() if fichier_original == "": dlg = wx.MessageDialog( self, _(u"Vous devez sélectionner un fichier de textes originaux !" ), _(u"Erreur"), wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() return fichier_traduction = self.ctrl_fichier_importer_traduction.GetValue() if fichier_traduction == "": dlg = wx.MessageDialog( self, _(u"Vous devez sélectionner un fichier de textes traduits !"), _(u"Erreur"), wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() return # Lecture des textes fichier = open(fichier_original, "r") lignesOriginal = fichier.readlines() fichier.close() fichier = open(fichier_traduction, "r") lignesTraduction = fichier.readlines() fichier.close() if len(lignesOriginal) != len(lignesTraduction): dlg = wx.MessageDialog( self, _(u"Le nombre de lignes des deux fichiers doit être identique !" ), _(u"Erreur"), wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() return # Demande de confirmation dlg = wx.MessageDialog( None, _(u"Confirmez-vous l'insertion de %d textes traduits dans le fichier '%s' ?" ) % (len(lignesOriginal), nom_langue), "Confirmation", wx.YES_NO | wx.YES_DEFAULT | wx.ICON_EXCLAMATION) if dlg.ShowModal() == wx.ID_NO: return False dlg.Destroy() else: dlg.Destroy() # Fusion des traductions dictTraductions = {} indexLigne = 0 for texte in lignesOriginal: if len(texte) > 0: dictTraductions[texte[:-1]] = lignesTraduction[indexLigne][:-1] indexLigne += 1 # Création du fichier de traduction perso nomFichier = UTILS_Fichiers.GetRepLang(u"%s.xlang" % code_langue) if os.path.isfile(nomFichier): flag = "w" else: flag = "n" fichier = shelve.open(nomFichier, flag) # Remplissage du fichier fichier["###INFOS###"] = { "nom_langue": nom_langue, "code_langue": code_langue } for texte, traduction in dictTraductions.iteritems(): fichier[texte] = traduction if "Bienvenue" in texte: print texte, " --> ", (traduction, ) # Clôture du fichier fichier.close() # Confirmation dlg = wx.MessageDialog( self, _(u"L'importation des traductions s'est déroulée avec succès !" ), _(u"Succès"), wx.OK | wx.ICON_INFORMATION) dlg.ShowModal() dlg.Destroy()
def Importer(self, event): """ Importer un fichier de langue """ # Ouverture de la fenêtre de dialogue wildcard = "Fichiers de langue (*.lang, *.xlang)|*.lang;*.xlang|Tous les fichiers (*.*)|*.*" sp = wx.StandardPaths.Get() dlg = wx.FileDialog( self, message=_(u"Choisissez un fichier de langue à importer"), defaultDir=sp.GetDocumentsDir(), defaultFile="", wildcard=wildcard, style=wx.OPEN ) if dlg.ShowModal() == wx.ID_OK: nomFichierCourt = dlg.GetFilename() nomFichierLong = dlg.GetPath() dlg.Destroy() else: dlg.Destroy() return # Vérifie si un fichier existe déjà if os.path.isfile(UTILS_Fichiers.GetRepLang(nomFichierCourt)) == False : shutil.copyfile(nomFichierLong, UTILS_Fichiers.GetRepLang(nomFichierCourt)) self.MAJ() else : dlg = DLG_Messagebox.Dialog(self, titre=_(u"Importer"), introduction=_(u"Ce fichier est déjà présent !"), detail=None, conclusion=_(u"Souhaitez-vous le remplacer ou les fusionner ?"), icone=wx.ICON_EXCLAMATION, boutons=[_(u"Fusionner"), _(u"Remplacer"), _(u"Annuler")]) reponse = dlg.ShowModal() dlg.Destroy() if reponse == 0 : # Fusionner dlg = wx.MessageDialog(self, _(u"Souhaitez-vous vraiment fusionner les deux fichiers ?"), _(u"Confirmation"), wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION) reponse = dlg.ShowModal() dlg.Destroy() if reponse == wx.ID_NO : return # Lecture des 2 fichiers dictDonnees = {} for nomFichier in [UTILS_Fichiers.GetRepLang(nomFichierCourt), nomFichierLong] : fichier = shelve.open(nomFichier, "r") for key, valeur in fichier.iteritems() : dictDonnees[key] = valeur fichier.close() # Ecriture du fichier final nomFichier = UTILS_Fichiers.GetRepLang(nomFichierCourt) if os.path.isfile(nomFichier) : flag = "w" else : flag = "n" fichier = shelve.open(nomFichier, flag) fichier.clear() for key, valeur in dictDonnees.iteritems() : fichier[key] = valeur fichier.close() self.MAJ() dlg = wx.MessageDialog(self, _(u"Le fichier a été importé avec succès !"), _(u"Confirmation"), wx.OK | wx.ICON_INFORMATION) dlg.ShowModal() dlg.Destroy() if reponse == 1 : # Remplacer dlg = wx.MessageDialog(self, _(u"Souhaitez-vous vraiment remplacer le fichier ?"), _(u"Confirmation"), wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION) reponse = dlg.ShowModal() dlg.Destroy() if reponse == wx.ID_NO : return # Copie du fichier vers le répertoire Lang os.remove(UTILS_Fichiers.GetRepLang(nomFichierCourt)) shutil.copyfile(nomFichierLong, UTILS_Fichiers.GetRepLang(nomFichierCourt)) self.MAJ() dlg = wx.MessageDialog(self, _(u"Le fichier a été importé avec succès !"), _(u"Confirmation"), wx.OK | wx.ICON_INFORMATION) dlg.ShowModal() dlg.Destroy() if reponse == 2 : return False