#!/usr/bin/python # -*- coding: utf-8 -*- # This file is a is a tool to help translate EKD, update POT and PO # files, and manage translations (eg from French to English, but # also vice versa). # Copyright (C) 2004-2012 Lama Angelo (the historical developper # of EKD) # 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. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os, sys, glob, time, shutil, string, stat, platform, locale from moteur_modules_common.EkdCompatiblePython2Et3 import EkdPrint, EkdInput, EkdRawInput from moteur_modules_common.EkdConfig import EkdConfig class EKD_outils_traduction(object): def __init__(self): # Utile pour définir les dates des mises à jour t = time.localtime() # Attribution de la date et de l'heure exacte de la mise à jour self.tt = str(t[2])+'_'+str(t[1])+'_'+str(t[0])+'_'+str(t[3])+'h'+str(t[4]) # Version de la locale (fr pour langue française) self.langue = locale.getdefaultlocale()[0][:2] # Conditions pour la langue (et textes dans les variables) if self.langue == 'fr': # français entete_1 = u"OUTILS TRADUCTION D'EKD" entete_2 = u"* 1) Créer un fichier .po (locale/ekd.po) à partir de tous les textes contenus dans EKD.\n# --------------\n* 2) Permet de mettre à jour les fichiers .po (lors de traductions ultérieures). Les fichiers mis\nà jour seront enregistrés dans votre répertoire utilisateur et seront de la forme\nekd_symbole_langue_date_heure_maj.pot (par exemple: ekd_en_EN_8_3_2011_20h37_maj.pot).\n# --------------\n* 3) Inverser les champs msgid (regroupant tous les textes originels ; en l'occurrence en français)\net les champs msgstr (regroupant les textes de destination ; en anglais). En fait cette fonction\npermet de proposer les textes d'EKD en anglais. Il s'agit de la création préalable du fichier:\nlocale/creation/ekd_en_EN_invert_msgid_msgstr (attention il est préférable que la traduction\nanglaise soit à jour, c'est à dire le fichier: locale/en_EN/LC_MESSAGES/ekd.pot). Grâce à cette\nfonction vous pourrez, par exemple, demander une traduction d'EKD de l'anglais vers l'allemand.\nLe fichier .po résultant sera à récupérer dans: locale/inverser_msgid_msgstr/creation.\n# --------------\n* 4) Cette fonctionnalité permet de remettre en place la traduction française des textes (champs\nmsgid) tout en récupérant les nouvelles traductions (champs msgstr). Les traductions ainsi\nrécupérées pourront être déposées (en renommant le fichier en ekd.po) et en le déposant dans le\nrépertoire: locale/it_IT/LC_MESSAGES (par exemple pour l'italien).\nATTENTION: pour que cela puisse fonctionner, il faut mettre le fichier PO (une fois traduit) dans\nle répertoire: locale/inverser_msgid_msgstr/update/entree (et tout en ayant mis les fichiers à la\ncorbeille s'il y en avait avant). Le résultat se trouvera dans:\nlocale/inverser_msgid_msgstr/update/sortie_FR.\n# --------------\n* 5) Cette dernière fonctionnalité permet de mettre à jour la traduction (de l'anglais vers une\nautre langue) en prenant en compte les nouveaux textes ajoutés dans EKD.\nATTENTION: pour que cela puisse fonctionner, il faut mettre le fichier PO (une fois traduit) dans\nle répertoire (et tout en ayant mis les fichiers à la corbeille s'il y en avait avant):\nlocale/inverser_msgid_msgstr/update/entree. Le résultat se trouvera dans:\nlocale/inverser_msgid_msgstr/update/sortie_EN.\nUne fois le résultat récupéré, vous pourrez envoyer le fichier POT au traducteur pour qu'il\ncontinue le travail." annonce_crea_po_1er = u"* Tapez 1 pour créer un fichier .po (locale/ekd.po) à partir de tous les textes contenus dans EKD" annonce_maj_po = u"* Tapez 2 pour mettre à jour vos fichiers .po (à faire quand des fichiers .po ont été traduits)" annonce_invert_msgid_msgstr = u"* Tapez 3 pour inverser les champs msgid et msgstr et proposer une version anglaise des textes\ncontenus dans EKD" annonce_maj_fr_autre_msgid_msgstr = u"* Tapez 4 pour remettre les textes en français tout en gardant les correspondances de la\ntraduction qui vient d'être effectuée (à faire à partir de l'inversion des champs msgid et\nmsgstr, comme fait juste au dessus dans le choix 3)" annonce_maj_en_autre_msgid_msgstr = u"* Tapez 5 pour mettre à jour le fichier .pot en prenant en compte les nouveaux textes contenus\ndans EKD. Les champs msgid seront en anglais et les champs msgstr seront dans la langue qui vient\nd'être traduite (attention il est préférable que la traduction anglaise soit à jour)" self.code_langue = u"\nQuel est le code langue du fichier traduit ? (par exemple pour l'allemand ce sera de_DE)\nPour en savoir plus sur les codes langues en question, allez voir ici:\nhttp://www.gnu.org/software/gettext/manual/gettext.html#Language-Codes\nEcrivez maintenant le code langue en question: " annonce_quitter = u"* Tapez 0 sur le clavier pour QUITTER sans rien faire" annonce_choix = u"Quel est votre choix ; 1, 2, 3, 4, 5 ou 0 (?): " self.annonce_crea_fich_1 = u'Création des fichiers .po pour: ' self.maj_fichiers_racine = u"Mise à jour des fichiers:\nlocale/ekd.po\nlocale/ekdDoc.po\n... et ce dans l'arborescence d'EKD." self.maj_txt_ekd = u'La mise à jour a été faite sur le(s) fichier(s): ' self.annonce_crea_fich_2 = u"Création du fichier: %s" self.annonce_crea_future_maj = u"Création pour future mise à jour: %s" self.annonce_inversion_prealabl_msgid_msgstr = u'1) Inversion préalable des champs msgid et msgstr (utilisation du fichier POT)' self.annonce_fich_final_choix_5 = u"2) Fichier final" self.erreur_msgmerge_no_install = u"ERREUR: Il y a un problème !, msgmerge n'est peut-être pas\ninstallé ou la syntaxe de msgmerge a changé." self.erreur_final_choix_4 = u"ERREUR (!!!): Vous devez mettre le fichier PO (.po) après traduction du FRANCAIS vers une AUTRE LANGUE\ndans le répertoire: locale/inverser_msgid_msgstr/update/entree. Le fichier ne semble pas y être, mettez-le\ns'il vous plaît. Le traitement est arrêté !" self.erreur_final_choix_5 = u"ERREUR (!!!): Vous devez mettre le fichier PO (.po) après traduction de l'ANGLAIS vers une AUTRE LANGUE\ndans le répertoire: locale/inverser_msgid_msgstr/update/entree. Le fichier ne semble pas y être, mettez-le\ns'il vous plaît. Le traitement est arrêté !" else: # pour les autres langues ... entete_1 = u"TRANSLATION TOOLS FOR EKD" entete_2 = u"* 1) Create a (locale/ekd.po) file from all the texts in EKD.\n# --------------\n* 2) Turns update .po files (translations in later). Update files will be saved in your home\ndirectory and will be of the form: ekd_symbole_language_date_time_maj.pot\n(eg ekd_en_EN_8_3_2011_20h37_maj.pot).\n# --------------\n* 3) Reverse the msgid (gathering all the original texts, in this french case) and msgstr\nfields (together the texts destination, in english). In fact this function can offer EKD texts\nin english. This is the first creation of the file: locale/creation/ekd_en_EN_invert_msgid_msgstr\n(beware it is preferable that the english translation of EKD is up to date, ie file:\nlocale/en_EN/LC_MESSAGES/ekd.pot). With this function you can, for example, request a translation\nof EKD english to german.\nResult PO file will recover in: locale/inverser_msgid_msgstr/creation.\n# --------------\n* 4) This feature allows you to replace the french translation of texts (msgid fields) while\nrecovering the new translation (msgstr fields). Translations recovered will be deposited (by\nrenaming the file ekd.po) and dropping it in the directory: locale/it_IT/LC_MESSAGES (eg Italian).\nWARNING: for this to work, you must put the PO file (once translated) in directory:\nlocale/inverser_msgid_msgstr/update/entree (and while having to put the files in trash if there\nwere before).\nThe result will be in: locale/inverser_msgid_msgstr/update/sortie_FR.\n# --------------\n* 5) This feature allows you to update the translation (from english into a different language)\nby taking into account the new EKD text added.\nWARNING: for this to work, you must put the PO file (once translated) in directory (and while\nhaving put the files to the trash if there were before):\nlocale/inverser_msgid_msgstr/update/entree.\nThe result will be in: locale/inverser_msgid_msgstr/update/sortie_EN.\nWhen the result retrieved, you can send the POT file to the translator so that it continues to\nwork on." annonce_crea_po_1er = u"* Type 1 to create a .po file (locale/ekd.po) from all the texts in EKD" annonce_maj_po = u"* Type 2 to update your files .po files (to do when .po files have been translated)" annonce_invert_msgid_msgstr = u"* Type 3 fields to reverse msgid and msgstr fields and offer an english version of text\ncontained in EKD" annonce_maj_fr_autre_msgid_msgstr = u"* Type 4 to put the texts in french while keeping the matches translation has been made ​​(this\nis done from the inversion of the msgid and msgstr fields, as is just above the choice 3)" annonce_maj_en_autre_msgid_msgstr = u"* Type 5 to update the .pot file by taking into account the new text contained in EKD. msgid\nfields will be in english and msgstr fields in the language that comes to be translated (note\nit is preferable that the english translation is up to date)" self.code_langue = u"\nWhat is the code language of the translated file ? (eg for German it will de_DE) For more\ninformation on language codes in question, see here:\nhttp://www.gnu.org/software/gettext/manual/gettext.html#Language-Codes\nWrite now the language code in question: " annonce_quitter = u"* Enter 0 on the keyboard to exit without doing anything" annonce_choix = u"What is your choice, 1, 2, 3, 4, 5 or 0 (?): " self.annonce_crea_fich_1 = u'Creating .po files for: ' self.maj_fichiers_racine = u"Updated files:\nlocale/ekd.po\nlocale/ekdDoc.po\n... and that in the tree of EKD." self.maj_txt_ekd = u'The update was made on the file(s): ' self.annonce_crea_fich_2 = u"File creation: %s" self.annonce_crea_future_maj = u"Created for future update: %s" self.annonce_inversion_prealabl_msgid_msgstr = u'1) Previous reverse for msgid and msgstr fields (using the POT file)' self.annonce_fich_final_choix_5 = u"2) Final file" self.erreur_msgmerge_no_install = u"ERROR: There is a problem !, msgmerge is perhaps not install or msgmerge syntax has changed." self.erreur_final_choix_4 = u"ERROR (!!!): you must put the PO file (.po) after translation from FRENCH into ANOTHER\nLANGUAGE in the: locale/inverser_msgid_msgstr/update/entree directory. The file does\nnot appear to be in the directory, put it please. Treatment is stopped !" self.erreur_final_choix_5 = u"ERROR (!!!): you must put the PO file (.po) after translation from ENGLISH into ANOTHER\nLANGUAGE in the: locale/inverser_msgid_msgstr/update/entree directory. The file does\nnot appear to be in the directory, put it please. Treatment is stopped !" # --------------------------------------------------------------------------------- # MENU PRINCIPAL DU SCRIPT # --------------------------------------------------------------------------------- EkdPrint('') EkdPrint(u"================================================================================================") EkdPrint(entete_1) EkdPrint(u"================================================================================================") EkdPrint(entete_2) EkdPrint(u"================================================================================================") EkdPrint(annonce_crea_po_1er) EkdPrint(u"------------------------------------------------------------------------------------------------") EkdPrint(annonce_maj_po) EkdPrint(u"------------------------------------------------------------------------------------------------") EkdPrint(annonce_invert_msgid_msgstr) EkdPrint(u"------------------------------------------------------------------------------------------------") EkdPrint(annonce_maj_fr_autre_msgid_msgstr) EkdPrint(u"------------------------------------------------------------------------------------------------") EkdPrint(annonce_maj_en_autre_msgid_msgstr) EkdPrint(u"------------------------------------------------------------------------------------------------") EkdPrint(annonce_quitter) EkdPrint(u"------------------------------------------------------------------------------------------------") # Appel de la classe EkdInput de moteur_modules_common.EkdCompatiblePython2Et3.py choix = EkdInput(annonce_choix) # choix.valeur défini dans la classe EkdInput dans: # moteur_modules_common.EkdCompatiblePython2Et3.py if choix.valeur == 1: self.creation_fichier_po_lignes_msgstr_vides() elif choix.valeur == 2: self.mise_a_jour_fichiers_po() elif choix.valeur == 3: self.en_EN_invert_msgid_msgstr() elif choix.valeur == 4: # Appel de la classe EkdRawInput de moteur_modules_common.EkdCompatiblePython2Et3.py self.code_langue = EkdRawInput(self.code_langue) self.choix_code_langue = self.code_langue.texte self.maj_EN_FR_msgid_msgstr() elif choix.valeur == 5: # Appel de la classe EkdRawInput de moteur_modules_common.EkdCompatiblePython2Et3.py self.code_langue = EkdRawInput(self.code_langue) self.choix_code_langue = self.code_langue.texte self.maj_EN_autre_msgid_msgstr() elif choix.valeur == 0: sys.exit() EkdPrint(u'') # Pour 1) --> Sert à la création des fichiers PO # Pour 2) --> Sert à la mise à jour des fichiers PO def fichiersModule(self, dossier, ligne): """transforme une ligne __init__ en liste de fichiers (chemin est extension compris) à traduire""" d = 0 # drapeau: le caractère traité est au-delà de '[' ch = '' # chaîne de caractère qui deviendra progressivement un nom du fichier (sans chemin ni '.py') tot = '' # ce que l'on retourne (voir doc initiale) for i in ligne: # i: un caractère de la ligne if i == '[': d = 1 elif i == ']': tot = tot + dossier + '/' + ch + '.py'+ ' ' break elif i in ["'",' ']: pass elif i == ',': tot = tot + dossier + '/' + ch + '.py' + ' ' ch = '' elif d: ch = ch + i return tot # 1) Création des fichiers PO à partir des textes d'EKD # (les champs msgstr seront ici vide). En fait il s'agit # de la création des fichiers locale/ekd.po et ekdDoc.po def creation_fichier_po_lignes_msgstr_vides(self): totalFichiersSource = '' # liste des répertoires contenant les fichiers à traduire listeModulesGui = ['gui_modules_animation', 'gui_modules_common', 'gui_modules_image', 'gui_modules_image/divers', 'gui_modules_image/filtres_images', 'gui_modules_image/masque_alpha_3d','gui_modules_image/transitions', 'gui_modules_music_son', 'gui_modules_lecture', 'gui_modules_lecture/affichage_image', 'gui_modules_sequentiel', 'moteur_modules_common', 'moteur_modules_animation'] # construction de la chaîne de caractères contenant les fichiers à traduire (chemin est extension compris) for i in listeModulesGui: ficOb = open(i+'/__init__.py', 'r') ligne = ficOb.readline() fichiersModulesGui = self.fichiersModule(i, ligne) totalFichiersSource = totalFichiersSource + fichiersModulesGui ficOb.close() totalFichiersSource += ' moteur_modules_animation'+os.sep+'ffmpeg2theora.py' totalFichiersSource += ' moteur_modules_animation'+os.sep+'ffmpeg_avchd.py' totalFichiersSource += ' moteur_modules_animation'+os.sep+'ffmpeg_concat_audio.py' totalFichiersSource += ' moteur_modules_animation'+os.sep+'ffmpeg_concat_audio.py' totalFichiersSource += ' moteur_modules_animation'+os.sep+'ffmpeg.py' totalFichiersSource += ' moteur_modules_animation'+os.sep+'mencoder_concat_video.py' totalFichiersSource += ' moteur_modules_animation'+os.sep+'mencoder.py' totalFichiersSource += ' moteur_modules_animation'+os.sep+'mplayer.py' totalFichiersSource += ' videoporama'+os.sep+'videoporama_main.py' totalFichiersSource += ' gui_modules_music_son'+os.sep+'multiplesound.py' totalFichiersSource += ' gui_modules_music_son'+os.sep+'music_son_base_sox.py' totalFichiersSource += ' gui_modules_music_son'+os.sep+'music_son_decoupe.py' totalFichiersSource += ' gui_modules_music_son'+os.sep+'music_son_encodage.py' totalFichiersSource += ' gui_modules_music_son'+os.sep+'music_son_join_multiplefile.py' totalFichiersSource += ' gui_modules_music_son'+os.sep+'music_son_normalize.py' totalFichiersSource += ' ekd_gui.py' EkdPrint('') EkdPrint(self.annonce_crea_fich_1) EkdPrint(totalFichiersSource) # test EkdPrint('') # commande de création des fichier-sources de traduction *.pot (un pour l'interface de base et l'autre pour l'aide) os.system("xgettext --no-wrap -o locale/ekd.po " + totalFichiersSource) os.system("xgettext --no-wrap -k --keyword='tr' -o locale/ekdDoc.po " + totalFichiersSource) EkdPrint(self.maj_fichiers_racine) EkdPrint('') # 2) Fonction pour la mise à jour des fichiers .po def mise_a_jour_fichiers_po(self): ###################################################################################### # Fonction pour mise à jour des fichiers *.pot dans le répertoire de l'utilisateur # -------------------------------------------------------------------------------- # Voilà comment procéder: # ----------------------- # # Créer les fichiers (lors de la toute première traduction): # ---------------------------------------------------------- # 1) Si les fichiers locale/ekd.po et locale/ekdDoc.po n'existent pas, il # faut les créer par la commande: python ekd_outils_traductions.py # (--> en fait par le script que vous êtes en train d'utiliser --> choisir: # * Tapez 1 pour créer un fichier .po (locale/ekd.po) à partir de tous # les textes contenus dans EKD ... dans le menu). # 2) Faire la traduction des fichiers ekd.po et ekdDoc.po dans PoEdit et # les sauvegarder dans le répertoire locale/es_ES/LC_MESSAGES (dans le cas de # la traduction espagnole) sous le nom ekd.pot et ekdDoc.pot # # Mettre à jour les fichiers (lors de traductions ultérieures): # ------------------------------------------------------------- # # 1) Ouvrez une console dans le répertoire où se trouve ce script # ekd_outils_traductions.py (dans la console: cd /chemin/vers/le/répertoire/d'ekd) # et mettez à jour les fichiers .po par la commande: # python ekd_outils_traductions.py (--> en fait par le script que vous êtes en # train d'utiliser --> choisir: * Tapez 2 pour mettre à jour vos fichiers .po # (à faire quand des fichiers .po ont été traduits). # ==> Les fichiers .pot de mise à jour seront crées dans votre /home/utilisateur # et porteront les noms: # ekd_symbole_langue_maj_mois_année_heure.pot ... et ... # ekdDoc_symbole_langue_mois_année_heure.pot # (par exemple ekd_es_ES_maj_22_8_2011_2h1.pot et ekdDoc_es_ES_maj_22_8_2011_2h1.pot) # # 2) Mettez en téléchargement quelque part ces fichiers pour les développeurs du # projet ... de votre côté passez-les à la moulinette dans PoEdit pour obtenir les # fichiers ekd.po, ekd.pot et ekd.mo, puis ekdDoc.po, ekdDoc.pot et ekdDoc.mo, (en # les ayant renommés) puis copiez-les (toujours dans le cas d'une traduction en # espagnol) dans locale/es_ES/LC_MESSAGES avec un système en espagnol ... et vérifier # que tout s'affiche correctement ... (gardez tout de même une copie de sauvegarde # de vos fichiers ekd.pot et ekdDoc.pot quelque part [fruit d'une traduction préalable # ... histoire de ne pas perdre le travail déjà effectué] , avant de faire une # quelconque mise à jour de ces deux fichiers !!!). ###################################################################################### # Création du répertoire temporaire pour copie des fichiers .pot # les fichiers seront ensuite renommés et copiés ds le rep utilisateur ####### Changé le 15/11/09 : Utilisation de EkdConfig ################################ ''' Erreur dans la récupération de la section : general Erreur dans la récupération de la propriété : temporaire dans la section : general Traceback (most recent call last): File "mise_a_jour_gettext.py", line 53, in repTampon = EkdConfig.getTempDir()+os.sep+'tampon'+os.sep+'mise_a_jour_gettext'+os.sep File "/home/angelo/ekd_toto/moteur_modules_common/EkdConfig.py", line 713, in getTempDir tmpBase = EkdConfig.get("general", "temporaire") File "/home/angelo/ekd_toto/moteur_modules_common/EkdConfig.py", line 622, in get raise e AttributeError: 'NoneType' object has no attribute 'getElementsByTagName' ''' #repTampon = EkdConfig.getTempDir()+os.sep+'tampon'+os.sep+'mise_a_jour_gettext'+os.sep repTampon = os.sep+'tmp'+os.sep+'ekd_mise_a_jour_gettext'+os.sep ###################################################################################### if os.path.isdir(repTampon) is False: os.makedirs(repTampon) # Au cas où le répertoire existait déjà et qu'il n'était pas vide # -> purge (simple précausion) for toutRepCompo in glob.glob(repTampon+'*.*'): if len(toutRepCompo)>0: os.remove(toutRepCompo) # Liste sélectionnant les répertoires (donc les symbole langue) de chaque langue gérée listeRepLocale = [os.path.basename(parcLoc) for parcLoc in glob.glob('locale'+os.sep+'*') if '_' in parcLoc and len(parcLoc) == 12] listeRepLocale.sort() # Liste recherchant particulièrement les répertoires en_EN, es_ES, de_DE et nl_NL (parmi # tous les autres) car maintenant au 23/01/12 il y en a plein d'autres (toutes les nationalités # et communautés) dont la langue officielle est l'anglais, l'espagnol, l'allemand ou le néerlandais listeLanguePrincipale = [langP for langP in listeRepLocale if langP == 'es_ES' or langP == 'en_EN' or langP == 'de_DE' or langP == 'nl_NL' or langP == 'pt_PT'] # Liste sélectionnant les fichiers .pot des répertoires de chaque langue gérée listeFichPot = [parcPot for parcRepLoc in listeLanguePrincipale for parcPot in glob.glob('locale'+os.sep+parcRepLoc+os.sep+'LC_MESSAGES'+os.sep+'*.*') if parcPot.endswith('pot')] listeFichPot.sort() # Liste de listes comportant le chemin + le nom de fichier et en second élément l'extension, # donne par exemple: [['locale/en_EN/LC_MESSAGES/ekd', 'pot'], ..., # ['locale/es_ES/LC_MESSAGES/ekdDoc', 'pot']] lChemNFichExt = [string.split(listeFichPot[parSplit], '.') for parSplit in range(len(listeFichPot))] # Récupération du chemin + le nom de fichier (sans les extensions) des fichiers .pot, par # exemple donne: ['locale/en_EN/LC_MESSAGES/ekd', ..., 'locale/es_ES/LC_MESSAGES/ekdDoc'] chemNomFich = [lChemNFichExt[parcNFE][0] for parcNFE in range(len(lChemNFichExt))] # Multiplication par 2 (pour ekd.pot et ekdDoc.pot) des symboles langues # pour pouvoir réaliser la mise en relation juste en dessous, donne par # exemple: ['en_EN', 'en_EN', 'en_US', 'en_US', 'es_ES', 'es_ES'] listeLanguePrincipale_2 = listeLanguePrincipale*2 listeLanguePrincipale_2.sort() # Mise en relation entre le chemin et le titre de chaque fichier.pot et le symbole langue, ça # donne par exemple la liste: # [('locale/en_EN/LC_MESSAGES/ekd', 'en_EN'), ..., ('locale/es_ES/LC_MESSAGES/ekdDoc', 'es_ES')] unionPotEtLangue = zip(chemNomFich, listeLanguePrincipale_2) # Mise en relation du symbole langue dans le titre et copie des fichiers dans le # répertoire temporaire (ça donne par exemple: ekdDoc_en_EN.pot, ..., ekd_es_ES.pot) for parc_copie_tampon in unionPotEtLangue: if 'ekd' in parc_copie_tampon[0]: shutil.copy(os.getcwd()+os.sep+parc_copie_tampon[0]+'.pot', repTampon+os.sep+os.path.basename(parc_copie_tampon[0])+'_'+parc_copie_tampon[1]+'.pot') if 'ekdDoc' in parc_copie_tampon[0]: shutil.copy(os.getcwd()+os.sep+parc_copie_tampon[0]+'.pot', repTampon+os.sep+os.path.basename(parc_copie_tampon[0])+'_'+parc_copie_tampon[1]+'.pot') # Liste des répertoires contenant les fichiers à traduire listeModulesGui = ['gui_modules_animation', 'gui_modules_common', 'gui_modules_image', 'gui_modules_image/divers', 'gui_modules_image/filtres_images', 'gui_modules_image/masque_alpha_3d', 'gui_modules_image/transitions', 'gui_modules_music_son','gui_modules_lecture', 'gui_modules_lecture/affichage_image', 'gui_modules_sequentiel', 'moteur_modules_common', 'moteur_modules_animation'] surlignageP = '-'*48 surlignageS = '-'*42 # Collecte des fichiers de la liste temporaire listeTemp = glob.glob(repTampon+'*.*') # Construction de la chaîne de caractères contenant les mises à jour (chemin est extension compris) for i in listeModulesGui: ficOb = open(i + '/__init__.py', 'r') ligne = ficOb.readline() fichiersModulesGui = self.fichiersModule(i, ligne) EkdPrint('') EkdPrint(self.maj_txt_ekd) EkdPrint(surlignageP) EkdPrint(fichiersModulesGui + '\n') EkdPrint('') # Mise à jour des fichiers .pot pour les scripts autres que le script principal for collFichTemp in listeTemp: # Si on est bien dans la collecte de ekd et pas ekdDoc (ekd comprend bien # 13 caractères par exemple ekd_en_EN.pot) ... if len(os.path.basename(collFichTemp)) == 13 and 'ekd' in collFichTemp: os.system('xgettext --keyword=__ --keyword=_e --default-domain=ekd --language=python ' + fichiersModulesGui + ' --join-existing --output='+collFichTemp) ''' # ----- NE FONCTIONNE PAS ---------------------------- if len(os.path.basename(collFichTemp)) == 16 and 'ekdDoc' in collFichTemp: os.system('xgettext --keyword=tr --keyword=e --default-domain=ekdDoc --language=python ' + os.getcwd()+os.sep+fichiersModulesGui + ' --join-existing --output='+collFichTemp) ''' # Traitement des fichiers présents dans le rep. moteur_modules_animation ===================== # Collecte du chemin + fichiers présents dans le rep. moteur_modules_animation listeFichRepMoteurTous = glob.glob('moteur_modules_animation'+os.sep+'*.*') # Sélection des fichiers .py uniquement (tous les fichiers .py sauf le fichier __init__.py) listeFichRepMoteurPy = [parcExtPy for parcExtPy in listeFichRepMoteurTous if parcExtPy.endswith('py') and 'moteur_modules_animation'+os.sep+'__init__.py' != parcExtPy] # Construction de la chaîne de caractères contenant les mises à jour # pour les fichiers contenus dans le rep. moteur_modules_animation # ------------------------------------------------------------------- # La mise à jour se fait ici sans passer par le fichier __init__.py # présent dans le rep. moteur_modules_animation car le fichier en # question contient: __all__ = ['mencoder', 'mplayer', 'ffmpeg', # 'ffmpeg2theora', 'mencoder_concat_video', 'ffmpeg_avchd', 'ffmpeg_concat_audio'] # ------------------------------------------------------------------- for parcFichPy in listeFichRepMoteurPy: EkdPrint('') EkdPrint(self.maj_txt_ekd) EkdPrint(surlignageP) EkdPrint(parcFichPy) EkdPrint('') # Mise à jour des fichiers .pot pour les scripts présents dans le rep. moteur_modules_animation for collFichTemp_2 in listeTemp: # Si on est bien dans la collecte de ekd et pas ekdDoc (ekd comprend bien # 13 caractères par exemple ekd_en_EN.pot) ... if len(os.path.basename(collFichTemp_2)) == 13 and 'ekd' in collFichTemp_2: os.system('xgettext --keyword=__ --keyword=_e --default-domain=ekd --language=python ' + parcFichPy + ' --join-existing --output='+collFichTemp_2) # Traitement de videoporama_main.py dans le rep. videoporama =========== # # Collecte du chemin + fichier fichVideoporamaMain = 'videoporama'+os.sep+'videoporama_main.py' # Mise à jour pour le script videoporama/videoporama_main.py for collVideoporamaTemp in listeTemp: # Si on est bien dans la collecte de ekd et pas ekdDoc (ekd comprend bien # 13 caractères par exemple ekd_en_EN.pot) ... if len(os.path.basename(collVideoporamaTemp)) == 13 and 'ekd' in collVideoporamaTemp: EkdPrint('') EkdPrint(self.maj_txt_ekd) EkdPrint(surlignageS) EkdPrint(fichVideoporamaMain) EkdPrint('') os.system('xgettext --keyword=__ --keyword=_e --default-domain=ekd --language=python ' + fichVideoporamaMain + ' --join-existing --output='+collVideoporamaTemp) # Traitement des fichiers présents dans le rep. gui_modules_music_son == # # Collecte du chemin + fichiers présents dans le rep. gui_modules_music_son listeFichRepMS = glob.glob('gui_modules_music_son'+os.sep+'*.*') # Sélection des fichiers .py uniquement (tous les fichiers .py sauf le fichier __init__.py) listeFichRepMusicSon = [parcExtPy for parcExtPy in listeFichRepMS if parcExtPy.endswith('py') and 'gui_modules_music_son'+os.sep+'__init__.py' != parcExtPy] # Construction de la chaîne de caractères contenant les mises à jour # pour les fichiers contenus dans le rep. gui_modules_music_son # ------------------------------------------------------------------- # La mise à jour se fait ici sans passer par le fichier __init__.py # présent dans le rep. moteur_modules_animation car le fichier en # question contient: __all__=['multiplesound.py', 'music_son_base_sox.py', # 'music_son_decoupe.py', 'music_son_encodage.py', 'music_son_join_multiplefile.py', # 'music_son_normalize.py'] # ------------------------------------------------------------------- for parcFichPyMusicSon in listeFichRepMusicSon: EkdPrint('') EkdPrint(self.maj_txt_ekd) EkdPrint(surlignageP) EkdPrint(parcFichPyMusicSon) EkdPrint('') # Mise à jour des fichiers .pot pour les scripts présents dans le rep. gui_modules_music_son for collFichTemp_3 in listeTemp: # Si on est bien dans la collecte de ekd et pas ekdDoc (ekd comprend bien # 13 caractères par exemple ekd_en_EN.pot) ... if len(os.path.basename(collFichTemp_3)) == 13 and 'ekd' in collFichTemp_3: os.system('xgettext --keyword=__ --keyword=_e --default-domain=ekd --language=python ' + parcFichPy + ' --join-existing --output='+collFichTemp_2) # Mise à jour pour le script principal ekd_gui.py for collEkdGuiTemp in listeTemp: # Si on est bien dans la collecte de ekd et pas ekdDoc (ekd comprend bien # 13 caractères par exemple ekd_en_EN.pot) ... if len(os.path.basename(collEkdGuiTemp)) == 13 and 'ekd' in collEkdGuiTemp: EkdPrint('') EkdPrint(self.maj_txt_ekd) EkdPrint(surlignageS) EkdPrint('ekd_gui.py') EkdPrint('') os.system('xgettext --keyword=__ --keyword=_e --default-domain=ekd --language=python ekd_gui.py' + ' --join-existing --output='+collEkdGuiTemp) ficOb.close() # Mise à jour des fichiers avec msgmerge (permet d'enlever les anciens # textes inutilisés et permet en même temps d'alléger les fichiers POT) try: for fichPOT in listeTemp: spl1 = fichPOT.split(os.sep) spl2 = spl1[len(spl1)-1] f, e = os.path.splitext(fichPOT) if 'ekd_' in spl2: # La syntaxe ... > ... peut aussi être utilisée à la place de ... -o ... os.system('msgmerge '+fichPOT+' '+os.getcwd()+os.sep+'locale'+os.sep+'ekd.po -o '+os.sep+'tmp'+os.sep+'ekd_mise_a_jour_gettext'+os.sep+os.path.basename(f)+'_maj.pot') elif 'ekdDoc' in spl2: os.system('msgmerge '+fichPOT+' '+os.getcwd()+os.sep+'locale'+os.sep+'ekdDoc.po -o '+os.sep+'tmp'+os.sep+'ekd_mise_a_jour_gettext'+os.sep+os.path.basename(f)+'_maj.pot') except: #EkdPrint(u"ERREUR: Il y a un problème !, msgmerge n'est peut-être pas\ninstallé ou la syntaxe de msgmerge a changé.") EkdPrint(self.erreur_msgmerge_no_install) EkdPrint('') # Renommage des fichiers .pot (par exemple: ekd_en_EN_maj_22_8_2011_2h1.pot, # et copie des fichiers dans le répertoire de l'utilisateur collectePOT = glob.glob(repTampon+os.sep+'*.pot') for collRenom in collectePOT: sp1 = collRenom.split('_') sp2 = sp1[len(sp1)-1] if 'maj.pot' in sp2 or 'gettext/ekdDoc'in sp2: fich, ext = os.path.splitext(collRenom) shutil.copy(collRenom, os.path.expanduser('~')+os.sep+os.path.basename(fich)+'_'+self.tt+'.pot') EkdPrint(self.annonce_crea_fich_2 % os.path.expanduser('~')+os.sep+os.path.basename(fich)+'_'+self.tt+'.pot') EkdPrint('') # ---------------------------------------------------------------- # CHAMPS msgid EN ANGLAIS, CHAMPS msgstr VIDES # ---------------------------------------------------------------- # Fonction permettant de proposer (création préalable) les textes # d'EKD en anglais (à partir de locale/en_EN/LC_MESSAGES/ekd.po) # et ce afin qu'ils puissent être traduits dans d'autres langues def en_EN_invert_msgid_msgstr(self): # Fichiers entrée, sortie et messages (pour les futures mises à jour) fichier_entree = 'locale'+os.sep+'en_EN'+os.sep+'LC_MESSAGES'+os.sep+'ekd.pot' fichier_sortie_po = 'locale'+os.sep+'inverser_msgid_msgstr'+os.sep+'creation'+os.sep+'ekd_en_EN_invert_msgid_msgstr_INITIAL_'+self.tt+'.po' fichier_sortie_pot = 'locale'+os.sep+'inverser_msgid_msgstr'+os.sep+'creation'+os.sep+'ekd_en_EN_invert_msgid_msgstr_INITIAL_'+self.tt+'.pot' fichier_messages = 'locale'+os.sep+'inverser_msgid_msgstr'+os.sep+'messages'+os.sep+'ekd_en_EN_messages_maj_'+self.tt+'.txt' # Détection des fichiers présents dans locale/inverser_msgid_msgstr/creation detect_fich_po = glob.glob('locale'+os.sep+'inverser_msgid_msgstr'+os.sep+'creation'+os.sep+'*.po') # Elimination du fichier po précédemment crée (s'il existe) for parcfile_po in detect_fich_po: os.remove(parcfile_po) # detect_fich_pot = glob.glob('locale'+os.sep+'inverser_msgid_msgstr'+os.sep+'creation'+os.sep+'*.pot') # Elimination du fichier pot précédemment crée (s'il existe) for parcfile_pot in detect_fich_pot: os.remove(parcfile_pot) # ========================================================================= # # Il ne faudra pas oublier de purger régulièrement les fichiers # contenus dans le répertoire: locale/inverser_msgid_msgstr/messages # car eux ils ne sont pas purgés (et risquent de s'amasser) # ========================================================================= # # Ouverture fich = open(fichier_entree, 'r') # Importation des données dans une liste liste1 = fich.readlines() # Fermeture fich.close() # Récup des données autres que celles qui commencent par msgid, msgstr et #~ (c'est # à dire récup des entêtes et récup des commentaires). Les lignes avec #~ sont des # lignes résiduelles (qui poseront des probs avec par exemple PoEdit et msgmerge) liste_autre_msgid_msgstr = [i for i in enumerate(liste1) if i[1][0:5]!='msgid' and i[1][0:6]!='msgstr' and i[1][0:2]!='#~'] # Récup des textes de la langue originelle liste_msgid = [i for i in enumerate(liste1) if i[1][0:5]=='msgid'] # Récup des textes après traduction liste_msgstr = [i for i in enumerate(liste1) if i[1][0:6]=='msgstr'] # Concaténation des 2 listes juste au dessus liste_zip = zip(liste_msgid, liste_msgstr) # Liste pour inverser les champ msgid (langue d'origine: ici le français) et le champ msgstr # (langue de destination: ici l'anglais). Le champ msgid va maintenant accueillir la traduction # anglaise et le champ msgstr va rester vide. Cette liste va être de la forme (exemple): # # [..., ((21, 'msgid "Title"\n'), (22, 'msgstr ""\n')), ((34, 'msgid "Source video(s)"\n'), # (35, 'msgstr ""\n')), ((57, 'msgid "Settings"\n'), (58, 'msgstr ""\n')), ((66, 'msgid "Setting"\n'), # (67, 'msgstr ""\n')), ((71, 'msgid "Converting a video into images"\n'), (72, 'msgstr ""\n')), # ((76, 'msgid "Overview"\n'), (77, 'msgstr ""\n')), ...] # # Pour tester les correspondances: ((e1[0][0], 'msgid'+e1[0][1].replace(e1[0][1], e1[1][1])[6:]), (e1[1][0], 'msgstr'+e1[0][1][5:])) # listeEn = [((e1[0][0], 'msgid'+e1[0][1].replace(e1[0][1], e1[1][1])[6:]), (e1[1][0], 'msgstr ""\n')) for e1 in liste_zip if e1[1][0] == e1[0][0]+1 and 'msgid'+e1[1][1][6:] != 'msgid ""\n'] # Liste pour conserver les correspondances initiales (lignes msgid en français et lignes msgstr # en anglais. Cette liste va être de la forme (exemple): # # [..., ((21, 'msgid "Titre"\n'), (22, 'msgstr "Title"\n')), ((34, 'msgid "Video(s) source"\n'), # (35, 'msgstr "Source video(s)"\n')), ((57, 'msgid "R\xc3\xa9glages"\n'), (58, 'msgstr "Settings"\n')), # ((66, 'msgid "R\xc3\xa9glage"\n'), (67, 'msgstr "Setting"\n')), ...] # listeFr = [((e1[0][0], e1[0][1]), (e1[1][0], e1[1][1])) for e1 in liste_zip if e1[1][0] == e1[0][0]+1 and e1[1][1] != 'msgstr ""\n'] # ------------------------------------------------------------------------- # # Traitement pour les textes en anglais dans les champs msgid # ------------------------------------------------------------------------- # # On retire de la liste la ligne msgid ainsi que la ligne msgstr si # celles-ci sont vides for p1 in listeEn: if p1[0][1] == 'msgid ""\n': listeEn.remove(p1) # On enlève une dimension pour avoir une liste de cette forme: # [..., (6192, 'msgid "Dependencies of EKD checking"\n'), (6193, 'msgstr ""\n')] listePreFinalEn = [n2 for n1 in listeEn for n2 in n1] # Liste finale listeFinalEn = [] for w in liste_autre_msgid_msgstr: listeFinalEn.append(w) # On replace une ligne msgid vide pour l'entête listeFinalEn.insert(0, (5, 'msgid ""\n')) # Ecrit msgstr "" juste en dessous de msgid "" listeFinalEn.insert(0, (6, 'msgstr ""\n')) # Mise en place de toutes les données dans la liste finale listeFinalEn = listeFinalEn + listePreFinalEn # Mise en ordre de la liste finale listeFinalEn.sort() # ------------------------------------------------------------------------- # # Traitement pour les textes en français dans les champs msgid. En fait ce # traitement est juste destiné au répertoire: /locale/inverser_msgid_msgstr/messages # ... et ce pour une future mise à jour après traduction de l'anglais vers # l'allemand par exemple # ------------------------------------------------------------------------- # # On retire de la liste la ligne msgid ainsi que la ligne msgstr si # celles-ci sont vides for p1 in listeFr: if p1[0][1] == 'msgid ""\n': listeFr.remove(p1) # On enlève une dimension pour avoir une liste de cette forme: # [..., (6192, 'msgid "Vérification des dépendances de EKD"\n'), (6193, 'msgstr ""\n')] listePreFinalFr = [n2 for n1 in listeFr for n2 in n1] # Liste finale listeFinalFr = [] for w in liste_autre_msgid_msgstr: listeFinalFr.append(w) # On replace une ligne msgid vide pour l'entête listeFinalFr.insert(0, (5, 'msgid ""\n')) # Ecrit msgstr "" juste en dessous de msgid "" listeFinalFr.insert(0, (6, 'msgstr ""\n')) # Mise en place de toutes les données dans la liste finale listeFinalFr = listeFinalFr + listePreFinalFr # Mise en ordre de la liste finale listeFinalFr.sort() # Ouverture et ecriture du fichier PO en sortie (dans: # /locale/inverser_msgid_msgstr/creation --> les champs # msgid sont en anlais et les champs msgstr sont vides) ecrireEn_1 = open(fichier_sortie_po, 'w') for ecr1, ecr2 in listeFinalEn: ecrireEn_1.write(ecr2) # Ouverture et ecriture du fichier POT en sortie (dans: # /locale/inverser_msgid_msgstr/creation --> les champs # msgid sont en anlais et les champs msgstr sont vides) ecrireEn_2 = open(fichier_sortie_pot, 'w') for ecr1, ecr2 in listeFinalEn: ecrireEn_2.write(ecr2) # Ouverture et ecriture du fichier TXT en sortie (dans: # /locale/inverser_msgid_msgstr/messages --> les champs # msgid sont en français avec leur correspondance en # anglais pour les champs msgstr) ecrireEn_3 = open(fichier_messages, 'w') for ecr1, ecr2 in listeFinalFr: ecrireEn_3.write(ecr2) # Fermeture ecrireEn_1.close() ecrireEn_2.close() EkdPrint('') EkdPrint(self.annonce_crea_fich_2 % fichier_sortie_po) EkdPrint(self.annonce_crea_fich_2 % fichier_sortie_pot) EkdPrint(self.annonce_crea_future_maj % fichier_messages) EkdPrint('') # ---------------------------------------------------------------- # CHAMPS msgid EN FRANCAIS, CHAMPS msgstr DANS LA LANGUE TRADUITE # (APRES TRAITEMENT --> MISE A JOUR) # ---------------------------------------------------------------- # Fonction pour mettre à jour le fichiers PO après traduction # de l'anglais vers une autre langue. En fait dans cette fonction # le texte initial en français prend place dans les champs msgid # et les champs msgstr seront occupés par les traductions (dans la # langue traduite) def maj_EN_FR_msgid_msgstr(self): # Fichier entrée en français (lignes msgid en français) # Il s'agit d'un fichier txt avec juste les lignes msgid et msgstr reprEntreeEnFrTxt = 'locale'+os.sep+'inverser_msgid_msgstr'+os.sep+'messages'+os.sep # Fichiers entrée en anglais (lignes msgid en anglais et lignes msgstr dans la langue # qui vient d'être traduite) rep_maj_entree = 'locale'+os.sep+'inverser_msgid_msgstr'+os.sep+'update'+os.sep+'entree'+os.sep # Nom du fichier de sortie fichier_maj_sortie = 'locale'+os.sep+'inverser_msgid_msgstr'+os.sep+'update'+os.sep+'sortie_FR'+os.sep+'ekd_fr_FR_to_'+self.choix_code_langue+'_'+self.tt+'.po' # Récup du rep de travail listeEntreeEnFrTxt = glob.glob(reprEntreeEnFrTxt+'*.txt') # Statistique pour savoir quel est le dernier fichier crée et ce afin de # travailler avec un fichier à jour. Pour connaître la dernière modif du # fichier, ce sera: os.stat(fichier).st_mtime) liste_date_crea = [] for parcEnFrTxt in listeEntreeEnFrTxt: dataFrTxt = os.stat(parcEnFrTxt).st_ctime liste_date_crea.append((dataFrTxt, parcEnFrTxt)) liste_date_crea.sort() # Dernier fichier crée fichDernierEntreeEnFrTxt = liste_date_crea[len(liste_date_crea)-1][1] # Récup du rep de travail listeMajEntree = glob.glob(rep_maj_entree+'*.po') # Ouverture fichEntreeEnFrTxt = open(fichDernierEntreeEnFrTxt, 'r') # Importation des données dans une liste liste1 = fichEntreeEnFrTxt.readlines() # Fermeture fichEntreeEnFrTxt.close() try: # Ouverture ficMajEntree = open(listeMajEntree[0], 'r') # Importation des données dans une liste liste2 = ficMajEntree.readlines() # Fermeture ficMajEntree.close() # Récup des données autres que celles qui commencent par msgid, msgstr et #~ (c'est # à dire récup des entêtes et récup des commentaires). Les lignes avec #~ sont des # lignes résiduelles (qui poseront des probs avec par exemple PoEdit et msgmerge) liste_autre_msgid_msgstr = [i for i in enumerate(liste1) if i[1][0:5]!='msgid' and i[1][0:6]!='msgstr' and i[1][0:2]!='#~'] # Récup des textes contenus dans le champ msgid pour le fichier d'entrée listeMsgidEntreeEnFrTxt = [i for i in enumerate(liste1) if i[1][0:5]=='msgid'] # Récup des textes contenus dans le champ msgstr pour le fichier d'entrée listeMsgstrEntreeEnFrTxt = [i for i in enumerate(liste1) if i[1][0:6]=='msgstr'] # Concaténation des 2 listes juste au dessus listeZipEntreeEnFrTxt = zip(listeMsgidEntreeEnFrTxt, listeMsgstrEntreeEnFrTxt) # Récup des textes contenus dans le champs msgid pour le fichier de mise à jour listeMsgidEntreeMAJ = [i for i in enumerate(liste2) if i[1][0:5]=='msgid'] # Récup des textes contenus dans le champs msgstr pour le fichier de mise à jour listeMsgstrEntreeMAJ = [i for i in enumerate(liste2) if i[1][0:6]=='msgstr'] # Concaténation des 2 listes juste au dessus listeZipEntreeEnMAJ = zip(listeMsgidEntreeMAJ, listeMsgstrEntreeMAJ) # Comprehension liste pour rétablir les champs msgid aux textes initiaux en français, # quand à eux les champs msgstr sont remplis par les traductions qui viennent d'être # effectuées (dans la langue traduite) # Ok --> ((e1[0][0], e1[0][1]), (e1[0][0]+1, e2[1][1])). Pour tests --> ((e1[0][0], e1[0][1]), (e1[0][0]+1, e1[1][1])) #listeENetAutre = [((e1[0][0], unicode(e1[0][1], sys.stdin.encoding)), (e1[0][0]+1, unicode(e2[1][1], sys.stdin.encoding))) for e1 in listeZipEntreeEnFrTxt for e2 in listeZipEntreeEnMAJ if e2[0][1][5:] == e1[1][1][6:]] listeENetAutre = [((e1[0][0], e1[0][1]), (e1[0][0]+1, e2[1][1])) for e1 in listeZipEntreeEnFrTxt for e2 in listeZipEntreeEnMAJ if e2[0][1][5:] == e1[1][1][6:]] # On enlève une dimension pour avoir une liste de cette forme (et on réencode en unicode): # [..., (6192, u'msgid "Vérification des dépendances de EKD"\n'), (6193, u'msgstr ""\n')] #listePreFinale = [(n2[0], unicode(n2[1])) for n1 in listeENetAutre for n2 in n1] listePreFinale = [n2 for n1 in listeENetAutre for n2 in n1] # Liste finale listeFinale = [] #for w in liste_autre_msgid_msgstr: listeFinale.append((w[0], unicode(w[1], sys.stdin.encoding))) for w in liste_autre_msgid_msgstr: listeFinale.append(w) # Mise en place de toutes les données dans la liste finale listeFinale = listeFinale + listePreFinale # Mise en ordre de la liste finale listeFinale.sort() # Ecriture ecrire = open(fichier_maj_sortie, 'w') #for ecr1, ecr2 in listeFinale: ecrire.write(ecr2.encode('utf-8')) for ecr1, ecr2 in listeFinale: ecrire.write(ecr2) ecrire.close() # Le fichier PO produit ne s'ouvrait pas correctement dans PoEdit car # l'encodage n'était pas bon. Grâce à la commande msgfilter le fichier # PO est réencodé en latin (latin-1 ?) et les accent sont maintenant # visibles dans PoEdit os.system('msgfilter -i '+fichier_maj_sortie+' recode-sr-latin') EkdPrint('') EkdPrint(self.annonce_crea_fich_2 % fichier_maj_sortie) except: EkdPrint(u"") EkdPrint(u"# ----------------------------------------------------------------------- #") EkdPrint(self.erreur_final_choix_4) EkdPrint(u"# ----------------------------------------------------------------------- #") # ---------------------------------------------------------------- # CHAMPS msgid EN ANGLAIS, CHAMPS msgstr DANS LA LANGUE TRADUITE # OU VIDES (POUR LES PARTIES NON TRADUITES) --> MISE A JOUR APRES # REGENERATION DE: locale/en_EN/LC_MESSAGES/ekd.po # ---------------------------------------------------------------- # Fonction pour mettre à jour la traduction (de l'anglais vers une # autre langue) en prenant en compte les nouveaux textes ajoutés # dans EKD (les champs msgid sont en anglais et les champs msgstr # sont dans la langue qui vient d'être traduite) def maj_EN_autre_msgid_msgstr(self): EkdPrint('') EkdPrint(self.annonce_inversion_prealabl_msgid_msgstr) # Appel de la fonction pour inversion des champs msgid et msgstr self.en_EN_invert_msgid_msgstr() # Fichier entrée en anglais (lignes msgid en anglais). Il s'agit du fichier # POT pour mise à jour contenu dans locale/inverser_msgid_msgstr/creation reprEntreeFichPot = 'locale'+os.sep+'inverser_msgid_msgstr'+os.sep+'creation'+os.sep # Fichier entree en anglais (lignes msgid en anglais et lignes msgstr dans la langue # qui vient d'être traduite ou vides si non traduit) rep_maj_entree = 'locale'+os.sep+'inverser_msgid_msgstr'+os.sep+'update'+os.sep+'entree'+os.sep # Nom du fichier de sortie fichier_maj_sortie = 'locale'+os.sep+'inverser_msgid_msgstr'+os.sep+'update'+os.sep+'sortie_EN'+os.sep+'ekd_en_EN_to_'+self.choix_code_langue+'_UPDATE_'+self.tt+'.pot' # Récup du rep de travail listeEntreeFichPot = glob.glob(reprEntreeFichPot+'*.pot') # Récup du rep de travail listeEntreeFichPo = glob.glob(rep_maj_entree+'*.po') # Statistique pour savoir quel est le dernier fichier crée et ce afin de # travailler avec un fichier à jour. Pour connaître la dernière modif du # fichier, ce sera: os.stat(fichier).st_mtime) liste_date_crea = [] for parcFichPo in listeEntreeFichPo: dataFichPo = os.stat(parcFichPo).st_ctime liste_date_crea.append((dataFichPo, parcFichPo)) liste_date_crea.sort() try: # Dernier fichier crée fichDernierEntreeFichPo = liste_date_crea[len(liste_date_crea)-1][1] # Mise à jour, rajout os.system('msgmerge '+fichDernierEntreeFichPo+' '+listeEntreeFichPot[0]+' -o '+os.getcwd()+os.sep+fichier_maj_sortie) EkdPrint('') EkdPrint(self.annonce_fich_final_choix_5) EkdPrint('') EkdPrint(self.annonce_crea_fich_2 % fichier_maj_sortie) except: EkdPrint(u"") EkdPrint(u"# ----------------------------------------------------------------------- #") EkdPrint(self.erreur_final_choix_5) EkdPrint(u"# ----------------------------------------------------------------------- #") # Appel de la classe main = EKD_outils_traduction()