aboutsummaryrefslogtreecommitdiffstats
path: root/modules
diff options
context:
space:
mode:
authorwxiaoguang <wxiaoguang@gmail.com>2022-09-25 07:00:16 +0800
committerGitHub <noreply@github.com>2022-09-25 02:00:16 +0300
commitbb1e0d0aa5af402b23a60ab9f4e64e4bad634051 (patch)
treed4241dde2c4ae927c8f8527f711cc5c82be40a8b /modules
parent0c8ce71188cae1d59380a213816a22bce48691db (diff)
downloadgitea-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.go2
-rw-r--r--modules/translation/i18n/i18n_test.go24
-rw-r--r--modules/translation/i18n/localestore.go6
-rw-r--r--modules/translation/translation.go16
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)
}
}