lang_manager.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. package UI
  2. import (
  3. "fmt"
  4. "github.com/go-ini/ini"
  5. "github.com/veandco/go-sdl2/ttf"
  6. "io/ioutil"
  7. "path/filepath"
  8. "strings"
  9. )
  10. func sliceToInt(s []int) int {
  11. res := 0
  12. op := 1
  13. for i := len(s) - 1; i >= 0; i-- {
  14. res += s[i] * op
  15. op *= 10
  16. }
  17. return res
  18. }
  19. func ParseNum(s string) []int {
  20. nLen := 0
  21. for i := 0; i < len(s); i++ {
  22. if b := s[i]; '0' <= b && b <= '9' {
  23. nLen++
  24. }
  25. }
  26. var n = make([]int, 0, nLen)
  27. for i := 0; i < len(s); i++ {
  28. if b := s[i]; '0' <= b && b <= '9' {
  29. n = append(n, int(b)-'0')
  30. }
  31. }
  32. return n
  33. }
  34. func GetNumberFromString(s string) int {
  35. is := ParseNum(s)
  36. return sliceToInt(is)
  37. }
  38. type LangManager struct {
  39. Langs map[string]string
  40. ConfigFilename string
  41. CJKMode bool
  42. }
  43. func NewLangManager() *LangManager {
  44. p := &LangManager{}
  45. p.ConfigFilename = "00_English.ini"
  46. p.CJKMode = false
  47. return p
  48. }
  49. func (self *LangManager) Init() {
  50. if self.Langs == nil {
  51. self.SetLangs()
  52. }
  53. }
  54. func (self *LangManager) UpdateLang() {
  55. self.Langs = nil
  56. self.SetLangs()
  57. }
  58. func (self *LangManager) IsCJKMode() bool {
  59. var latins = [1]string{"English"}
  60. self.CJKMode = false
  61. for _, v := range latins {
  62. if strings.HasPrefix(self.ConfigFilename, v) {
  63. self.CJKMode = false
  64. break
  65. }
  66. }
  67. return self.CJKMode
  68. }
  69. func (self *LangManager) SetLangs() {
  70. self.Langs = make(map[string]string)
  71. fname := "sysgo/.lang"
  72. load_opts := ini.LoadOptions{
  73. IgnoreInlineComment: true,
  74. }
  75. if FileExists(fname) {
  76. config_bytes, err := ioutil.ReadFile(fname)
  77. if err == nil {
  78. self.ConfigFilename = strings.Trim(string(config_bytes), "\r\n ")
  79. if len(self.ConfigFilename) < 3 {
  80. self.ConfigFilename = "00_English.ini"
  81. }
  82. }
  83. } else {
  84. System("touch " + fname)
  85. }
  86. config_file_relative_path := filepath.Join("sysgo", "langs", self.ConfigFilename)
  87. if FileExists(config_file_relative_path) == false {
  88. return
  89. }
  90. //no matter what ,we must have 00_English.ini
  91. cfg, err := ini.LoadSources(load_opts, config_file_relative_path)
  92. if err != nil {
  93. fmt.Printf("Fail to read file: %v\n", err)
  94. return
  95. }
  96. section := cfg.Section("Langs")
  97. if section != nil {
  98. opts := section.KeyStrings()
  99. for _, v := range opts {
  100. self.Langs[v] = section.Key(v).String()
  101. }
  102. }
  103. }
  104. func (self *LangManager) Tr(english_key_str string) string {
  105. if self.Langs == nil {
  106. return english_key_str
  107. }
  108. if len(self.Langs) == 0 {
  109. return english_key_str
  110. }
  111. if v, ok := self.Langs[english_key_str]; ok {
  112. return v
  113. }
  114. return english_key_str
  115. }
  116. func (self *LangManager) TrFont(orig_font_str string) *ttf.Font {
  117. font_size_number := GetNumberFromString(orig_font_str)
  118. if font_size_number > 120 {
  119. panic("font string format error")
  120. }
  121. if strings.Contains(self.ConfigFilename, "English.ini") {
  122. return Fonts[orig_font_str]
  123. } else {
  124. if font_size_number > 28 {
  125. panic("cjk font size over 28")
  126. }
  127. }
  128. return Fonts[fmt.Sprintf("notosanscjk%d", font_size_number)]
  129. }
  130. var MyLangManager *LangManager