Skip to content

Commit

Permalink
Fix defaultContentLanguageInSubdir with only 1 language
Browse files Browse the repository at this point in the history
Fixes #10064
  • Loading branch information
bep committed Jul 8, 2023
1 parent 6c9ea02 commit 92e8670
Show file tree
Hide file tree
Showing 12 changed files with 154 additions and 101 deletions.
4 changes: 2 additions & 2 deletions commands/hugobuilder.go
Original file line number Diff line number Diff line change
Expand Up @@ -1042,8 +1042,8 @@ func (c *hugoBuilder) rebuildSites(events []fsnotify.Event) error {
if c.fastRenderMode {
c.withConf(func(conf *commonConfig) {
// Make sure we always render the home pages
for _, l := range conf.configs.Languages {
langPath := h.GetLangSubDir(l.Lang)
for _, l := range conf.configs.ConfigLangs() {
langPath := l.LanguagePrefix()
if langPath != "" {
langPath = langPath + "/"
}
Expand Down
10 changes: 10 additions & 0 deletions config/allconfig/configlanguage.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,16 @@ func (c ConfigLanguage) LanguagesDefaultFirst() langs.Languages {
return c.m.LanguagesDefaultFirst
}

func (c ConfigLanguage) LanguagePrefix() string {
if c.DefaultContentLanguageInSubdir() && c.DefaultContentLanguage() == c.Language().Lang {
return c.Language().Lang
}
if !c.IsMultiLingual() || c.DefaultContentLanguage() == c.Language().Lang {
return ""
}
return c.Language().Lang
}

func (c ConfigLanguage) BaseURL() urls.BaseURL {
return c.config.C.BaseURL
}
Expand Down
1 change: 1 addition & 0 deletions config/configProvider.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ type AllProvider interface {
Language() *langs.Language
Languages() langs.Languages
LanguagesDefaultFirst() langs.Languages
LanguagePrefix() string
BaseURL() urls.BaseURL
BaseURLLiveReload() urls.BaseURL
Environment() string
Expand Down
57 changes: 39 additions & 18 deletions helpers/url_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -109,25 +109,38 @@ func doTestAbsURL(t *testing.T, defaultInSubDir, addLanguage, multilingual bool,
"weight": 10,
},
})
v.Set("defaultContentLanguage", "en")
} else {
v.Set("defaultContentLanguage", lang)
v.Set("languages", map[string]any{
lang: map[string]interface{}{
"weight": 10,
},
})
}
v.Set("defaultContentLanguage", "en")

v.Set("defaultContentLanguageInSubdir", defaultInSubDir)
v.Set("baseURL", test.baseURL)

var configLang string
if multilingual {
configLang = lang
}
defaultContentLanguage := lang
if multilingual {
defaultContentLanguage = "en"
}

p := newTestPathSpecFromCfgAndLang(v, configLang)

output := p.AbsURL(test.input, addLanguage)
expected := test.expected
if multilingual && addLanguage {
if !defaultInSubDir && lang == "en" {
expected = strings.Replace(expected, "MULTI", "", 1)
} else {
expected = strings.Replace(expected, "MULTI", lang+"/", 1)
}
if addLanguage {
addLanguage = defaultInSubDir && lang == defaultContentLanguage
addLanguage = addLanguage || (lang != defaultContentLanguage && multilingual)
}
if addLanguage {
expected = strings.Replace(expected, "MULTI", lang+"/", 1)
} else {
expected = strings.Replace(expected, "MULTI", "", 1)
}
Expand Down Expand Up @@ -162,8 +175,16 @@ func doTestRelURL(t testing.TB, defaultInSubDir, addLanguage, multilingual bool,
"weight": 10,
},
})
v.Set("defaultContentLanguage", "en")
} else {
v.Set("defaultContentLanguage", lang)
v.Set("languages", map[string]any{
lang: map[string]interface{}{
"weight": 10,
},
})
}
v.Set("defaultContentLanguage", "en")

v.Set("defaultContentLanguageInSubdir", defaultInSubDir)

tests := []struct {
Expand Down Expand Up @@ -209,25 +230,25 @@ func doTestRelURL(t testing.TB, defaultInSubDir, addLanguage, multilingual bool,
}

for i, test := range tests {
c.Run(fmt.Sprintf("%v/%t%t%t/%s", test, defaultInSubDir, addLanguage, multilingual, lang), func(c *qt.C) {
c.Run(fmt.Sprintf("%v/defaultInSubDir=%t;addLanguage=%t;multilingual=%t/%s", test, defaultInSubDir, addLanguage, multilingual, lang), func(c *qt.C) {

v.Set("baseURL", test.baseURL)
v.Set("canonifyURLs", test.canonify)
var configLang string
defaultContentLanguage := lang
if multilingual {
configLang = lang
defaultContentLanguage = "en"
}
p := newTestPathSpecFromCfgAndLang(v, configLang)
p := newTestPathSpecFromCfgAndLang(v, lang)

output := p.RelURL(test.input, addLanguage)

expected := test.expected
if multilingual && addLanguage {
if !defaultInSubDir && lang == "en" {
expected = strings.Replace(expected, "MULTI", "", 1)
} else {
expected = strings.Replace(expected, "MULTI", "/"+lang, 1)
}
if addLanguage {
addLanguage = defaultInSubDir && lang == defaultContentLanguage
addLanguage = addLanguage || (lang != defaultContentLanguage && multilingual)
}
if addLanguage {
expected = strings.Replace(expected, "MULTI", "/"+lang, 1)
} else {
expected = strings.Replace(expected, "MULTI", "", 1)
}
Expand Down
91 changes: 91 additions & 0 deletions hugolib/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1295,3 +1295,94 @@ Home.
b.Assert(b.H.Configs.LanguageConfigSlice[0].Module.Mounts, qt.HasLen, 7)

}

func TestDefaultContentLanguageInSubdirOnlyOneLanguage(t *testing.T) {

t.Run("One language, default in sub dir", func(t *testing.T) {
t.Skip()
t.Parallel()

files := `
-- hugo.toml --
baseURL = "https://example.com"
defaultContentLanguage = "en"
defaultContentLanguageInSubdir = true
disableKinds = ["taxonomy", "term", "page", "section"]
-- content/foo/bar.txt --
Foo.
-- layouts/index.html --
Home.
`
b := NewIntegrationTestBuilder(
IntegrationTestConfig{
T: t,
TxtarString: files,
},
).Build()

b.AssertFileContent("public/en/index.html", "Home.")
b.AssertFileContent("public/en/foo/bar.txt", "Foo.")
})

t.Run("Two languages, default in sub dir", func(t *testing.T) {
t.Skip()
t.Parallel()

files := `
-- hugo.toml --
baseURL = "https://example.com"
defaultContentLanguage = "en"
defaultContentLanguageInSubdir = true
disableKinds = ["taxonomy", "term", "page", "section"]
[languages]
[languages.en]
title = "English Title"
[languages.sv]
title = "Swedish Title"
-- content/foo/bar.txt --
Foo.
-- layouts/index.html --
Home.
`
b := NewIntegrationTestBuilder(
IntegrationTestConfig{
T: t,
TxtarString: files,
},
).Build()

b.AssertFileContent("public/en/index.html", "Home.")
b.AssertFileContent("public/en/foo/bar.txt", "Foo.")
})

t.Run("Two languages, default in root", func(t *testing.T) {
t.Parallel()

files := `
-- hugo.toml --
baseURL = "https://example.com"
defaultContentLanguage = "en"
defaultContentLanguageInSubdir = false
disableKinds = ["taxonomy", "term", "page", "section"]
[languages]
[languages.en]
title = "English Title"
[languages.sv]
title = "Swedish Title"
-- content/foo/bar.txt --
Foo.
-- layouts/index.html --
Home.
`
b := NewIntegrationTestBuilder(
IntegrationTestConfig{
T: t,
TxtarString: files,
},
).Build()

b.AssertFileContent("public/index.html", "Home.")
b.AssertFileContent("public/foo/bar.txt", "Foo.")
})

}
1 change: 1 addition & 0 deletions hugolib/pagebundler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ func TestPageBundlerSiteRegular(t *testing.T) {
fs, cfg := newTestBundleSources(c)
cfg.Set("baseURL", baseURL)
cfg.Set("canonifyURLs", canonify)
cfg.Set("defaultContentLanguageInSubdir", false)

cfg.Set("permalinks", map[string]string{
"a": ":sections/:filename",
Expand Down
36 changes: 2 additions & 34 deletions hugolib/paths/paths.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ func (p *Paths) Lang() string {
return p.Cfg.Language().Lang
}

// TODO1 check this.
func (p *Paths) GetTargetLanguageBasePath() string {
if len(p.Cfg.Languages()) > 1 {
// In a multihost configuration all assets will be published below the language code.
Expand All @@ -110,41 +111,8 @@ func (p *Paths) GetTargetLanguageBasePath() string {
return p.GetLanguagePrefix()
}

func (p *Paths) GetURLLanguageBasePath() string {
if len(p.Cfg.Languages()) > 1 {
return ""
}
return p.GetLanguagePrefix()
}

func (p *Paths) GetLanguagePrefix() string {
if len(p.Cfg.Languages()) < 2 {
return ""
}
defaultLang := p.Cfg.DefaultContentLanguage()
defaultInSubDir := p.Cfg.DefaultContentLanguageInSubdir()
currentLang := p.Cfg.Language().Lang
if currentLang == "" || (currentLang == defaultLang && !defaultInSubDir) {
return ""
}
return currentLang
}

// GetLangSubDir returns the given language's subdir if needed.
func (p *Paths) GetLangSubDir(lang string) string {
if len(p.Cfg.Languages()) < 2 {
return ""
}

if p.Cfg.IsMultihost() {
return ""
}

if lang == "" || (lang == p.Cfg.DefaultContentLanguage() && !p.Cfg.DefaultContentLanguageInSubdir()) {
return ""
}

return lang
return p.Cfg.LanguagePrefix()
}

// AbsPathify creates an absolute path if given a relative path. If already
Expand Down
11 changes: 3 additions & 8 deletions hugolib/site.go
Original file line number Diff line number Diff line change
Expand Up @@ -887,21 +887,16 @@ func (s *Site) getLanguageTargetPathLang(alwaysInSubDir bool) string {

// get any language code to prefix the relative permalink with.
func (s *Site) getLanguagePermalinkLang(alwaysInSubDir bool) string {
if !s.h.isMultiLingual() || s.h.Conf.IsMultihost() {
if s.h.Conf.IsMultihost() {
return ""
}

if alwaysInSubDir {
if s.h.Conf.IsMultiLingual() && alwaysInSubDir {
return s.Language().Lang
}

isDefault := s.Language().Lang == s.conf.DefaultContentLanguage

if !isDefault || s.conf.DefaultContentLanguageInSubdir {
return s.Language().Lang
}
return s.GetLanguagePrefix()

return ""
}

func (s *Site) getTaxonomyKey(key string) string {
Expand Down
11 changes: 3 additions & 8 deletions hugolib/site_new.go
Original file line number Diff line number Diff line change
Expand Up @@ -470,16 +470,11 @@ func (s *Site) IsMultiLingual() bool {
}

func (s *Site) LanguagePrefix() string {
conf := s.s.Conf
if !conf.IsMultiLingual() {
prefix := s.GetLanguagePrefix()
if prefix == "" {
return ""
}

if !conf.DefaultContentLanguageInSubdir() && s.language.Lang == conf.DefaultContentLanguage() {
return ""
}

return "/" + s.language.Lang
return "/" + prefix
}

// Returns the identity of this site.
Expand Down
29 changes: 0 additions & 29 deletions hugolib/site_url_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,35 +38,6 @@ var urlFakeSource = [][2]string{
{filepath.FromSlash("content/blue/doc2.md"), slugDoc2},
}

func TestPageCount(t *testing.T) {
t.Parallel()
c := qt.New(t)
cfg, fs := newTestCfg()
cfg.Set("uglyURLs", false)
cfg.Set("paginate", 10)
configs, err := loadTestConfigFromProvider(cfg)
c.Assert(err, qt.IsNil)

writeSourcesToSource(t, "", fs, urlFakeSource...)
s := buildSingleSite(t, deps.DepsCfg{Fs: fs, Configs: configs}, BuildCfg{})

_, err = s.Fs.WorkingDirReadOnly.Open("public/blue")
if err != nil {
t.Errorf("No indexed rendered.")
}

for _, pth := range []string{
"public/sd1/foo/index.html",
"public/sd2/index.html",
"public/sd3/index.html",
"public/sd4.html",
} {
if _, err := s.Fs.WorkingDirReadOnly.Open(filepath.FromSlash(pth)); err != nil {
t.Errorf("No alias rendered: %s", pth)
}
}
}

func TestUglyURLsPerSection(t *testing.T) {
t.Parallel()

Expand Down
1 change: 1 addition & 0 deletions hugolib/sitemap_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ func doTestSitemapOutput(t *testing.T, internal bool) {
c := qt.New(t)
cfg, fs := newTestCfg()
cfg.Set("baseURL", "http://auth/bub/")
cfg.Set("defaultContentLanguageInSubdir", false)
configs, err := loadTestConfigFromProvider(cfg)
c.Assert(err, qt.IsNil)
writeSource(t, fs, "layouts/sitemap.xml", sitemapTemplate)
Expand Down
3 changes: 1 addition & 2 deletions hugolib/testhelpers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -937,8 +937,7 @@ func newTestCfgBasic() (config.Provider, *hugofs.Fs) {
func newTestCfg(withConfig ...func(cfg config.Provider) error) (config.Provider, *hugofs.Fs) {
mm := afero.NewMemMapFs()
cfg := config.New()
// Default is false, but true is easier to use as default in tests
cfg.Set("defaultContentLanguageInSubdir", true)
cfg.Set("defaultContentLanguageInSubdir", false)
cfg.Set("publishDir", "public")

fs := hugofs.NewFromOld(hugofs.NewBaseFileDecorator(mm), cfg)
Expand Down

0 comments on commit 92e8670

Please sign in to comment.