i18ninternationalizationk8s

开门见山,这篇文章主要是灌水,仓库里有详细的使用说明和介绍。仓库地址:https://github.com/jjonline/i18n-stringer

一、go实用哲学

下面罗列一些go语言的伪哲学思想,山非山水非水,最终山还是山水还是水,颇有一股一本正经胡说八道的意味。

一切皆接口

interface
一切皆接口duck typing
anyanyinterface

只要error不要exception

exceptionpanictry {} catch {}recoverpanic恐慌
errorinterfaceError() string

枚举常量用数值类型

这里数值类型是多个类型的集合称呼,罗列出来就是int、uint、int8、uint8等等这些。

const

作为业务开发中常见的枚举值一般是推荐使用数值型,当然简单的非是即否的用布尔型也没问题,超过2个待选的枚举集合你要用字符串是可以的。

二、i18n-stringer

这个工具是因工作中的项目需要,单独定义的翻译文件可以直接丢给PM去填,是一个甩锅卷KPI的开源项目----这段是吹水。该工具参考了go官方的tool工具stringer:https://github.com/golang/tools/tree/master/cmd/stringer

buitin.error
i18n-stringerfmt.Stringerbuitin.errorError() stringString() stringgo generate//go:generatego generate
i18n-stringer

自动生成的代码方法概要

// 自动生成的代码导出方法列表
String() string
Error() string
Wrap(err error, locale string, args ..._T_) *I18nError_T_Wrap
WrapWithContext(ctx context.Context, err error, args ..._T_) *I18n_T_ErrorWrap
IsLocaleSupport(locale string) bool
Lang(ctx context.Context, args ..._T_) string
Trans(locale string, args ..._T_) string

// 自动生成的代码里还会提供一个错误包装结构体
// 结构体名称形如:I18nError_T_Wrap
// 也会提供一些导出方法列表

Translate() string
String() string
Error() string
Format() string
Value() _T_
Unwrap() error

// 以上 _T_ 指代你的数值类型的自定义类型名称
README.md
fmt.Stringerbuitin.error

TOML语言文件取语言类型标识规则

因为定义多语言的翻译文本通过toml格式文件单独配置,识别需要支持的多语言通过目录名或文件名实现。具体而言语言包目录下的toml文件的文件名被作为语言标识符,语言包目录下的文件夹名称也会被当做语言标识符,这种惯例约定可以减少很多不必要的配置麻烦,按惯例定义toml后缀的翻译文件即可,举个栗子:

.
├── i18n
│     └── en.toml
│     ├── zh_cn.toml
│     └── zh_hk
│     │     ├── user.toml
│     │     └── merchant.toml
└── pill.go
i18nen.tomlzh_cn.tomlenzh_cnzh_hkzh_hk
zh_hkzh_hkenen

关于编译后二进制文件是否要将TOML文件包含?

先给答案:不需要!

因为定义的TOML文件仅在自动生成代码时使用,属于编译前依赖,代码生成时将这些TOML文件中定义的键值对硬编码至了代码中,业务代码调用时不需要再去读取TOML文件,所以你的业务代码编译成的二进制可执行程序不需要包含这些TOML文件。

----

buitinbuitin.error

----