Golang获取系统语言

时间:2018-08-13 19:33:00

标签: go internationalization

有一个获取用户系统语言的功能,但我在Go网站上的任何地方都找不到。

为澄清我的问题,我想要当前用户的系统语言,这意味着,例如,当系统上的所有内容都为荷兰语时,我想获取“ dutch”或“ nl”

注意:该程序可以在linux,mac和Windows上运行

4 个答案:

答案 0 :(得分:2)

在类似Unix的系统(Mac OS,Linux)上,您可以使用os软件包通过LookupEnv获取环境变量。因此,例如,您可以使用以下方式获取系统语言/编码:

s, ok := os.LookupEnv("LANG")
println(s, err)
=> en_US.UTF-8 true

golang.org博客上也可能有您感兴趣的博客文章(有关更多信息,请在了解系统语言设置后选择语言):

https://blog.golang.org/matchlang

在Windows上,如果上述方法不起作用,您也许可以使用此软件包从注册表中获取语言(我先尝试os.LookupEnv)。

https://godoc.org/golang.org/x/sys/windows/registry

答案 1 :(得分:2)

有一个很好的跨平台库,名为 jibber_jabber 它会在Unix系统中查找extension UIImage { // Crops an input image (self) to a specified rect func cropToRect(rect: CGRect!) -> UIImage? { // Correct rect size based on the device screen scale let scaledRect = CGRectMake(rect.origin.x * self.scale, rect.origin.y * self.scale, rect.size.width * self.scale, rect.size.height * self.scale); // New CGImage reference based on the input image (self) and the specified rect let imageRef = CGImageCreateWithImageInRect(self.CGImage, scaledRect); // Gets an UIImage from the CGImage let result = UIImage(CGImage: imageRef, scale: self.scale, orientation: self.imageOrientation) // Returns the final image, or NULL on error return result; } } // Crops an image to 100x100 pixels, 150px from left and 200px from top let exampleImage = UIImage(named: "yourImageFile") let croppedImage = exampleImage?.cropToRect(CGRectMake(150.0, 200.0, 100.0, 100.0)) if croppedImage != nil { // Your image was cropped } else { // Something went wrong } $LC_ALL env变量,对于Windows,会加载 Kernel32 并调用诸如$LANGGetUserDefaultLocaleName之类的过程内。 对于Windows,所有操作均在 getWindowsLocale() 功能。 请注意,Windows OS内核内置了Kernel32库。

顺便说一句,如果您需要转换语言环境格式的语言字符串,例如GetSystemDefaultLocaleNameen_US,则可以利用 x/text/languagex/text/language/display 软件包以获得该语言的完全限定名称。

fr_FR

答案 2 :(得分:1)

一种方法是依次尝试以下策略:

  1. 查看是否设置了LANG环境变量并使用该值(在UNIX系统上很常见)。
  2. 在Windows上执行powershell并解压缩Get-Culture "Name" property

例如:

func main() {
  locale, err := GetLocale()
  fmt.Printf("OK: locale=%q, err=%v\n", locale, err)
  // OK: locale="en-US", err=nil
}

func GetLocale() (string, error) {
  // Check the LANG environment variable, common on UNIX.
  // XXX: we can easily override as a nice feature/bug.
  envlang, ok := os.LookupEnv("LANG")
  if ok {
    return strings.Split(envlang, ".")[0], nil
  }

  // Exec powershell Get-Culture on Windows.
  cmd := exec.Command("powershell", "Get-Culture | select -exp Name")
  output, err := cmd.Output()
  if err == nil {
    return strings.Trim(string(output), "\r\n"), nil
  }

  return "", fmt.Errorf("cannot determine locale")
}

按此顺序执行这些操作很方便,因为它使您可以轻松更改语言环境(例如,进行测试),并且可以在UNIX和Windows操作系统上使用。

答案 3 :(得分:0)

我也改进了@maerics答案以支持MacOS:

func getLocale() (string, string) {
    osHost := runtime.GOOS
    defaultLang := "en"
    defaultLoc := "US"
    switch osHost {
    case "windows":
        // Exec powershell Get-Culture on Windows.
        cmd := exec.Command("powershell", "Get-Culture | select -exp Name")
        output, err := cmd.Output()
        if err == nil {
            langLocRaw := strings.TrimSpace(string(output))
            langLoc := strings.Split(langLocRaw, "-")
            lang := langLoc[0]
            loc := langLoc[1]
            return lang, loc
        }
    case "darwin":
        // Exec powershell Get-Culture on Windows.
        cmd := exec.Command("sh", "osascript -e 'user locale of (get system info)'")
        output, err := cmd.Output()
        if err == nil {
            langLocRaw := strings.TrimSpace(string(output))
            langLoc := strings.Split(langLocRaw, "_")
            lang := langLoc[0]
            loc := langLoc[1]
            return lang, loc
        }
    case "linux":
        envlang, ok := os.LookupEnv("LANG")
        if ok {
            langLocRaw := strings.TrimSpace(envlang)
            langLocRaw = strings.Split(envlang, ".")[0]
            langLoc := strings.Split(langLocRaw, "_")
            lang := langLoc[0]
            loc := langLoc[1]
            return lang, loc
        }
    }
    return defaultLang, defaultLoc
}

func main() {
    lang, loc := getLocale()
    fmt.Printf("OK: language=%s, locale=%s", lang, loc)
}