gohugoio/hugo · error

language name cannot be empty

Error message

language name cannot be empty

What it means

Thrown by LanguagesInternal.init in langs/config.go:155 when the LanguageConfigs map contains the empty-string key. Languages are keyed by language code (e.g. 'en'), so an empty key is rejected before identifier validation and sorting.

Solutions

  1. Inspect the [languages] section of hugo.toml and remove/rename any [languages.""] entry.
  2. Give every language a valid code, e.g. [languages.en] and [languages.fr].
  3. Run hugo config to print the resolved languages map and locate the empty key.

Example fix

// before
[languages]
[languages.""]
title = "X"
// after
[languages.en]
title = "X"
Defensive patterns

Strategy: validation

Validate before calling

// Before building config, reject empty language keys.
for k := range languageConfigs {
    if k == "" { return errors.New("remove empty language key") }
}

Prevention

When it happens

Trigger: Configuring [languages] with an empty-key sub-table (e.g. [languages.""]), or programmatically building a languages map containing the "" key. init runs during config loading before site construction.

Common situations: Malformed TOML/YAML under [languages], a config template that emits a blank language code, or an editing mistake leaving an empty quoted key. A default 'en' language is auto-added when none are configured, so this fires only on an explicit empty key.

Related errors


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

Appendix: source

Thrown at langs/config.go:155

		if defaultContentLanguage == "" {
			defaultContentLanguage = en
		}
		ls.LanguageConfigs[defaultContentLanguage] = LanguageConfig{}
	}

	var (
		defaultSeen bool
		enIdx       int = -1
	)
	for k, v := range ls.LanguageConfigs {
		if !v.Disabled && slices.Contains(disabledLanguages, k) {
			// This language is disabled.
			v.Disabled = true
			ls.LanguageConfigs[k] = v
		}

		if k == "" {
			return "", errors.New("language name cannot be empty")
		}

		if err := paths.ValidateIdentifier(k); err != nil {
			return "", fmt.Errorf("language name %q is invalid: %s", k, err)
		}

		var isDefault bool
		if k == defaultContentLanguage {
			isDefault = true
			defaultSeen = true
		}

		if isDefault && v.Disabled {
			return "", fmt.Errorf("default language %q is disabled", k)
		}

		if !v.Disabled {
			ls.Sorted = append(ls.Sorted, LanguageInternal{Name: k, Default: isDefault, LanguageConfig: v})

View on GitHub (pinned to 52c9bd7908)