Skip to content

Go library used to retrieve the current locale(s) of the operating system.

License

Notifications You must be signed in to change notification settings

fyne-io/go-locale

 
 

Repository files navigation

go-locale

PkgGoDev Go Report Card Coverage Status test

Go library used to retrieve the current locale(s) of the operating system.

OS Support

  • Windows
    Using GetUserDefaultLocaleName and GetSystemDefaultLocaleName.
  • macOS
    Using defaults read -g AppleLocale and defaults read -g AppleLanguages (since environment variables like LANG are not usually set on macOS).
  • Unix-like systems (Linux, BSD, etc.)
    Using the LANGUAGE, LC_ALL, LC_MESSAGES and LANG environment variables.
  • WASM (JavaScript)
    Using navigator.language and navigator.languages.
  • iOS
    Using [NSLocale preferredLanguages].
    • Android
      Using getResources().getConfiguration().getLocales for Android N or later, or getResources().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/fyne-io/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/fyne-io/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/fyne-io/go-locale"
	"golang.org/x/text/message"
)

func main() {
	userLocales, _ := locale.GetLocales()
	p := message.NewPrinter(message.MatchLanguage(userLocales...))
	...
}
import (
	"github.com/fyne-io/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

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. This repository is a fork of jeandeaual/go-locale, this fork will be removed when the upgrades it contains are merged upstream.

About

Go library used to retrieve the current locale(s) of the operating system.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Go 72.4%
  • C 25.2%
  • Dockerfile 1.3%
  • Objective-C 1.1%