Add multilingual multihost support

This commit adds multihost support when more than one language is configured and `baseURL` is set per language.

Updates #4027
This commit is contained in:
Bjørn Erik Pedersen
2017-11-02 08:25:20 +01:00
parent 6233ddf9d1
commit 2e0465764b
14 changed files with 350 additions and 80 deletions

View File

@@ -15,7 +15,6 @@ package hugolib
import (
"errors"
"fmt"
"strings"
"sync"
@@ -37,9 +36,16 @@ type HugoSites struct {
multilingual *Multilingual
// Multihost is set if multilingual and baseURL set on the language level.
multihost bool
*deps.Deps
}
func (h *HugoSites) IsMultihost() bool {
return h != nil && h.multihost
}
// GetContentPage finds a Page with content given the absolute filename.
// Returns nil if none found.
func (h *HugoSites) GetContentPage(filename string) *Page {
@@ -92,6 +98,31 @@ func newHugoSites(cfg deps.DepsCfg, sites ...*Site) (*HugoSites, error) {
h.Deps = sites[0].Deps
// The baseURL may be provided at the language level. If that is true,
// then every language must have a baseURL. In this case we always render
// to a language sub folder, which is then stripped from all the Permalink URLs etc.
var baseURLFromLang bool
for _, s := range sites {
burl := s.Language.GetLocal("baseURL")
if baseURLFromLang && burl == nil {
return h, errors.New("baseURL must be set on all or none of the languages")
}
if burl != nil {
baseURLFromLang = true
}
}
if baseURLFromLang {
for _, s := range sites {
// TODO(bep) multihost check
s.Info.defaultContentLanguageInSubdir = true
s.Cfg.Set("defaultContentLanguageInSubdir", true)
}
h.multihost = true
}
return h, nil
}
@@ -180,41 +211,21 @@ func createSitesFromConfig(cfg deps.DepsCfg) ([]*Site, error) {
sites []*Site
)
multilingual := cfg.Cfg.GetStringMap("languages")
languages := getLanguages(cfg.Cfg)
for _, lang := range languages {
var s *Site
var err error
cfg.Language = lang
s, err = newSite(cfg)
if len(multilingual) == 0 {
l := helpers.NewDefaultLanguage(cfg.Cfg)
cfg.Language = l
s, err := newSite(cfg)
if err != nil {
return nil, err
}
sites = append(sites, s)
}
if len(multilingual) > 0 {
var err error
languages, err := toSortedLanguages(cfg.Cfg, multilingual)
if err != nil {
return nil, fmt.Errorf("Failed to parse multilingual config: %s", err)
}
for _, lang := range languages {
var s *Site
var err error
cfg.Language = lang
s, err = newSite(cfg)
if err != nil {
return nil, err
}
sites = append(sites, s)
}
}
return sites, nil
}
@@ -227,7 +238,12 @@ func (h *HugoSites) reset() {
func (h *HugoSites) createSitesFromConfig() error {
if err := loadLanguageSettings(h.Cfg); err != nil {
return err
}
depsCfg := deps.DepsCfg{Fs: h.Fs, Cfg: h.Cfg}
sites, err := createSitesFromConfig(depsCfg)
if err != nil {
@@ -286,7 +302,7 @@ type BuildCfg struct {
func (h *HugoSites) renderCrossSitesArtifacts() error {
if !h.multilingual.enabled() {
if !h.multilingual.enabled() || h.IsMultihost() {
return nil
}