diff --git a/docs/Config.md b/docs/Config.md index 724f35334eb..920d83ebf27 100644 --- a/docs/Config.md +++ b/docs/Config.md @@ -22,6 +22,7 @@ gui: sidePanelWidth: 0.3333 # number from 0 to 1 expandFocusedSidePanel: false mainPanelSplitMode: 'flexible' # one of 'horizontal' | 'flexible' | 'vertical' + language: 'auto' # one of 'auto' | 'en' | 'zh' | 'pl' | 'nl' theme: lightTheme: false # For terminals with a light background activeBorderColor: diff --git a/pkg/app/app.go b/pkg/app/app.go index 52a1687969e..e1d30d841ee 100644 --- a/pkg/app/app.go +++ b/pkg/app/app.go @@ -102,7 +102,10 @@ func NewApp(config config.AppConfigurer, filterPath string) (*App, error) { } var err error app.Log = newLogger(config) - app.Tr = i18n.NewTranslationSet(app.Log) + app.Tr, err = i18n.NewTranslationSetFromConfig(app.Log, config.GetUserConfig().Gui.Language) + if err != nil { + return app, err + } // if we are being called in 'demon' mode, we can just return here app.ClientContext = os.Getenv("LAZYGIT_CLIENT_COMMAND") diff --git a/pkg/commands/dummies.go b/pkg/commands/dummies.go index 6feb908e397..b1b6e944127 100644 --- a/pkg/commands/dummies.go +++ b/pkg/commands/dummies.go @@ -14,11 +14,12 @@ func NewDummyGitCommand() *GitCommand { // NewDummyGitCommandWithOSCommand creates a new dummy GitCommand for testing func NewDummyGitCommandWithOSCommand(osCommand *oscommands.OSCommand) *GitCommand { + newAppConfig := config.NewDummyAppConfig() return &GitCommand{ Log: utils.NewDummyLog(), OSCommand: osCommand, - Tr: i18n.NewTranslationSet(utils.NewDummyLog()), - Config: config.NewDummyAppConfig(), + Tr: i18n.NewTranslationSet(utils.NewDummyLog(), newAppConfig.GetUserConfig().Gui.Language), + Config: newAppConfig, getGitConfigValue: func(string) (string, error) { return "", nil }, } } diff --git a/pkg/commands/git_test.go b/pkg/commands/git_test.go index e31fe8910ee..6891fdc53aa 100644 --- a/pkg/commands/git_test.go +++ b/pkg/commands/git_test.go @@ -209,7 +209,8 @@ func TestNewGitCommand(t *testing.T) { for _, s := range scenarios { t.Run(s.testName, func(t *testing.T) { s.setup() - s.test(NewGitCommand(utils.NewDummyLog(), oscommands.NewDummyOSCommand(), i18n.NewTranslationSet(utils.NewDummyLog()), config.NewDummyAppConfig())) + newAppConfig := config.NewDummyAppConfig() + s.test(NewGitCommand(utils.NewDummyLog(), oscommands.NewDummyOSCommand(), i18n.NewTranslationSet(utils.NewDummyLog(), newAppConfig.GetUserConfig().Gui.Language), newAppConfig)) }) } } diff --git a/pkg/commands/loading_commits_test.go b/pkg/commands/loading_commits_test.go index a637f5bd5ec..bd35556d4fc 100644 --- a/pkg/commands/loading_commits_test.go +++ b/pkg/commands/loading_commits_test.go @@ -19,7 +19,7 @@ func NewDummyCommitListBuilder() *CommitListBuilder { Log: utils.NewDummyLog(), GitCommand: NewDummyGitCommandWithOSCommand(osCommand), OSCommand: osCommand, - Tr: i18n.NewTranslationSet(utils.NewDummyLog()), + Tr: i18n.NewTranslationSet(utils.NewDummyLog(), "auto"), } } diff --git a/pkg/config/user_config.go b/pkg/config/user_config.go index 9d61cb68f00..7b5145a47ae 100644 --- a/pkg/config/user_config.go +++ b/pkg/config/user_config.go @@ -32,6 +32,7 @@ type GuiConfig struct { SidePanelWidth float64 `yaml:"sidePanelWidth"` ExpandFocusedSidePanel bool `yaml:"expandFocusedSidePanel"` MainPanelSplitMode string `yaml:"mainPanelSplitMode"` + Language string `yaml:"language"` Theme ThemeConfig `yaml:"theme"` CommitLength CommitLengthConfig `yaml:"commitLength"` SkipNoStagedFilesWarning bool `yaml:"skipNoStagedFilesWarning"` @@ -310,6 +311,7 @@ func GetDefaultConfig() *UserConfig { SidePanelWidth: 0.3333, ExpandFocusedSidePanel: false, MainPanelSplitMode: "flexible", + Language: "auto", Theme: ThemeConfig{ LightTheme: false, ActiveBorderColor: []string{"green", "bold"}, diff --git a/pkg/gui/dummies.go b/pkg/gui/dummies.go index d8a7cba2908..0e37bbbc80f 100644 --- a/pkg/gui/dummies.go +++ b/pkg/gui/dummies.go @@ -11,11 +11,13 @@ import ( // NewDummyGui creates a new dummy GUI for testing func NewDummyUpdater() *updates.Updater { - DummyUpdater, _ := updates.NewUpdater(utils.NewDummyLog(), config.NewDummyAppConfig(), oscommands.NewDummyOSCommand(), i18n.NewTranslationSet(utils.NewDummyLog())) + newAppConfig := config.NewDummyAppConfig() + DummyUpdater, _ := updates.NewUpdater(utils.NewDummyLog(), newAppConfig, oscommands.NewDummyOSCommand(), i18n.NewTranslationSet(utils.NewDummyLog(), newAppConfig.GetUserConfig().Gui.Language)) return DummyUpdater } func NewDummyGui() *Gui { - DummyGui, _ := NewGui(utils.NewDummyLog(), commands.NewDummyGitCommand(), oscommands.NewDummyOSCommand(), i18n.NewTranslationSet(utils.NewDummyLog()), config.NewDummyAppConfig(), NewDummyUpdater(), "", false) + newAppConfig := config.NewDummyAppConfig() + DummyGui, _ := NewGui(utils.NewDummyLog(), commands.NewDummyGitCommand(), oscommands.NewDummyOSCommand(), i18n.NewTranslationSet(utils.NewDummyLog(), newAppConfig.GetUserConfig().Gui.Language), newAppConfig, NewDummyUpdater(), "", false) return DummyGui } diff --git a/pkg/i18n/i18n.go b/pkg/i18n/i18n.go index dece062f44d..8f6452c542b 100644 --- a/pkg/i18n/i18n.go +++ b/pkg/i18n/i18n.go @@ -4,6 +4,7 @@ import ( "strings" "github.com/cloudfoundry/jibber_jabber" + "github.com/go-errors/errors" "github.com/imdario/mergo" "github.com/sirupsen/logrus" ) @@ -14,20 +15,31 @@ type Localizer struct { S TranslationSet } -// NewTranslationSet creates a new Localizer -func NewTranslationSet(log *logrus.Entry) *TranslationSet { - userLang := detectLanguage(jibber_jabber.DetectLanguage) +func NewTranslationSetFromConfig(log *logrus.Entry, configLanguage string) (*TranslationSet, error) { + if configLanguage == "auto" { + language := detectLanguage(jibber_jabber.DetectLanguage) + return NewTranslationSet(log, language), nil + } - log.Info("language: " + userLang) + for key := range GetTranslationSets() { + if key == configLanguage { + return NewTranslationSet(log, configLanguage), nil + } + } + + return NewTranslationSet(log, "en"), errors.New("Language not found: " + configLanguage) +} + +func NewTranslationSet(log *logrus.Entry, language string) *TranslationSet { + log.Info("language: " + language) baseSet := englishTranslationSet() for languageCode, translationSet := range GetTranslationSets() { - if strings.HasPrefix(userLang, languageCode) { + if strings.HasPrefix(language, languageCode) { _ = mergo.Merge(&baseSet, translationSet, mergo.WithOverride) } } - return &baseSet }