lang.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package g
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "io/ioutil"
  7. "os"
  8. "path/filepath"
  9. )
  10. const (
  11. DEF_LANG = "en"
  12. DEF_LANG_EXT = ".json"
  13. )
  14. var (
  15. defaultLang *Lang
  16. ErrLangNoExists = errors.New("language path not exists")
  17. )
  18. func SetDefaultLang(l *Lang) {
  19. defaultLang = l
  20. }
  21. type Lang struct {
  22. baseDir string // lang file base dir
  23. words map[string]map[string]string // single lang words
  24. }
  25. func NewLang(dir string) *Lang {
  26. l := &Lang{
  27. baseDir: dir,
  28. words: make(map[string]map[string]string),
  29. }
  30. l.Reload()
  31. return l
  32. }
  33. func (self *Lang) Get(k string, useLang ...string) string {
  34. l := DEF_LANG
  35. if len(useLang) > 0 {
  36. l = useLang[0]
  37. }
  38. kv, ok := self.words[l]
  39. if !ok {
  40. fmt.Println("no language:", l)
  41. return ""
  42. }
  43. if word, ok := kv[k]; ok {
  44. return word
  45. }
  46. fmt.Printf("no key<%v> for lang<%v>\n", k, l)
  47. return ""
  48. }
  49. func (self *Lang) Reload() {
  50. self.scan(filepath.Join(self.baseDir))
  51. }
  52. func (self *Lang) scan(jsDir string) {
  53. self.words = make(map[string]map[string]string)
  54. err := filepath.Walk(jsDir, func(path string, info os.FileInfo, err error) error {
  55. if err != nil {
  56. return err
  57. }
  58. if info.IsDir() {
  59. self.words[info.Name()] = make(map[string]string)
  60. }
  61. if filepath.Ext(path) != DEF_LANG_EXT {
  62. return nil
  63. }
  64. langDir := filepath.Base(filepath.Dir(path))
  65. langKv, ok := self.words[langDir]
  66. if !ok {
  67. return ErrLangNoExists
  68. }
  69. fh, err := os.Open(path)
  70. if err != nil {
  71. return err
  72. }
  73. defer fh.Close()
  74. data, err := ioutil.ReadAll(fh)
  75. if err != nil {
  76. return err
  77. }
  78. partial := map[string]string{}
  79. err = json.Unmarshal(data, &partial)
  80. if err != nil {
  81. return err
  82. }
  83. for k, v := range partial {
  84. langKv[k] = v
  85. }
  86. return nil
  87. })
  88. if err != nil {
  89. fmt.Println("scan() error:", err)
  90. }
  91. }
  92. func T(k string, useLang ...string) string {
  93. if defaultLang != nil {
  94. return defaultLang.Get(k, useLang...)
  95. }
  96. return ""
  97. }