实现了第十章
This commit is contained in:
129
10.3.md
129
10.3.md
@@ -35,18 +35,143 @@
|
||||
//输出“递交”
|
||||
|
||||
## 自动加载本地包
|
||||
上面我们介绍了多个自定义语言包的自动加载,那么在我们加载的同时,其实go-i18n库会自动帮你加载一些定义的格式信息,例如时间格式、货币格式。请看下面的处理过程
|
||||
上面我们介绍了多个自定义语言包的自动加载,那么在我们加载的同时,其实go-i18n库会自动帮你加载一些定义的格式信息,例如时间格式、货币格式。所以在go-i18n包里面已经有了很多语言的时间格式、货币格式等定义,其实在调用NewLocale的时候这些默认的配置已经加载好了,用户可以继续在自己的定义配置中复写这些配置,请看下面的处理过程:
|
||||
|
||||
//加载默认配置文件,这些文件都放在go-i18n/locales下面
|
||||
|
||||
//文件命名zh.json、en-json、en-US.json等,可以不断的扩展支持更多的语言
|
||||
|
||||
func (il *IL) loadDefaultTranslations(dirPath string) error {
|
||||
dir, err := os.Open(dirPath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer dir.Close()
|
||||
|
||||
names, err := dir.Readdirnames(-1)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, name := range names {
|
||||
fullPath := path.Join(dirPath, name)
|
||||
|
||||
fi, err := os.Stat(fullPath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if fi.IsDir() {
|
||||
if err := il.loadTranslations(fullPath); err != nil {
|
||||
return err
|
||||
}
|
||||
} else if locale := il.matchingLocaleFromFileName(name); locale != "" {
|
||||
file, err := os.Open(fullPath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
if err := il.loadTranslation(file, locale); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
通过上面的方法加载配置信息到默认的文件,这样我们就可以在我们没有自定义时间信息的时候执行如下的代码获取对应的信息:
|
||||
|
||||
//locale=zh的情况下,执行如下代码:
|
||||
|
||||
fmt.Println(Tr.Time(time.Now()))
|
||||
//输出:2009年1月08日 星期四 20:37:58 CST
|
||||
|
||||
fmt.Println(Tr.Time(time.Now(),"long"))
|
||||
//输出:2009年1月08日
|
||||
|
||||
fmt.Println(Tr.Money(11.11))
|
||||
//输出:¥11.11
|
||||
|
||||
## template mapfunc
|
||||
上面我们实现了多个语言包的管理和加载,而一些函数的实现也是基于逻辑层的,例如:"Tr.Translate"、"Tr.Time"、"Tr.Money"等函数,虽然利用这些函数我们再逻辑层可以把需要的参数进行转换然后在模板层渲染的时候直接输出,但是如果我们想在模版层直接使用这些函数该怎么实现呢?我们前面在介绍模板这小节的时候介绍过,Go语言的模板支持自定义模板函数,下面是我们实现的方便操作的mapfunc:
|
||||
|
||||
1. 文本信息
|
||||
|
||||
文本信息调用`Tr.Translate`来实现相应的信息转换,mapFunc的实现如下:
|
||||
|
||||
func I18nT(args ...interface{}) string {
|
||||
ok := false
|
||||
var s string
|
||||
if len(args) == 1 {
|
||||
s, ok = args[0].(string)
|
||||
}
|
||||
if !ok {
|
||||
s = fmt.Sprint(args...)
|
||||
}
|
||||
return Tr.Translate(s)
|
||||
}
|
||||
|
||||
注册函数如下:
|
||||
|
||||
t.Funcs(template.FuncMap{"T": I18nT})
|
||||
|
||||
模板中使用如下:
|
||||
|
||||
{{.submit | T}}
|
||||
|
||||
|
||||
2. 时间日期
|
||||
3. 数字
|
||||
|
||||
时间日期调用`Tr.Time`函数来实现相应的时间转换,mapFunc的实现如下:
|
||||
|
||||
func I18nTimeDate(args ...interface{}) string {
|
||||
ok := false
|
||||
var s string
|
||||
if len(args) == 1 {
|
||||
s, ok = args[0].(string)
|
||||
}
|
||||
if !ok {
|
||||
s = fmt.Sprint(args...)
|
||||
}
|
||||
return Tr.Time(s)
|
||||
}
|
||||
|
||||
注册函数如下:
|
||||
|
||||
t.Funcs(template.FuncMap{"TD": I18nTimeDate})
|
||||
|
||||
模板中使用如下:
|
||||
|
||||
{{.now | TD}}
|
||||
3. 货币信息
|
||||
|
||||
货币调用`Tr.Money`函数来实现相应的时间转换,mapFunc的实现如下:
|
||||
|
||||
func I18nMoney(args ...interface{}) string {
|
||||
ok := false
|
||||
var s string
|
||||
if len(args) == 1 {
|
||||
s, ok = args[0].(string)
|
||||
}
|
||||
if !ok {
|
||||
s = fmt.Sprint(args...)
|
||||
}
|
||||
return Tr.Money(s)
|
||||
}
|
||||
|
||||
注册函数如下:
|
||||
|
||||
t.Funcs(template.FuncMap{"M": I18nMoney})
|
||||
|
||||
模板中使用如下:
|
||||
|
||||
{{.money | M}}
|
||||
|
||||
## 总结
|
||||
通过这小节我们知道了如何实现一个多语言包的Web应用,通过自定义语言包我们可以方便的实现多语言,而且通过配置文件能够非常方便的扩充多语言,默认情况下,go-i18n会自定加载一些公共的配置信息,例如时间、货币等,我们就可以非常方便的使用,同时为了支持在模板中使用这些函数,也实现了相应的模板函数,这样就允许我们在开发Web应用的时候直接在模板中通过pipeline的方式来操作多语言包。
|
||||
|
||||
## links
|
||||
* [目录](<preface.md>)
|
||||
* 上一节: [本地化资源](<10.2.md>)
|
||||
|
||||
2
2.2.md
2
2.2.md
@@ -364,7 +364,7 @@ slice有一些简便的操作
|
||||
|
||||
`map`也就是Python中字典的概念,它的格式为`map[keyType]valueType`
|
||||
|
||||
我们看下面的代码,`map`的读取和设置也类似`slice`一样,通过`key`来操作,只是`slice`只有`int`的`key`,而`map`多了很多类型,可以是`int`,可以是`string`及所有完全定义了`==`与`!=`操作的类型。
|
||||
我们看下面的代码,`map`的读取和设置也类似`slice`一样,通过`key`来操作,只是`slice`的`key`只能是`int`类型,而`map`多了很多类型,可以是`int`,可以是`string`及所有完全定义了`==`与`!=`操作的类型。
|
||||
|
||||
// 声明一个key是字符串,值为int的字典,这种方式的声明需要在使用之前使用make初始化
|
||||
var numbers map[string] int
|
||||
|
||||
Reference in New Issue
Block a user