diff options
author | wxiaoguang <wxiaoguang@gmail.com> | 2022-09-25 07:00:16 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-09-25 02:00:16 +0300 |
commit | bb1e0d0aa5af402b23a60ab9f4e64e4bad634051 (patch) | |
tree | d4241dde2c4ae927c8f8527f711cc5c82be40a8b /modules | |
parent | 0c8ce71188cae1d59380a213816a22bce48691db (diff) | |
download | gitea-bb1e0d0aa5af402b23a60ab9f4e64e4bad634051.tar.gz gitea-bb1e0d0aa5af402b23a60ab9f4e64e4bad634051.zip |
Use en-US as fallback when using other default language (#21200)
Only en-US has complete translations. When use other language as
default, the en-US should still be used as fallback.
Close #21199
### Screenshot
![image](https://user-images.githubusercontent.com/2114189/190882906-b7a83958-0ea2-46c4-9084-42c4f9a239aa.png)
Co-authored-by: Lauris BH <lauris@nix.lv>
Diffstat (limited to 'modules')
-rw-r--r-- | modules/translation/i18n/i18n.go | 2 | ||||
-rw-r--r-- | modules/translation/i18n/i18n_test.go | 24 | ||||
-rw-r--r-- | modules/translation/i18n/localestore.go | 6 | ||||
-rw-r--r-- | modules/translation/translation.go | 16 |
4 files changed, 36 insertions, 12 deletions
diff --git a/modules/translation/i18n/i18n.go b/modules/translation/i18n/i18n.go index 23b4e23c76..d8ed43a1cd 100644 --- a/modules/translation/i18n/i18n.go +++ b/modules/translation/i18n/i18n.go @@ -34,7 +34,7 @@ type LocaleStore interface { // HasLang returns whether a given language is present in the store HasLang(langName string) bool // AddLocaleByIni adds a new language to the store - AddLocaleByIni(langName, langDesc string, source interface{}) error + AddLocaleByIni(langName, langDesc string, source, moreSource []byte) error } // ResetDefaultLocales resets the current default locales diff --git a/modules/translation/i18n/i18n_test.go b/modules/translation/i18n/i18n_test.go index 7940e59c94..0f4605c1bb 100644 --- a/modules/translation/i18n/i18n_test.go +++ b/modules/translation/i18n/i18n_test.go @@ -10,7 +10,7 @@ import ( "github.com/stretchr/testify/assert" ) -func Test_Tr(t *testing.T) { +func TestLocaleStore(t *testing.T) { testData1 := []byte(` .dot.name = Dot Name fmt = %[1]s %[2]s @@ -28,8 +28,8 @@ sub = Changed Sub String `) ls := NewLocaleStore() - assert.NoError(t, ls.AddLocaleByIni("lang1", "Lang1", testData1)) - assert.NoError(t, ls.AddLocaleByIni("lang2", "Lang2", testData2)) + assert.NoError(t, ls.AddLocaleByIni("lang1", "Lang1", testData1, nil)) + assert.NoError(t, ls.AddLocaleByIni("lang2", "Lang2", testData2, nil)) ls.SetDefaultLang("lang1") result := ls.Tr("lang1", "fmt", "a", "b") @@ -58,3 +58,21 @@ sub = Changed Sub String assert.False(t, found) assert.NoError(t, ls.Close()) } + +func TestLocaleStoreMoreSource(t *testing.T) { + testData1 := []byte(` +a=11 +b=12 +`) + + testData2 := []byte(` +b=21 +c=22 +`) + + ls := NewLocaleStore() + assert.NoError(t, ls.AddLocaleByIni("lang1", "Lang1", testData1, testData2)) + assert.Equal(t, "11", ls.Tr("lang1", "a")) + assert.Equal(t, "21", ls.Tr("lang1", "b")) + assert.Equal(t, "22", ls.Tr("lang1", "c")) +} diff --git a/modules/translation/i18n/localestore.go b/modules/translation/i18n/localestore.go index e3b88ad96e..853519e224 100644 --- a/modules/translation/i18n/localestore.go +++ b/modules/translation/i18n/localestore.go @@ -37,9 +37,7 @@ func NewLocaleStore() LocaleStore { } // AddLocaleByIni adds locale by ini into the store -// if source is a string, then the file is loaded -// if source is a []byte, then the content is used -func (store *localeStore) AddLocaleByIni(langName, langDesc string, source interface{}) error { +func (store *localeStore) AddLocaleByIni(langName, langDesc string, source, moreSource []byte) error { if _, ok := store.localeMap[langName]; ok { return ErrLocaleAlreadyExist } @@ -53,7 +51,7 @@ func (store *localeStore) AddLocaleByIni(langName, langDesc string, source inter iniFile, err := ini.LoadSources(ini.LoadOptions{ IgnoreInlineComment: true, UnescapeValueCommentSymbols: true, - }, source) + }, source, moreSource) if err != nil { return fmt.Errorf("unable to load ini: %w", err) } diff --git a/modules/translation/translation.go b/modules/translation/translation.go index e40a9357fa..fc311aa61b 100644 --- a/modules/translation/translation.go +++ b/modules/translation/translation.go @@ -60,9 +60,9 @@ func InitLocales(ctx context.Context) { log.Fatal("Failed to list locale files: %v", err) } - localFiles := make(map[string]interface{}, len(localeNames)) + localeData := make(map[string][]byte, len(localeNames)) for _, name := range localeNames { - localFiles[name], err = options.Locale(name) + localeData[name], err = options.Locale(name) if err != nil { log.Fatal("Failed to load %s locale file. %v", name, err) } @@ -75,9 +75,17 @@ func InitLocales(ctx context.Context) { matcher = language.NewMatcher(supportedTags) for i := range setting.Names { - key := "locale_" + setting.Langs[i] + ".ini" + var localeDataBase []byte + if i == 0 && setting.Langs[0] != "en-US" { + // Only en-US has complete translations. When use other language as default, the en-US should still be used as fallback. + localeDataBase = localeData["locale_en-US.ini"] + if localeDataBase == nil { + log.Fatal("Failed to load locale_en-US.ini file.") + } + } - if err = i18n.DefaultLocales.AddLocaleByIni(setting.Langs[i], setting.Names[i], localFiles[key]); err != nil { + key := "locale_" + setting.Langs[i] + ".ini" + if err = i18n.DefaultLocales.AddLocaleByIni(setting.Langs[i], setting.Names[i], localeDataBase, localeData[key]); err != nil { log.Error("Failed to set messages to %s: %v", setting.Langs[i], err) } } |