public boolean isLanguageNameValid() {
    this.languageNameValidationMessage = null; // reset
    this.languageNameWarningMessage = null; // reset

    if (language.length() > LENGTH_LIMIT) {
      this.uLocale = null;
      this.languageNameValidationMessage = msgs.get("jsf.language.validation.Invalid");
      return false;
    }

    // Cannot use FacesMessages as they are request scoped.
    // Cannot use UI binding as they don't work in Page scoped beans
    // TODO Use the new (since 1.7) FlashScopeBean

    // Check that locale Id is syntactically valid
    LocaleId localeId;
    try {
      localeId = new LocaleId(language);
    } catch (IllegalArgumentException iaex) {
      this.languageNameValidationMessage = msgs.get("jsf.language.validation.Invalid");
      return false;
    }

    // check for already registered languages
    if (localeServiceImpl.localeExists(localeId)) {
      this.languageNameValidationMessage = msgs.get("jsf.language.validation.Existing");
      return false;
    }

    // Check for plural forms
    if (resourceUtils.getPluralForms(localeId, false) == null) {
      this.languageNameWarningMessage = msgs.get("jsf.language.validation.UnknownPluralForm");
    }

    // Check for similar already registered languages (warning)
    List<HLocale> similarLangs = localeDAO.findBySimilarLocaleId(localeId);
    if (similarLangs.size() > 0) {
      this.languageNameWarningMessage =
          msgs.get("jsf.language.validation.SimilarLocaleFound")
              + similarLangs.get(0).getLocaleId().getId();
    }

    return true;
  }