From 6283b6e34c7af1ef30e96e64d88e441421ec9c94 Mon Sep 17 00:00:00 2001 From: Max Date: Sat, 20 Aug 2022 16:40:27 +0800 Subject: [PATCH] [add] language pack support for page --- chart/chart_test.go | 2 + chart/lang.go | 13 +++ lang/lang.go | 4 +- page/lang.go | 125 ++++++++++++++++++++++++++ page/page.go | 13 ++- page/page_test.go | 18 +++- page/process_test.go | 3 - tests/langs/zh-hk/pages/lang.yml | 10 +++ tests/pages/lang.page.json | 100 +++++++++++++++++++++ tests/pages/service/compare.page.json | 2 +- 10 files changed, 281 insertions(+), 9 deletions(-) create mode 100644 page/lang.go create mode 100644 tests/langs/zh-hk/pages/lang.yml create mode 100644 tests/pages/lang.page.json diff --git a/chart/chart_test.go b/chart/chart_test.go index afed79f0..150df114 100644 --- a/chart/chart_test.go +++ b/chart/chart_test.go @@ -40,4 +40,6 @@ func check(t *testing.T) { filters := lang.Page.Layout["filters"].([]interface{}) begin := filters[0].(map[string]interface{}) assert.Equal(t, "開始時間", begin["name"]) + + assert.Equal(t, "請選擇開始時間", lang.Filters["開始時間"].Input.Props["placeholder"]) } diff --git a/chart/lang.go b/chart/lang.go index 68c4cd30..667f7407 100644 --- a/chart/lang.go +++ b/chart/lang.go @@ -11,6 +11,19 @@ func (chart *Chart) Lang(trans func(widget string, inst string, value *string) b trans(widget, inst, &chart.Page.Primary) transMap(widget, inst, chart.Page.Layout, trans) chart.Output = transAny(widget, inst, chart.Output, trans) + + // Filters + for name, filter := range chart.Filters { + new := name + trans(widget, inst, &new) + trans(widget, inst, &filter.Label) + delete(chart.Filters, name) + + // Props + transMap(widget, inst, filter.Input.Props, trans) + chart.Filters[new] = filter + } + } func transAny(widget string, inst string, input interface{}, trans func(widget string, inst string, value *string) bool) interface{} { diff --git a/lang/lang.go b/lang/lang.go index 69534959..ddf950f1 100644 --- a/lang/lang.go +++ b/lang/lang.go @@ -12,7 +12,9 @@ import ( func init() { lang.RegisterWidget("tables", "table") lang.RegisterWidget("charts", "chart") - lang.RegisterWidget("kanban", "kanban") + lang.RegisterWidget("kanban", "page") + lang.RegisterWidget("screen", "page") + lang.RegisterWidget("pages", "page") } // Load language packs diff --git a/page/lang.go b/page/lang.go new file mode 100644 index 00000000..9342eabe --- /dev/null +++ b/page/lang.go @@ -0,0 +1,125 @@ +package page + +// Lang for applying a language pack +func (page *Page) Lang(trans func(widget string, inst string, value *string) bool) { + inst := page.Flow.Name + widget := "page" + + trans(widget, inst, &page.Name) + trans(widget, inst, &page.Label) + trans(widget, inst, &page.Description) + trans(widget, inst, &page.Page.Primary) + transMap(widget, inst, page.Page.Layout, trans) + page.Output = transAny(widget, inst, page.Output, trans) + + // Filters + for name, filter := range page.Filters { + new := name + trans(widget, inst, &new) + trans(widget, inst, &filter.Label) + delete(page.Filters, name) + + // Props + transMap(widget, inst, filter.Input.Props, trans) + page.Filters[new] = filter + } + +} + +func transAny(widget string, inst string, input interface{}, trans func(widget string, inst string, value *string) bool) interface{} { + switch input.(type) { + case []interface{}: + values := input.([]interface{}) + transArr(widget, inst, values, trans) + input = values + break + + case map[string]interface{}: + values := input.(map[string]interface{}) + for name, value := range values { + new := name + newValue := value + + switch value.(type) { + case string: + val := value.(string) + trans(widget, inst, &val) + newValue = val + break + + case []interface{}: + vals := value.([]interface{}) + transArr(widget, inst, vals, trans) + newValue = vals + break + + case map[string]interface{}: + vals := value.(map[string]interface{}) + transMap(widget, inst, vals, trans) + newValue = vals + break + } + + trans(widget, inst, &new) + delete(values, name) + values[new] = newValue + } + input = values + break + } + + return input +} + +func transMap(widget string, inst string, values map[string]interface{}, trans func(widget string, inst string, value *string) bool) { + for key, value := range values { + + switch value.(type) { + + case string: + v := value.(string) + trans(widget, inst, &v) + values[key] = v + break + + case []interface{}: + v := value.([]interface{}) + transArr(widget, inst, v, trans) + values[key] = v + break + + case map[string]interface{}: + v := value.(map[string]interface{}) + transMap(widget, inst, v, trans) + values[key] = v + break + } + + } +} + +func transArr(widget string, inst string, values []interface{}, trans func(widget string, inst string, value *string) bool) { + for key, value := range values { + switch value.(type) { + + case string: + v := value.(string) + trans(widget, inst, &v) + values[key] = v + break + + case []interface{}: + v := value.([]interface{}) + transArr(widget, inst, v, trans) + values[key] = v + break + + case map[string]interface{}: + v := value.(map[string]interface{}) + transMap(widget, inst, v, trans) + values[key] = v + break + } + + } +} diff --git a/page/page.go b/page/page.go index 8cbe9efb..98bbfe15 100644 --- a/page/page.go +++ b/page/page.go @@ -6,6 +6,7 @@ import ( jsoniter "github.com/json-iterator/go" "github.com/yaoapp/gou" + "github.com/yaoapp/gou/lang" "github.com/yaoapp/kun/exception" "github.com/yaoapp/kun/log" "github.com/yaoapp/yao/config" @@ -24,15 +25,15 @@ func Load(cfg config.Config) error { var errs error = nil if err := LoadFrom(path.Join(cfg.Root, "/kanban"), ""); err != nil { - log.Trace("load kanban error: %s ", err.Error()) + // log.Trace("load kanban error: %s ", err.Error()) errs = err } if err := LoadFrom(path.Join(cfg.Root, "/screen"), ""); err != nil { - log.Trace("load screen error: %s", err.Error()) + // log.Trace("load screen error: %s", err.Error()) errs = err } if err := LoadFrom(path.Join(cfg.Root, "/pages"), ""); err != nil { - log.Trace("load screen error: %s", err.Error()) + // log.Trace("load screen error: %s", err.Error()) errs = err } @@ -93,6 +94,12 @@ func LoadPage(source []byte, name string) (*Page, error) { page.Prepare() page.SetupAPIs() Pages[name] = page + + // Apply a language pack + if lang.Default != nil { + lang.Default.Apply(Pages[name]) + } + return page, nil } diff --git a/page/page_test.go b/page/page_test.go index 652474c1..8aa90262 100644 --- a/page/page_test.go +++ b/page/page_test.go @@ -1,16 +1,22 @@ package page import ( + "os" "testing" "github.com/stretchr/testify/assert" "github.com/yaoapp/yao/config" + "github.com/yaoapp/yao/lang" "github.com/yaoapp/yao/model" "github.com/yaoapp/yao/query" "github.com/yaoapp/yao/share" ) func TestLoad(t *testing.T) { + + os.Setenv("YAO_LANG", "zh-hk") + lang.Load(config.Conf) + share.DBConnect(config.Conf.DB) model.Load(config.Conf) query.Load(config.Conf) @@ -25,5 +31,15 @@ func check(t *testing.T) { for key := range Pages { keys = append(keys, key) } - assert.Equal(t, 1, len(keys)) + assert.Equal(t, 2, len(keys)) + + lang := Pages["lang"] + output := lang.Output.(map[string]interface{}) + assert.Equal(t, "{{$in}}", output["參數"]) + + filters := lang.Page.Layout["filters"].([]interface{}) + begin := filters[0].(map[string]interface{}) + assert.Equal(t, "開始時間", begin["name"]) + + assert.Equal(t, "請選擇開始時間", lang.Filters["開始時間"].Input.Props["placeholder"]) } diff --git a/page/process_test.go b/page/process_test.go index 0065567f..ef56b914 100644 --- a/page/process_test.go +++ b/page/process_test.go @@ -8,7 +8,6 @@ import ( "github.com/stretchr/testify/assert" "github.com/yaoapp/gou" "github.com/yaoapp/kun/any" - "github.com/yaoapp/kun/utils" "github.com/yaoapp/yao/config" _ "github.com/yaoapp/yao/helper" "github.com/yaoapp/yao/model" @@ -68,8 +67,6 @@ func TestProcessData(t *testing.T) { } process := gou.NewProcess("xiang.page.Data", args...) response := ProcessData(process) - utils.Dump(response) - assert.NotNil(t, response) res := any.Of(response).Map().Dot() diff --git a/tests/langs/zh-hk/pages/lang.yml b/tests/langs/zh-hk/pages/lang.yml new file mode 100644 index 00000000..0f0a4714 --- /dev/null +++ b/tests/langs/zh-hk/pages/lang.yml @@ -0,0 +1,10 @@ +Start: 開始時間 +End: 結束時間 +City: 城市 +Please select a start time: 請選擇開始時間 +Please select an end time: 請選擇結束時間 +Industry: 行業 +Billing: 計費 +Merge Reulst: 合併結果 +Parameter: 參數 +Merge: 合併 diff --git a/tests/pages/lang.page.json b/tests/pages/lang.page.json new file mode 100644 index 00000000..f2553516 --- /dev/null +++ b/tests/pages/lang.page.json @@ -0,0 +1,100 @@ +{ + "label": "::Demo", + "version": "1.0.0", + "description": "::Demo", + "nodes": [ + { + "name": "行业", + "engine": "xiang", + "query": { + "select": [ + "city", + ":COUNT(id) as 数量", + "industries[*](string 50) as industry" + ], + "from": "$service", + "wheres": [ + { "field": "created_at", ">": "?:$from.0" }, + { "field": "created_at", "<": "?:$to" } + ], + "orders": "数量 desc", + "limit": 100 + } + }, + { + "name": "计费", + "engine": "xiang", + "query": { + "select": ["city", ":COUNT(id) as 数量", "price_options[*] as option"], + "from": "$service", + "wheres": [ + { "field": "created_at", ">": "?:$from.0" }, + { "field": "created_at", "<": "?:$to" } + ], + "orders": "数量 desc", + "limit": 100 + } + }, + { + "name": "合并结果", + "process": "xiang.helper.ArrayPluck", + "args": [ + ["城市", "行业", "计费"], + { + "行业": { "key": "city", "value": "数量", "items": "{{$res.行业}}" }, + "计费": { "key": "city", "value": "数量", "items": "{{$res.计费}}" } + } + ] + } + ], + "output": { + "::Merge": "{{$res.合并结果}}", + "::Billing": "{{$res.计费}}", + "::Industry": "{{$res.行业}}", + "::Parameter": "{{$in}}" + }, + "apis": { + "data": { + "disable": false, + "guard": "-", + "default": [{ "from": "1980-01-02", "to": "2050-12-31" }] + }, + "setting": { "disable": false, "guard": "-" } + }, + "filters": { + "::Start": { + "label": "::Start", + "bind": "from", + "input": { + "type": "date", + "props": { + "placeholder": "::Please select a start time" + } + } + }, + "::End": { + "label": "::End", + "bind": "to", + "input": { + "type": "date", + "props": { + "placeholder": "::Please select an end time" + } + } + } + }, + "page": { + "primary": "::City", + "layout": { + "filters": [ + { "name": "::Start", "width": 6 }, + { "name": "::End", "width": 6 } + ], + "charts": [ + { "type": "line", "props": {} }, + { "type": "bar", "props": {} } + ] + }, + "actions": {} + } +} diff --git a/tests/pages/service/compare.page.json b/tests/pages/service/compare.page.json index 52a284a9..5478c7c6 100644 --- a/tests/pages/service/compare.page.json +++ b/tests/pages/service/compare.page.json @@ -7,7 +7,7 @@ "name": "行业", "engine": "xiang", "query": { - "debug": true, + "debug": false, "select": [ "city", ":COUNT(id) as 数量",