summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/nicksnyder/go-i18n/goi18n/merge_command.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/nicksnyder/go-i18n/goi18n/merge_command.go')
-rw-r--r--vendor/github.com/nicksnyder/go-i18n/goi18n/merge_command.go95
1 files changed, 64 insertions, 31 deletions
diff --git a/vendor/github.com/nicksnyder/go-i18n/goi18n/merge_command.go b/vendor/github.com/nicksnyder/go-i18n/goi18n/merge_command.go
index 1d34ac438..1b9d04fd3 100644
--- a/vendor/github.com/nicksnyder/go-i18n/goi18n/merge_command.go
+++ b/vendor/github.com/nicksnyder/go-i18n/goi18n/merge_command.go
@@ -5,7 +5,6 @@ import (
"flag"
"fmt"
"io/ioutil"
- "os"
"path/filepath"
"reflect"
"sort"
@@ -15,6 +14,7 @@ import (
"github.com/nicksnyder/go-i18n/i18n/bundle"
"github.com/nicksnyder/go-i18n/i18n/language"
"github.com/nicksnyder/go-i18n/i18n/translation"
+ toml "github.com/pelletier/go-toml"
)
type mergeCommand struct {
@@ -22,6 +22,7 @@ type mergeCommand struct {
sourceLanguage string
outdir string
format string
+ flat bool
}
func (mc *mergeCommand) execute() error {
@@ -33,15 +34,10 @@ func (mc *mergeCommand) execute() error {
return fmt.Errorf("invalid source locale: %s", mc.sourceLanguage)
}
- marshal, err := newMarshalFunc(mc.format)
- if err != nil {
- return err
- }
-
bundle := bundle.New()
for _, tf := range mc.translationFiles {
if err := bundle.LoadTranslationFile(tf); err != nil {
- return fmt.Errorf("failed to load translation file %s because %s\n", tf, err)
+ return fmt.Errorf("failed to load translation file %s: %s\n", tf, err)
}
}
@@ -64,7 +60,7 @@ func (mc *mergeCommand) execute() error {
all := filter(localeTranslations, func(t translation.Translation) translation.Translation {
return t.Normalize(lang)
})
- if err := mc.writeFile("all", all, localeID, marshal); err != nil {
+ if err := mc.writeFile("all", all, localeID); err != nil {
return err
}
@@ -74,7 +70,7 @@ func (mc *mergeCommand) execute() error {
}
return nil
})
- if err := mc.writeFile("untranslated", untranslated, localeID, marshal); err != nil {
+ if err := mc.writeFile("untranslated", untranslated, localeID); err != nil {
return err
}
}
@@ -88,6 +84,7 @@ func (mc *mergeCommand) parse(arguments []string) {
sourceLanguage := flags.String("sourceLanguage", "en-us", "")
outdir := flags.String("outdir", ".", "")
format := flags.String("format", "json", "")
+ flat := flags.Bool("flat", true, "")
flags.Parse(arguments)
@@ -95,31 +92,44 @@ func (mc *mergeCommand) parse(arguments []string) {
mc.sourceLanguage = *sourceLanguage
mc.outdir = *outdir
mc.format = *format
+ if *format == "toml" {
+ mc.flat = true
+ } else {
+ mc.flat = *flat
+ }
}
func (mc *mergeCommand) SetArgs(args []string) {
mc.translationFiles = args
}
-type marshalFunc func(interface{}) ([]byte, error)
-
-func (mc *mergeCommand) writeFile(label string, translations []translation.Translation, localeID string, marshal marshalFunc) error {
+func (mc *mergeCommand) writeFile(label string, translations []translation.Translation, localeID string) error {
sort.Sort(translation.SortableByID(translations))
- buf, err := marshal(marshalInterface(translations))
+
+ var convert func([]translation.Translation) interface{}
+ if mc.flat {
+ convert = marshalFlatInterface
+ } else {
+ convert = marshalInterface
+ }
+
+ buf, err := mc.marshal(convert(translations))
if err != nil {
- return fmt.Errorf("failed to marshal %s strings to %s because %s", localeID, mc.format, err)
+ return fmt.Errorf("failed to marshal %s strings to %s: %s", localeID, mc.format, err)
}
+
filename := filepath.Join(mc.outdir, fmt.Sprintf("%s.%s.%s", localeID, label, mc.format))
+
if err := ioutil.WriteFile(filename, buf, 0666); err != nil {
- return fmt.Errorf("failed to write %s because %s", filename, err)
+ return fmt.Errorf("failed to write %s: %s", filename, err)
}
return nil
}
-func filter(translations map[string]translation.Translation, filter func(translation.Translation) translation.Translation) []translation.Translation {
+func filter(translations map[string]translation.Translation, f func(translation.Translation) translation.Translation) []translation.Translation {
filtered := make([]translation.Translation, 0, len(translations))
for _, translation := range translations {
- if t := filter(translation); t != nil {
+ if t := f(translation); t != nil {
filtered = append(filtered, t)
}
}
@@ -127,21 +137,15 @@ func filter(translations map[string]translation.Translation, filter func(transla
}
-func newMarshalFunc(format string) (marshalFunc, error) {
- switch format {
- case "json":
- return func(v interface{}) ([]byte, error) {
- return json.MarshalIndent(v, "", " ")
- }, nil
- case "yaml":
- return func(v interface{}) ([]byte, error) {
- return yaml.Marshal(v)
- }, nil
+func marshalFlatInterface(translations []translation.Translation) interface{} {
+ mi := make(map[string]interface{}, len(translations))
+ for _, translation := range translations {
+ mi[translation.ID()] = translation.MarshalFlatInterface()
}
- return nil, fmt.Errorf("unsupported format: %s\n", format)
+ return mi
}
-func marshalInterface(translations []translation.Translation) []interface{} {
+func marshalInterface(translations []translation.Translation) interface{} {
mi := make([]interface{}, len(translations))
for i, translation := range translations {
mi[i] = translation.MarshalInterface()
@@ -149,6 +153,31 @@ func marshalInterface(translations []translation.Translation) []interface{} {
return mi
}
+func (mc mergeCommand) marshal(v interface{}) ([]byte, error) {
+ switch mc.format {
+ case "json":
+ return json.MarshalIndent(v, "", " ")
+ case "toml":
+ return marshalTOML(v)
+ case "yaml":
+ return yaml.Marshal(v)
+ }
+ return nil, fmt.Errorf("unsupported format: %s\n", mc.format)
+}
+
+func marshalTOML(v interface{}) ([]byte, error) {
+ m, ok := v.(map[string]interface{})
+ if !ok {
+ return nil, fmt.Errorf("invalid format for marshaling to TOML")
+ }
+ tree, err := toml.TreeFromMap(m)
+ if err != nil {
+ return nil, err
+ }
+ s, err := tree.ToTomlString()
+ return []byte(s), err
+}
+
func usageMerge() {
fmt.Printf(`Merge translation files.
@@ -198,9 +227,13 @@ Options:
-format format
goi18n encodes the output translation files in this format.
- Supported formats: json, yaml
+ Supported formats: json, toml, yaml
Default: json
+ -flat
+ goi18n writes the output translation files in flat format.
+ Usage of '-format toml' automitically sets this flag.
+ Default: true
+
`)
- os.Exit(1)
}