From 1005556c2f64f1449a4e8ee384cbfff552a65f39 Mon Sep 17 00:00:00 2001 From: Max Date: Wed, 17 Jul 2024 09:16:11 +0800 Subject: [PATCH] optimize SUI page writeLocaleSource and writeLocaleFiles logic --- sui/core/locale.go | 18 ++++ sui/storages/local/build.go | 179 ++++++++++++++++++------------------ 2 files changed, 108 insertions(+), 89 deletions(-) diff --git a/sui/core/locale.go b/sui/core/locale.go index 1992540b..9c9b7779 100644 --- a/sui/core/locale.go +++ b/sui/core/locale.go @@ -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 +} diff --git a/sui/storages/local/build.go b/sui/storages/local/build.go index 18de54a4..fea32004 100644 --- a/sui/storages/local/build.go +++ b/sui/storages/local/build.go @@ -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) }