Loading pkg/i18n/i18n.go +26 −16 Original line number Diff line number Diff line Loading @@ -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 } Loading @@ -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 } Loading @@ -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 Loading pkg/i18n/i18n_test.go +19 −6 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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"}, Loading @@ -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) Loading pkg/i18n/mappings/mappings.go +5 −0 Original line number Diff line number Diff line Loading @@ -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 } pkg/i18n/translations/translations.go +16 −15 Original line number Diff line number Diff line Loading @@ -2,8 +2,6 @@ package translations import ( "errors" "repositories.muehmer.net/bsmrgo/wizards/pkg/i18n/mappings" ) var ( Loading @@ -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 { Loading @@ -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 } Loading
pkg/i18n/i18n.go +26 −16 Original line number Diff line number Diff line Loading @@ -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 } Loading @@ -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 } Loading @@ -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 Loading
pkg/i18n/i18n_test.go +19 −6 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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"}, Loading @@ -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) Loading
pkg/i18n/mappings/mappings.go +5 −0 Original line number Diff line number Diff line Loading @@ -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 }
pkg/i18n/translations/translations.go +16 −15 Original line number Diff line number Diff line Loading @@ -2,8 +2,6 @@ package translations import ( "errors" "repositories.muehmer.net/bsmrgo/wizards/pkg/i18n/mappings" ) var ( Loading @@ -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 { Loading @@ -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 }