@@ -800,28 +800,56 @@ func (c *Configs) IsZero() bool {
800800
801801func (c * Configs ) Init () error {
802802 var languages langs.Languages
803- defaultContentLanguage := c .Base .DefaultContentLanguage
804- for k , v := range c .LanguageConfigMap {
805- languageConf := v .Languages [k ]
806- language , err := langs .NewLanguage (k , defaultContentLanguage , v .TimeZone , languageConf )
807- if err != nil {
808- return err
803+
804+ var langKeys []string
805+ var hasEn bool
806+
807+ const en = "en"
808+
809+ for k := range c .LanguageConfigMap {
810+ langKeys = append (langKeys , k )
811+ if k == en {
812+ hasEn = true
809813 }
810- languages = append (languages , language )
811814 }
812815
813- // Sort the sites by language weight (if set) or lang.
814- sort .Slice (languages , func (i , j int ) bool {
815- li := languages [i ]
816- lj := languages [j ]
816+ // Sort the LanguageConfigSlice by language weight (if set) or lang.
817+ sort .Slice (langKeys , func (i , j int ) bool {
818+ ki := langKeys [i ]
819+ kj := langKeys [j ]
820+ lki := c .LanguageConfigMap [ki ]
821+ lkj := c .LanguageConfigMap [kj ]
822+ li := lki .Languages [ki ]
823+ lj := lkj .Languages [kj ]
817824 if li .Weight != lj .Weight {
818825 return li .Weight < lj .Weight
819826 }
820- return li . Lang < lj . Lang
827+ return ki < kj
821828 })
822829
823- for _ , l := range languages {
824- c .LanguageConfigSlice = append (c .LanguageConfigSlice , c .LanguageConfigMap [l .Lang ])
830+ // See issue #13646.
831+ defaultConfigLanguageFallback := en
832+ if ! hasEn {
833+ // Pick the first one.
834+ defaultConfigLanguageFallback = langKeys [0 ]
835+ }
836+
837+ if c .Base .DefaultContentLanguage == "" {
838+ c .Base .DefaultContentLanguage = defaultConfigLanguageFallback
839+ }
840+
841+ for _ , k := range langKeys {
842+ v := c .LanguageConfigMap [k ]
843+ if v .DefaultContentLanguage == "" {
844+ v .DefaultContentLanguage = defaultConfigLanguageFallback
845+ }
846+ c .LanguageConfigSlice = append (c .LanguageConfigSlice , v )
847+ languageConf := v .Languages [k ]
848+ language , err := langs .NewLanguage (k , c .Base .DefaultContentLanguage , v .TimeZone , languageConf )
849+ if err != nil {
850+ return err
851+ }
852+ languages = append (languages , language )
825853 }
826854
827855 // Filter out disabled languages.
@@ -836,12 +864,12 @@ func (c *Configs) Init() error {
836864
837865 var languagesDefaultFirst langs.Languages
838866 for _ , l := range languages {
839- if l .Lang == defaultContentLanguage {
867+ if l .Lang == c . Base . DefaultContentLanguage {
840868 languagesDefaultFirst = append (languagesDefaultFirst , l )
841869 }
842870 }
843871 for _ , l := range languages {
844- if l .Lang != defaultContentLanguage {
872+ if l .Lang != c . Base . DefaultContentLanguage {
845873 languagesDefaultFirst = append (languagesDefaultFirst , l )
846874 }
847875 }
@@ -927,17 +955,48 @@ func (c Configs) GetByLang(lang string) config.AllProvider {
927955 return nil
928956}
929957
958+ func newDefaultConfig () * Config {
959+ return & Config {
960+ Taxonomies : map [string ]string {"tag" : "tags" , "category" : "categories" },
961+ Sitemap : config.SitemapConfig {Priority : - 1 , Filename : "sitemap.xml" },
962+ RootConfig : RootConfig {
963+ Environment : hugo .EnvironmentProduction ,
964+ TitleCaseStyle : "AP" ,
965+ PluralizeListTitles : true ,
966+ CapitalizeListTitles : true ,
967+ StaticDir : []string {"static" },
968+ SummaryLength : 70 ,
969+ Timeout : "60s" ,
970+
971+ CommonDirs : config.CommonDirs {
972+ ArcheTypeDir : "archetypes" ,
973+ ContentDir : "content" ,
974+ ResourceDir : "resources" ,
975+ PublishDir : "public" ,
976+ ThemesDir : "themes" ,
977+ AssetDir : "assets" ,
978+ LayoutDir : "layouts" ,
979+ I18nDir : "i18n" ,
980+ DataDir : "data" ,
981+ },
982+ },
983+ }
984+ }
985+
930986// fromLoadConfigResult creates a new Config from res.
931987func fromLoadConfigResult (fs afero.Fs , logger loggers.Logger , res config.LoadConfigResult ) (* Configs , error ) {
932988 if ! res .Cfg .IsSet ("languages" ) {
933989 // We need at least one
934990 lang := res .Cfg .GetString ("defaultContentLanguage" )
991+ if lang == "" {
992+ lang = "en"
993+ }
935994 res .Cfg .Set ("languages" , maps.Params {lang : maps.Params {}})
936995 }
937996 bcfg := res .BaseConfig
938997 cfg := res .Cfg
939998
940- all := & Config {}
999+ all := newDefaultConfig ()
9411000
9421001 err := decodeConfigFromParams (fs , logger , bcfg , cfg , all , nil )
9431002 if err != nil {
@@ -947,6 +1006,7 @@ func fromLoadConfigResult(fs afero.Fs, logger loggers.Logger, res config.LoadCon
9471006 langConfigMap := make (map [string ]* Config )
9481007
9491008 languagesConfig := cfg .GetStringMap ("languages" )
1009+
9501010 var isMultihost bool
9511011
9521012 if err := all .CompileConfig (logger ); err != nil {
0 commit comments