Skip to content

Commit 932d223

Browse files
committed
Add Lang Switcher
1 parent fbeb9b5 commit 932d223

File tree

10 files changed

+157
-335
lines changed

10 files changed

+157
-335
lines changed

src/app/App.css

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
.App {
22
text-align: center;
3+
background-color: var(--background-color);
4+
color: var(--color);
35
}
46

57
.App-logo {
@@ -14,14 +16,18 @@
1416
}
1517

1618
.App-header {
17-
background-color: var(--background-color);
1819
min-height: 100vh;
1920
display: flex;
2021
flex-direction: column;
2122
align-items: center;
2223
justify-content: center;
2324
font-size: calc(10px + 2vmin);
24-
color: var(--color);
25+
}
26+
27+
.App-nav {
28+
display: flex;
29+
justify-content: center;
30+
gap: 15px;
2531
}
2632

2733
.App-link {

src/app/App.tsx

Lines changed: 44 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,55 @@ import logo from './logo.svg';
33
import './App.css';
44

55
import { ThemeProvider } from '../shared/providers/ThemeProvider';
6+
import { LangProvider, Content, useLang } from '../shared/providers/LangProvider';
67
import { ThemeSwitcher } from '../shared/theme-switcher/ThemeSwitcher';
8+
import { LangSwitcher } from '../shared/lang-switcher/LangSwitcher';
9+
10+
const MainContent = () => {
11+
const content: Content = {
12+
fullname: { ru: 'Игорь Аралов', en: 'Igor Aralov' },
13+
target: {
14+
ru: 'Научиться разрабатывать веб-приложения при помощи React',
15+
en: 'Learn to develop web applications using React',
16+
},
17+
skills: {
18+
ru: 'Профессионально работаю SQL разработчиком уже 10 лет и принимаю участие в разработке десктопного приложения на Delphi',
19+
en: 'I have been working professionally as an SQL developer for 10 years and am involved in the development of a desktop application using Delphi.',
20+
},
21+
hobby: {
22+
ru: 'Интересуюсь фронтенд и фуллстек разработкой на js/ts',
23+
en: "I'm interested in frontend and full-stack development using js/ts",
24+
},
25+
};
26+
27+
const { useContent } = useLang();
28+
const l = useContent(content);
29+
30+
return (
31+
<>
32+
<h1>{l('fullname')} ([email protected])</h1>
33+
<p>{l('target')}</p>
34+
<p>{l('skills')}</p>
35+
<p>{l('hobby')}</p>
36+
</>
37+
);
38+
};
739

840
function App() {
941
return (
1042
<ThemeProvider>
11-
<div className="App">
12-
<header className="App-header">
13-
<ThemeSwitcher />
14-
<img src={logo} className="App-logo" alt="logo" />
15-
<h1>Игорь Аралов ([email protected])</h1>
16-
<p>Научиться разрабатывать веб-приложения при помощи React</p>
17-
<p>
18-
Профессионально работаю SQL разработчиком уже 10 лет и принимаю участие в разработке десктопного приложения
19-
на Delphi
20-
</p>
21-
<p>Интересуюсь фронтенд и фуллстек разработкой на js/ts</p>
22-
</header>
23-
</div>
43+
<LangProvider>
44+
<div className="App">
45+
<header className="App-header">
46+
<div className="App-nav">
47+
<ThemeSwitcher />
48+
<LangSwitcher />
49+
</div>
50+
<img src={logo} className="App-logo" alt="logo" />
51+
<MainContent />
52+
</header>
53+
</div>
54+
</LangProvider>
2455
</ThemeProvider>
2556
);
2657
}

src/app/index.css

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
11
[data-theme='light'] {
22
--background-color: #fff;
33
--color: #000;
4-
--logo-bg-color: #f4f4f4;
5-
--logo-text-color: #333;
64
}
75

86
[data-theme='dark'] {
97
--background-color: #333;
108
--color: #fff;
11-
--logo-bg-color: #333;
12-
--logo-text-color: #f4f4f4;
139
}
1410

1511
body {

src/shared/header/Header.module.scss

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
.header {
2-
display:flex;
2+
display: flex;
33
justify-content: space-between;
44
position: -webkit-sticky;
55
position: sticky;
@@ -10,3 +10,14 @@
1010
min-height: 50px;
1111
z-index: 1000;
1212
}
13+
14+
.left {
15+
display: flex;
16+
gap: 10px;
17+
}
18+
19+
.right {
20+
display: flex;
21+
justify-content: end;
22+
gap: 10px;
23+
}

src/shared/header/Header.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import React from 'react';
22
import { Logo } from '../logo/Logo';
33
import { ThemeSwitcher } from '../theme-switcher/ThemeSwitcher';
4+
import { LangSwitcher } from '../lang-switcher/LangSwitcher';
45
import s from './Header.module.scss';
56

67
export type HeaderProps = {
@@ -9,7 +10,10 @@ export type HeaderProps = {
910

1011
export const Header = ({ showLogo = true }: HeaderProps) => (
1112
<div className={s.header}>
12-
{showLogo && <Logo />}
13-
<ThemeSwitcher />
13+
<div className={s.left}>{showLogo && <Logo />}</div>
14+
<div className={s.right}>
15+
<ThemeSwitcher />
16+
<LangSwitcher />
17+
</div>
1418
</div>
1519
);
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import React from 'react';
2+
import { useLang } from '../providers/LangProvider';
3+
import { Button } from '../button/Button';
4+
5+
export const LangSwitcher = () => {
6+
const { lang, toggleLang } = useLang();
7+
8+
return <Button onClick={toggleLang}>Switch to {lang === 'ru' ? 'English' : 'Russian'} lang</Button>;
9+
};

0 commit comments

Comments
 (0)