Comment utiliser le correcteur orthographique jOrtho? J'ai téléchargé le dernier dictionnaire (fichier XML) depuis wiktionnaire. Maintenant, comment le compiler et l'implémenter dans mon programme?
Réponses
Trop de publicités?J'ai trouvé la solution et voici les étapes pour ajouter la fonctionnalité de vérification orthographique. Tout d'abord, téléchargez le jar et le dictionnaire précompilé à partir d'ici: http://sourceforge.net/projects/jortho/files/
Voici un extrait de code:
SpellChecker.setUserDictionaryProvider(new FileUserDictionary());
SpellChecker.registerDictionaries(this.getClass().getResource("/dictionary"), "en");
SpellChecker.register(messageWriter);
Ici, messageWriter est un JEditor pane. Consultez la documentation pour plus d'explications. Placez les fichiers dictionaries.cnf et dictionary_en.ortho dans le dossier src/dictionary.
Vous pouvez également manipuler les options du menu contextuel. Voici un exemple de ce que j'ai fait:
SpellCheckerOptions sco=new SpellCheckerOptions();
sco.setCaseSensitive(true);
sco.setSuggestionsLimitMenu(10);
JPopupMenu popup = SpellChecker.createCheckerPopup(sco);
messageWriter.addMouseListener(new PopupListener(popup));
Restriction des options à 10. Consultez la documentation.
Tout d'abord, vous devez télécharger la bibliothèque. http://sourceforge.net/projects/jortho/files/JOrtho%20Library/0.5/ Leur fichier zip devrait inclure un ou plusieurs fichiers .jar. Vous devrez ajouter ceux-ci dans votre classpath. La manière de le faire dépend de votre mode de développement. Si vous utilisez Netbeans, c'est différent de la façon dont vous le feriez dans Eclipse.
Si leur fichier zip inclut de la documentation pour leur API, vous devriez être en mesure de l'utiliser pour l'ajouter à votre programme Java. Sinon, vous pourriez avoir besoin de chercher une alternative. Il semble que les liens sur leur site sont morts. Ce qui est généralement un mauvais signe.
Il existe des alternatives. Je n'ai pas mis longtemps à en trouver une http://jazzy.sourceforge.net/ par exemple. Il semble que c'est celle utilisée par Lucene en interne. Elle a également une meilleure licence que jortho.
Bonne chance.
Pour une utilisation dans une application sans interface graphique :
public class Checker {
private static Map methods;
public static void main(String[] args) throws NoSuchMethodException, ClassNotFoundException, InvocationTargetException, IllegalAccessException {
SpellChecker.registerDictionaries(Checker.class.getResource("/dictionary/"), "en");
methods = new HashMap<>();
setAccessibleMethod(LanguageBundle.class, "get", Locale.class);
setAccessibleMethod(LanguageBundle.class,
"existInDictionary",
String.class,
Checker.class.getClassLoader().loadClass("com.inet.jortho.Dictionary"),
com.inet.jortho.SpellCheckerOptions.class,
boolean.class
);
setAccessibleMethod(SpellChecker.class, "getCurrentDictionary");
while (SpellChecker.getCurrentLocale() == null) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Object dictionary = invokeMethod(SpellChecker.class, "getCurrentDictionary", null);
LanguageBundle bundle = (LanguageBundle) invokeMethod(LanguageBundle.class, "get", null, SpellChecker.getCurrentLocale());
Set errors = new HashSet<>();
StringTokenizer st = new StringTokenizer("Une phrase avec une erreur dans le Guide du voyageur galactique");
boolean newSentence = true;
while (st.hasMoreTokens()) {
String word = st.nextToken();
boolean b = true;
boolean nextNewSentence = false;
if (word.length() > 1) {
if ('.' == word.charAt(word.length() - 1)) {
nextNewSentence = true;
word = word.substring(0, word.length() - 1);
}
b = (Boolean) invokeMethod(LanguageBundle.class, "existInDictionary", bundle,
word,
dictionary,
SpellChecker.getOptions(),
newSentence);
}
if (!b)
errors.add(word);
newSentence = nextNewSentence;
}
System.out.println(StringUtils.join(errors, " , "));
}
private static void setAccessibleMethod(Class cls, String name, Class... parameterTypes) throws NoSuchMethodException {
Method method = cls.getDeclaredMethod(name, parameterTypes);
method.setAccessible(true);
methods.put(cls.getName() + "." + name, method);
}
private static Object invokeMethod(Class cls, String name, Object obj, Object... args) throws InvocationTargetException, IllegalAccessException {
return methods.get(cls.getName() + "." + name).invoke(obj, args);
}
}