Command line client for Write.as https://write.as/apps/cli
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

115 lines
2.5 KiB

  1. // +build windows
  2. package jibber_jabber
  3. import (
  4. "errors"
  5. "syscall"
  6. "unsafe"
  7. )
  8. const LOCALE_NAME_MAX_LENGTH uint32 = 85
  9. var SUPPORTED_LOCALES = map[uintptr]string{
  10. 0x0407: "de-DE",
  11. 0x0409: "en-US",
  12. 0x0c0a: "es-ES", //or is it 0x040a
  13. 0x040c: "fr-FR",
  14. 0x0410: "it-IT",
  15. 0x0411: "ja-JA",
  16. 0x0412: "ko_KR",
  17. 0x0416: "pt-BR",
  18. //0x0419: "ru_RU", - Will add support for Russian when nicksnyder/go-i18n supports Russian
  19. 0x0804: "zh-CN",
  20. 0x0c04: "zh-HK",
  21. 0x0404: "zh-TW",
  22. }
  23. func getWindowsLocaleFrom(sysCall string) (locale string, err error) {
  24. buffer := make([]uint16, LOCALE_NAME_MAX_LENGTH)
  25. dll := syscall.MustLoadDLL("kernel32")
  26. proc := dll.MustFindProc(sysCall)
  27. r, _, dllError := proc.Call(uintptr(unsafe.Pointer(&buffer[0])), uintptr(LOCALE_NAME_MAX_LENGTH))
  28. if r == 0 {
  29. err = errors.New(COULD_NOT_DETECT_PACKAGE_ERROR_MESSAGE + ":\n" + dllError.Error())
  30. return
  31. }
  32. locale = syscall.UTF16ToString(buffer)
  33. return
  34. }
  35. func getAllWindowsLocaleFrom(sysCall string) (string, error) {
  36. dll, err := syscall.LoadDLL("kernel32")
  37. if err != nil {
  38. return "", errors.New("Could not find kernel32 dll")
  39. }
  40. proc, err := dll.FindProc(sysCall)
  41. if err != nil {
  42. return "", err
  43. }
  44. locale, _, dllError := proc.Call()
  45. if locale == 0 {
  46. return "", errors.New(COULD_NOT_DETECT_PACKAGE_ERROR_MESSAGE + ":\n" + dllError.Error())
  47. }
  48. return SUPPORTED_LOCALES[locale], nil
  49. }
  50. func getWindowsLocale() (locale string, err error) {
  51. dll, err := syscall.LoadDLL("kernel32")
  52. if err != nil {
  53. return "", errors.New("Could not find kernel32 dll")
  54. }
  55. proc, err := dll.FindProc("GetVersion")
  56. if err != nil {
  57. return "", err
  58. }
  59. v, _, _ := proc.Call()
  60. windowsVersion := byte(v)
  61. isVistaOrGreater := (windowsVersion >= 6)
  62. if isVistaOrGreater {
  63. locale, err = getWindowsLocaleFrom("GetUserDefaultLocaleName")
  64. if err != nil {
  65. locale, err = getWindowsLocaleFrom("GetSystemDefaultLocaleName")
  66. }
  67. } else if !isVistaOrGreater {
  68. locale, err = getAllWindowsLocaleFrom("GetUserDefaultLCID")
  69. if err != nil {
  70. locale, err = getAllWindowsLocaleFrom("GetSystemDefaultLCID")
  71. }
  72. } else {
  73. panic(v)
  74. }
  75. return
  76. }
  77. func DetectIETF() (locale string, err error) {
  78. locale, err = getWindowsLocale()
  79. return
  80. }
  81. func DetectLanguage() (language string, err error) {
  82. windows_locale, err := getWindowsLocale()
  83. if err == nil {
  84. language, _ = splitLocale(windows_locale)
  85. }
  86. return
  87. }
  88. func DetectTerritory() (territory string, err error) {
  89. windows_locale, err := getWindowsLocale()
  90. if err == nil {
  91. _, territory = splitLocale(windows_locale)
  92. }
  93. return
  94. }