diff options
author | Ruben Pollan <meskio@sindominio.net> | 2018-11-15 17:23:51 -0600 |
---|---|---|
committer | Ruben Pollan <meskio@sindominio.net> | 2018-11-19 20:58:02 -0600 |
commit | bb59e562d396684ac20347498a861ed32fbb8b57 (patch) | |
tree | c4e04d6c82cfe10f65b7e98c7c3da07ad673708a /transifex/main.go | |
parent | e090ea1a2da8c4ff5e98fb09e37d51042e380b0a (diff) |
[feat] Generate messages.json for transifex
Add to 'make generate_locales' the generation of a
'transifex/messages.json' that will be automatically pulled by transifex
for translations.
To incorporate translations from transifex into our project we'll need
to manually download the selected translations and convert them with the
transifex program into gotext format.
-Resolves: #73
Diffstat (limited to 'transifex/main.go')
-rw-r--r-- | transifex/main.go | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/transifex/main.go b/transifex/main.go new file mode 100644 index 0000000..37bae97 --- /dev/null +++ b/transifex/main.go @@ -0,0 +1,124 @@ +package main + +import ( + "encoding/json" + "fmt" + "os" + "path" + + "golang.org/x/text/message/pipeline" +) + +const ( + outGotext = "out.gotext.json" + messagesGotext = "messages.gotext.json" +) + +type transifex map[string]string + +func main() { + if len(os.Args) < 2 { + panic("g2t or t2g should be passed as argument") + } + + switch os.Args[1] { + case "g2t": + g2t(func(m pipeline.Message) string { return m.Message.Msg }) + case "lang2t": + g2t(func(m pipeline.Message) string { return m.Translation.Msg }) + case "t2g": + t2g() + default: + panic("g2t or t2g should be passed as argument") + } +} + +func g2t(getMessage func(pipeline.Message) string) { + if len(os.Args) < 4 { + panic(fmt.Sprintf("usage: %s g2t inFile outFile", os.Args[0])) + } + + inF, err := os.Open(os.Args[2]) + if err != nil { + panic(fmt.Sprintf("Can't open input file %s: %v", os.Args[2], err)) + } + outF, err := os.Create(os.Args[3]) + if err != nil { + panic(fmt.Sprintf("Can't open output file %s: %v", os.Args[3], err)) + } + + toTransifex(inF, outF, getMessage) +} + +func t2g() { + if len(os.Args) < 3 { + panic(fmt.Sprintf("usage: %s t2g localeFolder", os.Args[0])) + } + + origF, err := os.Open(path.Join(os.Args[2], outGotext)) + if err != nil { + panic(fmt.Sprintf("Can't open file %s/%s: %v", os.Args[3], outGotext, err)) + } + outF, err := os.Create(path.Join(os.Args[2], messagesGotext)) + if err != nil { + panic(fmt.Sprintf("Can't open output file %s/%v: %v", os.Args[3], messagesGotext, err)) + } + toGotext(origF, os.Stdin, outF) +} + +func toTransifex(inF, outF *os.File, getMessage func(pipeline.Message) string) { + messages := pipeline.Messages{} + dec := json.NewDecoder(inF) + err := dec.Decode(&messages) + if err != nil { + panic(fmt.Sprintf("An error ocurred decoding json: %v", err)) + } + + transfx := make(transifex) + for _, m := range messages.Messages { + transfx[m.ID[0]] = getMessage(m) + } + enc := json.NewEncoder(outF) + enc.SetIndent("", " ") + err = enc.Encode(transfx) + if err != nil { + panic(fmt.Sprintf("An error ocurred encoding json: %v", err)) + } +} + +func toGotext(origF, inF, outF *os.File) { + transfx := make(transifex) + dec := json.NewDecoder(inF) + err := dec.Decode(&transfx) + if err != nil { + panic(fmt.Sprintf("An error ocurred decoding json: %v", err)) + } + + messages := pipeline.Messages{} + dec = json.NewDecoder(origF) + err = dec.Decode(&messages) + if err != nil { + panic(fmt.Sprintf("An error ocurred decoding orig json: %v", err)) + } + + for k, v := range transfx { + found := false + for i, m := range messages.Messages { + if m.ID[0] == k { + messages.Messages[i].Translation.Msg = v + found = true + break + } + } + if !found { + fmt.Printf("The original document doesn't have id: %s\n", k) + } + } + + enc := json.NewEncoder(outF) + enc.SetIndent("", " ") + err = enc.Encode(messages) + if err != nil { + panic(fmt.Sprintf("An error ocurred encoding json: %v", err)) + } +} |