소스 검색

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 년 전
부모
커밋
daefa8c759
3개의 변경된 파일96개의 추가작업 그리고 24개의 파일을 삭제
  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} jours", locales.PluralRuleOther, false)
 
-	err = utrans.VerifyTranslations()
+	err := utrans.VerifyTranslations()
 	if err != nil {
 		log.Fatal(err)
 	}

+ 32 - 11
import_export.go

@@ -2,6 +2,7 @@ package ut
 
 import (
 	"encoding/json"
+	"fmt"
 	"io/ioutil"
 	"os"
 	"path/filepath"
@@ -37,10 +38,25 @@ const (
 // Export writes the translations out to a file on disk.
 //
 // 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
 	var trans []translation
+	var b []byte
+	var ext string
 
 	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.

+ 63 - 12
import_export_test.go

@@ -2,6 +2,7 @@ package ut
 
 import (
 	"fmt"
+	"path/filepath"
 	"testing"
 
 	"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)
 
-	err := uni.Import(JSON, filename)
+	err = uni.Import(JSON, dirname)
 	if err != nil {
 		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)
 
-	err := uni.Import(JSON, filename)
+	err = uni.Import(JSON, dirname)
 	if err != nil {
 		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)
 
-	err := uni.Import(JSON, filename)
+	err = uni.Import(JSON, dirname)
 	if err != nil {
 		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)
 
-	err := uni.Import(JSON, filename)
+	err = uni.Import(JSON, dirname)
 	if err != nil {
 		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)
 	}
 }
+
+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)
+	}
+}