Browse Source

Update Export to break by locale

- Export was modified to only accept a dirname and split exported files by locale. It didn't make any sense to export all to one files aas the primary reason for exporting would be to have them translated and so splitting them up by locale was the thing to do.
joeybloggs 8 years ago
parent
commit
daefa8c759
3 changed files with 96 additions and 24 deletions
  1. 1 1
      examples/full-no-files/main.go
  2. 32 11
      import_export.go
  3. 63 12
      import_export_test.go

+ 1 - 1
examples/full-no-files/main.go

@@ -203,7 +203,7 @@ func setup() {
 	fr.AddCardinal("days-left", "Il reste {0} jour", locales.PluralRuleOne, false)
 	fr.AddCardinal("days-left", "Il reste {0} jour", locales.PluralRuleOne, false)
 	fr.AddCardinal("days-left", "Il reste {0} jours", locales.PluralRuleOther, false)
 	fr.AddCardinal("days-left", "Il reste {0} jours", locales.PluralRuleOther, false)
 
 
-	err = utrans.VerifyTranslations()
+	err := utrans.VerifyTranslations()
 	if err != nil {
 	if err != nil {
 		log.Fatal(err)
 		log.Fatal(err)
 	}
 	}

+ 32 - 11
import_export.go

@@ -2,6 +2,7 @@ package ut
 
 
 import (
 import (
 	"encoding/json"
 	"encoding/json"
+	"fmt"
 	"io/ioutil"
 	"io/ioutil"
 	"os"
 	"os"
 	"path/filepath"
 	"path/filepath"
@@ -37,10 +38,25 @@ const (
 // Export writes the translations out to a file on disk.
 // Export writes the translations out to a file on disk.
 //
 //
 // NOTE: this currently only works with string or int translations keys.
 // NOTE: this currently only works with string or int translations keys.
-func (t *UniversalTranslator) Export(format ExportFormat, filename string) error {
+func (t *UniversalTranslator) Export(format ExportFormat, dirname string) error {
+
+	_, err := os.Stat(dirname)
+	fmt.Println(dirname, err, os.IsNotExist(err))
+	if err != nil {
+
+		if !os.IsNotExist(err) {
+			return err
+		}
+
+		if err = os.MkdirAll(dirname, 0744); err != nil {
+			return err
+		}
+	}
 
 
 	// build up translations
 	// build up translations
 	var trans []translation
 	var trans []translation
+	var b []byte
+	var ext string
 
 
 	for _, locale := range t.translators {
 	for _, locale := range t.translators {
 
 
@@ -111,21 +127,26 @@ func (t *UniversalTranslator) Export(format ExportFormat, filename string) error
 				})
 				})
 			}
 			}
 		}
 		}
-	}
 
 
-	var b []byte
-	var err error
+		switch format {
+		case JSON:
+			b, err = json.MarshalIndent(trans, "", "    ")
+			ext = ".json"
+		}
 
 
-	switch format {
-	case JSON:
-		b, err = json.MarshalIndent(trans, "", "    ")
-	}
+		if err != nil {
+			return err
+		}
 
 
-	if err != nil {
-		return err
+		err = ioutil.WriteFile(filepath.Join(dirname, fmt.Sprintf("%s%s", locale.Locale(), ext)), b, 0644)
+		if err != nil {
+			return err
+		}
+
+		trans = trans[0:0]
 	}
 	}
 
 
-	return ioutil.WriteFile(filename, b, 0644)
+	return nil
 }
 }
 
 
 // Import reads the translations out of a file or directory on disk.
 // Import reads the translations out of a file or directory on disk.

+ 63 - 12
import_export_test.go

@@ -2,6 +2,7 @@ package ut
 
 
 import (
 import (
 	"fmt"
 	"fmt"
+	"path/filepath"
 	"testing"
 	"testing"
 
 
 	"os"
 	"os"
@@ -97,13 +98,17 @@ func TestExportImportBasic(t *testing.T) {
 		}
 		}
 	}
 	}
 
 
-	filename := "testdata/basic-export-test.json"
+	dirname := "testdata/translations"
+	defer os.RemoveAll(dirname)
 
 
-	uni.Export(JSON, filename)
+	err := uni.Export(JSON, dirname)
+	if err != nil {
+		t.Fatalf("Expected '%v' Got '%s'", nil, err)
+	}
 
 
 	uni = New(e, e)
 	uni = New(e, e)
 
 
-	err := uni.Import(JSON, filename)
+	err = uni.Import(JSON, dirname)
 	if err != nil {
 	if err != nil {
 		t.Fatalf("Expected '%v' Got '%s'", nil, err)
 		t.Fatalf("Expected '%v' Got '%s'", nil, err)
 	}
 	}
@@ -222,13 +227,17 @@ func TestExportImportCardinal(t *testing.T) {
 		}
 		}
 	}
 	}
 
 
-	filename := "testdata/cardinal-export-test.json"
+	dirname := "testdata/translations"
+	defer os.RemoveAll(dirname)
 
 
-	uni.Export(JSON, filename)
+	err := uni.Export(JSON, dirname)
+	if err != nil {
+		t.Fatalf("Expected '%v' Got '%s'", nil, err)
+	}
 
 
 	uni = New(e, e)
 	uni = New(e, e)
 
 
-	err := uni.Import(JSON, filename)
+	err = uni.Import(JSON, dirname)
 	if err != nil {
 	if err != nil {
 		t.Fatalf("Expected '%v' Got '%s'", nil, err)
 		t.Fatalf("Expected '%v' Got '%s'", nil, err)
 	}
 	}
@@ -355,13 +364,17 @@ func TestExportImportOrdinal(t *testing.T) {
 		}
 		}
 	}
 	}
 
 
-	filename := "testdata/ordinal-export-test.json"
+	dirname := "testdata/translations"
+	defer os.RemoveAll(dirname)
 
 
-	uni.Export(JSON, filename)
+	err := uni.Export(JSON, dirname)
+	if err != nil {
+		t.Fatalf("Expected '%v' Got '%s'", nil, err)
+	}
 
 
 	uni = New(e, e)
 	uni = New(e, e)
 
 
-	err := uni.Import(JSON, filename)
+	err = uni.Import(JSON, dirname)
 	if err != nil {
 	if err != nil {
 		t.Fatalf("Expected '%v' Got '%s'", nil, err)
 		t.Fatalf("Expected '%v' Got '%s'", nil, err)
 	}
 	}
@@ -514,13 +527,17 @@ func TestExportImportRange(t *testing.T) {
 		}
 		}
 	}
 	}
 
 
-	filename := "testdata/range-export-test.json"
+	dirname := "testdata/translations"
+	defer os.RemoveAll(dirname)
 
 
-	uni.Export(JSON, filename)
+	err := uni.Export(JSON, dirname)
+	if err != nil {
+		t.Fatalf("Expected '%v' Got '%s'", nil, err)
+	}
 
 
 	uni = New(n, n)
 	uni = New(n, n)
 
 
-	err := uni.Import(JSON, filename)
+	err = uni.Import(JSON, dirname)
 	if err != nil {
 	if err != nil {
 		t.Fatalf("Expected '%v' Got '%s'", nil, err)
 		t.Fatalf("Expected '%v' Got '%s'", nil, err)
 	}
 	}
@@ -736,3 +753,37 @@ func TestBadImport(t *testing.T) {
 		t.Fatalf("Expected '%s' Got '%s'", expected, err)
 		t.Fatalf("Expected '%s' Got '%s'", expected, err)
 	}
 	}
 }
 }
+
+func TestBadExport(t *testing.T) {
+
+	// test readonly directory
+	e := en.New()
+	uni := New(e, e)
+
+	en, found := uni.GetTranslator("en") // or fallback if fails to find 'en'
+	if !found {
+		t.Fatalf("Expected '%t' Got '%t'", true, found)
+	}
+
+	dirname := "testdata/readonly"
+	err := os.Mkdir(dirname, 0444)
+	if err != nil {
+		t.Fatalf("Expected '%v' Got '%s'", nil, err)
+	}
+	defer os.RemoveAll(dirname)
+
+	en.Add("day", "this is a day", false)
+
+	expected := "open testdata/readonly/en.json: permission denied"
+	err = uni.Export(JSON, dirname)
+	if err == nil || err.Error() != expected {
+		t.Fatalf("Expected '%s' Got '%s'", expected, err)
+	}
+
+	// test exporting into directory inside readonly directory
+	expected = "stat testdata/readonly/inner: permission denied"
+	err = uni.Export(JSON, filepath.Join(dirname, "inner"))
+	if err == nil || err.Error() != expected {
+		t.Fatalf("Expected '%s' Got '%s'", expected, err)
+	}
+}