Commit 29a9e4d0 authored by Boris Mühmer's avatar Boris Mühmer
Browse files

fixed i18n issues

parent 11f6ce88
Loading
Loading
Loading
Loading
+26 −16
Original line number Diff line number Diff line
@@ -61,8 +61,17 @@ func (i18n *I18N) GetMapping(language, country string) (*mappings.Mapping, error
	return i18n.mappings.Get(language, country)
}

// SetMapping ...
func (i18n *I18N) SetMapping(language, country string) (bool, error) {
// SetStandardMapping ...
func (i18n *I18N) SetStandardMapping(language, country string) (bool, error) {
	return i18n.setMapping(&i18n.standard, language, country)
}

// SetCurrentMapping ...
func (i18n *I18N) SetCurrentMapping(language, country string) (bool, error) {
	return i18n.setMapping(&i18n.current, language, country)
}

func (i18n *I18N) setMapping(mapping **mappings.Mapping, language, country string) (bool, error) {
	if lt, lerr := i18n.languages.Get(language); !lt {
		return false, lerr
	}
@@ -73,7 +82,7 @@ func (i18n *I18N) SetMapping(language, country string) (bool, error) {
	if merr != nil {
		return false, merr
	}
	i18n.current = mp
	*mapping = mp
	return true, nil
}

@@ -88,32 +97,33 @@ func (i18n *I18N) AddTranslation(language, country, name, value string) (bool, e
	return i18n.translations.Add(language, country, name, value)
}

// GetTranslation ...
func (i18n *I18N) GetTranslation(name string) (string, error) {
	if i18n.current == nil {
		return "", ErrorCurrentIsNil
	}
// Get ...
func (i18n *I18N) Get(name string) (string, error) {
	var fallback *mappings.Mapping
	if i18n.current != nil {
		if lt, lerr := i18n.languages.Get(i18n.current.Language); !lt {
			return "", lerr
		}
		if ct, cerr := i18n.countries.Get(i18n.current.Country); !ct {
			return "", cerr
		}

	fallback, _ := i18n.mappings.GetFallback(i18n.current.Language, i18n.current.Country)
		fallback, _ = i18n.mappings.GetFallback(i18n.current.Language, i18n.current.Country)
	}

	for _, m := range []*mappings.Mapping{
		i18n.current,
		fallback,
		i18n.standard,
	} {
		//fmt.Fprintf(os.Stderr, "\n*1* %s (%s)", name, m)
		if m == nil {
			continue
		}
		val, err := i18n.translations.Get(m, name)
		val, err := i18n.translations.Get(m.Language, m.Country, name)
		if err != nil {
			continue
		}
		//fmt.Fprintf(os.Stderr, "\n*2* %s (%s): %s", name, m, val)
		return val, nil
	}
	return "", ErrorNoTranslation
+19 −6
Original line number Diff line number Diff line
@@ -5,8 +5,6 @@ import (
	"testing"

	"repositories.muehmer.net/bsmrgo/wizards/pkg/i18n/languages"

	"repositories.muehmer.net/bsmrgo/wizards/pkg/i18n/translations"
)

func TestI18N(t *testing.T) {
@@ -36,11 +34,26 @@ func TestI18N(t *testing.T) {
	i18n.AddTranslation("de", "AT", "hello", "Servus")
	i18n.AddTranslation("de", "DE", "world", "Welt")

	//t.Logf("Mappings:")
	//for key, value := range i18n.mappings.Data() {
	//	t.Logf("%s: %s", key, value.Fallback)
	//}

	//t.Logf("Translations:")
	//for key, value := range i18n.translations.Data() {
	//	t.Logf("[%s_%s] %s: \"%s\"", key.Language, key.Country, key.Name, value)
	//}

	if _, err := i18n.SetStandardMapping(m0.Language, m0.Country); err != nil {
		t.Errorf("failed to set standard mapping to %s: %s", m0, err)
	}

	for _, x := range []struct {
		l, c, name, value string
		e1, e2            error
	}{
		{l: "xx", c: "XX", name: "hello", value: "", e1: languages.ErrorUnknownLanguage, e2: translations.ErrorNoTranslation},
		{l: "xx", c: "XX", name: "hello", value: "hello", e1: languages.ErrorUnknownLanguage},
		//{l: "xx", c: "XX", name: "hello", value: "hello"},
		{l: "en", c: "US", name: "hello", value: "hello"},
		{l: "en", c: "GB", name: "hello", value: "hello"},
		{l: "de", c: "AT", name: "hello", value: "Servus"},
@@ -48,13 +61,13 @@ func TestI18N(t *testing.T) {
		{l: "de", c: "AT", name: "world", value: "Welt"},
		{l: "de", c: "AT", name: "unknown", value: "unknown"},
	} {
		_, err := i18n.SetMapping(x.l, x.c)
		_, err := i18n.SetCurrentMapping(x.l, x.c)
		if err != x.e1 {
			t.Errorf("failed to get mapping for %s/%s: %s", x.l, x.c, err)
		}
		r, err := i18n.GetTranslation(x.name)
		r, err := i18n.Get(x.name)
		if err != x.e2 {
			t.Errorf("failed to get translation for %s: %s", x.name, err)
			t.Errorf("failed to get translation for %s (%s/%s): %s", x.name, x.l, x.c, err)
		}
		if strings.Compare(r, x.value) != 0 {
			t.Errorf("\"%s\"(%s_%s) is \"%s\", expected \"%s\"", x.name, x.l, x.c, r, x.value)
+5 −0
Original line number Diff line number Diff line
@@ -81,3 +81,8 @@ func (m *Mappings) GetDefault() (*Mapping, error) {
func (m *Mapping) String() string {
	return fmt.Sprintf("%s_%s", m.Language, m.Country)
}

// Data ...
func (m *Mappings) Data() map[Mapping]Value {
	return m.data
}
+16 −15
Original line number Diff line number Diff line
@@ -2,8 +2,6 @@ package translations

import (
	"errors"

	"repositories.muehmer.net/bsmrgo/wizards/pkg/i18n/mappings"
)

var (
@@ -15,40 +13,38 @@ var (
	ErrorMappingIsNil = errors.New("mapping is nil")
)

type key struct {
	language, country, name string
// LCN ...
type LCN struct {
	Language, Country, Name string
}

// Translations ...
type Translations struct {
	data map[key]string
	data map[LCN]string
}

// New ...
func New() *Translations {
	return &Translations{
		data: make(map[key]string),
		data: make(map[LCN]string),
	}
}

// Add ...
func (t *Translations) Add(language, country, name, value string) (bool, error) {
	k := key{language: language, country: country, name: name}
	k := LCN{Language: language, Country: country, Name: name}
	t.data[k] = value
	return true, nil
}

// Get ...
func (t *Translations) Get(mapping *mappings.Mapping, name string) (string, error) {
func (t *Translations) Get(language, country, name string) (string, error) {
	var value string
	var valid bool
	if mapping == nil {
		return "", ErrorMappingIsNil
	}
	k := key{
		language: mapping.Language,
		country:  mapping.Country,
		name:     name,
	k := LCN{
		Language: language,
		Country:  country,
		Name:     name,
	}
	value, valid = t.data[k]
	if !valid {
@@ -57,3 +53,8 @@ func (t *Translations) Get(mapping *mappings.Mapping, name string) (string, erro

	return value, nil
}

// Data ...
func (t *Translations) Data() map[LCN]string {
	return t.data
}