From 00765056a63598fca75e00303dcd8097de54a972 Mon Sep 17 00:00:00 2001 From: Anton Akhatov Date: Sun, 2 Apr 2023 21:59:25 +0100 Subject: [PATCH 1/4] feature: add i18n --- next.config.js | 4 ++ package.json | 1 + pnpm-lock.yaml | 86 +++++++++++++++++++++++++++++++++ src/components/header/Header.js | 18 +++---- src/locales/en.json | 7 +++ src/locales/ru.json | 7 +++ src/pages/_app.tsx | 8 ++- src/pages/index.tsx | 19 ++++++-- 8 files changed, 136 insertions(+), 14 deletions(-) create mode 100644 src/locales/en.json create mode 100644 src/locales/ru.json diff --git a/next.config.js b/next.config.js index 50f8420..d6be20a 100644 --- a/next.config.js +++ b/next.config.js @@ -4,6 +4,10 @@ const nextConfig = { images: { unoptimized: true, }, + i18n: { + locales: ["ru", "en"], + defaultLocale: "ru", + }, }; module.exports = nextConfig; diff --git a/package.json b/package.json index 80d7e8c..b3f89e1 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "eslint": "8.36.0", "eslint-config-next": "13.2.4", "next": "13.2.4", + "next-intl": "^2.12.0", "postcss": "^8.4.21", "postcss-nesting": "^11.2.1", "react": "^18.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9944bb5..9555d56 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,6 +10,7 @@ specifiers: eslint: 8.36.0 eslint-config-next: 13.2.4 next: 13.2.4 + next-intl: ^2.12.0 postcss: ^8.4.21 postcss-nesting: ^11.2.1 react: ^18.2.0 @@ -26,6 +27,7 @@ dependencies: eslint: 8.36.0 eslint-config-next: 13.2.4_j4766f7ecgqbon3u7zlxn5zszu next: 13.2.4_biqbaboplfbrettd7655fr4n2y + next-intl: 2.12.0_next@13.2.4+react@18.2.0 postcss: 8.4.21 postcss-nesting: 11.2.1_postcss@8.4.21 react: 18.2.0 @@ -290,6 +292,53 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: false + /@formatjs/ecma402-abstract/1.11.4: + resolution: {integrity: sha512-EBikYFp2JCdIfGEb5G9dyCkTGDmC57KSHhRQOC3aYxoPWVZvfWCDjZwkGYHN7Lis/fmuWl906bnNTJifDQ3sXw==} + dependencies: + '@formatjs/intl-localematcher': 0.2.25 + tslib: 2.5.0 + dev: false + + /@formatjs/ecma402-abstract/1.14.3: + resolution: {integrity: sha512-SlsbRC/RX+/zg4AApWIFNDdkLtFbkq3LNoZWXZCE/nHVKqoIJyaoQyge/I0Y38vLxowUn9KTtXgusLD91+orbg==} + dependencies: + '@formatjs/intl-localematcher': 0.2.32 + tslib: 2.5.0 + dev: false + + /@formatjs/fast-memoize/1.2.1: + resolution: {integrity: sha512-Rg0e76nomkz3vF9IPlKeV+Qynok0r7YZjL6syLz4/urSg0IbjPZCB/iYUMNsYA643gh4mgrX3T7KEIFIxJBQeg==} + dependencies: + tslib: 2.5.0 + dev: false + + /@formatjs/icu-messageformat-parser/2.1.0: + resolution: {integrity: sha512-Qxv/lmCN6hKpBSss2uQ8IROVnta2r9jd3ymUEIjm2UyIkUCHVcbUVRGL/KS/wv7876edvsPe+hjHVJ4z8YuVaw==} + dependencies: + '@formatjs/ecma402-abstract': 1.11.4 + '@formatjs/icu-skeleton-parser': 1.3.6 + tslib: 2.5.0 + dev: false + + /@formatjs/icu-skeleton-parser/1.3.6: + resolution: {integrity: sha512-I96mOxvml/YLrwU2Txnd4klA7V8fRhb6JG/4hm3VMNmeJo1F03IpV2L3wWt7EweqNLES59SZ4d6hVOPCSf80Bg==} + dependencies: + '@formatjs/ecma402-abstract': 1.11.4 + tslib: 2.5.0 + dev: false + + /@formatjs/intl-localematcher/0.2.25: + resolution: {integrity: sha512-YmLcX70BxoSopLFdLr1Ds99NdlTI2oWoLbaUW2M406lxOIPzE1KQhRz2fPUkq34xVZQaihCoU29h0KK7An3bhA==} + dependencies: + tslib: 2.5.0 + dev: false + + /@formatjs/intl-localematcher/0.2.32: + resolution: {integrity: sha512-k/MEBstff4sttohyEpXxCmC3MqbUn9VvHGlZ8fauLzkbwXmVrEeyzS+4uhrvAk9DWU9/7otYWxyDox4nT/KVLQ==} + dependencies: + tslib: 2.5.0 + dev: false + /@humanwhocodes/config-array/0.11.8: resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} engines: {node: '>=10.10.0'} @@ -757,6 +806,10 @@ packages: eslint-visitor-keys: 3.3.0 dev: false + /accept-language-parser/1.5.0: + resolution: {integrity: sha512-QhyTbMLYo0BBGg1aWbeMG4ekWtds/31BrEU+DONOg/7ax23vxpL03Pb7/zBmha2v7vdD3AyzZVWBVGEZxKOXWw==} + dev: false + /acorn-jsx/5.3.2_acorn@8.8.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1853,6 +1906,15 @@ packages: side-channel: 1.0.4 dev: false + /intl-messageformat/9.13.0: + resolution: {integrity: sha512-7sGC7QnSQGa5LZP7bXLDhVDtQOeKGeBFGHF2Y8LVBwYZoQZCgWeKoPGTa5GMG8g/TzDgeXuYJQis7Ggiw2xTOw==} + dependencies: + '@formatjs/ecma402-abstract': 1.11.4 + '@formatjs/fast-memoize': 1.2.1 + '@formatjs/icu-messageformat-parser': 2.1.0 + tslib: 2.5.0 + dev: false + /is-arguments/1.1.1: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} @@ -2172,6 +2234,19 @@ packages: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: false + /next-intl/2.12.0_next@13.2.4+react@18.2.0: + resolution: {integrity: sha512-UWKLA3BIsezFo/OJelGYmJL3BsztApo2mgvmwHMDbTsuBJx0x4SaIIPapnPHPzMhUbppZIbY70xNIULHwn++hg==} + engines: {node: '>=10'} + peerDependencies: + next: ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + accept-language-parser: 1.5.0 + next: 13.2.4_biqbaboplfbrettd7655fr4n2y + react: 18.2.0 + use-intl: 2.12.0_react@18.2.0 + dev: false + /next/13.2.4_biqbaboplfbrettd7655fr4n2y: resolution: {integrity: sha512-g1I30317cThkEpvzfXujf0O4wtaQHtDCLhlivwlTJ885Ld+eOgcz7r3TGQzeU+cSRoNHtD8tsJgzxVdYojFssw==} engines: {node: '>=14.6.0'} @@ -2855,6 +2930,17 @@ packages: tslib: 2.5.0 dev: false + /use-intl/2.12.0_react@18.2.0: + resolution: {integrity: sha512-LcmAqn78o6Ii9wsLERKAXI9QfiSVBzY3u+mSh6YCLUKhDhr7WHqTBfhEV1gZvdwy7mydhwWQUyQ9Zy5XHuUOAQ==} + engines: {node: '>=10'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@formatjs/ecma402-abstract': 1.14.3 + intl-messageformat: 9.13.0 + react: 18.2.0 + dev: false + /use-sidecar/1.1.2_pmekkgnqduwlme35zpnqhenc34: resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} engines: {node: '>=10'} diff --git a/src/components/header/Header.js b/src/components/header/Header.js index 4b3f696..fd158b5 100644 --- a/src/components/header/Header.js +++ b/src/components/header/Header.js @@ -1,10 +1,13 @@ import { useEffect } from "react"; +import { useTranslations } from "next-intl"; import cn from "classnames"; import styles from "./Header.module.css"; import mainStyles from "../action/MainAction.module.css"; import { initSmoothScroll } from "./smooth-scroll"; export function Header() { + const t = useTranslations("Dev"); + useEffect(() => { initSmoothScroll(); }, []); @@ -19,19 +22,16 @@ export function Header() { />
-

- Это Код Екатеринбурга — команда, которая сделает - невозможное. Невыполнимое, сложное и безумное. Сделает то, - что никто не сможет. Это тот проект, о котором - вы мечтали. Это — проект судьбы. -

+

- Нажми, чтобы узнать, что мы будем делать 🫦 - + dangerouslySetInnerHTML={{ __html: t.raw("learnMore") }} + />
); diff --git a/src/locales/en.json b/src/locales/en.json new file mode 100644 index 0000000..7c71829 --- /dev/null +++ b/src/locales/en.json @@ -0,0 +1,7 @@ +{ + "Dev": { + "title": "Ekaterinburg code", + "header": "This is the Yekaterinburg Code - a team that will achieve the impossible. The unattainable, complex, and insane. They will do what no one else can. This is the project you've dreamed of. It is the project of destiny.", + "learnMore": "Find out what we will be doing" + } +} diff --git a/src/locales/ru.json b/src/locales/ru.json new file mode 100644 index 0000000..42ea290 --- /dev/null +++ b/src/locales/ru.json @@ -0,0 +1,7 @@ +{ + "Dev": { + "title": "Код Екатеринбурга", + "header": "Это Код Екатеринбурга — команда, которая сделает невозможное. Невыполнимое, сложное и безумное. Сделает то, что никто не сможет. Это тот проект, о котором вы мечтали. Это — проект судьбы.", + "learnMore": "Узнать, что мы будем делать" + } +} diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index fe843b0..9e97cc3 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -1,7 +1,13 @@ +import { NextIntlProvider } from "next-intl"; +import type { AppProps } from "next/app"; import "@/styles/globals.css"; import "../../public/fonts/index.css"; import type { AppProps } from "next/app"; export default function App({ Component, pageProps }: AppProps) { - return ; + return ( + + + + ); } diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 1c45248..6ea1c22 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -1,5 +1,6 @@ /* eslint-disable @next/next/no-img-element */ import Head from "next/head"; +import { useTranslations } from "next-intl"; import cn from "classnames"; import styles from "@/components/page/Page.module.css"; import { Preview } from "@/components/preview/Preview"; @@ -10,23 +11,25 @@ import { Iframe } from "@/components/iframe/Iframe"; import { Team } from "@/components/team/Team"; import { MainAction } from "@/components/action/MainAction"; import { Ecosystem } from "@/components/ecosystem/Ecosystem"; +import { GetStaticProps } from "next"; export default function Home() { + const t = useTranslations("Dev"); + return ( <> - Код Екатеринбурга + {t("title")} -
- -
+ +

Экосистема Екатеринбурга

Что происходит

@@ -104,3 +107,11 @@ export default function Home() { ); } + +export const getStaticProps: GetStaticProps = async (context) => { + return { + props: { + messages: (await import(`../locales/${context.locale}.json`)).default, + }, + }; +}; From 4719521bb60965f28955a9b8db441ef327d37e50 Mon Sep 17 00:00:00 2001 From: Alexander Chabin Date: Tue, 4 Apr 2023 03:39:17 +0500 Subject: [PATCH 2/4] feature: add i18n --- src/components/action/FooterAction.tsx | 13 +++++++++++++ src/components/action/MainAction.tsx | 15 ++++++++------- src/components/header/Header.js | 2 +- src/components/page/Page.tsx | 20 ++++++++++++++++++++ src/locales/en.json | 7 ++++++- src/locales/ru.json | 7 ++++++- src/pages/_app.tsx | 2 +- 7 files changed, 55 insertions(+), 11 deletions(-) create mode 100644 src/components/action/FooterAction.tsx create mode 100644 src/components/page/Page.tsx diff --git a/src/components/action/FooterAction.tsx b/src/components/action/FooterAction.tsx new file mode 100644 index 0000000..74bda3b --- /dev/null +++ b/src/components/action/FooterAction.tsx @@ -0,0 +1,13 @@ +import { useTranslations } from "next-intl"; +import { ACTION_LINK } from "./constants"; +import styles from "./FooterAction.module.css"; + +export function FooterAction() { + const t = useTranslations("Dev"); + + return ( + + {t("Write to us")} + + ); +} diff --git a/src/components/action/MainAction.tsx b/src/components/action/MainAction.tsx index 87fb461..be1d920 100644 --- a/src/components/action/MainAction.tsx +++ b/src/components/action/MainAction.tsx @@ -1,14 +1,15 @@ -import classNames from "classnames"; +import { useTranslations } from "next-intl"; import { ACTION_LINK } from "./constants"; import styles from "./MainAction.module.css"; export function MainAction() { + const t = useTranslations("Dev"); + return ( - - Колл ту экшн - + ); } diff --git a/src/components/header/Header.js b/src/components/header/Header.js index fd158b5..77661bc 100644 --- a/src/components/header/Header.js +++ b/src/components/header/Header.js @@ -30,7 +30,7 @@ export function Header() { className={cn(mainStyles.mainaction)} href="#about" data-id="header-more" - dangerouslySetInnerHTML={{ __html: t.raw("learnMore") }} + dangerouslySetInnerHTML={{ __html: t.raw("Learn more") }} />
diff --git a/src/components/page/Page.tsx b/src/components/page/Page.tsx new file mode 100644 index 0000000..d44862f --- /dev/null +++ b/src/components/page/Page.tsx @@ -0,0 +1,20 @@ +import { useTranslations } from "next-intl"; +import cn from "classnames"; +import styles from "@/components/page/Page.module.css"; + +export function Page() { + const t = useTranslations("Dev"); + + return ( +
+

+ +

+ +
+
+ ); +} diff --git a/src/locales/en.json b/src/locales/en.json index 7c71829..56e5320 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -2,6 +2,11 @@ "Dev": { "title": "Ekaterinburg code", "header": "This is the Yekaterinburg Code - a team that will achieve the impossible. The unattainable, complex, and insane. They will do what no one else can. This is the project you've dreamed of. It is the project of destiny.", - "learnMore": "Find out what we will be doing" + "Learn more": "Find out what we will be doing", + "Join us": "Join us", + "Write to us": "Write to us", + "Congratulations": "Congratulations!
You are the most curious!
We have been looking for you.", + "Details": "Details for the most curious

Today, the city is not just a place to live, but a huge system of services, functions, events, scenarios, interactions. Only all this is not connected with each other in any way now. Culture here, medicine there, transport here, study here, power generally on the sidelines, etc. And it all looks different (and always bad), and it's difficult to work with it, and it's impossible to find anything.

Therefore, we plan to create a full-fledged digital ecosystem of Yekaterinburg. First, we will collect in one place everything that is now scattered across an endless list of sites. There must be exactly one entry point to communicate with the city. Find out about the events, make an appointment with a therapist, get in line at kindergarten, get benefits, write an application for repairs in the house, file a complaint, download the Ecb logo, coordinate the placement of signage, support local communities, anonymously hand over a dealer, vote on an 'active citizen', automatically make a tax deduction, resolve issues with the management company and so on — all in one convenient and beautiful place.

As information about residents accumulates, we will automate their lives. If the system knows the entire medical record, shopping in stores, registration, social payments, benefits, trips, my car, insurance, etc., it will be able to give useful suggestions:

  • It's time to go to the doctor or undergo a medical examination, do you have a free Tuesday morning, let me write it down?
  • Your travel card is running out, let's fill it up for a month, with your regime you will save 150₽
  • In a week there will be a fest where your favorite performer Shysha will perform, buy a ticket?
  • Congratulations on the birth of a child! Let's immediately get in line at the kindergarten
  • It's time to make a booster from Covid, let's go to the bar on Friday, and on Saturday evening for a vaccination?
  • Over the past year, you have accumulated 32,234 ₽ tax deductions for medicine, work and mortgage. We have already arranged everything, tell me, which card to transfer money to?

Let the machine do everything for us, we are not obliged to keep so many worries in our heads.

", + "Description": "

This is more than mos.ru in Moscow. This is not an analogue of public services.

Why is this happening in Yekaterinburg? Because this is a city of enthusiasts. We are burning with our business. We unite to move mountains, and we don't compete for profit. We are a community, not a business.

Therefore, only we and only here can do the impossible. And for this we need you: specialists in backend, frontend, c#, python, figure, product and interface design, testers, analysts, managers, managers, producers.

Our team already has cool guys from Contour, Yandex, Dot. And we are waiting for all professionals who are ready to create a city of the future.

What to do? There are two options here: write to us in the cart and chat, or take a look on github andjust start solving puzzles right away.

Our locomotive is already rushing at full speed. Fly in while you can.

" } } diff --git a/src/locales/ru.json b/src/locales/ru.json index 42ea290..89a560b 100644 --- a/src/locales/ru.json +++ b/src/locales/ru.json @@ -2,6 +2,11 @@ "Dev": { "title": "Код Екатеринбурга", "header": "Это Код Екатеринбурга — команда, которая сделает невозможное. Невыполнимое, сложное и безумное. Сделает то, что никто не сможет. Это тот проект, о котором вы мечтали. Это — проект судьбы.", - "learnMore": "Узнать, что мы будем делать" + "Learn more": "Узнать, что мы будем делать", + "Join us": "Го к нам", + "Write to us": "Написать нам", + "Congratulations": "Поздравляем!
Вы самый любопытный!
Вас мы и искали.", + "Details": "
Подробности для самых любопытных

Сегодня город представляет из себя не просто место для жизни, а огромную систему услуг, функций, событий, сценариев, взаимодействий. Только всё это никак между собой сейчас не связано. Культура тут, медицина там, транспорт сям, учёба тут, власть вообще в сторонке и т. д. И всё это выглядит по-разному (и всегда плохо), и работать с этим сложно, и найти что-либо невозможно.

Поэтому мы планируем создать полноценную цифровую экосистему Екатеринбурга. Сначала мы соберём в одном месте всё, что сейчас разбросано по бесконечному списку сайтов. Для общения с городом должна быть ровно одна точка входа. Узнать о событиях, записаться к терапевту, встать на очередь в садик, получить льготы, написать заявление на ремонт в доме, подать жалобу, скачать лого Екб, согласовать размещение вывески, поддержать локальные сообщества, анонимно сдать барыгу, проголосовать на «активном гражданине», автоматически сделать налоговый вычет, решить вопросы с управляющей компанией и так далее — всё в одном удобном и красивом месте.

По мере накопления информации о жителях, мы будем автоматизировать их жизнь. Если система знает всю медкарту, покупки в магазинах, регистрации, соцвыплаты, льготы, поездки, мой автомобиль, страховки и пр., то сможет выдавать полезные предложения:

  • Пора сходить к врачу или пройти диспансеризацию, у вас свободно утро вторника, давайте запишу?
  • У вас кончается проездной, давайте пополним на месяц, при вашем режиме вы сэкономите 150 ₽
  • Через неделю пройдет фест, где выступит ваш любимый исполнитель Шыша, купить билет?
  • Поздравляем с рождением ребёнка! Давайте сразу встанем на очередь в садик
  • Пора делать бустер от ковида, давайте в пятницу в бар, а в субботу вечером на прививку?
  • За прошлый год у вас накопилось 32 234 ₽ налогового вычета за медицину, работу и ипотеку. Мы уже всё оформили, скажите, на какую карту перевести деньги?

Пусть машина всё делает за нас, мы не обязаны столько забот держать в голове.

", + "Description": "

Это больше, чем mos.ru в Москве. Это не аналог госуслуг.

Почему это происходит в Екатеринбурге? Потому что это город энтузиастов. Мы горим своим делом. Мы объединяемся, чтобы свернуть горы, а не конкурируем ради прибыли. Мы сообщество, а не бизнес.

Поэтому только мы и только здесь можем сделать невозможное. И для этого нам нужны вы: специалисты по бэкенду, фронтэнду, c#, питону, фигме, дизайну продуктов и интерфейсов, тестировщики, аналитики, менеджеры, руководители, продюсеры.

В нашей команде уже есть крутые ребята из Контура, Яндекса, Точки. И мы ждём к нам всех профессионалов, кто готов создать город будущего.

Что делать? Тут два варианта: написать нам в телегу и пообщаться, либо заглянуть на гитхаб и просто сразу начать решать задачки.

Наш локомотив уже несётся полным ходом. Залетайте, пока есть возможность.

" } } diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index 9e97cc3..8c534da 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -1,8 +1,8 @@ import { NextIntlProvider } from "next-intl"; import type { AppProps } from "next/app"; + import "@/styles/globals.css"; import "../../public/fonts/index.css"; -import type { AppProps } from "next/app"; export default function App({ Component, pageProps }: AppProps) { return ( From 1988fb7dbf91c9b615e05005f5b192307b8d5bb5 Mon Sep 17 00:00:00 2001 From: Alexander Chabin Date: Tue, 4 Apr 2023 03:44:49 +0500 Subject: [PATCH 3/4] move texts to `` --- src/components/page/Page.tsx | 108 +++++++++++++++++++++++++++++++++-- src/pages/index.tsx | 79 ++----------------------- 2 files changed, 108 insertions(+), 79 deletions(-) diff --git a/src/components/page/Page.tsx b/src/components/page/Page.tsx index d44862f..6abc199 100644 --- a/src/components/page/Page.tsx +++ b/src/components/page/Page.tsx @@ -2,19 +2,115 @@ import { useTranslations } from "next-intl"; import cn from "classnames"; import styles from "@/components/page/Page.module.css"; +// TODO: translate to english export function Page() { const t = useTranslations("Dev"); return (
-

-

+

Экосистема Екатеринбурга

-
+ {/* +

+ Поздравляем! +
+ Вы самый любопытный! +
+ Вас мы и искали. +

+*/} + +

Что происходит

+ +

+ Сегодня город является не просто местом для жизни, но и волшебной тканью услуг, функций, событий, сценариев и взаимодействий, которые определяют нашу жизнь. {/* Но эти нити сейчас разбросаны: культура, медицина, транспорт, образование и государственные учреждения действуют независимо, порой усложняя наше взаимодействие с ними. +

+ +

*/} + Мы планируем связать их воедино и создать цифровую экосистему Екатеринбурга — объединение всех городских процессов в одном удобном и красивом месте. Новая экосистема поможет снять заботы, упростить и автоматизировать жизнь для жителей, бизнеса и администрации. +

+ + {/*

+ Сначала мы соберём в одном месте всё, что сейчас разбросано по бесконечному списку сайтов. Для общения с городом должна быть ровно одна точка входа. Узнать о событиях, записаться к терапевту, встать на очередь в садик, получить льготы, написать заявление на ремонт в доме, подать жалобу, скачать лого Екб, согласовать размещение вывески, поддержать локальные сообщества, анонимно сдать барыгу, проголосовать на «активном гражданине», автоматически сделать налоговый вычет, решить вопросы с управляющей компанией и так далее — всё в одном удобном и красивом месте. +

*/} + + {/*

+ По мере накопления информации о жителях, мы будем автоматизировать + их жизнь. Если система знает всю медкарту, покупки в магазинах, + регистрации, соцвыплаты, льготы, поездки, мой автомобиль, страховки + и пр., то сможет выдавать полезные предложения: +

+
    +
  • + Пора сходить к врачу или пройти диспансеризацию, у вас + свободно утро вторника, давайте запишу? +
  • +
  • + У вас кончается проездной, давайте пополним на месяц, + при вашем режиме вы сэкономите 150 ₽ +
  • +
  • + Через неделю пройдет фест, где выступит ваш любимый исполнитель + Шыша, купить билет? +
  • +
  • + Поздравляем с рождением ребёнка! Давайте сразу встанем + на очередь в садик +
  • +
  • + Пора делать бустер от ковида, давайте в пятницу + в бар, а в субботу вечером на прививку? +
  • +
  • + За прошлый год у вас накопилось 32 234 ₽ налогового вычета + за медицину, работу и ипотеку. Мы уже всё оформили, скажите, + на какую карту перевести деньги? +
  • +
+

+ Пусть машина всё делает за нас, мы не обязаны столько + забот держать в голове. +

+ +

+ Это больше, чем mos.ru в Москве. Это не аналог госуслуг. +

*/} + +

Почему здесь

+ +

+ Почему это происходит в Екатеринбурге? Потому что это город энтузиастов. Мы горим своим делом. Мы объединяемся, чтобы свернуть горы, а не конкурируем ради прибыли. Мы — сообщество. +

+ +

Кто нам нужен

+ +

+ Поэтому только здесь мы можем сделать невозможное. И для этого нам нужны вы: специалисты по нейросетям, бигдате, машин-лёрнингу, бэкенду, фронтэнду, си-шарпу, питону, кастдеву, дизайну продуктов и интерфейсов, тестировщики, аналитики, менеджеры, руководители, продюсеры. А также инвесторы, спонсоры и партнёры. +

+ +

+ В нашей команде уже есть крутые ребята из Контура, Яндекса, Точки. И мы ждём к нам всех профессионалов, кто готов создать цифровой город будущего. +

+ +

Как к нам попасть

+ +

+ Что делать? Тут два варианта:{" "} + + написать нам в телегу + {" "} + и пообщаться, либо заглянуть{" "} + + на гитхаб + {" "} + и просто сразу начать решать задачки. +

+ +

+ Наш локомотив уже несётся полным ходом. Залетайте, пока есть + возможность. +

); } diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 6ea1c22..2bc15ab 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -1,8 +1,6 @@ /* eslint-disable @next/next/no-img-element */ import Head from "next/head"; import { useTranslations } from "next-intl"; -import cn from "classnames"; -import styles from "@/components/page/Page.module.css"; import { Preview } from "@/components/preview/Preview"; import { Header } from "@/components/header/Header"; import { Footer } from "@/components/footer/Footer"; @@ -12,6 +10,7 @@ import { Team } from "@/components/team/Team"; import { MainAction } from "@/components/action/MainAction"; import { Ecosystem } from "@/components/ecosystem/Ecosystem"; import { GetStaticProps } from "next"; +import { Page } from "@/components/page/Page"; export default function Home() { const t = useTranslations("Dev"); @@ -21,85 +20,19 @@ export default function Home() { {t("title")} +
-
- + -

Экосистема Екатеринбурга

+ -

Что происходит

- -

- Сегодня город — это не просто место, чтобы жить жизнь, - а невероятно сложная инфраструктура услуг, функций, событий, - сценариев и взаимодействий, которые определяют комфорт и качество - жизни. Разобраться во всём этом, мягко говоря, сложно. -

- -

- Поэтому мы планируем создать цифровую экосистему Екатеринбурга - — объединение всех городских сфер в одном месте, чтобы - упростить и автоматизировать жизнь горожан, бизнеса - и администрации. -

- -

Почему здесь

- -

- Потому что Екатеринбург — город энтузиастов. Мы горим - своим делом. Мы объединяемся, чтобы свернуть горы, - а не конкурируем ради прибыли. Мы — сообщество. -

- -

Что уже есть и что в планах

- -

- Уже есть 10 проектов и заряженная команда — - зацените, какой у нас - - гитхаб - - . В ближайшие месяцы планируются большие анонсы всех проектов и - разработка новых. -

- -