diff --git a/modules/translation/translation.go b/modules/translation/translation.go
index 28ff6a5db1..b7276e53c0 100644
--- a/modules/translation/translation.go
+++ b/modules/translation/translation.go
@@ -5,6 +5,8 @@
 package translation
 
 import (
+	"errors"
+
 	"code.gitea.io/gitea/modules/log"
 	"code.gitea.io/gitea/modules/options"
 	"code.gitea.io/gitea/modules/setting"
@@ -57,8 +59,13 @@ func InitLocales() {
 	matcher = language.NewMatcher(tags)
 	for i := range setting.Names {
 		key := "locale_" + setting.Langs[i] + ".ini"
-		if err := i18n.SetMessageWithDesc(setting.Langs[i], setting.Names[i], localFiles[key]); err != nil {
-			log.Fatal("Failed to set messages to %s: %v", setting.Langs[i], err)
+		if err = i18n.SetMessageWithDesc(setting.Langs[i], setting.Names[i], localFiles[key]); err != nil {
+			if errors.Is(err, i18n.ErrLangAlreadyExist) {
+				// just log if lang is already loaded since we can not reload it
+				log.Warn("Can not load language '%s' since already loaded", setting.Langs[i])
+			} else {
+				log.Error("Failed to set messages to %s: %v", setting.Langs[i], err)
+			}
 		}
 	}
 	i18n.SetDefaultLang("en-US")