Skip to content

Commit 7343422

Browse files
committed
ft: i18n ru profile
1 parent 5a983e3 commit 7343422

2 files changed

Lines changed: 47 additions & 19 deletions

File tree

src/lib/i18n.ts

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,20 @@ const translations = {
3737
colorAppliedTo: 'This color is applied to buttons, links, and interactive elements',
3838
savingColor: 'Saving color...',
3939
colorSaveError: 'Failed to save color preference. Color reverted to previous setting.',
40+
displayName: 'Display Name',
41+
enterDisplayName: 'Enter display name',
42+
username: 'Username',
43+
language: 'Language',
44+
theme: 'Theme',
45+
adminPanel: 'Admin Panel',
46+
uploadAvatar: 'Upload avatar',
47+
resetToGravatar: 'Reset to Gravatar Avatar',
48+
resetting: 'Resetting...',
49+
avatarUploadTitle: 'Avatar Upload',
50+
avatarUploadFormats: 'Supported formats: JPG, PNG, GIF, WebP',
51+
avatarUploadMaxSize: 'Maximum file size: 2MB',
52+
avatarUploadRecommended: 'Recommended size: 200x200px or larger (square)',
53+
avatarUploadStored: 'Images are stored in the repository',
4054
retry: 'Retry',
4155
by: 'by',
4256
joined: 'Joined',
@@ -130,7 +144,21 @@ const translations = {
130144
currentColor: 'Текущий',
131145
colorAppliedTo: 'Этот цвет применяется к кнопкам, ссылкам и интерактивным элементам',
132146
savingColor: 'Сохранение цвета...',
133-
colorSaveError: 'Не удалось сохранить цвет. Цвет возвращен к предыдущей настройке.'
147+
colorSaveError: 'Не удалось сохранить цвет. Цвет возвращен к предыдущей настройке.',
148+
displayName: 'Имя',
149+
enterDisplayName: 'Введите имя',
150+
username: 'Имя пользователя',
151+
language: 'Язык',
152+
theme: 'Тема',
153+
adminPanel: 'Админская панель',
154+
uploadAvatar: 'Загрузить аватар',
155+
resetToGravatar: 'Сбросить на Gravatar',
156+
resetting: 'Сброс...',
157+
avatarUploadTitle: 'Загрузка аватара',
158+
avatarUploadFormats: 'Поддерживаемые форматы: JPG, PNG, GIF, WebP',
159+
avatarUploadMaxSize: 'Максимальный размер файла: 2МБ',
160+
avatarUploadRecommended: 'Рекомендуемый размер: 200x200px или больше (квадрат)',
161+
avatarUploadStored: 'Изображения хранятся в репозитории'
134162
}
135163
};
136164

src/pages/ProfilePage.tsx

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -149,9 +149,9 @@ export function ProfilePage() {
149149
<div className="flex justify-end">
150150
<button
151151
onClick={() => navigate('/admin')}
152-
className="inline-flex items-center gap-2 rounded-md bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 text-sm font-medium transition-colors"
152+
className="inline-flex items-center gap-2 rounded-md btn-accent hover:opacity-90 text-white px-4 py-2 text-sm font-medium transition-colors"
153153
>
154-
Админская панель
154+
{t('adminPanel')}
155155
</button>
156156
</div>
157157
)}
@@ -176,8 +176,8 @@ export function ProfilePage() {
176176
<button
177177
onClick={() => fileInputRef.current?.click()}
178178
disabled={isUploading || isResettingGravatar}
179-
className="absolute bottom-0 right-0 w-8 h-8 bg-blue-600 hover:bg-blue-700 text-white rounded-full flex items-center justify-center transition-colors disabled:opacity-50"
180-
title="Upload avatar"
179+
className="absolute bottom-0 right-0 w-8 h-8 btn-accent hover:opacity-90 text-white rounded-full flex items-center justify-center transition-colors disabled:opacity-50"
180+
title={t('uploadAvatar')}
181181
>
182182
{isUploading || isResettingGravatar ? (
183183
<div className="w-4 h-4 border-2 border-white border-t-transparent rounded-full animate-spin" />
@@ -199,7 +199,7 @@ export function ProfilePage() {
199199
<p className="text-gray-600 dark:text-gray-400">@{user.username}</p>
200200
<p className="text-sm text-gray-500 dark:text-gray-500 mt-2 flex items-center gap-1">
201201
<Calendar className="w-4 h-4" />
202-
Joined {new Date(user.joinedAt).toLocaleDateString()}
202+
{t('joined')} {new Date(user.joinedAt).toLocaleDateString()}
203203
</p>
204204
</div>
205205
</div>
@@ -209,7 +209,7 @@ export function ProfilePage() {
209209
<div className="p-6 space-y-4">
210210
<div>
211211
<label className="block text-sm font-medium mb-2">
212-
Display Name
212+
{t('displayName')}
213213
</label>
214214
{isEditing ? (
215215
<div className="flex gap-2">
@@ -218,7 +218,7 @@ export function ProfilePage() {
218218
value={displayName}
219219
onChange={(e) => setDisplayName(e.target.value)}
220220
className="flex-1 px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md bg-white dark:bg-gray-700"
221-
placeholder="Enter display name"
221+
placeholder={t('enterDisplayName')}
222222
/>
223223
<button
224224
onClick={handleSaveProfile}
@@ -230,7 +230,7 @@ export function ProfilePage() {
230230
) : (
231231
<Save className="w-4 h-4" />
232232
)}
233-
Save
233+
{t('save')}
234234
</button>
235235
<button
236236
onClick={() => {
@@ -249,22 +249,22 @@ export function ProfilePage() {
249249
onClick={() => setIsEditing(true)}
250250
className="link-accent hover:opacity-80 text-sm transition-colors"
251251
>
252-
Edit
252+
{t('edit')}
253253
</button>
254254
</div>
255255
)}
256256
</div>
257257

258258
<div>
259259
<label className="block text-sm font-medium mb-2">
260-
Username
260+
{t('username')}
261261
</label>
262262
<span className="text-gray-600 dark:text-gray-400">@{user.username}</span>
263263
</div>
264264

265265
<div>
266266
<label className="block text-sm font-medium mb-2">
267-
Language
267+
{t('language')}
268268
</label>
269269
<div className="flex items-center gap-2">
270270
<Globe className="w-4 h-4 text-gray-400" />
@@ -274,7 +274,7 @@ export function ProfilePage() {
274274

275275
<div>
276276
<label className="block text-sm font-medium mb-2">
277-
Theme
277+
{t('theme')}
278278
</label>
279279
<span className="text-gray-600 dark:text-gray-400 capitalize">{user.theme}</span>
280280
</div>
@@ -297,7 +297,7 @@ export function ProfilePage() {
297297
disabled={isResettingGravatar}
298298
className="w-full px-4 py-2 bg-gray-600 hover:bg-gray-700 text-white rounded-md transition-colors disabled:opacity-50"
299299
>
300-
{isResettingGravatar ? 'Resetting...' : 'Reset to Gravatar Avatar'}
300+
{isResettingGravatar ? t('resetting') : t('resetToGravatar')}
301301
</button>
302302
<button
303303
onClick={handleLogout}
@@ -310,12 +310,12 @@ export function ProfilePage() {
310310

311311
{/* Avatar Upload Instructions */}
312312
<div className="bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg p-4">
313-
<h3 className="font-medium text-blue-900 dark:text-blue-100 mb-2">Avatar Upload</h3>
313+
<h3 className="font-medium text-blue-900 dark:text-blue-100 mb-2">{t('avatarUploadTitle')}</h3>
314314
<ul className="text-sm text-blue-800 dark:text-blue-200 space-y-1">
315-
<li>Supported formats: JPG, PNG, GIF, WebP</li>
316-
<li>Maximum file size: 2MB</li>
317-
<li>Recommended size: 200x200px or larger (square)</li>
318-
<li>Images are stored in the repository</li>
315+
<li>{t('avatarUploadFormats')}</li>
316+
<li>{t('avatarUploadMaxSize')}</li>
317+
<li>{t('avatarUploadRecommended')}</li>
318+
<li>{t('avatarUploadStored')}</li>
319319
</ul>
320320
</div>
321321
</div>

0 commit comments

Comments
 (0)