Index: gc_lang/fr/dictionnaire/genfrdic.py ================================================================== --- gc_lang/fr/dictionnaire/genfrdic.py +++ gc_lang/fr/dictionnaire/genfrdic.py @@ -19,10 +19,11 @@ from distutils import file_util from string import Template import metagraphe import metaphone2 +import thes_build # Dictionnaire des caractères pour le tri naturel. # Ordre souhaitable, mais pose problème pour la recherche, car engendre des égalités de lemmes différents. # Il faut donc travailler sur un dictionnaire trié *numériquement* et le sauvegarder selon le tri *naturel* @@ -566,14 +567,10 @@ for dVars in lDictVars: dicPath = spBuild + '/' + PREFIX_DICT_PATH + self.sVersion file_util.copy_file(dicPath+'/'+dVars['asciiName']+'.dic', spExt+'/dictionaries/'+dVars['asciiName']+'.dic') file_util.copy_file(dicPath+'/'+dVars['asciiName']+'.aff', spExt+'/dictionaries/'+dVars['asciiName']+'.aff') copyTemplate('orthographe', spExt+'/dictionaries', 'README_dict_fr.txt', dTplVars) - # thesaurus - file_util.copy_file('thesaurus/thes_fr.dat', spExt+'/dictionaries') - file_util.copy_file('thesaurus/thes_fr.idx', spExt+'/dictionaries') - file_util.copy_file('thesaurus/README_thes_fr.txt', spExt+'/dictionaries') # hyphenation file_util.copy_file('césures/hyph_fr.dic', spExt+'/dictionaries') file_util.copy_file('césures/hyph_fr.iso8859-1.dic', spExt+'/dictionaries') file_util.copy_file('césures/frhyph.tex', spExt+'/dictionaries') file_util.copy_file('césures/hyph-fr.tex', spExt+'/dictionaries') @@ -1502,10 +1499,22 @@ hDst.write(str(t)+"\n") for e in self.dFlexions.items(): hDst.write("{} - {}\n".format(e[0], e[1])) +def createThesaurusPackage (spBuild, sVersion, spCopy=""): + print("Création du thésaurus") + spThesaurus = spBuild+"/thesaurus-v"+sVersion + dir_util.mkpath(spThesaurus) + thes_build.build("thesaurus/thes_fr.dat", "thesaurus/synsets_fr.dat", spThesaurus) + file_util.copy_file('thesaurus/README_thes_fr.txt', spThesaurus) + if spCopy: + # copy in libreoffice extension package + file_util.copy_file(spThesaurus+'/thes_fr.dat', spCopy) + file_util.copy_file(spThesaurus+'/thes_fr.idx', spCopy) + file_util.copy_file(spThesaurus+'/README_thes_fr.txt', spCopy) + def main (): xParser = argparse.ArgumentParser() xParser.add_argument("-v", "--verdic", help="set dictionary version, i.e. 5.4", type=str, default="X.Y.z") xParser.add_argument("-m", "--mode", help="0: no tags, 1: Hunspell tags (default), 2: All tags", type=int, choices=[0, 1, 2], default=1) @@ -1556,27 +1565,28 @@ oStatsLex.addLexFromFile('lexique/corpus_data/stats_frwikisource.txt', 'S', 'Wikisource') oStatsLex.addLexFromFile('lexique/corpus_data/stats_litterature.txt', 'L', 'Littérature') oStatsLex.write(spBuild+'/test_lex.txt') oFrenchDict.calculateStats(oStatsLex, spfStats) - ### écriture des paquets + ### Écriture des paquets echo("Création des paquets...") spLexiconDestGL = "../../../lexicons" if xArgs.grammalecte else "" spLibreOfficeExtDestGL = "../oxt/Dictionnaires/dictionaries" if xArgs.grammalecte else "" spMozillaExtDestGL = "" if xArgs.grammalecte else "" # no more Hunspell dictionaries in Mozilla extensions for now spDataDestGL = "../data" if xArgs.grammalecte else "" + ### dictionnaires if not xArgs.uncompress: oFrenchDict.defineAbreviatedTags(xArgs.mode, spfStats) oFrenchDict.createFiles(spBuild, [dTOUTESVAR, dCLASSIQUE, dREFORME1990], xArgs.mode, xArgs.simplify) oFrenchDict.createLexiconPackages(spBuild, xArgs.verdic, oStatsLex, spLexiconDestGL) oFrenchDict.createFileIfqForDB(spBuild) + createThesaurusPackage(spBuild, xArgs.verdic, spLibreOfficeExtDestGL) oFrenchDict.createLibreOfficeExtension(spBuild, dMOZEXT, [dTOUTESVAR, dCLASSIQUE, dREFORME1990], spLibreOfficeExtDestGL) oFrenchDict.createMozillaExtensions(spBuild, dMOZEXT, [dTOUTESVAR, dCLASSIQUE, dREFORME1990], spMozillaExtDestGL) oFrenchDict.createDictConj(spBuild, spDataDestGL) oFrenchDict.createDictDecl(spBuild, spDataDestGL) - if __name__ == '__main__': main() ADDED gc_lang/fr/dictionnaire/thes_build.py Index: gc_lang/fr/dictionnaire/thes_build.py ================================================================== --- gc_lang/fr/dictionnaire/thes_build.py +++ gc_lang/fr/dictionnaire/thes_build.py @@ -0,0 +1,122 @@ +# Thesaurus builder + +import os +import re + + +def readFile (spf): + if os.path.isfile(spf): + with open(spf, "r", encoding="utf-8") as hSrc: + for sLine in hSrc: + yield sLine.strip() + else: + print("# Error. File not found or not loadable: " + spf) + + + +class ThesaurusBuilder (): + + def __init__ (self): + # synsets + self.dSynEntry = {} # {sWord: iSynset} + self.dSynset = {} # {iSynset: lSynset} + # thesaurus + self.dThesEntry = {} # {sWord: lWord} + + def readSynsets (self, spf): + if not spf: + return + for i, sLine in enumerate(readFile(spf), 1): + sPOS, *lSynset = sLine.split("|") + lSynset = self._removeDuplicatesFrom(lSynset) + self.dSynset[i] = lSynset + for sWord in lSynset: + if not sWord.endswith("*"): + if sWord not in self.dSynEntry: + self.dSynEntry[sWord] = [ (sPOS, i) ] + else: + self.dSynEntry[sWord].append( (sPOS, i) ) + + def showSynsetEntries (self): + for sWord, lSynset in self.dSynEntry.items(): + for sPOS, iSynset in lSynset: + print(sWord, sPOS, "|".join(self.dSynset[iSynset])) + + def readThesaurus (self, spf): + if not spf: + return + genRead = readFile(spf) + sLine1 = next(genRead) + sEntry = "" + iEntryLine = 0 + nClass = 0 + nClassFound = 0 + for i, sLine in enumerate(genRead, 2): + sLine = sLine.strip() + if re.search(r"^[^|]+\|[1-9][0-9]*$", sLine): + # new entry + if nClass != nClassFound: + print("Ligne:", iEntryLine, ", nombre de liste incorrect") + iEntryLine = i + sEntry, sNum = sLine.split("|") + self.dThesEntry[sEntry] = [] + nClass = int(sNum) + nClassFound = 0 + else: + # new list of synonyms + nClassFound += 1 + sPOS, *lClass = sLine.split("|") + lClass = self._removeDuplicatesFrom(lClass) + self.dThesEntry[sEntry].append( (sPOS, lClass) ) + + def showThesaurusEntries (self): + for sWord, lClass in self.dThesEntry.items(): + for sPOS, lWord in lClass: + print(sWord, sPOS, "|".join(lWord)) + + def _removeDuplicatesFrom (self, lWord): + return [ sWord.strip() for sWord in dict.fromkeys(lWord) ] # remove duplicates: use instead of to keep order + + def merge (self): + for sWord, lSynset in self.dSynEntry.items(): + for sPOS, iSynset in lSynset: + if sWord in self.dThesEntry: + self.dThesEntry[sWord].append( (sPOS, self.dSynset[iSynset]) ) + else: + self.dThesEntry[sWord] = [ (sPOS, self.dSynset[iSynset]) ] + + def write (self, spDest): + nOffset = 0 # the offset for finding data is the number of bytes (-> encoding("utf-8")) + dOffset = {} + with open(spDest + "/thes_fr.dat", "w", encoding="utf-8", newline="\n") as hThes: + sHeader = "UTF-8\n" + hThes.write(sHeader) + nOffset = len(sHeader.encode("utf-8")) + for sWord, lClass in self.dThesEntry.items(): + dOffset[sWord] = nOffset + sWordLine = sWord+"|"+str(len(lClass))+"\n" + hThes.write(sWordLine) + nOffset += len(sWordLine.encode("utf-8")) + for sPOS, lWord in lClass: + sClassLine = sPOS+"|"+"|".join(lWord)+"\n" + hThes.write(sClassLine) + nOffset += len(sClassLine.encode("utf-8")) + with open(spDest + "/thes_fr.idx", "w", encoding="utf-8", newline="\n") as hIndex: + hIndex.write("UTF-8\n") + hIndex.write(str(len(self.dThesEntry))+"\n") + for sWord, nOffset in sorted(dOffset.items()): + hIndex.write(sWord+"|"+str(nOffset)+"\n") + + +def build (spfThesaurus="", spfSynsets="", spDest="_build"): + oThes = ThesaurusBuilder() + oThes.readSynsets(spfSynsets) + #oThes.showSynsetEntries() + oThes.readThesaurus(spfThesaurus) + #oThes.showThesaurusEntries() + oThes.merge() + oThes.write(spDest) + + +if __name__ == '__main__': + build("thesaurus/thes_fr.dat", "thesaurus/synsets_fr.dat") DELETED gc_lang/fr/dictionnaire/thesaurus/create_idx.py Index: gc_lang/fr/dictionnaire/thesaurus/create_idx.py ================================================================== --- gc_lang/fr/dictionnaire/thesaurus/create_idx.py +++ gc_lang/fr/dictionnaire/thesaurus/create_idx.py @@ -1,107 +0,0 @@ -#!/usr/bin/python -# -*- coding: UTF-8 -*- - -import sys -import re -import codecs - -def help (): - print "" - print "Syntax:" - print "thes_convert.py filename" - - -def indexCreation (thfilename): - # This method is a modified Python transcription of a Perl script (th_gen_idx.pl) - # made by Kevin B. Hendricks (see MyThes-1.0) - """ - /* - * Copyright 2003 Kevin B. Hendricks, Stratford, Ontario, Canada - * And Contributors. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. All modifications to the source code must be clearly marked as - * such. Binary redistributions based on modified source code - * must be clearly marked as modified versions in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY KEVIN B. HENDRICKS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL - * KEVIN B. HENDRICKS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - """ - - print("Creating the index file for the thesaurus ...") - # we read the thesaurus - entries = [] - pattern = re.compile('^[^|]+\|[1-9][0-9]*$') - sourcefile = open(thfilename, 'r') - encodingline = sourcefile.readline() # encoding - fileOffset = len(encodingline) - line = sourcefile.readline() - i = 2 - while line != "" : - while not re.search(pattern, line) : - try: - print(u"## Error at line %d. This line is not a new entry:\n%s" % (i, line)) - except: - print(u"## Error at line %d. This line is not a new entry." % i) - line = sourcefile.readline() - i = i + 1 - offset = len(line) - line = line.rstrip() - entry, nbclass = line.split('|') - nbcl = int(nbclass) - for k in range(nbcl) : - line = sourcefile.readline() - offset = offset + len(line) - i = i + 1 - entries.append((entry, fileOffset)) - fileOffset = fileOffset + offset - line = sourcefile.readline() - i = i + 1 - sourcefile.close() - - # we create the index - entries.sort(elemsort) - idxfilenames = thfilename.rsplit('.', 1) - idxfilename = idxfilenames[0] + ".idx" - destfile = open(idxfilename, 'w') - destfile.write(encodingline) - destfile.write("%d\n" % len(entries)) - for entry in entries : - destfile.write("%s|%d\n" % (entry[0], entry[1])) - destfile.close() - print("Done.") - - -def main (): - if len(sys.argv) != 2: - help() - return False - - indexCreation(sys.argv[1]) - - -if __name__ == "__main__" : - main() ADDED gc_lang/fr/dictionnaire/thesaurus/synsets_fr.dat Index: gc_lang/fr/dictionnaire/thesaurus/synsets_fr.dat ================================================================== --- gc_lang/fr/dictionnaire/thesaurus/synsets_fr.dat +++ gc_lang/fr/dictionnaire/thesaurus/synsets_fr.dat @@ -0,0 +1,59 @@ +(nom)|aigreur|indignation|rancœur|rancune|dépit|ressentiment|amertume|acrimonie|antipathie|colère +(nom)|arbre|végétal|baliveau|tige|buisson|feuillu|résineux|arbuste|résinifère|tronc +(nom)|assemblée|communauté|confrérie|sororité|collectivité|compagnie|association|corporation|congrégation|clergé|coterie|loge|corps|Église|ordre|groupe|société +(nom)|atout|carte-maîtresse|carte-maitresse|as|joker +(nom)|âtre|feu|foyer|cheminée|réchaud|fourneau|chaufferette|brasero|chauffe-plat|tison|brasier|fournaise|chauffage|haut-fourneau|four +(nom)|axe|pivot|essieu|manivelle|bielle|embiellage|pivot|charnière|balancier|bras|arbre|transmission +(nom)|bordel|foutoir|chantier|désordre|galère|merdier|merde|bazar +(nom)|cadavre|défunt|mort|trépassé|esprit|spectre|âme|décédé|victime|dépouille|défunt|tué|disparu|martyr|souffre-douleur|corps +(verb)|capitulez|rendez-vous|acceptez|abandonnez|renoncez|repliez-vous|agenouillez-vous|soumettez-vous +(adj)|certain|indiscutable|indubitable|concret|positif|précis|net|patent|effectif|solide|sûr|sérieux|visible +(adj)|charnel|sexuel|physiologique|organique|physique +(nom)|chef|maître|maitre|responsable|dirigeant|patron|commandant|directeur|supérieur|leader|meneur|propriétaire|employeur|dictateur|tyran +(nom)|chocolatine|pain au chocolat +(nom)|clé|clef|rossignol|crochet|sésame|carouble|accès|passe|mot de passe|passe-partout +(nom)|colère|courroux|animosité|irritation|humeur|malveillance|inimitié|agressivité|haine|emportement|véhémence|ire|rage|exaspération|impatience|déchaînement|explosion|crise|irritation +(adj)|commun|ordinaire|normal|vulgaire|général|quelconque|terne|habituel|insignifiant|universel|global|consensuel|léger|vague +(adj)|concret|palpable|réel|matériel|corporel|physique|tangible|visible|solide +(nom)|conjonction|coïncidence|jonction|association|entremêlement|réunion|rendez-vous +(nom)|créateur|maître|maitre|dieu|divinité|déité|démiurge|verbe|idole|logos|éternel|père|artiste|maestro|virtuose|répétiteur|musicien +(nom)|destruction|combustion|calcination|incendie|incinération|oxydation|déflagration|flamboiement|ignition|sinistre|feu +(nom)|disparu|mort|décédé|trépassé|défunt|tué|passé|oublié|feu +(nom)|douleur|feu|brûlure|aigreur|ampoule|cloque|inflammation|irradiation|irritation|insolation|ulcération|rougeur|enfer|souffrance +(nom)|église|temple|mosquée|synagogue|cathédrale|cloître|chapelle|couvent|abbatiale|monastère|oratoire|sanctuaire|asile|basilique|ziggourat|presbytère|monument mégalithique|fanum +(nom)|entreprise|société|compagnie|holding|groupe|corporation|SARL|SA +(nom)|épée|sabre|katana|lame|rapière|cimeterre|yatagan|kriss|coupe-chou|glaive|poignard|dague|couteau|fleuret +(nom)|escrime|épéisme +(nom)|excrément|merde|selles|bouse|crottin|crotte|caca +(nom)|famille|lignage|foyer|maison|ménage|dynastie|descendance|progéniture|généalogie|souche|parentèle|race|sang|extraction|lignée|parenté|postérité|ascendance|filiation|racine|tronc|tige|branche +(nom)|fin|achèvement|extrémité|limite|terme|terminaison|terminus|queue|aboutissement|issue|épilogue|conclusion|dénouement|mort +(adj)|flou|vague|incertain|indistinct|indécis|brouillé|nébuleux|équivoque|confus|indéterminé|imprécis|obscur|douteux|ténébreux|ambigu|indéfini|vaporeux|brumeux|clair-obscur|évasif|imperceptible|incompréhensible|indiscernable|lâche|indéfinissable|abstrait|sombre|imparfait|approximatif|fumeux|fuligineux|délayé|inclassable|indéterminable|trouble|voilé|sibyllin|nuageux|estompé|inconsistant|diffus +(adj)|fluctuant|ondulant|changeant|fuyant|inconstant|flottant|vague +(nom)|force|puissance|énergie|attraction|gravitation|pénétration|portée|effet|ampleur|intensité|amplitude|étendue|immensité|importance|impact|efficacité +(adj)|foutu|râpé|terminé|fini|déglingué|mort +(adj)|hésitant|irrésolu|indécis|perplexe|inexpressif|atone|froid|négligé|vague +(adj)|inanimé|inerte|inactif|crevé|épuisé|immobile|stagnant|dormant|marécageux|stationnaire|mort +(nom)|lumière|feu|flamme|lanterne|fanal|flambeau|phare|flammes|flambée|flammèche|éblouissement|éclat|étincelle|embrasement|lueur|lumière|clarté|rayon|scintillement|éclair|illumination|fulgurance|luisance|phosphorescence|falot +(nom)|maladie|mal|crève|grippe|mort +(interj)|marre|assez|ça suffit|ras le bol|j’en peux plus +(nom)|matériel|outilllage|fourbi|attirail|barda|matériau|outil|mobilier|équipement|machine|matos|appareillage|instrument|hardware +(nom)|mentor|maître|maitre|enseignant|éducateur|initiateur|expert|savant|précepteur|formateur|professeur|pion|surveillant|éveilleur|instructeur|moniteur|pédagogue|instituteur|entraîneur|gourou +(nom)|mort|décès|trépas|agonie|glas|meurtre|anéantissement|disparition|extinction|consommation|suicide|assassinat|fin +(nom)|noblesse|excellence|sagesse|expérience|plénitude|profondeur|grandeur|élévation|mérite|valeur|maturité|force +(nom)|ordinateur|calculateur|machine|PC|calculatrice|micro-ordinateur|unité centrale|station|terminal|bécane|computer|tour|portable|ordinant|robot|androïde|gynoïde|marionnette|automate +(nom)|passion|feu|ardeur|fanatisme|emballement|délire|exaltation|ferveur|fièvre|frénésie|fureur|impétuosité|flamme|élan +(nom)|pouvoir|autorité|grâce|grandeur|gloire|domination|présence|charisme|influence|ascendant|stature|assurance|impassibilité|force +(nom)|prostituée|pute|catin|putain|péripatéticienne|hétaïre|courtisane|geisha|asphalteuse|belle-de-nuit|demi-mondaine|femme de mauvaise vie|femme publique|fille publique|fille de joie|fille de mauvaise vie|fille des rues|fleur de macadam|michetonneuse|poule|professionnelle|raccrocheuse|racoleuse|ribaude|sirène|tapineuse|traînée|trimardeuse|turfeuse|bagasse|cocotte|sirène +(nom)|réalité|réel|matériel|matériau|nature +(nom)|religion|confession|culte|croyance|Église +(nom)|rendez-vous|rancard|rancart|rencard|tête-à-tête|entretien|entrevue|audience|assignation|convocation|réunion|rencontre|match +(nom)|résistance|endurance|dureté|fermeté|invulnérabilité|inflexibilité|solidité|robustesse|patience|force +(nom)|sang|hémoglobine|plasma|sérum|cruor|sève|fluide vital +(nom)|seigneur|maître|maitre|roi|prince|empereur|monarque|majesté|magister|régent|sieur|sire|suzerain|hobereau|souverain|châtelain|paladin|aristocrate|franc-maçon|juge +(nom)|signal|drapeau|balise|déclencheur|déclic|signalement|alarme|feu|alerte +(nom)|solution|clé|clef|point-clé|réponse|conclusion|dénouement +(nom)|vague|onde|flot|vaguelette|ressac|marée|lame|flux|reflux|afflux|courant|eau|déferlement|torrent|onde de choc|raz-de-marée|houle|roulis|rut|rush|remous|déferlante|rouleau|fluctuation|déluge|pluie|ondée +(nom)|vigueur|activité|dynamisme|énergie|force|enthousiasme|sang +(nom)|vigueur|fougue|sève|activité|sang|tonicité|tonus|punch|verdeur|jeunesse|élan|ressort|impétuosité|dynamisme|impulsivité|vitalité|ardeur|virulence|véhémence|exaltation|force +(nom)|violence|force|tyrannie|despotisme|contrainte|oppression +(nom)|volonté|courage|audace|cran|détermination|constance|persévérance|résolution|ténacité|trempe|acharnement|persistance|force Index: gc_lang/fr/modules/conj_data.py ================================================================== --- gc_lang/fr/modules/conj_data.py +++ gc_lang/fr/modules/conj_data.py cannot compute difference between binary files Index: gc_lang/fr/modules/phonet_data.py ================================================================== --- gc_lang/fr/modules/phonet_data.py +++ gc_lang/fr/modules/phonet_data.py cannot compute difference between binary files Index: gc_lang/fr/oxt/Dictionnaires/dictionaries/fr-classique.aff ================================================================== --- gc_lang/fr/oxt/Dictionnaires/dictionaries/fr-classique.aff +++ gc_lang/fr/oxt/Dictionnaires/dictionaries/fr-classique.aff @@ -2,11 +2,11 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # AFFIXES DU DICTIONNAIRE ORTHOGRAPHIQUE FRANÇAIS “CLASSIQUE” v6.4.1 # par Olivier R. -- licence MPL 2.0 -# Généré le 15-05-2019 à 08:25 +# Généré le 26-06-2019 à 20:44 # Pour améliorer le dictionnaire, allez sur https://grammalecte.net/ SET UTF-8 Index: gc_lang/fr/oxt/Dictionnaires/dictionaries/fr-reforme1990.aff ================================================================== --- gc_lang/fr/oxt/Dictionnaires/dictionaries/fr-reforme1990.aff +++ gc_lang/fr/oxt/Dictionnaires/dictionaries/fr-reforme1990.aff @@ -2,11 +2,11 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # AFFIXES DU DICTIONNAIRE ORTHOGRAPHIQUE FRANÇAIS “RÉFORME 1990” v6.4.1 # par Olivier R. -- licence MPL 2.0 -# Généré le 15-05-2019 à 08:25 +# Généré le 26-06-2019 à 20:44 # Pour améliorer le dictionnaire, allez sur https://grammalecte.net/ SET UTF-8 Index: gc_lang/fr/oxt/Dictionnaires/dictionaries/fr-toutesvariantes.aff ================================================================== --- gc_lang/fr/oxt/Dictionnaires/dictionaries/fr-toutesvariantes.aff +++ gc_lang/fr/oxt/Dictionnaires/dictionaries/fr-toutesvariantes.aff @@ -2,11 +2,11 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # AFFIXES DU DICTIONNAIRE ORTHOGRAPHIQUE FRANÇAIS “TOUTES VARIANTES” v6.4.1 # par Olivier R. -- licence MPL 2.0 -# Généré le 15-05-2019 à 08:25 +# Généré le 26-06-2019 à 20:44 # Pour améliorer le dictionnaire, allez sur https://grammalecte.net/ SET UTF-8