Only en-US has complete translations. When use other language as default, the en-US should still be used as fallback. Backport #21200, Close #21199
This commit is contained in:
		
							parent
							
								
									be5411d6b5
								
							
						
					
					
						commit
						e79a10793f
					
				| @ -41,14 +41,14 @@ func NewLocaleStore() *LocaleStore { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // AddLocaleByIni adds locale by ini into the store
 | // AddLocaleByIni adds locale by ini into the store
 | ||||||
| func (ls *LocaleStore) AddLocaleByIni(langName, langDesc string, localeFile interface{}, otherLocaleFiles ...interface{}) error { | func (ls *LocaleStore) AddLocaleByIni(langName, langDesc string, source, moreSource []byte) error { | ||||||
| 	if _, ok := ls.localeMap[langName]; ok { | 	if _, ok := ls.localeMap[langName]; ok { | ||||||
| 		return ErrLocaleAlreadyExist | 		return ErrLocaleAlreadyExist | ||||||
| 	} | 	} | ||||||
| 	iniFile, err := ini.LoadSources(ini.LoadOptions{ | 	iniFile, err := ini.LoadSources(ini.LoadOptions{ | ||||||
| 		IgnoreInlineComment:         true, | 		IgnoreInlineComment:         true, | ||||||
| 		UnescapeValueCommentSymbols: true, | 		UnescapeValueCommentSymbols: true, | ||||||
| 	}, localeFile, otherLocaleFiles...) | 	}, source, moreSource) | ||||||
| 	if err == nil { | 	if err == nil { | ||||||
| 		iniFile.BlockMode = false | 		iniFile.BlockMode = false | ||||||
| 		lc := &locale{store: ls, langName: langName, langDesc: langDesc, messages: iniFile} | 		lc := &locale{store: ls, langName: langName, langDesc: langDesc, messages: iniFile} | ||||||
|  | |||||||
| @ -10,7 +10,7 @@ import ( | |||||||
| 	"github.com/stretchr/testify/assert" | 	"github.com/stretchr/testify/assert" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| func Test_Tr(t *testing.T) { | func TestLocaleStore(t *testing.T) { | ||||||
| 	testData1 := []byte(` | 	testData1 := []byte(` | ||||||
| .dot.name = Dot Name | .dot.name = Dot Name | ||||||
| fmt = %[1]s %[2]s | fmt = %[1]s %[2]s | ||||||
| @ -28,8 +28,8 @@ sub = Changed Sub String | |||||||
| `) | `) | ||||||
| 
 | 
 | ||||||
| 	ls := NewLocaleStore() | 	ls := NewLocaleStore() | ||||||
| 	assert.NoError(t, ls.AddLocaleByIni("lang1", "Lang1", testData1)) | 	assert.NoError(t, ls.AddLocaleByIni("lang1", "Lang1", testData1, nil)) | ||||||
| 	assert.NoError(t, ls.AddLocaleByIni("lang2", "Lang2", testData2)) | 	assert.NoError(t, ls.AddLocaleByIni("lang2", "Lang2", testData2, nil)) | ||||||
| 	ls.SetDefaultLang("lang1") | 	ls.SetDefaultLang("lang1") | ||||||
| 
 | 
 | ||||||
| 	result := ls.Tr("lang1", "fmt", "a", "b") | 	result := ls.Tr("lang1", "fmt", "a", "b") | ||||||
| @ -54,3 +54,21 @@ sub = Changed Sub String | |||||||
| 	assert.Equal(t, []string{"lang1", "lang2"}, langs) | 	assert.Equal(t, []string{"lang1", "lang2"}, langs) | ||||||
| 	assert.Equal(t, []string{"Lang1", "Lang2"}, descs) | 	assert.Equal(t, []string{"Lang1", "Lang2"}, descs) | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | 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")) | ||||||
|  | } | ||||||
|  | |||||||
| @ -60,9 +60,9 @@ func InitLocales() { | |||||||
| 		log.Fatal("Failed to list locale files: %v", err) | 		log.Fatal("Failed to list locale files: %v", err) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	localFiles := make(map[string][]byte, len(localeNames)) | 	localeData := make(map[string][]byte, len(localeNames)) | ||||||
| 	for _, name := range localeNames { | 	for _, name := range localeNames { | ||||||
| 		localFiles[name], err = options.Locale(name) | 		localeData[name], err = options.Locale(name) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			log.Fatal("Failed to load %s locale file. %v", name, err) | 			log.Fatal("Failed to load %s locale file. %v", name, err) | ||||||
| 		} | 		} | ||||||
| @ -75,8 +75,16 @@ func InitLocales() { | |||||||
| 
 | 
 | ||||||
| 	matcher = language.NewMatcher(supportedTags) | 	matcher = language.NewMatcher(supportedTags) | ||||||
| 	for i := range setting.Names { | 	for i := range setting.Names { | ||||||
|  | 		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.") | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
| 		key := "locale_" + setting.Langs[i] + ".ini" | 		key := "locale_" + setting.Langs[i] + ".ini" | ||||||
| 		if err = i18n.DefaultLocales.AddLocaleByIni(setting.Langs[i], setting.Names[i], localFiles[key]); err != nil { | 		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) | 			log.Error("Failed to set messages to %s: %v", setting.Langs[i], err) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user