diff --git a/models/repo/repo.go b/models/repo/repo.go
index 350dc86d4b..86bd368d0b 100644
--- a/models/repo/repo.go
+++ b/models/repo/repo.go
@@ -234,6 +234,7 @@ type SizeDetail struct {
 }
 
 // SizeDetails forms a struct with various size details about repository
+// Note: SizeDetailsString below expects it to have 2 entries
 func (repo *Repository) SizeDetails() []SizeDetail {
 	sizeDetails := []SizeDetail{
 		{
@@ -250,16 +251,8 @@ func (repo *Repository) SizeDetails() []SizeDetail {
 
 // SizeDetailsString returns a concatenation of all repository size details as a string
 func (repo *Repository) SizeDetailsString(locale translation.Locale) string {
-	var str strings.Builder
 	sizeDetails := repo.SizeDetails()
-	for i, detail := range sizeDetails {
-		if i > 0 {
-			// TODO: use semicolon if decimal point of user localization is a comma
-			str.WriteString(", ")
-		}
-		str.WriteString(fmt.Sprintf("%s: %s", detail.Name, locale.TrSize(detail.Size)))
-	}
-	return str.String()
+	return locale.TrString("repo.size_format", sizeDetails[0].Name, locale.TrSize(sizeDetails[0].Size), sizeDetails[1].Name, locale.TrSize(sizeDetails[1].Size))
 }
 
 func (repo *Repository) LogString() string {
diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini
index 7660af8be4..e595f40269 100644
--- a/options/locale/locale_en-US.ini
+++ b/options/locale/locale_en-US.ini
@@ -1011,6 +1011,7 @@ owner_helper = Some organizations may not show up in the dropdown due to a maxim
 repo_name = Repository name
 repo_name_helper = Good repository names use short, memorable and unique keywords.
 repo_size = Repository Size
+size_format = %[1]s: %[2]s, %[3]s: %[4]s
 template = Template
 template_select = Select a template.
 template_helper = Make repository a template
diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini
index 55e850e473..760b7b2528 100644
--- a/options/locale/locale_ru-RU.ini
+++ b/options/locale/locale_ru-RU.ini
@@ -993,6 +993,7 @@ owner_helper=Некоторые организации могут не отоб
 repo_name=Название репозитория
 repo_name_helper=Лучшие названия репозиториев состоят из коротких, легко запоминаемых и уникальных ключевых слов.
 repo_size=Размер репозитория
+size_format = `%[1]s: %[2]s; %[3]s: %[4]s`
 template=Шаблон
 template_select=Выбрать шаблон.
 template_helper=Сделать репозиторий шаблоном
@@ -3773,4 +3774,4 @@ keyword_search_unavailable = Поиск по ключевым словам не
 match_tooltip = Включать только результаты, точно соответствующие запросу
 code_search_unavailable = Поиск по коду сейчас недоступен. Уточните подробности у администратора.
 runner_kind = Поиск раннеров...
-code_search_by_git_grep = Эти результаты получены через «git grep». Результатов может быть больше, если администратор сервера включит индексатор кода.
\ No newline at end of file
+code_search_by_git_grep = Эти результаты получены через «git grep». Результатов может быть больше, если администратор сервера включит индексатор кода.
diff --git a/tests/integration/size_translations_test.go b/tests/integration/size_translations_test.go
index 0a296ad385..78cd16795d 100644
--- a/tests/integration/size_translations_test.go
+++ b/tests/integration/size_translations_test.go
@@ -87,7 +87,7 @@ func TestDataSizeTranslation(t *testing.T) {
 		fullSize, exists := repo.Attr("data-tooltip-content")
 		assert.True(t, exists)
 		fullSize = noDigits.ReplaceAllString(fullSize, "")
-		assert.Equal(t, "git:  КиБ, lfs:  Б", fullSize)
+		assert.Equal(t, "git:  КиБ; lfs:  Б", fullSize)
 
 		// Check if file sizes are correclty translated
 		testFileSizeTranslated(t, session, path.Join(testUser, testRepoName, "src/branch/main/137byteFile.txt"), "137 Б")