...
1
2
3
4
5 package gettext
6
7 import (
8 "archive/zip"
9 "bytes"
10 "fmt"
11 )
12
13 type FileSystem interface {
14 LocaleList() []string
15 LoadMessagesFile(domain, lang, ext string) ([]byte, error)
16 LoadResourceFile(domain, lang, name string) ([]byte, error)
17 String() string
18 }
19
20 func NewFS(name string, x interface{}) FileSystem {
21 if x == nil {
22 if name != "" {
23 return OS(name)
24 }
25 return NilFS(name)
26 }
27
28 switch x := x.(type) {
29 case []byte:
30 if len(x) == 0 {
31 return OS(name)
32 }
33 if r, err := zip.NewReader(bytes.NewReader(x), int64(len(x))); err == nil {
34 return ZipFS(r, name)
35 }
36 if fs, err := newJson(x, name); err == nil {
37 return fs
38 }
39 case string:
40 if len(x) == 0 {
41 return OS(name)
42 }
43 if r, err := zip.NewReader(bytes.NewReader([]byte(x)), int64(len(x))); err == nil {
44 return ZipFS(r, name)
45 }
46 if fs, err := newJson([]byte(x), name); err == nil {
47 return fs
48 }
49 case FileSystem:
50 return x
51 }
52
53 return NilFS(name)
54 }
55
56 func OS(root string) FileSystem {
57 return newOsFS(root)
58 }
59
60 func ZipFS(r *zip.Reader, name string) FileSystem {
61 return newZipFS(r, name)
62 }
63
64 func NilFS(name string) FileSystem {
65 return &nilFS{name}
66 }
67
68 type nilFS struct {
69 name string
70 }
71
72 func (p *nilFS) LocaleList() []string {
73 return nil
74 }
75
76 func (p *nilFS) LoadMessagesFile(domain, lang, ext string) ([]byte, error) {
77 return nil, fmt.Errorf("not found")
78 }
79 func (p *nilFS) LoadResourceFile(domain, lang, name string) ([]byte, error) {
80 return nil, fmt.Errorf("not found")
81 }
82 func (p *nilFS) String() string {
83 return "gettext.nilfs(" + p.name + ")"
84 }
85
View as plain text