mirror of https://github.com/k3s-io/k3s
120 lines
2.8 KiB
Go
120 lines
2.8 KiB
Go
// Copyright 2013 ChaiShushan <chaishushan{AT}gmail.com>. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package gettext
|
|
|
|
import (
|
|
"sync"
|
|
)
|
|
|
|
type domainManager struct {
|
|
mutex sync.Mutex
|
|
locale string
|
|
domain string
|
|
domainMap map[string]*fileSystem
|
|
trTextMap map[string]*translator
|
|
}
|
|
|
|
func newDomainManager() *domainManager {
|
|
return &domainManager{
|
|
locale: DefaultLocale,
|
|
domainMap: make(map[string]*fileSystem),
|
|
trTextMap: make(map[string]*translator),
|
|
}
|
|
}
|
|
|
|
func (p *domainManager) makeTrMapKey(domain, locale string) string {
|
|
return domain + "_$$$_" + locale
|
|
}
|
|
|
|
func (p *domainManager) Bind(domain, path string, data []byte) (domains, paths []string) {
|
|
p.mutex.Lock()
|
|
defer p.mutex.Unlock()
|
|
|
|
switch {
|
|
case domain != "" && path != "": // bind new domain
|
|
p.bindDomainTranslators(domain, path, data)
|
|
case domain != "" && path == "": // delete domain
|
|
p.deleteDomain(domain)
|
|
}
|
|
|
|
// return all bind domain
|
|
for k, fs := range p.domainMap {
|
|
domains = append(domains, k)
|
|
paths = append(paths, fs.FsName)
|
|
}
|
|
return
|
|
}
|
|
|
|
func (p *domainManager) SetLocale(locale string) string {
|
|
p.mutex.Lock()
|
|
defer p.mutex.Unlock()
|
|
if locale != "" {
|
|
p.locale = locale
|
|
}
|
|
return p.locale
|
|
}
|
|
|
|
func (p *domainManager) SetDomain(domain string) string {
|
|
p.mutex.Lock()
|
|
defer p.mutex.Unlock()
|
|
if domain != "" {
|
|
p.domain = domain
|
|
}
|
|
return p.domain
|
|
}
|
|
|
|
func (p *domainManager) Getdata(name string) []byte {
|
|
return p.getdata(p.domain, name)
|
|
}
|
|
|
|
func (p *domainManager) DGetdata(domain, name string) []byte {
|
|
return p.getdata(domain, name)
|
|
}
|
|
|
|
func (p *domainManager) PNGettext(msgctxt, msgid, msgidPlural string, n int) string {
|
|
p.mutex.Lock()
|
|
defer p.mutex.Unlock()
|
|
return p.gettext(p.domain, msgctxt, msgid, msgidPlural, n)
|
|
}
|
|
|
|
func (p *domainManager) DPNGettext(domain, msgctxt, msgid, msgidPlural string, n int) string {
|
|
p.mutex.Lock()
|
|
defer p.mutex.Unlock()
|
|
return p.gettext(domain, msgctxt, msgid, msgidPlural, n)
|
|
}
|
|
|
|
func (p *domainManager) gettext(domain, msgctxt, msgid, msgidPlural string, n int) string {
|
|
if p.locale == "" || p.domain == "" {
|
|
return msgid
|
|
}
|
|
if _, ok := p.domainMap[domain]; !ok {
|
|
return msgid
|
|
}
|
|
if f, ok := p.trTextMap[p.makeTrMapKey(domain, p.locale)]; ok {
|
|
return f.PNGettext(msgctxt, msgid, msgidPlural, n)
|
|
}
|
|
return msgid
|
|
}
|
|
|
|
func (p *domainManager) getdata(domain, name string) []byte {
|
|
if p.locale == "" || p.domain == "" {
|
|
return nil
|
|
}
|
|
if _, ok := p.domainMap[domain]; !ok {
|
|
return nil
|
|
}
|
|
if fs, ok := p.domainMap[domain]; ok {
|
|
if data, err := fs.LoadResourceFile(domain, p.locale, name); err == nil {
|
|
return data
|
|
}
|
|
if p.locale != "default" {
|
|
if data, err := fs.LoadResourceFile(domain, "default", name); err == nil {
|
|
return data
|
|
}
|
|
}
|
|
}
|
|
return nil
|
|
}
|