Skip to content

Commit a237aa3

Browse files
committed
feat(i18n): add Russian language configuration
- update header style
1 parent a12c77f commit a237aa3

17 files changed

Lines changed: 887 additions & 46 deletions

cex/debug-lang.js

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cex/src/components/Header.jsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,17 +27,17 @@ const Header = () => {
2727
// Header 间距配置 - 统一管理所有间距
2828
const headerSpacing = {
2929
// 主要导航区域间距
30-
navLeftMargin: 'md:ml-6', // 导航与logo的间距 (从ml-8改为ml-6)
31-
navItemsSpacing: 'md:space-x-2', // 导航项之间的间距 (从space-x-8改为space-x-6)
30+
navLeftMargin: 'md:ml-5', // 导航与logo的间距 (从ml-8改为ml-6)
31+
navItemsSpacing: 'md:space-x-1', // 导航项之间的间距 (从space-x-8改为space-x-6)
3232

3333
// 搜索框区域间距
3434
searchBoxMargin: 'ml-auto mr-4', // 搜索框左右margin (ml-auto让搜索框向右靠拢)
35-
searchBoxMaxWidth: 'max-w-[270px]', // 搜索框最大宽度设为270px
35+
searchBoxMaxWidth: 'max-w-[260px]', // 搜索框最大宽度设为270px
3636
searchClearButtonColor: 'text-gray-400 hover:text-gray-700', // 清除按钮颜色
3737
searchTextColor: 'text-white', // 搜索框文本颜色
3838

3939
// 右侧区域间距
40-
rightSideSpacing: 'space-x-4', // 右侧元素间距
40+
rightSideSpacing: 'space-x-2', // 右侧元素间距
4141

4242
// 移动端间距
4343
mobileNavSpacing: 'space-y-1', // 移动端导航项间距
@@ -156,7 +156,7 @@ const Header = () => {
156156

157157
return (
158158
<header className="bg-black sticky top-0 z-50">
159-
<div className="max-w-7xl mx-auto px-2 sm:px-2 lg:px-2">
159+
<div className="w-full pl-1 pr-2 sm:pl-2 sm:pr-2 lg:pl-2 lg:pr-4">
160160
<div
161161
className="flex justify-between items-center h-16"
162162
onMouseLeave={() => {
@@ -166,7 +166,7 @@ const Header = () => {
166166
}}
167167
>
168168
{/* Logo */}
169-
<div className="flex items-center">
169+
<div className="flex items-center ml-3">
170170
<div className="flex-shrink-0">
171171
<h1 className="text-2xl font-bold gradient-text">
172172
<LanguageAwareLink to="/">RuaCoin</LanguageAwareLink>
@@ -415,7 +415,7 @@ const Header = () => {
415415
</div>
416416

417417
{/* Login/Register Buttons */}
418-
<div className={`hidden md:flex items-center ${headerSpacing.mobileButtonSpacing}`}>
418+
<div className={`hidden md:flex items-center ${headerSpacing.mobileButtonSpacing} pr-5`}>
419419
<LanguageAwareLink
420420
to="/login"
421421
className="px-4 py-2 text-sm font-medium text-gray-300 hover:text-white transition-colors border-[2px] border-transparent hover:border-[#00d4ff] hover:border-[2px] rounded-lg"

cex/src/i18n/config/languageConfig.js

Lines changed: 48 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -59,25 +59,6 @@ export const ADVANCED_LANGUAGE_CONFIG = {
5959
markets: ['global', 'americas', 'europe', 'oceania']
6060
},
6161

62-
// English (India) - Large market with specific terminology
63-
'en-IN': {
64-
code: 'en-IN',
65-
name: 'English (India)',
66-
nativeName: 'English (India)',
67-
region: 'India',
68-
flag: '🇮🇳',
69-
dir: 'ltr',
70-
currency: 'INR',
71-
timezone: 'Asia/Kolkata',
72-
isMainVariant: false,
73-
fallback: 'en',
74-
seoCode: 'en-in',
75-
htmlLang: 'en-IN',
76-
priority: 4,
77-
regions: ['IN'],
78-
markets: ['asia', 'india']
79-
},
80-
8162
// Simplified Chinese (China)
8263
'zh-CN': {
8364
code: 'zh-CN',
@@ -152,7 +133,45 @@ export const ADVANCED_LANGUAGE_CONFIG = {
152133
priority: 6,
153134
regions: ['KR'],
154135
markets: ['asia', 'korea']
155-
}
136+
},
137+
138+
// English (India) - Large market with specific terminology
139+
'en-IN': {
140+
code: 'en-IN',
141+
name: 'English (India)',
142+
nativeName: 'English (India)',
143+
region: 'India',
144+
flag: '🇮🇳',
145+
dir: 'ltr',
146+
currency: 'INR',
147+
timezone: 'Asia/Kolkata',
148+
isMainVariant: false,
149+
fallback: 'en',
150+
seoCode: 'en-in',
151+
htmlLang: 'en-IN',
152+
priority: 4,
153+
regions: ['IN'],
154+
markets: ['asia', 'india']
155+
},
156+
157+
// Russian
158+
'ru': {
159+
code: 'ru',
160+
name: 'Russian',
161+
nativeName: 'Русский',
162+
region: 'Russia',
163+
flag: '🇷🇺',
164+
dir: 'ltr',
165+
currency: 'RUB',
166+
timezone: 'Europe/Moscow',
167+
isMainVariant: true,
168+
fallback: 'en',
169+
seoCode: 'ru',
170+
htmlLang: 'ru',
171+
priority: 7,
172+
regions: ['RU'],
173+
markets: ['europe', 'russia']
174+
},
156175
};
157176

158177
/**
@@ -191,9 +210,10 @@ export const SEO_TO_LOCALE_MAP = Object.fromEntries(
191210
*/
192211
export const MARKET_REGIONS = {
193212
americas: ['en'],
194-
europe: ['en'],
213+
europe: ['en', 'ru'],
195214
asia: ['zh-CN', 'zh-TC', 'ja', 'ko', 'en-IN'],
196-
global: ['en', 'zh-CN', 'ja']
215+
russia: ['ru'],
216+
global: ['en', 'zh-CN', 'ja', 'ru']
197217
};
198218

199219
/**
@@ -205,7 +225,8 @@ export const BROWSER_LANGUAGE_PATTERNS = {
205225
'zh-CN': ['zh', 'zh-CN', 'zh-Hans', 'zh-Hans-CN'],
206226
'zh-TC': ['zh-TW', 'zh-HK', 'zh-Hant', 'zh-Hant-TW', 'zh-Hant-HK'],
207227
'ja': ['ja', 'ja-JP'],
208-
'ko': ['ko', 'ko-KR']
228+
'ko': ['ko', 'ko-KR'],
229+
'ru': ['ru', 'ru-RU']
209230
};
210231

211232
/**
@@ -222,7 +243,8 @@ export const NUMBER_FORMATS = {
222243
'zh-CN': { locale: 'zh-CN', currency: 'CNY' },
223244
'zh-TC': { locale: 'zh-TW', currency: 'TWD' },
224245
'ja': { locale: 'ja-JP', currency: 'JPY' },
225-
'ko': { locale: 'ko-KR', currency: 'KRW' }
246+
'ko': { locale: 'ko-KR', currency: 'KRW' },
247+
'ru': { locale: 'ru-RU', currency: 'RUB' }
226248
};
227249

228250
/**
@@ -234,7 +256,8 @@ export const DATE_FORMATS = {
234256
'zh-CN': 'YYYY年MM月DD日',
235257
'zh-TC': 'YYYY年MM月DD日',
236258
'ja': 'YYYY年MM月DD日',
237-
'ko': 'YYYY년 MM월 DD일'
259+
'ko': 'YYYY년 MM월 DD일',
260+
'ru': 'DD.MM.YYYY'
238261
};
239262

240263
/**

cex/src/i18n/index.js

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,6 @@ import {
2626
getFallbackLanguage
2727
} from './config/languageConfig';
2828

29-
// Import language detection service
30-
31-
// 导入简体中文语言资源
32-
33-
// 导入繁体中文语言资源
34-
3529
// 导入英文语言资源
3630
import enAuth from './locales/en/auth.json';
3731
import enCommon from './locales/en/common.json';
@@ -71,6 +65,8 @@ import koTrading from './locales/ko/trading.json';
7165
import koHome from './locales/ko/home.json';
7266
import koPages from './locales/ko/pages.json';
7367
import koComponents from './locales/ko/components.json';
68+
69+
// 导入简体中文语言资源
7470
import zhCNAuth from './locales/zh-CN/auth.json';
7571
import zhCNCommon from './locales/zh-CN/common.json';
7672
import zhCNComponents from './locales/zh-CN/components.json';
@@ -79,6 +75,8 @@ import zhCNHeader from './locales/zh-CN/header.json';
7975
import zhCNHome from './locales/zh-CN/home.json';
8076
import zhCNPages from './locales/zh-CN/pages.json';
8177
import zhCNTrading from './locales/zh-CN/trading.json';
78+
79+
// 导入繁体中文语言资源
8280
import zhTCAuth from './locales/zh-TC/auth.json';
8381
import zhTCCommon from './locales/zh-TC/common.json';
8482
import zhTCComponents from './locales/zh-TC/components.json';
@@ -87,6 +85,18 @@ import zhTCHeader from './locales/zh-TC/header.json';
8785
import zhTCHome from './locales/zh-TC/home.json';
8886
import zhTCPages from './locales/zh-TC/pages.json';
8987
import zhTCTrading from './locales/zh-TC/trading.json';
88+
89+
// 导入俄文语言资源
90+
import ruAuth from './locales/ru/auth.json';
91+
import ruCommon from './locales/ru/common.json';
92+
import ruComponents from './locales/ru/components.json';
93+
import ruFooter from './locales/ru/footer.json';
94+
import ruHeader from './locales/ru/header.json';
95+
import ruHome from './locales/ru/home.json';
96+
import ruPages from './locales/ru/pages.json';
97+
import ruTrading from './locales/ru/trading.json';
98+
99+
// 导入语言检测服务
90100
import languageDetectionService, {
91101
initializeLanguageDetection,
92102
getCurrentLanguagePreference
@@ -165,6 +175,18 @@ const resources = {
165175
pages: koPages,
166176
components: koComponents,
167177
},
178+
179+
// 俄文
180+
'ru': {
181+
common: ruCommon,
182+
trading: ruTrading,
183+
header: ruHeader,
184+
footer: ruFooter,
185+
auth: ruAuth,
186+
home: ruHome,
187+
pages: ruPages,
188+
components: ruComponents,
189+
},
168190
};
169191

170192
// 从 localStorage 获取用户语言偏好

cex/src/i18n/locales/ru/auth.json

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
{
2+
"login": "Вход",
3+
"register": "Регистрация",
4+
"phone": "Телефон",
5+
"email": "Электронная почта",
6+
"password": "Пароль",
7+
"confirmPassword": "Подтверждение пароля",
8+
"rememberMe": "Запомнить меня",
9+
"forgotPassword": "Забыли пароль?",
10+
"loginWithPhone": "Вход по телефону",
11+
"loginWithEmail": "Вход по электронной почте",
12+
"loginWithQR": "Вход по QR-коду",
13+
"phoneNumber": "Номер телефона",
14+
"emailAddress": "Адрес электронной почты",
15+
"enterPhone": "Пожалуйста, введите номер телефона",
16+
"enterEmail": "Пожалуйста, введите адрес электронной почты",
17+
"enterPassword": "Пожалуйста, введите пароль",
18+
"enterConfirmPassword": "Пожалуйста, подтвердите пароль",
19+
"loginSuccess": "Успешный вход",
20+
"loginFailed": "Ошибка входа",
21+
"registerSuccess": "Успешная регистрация",
22+
"registerFailed": "Ошибка регистрации",
23+
"welcomeBack": "Добро пожаловать в RuaCoin!",
24+
"accountOrPasswordError": "Ошибка в учетной записи или пароле, попробуйте еще раз",
25+
"phoneTab": "Телефон",
26+
"emailTab": "Email / Субаккаунт",
27+
"qrcodeTab": "QR-код",
28+
"loginTip": "Уведомление о входе",
29+
"thirdPartyLogin": "Вход через третьи стороны",
30+
"developingFeature": "Функция в разработке...",
31+
"alreadyHaveAccount": "Уже есть аккаунт?",
32+
"noAccount": "Нет аккаунта?",
33+
"loginNow": "Войти сейчас",
34+
"registerNow": "Зарегистрироваться сейчас",
35+
"backToHome": "Вернуться на главную",
36+
"next": "Далее",
37+
"previous": "Назад",
38+
"submit": "Отправить",
39+
"residence": "Место жительства",
40+
"selectResidence": "Пожалуйста, выберите место жительства",
41+
"residenceQuestion": "Где вы проживаете?",
42+
"residenceDescription": "Чтобы предоставить вам лучшее обслуживание, пожалуйста, выберите ваше текущее место жительства",
43+
"selectLanguage": "Выберите язык",
44+
"accountType": "Тип аккаунта",
45+
"selectAccountType": "Пожалуйста, выберите тип аккаунта",
46+
"personalAccount": "Личный или Корпоративный аккаунт",
47+
"personalAccountDesc": "Этот тип аккаунта подходит для частных лиц или учреждений, желающих торговать, отправлять, получать и управлять активами цифровой валюты.",
48+
"smsfAccount": "Самоуправляемый пенсионный фонд (SMSF)",
49+
"smsfAccountDesc": "Этот тип аккаунта подходит для частных лиц или компаний, действующих в качестве доверительных управляющих самоуправляемого пенсионного фонда (SMSF). Если вы инвестируете от имени вашего SMSF, пожалуйста, выберите этот тип аккаунта.",
50+
"enterEmailAddress": "Введите ваш адрес электронной почты",
51+
"emailVerificationTip": "Пожалуйста, убедитесь, что этот email может получать коды верификации",
52+
"agreeTerms": "Я согласен с",
53+
"termsOfService": "Условиями обслуживания",
54+
"privacyPolicy": "Политикой конфиденциальности",
55+
"and": "и",
56+
"registerNotice": "Уведомление о регистрации",
57+
"pleaseSelectResidence": "Пожалуйста, выберите место жительства",
58+
"pleaseAgreeTerms": "Пожалуйста, согласитесь с Условиями обслуживания и Политикой конфиденциальности",
59+
"pleaseSelectAccountType": "Пожалуйста, выберите тип аккаунта",
60+
"pleaseEnterEmail": "Пожалуйста, введите ваш адрес электронной почты",
61+
"registrationSubmitted": "Информация о регистрации отправлена, пожалуйста, проверьте вашу электронную почту для подтверждения"
62+
}

0 commit comments

Comments
 (0)