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 during dictionary export: the .info file lacks fsa.dict.separator, so outputSeparatorToTab cannot know which character to convert to tabs when dumping the FSA contents.

Source

Thrown at languagetool-tools/src/main/java/org/languagetool/tools/DictionaryExporter.java:92

      System.out.println("Running Morfologik FSADecompile.main with these options: " + Arrays.toString(buildOptions));
      FSADecompile.main(buildOptions);      
    } else {
      String[] buildOptions = {"--exit", "false",
          "-i", binaryDictFile.toString(), 
          "-o", tmpOutputFile.toString()
      };
      System.out.println("Running Morfologik DictDecompile.main with these options: " + Arrays.toString(buildOptions));
      DictDecompile.main(buildOptions);
    }
    outputSeparatorToTab(tmpOutputFile);
    System.out.println("Done. The dictionary export has been written to " + getOutputFilename());
  }
  
  protected void outputSeparatorToTab(File inputFile) throws RuntimeException, IOException {
    File outputFile = new File(getOutputFilename());
    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.");
    }
    boolean hasFrequency = isOptionTrue("fsa.dict.frequency-included");
    String encoding = getOption("fsa.dict.encoding");
    
    try (Scanner scanner = new Scanner(inputFile, encoding);
         Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputFile), encoding))) {
      while (scanner.hasNextLine()) {
        String line = scanner.nextLine();
        String[] parts = line.split(Pattern.quote(separator));
        if (parts.length == 3) {
          if (hasFrequency) { // remove frequency data in the last byte
            parts[2] = parts[2].substring(0, parts[2].length() - 1);
          }
          out.write(parts[1] + "\t" + parts[0] + "\t" + parts[2] + "\n");
        } else if (parts.length == 2) {
//          if (hasFrequency) {
//            out.write(parts[1] + "\n");

View on GitHub (pinned to 2e990059ce)

Solutions

  1. Add fsa.dict.separator=<char> to the dictionary .info file
  2. Ensure the info file passed to DictionaryExporter is the one matching the binary dictionary
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at languagetool-tools/src/main/java/org/languagetool/tools/DictionaryExporter.java:92 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/62fb90b25aebfa2d. Report an issue: GitHub.