Skip to content

Commit d123259

Browse files
committed
backport go-gitea#21200
1 parent be5411d commit d123259

File tree

3 files changed

+34
-8
lines changed

3 files changed

+34
-8
lines changed

modules/translation/i18n/i18n.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,14 @@ func NewLocaleStore() *LocaleStore {
4141
}
4242

4343
// AddLocaleByIni adds locale by ini into the store
44-
func (ls *LocaleStore) AddLocaleByIni(langName, langDesc string, localeFile interface{}, otherLocaleFiles ...interface{}) error {
44+
func (ls *LocaleStore) AddLocaleByIni(langName, langDesc string, source, moreSource []byte) error {
4545
if _, ok := ls.localeMap[langName]; ok {
4646
return ErrLocaleAlreadyExist
4747
}
4848
iniFile, err := ini.LoadSources(ini.LoadOptions{
4949
IgnoreInlineComment: true,
5050
UnescapeValueCommentSymbols: true,
51-
}, localeFile, otherLocaleFiles...)
51+
}, source, moreSource)
5252
if err == nil {
5353
iniFile.BlockMode = false
5454
lc := &locale{store: ls, langName: langName, langDesc: langDesc, messages: iniFile}

modules/translation/i18n/i18n_test.go

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import (
1010
"github.com/stretchr/testify/assert"
1111
)
1212

13-
func Test_Tr(t *testing.T) {
13+
func TestLocaleStore(t *testing.T) {
1414
testData1 := []byte(`
1515
.dot.name = Dot Name
1616
fmt = %[1]s %[2]s
@@ -28,8 +28,8 @@ sub = Changed Sub String
2828
`)
2929

3030
ls := NewLocaleStore()
31-
assert.NoError(t, ls.AddLocaleByIni("lang1", "Lang1", testData1))
32-
assert.NoError(t, ls.AddLocaleByIni("lang2", "Lang2", testData2))
31+
assert.NoError(t, ls.AddLocaleByIni("lang1", "Lang1", testData1, nil))
32+
assert.NoError(t, ls.AddLocaleByIni("lang2", "Lang2", testData2, nil))
3333
ls.SetDefaultLang("lang1")
3434

3535
result := ls.Tr("lang1", "fmt", "a", "b")
@@ -54,3 +54,21 @@ sub = Changed Sub String
5454
assert.Equal(t, []string{"lang1", "lang2"}, langs)
5555
assert.Equal(t, []string{"Lang1", "Lang2"}, descs)
5656
}
57+
58+
func TestLocaleStoreMoreSource(t *testing.T) {
59+
testData1 := []byte(`
60+
a=11
61+
b=12
62+
`)
63+
64+
testData2 := []byte(`
65+
b=21
66+
c=22
67+
`)
68+
69+
ls := NewLocaleStore()
70+
assert.NoError(t, ls.AddLocaleByIni("lang1", "Lang1", testData1, testData2))
71+
assert.Equal(t, "11", ls.Tr("lang1", "a"))
72+
assert.Equal(t, "21", ls.Tr("lang1", "b"))
73+
assert.Equal(t, "22", ls.Tr("lang1", "c"))
74+
}

modules/translation/translation.go

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,9 @@ func InitLocales() {
6060
log.Fatal("Failed to list locale files: %v", err)
6161
}
6262

63-
localFiles := make(map[string][]byte, len(localeNames))
63+
localeData := make(map[string][]byte, len(localeNames))
6464
for _, name := range localeNames {
65-
localFiles[name], err = options.Locale(name)
65+
localeData[name], err = options.Locale(name)
6666
if err != nil {
6767
log.Fatal("Failed to load %s locale file. %v", name, err)
6868
}
@@ -75,8 +75,16 @@ func InitLocales() {
7575

7676
matcher = language.NewMatcher(supportedTags)
7777
for i := range setting.Names {
78+
var localeDataBase []byte
79+
if i == 0 && setting.Langs[0] != "en-US" {
80+
// Only en-US has complete translations. When use other language as default, the en-US should still be used as fallback.
81+
localeDataBase = localeData["locale_en-US.ini"]
82+
if localeDataBase == nil {
83+
log.Fatal("Failed to load locale_en-US.ini file.")
84+
}
85+
}
7886
key := "locale_" + setting.Langs[i] + ".ini"
79-
if err = i18n.DefaultLocales.AddLocaleByIni(setting.Langs[i], setting.Names[i], localFiles[key]); err != nil {
87+
if err = i18n.DefaultLocales.AddLocaleByIni(setting.Langs[i], setting.Names[i], localeDataBase, localeData[key]); err != nil {
8088
log.Error("Failed to set messages to %s: %v", setting.Langs[i], err)
8189
}
8290
}

0 commit comments

Comments
 (0)