Skip to content

Commit a94681f

Browse files
Use image in fallback language in the app FS for image descriptor
ref #1384
2 parents 26a8e7a + 7ac7ced commit a94681f

File tree

2 files changed

+61
-11
lines changed

2 files changed

+61
-11
lines changed

pkg/lib/web/image.go

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ import (
1414
"github.com/authgear/authgear-server/pkg/util/resource"
1515
)
1616

17+
var imageResolveFsLevelPriority = []resource.FsLevel{
18+
resource.FsLevelApp, resource.FsLevelCustom, resource.FsLevelBuiltin,
19+
}
20+
1721
type languageImage struct {
1822
LanguageTag string
1923
RealLanguageTag string
@@ -151,17 +155,26 @@ func (a ImageDescriptor) viewEffectiveResource(resources []resource.ResourceFile
151155
preferredLanguageTags := view.PreferredLanguageTags()
152156
defaultLanguageTag := view.DefaultLanguageTag()
153157

154-
images := make(map[string]intlresource.LanguageItem)
158+
var fallbackImage *languageImage
159+
images := make(map[resource.FsLevel]map[string]intlresource.LanguageItem)
155160
extractLanguageTag := func(resrc resource.ResourceFile) string {
156161
langTag := imageRegex.FindStringSubmatch(resrc.Location.Path)[1]
157162
return langTag
158163
}
159164
add := func(langTag string, resrc resource.ResourceFile) error {
160-
images[langTag] = languageImage{
165+
fsLevel := resrc.Location.Fs.GetFsLevel()
166+
i := languageImage{
161167
LanguageTag: langTag,
162168
RealLanguageTag: extractLanguageTag(resrc),
163169
Data: resrc.Data,
164170
}
171+
if images[fsLevel] == nil {
172+
images[fsLevel] = make(map[string]intlresource.LanguageItem)
173+
}
174+
images[fsLevel][langTag] = i
175+
if fallbackImage == nil {
176+
fallbackImage = &i
177+
}
165178
return nil
166179
}
167180

@@ -170,22 +183,36 @@ func (a ImageDescriptor) viewEffectiveResource(resources []resource.ResourceFile
170183
return nil, err
171184
}
172185

173-
var items []intlresource.LanguageItem
174-
for _, i := range images {
175-
items = append(items, i)
186+
var matched intlresource.LanguageItem
187+
for _, fsLevel := range imageResolveFsLevelPriority {
188+
var items []intlresource.LanguageItem
189+
imagesInFsLevel, ok := images[fsLevel]
190+
if !ok {
191+
continue
192+
}
193+
194+
for _, i := range imagesInFsLevel {
195+
items = append(items, i)
196+
}
197+
198+
matched, err = intlresource.Match(preferredLanguageTags, defaultLanguageTag, items)
199+
if err == nil {
200+
break
201+
} else if errors.Is(err, intlresource.ErrNoLanguageMatch) {
202+
continue
203+
} else {
204+
return nil, err
205+
}
176206
}
177207

178-
matched, err := intlresource.Match(preferredLanguageTags, defaultLanguageTag, items)
179-
if errors.Is(err, intlresource.ErrNoLanguageMatch) {
180-
if len(items) > 0 {
208+
if matched == nil {
209+
if fallbackImage != nil {
181210
// Use first item in case of no match, to ensure resolution always succeed
182-
matched = items[0]
211+
matched = fallbackImage
183212
} else {
184213
// If no configured translation, fail the resolution process
185214
return nil, resource.ErrResourceNotFound
186215
}
187-
} else if err != nil {
188-
return nil, err
189216
}
190217

191218
tagger := matched.(languageImage)

pkg/lib/web/image_test.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,29 @@ func TestTemplateResource(t *testing.T) {
135135
So(asset.Data, ShouldResemble, pngA)
136136
})
137137

138+
Convey("it should use fallback language in the app fs first", func() {
139+
writeFile(fsA, "en", ".png", pngA)
140+
writeFile(fsB, "jp", ".png", pngB)
141+
142+
asset, err := read(resource.EffectiveResource{
143+
SupportedTags: []string{"en", "jp"},
144+
DefaultTag: "jp",
145+
PreferredTags: []string{"en"},
146+
})
147+
So(err, ShouldBeNil)
148+
So(asset.Path, ShouldEqual, "static/jp/myimage.png")
149+
So(asset.Data, ShouldResemble, pngB)
150+
151+
asset, err = read(resource.EffectiveResource{
152+
SupportedTags: []string{"jp", "zh"},
153+
DefaultTag: "jp",
154+
PreferredTags: []string{"fr"},
155+
})
156+
So(err, ShouldBeNil)
157+
So(asset.Path, ShouldEqual, "static/jp/myimage.png")
158+
So(asset.Data, ShouldResemble, pngB)
159+
})
160+
138161
Convey("it should disallow duplicate resource", func() {
139162
writeFile(fsA, "en", ".png", pngA)
140163
writeFile(fsB, "en", ".png", pngB)

0 commit comments

Comments
 (0)