...

Source file src/github.com/chai2010/gettext-go/locale.go

Documentation: github.com/chai2010/gettext-go

     1  // Copyright 2020 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  
     5  package gettext
     6  
     7  import (
     8  	"fmt"
     9  	"sync"
    10  )
    11  
    12  type _Locale struct {
    13  	mutex     sync.Mutex
    14  	fs        FileSystem
    15  	lang      string
    16  	domain    string
    17  	trMap     map[string]*translator
    18  	trCurrent *translator
    19  }
    20  
    21  var _ Gettexter = (*_Locale)(nil)
    22  
    23  func newLocale(domain, path string, data ...interface{}) *_Locale {
    24  	if domain == "" {
    25  		domain = "default"
    26  	}
    27  	p := &_Locale{
    28  		lang:   DefaultLanguage,
    29  		domain: domain,
    30  	}
    31  	if len(data) > 0 {
    32  		p.fs = NewFS(path, data[0])
    33  	} else {
    34  		p.fs = NewFS(path, nil)
    35  	}
    36  
    37  	p.syncTrMap()
    38  	return p
    39  }
    40  
    41  func (p *_Locale) makeTrMapKey(domain, _Locale string) string {
    42  	return domain + "_$$$_" + _Locale
    43  }
    44  
    45  func (p *_Locale) FileSystem() FileSystem {
    46  	return p.fs
    47  }
    48  
    49  func (p *_Locale) GetLanguage() string {
    50  	p.mutex.Lock()
    51  	defer p.mutex.Unlock()
    52  
    53  	return p.lang
    54  }
    55  func (p *_Locale) SetLanguage(lang string) Gettexter {
    56  	p.mutex.Lock()
    57  	defer p.mutex.Unlock()
    58  
    59  	if lang == "" {
    60  		lang = DefaultLanguage
    61  	}
    62  	if lang == p.lang {
    63  		return p
    64  	}
    65  
    66  	p.lang = lang
    67  	p.syncTrMap()
    68  	return p
    69  }
    70  
    71  func (p *_Locale) GetDomain() string {
    72  	p.mutex.Lock()
    73  	defer p.mutex.Unlock()
    74  	return p.domain
    75  }
    76  
    77  func (p *_Locale) SetDomain(domain string) Gettexter {
    78  	p.mutex.Lock()
    79  	defer p.mutex.Unlock()
    80  
    81  	if domain == "" || domain == p.domain {
    82  		return p
    83  	}
    84  
    85  	p.domain = domain
    86  	p.syncTrMap()
    87  	return p
    88  }
    89  
    90  func (p *_Locale) syncTrMap() {
    91  	p.trMap = make(map[string]*translator)
    92  	trMapKey := p.makeTrMapKey(p.domain, p.lang)
    93  
    94  	if tr, ok := p.trMap[trMapKey]; ok {
    95  		p.trCurrent = tr
    96  		return
    97  	}
    98  
    99  	// try load po file
   100  	if data, err := p.fs.LoadMessagesFile(p.domain, p.lang, ".po"); err == nil {
   101  		if tr, err := newPoTranslator(fmt.Sprintf("%s_%s.po", p.domain, p.lang), data); err == nil {
   102  			p.trMap[trMapKey] = tr
   103  			p.trCurrent = tr
   104  			return
   105  		}
   106  	}
   107  
   108  	// try load mo file
   109  	if data, err := p.fs.LoadMessagesFile(p.domain, p.lang, ".mo"); err == nil {
   110  		if tr, err := newMoTranslator(fmt.Sprintf("%s_%s.mo", p.domain, p.lang), data); err == nil {
   111  			p.trMap[trMapKey] = tr
   112  			p.trCurrent = tr
   113  			return
   114  		}
   115  	}
   116  
   117  	// try load json file
   118  	if data, err := p.fs.LoadMessagesFile(p.domain, p.lang, ".json"); err == nil {
   119  		if tr, err := newJsonTranslator(p.lang, fmt.Sprintf("%s_%s.json", p.domain, p.lang), data); err == nil {
   120  			p.trMap[trMapKey] = tr
   121  			p.trCurrent = tr
   122  			return
   123  		}
   124  	}
   125  
   126  	// no po/mo file
   127  	p.trMap[trMapKey] = nilTranslator
   128  	p.trCurrent = nilTranslator
   129  	return
   130  }
   131  
   132  func (p *_Locale) Gettext(msgid string) string {
   133  	p.mutex.Lock()
   134  	defer p.mutex.Unlock()
   135  	return p.trCurrent.PGettext("", msgid)
   136  }
   137  
   138  func (p *_Locale) PGettext(msgctxt, msgid string) string {
   139  	p.mutex.Lock()
   140  	defer p.mutex.Unlock()
   141  	return p.trCurrent.PGettext(msgctxt, msgid)
   142  }
   143  
   144  func (p *_Locale) NGettext(msgid, msgidPlural string, n int) string {
   145  	p.mutex.Lock()
   146  	defer p.mutex.Unlock()
   147  	return p.trCurrent.PNGettext("", msgid, msgidPlural, n)
   148  }
   149  
   150  func (p *_Locale) PNGettext(msgctxt, msgid, msgidPlural string, n int) string {
   151  	p.mutex.Lock()
   152  	defer p.mutex.Unlock()
   153  	return p.trCurrent.PNGettext(msgctxt, msgid, msgidPlural, n)
   154  }
   155  
   156  func (p *_Locale) DGettext(domain, msgid string) string {
   157  	p.mutex.Lock()
   158  	defer p.mutex.Unlock()
   159  	return p.gettext(domain, "", msgid, "", 0)
   160  }
   161  
   162  func (p *_Locale) DNGettext(domain, msgid, msgidPlural string, n int) string {
   163  	p.mutex.Lock()
   164  	defer p.mutex.Unlock()
   165  	return p.gettext(domain, "", msgid, msgidPlural, n)
   166  }
   167  
   168  func (p *_Locale) DPGettext(domain, msgctxt, msgid string) string {
   169  	p.mutex.Lock()
   170  	defer p.mutex.Unlock()
   171  	return p.gettext(domain, msgctxt, msgid, "", 0)
   172  }
   173  
   174  func (p *_Locale) DPNGettext(domain, msgctxt, msgid, msgidPlural string, n int) string {
   175  	p.mutex.Lock()
   176  	defer p.mutex.Unlock()
   177  	return p.gettext(domain, msgctxt, msgid, msgidPlural, n)
   178  }
   179  
   180  func (p *_Locale) Getdata(name string) []byte {
   181  	return p.getdata(p.domain, name)
   182  }
   183  
   184  func (p *_Locale) DGetdata(domain, name string) []byte {
   185  	return p.getdata(domain, name)
   186  }
   187  
   188  func (p *_Locale) gettext(domain, msgctxt, msgid, msgidPlural string, n int) string {
   189  	if f, ok := p.trMap[p.makeTrMapKey(domain, p.lang)]; ok {
   190  		return f.PNGettext(msgctxt, msgid, msgidPlural, n)
   191  	}
   192  	return msgid
   193  }
   194  
   195  func (p *_Locale) getdata(domain, name string) []byte {
   196  	if data, err := p.fs.LoadResourceFile(domain, p.lang, name); err == nil {
   197  		return data
   198  	}
   199  	if p.lang != "default" {
   200  		if data, err := p.fs.LoadResourceFile(domain, "default", name); err == nil {
   201  			return data
   202  		}
   203  	}
   204  	return nil
   205  }
   206  

View as plain text