Fix language auto detection (#3744)

- **PR Description**

Fix a regression (introduced with #3649) that broke language
auto-detection. When starting lazygit with the `gui.language` config set
to "auto" (which is the default), lazygit would fail to start if the
LANG environment is set to one of our supported languages.

For example:
```
$ export LANG=nl_NL
$ lazygit
2024/07/13 11:43:03 open translations/nl-NL.json: file does not exist
```

Fixes #3743
This commit is contained in:
Stefan Haller 2024-07-13 12:14:39 +02:00 committed by GitHub
commit 71ad3fac63
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 85 additions and 1 deletions

View file

@ -24,7 +24,7 @@ func NewTranslationSetFromConfig(log *logrus.Entry, configLanguage string) (*Tra
language := detectLanguage(jibber_jabber.DetectIETF)
for _, languageCode := range languageCodes {
if strings.HasPrefix(language, languageCode) {
return newTranslationSet(log, language)
return newTranslationSet(log, languageCode)
}
}

View file

@ -2,8 +2,11 @@ package i18n
import (
"fmt"
"io"
"runtime"
"testing"
"github.com/sirupsen/logrus"
"github.com/stretchr/testify/assert"
)
@ -33,3 +36,84 @@ func TestDetectLanguage(t *testing.T) {
assert.EqualValues(t, s.expected, detectLanguage(s.langDetector))
}
}
// Can't use utils.NewDummyLog() because of a cyclic dependency
func newDummyLog() *logrus.Entry {
log := logrus.New()
log.Out = io.Discard
return log.WithField("test", "test")
}
func TestNewTranslationSetFromConfig(t *testing.T) {
if runtime.GOOS == "windows" {
// These tests are based on setting the LANG environment variable, which
// isn't respected on Windows.
t.Skip("Skipping test on Windows")
}
scenarios := []struct {
name string
configLanguage string
envLanguage string
expected string
expectedErr bool
}{
{
name: "configLanguage is nl",
configLanguage: "nl",
envLanguage: "en_US",
expected: "nl",
expectedErr: false,
},
{
name: "configLanguage is an unsupported language",
configLanguage: "xy",
envLanguage: "en_US",
expectedErr: true,
},
{
name: "auto-detection without LANG set",
configLanguage: "auto",
envLanguage: "",
expected: "en",
expectedErr: false,
},
{
name: "auto-detection with LANG set to nl_NL",
configLanguage: "auto",
envLanguage: "nl_NL",
expected: "nl",
expectedErr: false,
},
{
name: "auto-detection with LANG set to zh-CN",
configLanguage: "auto",
envLanguage: "zh-CN",
expected: "zh-CN",
expectedErr: false,
},
{
name: "auto-detection with LANG set to an unsupported language",
configLanguage: "auto",
envLanguage: "xy_XY",
expected: "en",
expectedErr: false,
},
}
for _, s := range scenarios {
t.Run(s.name, func(t *testing.T) {
log := newDummyLog()
t.Setenv("LANG", s.envLanguage)
actualTranslationSet, err := NewTranslationSetFromConfig(log, s.configLanguage)
if s.expectedErr {
assert.Error(t, err)
} else {
assert.NoError(t, err)
expectedTranslationSet, _ := newTranslationSet(log, s.expected)
assert.Equal(t, expectedTranslationSet, actualTranslationSet)
}
})
}
}