Skip to content

Commit

Permalink
re-order methods in translation contract
Browse files Browse the repository at this point in the history
  • Loading branch information
kkumar-gcc committed Nov 21, 2023
1 parent 20d0b83 commit 774dfd2
Show file tree
Hide file tree
Showing 4 changed files with 109 additions and 102 deletions.
1 change: 1 addition & 0 deletions contracts/foundation/container.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package foundation

import (
"context"

"github.com/goravel/framework/contracts/auth"
"github.com/goravel/framework/contracts/auth/access"
"github.com/goravel/framework/contracts/cache"
Expand Down
16 changes: 8 additions & 8 deletions contracts/translation/translator.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,20 @@ import (
)

type Translator interface {
// Get the translation for the given key.
Get(key string, options ...Option) (string, error)
// Choice gets a translation according to an integer value.
Choice(key string, number int, options ...Option) (string, error)
// Has checks if a translation exists for a given key.
Has(key string, options ...Option) bool
// GetLocale get the current application/context locale.
GetLocale() string
// SetLocale set the current application/context locale.
SetLocale(locale string) context.Context
// Get the translation for the given key.
Get(key string, options ...Option) (string, error)
// GetFallback get the current application/context fallback locale.
GetFallback() string
// GetLocale get the current application/context locale.
GetLocale() string
// Has checks if a translation exists for a given key.
Has(key string, options ...Option) bool
// SetFallback set the current application/context fallback locale.
SetFallback(locale string) context.Context
// SetLocale set the current application/context locale.
SetLocale(locale string) context.Context
}

type Option struct {
Expand Down
66 changes: 33 additions & 33 deletions translation/translator.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,24 @@ func NewTranslator(ctx context.Context, loader translationcontract.Loader, local
}
}

func (t *Translator) Choice(key string, number int, options ...translationcontract.Option) (string, error) {
line, err := t.Get(key, options...)
if err != nil {
return "", err
}

replace := map[string]string{
"count": strconv.Itoa(number),
}

locale := t.GetLocale()
if len(options) > 0 && options[0].Locale != "" {
locale = options[0].Locale
}

return makeReplacements(t.selector.Choose(line, number, locale), replace), nil
}

func (t *Translator) Get(key string, options ...translationcontract.Option) (string, error) {
locale := t.GetLocale()
// Check if a custom locale is provided in options.
Expand Down Expand Up @@ -92,34 +110,31 @@ func (t *Translator) Get(key string, options ...translationcontract.Option) (str
return line, nil
}

func (t *Translator) Choice(key string, number int, options ...translationcontract.Option) (string, error) {
line, err := t.Get(key, options...)
if err != nil {
return "", err
}

replace := map[string]string{
"count": strconv.Itoa(number),
func (t *Translator) GetFallback() string {
if fallback, ok := t.ctx.Value(string(fallbackLocaleKey)).(string); ok {
return fallback
}
return t.fallback
}

locale := t.GetLocale()
if len(options) > 0 && options[0].Locale != "" {
locale = options[0].Locale
func (t *Translator) GetLocale() string {
if locale, ok := t.ctx.Value(string(localeKey)).(string); ok {
return locale
}

return makeReplacements(t.selector.Choose(line, number, locale), replace), nil
return t.locale
}

func (t *Translator) Has(key string, options ...translationcontract.Option) bool {
line, err := t.Get(key, options...)
return err == nil && line != key
}

func (t *Translator) GetLocale() string {
if locale, ok := t.ctx.Value(string(localeKey)).(string); ok {
return locale
}
return t.locale
func (t *Translator) SetFallback(locale string) context.Context {
t.fallback = locale
//nolint:all
t.ctx = context.WithValue(t.ctx, string(fallbackLocaleKey), locale)

return t.ctx
}

func (t *Translator) SetLocale(locale string) context.Context {
Expand All @@ -134,21 +149,6 @@ func (t *Translator) SetLocale(locale string) context.Context {
return t.ctx
}

func (t *Translator) GetFallback() string {
if fallback, ok := t.ctx.Value(string(fallbackLocaleKey)).(string); ok {
return fallback
}
return t.fallback
}

func (t *Translator) SetFallback(locale string) context.Context {
t.fallback = locale
//nolint:all
t.ctx = context.WithValue(t.ctx, string(fallbackLocaleKey), locale)

return t.ctx
}

func (t *Translator) load(folder string, locale string) error {
if t.isLoaded(folder, locale) {
return nil
Expand Down
128 changes: 67 additions & 61 deletions translation/translator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"github.com/stretchr/testify/suite"

translationcontract "github.com/goravel/framework/contracts/translation"
"github.com/goravel/framework/http"
mockloader "github.com/goravel/framework/mocks/translation"
)

Expand All @@ -27,6 +28,41 @@ func (t *TranslatorTestSuite) SetupTest() {
t.ctx = context.Background()
}

func (t *TranslatorTestSuite) TestChoice() {
translator := NewTranslator(t.ctx, t.mockLoader, "en", "en")
t.mockLoader.On("Load", "*", "en").Once().Return(map[string]map[string]string{
"en": {
"foo": "{0} first|{1}second",
},
}, nil)
translation, err := translator.Choice("foo", 1)
t.NoError(err)
t.Equal("second", translation)

// test atomic replacements
translator = NewTranslator(t.ctx, t.mockLoader, "en", "en")
t.mockLoader.On("Load", "*", "fr").Once().Return(map[string]map[string]string{
"en": {
"foo": "{0} first|{1}Hello, :foo!",
},
}, nil)
translation, err = translator.Choice("foo", 1, translationcontract.Option{
Replace: map[string]string{
"foo": "baz:bar",
"bar": "abcdef",
},
Locale: "fr",
})
t.NoError(err)
t.Equal("Hello, baz:bar!", translation)

translator = NewTranslator(t.ctx, t.mockLoader, "en", "en")
t.mockLoader.On("Load", "*", "en").Once().Return(nil, errors.New("some error"))
translation, err = translator.Choice("foo", 1)
t.EqualError(err, "some error")
t.Equal("", translation)
}

func (t *TranslatorTestSuite) TestGet() {
translator := NewTranslator(t.ctx, t.mockLoader, "en", "en")
t.mockLoader.On("Load", "*", "en").Once().Return(map[string]map[string]string{
Expand Down Expand Up @@ -127,39 +163,31 @@ func (t *TranslatorTestSuite) TestGet() {
t.Equal("French translation", translation)
}

func (t *TranslatorTestSuite) TestChoice() {
func (t *TranslatorTestSuite) TestGetLocale() {
translator := NewTranslator(t.ctx, t.mockLoader, "en", "en")
t.mockLoader.On("Load", "*", "en").Once().Return(map[string]map[string]string{
"en": {
"foo": "{0} first|{1}second",
},
}, nil)
translation, err := translator.Choice("foo", 1)
t.NoError(err)
t.Equal("second", translation)

// test atomic replacements
translator = NewTranslator(t.ctx, t.mockLoader, "en", "en")
t.mockLoader.On("Load", "*", "fr").Once().Return(map[string]map[string]string{
"en": {
"foo": "{0} first|{1}Hello, :foo!",
},
}, nil)
translation, err = translator.Choice("foo", 1, translationcontract.Option{
Replace: map[string]string{
"foo": "baz:bar",
"bar": "abcdef",
},
Locale: "fr",
})
t.NoError(err)
t.Equal("Hello, baz:bar!", translation)
// Case: Get locale initially set
locale := translator.GetLocale()
t.Equal("en", locale)

translator = NewTranslator(t.ctx, t.mockLoader, "en", "en")
t.mockLoader.On("Load", "*", "en").Once().Return(nil, errors.New("some error"))
translation, err = translator.Choice("foo", 1)
t.EqualError(err, "some error")
t.Equal("", translation)
// Case: Set locale using SetLocale and then get it
translator.SetLocale("fr")
locale = translator.GetLocale()
t.Equal("fr", locale)
}

func (t *TranslatorTestSuite) TestGetFallback() {
translator := NewTranslator(t.ctx, t.mockLoader, "en", "en")

// Case: No explicit fallback set
fallback := translator.GetFallback()
t.Equal("en", fallback)

// Case: Set fallback using SetFallback
newCtx := translator.SetFallback("fr")
fallback = translator.GetFallback()
t.Equal("fr", fallback)
t.Equal("fr", newCtx.Value(string(fallbackLocaleKey)))
}

func (t *TranslatorTestSuite) TestHas() {
Expand Down Expand Up @@ -194,17 +222,13 @@ func (t *TranslatorTestSuite) TestHas() {
t.False(hasKey)
}

func (t *TranslatorTestSuite) TestGetLocale() {
func (t *TranslatorTestSuite) TestSetFallback() {
translator := NewTranslator(t.ctx, t.mockLoader, "en", "en")

// Case: Get locale initially set
locale := translator.GetLocale()
t.Equal("en", locale)

// Case: Set locale using SetLocale and then get it
translator.SetLocale("fr")
locale = translator.GetLocale()
t.Equal("fr", locale)
// Case: Set fallback using SetFallback
newCtx := translator.SetFallback("fr")
t.Equal("fr", translator.fallback)
t.Equal("fr", newCtx.Value(string(fallbackLocaleKey)))
}

func (t *TranslatorTestSuite) TestSetLocale() {
Expand All @@ -214,29 +238,11 @@ func (t *TranslatorTestSuite) TestSetLocale() {
newCtx := translator.SetLocale("fr")
t.Equal("fr", translator.locale)
t.Equal("fr", newCtx.Value(string(localeKey)))
}

func (t *TranslatorTestSuite) TestGetFallback() {
translator := NewTranslator(t.ctx, t.mockLoader, "en", "en")

// Case: No explicit fallback set
fallback := translator.GetFallback()
t.Equal("en", fallback)

// Case: Set fallback using SetFallback
newCtx := translator.SetFallback("fr")
fallback = translator.GetFallback()
t.Equal("fr", fallback)
t.Equal("fr", newCtx.Value(string(fallbackLocaleKey)))
}

func (t *TranslatorTestSuite) TestSetFallback() {
translator := NewTranslator(t.ctx, t.mockLoader, "en", "en")

// Case: Set fallback using SetFallback
newCtx := translator.SetFallback("fr")
t.Equal("fr", translator.fallback)
t.Equal("fr", newCtx.Value(string(fallbackLocaleKey)))
// Case: use http.Context
translator = NewTranslator(http.Background(), t.mockLoader, "en", "en")
newCtx = translator.SetLocale("lv")

Check failure on line 244 in translation/translator_test.go

View workflow job for this annotation

GitHub Actions / lint

SA4006: this value of `newCtx` is never used (staticcheck)
t.Equal("lv", translator.locale)
}

func (t *TranslatorTestSuite) TestLoad() {
Expand Down

0 comments on commit 774dfd2

Please sign in to comment.