gogetgithub.com/beego/i18n2.1.i18n使用首先,您需要导入该包:
import("github.com/beego/i18n")该模块主要采用的是键值对的形式,非常类似INI格式的配置文件,但又在此基础上增强了一些功能。每个语种均对应一个本地化文件,例如beego官网的conf目录下就有locale_en-US.ini和locale_zh-CN.ini两个本地化文件。
本地化文件的文件名和后缀是随意的,不过我们建议您采用与beego官网相同的风格来对它们命名。
2.2.最简实例下面是两个最简单的本地化文件示例:
文件locale_en-US.ini:
hi=hellobye=goodbye文件locale_zh-CN.ini:
hi=您好bye=再见2.2.1.在控制器中使用对于每个请求,beego都会采用单独的goroutine来处理,因此可以对每个控制器匿名嵌入一个i18n.Locale结构用于处理当前请求的本地化响应。这个要求您能够理解beego的baseController理念和使用Prepare方法,具体可参考beego官网的控制器源码部分routers/router.go。
接受请求之后,在baseController的Prepare方法内进行语言处理,这样便可应用后所有其它控制器内而无需重复编写代码。
注册本地化文件以下代码摘取自beego官网源码routers/init.go:
//Initializedlanguagetypelist.langs:=strings.Split(beego.AppConfig.String("lang::types"),"|")names:=strings.Split(beego.AppConfig.String("lang::names"),"|")langTypes=make([]*langType,0,len(langs))fori,v:=rangelangs{langTypes=append(langTypes,&langType{Lang:v,Name:names[i],})}
for,lang:=rangelangs{beego.Trace("Loadinglanguage:"+lang)iferr:=i18n.SetMessage(lang,"conf/"+"locale"+lang+".ini");err!=nil{beego.Error("Failtosetmessagefile:"+err.Error())return}}在这段代码中,我们首先从配置文件中获取我们需要支持的语言种类,例如官网支持的语言有en-US和zh-CN。接着初始化了一个用于实现用户自由切换语言的slice(此处不做讨论),最后,根据我们需要支持的语言种类,采用一个循环内调用i18n.SetMessage加载所有本地化文件。此时,您应该明白为什么我们推荐您采用标准化的形式命名您的本地化文件。
初始化控制器语言下面的代码摘取自beego官网的控制器语言处理部分routers/router.go,依次根据URL指定、Cookies和浏览器Accept-Language来获取用户语言选项,然后设置控制器级别的语言。
//setLangVersetssitelanguageversion.func(this*baseRouter)setLangVer()bool{isNeedRedir:=falsehasCookie:=false
代码this.Data["Lang"]=curLang.Lang是将用户语言选项设置到名为Lang的模板变量中,使得能够在模板中处理语言问题。
以下两行:
this.Data["CurLang"]=curLang.Namethis.Data["RestLangs"]=restLangs主要用于实现用户自由切换语言,具体实现原理请参考beego官网源码。
控制器语言处理当作为匿名字段嵌入到baseController之后,直接通过this.Tr(formatstring,args...interface{})即可进行语言处理。
2.2.2.在模板中使用通过在控制器中传入一个Lang变量来指示语言选项后,就可以在模板中进行本地化处理,不过在这之前,需要先注册一个模板函数。
以下代码摘取自beego官网源码beeweb.go:
beego.AddFuncMap("i18n",i18n.Tr)注册完成之后,便可配合Lang变量在模板中进行语言处理:
{{i18n.Lang"hi%d"12}}以上代码会输出:
英文en-US:hello12中文zh-CN:您好122.3.分区功能针对不同页面,同一个键的名称很可能会对应不同的含义。因此,i18n模块还利用INI格式配置文件的节特性来实现分区功能。
例如,同样是键名about,在首页需要显示为关于,而在关于页面需要显示为关于我们,则可以通过分区功能来实现。
本地化文件中的内容:
about=About
[about]about=AboutUs获取首页的about:
{{i18n.Lang"about"}}获取关于页面的about:
{{i18n.Lang"about.about"}}2.3.1.歧义处理由于.是作为分区的标志,所以当您的键名出现该符号的时候,会出现歧义导致语言处理失败。这时,您只需要在整个键名前加上一个额外的.即可避免歧义。
例如,我们的键名为about.,为了避免歧义,我们需要使用:
{{i18n.Lang".about."}}来获取正确的本地化结果。
2.4.命令行工具i18n模块提供命令行工具beei18n来帮助简化开发中的一些步骤。您可以通过以下方式安装:
gogetgithub.com/beego/i18n/beei18n2.4.1.同步本地化文件命令sync允许您使用已经创建好的一个本地化文件为模板,创建或同步其它的本地化文件:
beei18nsyncsrouce_file.iniother1.iniother2.ini该命令可以同时操作1个或多个文件。
2.5.其它说明如果未找到相应键的对应值,则会输出键的原字符串。例如:当键为hi但未在本地化文件中找到以该字符串命名的键,则会将hi作为字符串返回给调用者。