diff --git a/base/cli/daemon.go b/base/cli/daemon.go
index eaf45086..96e5ba1a 100644
--- a/base/cli/daemon.go
+++ b/base/cli/daemon.go
@@ -32,7 +32,6 @@ func _daemon_exec(m *ice.Message, cmd *exec.Cmd) {
m.OptionSimple(CMD_INPUT, CMD_OUTPUT, CMD_ERRPUT, mdb.CACHE_CLEAR_ONEXIT),
)
if e := cmd.Start(); m.Warn(e, ice.ErrNotStart, cmd.Args, err.String()) {
- m.Debug("what %v", e)
mdb.HashModify(m, h, STATUS, ERROR, ERROR, e)
return
}
@@ -44,7 +43,6 @@ func _daemon_exec(m *ice.Message, cmd *exec.Cmd) {
m.Cost(CODE, "0", ctx.ARGS, cmd.Args)
} else {
mdb.HashSelectUpdate(m, h, func(value ice.Map) { value[STATUS], value[ERROR] = ERROR, e })
- m.Debug("what %v", e)
}
switch status := mdb.HashSelectField(m.Sleep300ms(), h, STATUS); cb := m.OptionCB("").(type) {
case func(string) bool:
diff --git a/base/gdb/event.go b/base/gdb/event.go
index 8690468c..33b80ffd 100644
--- a/base/gdb/event.go
+++ b/base/gdb/event.go
@@ -39,7 +39,9 @@ func EventsAction(arg ...string) ice.Actions {
list := kit.DictList(arg...)
return ice.Actions{ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
for sub := range m.Target().Commands[m.CommandKey()].Actions {
- kit.If(list[sub] == ice.TRUE, func() { Watch(m, sub) })
+ kit.If(list[sub] == ice.TRUE, func() {
+ Watch(m, sub)
+ })
}
}}}
}
diff --git a/base/gdb/routine.go b/base/gdb/routine.go
index a04b83b1..13678102 100644
--- a/base/gdb/routine.go
+++ b/base/gdb/routine.go
@@ -19,7 +19,7 @@ func init() {
h := mdb.HashCreate(m, m.OptionSimple(mdb.NAME, ice.CMD), mdb.STATUS, START)
defer func() {
if e := recover(); e == nil {
- mdb.HashModify(m, mdb.HASH, h, mdb.STATUS, STOP)
+ mdb.HashRemove(m, mdb.HASH, h)
} else {
mdb.HashModify(m, mdb.HASH, h, mdb.STATUS, ERROR, ERROR, e)
}
diff --git a/base/web/dream.go b/base/web/dream.go
index 95df4b03..275cec5b 100644
--- a/base/web/dream.go
+++ b/base/web/dream.go
@@ -175,11 +175,11 @@ func DreamAction() ice.Actions {
func DreamProcess(m *ice.Message, args ice.Any, arg ...string) {
if kit.HasPrefixList(arg, ice.RUN) {
ctx.ProcessField(m, m.PrefixKey(), args, kit.Slice(arg, 1)...)
- } else if kit.HasPrefixList(arg, ctx.ACTION, m.CommandKey()) {
+ } else if kit.HasPrefixList(arg, ctx.ACTION, m.PrefixKey()) || kit.HasPrefixList(arg, ctx.ACTION, m.CommandKey()) {
if arg = kit.Slice(arg, 2); kit.HasPrefixList(arg, DREAM) {
m.Cmdy(SPACE, m.Option(ice.MSG_USERPOD, arg[1]), m.PrefixKey(), ctx.ACTION, DREAM_ACTION, ice.RUN, arg[2:])
} else if dream := m.Option(mdb.NAME); dream != "" {
- m.Cmdy(SPACE, dream, m.PrefixKey(), ctx.ACTION, DREAM_ACTION, ice.RUN, arg).Optionv(ice.FIELD_PREFIX, kit.Simple(ctx.ACTION, m.CommandKey(), DREAM, dream, ice.RUN))
+ m.Cmdy(SPACE, dream, m.PrefixKey(), ctx.ACTION, DREAM_ACTION, ice.RUN, arg).Optionv(ice.FIELD_PREFIX, kit.Simple(ctx.ACTION, m.PrefixKey(), DREAM, dream, ice.RUN))
}
}
}
diff --git a/base/web/render.go b/base/web/render.go
index 0e536a81..adc0e609 100644
--- a/base/web/render.go
+++ b/base/web/render.go
@@ -10,7 +10,6 @@ import (
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/ctx"
- "shylinux.com/x/icebergs/base/log"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/icebergs/base/tcp"
@@ -137,10 +136,10 @@ func RenderPodCmd(m *ice.Message, pod, cmd string, arg ...ice.Any) {
}
func RenderCmd(m *ice.Message, cmd string, arg ...ice.Any) { RenderPodCmd(m, "", cmd, arg...) }
func renderVersion(m *ice.Message) string {
- if m.R != nil && strings.Contains(m.R.URL.RawQuery, "debug=true") || m.Option(log.DEBUG) == ice.TRUE {
- return kit.Format("?_v=%v&_t=%d", ice.Info.Make.Version, time.Now().Unix())
+ if ice.Info.Make.Hash == "" {
+ return ""
}
- return ""
+ return kit.Format("?_v=%s&_h=%s", ice.Info.Make.Version, ice.Info.Make.Hash[:8])
}
const (
diff --git a/base/web/serve.go b/base/web/serve.go
index 37a15104..9394f6f4 100644
--- a/base/web/serve.go
+++ b/base/web/serve.go
@@ -11,6 +11,7 @@ import (
"shylinux.com/x/icebergs/base/aaa"
"shylinux.com/x/icebergs/base/cli"
"shylinux.com/x/icebergs/base/ctx"
+ "shylinux.com/x/icebergs/base/gdb"
"shylinux.com/x/icebergs/base/lex"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
@@ -73,7 +74,13 @@ func _serve_main(m *ice.Message, w http.ResponseWriter, r *http.Request) bool {
return true
}
func _serve_handle(key string, cmd *ice.Command, m *ice.Message, w http.ResponseWriter, r *http.Request) {
- _log := func(level string, arg ...ice.Any) *ice.Message { return m.Logs(strings.Title(level), arg...) }
+ debug := strings.Contains(r.URL.String(), "debug=true") || strings.Contains(r.Header.Get(Referer), "debug=true")
+ _log := func(level string, arg ...ice.Any) *ice.Message {
+ if debug || arg[0] == "cmds" {
+ return m.Logs(strings.Title(level), arg...)
+ }
+ return m
+ }
if u, e := url.Parse(r.Header.Get(Referer)); e == nil {
add := func(k, v string) { _log(nfs.PATH, k, m.Option(k, v)) }
switch arg := strings.Split(strings.TrimPrefix(u.Path, nfs.PS), nfs.PS); arg[0] {
@@ -171,6 +178,7 @@ func init() {
SERVE: {Name: "serve name auto start", Help: "服务器", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
cli.NodeInfo(m, ice.Info.Pathname, WORKER)
+ gdb.Watch(m, SERVE_START)
aaa.White(m, nfs.REQUIRE)
}},
DOMAIN: {Hand: func(m *ice.Message, arg ...string) {
@@ -184,12 +192,6 @@ func init() {
m.Go(func() {
cli.Opens(m, mdb.Config(m, cli.OPEN))
ssh.PrintQRCode(m, tcp.PublishLocalhost(m, _serve_address(m)))
- return
- opened := false
- for i := 0; i < 3 && !opened; i++ {
- m.Sleep("1s").Cmd(SPACE, func(value ice.Maps) { kit.If(value[mdb.TYPE] == CHROME, func() { opened = true }) })
- }
- kit.If(!opened, func() { cli.Opens(m, _serve_address(m)) })
})
}},
}, mdb.HashAction(mdb.SHORT, mdb.NAME, mdb.FIELD, "time,status,name,proto,host,port"), mdb.ClearOnExitHashAction())},
@@ -198,7 +200,13 @@ func init() {
if strings.HasPrefix(sub, nfs.PS) {
kit.If(action.Hand == nil, func() { action.Hand = cmd.Hand })
sub = kit.Select(P(key, sub), PP(key, sub), strings.HasSuffix(sub, nfs.PS))
- c.Commands[sub] = &ice.Command{Name: kit.Select(cmd.Name, action.Name), Actions: ice.MergeActions(cmd.Actions, ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) {
+ actions := ice.Actions{}
+ for k, v := range cmd.Actions {
+ if !kit.IsIn(k, ice.CTX_INIT, ice.CTX_EXIT) {
+ actions[k] = v
+ }
+ }
+ c.Commands[sub] = &ice.Command{Name: kit.Select(cmd.Name, action.Name), Actions: ice.MergeActions(actions, ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) {
msg := m.Spawn(c, key, cmd)
defer m.Copy(msg)
action.Hand(msg, arg...)
diff --git a/core/chat/portal.go b/core/chat/portal.go
index 8803aa6c..1a9b7353 100644
--- a/core/chat/portal.go
+++ b/core/chat/portal.go
@@ -16,6 +16,8 @@ func init() {
mdb.IsSearchPreview(m, arg, func() []string { return []string{web.LINK, PORTAL, m.MergePodCmd("", "") + nfs.PS} })
}},
nfs.PS: {Hand: func(m *ice.Message, arg ...string) { web.RenderMain(m) }},
- }), Hand: func(m *ice.Message, arg ...string) {}},
+ }), Hand: func(m *ice.Message, arg ...string) {
+ web.RenderMain(m)
+ }},
})
}
diff --git a/core/code/binpack.go b/core/code/binpack.go
index b730b8ac..0bfd6464 100644
--- a/core/code/binpack.go
+++ b/core/code/binpack.go
@@ -57,7 +57,9 @@ func _binpack_all(m *ice.Message) {
for _, p := range []string{ice.USR_VOLCANOS, ice.USR_INTSHELL, ice.SRC} {
_binpack_dir(m, w, p)
}
- for _, p := range []string{ice.ETC_MISS_SH, ice.ETC_INIT_SHY, ice.ETC_LOCAL_SHY, ice.ETC_EXIT_SHY, ice.ETC_PATH, ice.README_MD, ice.MAKEFILE, ice.LICENSE} {
+ for _, p := range []string{ice.ETC_MISS_SH, ice.ETC_INIT_SHY, ice.ETC_LOCAL_SHY, ice.ETC_EXIT_SHY, ice.ETC_PATH,
+ ice.README_MD, ice.MAKEFILE, ice.LICENSE, ice.GO_MOD, ice.GO_SUM,
+ } {
_binpack_file(m, w, p)
}
list, cache := map[string]string{}, GoCache(m)
diff --git a/core/code/publish.go b/core/code/publish.go
index 69f33d16..ad541457 100644
--- a/core/code/publish.go
+++ b/core/code/publish.go
@@ -86,10 +86,14 @@ func init() {
nfs.BINARY: {Hand: func(m *ice.Message, arg ...string) { _publish_contexts(m, nfs.BINARY) }},
"manual": {Hand: func(m *ice.Message, arg ...string) {
host := web.UserHost(m)
+ args := ""
+ if m.Option(ice.MSG_USERPOD) != "" {
+ args = "?pod=" + m.Option(ice.MSG_USERPOD)
+ }
m.Cmdy("web.wiki.spark", "shell",
- cli.LINUX, kit.Format(`curl -fSL -O %s/publish/ice.linux.amd64`, host),
- cli.DARWIN, kit.Format(`curl -fSL -O %s/publish/ice.darwin.amd64`, host),
- cli.WINDOWS, kit.Format(`curl -fSL -O %s/publish/ice.windows.amd64`, host),
+ cli.LINUX, kit.Format(`curl -fSL -O "%s/publish/ice.linux.amd64%s"`, host, args),
+ cli.DARWIN, kit.Format(`curl -fSL -O "%s/publish/ice.darwin.amd64%s"`, host, args),
+ cli.WINDOWS, kit.Format(`curl -fSL -O "%s/publish/ice.windows.amd64%s"`, host, args),
)
}},
"wget": {Hand: func(m *ice.Message, arg ...string) { _publish_contexts(m, "wget") }},
diff --git a/core/code/xterm.go b/core/code/xterm.go
index f92b5a87..56987e17 100644
--- a/core/code/xterm.go
+++ b/core/code/xterm.go
@@ -60,9 +60,6 @@ func _xterm_get(m *ice.Message, h string) xterm.XTerm {
}
func _xterm_echo(m *ice.Message, h string, str string) {
m.Options(ice.MSG_DAEMON, mdb.HashSelectField(m, h, cli.DAEMON))
- // m.Option(ice.LOG_DISABLE, ice.TRUE)
- // m.Debug("what ---%o--- ---[%v]---", []byte(str), str)
- m.Debug("what ---%o---", []byte(str))
web.PushNoticeGrow(m, h, str)
}
func _xterm_cmds(m *ice.Message, h string, cmd string, arg ...ice.Any) {
@@ -120,8 +117,6 @@ func init() {
}},
web.INPUT: {Hand: func(m *ice.Message, arg ...string) {
if b, e := base64.StdEncoding.DecodeString(strings.Join(arg, "")); !m.Warn(e) {
- // m.Debug("what ---%o--- ---[%v]---", b, string(b))
- m.Debug("what ---%o---", b)
_xterm_get(m, "").Write(b)
}
}},
diff --git a/core/wiki/portal.go b/core/wiki/portal.go
index a442de97..11b70052 100644
--- a/core/wiki/portal.go
+++ b/core/wiki/portal.go
@@ -9,6 +9,7 @@ import (
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/icebergs/base/web"
+ kit "shylinux.com/x/toolkits"
)
const PORTAL = "portal"
@@ -22,18 +23,23 @@ func init() {
Index.MergeCommands(ice.Commands{
PORTAL: {Name: "portal path auto", Help: "网站门户", Actions: ice.MergeActions(ice.Actions{
mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) {
- mdb.IsSearchPreview(m, arg, func() []string { return []string{web.LINK, PORTAL, m.MergePodCmd("", "") + nfs.PS} })
+ mdb.IsSearchPreview(m, arg, func() []string { return []string{web.LINK, PORTAL, m.MergePodCmd("", "")} })
}},
nfs.PS: {Hand: func(m *ice.Message, arg ...string) { web.RenderCmd(m, "", arg) }},
ctx.RUN: {Hand: func(m *ice.Message, arg ...string) {
- if p := path.Join(ice.USR_PORTAL, path.Join(arg...)); nfs.ExistsFile(m, p) && !(m.Option(ice.DEBUG) == ice.TRUE && aaa.Right(m.Spawn(), arg)) {
- m.Copy(m.Spawn([]byte(m.Cmdx(nfs.CAT, p))))
- } else {
+ if p := path.Join(ice.USR_PORTAL, path.Join(arg...)); (m.Option(ice.DEBUG) == ice.TRUE || !nfs.ExistsFile(m, p)) && aaa.Right(m.Spawn(), arg) {
ctx.Run(m, arg...)
m.Cmd(nfs.SAVE, p, ice.Maps{nfs.CONTENT: m.FormatMeta(), nfs.DIR_ROOT: ""})
+ } else {
+ m.Copy(m.Spawn([]byte(m.Cmdx(nfs.CAT, p))))
}
}},
- }, aaa.WhiteAction(ctx.COMMAND, ctx.RUN), aaa.RoleAction(ctx.COMMAND, ctx.RUN), ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) {
+ web.DREAM_TABLES: {Hand: func(m *ice.Message, arg ...string) {
+ kit.Switch(m.Option(mdb.TYPE), kit.Simple(web.SERVER, web.WORKER), func() {
+ m.PushButton(ice.Maps{PORTAL: "官网"})
+ })
+ }},
+ }, aaa.WhiteAction(ctx.COMMAND, ctx.RUN), aaa.RoleAction(ctx.COMMAND, ctx.RUN), web.DreamAction(), ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) {
if m.Push(HEADER, m.Cmdx(WORD, path.Join(nfs.SRC_DOCUMENT, INDEX_SHY))); len(arg) > 0 {
m.Push(NAV, m.Cmdx(WORD, path.Join(nfs.SRC_DOCUMENT, path.Join(arg...), INDEX_SHY)))
}
diff --git a/core/wiki/portal.js b/core/wiki/portal.js
index 7f8acd59..3bcca3ef 100644
--- a/core/wiki/portal.js
+++ b/core/wiki/portal.js
@@ -1,7 +1,11 @@
Volcanos(chat.ONIMPORT, {
_init: function(can, msg) { can.require(["/plugin/local/wiki/word.js"]), can.Conf(html.PADDING, 40)
can.db = {nav: {}}, can.sup.onexport.link = function() { return can.db.prefix }
- can.db.prefix = location.pathname.indexOf("/chat/cmd/web.wiki.portal/") == 0? "/chat/cmd/web.wiki.portal/": "/wiki/portal/"
+ can.db.prefix = location.pathname.indexOf("/chat/cmd/web.wiki.portal/") == 0? "/chat/cmd/web.wiki.portal/":
+ location.pathname.indexOf("/chat/cmd/web.wiki.portal") == 0? "/chat/cmd/web.wiki.portal": "/wiki/portal/"
+ if (location.pathname.indexOf("/chat/pod/") == 0) { var args = can.misc.ParseURL(can)
+ can.db.prefix = can.base.trimPrefix(can.misc.MergeURL(can, args)+"/", location.origin)
+ }
can.db.current = can.isCmdMode()? can.base.trimPrefix(location.pathname, can.db.prefix): can.Option(nfs.PATH)
can.onmotion.clear(can)
can.ui = can.onappend.layout(can, [html.HEADER, [html.NAV, html.MAIN, html.ASIDE]], html.FLOW), can.onimport._scroll(can)
@@ -59,7 +63,7 @@ Volcanos(chat.ONACTION, {
if (!internal) { var params = ""; (can.misc.Search(can, log.DEBUG) == ice.TRUE && (params = "?debug=true"))
if (link == nfs.PS) { return can.isCmdMode()? can.user.jumps(can.db.prefix+params): (can.Option(nfs.PATH, ""), can.Update()) }
if (can.base.beginWith(link, web.HTTP, nfs.PS)) { return can.user.opens(link) }
- if (link.indexOf(can.db.current) < 0 || link.endsWith(nfs.PS)) { return can.isCmdMode()? can.user.jumps(can.db.prefix+link+params): (can.Option(nfs.PATH, link), can.Update()) }
+ if (link.indexOf(can.db.current) < 0 || link.endsWith(nfs.PS)) { return can.isCmdMode()? can.user.jumps(can.base.Path(can.db.prefix, link)+params): (can.Option(nfs.PATH, link), can.Update()) }
}
var file = can.base.trimPrefix(link, can.db.current); can.isCmdMode() && can.user.jumps("#"+file)
if (can.onmotion.cache(can, function(cache, key) { cache[key] = can._plugins, can._plugins = cache[file]||[]; return file }, can.ui.main, can.ui.aside)) { return file }
diff --git a/core/wiki/spark.go b/core/wiki/spark.go
index 177a61cb..2a4ecc29 100644
--- a/core/wiki/spark.go
+++ b/core/wiki/spark.go
@@ -100,6 +100,7 @@ func init() {
if arg[0] == "shell" && len(arg) > 3 && arg[2] == "with" && arg[3] == "echo" {
m.Option("echo", m.Cmdx(cli.SYSTEM, kit.Split(arg[1])))
}
+ arg[1] = kit.Renders(arg[1], ice.Info)
_spark_show(m, arg[0], strings.TrimSpace(arg[1]), arg[2:]...)
}
}},
diff --git a/core/wiki/title.go b/core/wiki/title.go
index 413a8b0b..48f3c01c 100644
--- a/core/wiki/title.go
+++ b/core/wiki/title.go
@@ -66,12 +66,14 @@ func init() {
TITLE: {Name: "title type=navmenu,premenu,chapter,section,endmenu text", Help: "标题", Hand: func(m *ice.Message, arg ...string) {
switch arg[0] {
case NAVMENU: // navmenu text arg...
+ arg[1] = kit.Renders(arg[1], ice.Info)
_title_menu(m, arg[0], arg[1], arg[2:]...)
case PREMENU, ENDMENU: // premenu arg...
_title_menu(m, arg[0], "", arg[1:]...)
case CHAPTER, SECTION: // chapter text arg...
_title_show(m, arg[0], arg[1], arg[2:]...)
default: // title text arg...
+ arg[0] = kit.Renders(arg[0], ice.Info)
_title_show(m, "", arg[0], arg[1:]...)
}
}},
diff --git a/core/wiki/wiki.go b/core/wiki/wiki.go
index 114d117e..8f7053b1 100644
--- a/core/wiki/wiki.go
+++ b/core/wiki/wiki.go
@@ -66,7 +66,7 @@ func init() {
web.Index.Register(Index, &web.Frame{},
TITLE, BRIEF, REFER, SPARK, PARSE, FIELD,
ORDER, TABLE, CHART, IMAGE, VIDEO, AUDIO,
- WORD, DATA, DRAW, FEEL,
+ WORD, DATA, DRAW, FEEL, PORTAL,
)
}
func Prefix(arg ...string) string { return web.Prefix(WIKI, kit.Keys(arg)) }
diff --git a/core/wiki/word.go b/core/wiki/word.go
index 6caadbcc..2ebeacac 100644
--- a/core/wiki/word.go
+++ b/core/wiki/word.go
@@ -54,9 +54,6 @@ func init() {
ls := kit.Split(m.Option(mdb.TEXT))
kit.If(kit.IsIn(ls[0], IMAGE, VIDEO, AUDIO), func() { m.Cmdy(FEEL).CutTo(nfs.PATH, mdb.NAME) })
}},
- web.DREAM_TABLES: {Hand: func(m *ice.Message, arg ...string) {
- kit.Switch(m.Option(mdb.TYPE), kit.Simple(web.SERVER, web.WORKER), func() { m.PushButton(kit.Dict(m.CommandKey(), "文档")) })
- }},
}, aaa.RoleAction("story.field"), ctx.CmdAction(), WikiAction("", nfs.SHY)), Hand: func(m *ice.Message, arg ...string) {
if m.Option(nfs.DIR_DEEP, ice.TRUE); len(arg) == 0 {
arg = append(arg, nfs.SRC)
diff --git a/misc/alpha/alpha.go b/misc/alpha/alpha.go
index 475c24c8..73b6e381 100644
--- a/misc/alpha/alpha.go
+++ b/misc/alpha/alpha.go
@@ -29,7 +29,7 @@ type alpha struct {
limit string `data:"50000"`
least string `data:"1000"`
load string `name:"load file*=usr/word-dict/ecdict zone*=ecdict"`
- list string `name:"list method=word,line word auto load" help:"词典"`
+ list string `name:"list method=word,line word auto" help:"词典"`
}
func (s alpha) Load(m *ice.Message, arg ...string) {
diff --git a/misc/chrome/field.go b/misc/chrome/field.go
index 2dba0b5a..36e7fda5 100644
--- a/misc/chrome/field.go
+++ b/misc/chrome/field.go
@@ -13,7 +13,7 @@ type field struct {
daemon
short string `data:"domain"`
field string `data:"time,id,index,args,style,left,top,right,bottom,selection"`
- insert string `name:"insert domain=golang.google.cn index=cli.system args=pwd"`
+ insert string `name:"insert domain*=golang.google.cn index*=web.wiki.alpha.alpha args selection=word"`
list string `name:"list domain id auto insert" help:"插件"`
}
diff --git a/render.go b/render.go
index 3ec80dbf..f4279c7d 100644
--- a/render.go
+++ b/render.go
@@ -33,6 +33,10 @@ func Render(m *Message, cmd string, args ...Any) string {
break
}
kit.For(kit.Split(k), func(k string) { list = append(list, kit.Format(``, k, k)) })
+ case Maps:
+ kit.For(k, func(k, v string) {
+ list = append(list, kit.Format(``, k, kit.Select(k, v, m.Option(MSG_LANGUAGE) == "zh")))
+ })
case Map:
kit.For(k, func(k, v string) {
list = append(list, kit.Format(``, k, kit.Select(k, v, m.Option(MSG_LANGUAGE) == "zh")))