57 lines
1.1 KiB
Go
57 lines
1.1 KiB
Go
package lang
|
|
|
|
import (
|
|
"github.com/jeandeaual/go-locale"
|
|
"golang.org/x/text/language"
|
|
|
|
"fyne.io/fyne/v2"
|
|
)
|
|
|
|
// SystemLocale returns the primary locale on the current system.
|
|
// This may refer to a language that Fyne does not have translations for.
|
|
func SystemLocale() fyne.Locale {
|
|
loc, err := locale.GetLocale()
|
|
if err != nil {
|
|
fyne.LogError("Failed to look up user locale", err)
|
|
}
|
|
if len(loc) < 2 {
|
|
loc = "en"
|
|
}
|
|
|
|
tag, err := language.Parse(loc)
|
|
if err != nil {
|
|
fyne.LogError("Error parsing user locale "+loc, err)
|
|
}
|
|
return localeFromTag(tag)
|
|
}
|
|
|
|
func closestSupportedLocale(locs []string) fyne.Locale {
|
|
matcher := language.NewMatcher(translated)
|
|
|
|
tags := make([]language.Tag, len(locs))
|
|
for i, loc := range locs {
|
|
tag, err := language.Parse(loc)
|
|
if err != nil {
|
|
fyne.LogError("Error parsing user locale "+loc, err)
|
|
}
|
|
tags[i] = tag
|
|
}
|
|
best, _, _ := matcher.Match(tags...)
|
|
return localeFromTag(best)
|
|
}
|
|
|
|
func localeFromTag(in language.Tag) fyne.Locale {
|
|
b, s, r := in.Raw()
|
|
ret := b.String()
|
|
|
|
if r.String() != "ZZ" {
|
|
ret += "-" + r.String()
|
|
|
|
if s.String() != "Zzzz" {
|
|
ret += "-" + s.String()
|
|
}
|
|
}
|
|
|
|
return fyne.Locale(ret)
|
|
}
|