|
|
@@ -2,17 +2,18 @@ package ut
|
|
|
|
|
|
import (
|
|
|
"encoding/json"
|
|
|
- "fmt"
|
|
|
"io/ioutil"
|
|
|
"os"
|
|
|
"path/filepath"
|
|
|
|
|
|
+ "io"
|
|
|
+
|
|
|
"github.com/go-playground/locales"
|
|
|
)
|
|
|
|
|
|
type translation struct {
|
|
|
Locale string `json:"locale"`
|
|
|
- Key interface{} `json:"key"`
|
|
|
+ Key interface{} `json:"key"` // either string or integer
|
|
|
Translation string `json:"trans"`
|
|
|
PluralType string `json:"type,omitempty"`
|
|
|
PluralRule string `json:"rule,omitempty"`
|
|
|
@@ -139,66 +140,78 @@ func (t *UniversalTranslator) Import(format ExportFormat, dirnameOrFilename stri
|
|
|
|
|
|
processFn := func(filename string) error {
|
|
|
|
|
|
- b, err := ioutil.ReadFile(filename)
|
|
|
+ f, err := os.Open(filename)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
+ defer f.Close()
|
|
|
|
|
|
- var trans []translation
|
|
|
+ return t.ImportByReader(format, f)
|
|
|
+ }
|
|
|
|
|
|
- switch format {
|
|
|
- case JSON:
|
|
|
- err = json.Unmarshal(b, &trans)
|
|
|
- }
|
|
|
+ if !fi.IsDir() {
|
|
|
+ return processFn(dirnameOrFilename)
|
|
|
+ }
|
|
|
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
+ // recursively go through directory
|
|
|
+
|
|
|
+ walker := func(path string, info os.FileInfo, err error) error {
|
|
|
+
|
|
|
+ if info.IsDir() {
|
|
|
+ return nil
|
|
|
}
|
|
|
|
|
|
- for _, tl := range trans {
|
|
|
+ return processFn(dirnameOrFilename)
|
|
|
+ }
|
|
|
|
|
|
- locale, found := t.FindTranslator(tl.Locale)
|
|
|
- if !found {
|
|
|
- return fmt.Errorf("locale '%s' not registered for translation in file '%s'", tl.Locale, filename)
|
|
|
- }
|
|
|
+ return filepath.Walk(dirnameOrFilename, walker)
|
|
|
+}
|
|
|
|
|
|
- pr := stringToPR(tl.PluralRule)
|
|
|
+// ImportByReader imports a files contexts
|
|
|
+func (t *UniversalTranslator) ImportByReader(format ExportFormat, reader io.Reader) error {
|
|
|
|
|
|
- if pr == locales.PluralRuleUnknown {
|
|
|
- return locale.Add(tl.Key, tl.Translation, tl.OverrideExisting)
|
|
|
- }
|
|
|
+ b, err := ioutil.ReadAll(reader)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
|
|
|
- switch tl.PluralType {
|
|
|
- case cardinalType:
|
|
|
- return locale.AddCardinal(tl.Key, tl.Translation, pr, tl.OverrideExisting)
|
|
|
- case ordinalType:
|
|
|
- return locale.AddOrdinal(tl.Key, tl.Translation, pr, tl.OverrideExisting)
|
|
|
- case rangeType:
|
|
|
- return locale.AddRange(tl.Key, tl.Translation, pr, tl.OverrideExisting)
|
|
|
- default:
|
|
|
- return fmt.Errorf("bad plural rule '%#v', incorrect plural information found for translation in file '%s'", tl, filename)
|
|
|
- }
|
|
|
- }
|
|
|
+ var trans []translation
|
|
|
|
|
|
- return nil
|
|
|
+ switch format {
|
|
|
+ case JSON:
|
|
|
+ err = json.Unmarshal(b, &trans)
|
|
|
}
|
|
|
|
|
|
- if !fi.IsDir() {
|
|
|
- return processFn(dirnameOrFilename)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
}
|
|
|
|
|
|
- // recursively go through directory
|
|
|
+ for _, tl := range trans {
|
|
|
|
|
|
- walker := func(path string, info os.FileInfo, err error) error {
|
|
|
+ locale, found := t.FindTranslator(tl.Locale)
|
|
|
+ if !found {
|
|
|
+ return &ErrMissingLocale{locale: tl.Locale}
|
|
|
+ }
|
|
|
|
|
|
- if info.IsDir() {
|
|
|
- return nil
|
|
|
+ pr := stringToPR(tl.PluralRule)
|
|
|
+
|
|
|
+ if pr == locales.PluralRuleUnknown {
|
|
|
+ return locale.Add(tl.Key, tl.Translation, tl.OverrideExisting)
|
|
|
}
|
|
|
|
|
|
- return processFn(dirnameOrFilename)
|
|
|
+ switch tl.PluralType {
|
|
|
+ case cardinalType:
|
|
|
+ return locale.AddCardinal(tl.Key, tl.Translation, pr, tl.OverrideExisting)
|
|
|
+ case ordinalType:
|
|
|
+ return locale.AddOrdinal(tl.Key, tl.Translation, pr, tl.OverrideExisting)
|
|
|
+ case rangeType:
|
|
|
+ return locale.AddRange(tl.Key, tl.Translation, pr, tl.OverrideExisting)
|
|
|
+ default:
|
|
|
+ return &ErrBadPluralDefinition{tl: tl}
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- return filepath.Walk(dirnameOrFilename, walker)
|
|
|
+ return nil
|
|
|
}
|
|
|
|
|
|
func stringToPR(s string) locales.PluralRule {
|