Home
Softono
gettext-go

gettext-go

Open source BSD-3-Clause Go
95
Stars
26
Forks
10
Issues
5
Watchers
2 years
Last Commit

About gettext-go

:ab: GNU gettext for Go (Imported By Kubernetes)

Platforms

Web Self-hosted Kubernetes

Languages

Go

gettext-go: GNU gettext for Go (Imported By Kubernetes)

Install

  1. go get github.com/chai2010/gettext-go
  2. go run hello.go

The godoc.org or go.dev has more information.

Examples

package main

import (
    "fmt"

    "github.com/chai2010/gettext-go"
)

func main() {
    gettext := gettext.New("hello", "./examples/locale").SetLanguage("zh_CN")
    fmt.Println(gettext.Gettext("Hello, world!"))

    // Output: 你好, 世界!
}
package main

import (
    "fmt"

    "github.com/chai2010/gettext-go"
)

func main() {
    gettext.SetLanguage("zh_CN")
    gettext.BindLocale(gettext.New("hello", "locale"))

    // gettext.BindLocale("hello", "locale")              // from locale dir
    // gettext.BindLocale("hello", "locale.zip")          // from locale zip file
    // gettext.BindLocale("hello", "locale.zip", zipData) // from embedded zip data

    // translate source text
    fmt.Println(gettext.Gettext("Hello, world!"))
    // Output: 你好, 世界!

    // if no msgctxt in PO file (only msgid and msgstr),
    // specify context as "" by
    fmt.Println(gettext.PGettext("", "Hello, world!"))
    // Output: 你好, 世界!

    // translate resource
    fmt.Println(string(gettext.Getdata("poems.txt"))))
    // Output: ...
}

Go file: hello.go; PO file: hello.po;


API Changes (v0.1.0 vs v1.0.0)

Renamed package path

v0.1.0 (old) v1.0.0 (new)
github.com/chai2010/gettext-go/gettext github.com/chai2010/gettext-go
github.com/chai2010/gettext-go/gettext/po github.com/chai2010/gettext-go/po
github.com/chai2010/gettext-go/gettext/mo github.com/chai2010/gettext-go/mo
github.com/chai2010/gettext-go/gettext/plural github.com/chai2010/gettext-go/plural

Renamed functions

v0.1.0 (old) v1.0.0 (new)
gettext-go/gettext.* gettext-go.*
gettext-go/gettext.DefaultLocal gettext-go.DefaultLanguage
gettext-go/gettext.BindTextdomain gettext-go.BindLocale
gettext-go/gettext.Textdomain gettext-go.SetDomain
gettext-go/gettext.SetLocale gettext-go.SetLanguage
gettext-go/gettext/po.Load gettext-go/po.LoadFile
gettext-go/gettext/po.LoadData gettext-go/po.Load
gettext-go/gettext/mo.Load gettext-go/mo.LoadFile
gettext-go/gettext/mo.LoadData gettext-go/mo.Load

Use empty string as the default context for gettext.Gettext

package main

// v0.1.0
// if the **context** missing, use `callerName(2)` as the context:

// v1.0.0
// if the **context** missing, use empty string as the context:

func main() {
    gettext.Gettext("hello")          
    // v0.1.0 => gettext.PGettext("main.main", "hello")
    // v1.0.0 => gettext.PGettext("", "hello")

    gettext.DGettext("domain", "hello")
    // v0.1.0 => gettext.DPGettext("domain", "main.main", "hello")
    // v1.0.0 => gettext.DPGettext("domain", "", "hello")

    gettext.NGettext("domain", "hello", "hello2", n)
    // v0.1.0 => gettext.PNGettext("domain", "main.main", "hello", "hello2", n)
    // v1.0.0 => gettext.PNGettext("domain", "", "hello", "hello2", n)

    gettext.DNGettext("domain", "hello", "hello2", n)
    // v0.1.0 => gettext.DPNGettext("domain", "main.main", "hello", "hello2", n)
    // v1.0.0 => gettext.DPNGettext("domain", "", "hello", "hello2", n)
}

BindLocale support FileSystem interface

// Use FileSystem:
//  BindLocale(New("poedit", "name", OS("path/to/dir"))) // bind "poedit" domain
//  BindLocale(New("poedit", "name", OS("path/to.zip"))) // bind "poedit" domain

New API in v1.0.0

Gettexter interface:

type Gettexter interface {
    FileSystem() FileSystem

    GetDomain() string
    SetDomain(domain string) Gettexter

    GetLanguage() string
    SetLanguage(lang string) Gettexter

    Gettext(msgid string) string
    PGettext(msgctxt, msgid string) string

    NGettext(msgid, msgidPlural string, n int) string
    PNGettext(msgctxt, msgid, msgidPlural string, n int) string

    DGettext(domain, msgid string) string
    DPGettext(domain, msgctxt, msgid string) string
    DNGettext(domain, msgid, msgidPlural string, n int) string
    DPNGettext(domain, msgctxt, msgid, msgidPlural string, n int) string

    Getdata(name string) []byte
    DGetdata(domain, name string) []byte
}

func New(domain, path string, data ...interface{}) Gettexter

FileSystem interface:

type FileSystem interface {
    LocaleList() []string
    LoadMessagesFile(domain, lang, ext string) ([]byte, error)
    LoadResourceFile(domain, lang, name string) ([]byte, error)
    String() string
}

func NewFS(name string, x interface{}) FileSystem
func OS(root string) FileSystem
func ZipFS(r *zip.Reader, name string) FileSystem
func NilFS(name string) FileSystem

BUGS

Please report bugs to [email protected].

Thanks!