我正在写一个多语言的网站。
我从用户cookie中读取了语言信息,我有几个翻译模块,例如en.go
gr.go
等。
这些模块的类型为map[string]string
。这里的问题在于javascript我可以做类似lang[cookies.lang]["whatever message"].'But go does not support accessing struct members in this way.
I could make switch case or
map [string] map [string] string`的事情并映射所有可能的语言,但这是额外的工作。
那么golang是否提供了一些方法来访问js括号表示法等成员?
不是:堆栈上有一个类似的问题,有人写信使用"反映"包,但我不太明白它是如何工作的,也不能自己复制作品,也不能自己复制。
答案 0 :(得分:1)
一种可能的途径是使用map[string]map[string]string
。
然后您可以在其中声明基本翻译变量的基础包,并且在翻译模块中,您可以使用init
函数填充相关的子地图。它本质上是可选的,如果你想将它作为单独的包或只是单独的文件(以包为单位进行操作意味着你有更好的编译时控制包含哪些语言,作为文件执行它可能不那么混乱)。 / p>
如果你去包根,我建议采用以下结构:
translation/base This is where you export from
translation/<language> These are "import only" packages
然后,在翻译/基地:
package "base"
var Lang map[string]map[string]string
在每个特定语言的包中:
package "<language code>"
import "language/base"
var code = "<langcode>"
func init() {
d := map[string]string{}
d[<phrase1>] = "your translation here"
d[<phrase2>] = "another translation here"
// Do this for all the translations
base.Lang[code] = d
}
然后你可以在主程序中使用它:
package "..."
import (
"language/base"
_ "language/lang1" // We are only interested in side-effects
_ "language/lang2" // Same here...
)
不使用单独的包(几乎)是相同的。您只需确保所有文件都在同一个包中,您就可以跳过Lang
变量的包前缀。
一个玩具示例on the Go Playground,所有&#34; fiddly&#34;位内联。