optimize SUI page writeLocaleSource and writeLocaleFiles logic

This commit is contained in:
Max 2024-07-17 09:16:11 +08:00
parent 61f297b3dc
commit 1005556c2f
2 changed files with 108 additions and 89 deletions

View file

@ -67,3 +67,21 @@ func (locale *Locale) Merge(locale2 Locale) {
}
}
}
// ParseKeys match
func (locale *Locale) ParseKeys() {
if locale.Keys == nil {
locale.Keys = map[string]string{}
}
if locale.Messages == nil {
locale.Messages = map[string]string{}
}
for key, msgKey := range locale.Keys {
if message, has := locale.Messages[msgKey]; has {
locale.Keys[key] = message
}
}
return
}

View file

@ -217,6 +217,89 @@ func (tmpl *Template) SyncAssets(option *core.BuildOption) error {
return copyDirectory(sourceRoot, targetRoot)
}
func (tmpl *Template) getLocaleGlobal(name string) core.Locale {
global := core.Locale{
Keys: map[string]string{},
Messages: map[string]string{},
}
file := filepath.Join(tmpl.Root, "__locales", name, "__global.yml")
exist, err := tmpl.local.fs.Exists(file)
if err != nil {
log.Error(`[SUI] Check the global locale file error: %s`, err.Error())
return global
}
if !exist {
return global
}
raw, err := tmpl.local.fs.ReadFile(file)
if err != nil {
log.Error(`[SUI] Read the global locale file error: %s`, err.Error())
return global
}
err = yaml.Unmarshal(raw, &global)
if err != nil {
log.Error(`[SUI] Parse the global locale file error: %s`, err.Error())
return global
}
return global
}
func (tmpl *Template) getLocale(name string, route string, pageOnly ...bool) core.Locale {
file := filepath.Join(tmpl.Root, "__locales", name, fmt.Sprintf("%s.yml", route))
global := tmpl.getLocaleGlobal(name)
// Check the locale file
exist, err := tmpl.local.fs.Exists(file)
if err != nil {
return global
}
if !exist {
return global
}
locale := core.Locale{
Keys: map[string]string{},
Messages: map[string]string{},
Date: global.Date,
Currency: global.Currency,
Number: global.Number,
}
raw, err := tmpl.local.fs.ReadFile(file)
if err != nil {
log.Error(`[SUI] Read the locale file error: %s`, err.Error())
return global
}
err = yaml.Unmarshal(raw, &locale)
if err != nil {
log.Error(`[SUI] Parse the locale file error: %s`, err.Error())
return global
}
if len(pageOnly) == 0 || !pageOnly[0] {
// Merge the global
for key, message := range global.Keys {
if _, ok := locale.Keys[key]; !ok {
locale.Keys[key] = message
}
}
for key, message := range global.Messages {
if _, ok := locale.Messages[key]; !ok {
locale.Messages[key] = message
}
}
}
return locale
}
// Build is the struct for the public
func (page *Page) Build(globalCtx *core.GlobalBuildContext, option *core.BuildOption) ([]string, error) {
@ -399,89 +482,6 @@ func (page *Page) localeFiles(data map[string]interface{}) map[string]string {
return roots
}
func (page *Page) localeGlobal(name string) core.Locale {
global := core.Locale{
Keys: map[string]string{},
Messages: map[string]string{},
}
file := filepath.Join(page.tmpl.Root, "__locales", name, "__global.yml")
exist, err := page.tmpl.local.fs.Exists(file)
if err != nil {
log.Error(`[SUI] Check the global locale file error: %s`, err.Error())
return global
}
if !exist {
return global
}
raw, err := page.tmpl.local.fs.ReadFile(file)
if err != nil {
log.Error(`[SUI] Read the global locale file error: %s`, err.Error())
return global
}
err = yaml.Unmarshal(raw, &global)
if err != nil {
log.Error(`[SUI] Parse the global locale file error: %s`, err.Error())
return global
}
return global
}
func (page *Page) locale(name string, pageOnly ...bool) core.Locale {
file := filepath.Join(page.tmpl.Root, "__locales", name, fmt.Sprintf("%s.yml", page.Route))
global := page.localeGlobal(name)
// Check the locale file
exist, err := page.tmpl.local.fs.Exists(file)
if err != nil {
return global
}
if !exist {
return global
}
locale := core.Locale{
Keys: map[string]string{},
Messages: map[string]string{},
Date: global.Date,
Currency: global.Currency,
Number: global.Number,
}
raw, err := page.tmpl.local.fs.ReadFile(file)
if err != nil {
log.Error(`[SUI] Read the locale file error: %s`, err.Error())
return global
}
err = yaml.Unmarshal(raw, &locale)
if err != nil {
log.Error(`[SUI] Parse the locale file error: %s`, err.Error())
return global
}
if len(pageOnly) == 0 || !pageOnly[0] {
// Merge the global
for key, message := range global.Keys {
if _, ok := locale.Keys[key]; !ok {
locale.Keys[key] = message
}
}
for key, message := range global.Messages {
if _, ok := locale.Messages[key]; !ok {
locale.Messages[key] = message
}
}
}
return locale
}
func (page *Page) writeLocaleSource(ctx *core.BuildContext, option *core.BuildOption) error {
locales := page.tmpl.Locales()
@ -501,7 +501,7 @@ func (page *Page) writeLocaleSource(ctx *core.BuildContext, option *core.BuildOp
continue
}
locale := page.locale(lc.Value, true)
locale := page.tmpl.getLocale(lc.Value, page.Route, true)
locale.MergeTranslations(translations, prefix)
// Call the hook
@ -560,16 +560,17 @@ func (page *Page) writeLocaleFiles(ctx *core.BuildContext, data map[string]inter
if len(translations) == 0 {
return nil
}
prefix := core.TranslationKeyPrefix(page.Route)
files := page.localeFiles(data)
components := ctx.GetComponents()
for name, file := range files {
locale := page.locale(name)
locale.MergeTranslations(translations)
locale := page.tmpl.getLocale(name, page.Route)
locale.MergeTranslations(translations, prefix)
// Merge the components locale
for _, component := range components {
compLocale := page.locale(component, true)
for _, route := range components {
compLocale := page.tmpl.getLocale(name, route, true)
compLocale.ParseKeys()
locale.Merge(compLocale)
}