i18n

package module
v3.0.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 14, 2022 License: GPL-3.0 Imports: 7 Imported by: 0

README

go-i18n

用最简单的方法让你的go程序支持国际化,我们使用接口来支持多种驱动的扩展。

注意

目前文档不是很齐全, 源码的 test 目录会是一个好的指引。
目前支持的驱动都在 test 目录写了测试。根据自己的需求,复制对应的代码即可。

目前支持的驱动

  • json 格式的语言文件
  • Embed 嵌入式文件系统 (使用 json格式数据)
  • go-bindata 嵌入式文件系统 (使用 json格式数据)
  • 直接使用 string (使用 json 格式数据)
  • 直接使用 []byte (使用 json 格式数据)
  • toml 格式
  • yml 格式
  • xml 格式
  • sqlite
  • postgresql
  • redis
  • 其他你想支持的任何数据源

语言支持

  • 中文
  • English
  • other

有用的功能

  • 合并多个目录下的语言文件 AddLang(driver contract.I18NDriver),假如你有两个目录下都有中文的语言包,你可以把他们合并。

如何使用

import "gopkg.in/guoliang1994/go-i18n.v2"

语言文件示例

{
  "install": {
    "success": {
      "en": "{{program}} install success",
      "zh": "{{program}}安装成功"
    },
    "error": {
      "en": "{{program}} install fail, error:{{reason}}",
      "zh": "{{program}}安装失败, 失败原因:{{reason}}"
    }
  },
  "uninstall": {
    "success": {
      "en": "",
      "zh": "{{program}}卸载成功"
    },
    "error": {
      "en": "",
      "zh": "{{program}}卸载失败"
    }
  },
  "start": {
    "success": {
      "en": "",
      "zh": "{{program}}启动成功"
    },
    "error": {
      "en": "",
      "zh": "{{program}}启动失败"
    }
  },
  "appName": {
    "en": "",
    "zh": "国际化支持"
  },
  "needRoot": {
    "en": "",
    "zh": "需要root用户"
  }
}

使用 json 驱动
使用 T 方法获取语言, 第一个参数是路径,后面是动态参数,用于替换占位符号
路径可以支持无限极,用 「.」 语法,就像 JavaScript 取对象属性


func TestDynamicAddLang(t *testing.T) {
    lang := i18n.NewI18N(i18n.Zh_CN)
    driver1 := driver.NewJsonFileI18nImpl("lang/")
    driver2 := driver.NewJsonFileI18nImpl("lang2/")
    //driver2 := driver.NewGoBindataI18NImpl(Asset, "lang/")
    msg := lang.AddLang(driver1).AddLang(driver2).T("install.success", "np")
    assert := "np安装成功"
    if msg != assert {
        t.Fatal("want:", assert, "get", msg)
    }
    msg = lang.ChangeLocation(i18n.En_WW).T("install.success", "np")
    assert = "np install success"
    if msg != assert {
        t.Fatal("want:", assert, "get", msg)
    }
    msg = lang.ChangeLocation(i18n.En_WW).T("extend.success")
    assert = "扩展语言成功"
    if msg != assert {
        t.Fatal("want:", assert, "get", msg)
    }
}

如何实现其他文件类型或数据库驱动

这是 json 的实现,你只需要实现 contract.I18NDriver 中的接口即可

type JsonFileI18NImpl struct {
    langDir string
}

func NewJsonFileI18nImpl(langDir string) contract.I18NDriver {
    f := JsonFileI18NImpl{
        langDir: langDir,
    }
    return &f
}

func (Self *JsonFileI18NImpl) LoadLang() []byte {
    fileName := fmt.Sprintf(Self.langDir + "lang.json")
    data, err := ioutil.ReadFile(fileName)
    if err != nil {
        fmt.Println(contract.PkgName, ": json file load lang  err,", err)
    }
    return data
}


欢迎各路大神提供不同的驱动

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func JsonMerge

func JsonMerge(dst, src map[string]interface{}) map[string]interface{}

Types

type I18N

type I18N struct {
	// contains filtered or unexported fields
}

func NewI18N

func NewI18N(location Location) *I18N

func (*I18N) AddLang

func (Self *I18N) AddLang(driver contract.I18NDriver) *I18N

func (*I18N) ChangeLocation

func (Self *I18N) ChangeLocation(location Location) *I18N

ChangeLocation the function can change location when the program is running

func (*I18N) T

func (Self *I18N) T(keyPath string, placeholder ...string) string

T get lang

type Location

type Location string
const En_WW Location = "en_WW"
const Zh_CN Location = "zh_CN"

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL