Repository: gohugoio/hugo (language: go)

Issue:
multilingual multihost: Processed image not copied to non-default content languages
<details>
<summary>failing test case</summary>

```go
func TestFoo(t *testing.T) {
	files := `
-- hugo.toml --
defaultContentLanguage = 'de'
disableKinds = ['rss','sitemap','taxonomy','term']

[languages.de]
baseURL = 'https://de.example.org/'
contentDir = 'content/de'
weight = 1

[languages.en]
baseURL = 'https://en.example.org/'
contentDir = 'content/en'
weight = 2
-- content/de/mybundle/index.md --
---
title: mybundle-de
---
-- content/de/mybundle/pixel.png --
iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==
-- content/en/mybundle/index.md --
---
title: mybundle-en
---
-- layouts/_default/single.html --
{{ with .Resources.Get "pixel.png" }}
  {{ with .Resize "2x2" }}
    {{ .RelPermalink }}|
  {{ end }}
{{ end }}
`

	b := Test(t, files)

	b.AssertFileExists("public/de/mybundle/index.html", true)
	b.AssertFileExists("public/en/mybundle/index.html", true)

	b.AssertFileExists("public/de/mybundle/pixel.png", true)
	b.AssertFileExists("public/en/mybundle/pixel.png", true)

	b.AssertFileExists("public/de/mybundle/pixel_hu8aa3346827e49d756ff4e630147c42b5_70_2x2_resize_box_3.png", true)
	// failing test below
	b.AssertFileExists("public/en/mybundle/pixel_hu8aa3346827e49d756ff4e630147c42b5_70_2x2_resize_box_3.png", true)
}

```
</details>
<br>



Reference: <https://discourse.gohugo.io/t/issue-with-images-in-a-multilingual-multihost-configuration/48501>


Discussion / hints:
@jmooring I will have a look at this, just wanted to chime in and say I appreciate the failing test cases. It makes it so much easier to dig into these issues.

Fix patch:
diff --git a/resources/image_cache.go b/resources/image_cache.go
index f9770ffc111..d824c5d1a06 100644
--- a/resources/image_cache.go
+++ b/resources/image_cache.go
@@ -39,7 +39,16 @@ func (c *ImageCache) getOrCreate(
 ) (*resourceAdapter, error) {
 	relTarget := parent.relTargetPathFromConfig(conf)
 	relTargetPath := relTarget.TargetPath()
-	memKey := dynacache.CleanKey(relTargetPath)
+	memKey := relTargetPath
+
+	// For multihost sites, we duplicate language versions of the same resource,
+	// so we need to include the language in the key.
+	// Note that we don't need to include the language in the file cache key,
+	// as the hash will take care of any different content.
+	if c.pathSpec.Cfg.IsMultihost() {
+		memKey = c.pathSpec.Lang() + memKey
+	}
+	memKey = dynacache.CleanKey(memKey)
 
 	v, err := c.mcache.GetOrCreate(memKey, func(key string) (*resourceAdapter, error) {
 		var img *imageResource


Test patch:
diff --git a/hugolib/hugo_sites_multihost_test.go b/hugolib/hugo_sites_multihost_test.go
index a9aad67b22d..4b779ee9216 100644
--- a/hugolib/hugo_sites_multihost_test.go
+++ b/hugolib/hugo_sites_multihost_test.go
@@ -162,6 +162,52 @@ title: "Mybundle fr"
 	b.AssertFileContent("public/fr/section/mybundle/styles.min.css", ".body{color:french}")
 }
 
+func TestResourcePerLanguageIssue12163(t *testing.T) {
+	files := `
+-- hugo.toml --
+defaultContentLanguage = 'de'
+disableKinds = ['rss','sitemap','taxonomy','term']
+
+[languages.de]
+baseURL = 'https://de.example.org/'
+contentDir = 'content/de'
+weight = 1
+
+[languages.en]
+baseURL = 'https://en.example.org/'
+contentDir = 'content/en'
+weight = 2
+-- content/de/mybundle/index.md --
+---
+title: mybundle-de
+---
+-- content/de/mybundle/pixel.png --
+iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==
+-- content/en/mybundle/index.md --
+---
+title: mybundle-en
+---
+-- layouts/_default/single.html --
+{{ with .Resources.Get "pixel.png" }}
+  {{ with .Resize "2x2" }}
+    {{ .RelPermalink }}|
+  {{ end }}
+{{ end }}
+`
+
+	b := Test(t, files)
+
+	b.AssertFileExists("public/de/mybundle/index.html", true)
+	b.AssertFileExists("public/en/mybundle/index.html", true)
+
+	b.AssertFileExists("public/de/mybundle/pixel.png", true)
+	b.AssertFileExists("public/en/mybundle/pixel.png", true)
+
+	b.AssertFileExists("public/de/mybundle/pixel_hu8aa3346827e49d756ff4e630147c42b5_70_2x2_resize_box_3.png", true)
+	// failing test below
+	b.AssertFileExists("public/en/mybundle/pixel_hu8aa3346827e49d756ff4e630147c42b5_70_2x2_resize_box_3.png", true)
+}
+
 func TestMultihostResourceOneBaseURLWithSuPath(t *testing.T) {
 	files := `
 -- hugo.toml --