summaryrefslogtreecommitdiff
path: root/transifex/main.go
diff options
context:
space:
mode:
authorRuben Pollan <meskio@sindominio.net>2018-11-15 17:23:51 -0600
committerRuben Pollan <meskio@sindominio.net>2018-11-19 20:58:02 -0600
commitbb59e562d396684ac20347498a861ed32fbb8b57 (patch)
treec4e04d6c82cfe10f65b7e98c7c3da07ad673708a /transifex/main.go
parente090ea1a2da8c4ff5e98fb09e37d51042e380b0a (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.go124
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))
+ }
+}