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
- Inspect the [languages] section of hugo.toml and remove/rename any [languages.""] entry.
- Give every language a valid code, e.g. [languages.en] and [languages.fr].
- 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
- Validate the [languages] block with hugo config before building.
- Always key languages by a valid BCP-47-ish code.
- Treat an empty language key as a config-generation bug.
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
- failed to decode languages config
- failed to decode config for language
- invalid language configuration for
- language not found
- config needs a filename
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)