summaryrefslogtreecommitdiff
path: root/tools/transifex/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'tools/transifex/main.go')
-rw-r--r--tools/transifex/main.go124
1 files changed, 124 insertions, 0 deletions
diff --git a/tools/transifex/main.go b/tools/transifex/main.go
new file mode 100644
index 0000000..37bae97
--- /dev/null
+++ b/tools/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))
+ }
+}