domain.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. // Copyright 2013 ChaiShushan <chaishushan{AT}gmail.com>. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package gettext
  5. import (
  6. "sync"
  7. )
  8. type domainManager struct {
  9. mutex sync.Mutex
  10. locale string
  11. domain string
  12. domainMap map[string]*fileSystem
  13. trTextMap map[string]*translator
  14. }
  15. func newDomainManager() *domainManager {
  16. return &domainManager{
  17. locale: DefaultLocale,
  18. domainMap: make(map[string]*fileSystem),
  19. trTextMap: make(map[string]*translator),
  20. }
  21. }
  22. func (p *domainManager) makeTrMapKey(domain, locale string) string {
  23. return domain + "_$$$_" + locale
  24. }
  25. func (p *domainManager) Bind(domain, path string, data []byte) (domains, paths []string) {
  26. p.mutex.Lock()
  27. defer p.mutex.Unlock()
  28. switch {
  29. case domain != "" && path != "": // bind new domain
  30. p.bindDomainTranslators(domain, path, data)
  31. case domain != "" && path == "": // delete domain
  32. p.deleteDomain(domain)
  33. }
  34. // return all bind domain
  35. for k, fs := range p.domainMap {
  36. domains = append(domains, k)
  37. paths = append(paths, fs.FsName)
  38. }
  39. return
  40. }
  41. func (p *domainManager) SetLocale(locale string) string {
  42. p.mutex.Lock()
  43. defer p.mutex.Unlock()
  44. if locale != "" {
  45. p.locale = locale
  46. }
  47. return p.locale
  48. }
  49. func (p *domainManager) SetDomain(domain string) string {
  50. p.mutex.Lock()
  51. defer p.mutex.Unlock()
  52. if domain != "" {
  53. p.domain = domain
  54. }
  55. return p.domain
  56. }
  57. func (p *domainManager) Getdata(name string) []byte {
  58. return p.getdata(p.domain, name)
  59. }
  60. func (p *domainManager) DGetdata(domain, name string) []byte {
  61. return p.getdata(domain, name)
  62. }
  63. func (p *domainManager) PNGettext(msgctxt, msgid, msgidPlural string, n int) string {
  64. p.mutex.Lock()
  65. defer p.mutex.Unlock()
  66. return p.gettext(p.domain, msgctxt, msgid, msgidPlural, n)
  67. }
  68. func (p *domainManager) DPNGettext(domain, msgctxt, msgid, msgidPlural string, n int) string {
  69. p.mutex.Lock()
  70. defer p.mutex.Unlock()
  71. return p.gettext(domain, msgctxt, msgid, msgidPlural, n)
  72. }
  73. func (p *domainManager) gettext(domain, msgctxt, msgid, msgidPlural string, n int) string {
  74. if p.locale == "" || p.domain == "" {
  75. return msgid
  76. }
  77. if _, ok := p.domainMap[domain]; !ok {
  78. return msgid
  79. }
  80. if f, ok := p.trTextMap[p.makeTrMapKey(domain, p.locale)]; ok {
  81. return f.PNGettext(msgctxt, msgid, msgidPlural, n)
  82. }
  83. return msgid
  84. }
  85. func (p *domainManager) getdata(domain, name string) []byte {
  86. if p.locale == "" || p.domain == "" {
  87. return nil
  88. }
  89. if _, ok := p.domainMap[domain]; !ok {
  90. return nil
  91. }
  92. if fs, ok := p.domainMap[domain]; ok {
  93. if data, err := fs.LoadResourceFile(domain, p.locale, name); err == nil {
  94. return data
  95. }
  96. if p.locale != "default" {
  97. if data, err := fs.LoadResourceFile(domain, "default", name); err == nil {
  98. return data
  99. }
  100. }
  101. }
  102. return nil
  103. }