gohugoio/hugo · error

invalid language configuration for

Error message

invalid language configuration for %q

What it means

Returned by Configs.Init when iterating over c.Base.Languages.Config.Sorted and a language name is not found in LanguageConfigMap. The sorted list is the source of truth for declared languages; a missing entry means the language was declared in one structure but never materialized in the per-language config map, leaving Init unable to construct a langs.Language.

Solutions

  1. Ensure every entry under `languages` has a matching per-language config block.
  2. Re-check environment overrides (--environment) for partial language removal.
  3. Disable the language cleanly via `disableLanguages` rather than deleting its block.
  4. Run `hugo config --format toml` to dump and inspect the merged languages map.

Example fix

// before
[languages.en]
weight = 1
# (no [languages.fr] block but fr referenced elsewhere)
// after
[languages.en]
weight = 1
[languages.fr]
weight = 2
Defensive patterns

Strategy: validation

Validate before calling

func languagesConsistent(sorted []langSorted, m map[string]*langConfig) error {
  for _, f := range sorted { if _, ok := m[f.Name]; !ok { return fmt.Errorf("language %q declared but not configured", f.Name) } }
  return nil
}

Prevention

When it happens

Trigger: An inconsistency between the languages sorted list (typically populated from the `languages` config block) and LanguageConfigMap (built during config decode). Caused by partial config overrides, a custom config loader that mutates one structure but not the other, or a bug in a Hugo module that reorders languages.

Common situations: Multi-language sites with environment-specific config overlays that drop a language definition; theme+project config merges where the theme declares a language the project does not; experimental Hugo versions where the matrix/roles feature reshapes language config.

Related errors


AI-assisted analysis of gohugoio/hugo@52c9bd7908 (2026-08-09). Data as JSON: /api/errors/03528e5b371e92e3. Report an issue: GitHub.

Appendix: source

Thrown at config/allconfig/allconfig.go:877

		if l.C.transientErr != nil {
			return l.C.transientErr
		}
	}
	return nil
}

func (c *Configs) IsZero() bool {
	// A config always has at least one language.
	return c == nil || len(c.Languages) == 0
}

func (c *Configs) Init(sourceFs afero.Fs, logger loggers.Logger) error {
	var languages langs.Languages

	for _, f := range c.Base.Languages.Config.Sorted {
		v, found := c.LanguageConfigMap[f.Name]
		if !found {
			return fmt.Errorf("invalid language configuration for %q", f.Name)
		}
		language, err := langs.NewLanguage(f.Name, c.Base.DefaultContentLanguage, v.TimeZone, f.LanguageConfig, logger)
		if err != nil {
			return err
		}
		languages = append(languages, language)
	}

	// Filter out disabled languages.
	var n int
	for _, l := range languages {
		if !l.Disabled {
			languages[n] = l
			n++
		}
	}
	languages = languages[:n]

View on GitHub (pinned to 52c9bd7908)