gohugoio/hugo · error
language name cannot be empty
Error message
language name cannot be empty
What it means
Raised in LanguagesInternal.init (langs/config.go:155) when a key in the languages config map is the empty string. Language keys become path segments, filesystem identifiers, and lookup keys throughout Hugo, so an empty language name is unusable and rejected outright during config compilation.
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 8a468df065)
Solutions
- Find and remove or rename the empty key in the `languages` section of your config.
- If the config is generated, guard the generator so the language key variable is non-empty before writing.
- Validate merged config with `hugo config | grep -A5 languages` after fixing.
Example fix
# before (hugo.yaml)
languages:
"":
label: English
# after
languages:
en:
label: English Defensive patterns
Strategy: validation
Validate before calling
// Reject empty language keys before passing config to Hugo
for lang := range cfg.GetStringMap("languages") {
if strings.TrimSpace(lang) == "" {
return errors.New("empty language key in [languages]")
}
} Prevention
- Never write [languages.""] or a blank key in YAML languages maps
- Generate language config from a validated list of language codes
- Lint config files for empty map keys in CI
When it happens
Trigger: A `languages` config map containing an empty-string key — e.g. YAML `languages: { "": {...} }`, a templated/generated config emitting an empty key, or programmatic config (config.Provider.Set) inserting an empty language name.
Common situations: Generated or scripted configs (environment substitution producing an empty value for the language key), YAML quirks where a key resolves to empty, or accidental stray entries when restructuring a multilingual config.
Related errors
- failed to create config: %w
- language name %q is invalid: %s
- default language %q is disabled
- defaultContentLanguage %q not found in languages configurati
- redirects must have either From or FromRe set
AI-assisted analysis of gohugoio/hugo@8a468df065 (2026-07-31).
Data as JSON: /data/errors/ee3ced071a4fb2c1.json.
Report an issue: GitHub ↗.