...
1
2
3
4
5 package gettext
6
7 import (
8 "archive/zip"
9 "bytes"
10 "fmt"
11 "io/ioutil"
12 "os"
13 "sort"
14 "strings"
15 )
16
17 type osFS struct {
18 root string
19 }
20
21 func newOsFS(root string) FileSystem {
22
23 if fi, err := os.Stat(root); err == nil && !fi.IsDir() {
24 if strings.HasSuffix(strings.ToLower(root), ".zip") {
25 if x, err := ioutil.ReadFile(root); err == nil {
26 if r, err := zip.NewReader(bytes.NewReader(x), int64(len(x))); err == nil {
27 return ZipFS(r, root)
28 }
29 }
30 }
31 if strings.HasSuffix(strings.ToLower(root), ".json") {
32 if x, err := ioutil.ReadFile(root); err == nil {
33 if fs, err := newJson(x, root); err == nil {
34 return fs
35 }
36 }
37 }
38 }
39
40
41 return &osFS{root: root}
42 }
43
44 func (p *osFS) LocaleList() []string {
45 list, err := ioutil.ReadDir(p.root)
46 if err != nil {
47 return nil
48 }
49 ssMap := make(map[string]bool)
50 for _, dir := range list {
51 if dir.IsDir() {
52 ssMap[dir.Name()] = true
53 }
54 }
55 var locales = make([]string, 0, len(ssMap))
56 for s := range ssMap {
57 locales = append(locales, s)
58 }
59 sort.Strings(locales)
60 return locales
61 }
62
63 func (p *osFS) LoadMessagesFile(domain, locale, ext string) ([]byte, error) {
64 trName := p.makeMessagesFileName(domain, locale, ext)
65 rcData, err := ioutil.ReadFile(trName)
66 if err != nil {
67 return nil, err
68 }
69 return rcData, nil
70 }
71
72 func (p *osFS) LoadResourceFile(domain, locale, name string) ([]byte, error) {
73 rcName := p.makeResourceFileName(domain, locale, name)
74 rcData, err := ioutil.ReadFile(rcName)
75 if err != nil {
76 return nil, err
77 }
78 return rcData, nil
79 }
80
81 func (p *osFS) String() string {
82 return "gettext.localfs(" + p.root + ")"
83 }
84
85 func (p *osFS) makeMessagesFileName(domain, lang, ext string) string {
86 return fmt.Sprintf("%s/%s/LC_MESSAGES/%s%s", p.root, lang, domain, ext)
87 }
88
89 func (p *osFS) makeResourceFileName(domain, lang, name string) string {
90 return fmt.Sprintf("%s/%s/LC_RESOURCE/%s/%s", p.root, lang, domain, name)
91 }
92
View as plain text