forked from rainycape/gondola
/
compile.go
76 lines (70 loc) · 1.64 KB
/
compile.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package messages
import (
"bytes"
"fmt"
"go/build"
"path/filepath"
"gnd.la/i18n/po"
"gnd.la/i18n/table"
"gnd.la/internal/gen/genutil"
)
type CompileOptions struct {
DefaultContext string
}
func Compile(filename string, translations []*po.Po, opts *CompileOptions) error {
var buf bytes.Buffer
dir := filepath.Dir(filename)
p, err := build.ImportDir(dir, 0)
if err == nil {
fmt.Fprintf(&buf, "package %s\n", p.Name)
}
buf.WriteString("import \"gnd.la/i18n/table\"\n")
buf.WriteString(genutil.AutogenString())
buf.WriteString("func init() {\n")
var defaultContext string
if opts != nil {
defaultContext = opts.DefaultContext
}
for _, v := range translations {
table := poToTable(v, defaultContext)
form, err := funcFromFormula(v.Attrs["Plural-Forms"])
if err != nil {
return err
}
data, err := table.Encode()
if err != nil {
return err
}
fmt.Fprintf(&buf, "table.Register(%q, func (n int) int {\n%s\n}, %q)\n", v.Attrs["Language"], form, data)
}
buf.WriteString("\n}\n")
return genutil.WriteAutogen(filename, buf.Bytes())
}
func poToTable(p *po.Po, ctx string) *table.Table {
translations := make(map[string]table.Translation)
for _, v := range p.Messages {
if v.Context == "" {
v.Context = ctx
}
if empty(v.Translations) {
continue
}
key := table.Key(v.Context, v.Singular, v.Plural)
translations[key] = v.Translations
}
tbl, err := table.New(nil, translations)
// This shouldn't happen because the formula was validated when loading
// the .po file.
if err != nil {
panic(err)
}
return tbl
}
func empty(s []string) bool {
for _, v := range s {
if v != "" {
return false
}
}
return true
}