+
{
/>
{currentLangOption && (
- {t('modals.main.settings.sections.language.current')}: {currentLangOption.nativeName}
+ {t('modals.main.settings.sections.language.current')}:{' '}
+ {currentLangOption.nativeName}
)}
diff --git a/src/features/welcome/components/Sections/ChooseLanguage.jsx b/src/features/welcome/components/Sections/ChooseLanguage.jsx
index d53de184..7b8ef7b5 100644
--- a/src/features/welcome/components/Sections/ChooseLanguage.jsx
+++ b/src/features/welcome/components/Sections/ChooseLanguage.jsx
@@ -2,6 +2,7 @@ import { useState, useMemo } from 'react';
import { MdOutlineOpenInNew, MdSearch } from 'react-icons/md';
import { TextField, InputAdornment } from '@mui/material';
import languages from '@/i18n/languages.json';
+import translationPercentages from '@/i18n/translationPercentages.json';
import { useT, useTranslation } from 'contexts/TranslationContext';
import variables from 'config/variables';
@@ -23,6 +24,7 @@ function ChooseLanguage() {
const mappedLanguages = languages.map((lang) => {
const nativeName = lang.name;
const isoCode = lang.value.replace('_', '-');
+ const percentage = translationPercentages[lang.value]?.percent || 0;
let translatedName;
try {
@@ -30,17 +32,21 @@ function ChooseLanguage() {
if (translatedName) {
translatedName = translatedName.split(' (')[0];
}
- } catch (e) {
+ } catch {
translatedName = nativeName;
}
const displayName =
!translatedName || translatedName === nativeName ? (
- nativeName
+ <>
+ {nativeName}
({percentage}%)
+ >
) : (
<>
{nativeName}{' '}
-
({translatedName})
+
+ ({translatedName} • {percentage}%)
+
>
);
@@ -48,6 +54,7 @@ function ChooseLanguage() {
name: displayName,
value: lang.value,
nativeName,
+ percentage,
searchText: `${nativeName} ${translatedName || ''}`.toLowerCase(),
};
});
@@ -60,14 +67,16 @@ function ChooseLanguage() {
const filteredLanguages = useMemo(() => {
if (!searchQuery.trim()) return languageOptions;
const query = searchQuery.toLowerCase();
- return languageOptions.filter(lang => lang.searchText.includes(query));
+ return languageOptions.filter((lang) => lang.searchText.includes(query));
}, [languageOptions, searchQuery]);
// Detect system language
const systemLanguage = useMemo(() => {
const browserLang = navigator.language.replace('-', '_');
- return languages.find(l => l.value === browserLang) ||
- languages.find(l => l.value.startsWith(browserLang.split('_')[0]));
+ return (
+ languages.find((l) => l.value === browserLang) ||
+ languages.find((l) => l.value.startsWith(browserLang.split('_')[0]))
+ );
}, []);
return (
diff --git a/src/i18n/translationPercentages.json b/src/i18n/translationPercentages.json
new file mode 100644
index 00000000..198e23fe
--- /dev/null
+++ b/src/i18n/translationPercentages.json
@@ -0,0 +1,138 @@
+{
+ "en_GB": {
+ "percent": 100,
+ "lastChange": "2025-11-01T18:26:28.748698Z"
+ },
+ "de_DE": {
+ "percent": 99.6,
+ "lastChange": "2025-11-02T18:51:15.668198Z"
+ },
+ "en_US": {
+ "percent": 99.4,
+ "lastChange": "2025-11-27T16:00:13.299953Z"
+ },
+ "es": {
+ "percent": 99.8,
+ "lastChange": "2025-12-13T18:00:20.128157Z"
+ },
+ "fr": {
+ "percent": 100,
+ "lastChange": "2026-01-02T11:01:50.048816Z"
+ },
+ "id_ID": {
+ "percent": 99,
+ "lastChange": "2025-11-02T18:51:31.688786Z"
+ },
+ "nl": {
+ "percent": 99.4,
+ "lastChange": "2025-11-02T18:51:35.270456Z"
+ },
+ "no": {
+ "percent": 99.4,
+ "lastChange": "2025-11-02T18:51:39.134759Z"
+ },
+ "ru": {
+ "percent": 99.6,
+ "lastChange": "2025-11-02T18:51:43.544130Z"
+ },
+ "tr_TR": {
+ "percent": 99.6,
+ "lastChange": "2025-11-02T18:51:47.582567Z"
+ },
+ "zh_CN": {
+ "percent": 99.2,
+ "lastChange": "2025-11-02T18:51:51.182076Z"
+ },
+ "pt_BR": {
+ "percent": 98.8,
+ "lastChange": "2025-11-02T18:51:54.789336Z"
+ },
+ "es_419": {
+ "percent": 99.6,
+ "lastChange": "2025-11-02T18:51:58.826381Z"
+ },
+ "pt_PT": {
+ "percent": 99,
+ "lastChange": "2025-11-02T18:52:02.248380Z"
+ },
+ "bn": {
+ "percent": 99.6,
+ "lastChange": "2025-11-02T18:52:06.416365Z"
+ },
+ "sl": {
+ "percent": 99.6,
+ "lastChange": "2025-11-02T18:52:09.801136Z"
+ },
+ "fa": {
+ "percent": 99.4,
+ "lastChange": "2026-01-03T18:06:23.197313Z"
+ },
+ "az": {
+ "percent": 99.6,
+ "lastChange": "2025-11-02T18:52:16.631811Z"
+ },
+ "azb": {
+ "percent": 99.6,
+ "lastChange": "2025-11-02T18:52:20.051219Z"
+ },
+ "zh_Hant": {
+ "percent": 99.6,
+ "lastChange": "2025-11-02T18:52:23.571948Z"
+ },
+ "lt": {
+ "percent": 99.6,
+ "lastChange": "2025-11-02T18:52:26.957231Z"
+ },
+ "lv": {
+ "percent": 99.6,
+ "lastChange": "2025-11-02T18:52:30.768664Z"
+ },
+ "et": {
+ "percent": 99.6,
+ "lastChange": "2025-11-02T18:52:34.391330Z"
+ },
+ "vi": {
+ "percent": 0.1,
+ "lastChange": "2025-11-01T18:26:36.276619Z"
+ },
+ "ja": {
+ "percent": 1.3,
+ "lastChange": "2025-11-01T18:26:33.191724Z"
+ },
+ "ta": {
+ "percent": 99.6,
+ "lastChange": "2025-11-02T18:52:38.046456Z"
+ },
+ "ar": {
+ "percent": 99.6,
+ "lastChange": "2025-11-02T18:52:41.378895Z"
+ },
+ "sv": {
+ "percent": 1.3,
+ "lastChange": "2025-11-01T18:26:35.299601Z"
+ },
+ "el": {
+ "percent": 0.1,
+ "lastChange": "2025-11-01T18:26:30.693625Z"
+ },
+ "hu": {
+ "percent": 0,
+ "lastChange": "2025-11-01T18:26:32.407284Z"
+ },
+ "arz": {
+ "percent": 0.1,
+ "lastChange": "2025-11-01T18:26:29.272472Z"
+ },
+ "uk": {
+ "percent": 100,
+ "lastChange": "2025-11-02T18:52:42.303925Z"
+ },
+ "peo": {
+ "percent": 3.7,
+ "lastChange": "2025-12-29T10:00:22.520132Z"
+ },
+ "ko": {
+ "percent": 0,
+ "lastChange": "2026-01-14T23:43:45.065715Z"
+ }
+}