package catalog
import (
"sync"
"golang.org/x/text/internal"
"golang.org/x/text/internal/catmsg"
"golang.org/x/text/language"
)
type dict struct {
s *store
tag language .Tag
}
func (d *dict ) Lookup (key string ) (data string , ok bool ) {
return d .s .lookup (d .tag , key )
}
func (b *Builder ) lookup (tag language .Tag , key string ) (data string , ok bool ) {
return b .index .lookup (tag , key )
}
func (c *Builder ) set (tag language .Tag , key string , s *store , msg ...Message ) error {
data , err := catmsg .Compile (tag , &dict {&c .macros , tag }, firstInSequence (msg ))
s .mutex .Lock ()
defer s .mutex .Unlock ()
m := s .index [tag ]
if m == nil {
m = msgMap {}
if s .index == nil {
s .index = map [language .Tag ]msgMap {}
}
c .matcher = nil
s .index [tag ] = m
}
m [key ] = data
return err
}
func (c *Builder ) Matcher () language .Matcher {
c .index .mutex .RLock ()
m := c .matcher
c .index .mutex .RUnlock ()
if m != nil {
return m
}
c .index .mutex .Lock ()
if c .matcher == nil {
c .matcher = language .NewMatcher (c .unlockedLanguages ())
}
m = c .matcher
c .index .mutex .Unlock ()
return m
}
type store struct {
mutex sync .RWMutex
index map [language .Tag ]msgMap
}
type msgMap map [string ]string
func (s *store ) lookup (tag language .Tag , key string ) (data string , ok bool ) {
s .mutex .RLock ()
defer s .mutex .RUnlock ()
for ; ; tag = tag .Parent () {
if msgs , ok := s .index [tag ]; ok {
if msg , ok := msgs [key ]; ok {
return msg , true
}
}
if tag == language .Und {
break
}
}
return "" , false
}
func (b *Builder ) Languages () []language .Tag {
s := &b .index
s .mutex .RLock ()
defer s .mutex .RUnlock ()
return b .unlockedLanguages ()
}
func (b *Builder ) unlockedLanguages () []language .Tag {
s := &b .index
if len (s .index ) == 0 {
return nil
}
tags := make ([]language .Tag , 0 , len (s .index ))
_ , hasFallback := s .index [b .options .fallback ]
offset := 0
if hasFallback {
tags = append (tags , b .options .fallback )
offset = 1
}
for t := range s .index {
if t != b .options .fallback {
tags = append (tags , t )
}
}
internal .SortTags (tags [offset :])
return tags
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .