GNU gettext utilities for Go.
gotext is a native Go implementation of the GNU Gettext utilities. It provides a thread-safe, flexible, and powerful way to handle internationalization (i18n) and localization (l10n) in your Go applications.
- Features
- Installation
- Getting Started
- CLI Tool (xgotext)
- Advanced Usage
- Directory Structure
- Contributing
- License
- Native Go implementation of Gettext (no external dependencies).
- Full support for PO and MO files.
- Pluralization rules support via GNU Gettext plural-form expressions.
- Message context support (
msgctxt). - Thread-safe for concurrent use.
- Works with UTF-8 by default.
- Integrated CLI tool (
xgotext) for string extraction. - Serializable objects for caching.
- Seamless integration with Go's
text/templateandhtml/template.
go get github.com/leonelquinteros/gotextFor a quick start, use the package-level API:
package main
import (
"fmt"
"github.com/leonelquinteros/gotext"
)
func main() {
// Configure package: locales path, language, and domain
gotext.Configure("/path/to/locales", "en_US", "default")
// Simple translation
fmt.Println(gotext.Get("Hello, world!"))
// Translation with variables
fmt.Println(gotext.Get("Hello, %s!", "Gopher"))
}For more details, see the Getting Started Guide.
gotext includes a command-line tool to extract translatable strings from your Go source code.
Install xgotext:
go install github.com/leonelquinteros/gotext/cli/xgotext@latestExtract strings:
xgotext -p . -o locales/en_US/default.poSee the xgotext Documentation for full usage details.
For managing multiple languages or domains independently:
l := gotext.NewLocale("/path/to/locales", "es_UY")
l.AddDomain("default")
fmt.Println(l.Get("Translate this"))gotext handles complex pluralization rules defined in PO headers:
// GetN(singular, plural, quantity, args...)
fmt.Println(gotext.GetN("I have one apple.", "I have %d apples.", 5, 5))See the Plural Forms Guide for more examples.
Supports standard fmt package syntax:
name := "John"
fmt.Println(gotext.Get("Hi, my name is %s", name))The package expects a standard Gettext directory structure:
/path/to/locales
/en_US
/LC_MESSAGES
default.po
/es_ES
default.po
It supports automatic language simplification (e.g., falling back from en_UK to en).
We welcome contributions of all kinds!
gotext is released under the MIT License.