Coder Social home page Coder Social logo

go-locale's Introduction

go-locale

Build Status Go Doc Go Ver License go locale

go-locale is a Golang lib for cross-platform locale detection.

OS Support

Support all OS that Golang supported, except android:

POSIX Compatible Systems

  • Lookup env LANGUAGE
  • Lookup env LC_ALL
  • Lookup env LC_MESSAGES
  • Lookup env LANG
  • Read file $XDG_CONFIG_HOME/locale.conf
  • Read file $HOME/.config/locale.conf
  • Read file /etc/locale.conf

Js

  • Lookup env LANGUAGE
  • Lookup env LC_ALL

Windows

  • Lookup env LANGUAGE
  • Lookup env LC_ALL
  • Lookup env LC_MESSAGES
  • Lookup env LANG
  • Windows Registry

macOS X (darwin)

  • Lookup env LANGUAGE
  • Lookup env LC_ALL
  • Lookup env LC_MESSAGES
  • Lookup env LANG
  • macOS X User Defaults System
    • Lookup user AppleLocale
    • Lookup user AppleLanguages
    • Lookup global AppleLocale
    • Lookup global AppleLanguages

Usage

import (
    "github.com/Xuanwo/go-locale"
)

func main() {
    tag, err := locale.Detect()
    if err != nil {
        log.Fatal(err)
    }
    // Have fun with language.Tag!

    tags, err := locale.DetectAll()
    if err != nil {
        log.Fatal(err)
    }
    // Get all available tags
}

Acknowledgments

Inspired by jibber_jabber

go-locale's People

Contributors

dependabot[bot] avatar despair86 avatar keinos avatar sumit-tembe avatar uded avatar xuanwo avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

go-locale's Issues

LC_MESSAGES=C should overwrite $LANGUAGE env

References:

https://www.gnu.org/software/gettext/manual/gettext.html#Locale-Environment-Variables

Not all programs have translations for all languages. By default, an English message is shown in place of a nonexistent translation. If you understand other languages, you can set up a priority list of languages. This is done through a different environment variable, called LANGUAGE. GNU gettext gives preference to LANGUAGE over LC_ALL and LANG for the purpose of message handling, but you still need to have LANG (or LC_ALL) set to the primary language; this is required by other parts of the system libraries. For example, some Swedish users who would rather read translations in German than English for when Swedish is not available, set LANGUAGE to ‘sv:de’ while leaving LANG to ‘sv_SE’.

Roadmap to v1

  • Bump version to v1
  • Add env support for windows
  • Cover all platform that go supports

Support all GOOS

  • android
  • darwin
  • dragonfly
  • freebsd
  • linux
    - nacl
  • netbsd
  • openbsd
  • plan9
  • solaris
  • windows
  • zos

locale is not valid for locale detect

#!/bin/bash

set -e
set -o pipefail

unset LANGUAGE
unset LANG
unset LC_ALL

locale
LANG=
LANGUAGE=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=

locale needs envs to genreate correct data.

Windowns OLE detection seems inacurate

My current system setting for Internationalization in the registry key HKCU/ControlPanel/International/LocalName states pl_PL, but the library querying the system language via OLE is getting back en-US as the language.

The code below seems simpler and gets me the right locale every time:

k, err := registry.OpenKey(registry.CURRENT_USER, `Control Panel\International`, registry.QUERY_VALUE)
if err != nil {
	panic(err)
}
defer k.Close()

locale, _, err := k.GetStringValue("LocaleName")
if err != nil {
	panic(err)
}
log.printf("Detected locale: %s", locale)

LocaleName will return a full locale string, while Locale will match with the current windows_generated.go map. Tested on Windows XP/7/8/10. Sorry, I do not have Vista anywhere to test it out.

Alternatively using PowerShell is as reliable:

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

I just believe that querying the registry seems like a cleaner solution.


Code below is a live one I tested with, output at the end.

import gloc "github.com/Xuanwo/go-locale"

#[...]
	if locTag, err := gloc.Detect(); err ==nil {
		log.Printf("Detedcted language: %s\n", locTag.String())
		locale = display.Tags(locTag)
	}

	k, err := registry.OpenKey(registry.CURRENT_USER, `Control Panel\International`, registry.QUERY_VALUE)
	if err != nil {
		panic(err)
	}
	defer k.Close()

	print, _, err := k.GetStringValue("LocaleName")
	if err != nil {
		panic(err)
	}
	log.Printf("Language from registry: %s", print)
2020/08/02 14:52:55 Detedcted language: en-US
2020/08/02 14:52:55 Language from registry: pl-PL

My locale is and should be pl-PL

Windows locale detection

Looking at the windows detector, there is an map used to convert windows uint32 language code to the string representation.

// osLanguageCode is a mapping from Microsoft Windows language code to language.Tag
//
// ref:
// - https://docs.microsoft.com/en-us/windows/win32/cimwin32prov/win32-operatingsystem
// - https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry
var osLanguageCode = map[uint32]string{
0x4: "zh-Hans-CN", // Chinese (Simplified)– China
0x9: "en", // English
0x404: "zh-Hant-TW", // Chinese (Traditional) – Taiwan
0x409: "en-US", // English – United States
0x411: "ja", // Japanese
0x412: "ko", // Korean
0x804: "zh-Hans-CN", // Chinese (Simplified) – PRC
0x809: "en-US", // English – United Kingdom
}

This map isn't aligned with the content of https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry

What happen if I use a system configured from fr-latin-FR ?
Does this modules works other language than the one defined in this map ?

I'm looking for an alternative to the fork: https://github.com/cubiest/jibberjabber (the uses of some dependency is questionable)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.