管理多个本地包

在开发一个应用的时候,首先我们要决定是只支持一种语言,还是多种语言,如果要支持多种语言,我们则需要制定一个组织结构,以方便将来更多语言的添加。在此我们设计如下:Locale有关的文件放置在config/locales下,假设你要支持中文和英文,那么你需要在这个文件夹下放置en.json和zh.json。大概的内容如下所示:

# zh.json{
"zh": {"submit": "提交","create": "创建"}
}#en.json{
"en": {"submit": "Submit","create": "Create"}
}

为了支持国际化,在此我们使用了一个国际化相关的包——go-i18n,首先我们向go-i18n包注册config/locales这个目录,以加载所有的locale文件

Tr:=i18n.NewLocale()
Tr.LoadPath("config/locales")

这个包使用起来很简单,你可以通过下面的方式进行测试:

fmt.Println(Tr.Translate("submit"))
//输出Submit
Tr.SetLocale("zn")
fmt.Println(Tr.Translate("submit"))
//输出“递交”

自动加载本地包

上面我们介绍了如何自动加载自定义语言包,其实go-i18n库已经预加载了很多默认的格式信息,例如时间格式、货币格式,用户可以在自定义配置时改写这些默认配置,请看下面的处理过程:

//加载默认配置文件,这些文件都放在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 CSTfmt.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 := falsevar s stringif len(args) == 1 {s, ok = args[0].(string)}if !ok {s = fmt.Sprint(args...)}return Tr.Translate(s)
}

注册函数如下:

t.Funcs(template.FuncMap{"T": I18nT})

模板中使用如下:

{{.V.Submit | T}}
  1. 时间日期

时间日期调用Tr.Time函数来实现相应的时间转换,mapFunc的实现如下:

func I18nTimeDate(args ...interface{}) string {ok := falsevar s stringif len(args) == 1 {s, ok = args[0].(string)}if !ok {s = fmt.Sprint(args...)}return Tr.Time(s)
}

注册函数如下:

t.Funcs(template.FuncMap{"TD": I18nTimeDate})

模板中使用如下:

{{.V.Now | TD}}
  1. 货币信息

货币调用Tr.Money函数来实现相应的时间转换,mapFunc的实现如下:

func I18nMoney(args ...interface{}) string {ok := falsevar s stringif len(args) == 1 {s, ok = args[0].(string)}if !ok {s = fmt.Sprint(args...)}return Tr.Money(s)
}

注册函数如下:

t.Funcs(template.FuncMap{"M": I18nMoney})

模板中使用如下:

{{.V.Money | M}}

golang国际化站点相关推荐

  1. Golang 依赖包下载时候代理设置

    说明 我们在使用 Go 下载依赖时候经常遇到网络环境的问题,如:golang.org 站点必须要翻墙才可以进行下载:而单单设置系统层面的 http_proxy 有时也不能完全解决问题,所以我记录了我尝 ...

  2. Symfony翻译:轻松实现国际化

    If you've ever worked to develop a site which needed to be available in multiple languages then you ...

  3. 聚焦IT系统稳定性保障服务 PerfMa笨马网络完成亿元级B轮融资

    近日,国内专注于IT系统稳定性保障的企业服务公司--杭州笨马网络技术有限公司(下称"PerfMa笨马网络")宣布完成由博华资本领投,老股东高瓴创投跟投的亿元级B轮融资.这是该公司继 ...

  4. 我在蚂蚁金服做SRE

    有一种误解流传甚广,认为技术风险工程师是一个"背锅"的岗位,干着脏活累活--事实真的如此吗?蚂蚁金服技术风险部的孝泰同学以他的亲身经历来"辟谣",并广发英雄帖- ...

  5. 站在原地就是退步——除了死磕通道,云通讯服务商还该做些什么?

    受访嘉宾:吴佳钊,杭州云片网络科技有限公司联合创始人.CTO 当前,全球通信云已经步入2.0时代,最大的变化在于通信形式的变革:传统短信+语音的通信形式将逐步向包括即时通讯IM+实时音视频RTC的互联 ...

  6. 我在蚂蚁金服技术风险部做“医生”

    有一种误解流传甚广,认为技术风险工程师是一个"背锅"的岗位,干着脏活累活--事实真的如此吗?蚂蚁金服技术风险部的孝泰同学以他的亲身经历来"辟谣",并广发英雄帖- ...

  7. 阿里9年,我总结的前端架构演进3大阶段及团队管理心法(收藏)

    技术人生就是在不断地修行,每个人都有每个人的功课,每个人也有每个人的精彩.你也许刚上路,又或许踽踽独行了很久,听听别人的故事没准也能帮助自己的成长.在阿里修行的9年,他学会了这些. web前端全栈资料 ...

  8. 我在蚂蚁金服技术风险部做“医生” 1

    有一种误解流传甚广,认为技术风险工程师是一个"背锅"的岗位,干着脏活累活--事实真的如此吗?蚂蚁金服技术风险部的孝泰同学以他的亲身经历来"辟谣",并广发英雄帖- ...

  9. 知识分享之Golang——go-i18n国际化组件

    知识分享之Golang--go-i18n国际化组件 背景 知识分享之Golang篇是我在日常使用Golang时学习到的各种各样的知识的记录,将其整理出来以文章的形式分享给大家,来进行共同学习.欢迎大家 ...

最新文章

  1. Linux网络编程实例分析
  2. 【10.9】multiprocessing多进程编程
  3. JQuery变量数字相加的研究
  4. 数学建模模型概述框架
  5. kafka学习笔记:知识点整理
  6. python 跳一跳辅助_python实现跳一跳辅助的实验报告
  7. python爬虫之图片
  8. 又拍网架构中的分库设计
  9. 电脑显示计算机无法显示,如果计算机无法打开怎么办?
  10. 幼儿学数数的c语言程序,【资源学习】c语言程序代码,登录幼儿园200个小朋友的数据...
  11. android rn 和webview,RN Webview与Web的通信与调试
  12. 查看容器ID以及如何在docker和宿主机之间复制文件
  13. STM32-TFTLCD显示
  14. 要求在ASP.NET Core 2.2中确认电子邮件——第1部分
  15. ISR4K-IOS XE EPC
  16. linux怎么启动ibus框架,fedora13 gnu/linux下 重启启动ibus输入法框架
  17. jmeter(一)基础介绍
  18. 机器人的核心——运动控制器
  19. 使用GoodSync备份服务器文件
  20. 阿里云Dataworks平台应用

热门文章

  1. 【鸿蒙 HarmonyOS】创建 Java 语言 HarmonyOS 手机应用 ( 首次进入 DevEco Studio 配置环境 | 创建 Java 手机工程 | 鸿蒙工程代码目录简介 )
  2. python -yield理解
  3. 认真工作的原因以及方法
  4. docker虚拟机动态扩展内存
  5. maven工程导入eclipse后报错
  6. Eclipse Class Decompiler---Java反编译插件
  7. 循序渐进看Java web日志跟踪(1)-Tomcat 日志追踪与配置
  8. sublime text3输入中文的问题.
  9. 微软算法100题26 左旋转字符串
  10. SQL语句判断数据库、表、字段是否存在