feat(i18n): add Russian (ru-RU) language support

This commit is contained in:
RockChinQ
2026-04-17 20:00:50 +08:00
parent 49239e0e08
commit 0b8ab4b54b
5 changed files with 1311 additions and 0 deletions

View File

@@ -6,6 +6,7 @@ export interface I18nObject {
th_TH?: string; th_TH?: string;
vi_VN?: string; vi_VN?: string;
es_ES?: string; es_ES?: string;
ru_RU?: string;
} }
export interface ComponentManifest { export interface ComponentManifest {

View File

@@ -46,6 +46,9 @@ export function LanguageSelector({
} else if (i18n.language === 'es' || i18n.language === 'es-ES') { } else if (i18n.language === 'es' || i18n.language === 'es-ES') {
setCurrentLanguage('es-ES'); setCurrentLanguage('es-ES');
localStorage.setItem('langbot_language', 'es-ES'); localStorage.setItem('langbot_language', 'es-ES');
} else if (i18n.language === 'ru' || i18n.language === 'ru-RU') {
setCurrentLanguage('ru-RU');
localStorage.setItem('langbot_language', 'ru-RU');
} else { } else {
setCurrentLanguage('en-US'); setCurrentLanguage('en-US');
localStorage.setItem('langbot_language', 'en-US'); localStorage.setItem('langbot_language', 'en-US');
@@ -74,6 +77,11 @@ export function LanguageSelector({
browserLanguage.startsWith('es-') browserLanguage.startsWith('es-')
) { ) {
detectedLanguage = 'es-ES'; detectedLanguage = 'es-ES';
} else if (
browserLanguage === 'ru' ||
browserLanguage.startsWith('ru-')
) {
detectedLanguage = 'ru-RU';
} else { } else {
detectedLanguage = 'en-US'; detectedLanguage = 'en-US';
} }
@@ -111,6 +119,7 @@ export function LanguageSelector({
<SelectItem value="th-TH"></SelectItem> <SelectItem value="th-TH"></SelectItem>
<SelectItem value="vi-VN">Tiếng Việt</SelectItem> <SelectItem value="vi-VN">Tiếng Việt</SelectItem>
<SelectItem value="es-ES">Español</SelectItem> <SelectItem value="es-ES">Español</SelectItem>
<SelectItem value="ru-RU">Русский</SelectItem>
</SelectContent> </SelectContent>
</Select> </Select>
); );

View File

@@ -28,6 +28,7 @@ export const extractI18nObject = (i18nObject: I18nObject): string => {
if (language === 'th_TH' && i18nObject.th_TH) return i18nObject.th_TH; if (language === 'th_TH' && i18nObject.th_TH) return i18nObject.th_TH;
if (language === 'vi_VN' && i18nObject.vi_VN) return i18nObject.vi_VN; if (language === 'vi_VN' && i18nObject.vi_VN) return i18nObject.vi_VN;
if (language === 'es_ES' && i18nObject.es_ES) return i18nObject.es_ES; if (language === 'es_ES' && i18nObject.es_ES) return i18nObject.es_ES;
if (language === 'ru_RU' && i18nObject.ru_RU) return i18nObject.ru_RU;
return ( return (
i18nObject.en_US || i18nObject.en_US ||
i18nObject.zh_Hans || i18nObject.zh_Hans ||
@@ -56,6 +57,8 @@ export const getAPILanguageCode = (): string => {
if (language === 'vi-VN') return 'vi_VN'; if (language === 'vi-VN') return 'vi_VN';
// es-ES -> es_ES // es-ES -> es_ES
if (language === 'es-ES') return 'es_ES'; if (language === 'es-ES') return 'es_ES';
// ru-RU -> ru_RU
if (language === 'ru-RU') return 'ru_RU';
// 默认返回 en // 默认返回 en
return 'en'; return 'en';
}; };

View File

@@ -9,6 +9,7 @@ import jaJP from './locales/ja-JP';
import thTH from './locales/th-TH'; import thTH from './locales/th-TH';
import viVN from './locales/vi-VN'; import viVN from './locales/vi-VN';
import esES from './locales/es-ES'; import esES from './locales/es-ES';
import ruRU from './locales/ru-RU';
i18n i18n
.use(LanguageDetector) .use(LanguageDetector)
@@ -36,6 +37,31 @@ i18n
'es-ES': { 'es-ES': {
translation: esES, translation: esES,
}, },
'ru-RU': {
translation: ruRU,
},
},
'zh-Hans': {
translation: zhHans,
},
'zh-Hant': {
translation: zhHant,
},
'ja-JP': {
translation: jaJP,
},
'th-TH': {
translation: thTH,
},
'vi-VN': {
translation: viVN,
},
'es-ES': {
translation: esES,
},
'ru-RU': {
translation: ruRU,
},
}, },
fallbackLng: 'zh-Hans', fallbackLng: 'zh-Hans',
debug: process.env.NODE_ENV === 'development', debug: process.env.NODE_ENV === 'development',

File diff suppressed because it is too large Load Diff