/** @throws IllegalStateException if no LanguageProfile was {@link #withProfile added}. */
 public LanguageDetector build() throws IllegalStateException {
   if (languageProfiles.isEmpty()) throw new IllegalStateException();
   return new LanguageDetectorImpl(
       NgramFrequencyData.create(languageProfiles, ngramExtractor.getGramLengths()),
       alpha,
       seed,
       shortTextAlgorithm,
       prefixFactor,
       suffixFactor,
       probabilityThreshold,
       minimalConfidence,
       langWeightingMap,
       ngramExtractor);
 }
 /**
  * @throws IllegalStateException if a profile for the same language was added already (must be a
  *     userland bug).
  */
 public LanguageDetectorBuilder withProfile(LanguageProfile languageProfile)
     throws IllegalStateException {
   if (langsAdded.contains(languageProfile.getLocale())) {
     throw new IllegalStateException(
         "A language profile for language " + languageProfile.getLocale() + " was added already!");
   }
   for (Integer gramLength : ngramExtractor.getGramLengths()) {
     if (!languageProfile.getGramLengths().contains(gramLength)) {
       throw new IllegalArgumentException(
           "The NgramExtractor is set to handle "
               + gramLength
               + "-grams but the given language profile for "
               + languageProfile.getLocale()
               + " does not support this!");
     }
   }
   langsAdded.add(languageProfile.getLocale());
   languageProfiles.add(languageProfile);
   return this;
 }