@@ -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+
1721type 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 )
0 commit comments