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)
 			}
 		}