languagetool-org/languagetool · error · IOException

A separator character (fsa.dict.separator) must be defined i

Error message

A separator character (fsa.dict.separator) must be defined in the dictionary info file.

What it means

Configuration guard in SynthDictionaryBuilder: the synthesizer dictionary's .info file lacks fsa.dict.separator, so entries cannot be parsed/reversed correctly.

Source

Thrown at languagetool-tools/src/main/java/org/languagetool/tools/SynthDictionaryBuilder.java:121

    String fileName = infoFile.getName();
    int underscorePos = fileName.indexOf('_');
    if (underscorePos == -1) {
      throw new IllegalArgumentException("Please specify an .info file for a synthesizer as the second parameter, named '<xyz>_synth.info', with <xyz> being a language'");
    }
    String baseName = fileName.substring(0, underscorePos);
    if (baseName.equals("polish")) {
      return Pattern.compile(POLISH_IGNORE_REGEX);
    }
    return null;
  }

  private File reverseLineContent(File plainTextDictFile, Set<String> itemsToBeIgnored, Pattern ignorePosRegex) throws IOException {
    File reversedFile = File.createTempFile(SynthDictionaryBuilder.class.getSimpleName() + "_reversed", ".txt");
    reversedFile.deleteOnExit();

    String separator = getOption("fsa.dict.separator");
    if (separator == null || separator.trim().isEmpty()) {
      throw new IOException("A separator character (fsa.dict.separator) must be defined in the dictionary info file.");
    }
    
    String encoding = getOption("fsa.dict.encoding");
    int posIgnoreCount = 0;
    Scanner scanner = new Scanner(plainTextDictFile, encoding);
    try (Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(reversedFile), encoding))) {
      while (scanner.hasNextLine()) {
        String line = scanner.nextLine();
        if (itemsToBeIgnored.contains(line)) {
          System.out.println("Ignoring: " + line);
          continue;
        }
        String[] parts = line.split("\t");
        if (parts.length == 3) {
          String posTag = parts[2];
          if (ignorePosRegex != null && ignorePosRegex.matcher(posTag).find()) {
            posIgnoreCount++;
            continue;

View on GitHub (pinned to 2e990059ce)

Solutions

  1. Add fsa.dict.separator=<char> to the synth dictionary .info file
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at languagetool-tools/src/main/java/org/languagetool/tools/SynthDictionaryBuilder.java:121 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of languagetool-org/languagetool@2e990059ce (2026-09-06). Data as JSON: /api/errors/399d51fb617a5800. Report an issue: GitHub.