+Hunspell * HunspellChecker::Private::addSpeller(string const & lang,string & path)
+{
+ if (!haveDictionary(lang, path)) {
+ spellers_[lang] = 0;
+ return 0;
+ }
+
+ FileName const affix(path + ".aff");
+ FileName const dict(path + ".dic");
+ Hunspell * h = new Hunspell(affix.absFileName().c_str(), dict.absFileName().c_str());
+ LYXERR(Debug::FILES, "Hunspell speller for langage " << lang << " at " << dict << " found");
+ spellers_[lang] = h;
+ return h;
+}
+
+
+Hunspell * HunspellChecker::Private::addSpeller(Language const * lang)
+{
+ Hunspell * h = 0;
+ for ( int p = 0; p < maxLookupSelector() && 0 == h; p++ ) {
+ string lpath = dictPath(p);
+ h = addSpeller(lang->code(), lpath);
+ }
+ if (0 != h) {
+ string const encoding = h->get_dic_encoding();
+ PersonalWordList * pd = new PersonalWordList(lang->lang());
+ pd->load();
+ personal_[lang->lang()] = pd;
+ docstring_list::const_iterator it = pd->begin();
+ docstring_list::const_iterator et = pd->end();
+ for (; it != et; ++it) {
+ string const word_to_add = to_iconv_encoding(*it, encoding);
+ h->add(word_to_add.c_str());
+ }
+ }
+ return h;
+}
+
+
+bool HunspellChecker::Private::isIgnored(WordLangTuple const & wl) const
+{
+ IgnoreList::const_iterator it = ignored_.begin();
+ for (; it != ignored_.end(); ++it) {
+ if ((*it).lang()->code() != wl.lang()->code())
+ continue;
+ if ((*it).word() == wl.word())
+ return true;
+ }
+ return false;
+}
+
+/// personal word list interface
+void HunspellChecker::Private::remove(WordLangTuple const & wl)
+{
+ Hunspell * h = speller(wl.lang());
+ if (!h)
+ return;
+ string const encoding = h->get_dic_encoding();
+ string const word_to_check = to_iconv_encoding(wl.word(), encoding);
+ h->remove(word_to_check.c_str());
+ PersonalWordList * pd = personal_[wl.lang()->lang()];
+ if (!pd)
+ return;
+ pd->remove(wl.word());
+}
+
+
+void HunspellChecker::Private::insert(WordLangTuple const & wl)
+{
+ Hunspell * h = speller(wl.lang());
+ if (!h)
+ return;
+ string const encoding = h->get_dic_encoding();
+ string const word_to_check = to_iconv_encoding(wl.word(), encoding);
+ h->add(word_to_check.c_str());
+ PersonalWordList * pd = personal_[wl.lang()->lang()];
+ if (!pd)
+ return;
+ pd->insert(wl.word());
+}
+
+
+bool HunspellChecker::Private::learned(WordLangTuple const & wl)
+{
+ PersonalWordList * pd = personal_[wl.lang()->lang()];
+ if (!pd)
+ return false;
+ return pd->exists(wl.word());
+}
+
+