I tried to use i18n but it can't work i18n is below. http://beego.me/docs/module/i18n.md
routers/init.go:
// Initialized language type list.
langs := strings.Split(models.Cfg.MustValue("lang", "types"), "|")
names := strings.Split(models.Cfg.MustValue("lang", "names"), "|")
langTypes = make([]*langType, 0, len(langs))
for i, v := range langs {
langTypes = append(langTypes, &langType{
Lang: v,
Name: names[i],
})
}
for _, lang := range langs {
beego.Trace("Loading language: " + lang)
if err := i18n.SetMessage(lang, "conf/"+"locale_"+lang+".ini"); err != nil {
beego.Error("Fail to set message file: " + err.Error())
return
}
}
routers/router.go
// Initialized language type list.
langs := strings.Split(models.Cfg.MustValue("lang", "types"), "|")
names := strings.Split(models.Cfg.MustValue("lang", "names"), "|")
langTypes = make([]*langType, 0, len(langs))
for i, v := range langs {
langTypes = append(langTypes, &langType{
Lang: v,
Name: names[i],
})
}
for _, lang := range langs {
beego.Trace("Loading language: " + lang)
if err := i18n.SetMessage(lang, "conf/"+"locale_"+lang+".ini"); err != nil {
beego.Error("Fail to set message file: " + err.Error())
return
}
}
I just copied and paste.
It is my full code. https://github.com/shinriyo/sample_i18n
I'd like to know minimum code.
it is error
bee run
2015/05/24 17:48:56 [INFO] Uses 'sample_i18n' as 'appname'
2015/05/24 17:48:56 [INFO] Initializing watcher...
2015/05/24 17:48:56 [TRAC] Directory(/Users/shinriyo/src/sample_i18n/controllers)
2015/05/24 17:48:56 [TRAC] Directory(/Users/shinriyo/src/sample_i18n)
2015/05/24 17:48:56 [TRAC] Directory(/Users/shinriyo/src/sample_i18n/routers)
2015/05/24 17:48:56 [TRAC] Directory(/Users/shinriyo/src/sample_i18n/tests)
2015/05/24 17:48:56 [INFO] Start building...
main.go:4:2:
routers/init.go:2:1: expected 'package', found 'IDENT' langs
2015/05/24 17:48:56 [ERRO] ============== Build failed ===================
The best way I found was that:
Configure your translation list at conf/app.conf. My languages are en-US and pt-BR
lang_types = "en-US|pt-BR"
Create file baseController.go inside controller/baseController/ folder with this code
package controllers
import (
"github.com/astaxie/beego"
"github.com/beego/i18n"
"strings"
)
var langTypes []string // Languages that are supported.
// baseController represents base router for all other app routers.
// It implemented some methods for the same implementation;
// thus, it will be embedded into other routers.
type BaseController struct {
beego.Controller // Embed struct that has stub implementation of the interface.
i18n.Locale // For i18n usage when process data and render template.
}
func init() {
beego.AddFuncMap("i18n", i18n.Tr)
// Initialize language type list.
langTypes = strings.Split(beego.AppConfig.String("lang_types"), "|")
// Load locale files according to language types.
for _, lang := range langTypes {
beego.Trace("Loading language: " + lang)
if err := i18n.SetMessage(lang, "conf/"+"locale_"+lang+".ini"); err != nil {
beego.Error("Fail to set message file:", err)
return
}
}
}
// Prepare implemented Prepare() method for baseController.
// It's used for language option check and setting.
func (this *BaseController) Prepare() {
// Reset language option.
this.Lang = "" // This field is from i18n.Locale.
beego.Trace("running prepare")
// 1. Get language information from 'Accept-Language'.
al := this.Ctx.Request.Header.Get("Accept-Language")
if len(al) > 4 {
al = al[:5] // Only compare first 5 letters.
if i18n.IsExist(al) {
this.Lang = al
}
}
beego.Trace("Accept-Language is " + al)
// 2. Default language is English.
if len(this.Lang) == 0 {
this.Lang = "en-US"
}
// Set template level language option.
this.Data["Lang"] = this.Lang
}
Use your custom BaseController in other controller.
package controllers
import (
bc "github.com/myFirstApp/controllers/baseController"
)
type LoginController struct {
bc.BaseController
}
func (c *LoginController) Get() {
c.TplNames = "login.tpl"
}
Use i18n in templates
{{i18n .Lang "login.capitalized"}}
My locale_en-US.ini
login = login
[login]
uppercase = LOGIN
capitalized = Login
package controllers
import (
"github.com/astaxie/beego"
"github.com/beego/i18n"
"os"
"strings"
)
type BaseController struct {
beego.Controller
}
func (b *BaseController) settingLocales() {
// load locales with locale_LANG.ini files
langs := "en-US|zh-CN"
for _, lang := range strings.Split(langs, "|") {
lang = strings.TrimSpace(lang)
files := []string{"conf/" + "locale_" + lang + ".ini"}
if fh, err := os.Open(files[0]); err == nil {
fh.Close()
} else {
files = nil
}
if err := i18n.SetMessage(lang, "conf/"+"locale_"+lang+".ini", files...); err != nil {
beego.Error("Fail to set message file: " + err.Error())
os.Exit(2)
}
}
Las := i18n.ListLangs()
beego.Debug("langs:", Las)
}
func (b *BaseController) Get() {
b.settingLocales()
if i18n.IsExist("en-US") {
b.Data["json"] = i18n.Tr("en-US", "hi")
} else {
b.Data["json"] = s
}
b.ServeJson()
}
create file locale_en-US.ini and locale_zh-CN.ini in conf/
in locale_en-US.ini like:
hi = hello
bye = goodbye