{"id":"03528e5b371e92e3","repo":"gohugoio/hugo","slug":"invalid-language-configuration-for-q","errorCode":null,"errorMessage":"invalid language configuration for %q","messagePattern":"invalid language configuration for %q","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"config/allconfig/allconfig.go","lineNumber":877,"sourceCode":"\t\tif l.C.transientErr != nil {\n\t\t\treturn l.C.transientErr\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (c *Configs) IsZero() bool {\n\t// A config always has at least one language.\n\treturn c == nil || len(c.Languages) == 0\n}\n\nfunc (c *Configs) Init(sourceFs afero.Fs, logger loggers.Logger) error {\n\tvar languages langs.Languages\n\n\tfor _, f := range c.Base.Languages.Config.Sorted {\n\t\tv, found := c.LanguageConfigMap[f.Name]\n\t\tif !found {\n\t\t\treturn fmt.Errorf(\"invalid language configuration for %q\", f.Name)\n\t\t}\n\t\tlanguage, err := langs.NewLanguage(f.Name, c.Base.DefaultContentLanguage, v.TimeZone, f.LanguageConfig, logger)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tlanguages = append(languages, language)\n\t}\n\n\t// Filter out disabled languages.\n\tvar n int\n\tfor _, l := range languages {\n\t\tif !l.Disabled {\n\t\t\tlanguages[n] = l\n\t\t\tn++\n\t\t}\n\t}\n\tlanguages = languages[:n]\n","sourceCodeStart":859,"sourceCodeEnd":895,"githubUrl":"https://github.com/gohugoio/hugo/blob/8a468df065a75c1c7cf9f6850f32148746590ea5/config/allconfig/allconfig.go#L859-L895","documentation":"In `Configs.Init`, every language in the sorted base `languages` config must have a corresponding compiled per-language config in `LanguageConfigMap`. A missing entry means the merged config is internally inconsistent — a language was declared but its per-language config never compiled — so initialization aborts with this error naming the language key.","triggerScenarios":"A `[languages.<code>]` key present in the base config whose per-language compilation was dropped — typically caused by malformed per-language sections, conflicting language definitions across config dir files (`config/_default/languages.toml`) and modules, or invalid language codes.","commonSituations":"Multilingual sites splitting config across the config directory where a language appears in one file but its config fails/merges away elsewhere; case-mismatched language keys; module-mounted configs adding languages the project half-defines.","solutions":["Check every `[languages.X]` block for consistent, lowercase language keys across all config files and modules.","Consolidate language definitions into one file (e.g. `config/_default/languages.toml`) to avoid partial merges.","Run `hugo config` and compare the `languages` section with what you expect; remove stray or duplicated language keys.","If a theme/module defines languages, ensure your project either fully overrides or fully inherits them."],"exampleFix":"# before: language declared with mismatched key casing across files\n# config/_default/hugo.toml\ndefaultContentLanguage = \"en\"\n# config/_default/languages.toml\n[EN]\nweight = 1\n# after\n[en]\nweight = 1","handlingStrategy":"try-catch","validationCode":"for lang := range languagesConfig {\n    if !langs.IsValidLanguageTag(lang) {\n        return fmt.Errorf(\"invalid language key %q in [languages]\", lang)\n    }\n}","typeGuard":null,"tryCatchPattern":"cfg, err := allconfig.LoadConfig(d)\nif err != nil {\n    var s string\n    if errors.As(err, &s); strings.Contains(err.Error(), \"invalid language configuration\") {\n        // report which language block failed; err wraps the per-language cause\n    }\n    return err\n}","preventionTips":["Use valid BCP 47 tags as [languages] keys (en, en-US, nb) and keep defaultContentLanguage among them","Keep per-language blocks structurally identical to the root config (same key names/types)","Since this error wraps a per-language cause, always print the full wrapped error chain to see which setting inside the language block is bad"],"tags":["hugo","config","i18n","multilingual"],"analyzedSha":"8a468df065a75c1c7cf9f6850f32148746590ea5","analyzedAt":"2026-07-31T21:23:07.045Z","schemaVersion":2}