{"id":"551ca5e6af5e3207","repo":"gohugoio/hugo","slug":"default-language-q-is-disabled","errorCode":null,"errorMessage":"default language %q is disabled","messagePattern":"default language %q is disabled","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"langs/config.go","lineNumber":169,"sourceCode":"\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})\n\t\t}\n\t}\n\n\t// Sort by weight if set, then by name.\n\tsort.SliceStable(ls.Sorted, func(i, j int) bool {\n\t\tri, rj := ls.Sorted[i], ls.Sorted[j]\n\t\tif ri.Weight == rj.Weight {\n\t\t\treturn ri.Name < rj.Name\n\t\t}\n\t\tif rj.Weight == 0 {\n\t\t\treturn true\n\t\t}\n\t\tif ri.Weight == 0 {\n\t\t\treturn false","sourceCodeStart":151,"sourceCodeEnd":187,"githubUrl":"https://github.com/gohugoio/hugo/blob/8a468df065a75c1c7cf9f6850f32148746590ea5/langs/config.go#L151-L187","documentation":"Raised in LanguagesInternal.init (langs/config.go:169) when the language matching defaultContentLanguage is disabled — either via its own `disabled: true` setting or by appearing in `disableLanguages`. Hugo must always render the default content language (it anchors URL structure and fallbacks), so disabling it is a contradiction rejected at config time.","triggerScenarios":"Config with `defaultContentLanguage = \"en\"` plus `disableLanguages = [\"en\"]`, or `[languages.en] disabled = true` while en is (explicitly or by default) the defaultContentLanguage.","commonSituations":"Trying to temporarily turn off the primary language during a migration to multilingual, forgetting that defaultContentLanguage defaults to \"en\" when disabling en, or environment-specific config overlays disabling the wrong language.","solutions":["Change defaultContentLanguage to a language that remains enabled.","Remove the default language from disableLanguages (or drop `disabled = true` on it).","If you meant to retire that language, first switch defaultContentLanguage, then disable it."],"exampleFix":"# before\ndefaultContentLanguage = \"en\"\ndisableLanguages = [\"en\"]\n# after\ndefaultContentLanguage = \"fr\"\ndisableLanguages = [\"en\"]","handlingStrategy":"validation","validationCode":"def := cfg.GetString(\"defaultContentLanguage\")\nif langCfg, ok := cfg.GetStringMap(\"languages\")[def].(map[string]any); ok {\n    if disabled, _ := langCfg[\"disabled\"].(bool); disabled {\n        return fmt.Errorf(\"defaultContentLanguage %q is disabled\", def)\n    }\n}\nfor _, d := range cfg.GetStringSlice(\"disableLanguages\") {\n    if d == def { return fmt.Errorf(\"defaultContentLanguage %q is in disableLanguages\", def) }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Never list defaultContentLanguage in disableLanguages or set its disabled=true","When disabling a language, first change defaultContentLanguage to an enabled one","Cross-check defaultContentLanguage against disabled flags in a config CI lint"],"tags":["hugo","config","multilingual","validation"],"analyzedSha":"8a468df065a75c1c7cf9f6850f32148746590ea5","analyzedAt":"2026-07-31T21:23:07.045Z","schemaVersion":2}