Go library used to retrieve the current locale(s) of the operating system.
-
Windows
UsingGetUserDefaultLocaleName
andGetSystemDefaultLocaleName
. -
macOS
Using[Bundle preferredLocalizations]
, falling back to callingdefaults read -g AppleLocale
anddefaults read -g AppleLanguages
(since environment variables likeLANG
are not usually set on macOS). -
Unix-like systems (Linux, BSD, etc.)
Using theLANGUAGE
,LC_ALL
,LC_MESSAGES
andLANG
environment variables. -
WASM (JavaScript)
Usingnavigator.language
andnavigator.languages
. -
iOS
Using[NSLocale preferredLanguages]
. -
Android
UsinggetResources().getConfiguration().getLocales
for Android N or later, orgetResources().getConfiguration().locale
otherwise.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) }
-
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...)
...
}
For a complete example, see here.
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
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
returns the current language as an ISO 3166 country code (e.g. "US"
).
userRegion, err := locale.GetRegion()
if err == nil {
fmt.Println("Region:", userRegion)
}
Inspired by jibber_jabber.