{"record":{"id":"ee3ced071a4fb2c1","repo":"gohugoio/hugo","slug":"language-name-cannot-be-empty","errorCode":null,"errorMessage":"language name cannot be empty","messagePattern":"language name cannot be empty","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"langs/config.go","lineNumber":155,"sourceCode":"\t\tif defaultContentLanguage == \"\" {\n\t\t\tdefaultContentLanguage = en\n\t\t}\n\t\tls.LanguageConfigs[defaultContentLanguage] = LanguageConfig{}\n\t}\n\n\tvar (\n\t\tdefaultSeen bool\n\t\tenIdx       int = -1\n\t)\n\tfor k, v := range ls.LanguageConfigs {\n\t\tif !v.Disabled && slices.Contains(disabledLanguages, k) {\n\t\t\t// This language is disabled.\n\t\t\tv.Disabled = true\n\t\t\tls.LanguageConfigs[k] = v\n\t\t}\n\n\t\tif k == \"\" {\n\t\t\treturn \"\", errors.New(\"language name cannot be empty\")\n\t\t}\n\n\t\tif err := paths.ValidateIdentifier(k); err != nil {\n\t\t\treturn \"\", fmt.Errorf(\"language name %q is invalid: %s\", k, err)\n\t\t}\n\n\t\tvar isDefault bool\n\t\tif k == defaultContentLanguage {\n\t\t\tisDefault = true\n\t\t\tdefaultSeen = true\n\t\t}\n\n\t\tif isDefault && v.Disabled {\n\t\t\treturn \"\", fmt.Errorf(\"default language %q is disabled\", k)\n\t\t}\n\n\t\tif !v.Disabled {\n\t\t\tls.Sorted = append(ls.Sorted, LanguageInternal{Name: k, Default: isDefault, LanguageConfig: v})","sourceCodeStart":137,"sourceCodeEnd":173,"githubUrl":"https://github.com/gohugoio/hugo/blob/52c9bd7908b4d02d4d0ff8f82a888834d6ee10d2/langs/config.go#L137-L173","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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."],"exampleFix":"// before\n[languages]\n[languages.\"\"]\ntitle = \"X\"\n// after\n[languages.en]\ntitle = \"X\"","handlingStrategy":"validation","validationCode":"// Before building config, reject empty language keys.\nfor k := range languageConfigs {\n    if k == \"\" { return errors.New(\"remove empty language key\") }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["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."],"tags":["config","languages","i18n","validation"],"backgroundTag":null,"analyzedSha":"52c9bd7908b4d02d4d0ff8f82a888834d6ee10d2","analyzedAt":"2026-08-09T21:49:36.660Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}