Index: gc_core/py/oxt/Linguistic.xcu
==================================================================
--- gc_core/py/oxt/Linguistic.xcu
+++ gc_core/py/oxt/Linguistic.xcu
@@ -6,9 +6,14 @@
         
             
                 
                     ${locales}
                 
+            
+            
+                
+                    ${locales}
+                
             
         
     
 
Index: gc_core/py/oxt/manifest.xml
==================================================================
--- gc_core/py/oxt/manifest.xml
+++ gc_core/py/oxt/manifest.xml
@@ -14,10 +14,14 @@
         
         
 
+        
+        
+
         
         
 
         
Index: gc_lang/fr/config.ini
==================================================================
--- gc_lang/fr/config.ini
+++ gc_lang/fr/config.ini
@@ -1,9 +1,9 @@
 [args]
 lang = fr
 lang_name = French
-locales = fr_FR fr_BE fr_CA fr_CH fr_LU fr_MC fr_BF fr_CI fr_SN fr_ML fr_NE fr_TG fr_BJ
+locales = fr_FR fr_BE fr_CA fr_CH fr_LU fr_BF fr_BJ fr_CD fr_CI fr_CM fr_MA fr_ML fr_MU fr_NE fr_RE fr_SN fr_TG 
 country_default = FR
 name = Grammalecte
 implname = grammalecte
 # always use 3 numbers for version: x.y.z
 version = 0.6.3
@@ -77,10 +77,12 @@
 oxt/_img/Algoo_logo.png = img/Algoo_logo.png
 oxt/_img/grammalecte_16.bmp = img/grammalecte_16.bmp
 oxt/_img/french_flag_16.bmp = img/french_flag_16.bmp
 # AppLauncher
 oxt/AppLauncher.py = AppLauncher.py
+# Graphspell
+oxt/Graphspell.py = Graphspell.py
 # About
 oxt/About/About.py = pythonpath/About.py
 oxt/About/ab_strings.py = pythonpath/ab_strings.py
 # Dictionaries
 oxt/Dictionnaires/dictionaries = dictionaries
Index: gc_lang/fr/oxt/Dictionnaires/dictionaries.xcu
==================================================================
--- gc_lang/fr/oxt/Dictionnaires/dictionaries.xcu
+++ gc_lang/fr/oxt/Dictionnaires/dictionaries.xcu
@@ -8,11 +8,12 @@
             
             
                 DICT_SPELL
             
             
-                fr-FR fr-BE fr-CA fr-CH fr-LU fr-MC fr-BF fr-CI fr-SN fr-ML fr-NE fr-TG fr-BJ
+                fr-MC
+                
                 
                 
             
         
         
@@ -21,11 +22,11 @@
             
             
                 DICT_HYPH
             
             
-                fr-FR fr-BE fr-CA fr-CH fr-LU fr-MC fr-BF fr-CI fr-SN fr-ML fr-NE fr-TG fr-BJ
+                fr-FR fr-BE fr-CA fr-CH fr-LU fr-MC fr-BF fr-BJ fr-CD fr-CI fr-CM fr-MA fr-ML fr-MU fr-NE fr-RE fr-SN fr-TG
             
         
         
             
                 %origin%/dictionaries/thes_fr.dat %origin%/dictionaries/thes_fr.idx
@@ -32,11 +33,11 @@
             
             
                 DICT_THES
             
             
-                fr-FR fr-BE fr-CA fr-CH fr-LU fr-MC fr-BF fr-CI fr-SN fr-ML fr-NE fr-TG fr-BJ
+                fr-FR fr-BE fr-CA fr-CH fr-LU fr-MC fr-BF fr-BJ fr-CD fr-CI fr-CM fr-MA fr-ML fr-MU fr-NE fr-RE fr-SN fr-TG
             
         
     
    
 
ADDED   gc_lang/fr/oxt/Graphspell.py
Index: gc_lang/fr/oxt/Graphspell.py
==================================================================
--- /dev/null
+++ gc_lang/fr/oxt/Graphspell.py
@@ -0,0 +1,159 @@
+# Graphspell
+#
+# Spellchecker based on a DAWG (Direct Acyclic Word Graph)
+
+
+import uno
+import unohelper
+import traceback
+import re
+
+from grammalecte.graphspell import SpellChecker
+
+from com.sun.star.linguistic2 import XSupportedLocales, XSpellChecker, XSpellAlternatives
+from com.sun.star.lang import XServiceInfo, XServiceName, XServiceDisplayName
+from com.sun.star.lang import Locale
+
+
+lLocale = {
+    # List of locales in LibreOffice
+    # https://cgit.freedesktop.org/libreoffice/core/tree/i18nlangtag/source/isolang/isolang.cxx
+    ('la', 'VA', ''),  # Latin (for testing purpose)
+    ('fr', 'FR', ''),  # France
+    ('fr', 'BE', ''),  # Belgique
+    ('fr', 'CA', ''),  # Canada
+    ('fr', 'CH', ''),  # Suisse
+    ('fr', 'LU', ''),  # Luxembourg
+    #('fr', 'MC', ''),  # Monaco
+    ('fr', 'BF', ''),  # Burkina Faso
+    ('fr', 'BJ', ''),  # Benin
+    ('fr', 'CD', ''),  # Congo
+    ('fr', 'CI', ''),  # Côte d’Ivoire
+    ('fr', 'CM', ''),  # Cameroun
+    ('fr', 'MA', ''),  # Maroc
+    ('fr', 'ML', ''),  # Mali
+    ('fr', 'MU', ''),  # Île Maurice
+    ('fr', 'NE', ''),  # Niger
+    ('fr', 'RE', ''),  # Réunion
+    ('fr', 'SN', ''),  # Sénégal
+    ('fr', 'TG', '')   # Togo
+}
+
+zElidedWords = re.compile("(?i)^(?:[ldnmtsjcçy]|qu|lorsqu|quoiqu|puisqu|jusqu)['’`‘]")
+
+
+class Graphspell (unohelper.Base, XSpellChecker, XServiceInfo, XServiceName, XServiceDisplayName, XSupportedLocales):
+
+    def __init__ (self, ctx, *args):
+        try:
+            self.ctx = ctx
+            self.sServiceName = "com.sun.star.linguistic2.SpellChecker"
+            self.sImplementationName = "net.grammalecte.graphspell"
+            self.tSupportedServiceNames = (self.sServiceName, )
+            self.xSvMgr = ctx.ServiceManager
+            self.locales = tuple([ Locale(t[0], t[1], t[2])  for t in lLocale ])
+            self.oGraphspell = SpellChecker("fr", "fr.bdic")
+            self.bHunspell
+            self.xHunspell = None
+            self.xHunspellLocale = Locale('fr', 'MC', '')
+            #self.xHunspellLocale = uno.createUnoStruct('com.sun.star.lang.Locale')
+            #self.xHunspellLocale.Language = 'fr'
+            #self.xHunspellLocale.Country = 'FR'
+            print("init done")
+        except:
+            print("Graphspell: init")
+            traceback.print_exc()
+    
+    # XServiceName
+    def getServiceName (self):
+        return self.sImplementationName     #self.sServiceName
+
+    # XServiceInfo
+    def getImplementationName (self):
+        return self.sImplementationName
+
+    def supportsService (self, sServiceName):
+        return (sServiceName in self.tSupportedServiceNames)
+
+    def getSupportedServiceNames (self):
+        return self.tSupportedServiceNames
+
+    # XSupportedLocales
+    def hasLocale (self, aLocale):
+        if aLocale in self.locales:
+            return True
+        for e in self.locales:
+            if aLocale.Language == e.Language and (e.Country == aLocale.Country or e.Country == ""):
+                return True
+        return False
+    
+    def getLocales (self):
+        return self.locales
+    
+    # XSpellChecker
+    # http://www.openoffice.org/api/docs/common/ref/com/sun/star/linguistic2/XSpellChecker.html
+    def isValid (self, aWord, rLocale, aProperties):
+        try:
+            aWord = zElidedWords.sub("", aWord.rstrip("."), count=1)
+            return self.oGraphspell.isValidToken(aWord)
+        except:
+            traceback.print_exc()
+        return False
+
+    def spell (self, aWord, aLocale, aProperties):
+        "returns an object SpellAlternatives"
+        lSugg = []
+        for l in self.oGraphspell.suggest(aWord):
+            lSugg.extend(l)
+        return SpellAlternatives(aWord, tuple(lSugg))
+        try:
+            if not self.xHunspell:
+                self.xHunspell = self.xSvMgr.createInstance("com.sun.star.linguistic2.SpellChecker")
+            if self.xHunspell:
+                return self.xHunspell.spell(aWord, self.xHunspellLocale, aProperties)
+        except:
+            traceback.print_exc()
+        return None
+
+    # XServiceDisplayName
+    def getServiceDisplayName(self, aLocale):
+        return "Graphspell (fr)"
+
+
+class SpellAlternatives (unohelper.Base, XSpellAlternatives):
+    
+    def __init__ (self, sWord, lSugg):
+        try:
+            self.sWord = sWord
+            self.lSugg = lSugg
+            self.xLocale = Locale('fr', 'FR', '')
+        except:
+            traceback.print_exc()
+    
+    # XSpellAlternatives
+    # http://www.openoffice.org/api/docs/common/ref/com/sun/star/linguistic2/XSpellAlternatives.html
+    def getWord (self):
+        return self.sWord
+    
+    def getLocale (self):
+        return self.xLocale
+    
+    def getFailureType (self):
+        return 4
+        # IS_NEGATIVE_WORD = 2
+        #   The word is a negative one, that is, it should not be used.
+        # CAPTION_ERROR = 3
+        #   The capitalization of the word is wrong.
+        # SPELLING_ERROR = 4
+        #   The spelling of the word is wrong (or at least not known to be correct).
+        # No difference -> red underline
+    
+    def getAlternativesCount (self):
+        return len(self.lSugg)
+    
+    def getAlternatives (self):
+        return self.lSugg
+
+
+g_ImplementationHelper = unohelper.ImplementationHelper()
+g_ImplementationHelper.addImplementation(Graphspell, "net.grammalecte.graphspell", ("com.sun.star.linguistic2.SpellChecker",),)
DELETED gc_lang/fr/oxt/Graphspell/Graphspell.py
Index: gc_lang/fr/oxt/Graphspell/Graphspell.py
==================================================================
--- gc_lang/fr/oxt/Graphspell/Graphspell.py
+++ /dev/null
@@ -1,159 +0,0 @@
-# Graphspell
-#
-# Spellchecker based on a DAWG (Direct Acyclic Word Graph)
-
-
-import uno
-import unohelper
-import traceback
-import re
-
-from grammalecte.graphspell import SpellChecker
-
-from com.sun.star.linguistic2 import XSupportedLocales, XSpellChecker, XSpellAlternatives
-from com.sun.star.lang import XServiceInfo, XServiceName, XServiceDisplayName
-from com.sun.star.lang import Locale
-
-
-lLocale = {
-    # List of locales in LibreOffice
-    # https://cgit.freedesktop.org/libreoffice/core/tree/i18nlangtag/source/isolang/isolang.cxx
-    ('la', 'VA', ''),  # Latin (for testing purpose)
-    ('fr', 'FR', ''),  # France
-    ('fr', 'BE', ''),  # Belgique
-    ('fr', 'CA', ''),  # Canada
-    ('fr', 'CH', ''),  # Suisse
-    ('fr', 'LU', ''),  # Luxembourg
-    #('fr', 'MC', ''),  # Monaco
-    ('fr', 'BF', ''),  # Burkina Faso
-    ('fr', 'BJ', ''),  # Benin
-    ('fr', 'CD', ''),  # Congo
-    ('fr', 'CI', ''),  # Côte d’Ivoire
-    ('fr', 'CM', ''),  # Cameroun
-    ('fr', 'MA', ''),  # Maroc
-    ('fr', 'ML', ''),  # Mali
-    ('fr', 'MU', ''),  # Île Maurice
-    ('fr', 'NE', ''),  # Niger
-    ('fr', 'RE', ''),  # Réunion
-    ('fr', 'SN', ''),  # Sénégal
-    ('fr', 'TG', '')   # Togo
-}
-
-zElidedWords = re.compile("(?i)^(?:[ldnmtsjcçy]|qu|lorsqu|quoiqu|puisqu|jusqu)['’`‘]")
-
-
-class Graphspell (unohelper.Base, XSpellChecker, XServiceInfo, XServiceName, XServiceDisplayName, XSupportedLocales):
-
-    def __init__ (self, ctx, *args):
-        try:
-            self.ctx = ctx
-            self.sServiceName = "com.sun.star.linguistic2.SpellChecker"
-            self.sImplementationName = "net.grammalecte.graphspell"
-            self.tSupportedServiceNames = (self.sServiceName, )
-            self.xSvMgr = ctx.ServiceManager
-            self.locales = tuple([ Locale(t[0], t[1], t[2])  for t in lLocale ])
-            self.oGraphspell = SpellChecker("fr", "fr.bdic")
-            self.bHunspell
-            self.xHunspell = None
-            self.xHunspellLocale = Locale('fr', 'MC', '')
-            #self.xHunspellLocale = uno.createUnoStruct('com.sun.star.lang.Locale')
-            #self.xHunspellLocale.Language = 'fr'
-            #self.xHunspellLocale.Country = 'FR'
-            print("init done")
-        except:
-            print("Graphspell: init")
-            traceback.print_exc()
-    
-    # XServiceName
-    def getServiceName (self):
-        return self.sImplementationName     #self.sServiceName
-
-    # XServiceInfo
-    def getImplementationName (self):
-        return self.sImplementationName
-
-    def supportsService (self, sServiceName):
-        return (sServiceName in self.tSupportedServiceNames)
-
-    def getSupportedServiceNames (self):
-        return self.tSupportedServiceNames
-
-    # XSupportedLocales
-    def hasLocale (self, aLocale):
-        if aLocale in self.locales:
-            return True
-        for e in self.locales:
-            if aLocale.Language == e.Language and (e.Country == aLocale.Country or e.Country == ""):
-                return True
-        return False
-    
-    def getLocales (self):
-        return self.locales
-    
-    # XSpellChecker
-    # http://www.openoffice.org/api/docs/common/ref/com/sun/star/linguistic2/XSpellChecker.html
-    def isValid (self, aWord, rLocale, aProperties):
-        try:
-            aWord = zElidedWords.sub("", aWord.rstrip("."), count=1)
-            return self.oGraphspell.isValidToken(aWord)
-        except:
-            traceback.print_exc()
-        return False
-
-    def spell (self, aWord, aLocale, aProperties):
-        "returns an object SpellAlternatives"
-        lSugg = []
-        for l in self.oGraphspell.suggest(aWord):
-            lSugg.extend(l)
-        return SpellAlternatives(aWord, tuple(lSugg))
-        try:
-            if not self.xHunspell:
-                self.xHunspell = self.xSvMgr.createInstance("com.sun.star.linguistic2.SpellChecker")
-            if self.xHunspell:
-                return self.xHunspell.spell(aWord, self.xHunspellLocale, aProperties)
-        except:
-            traceback.print_exc()
-        return None
-
-    # XServiceDisplayName
-    def getServiceDisplayName(self, aLocale):
-        return "Graphspell (fr)"
-
-
-class SpellAlternatives (unohelper.Base, XSpellAlternatives):
-    
-    def __init__ (self, sWord, lSugg):
-        try:
-            self.sWord = sWord
-            self.lSugg = lSugg
-            self.xLocale = Locale('fr', 'FR', '')
-        except:
-            traceback.print_exc()
-    
-    # XSpellAlternatives
-    # http://www.openoffice.org/api/docs/common/ref/com/sun/star/linguistic2/XSpellAlternatives.html
-    def getWord (self):
-        return self.sWord
-    
-    def getLocale (self):
-        return self.xLocale
-    
-    def getFailureType (self):
-        return 4
-        # IS_NEGATIVE_WORD = 2
-        #   The word is a negative one, that is, it should not be used.
-        # CAPTION_ERROR = 3
-        #   The capitalization of the word is wrong.
-        # SPELLING_ERROR = 4
-        #   The spelling of the word is wrong (or at least not known to be correct).
-        # No difference -> red underline
-    
-    def getAlternativesCount (self):
-        return len(self.lSugg)
-    
-    def getAlternatives (self):
-        return self.lSugg
-
-
-g_ImplementationHelper = unohelper.ImplementationHelper()
-g_ImplementationHelper.addImplementation(Graphspell, "net.grammalecte.graphspell", ("com.sun.star.linguistic2.SpellChecker",),)