4.8 KiB
go-locale
Go library used to retrieve the current locale(s) of the operating system.
OS Support
-
Windows
UsingGetUserDefaultLocaleNameandGetSystemDefaultLocaleName. -
macOS
Using[Bundle preferredLocalizations], falling back to callingdefaults read -g AppleLocaleanddefaults read -g AppleLanguages(since environment variables likeLANGare not usually set on macOS). -
Unix-like systems (Linux, BSD, etc.)
Using theLANGUAGE,LC_ALL,LC_MESSAGESandLANGenvironment variables. -
WASM (JavaScript)
Usingnavigator.languageandnavigator.languages. -
iOS
Using[NSLocale preferredLanguages]. -
Android
UsinggetResources().getConfiguration().getLocalesfor Android N or later, orgetResources().getConfiguration().localeotherwise.Note: for Android, you'll first need to call
SetRunOnJVM, depending on which mobile framework you're using:-
For Fyne:
import ( "fyne.io/fyne/v2/driver" "github.com/jeandeaual/go-locale" ) func init() { locale.SetRunOnJVM(func(fn func(vm, env, ctx uintptr) error) error { driver.RunNative(func(ctx interface{}) error { and := ctx.(*driver.AndroidContext) return fn(and.VM, and.Env, and.Ctx) }) return nil }) } -
For gomobile:
import ( "golang.org/x/mobile/app" "github.com/jeandeaual/go-locale" ) func init() { locale.SetRunOnJVM(app.RunOnJVM) }
-
Usage
GetLocales
GetLocales returns the user's preferred locales, by order of preference, as a slice of IETF BCP 47 language tag (e.g. []string{"en-US", "fr-FR", "ja-JP"}).
This works if the user set multiple languages on macOS and other Unix systems. Otherwise, it returns a slice with a single locale.
userLocales, err := locale.GetLocales()
if err == nil {
fmt.Println("Locales:", userLocales)
}
This can be used with golang.org/x/text or go-i18n to set the localizer's language preferences:
import (
"github.com/jeandeaual/go-locale"
"golang.org/x/text/message"
)
func main() {
userLocales, _ := locale.GetLocales()
p := message.NewPrinter(message.MatchLanguage(userLocales...))
...
}
import (
"github.com/jeandeaual/go-locale"
"github.com/nicksnyder/go-i18n/v2/i18n"
"golang.org/x/text/language"
)
func main() {
userLocales, _ := locale.GetLocales()
bundle := i18n.NewBundle(language.English)
localizer := i18n.NewLocalizer(bundle, userLocales...)
...
}
GetLocale
GetLocale returns the current locale as defined in IETF BCP 47 (e.g. "en-US").
userLocale, err := locale.GetLocale()
if err == nil {
fmt.Println("Locale:", userLocale)
}
GetLanguage
GetLanguage returns the current language as an ISO 639 language code (e.g. "en").
userLanguage, err := locale.GetLanguage()
if err == nil {
fmt.Println("Language:", userLocale)
}
GetRegion
GetRegion returns the current language as an ISO 3166 country code (e.g. "US").
userRegion, err := locale.GetRegion()
if err == nil {
fmt.Println("Region:", userRegion)
}
Aknowledgements
Inspired by jibber_jabber.