Very basic Golang library for i18n. There are others that do the job, but this is my take on the problem.
- Storing messages in JSON files.
- Support for nested declarations.
- Detecting language based on Request headers.
- Very simple to use.
-
Import Lingo into your project
import "github.com/kortem/lingo"
-
Create a dir to store translations, and write them in JSON files named [locale].json. For example:
en_US.json sr_RS.json de.json ...
You can write nested JSON too.
{ "main.title" : "CutleryPlus", "main.subtitle" : "Knives that put cut in cutlery.", "menu" : { "home" : "Home", "products": { "self": "Products", "forks" : "Forks", "knives" : "Knives", "spoons" : "Spoons" }, } }
-
Initialize a Lingo like this:
l := lingo.New("default_locale", "path/to/translations/dir")
-
Get bundle for specific locale via either
string
:t1 := l.TranslationsForLocale("en_US") t2 := l.TranslationsForLocale("de_DE")
This way Lingo will return the bundle for specific locale, or default if given is not found. Alternatively (or primarily), you can get it with
*http.Request
:t := l.TranslationsForRequest(req)
This way Lingo finds best suited locale via
Accept-Language
header, or if there is no match, returns default.Accept-Language
header is set by the browser, so basically it will serve the language the user has set to his browser. -
Once you get T instance just fire away!
r1 := t1.Value("main.subtitle") // "Knives that put cut in cutlery." r1 := t2.Value("main.subtitle") // "Messer, die legte in Besteck geschnitten." r3 := t1.Value("menu.products.self") // "Products" r5 := t1.Value("error.404", req.URL.Path) // "Page index.html not found!"
I regard this little library as feature-complete, but if you have an idea on how to improve it, feel free to create issues. Also, pull requests are welcome. Enjoy!