forked from Transparency/kgroad-frontend2
Compare commits
23
Commits
fix
...
eb84fa2db4
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
eb84fa2db4 | ||
|
|
a755c9125a | ||
|
|
7daa197649 | ||
|
|
775e238e77 | ||
|
|
5eff43ef61 | ||
|
|
3c810dad82 | ||
|
|
b10ab93bf1 | ||
|
|
49cb64a368 | ||
|
|
cbe5c0656c | ||
|
|
1a606f4ecd | ||
|
|
19397689b1 | ||
|
|
922d8386c6 | ||
|
|
dcac729914 | ||
|
|
ecd3848ec3 | ||
|
|
32761ce479 | ||
|
|
54ec09afe0 | ||
|
|
ea58e4f2d1 | ||
|
|
c3697c9e55 | ||
|
|
b85d1e8f30 | ||
|
|
1363519e75 | ||
|
|
bea7ec82c2 | ||
|
|
6508bc0258 | ||
|
|
981c5863ee |
No files matched your search
@@ -1,3 +1,12 @@
|
|||||||
|
## TL;DR
|
||||||
|
|
||||||
|
```
|
||||||
|
git pull
|
||||||
|
yarn install
|
||||||
|
yarn build
|
||||||
|
yarn start
|
||||||
|
```
|
||||||
|
|
||||||
This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
|
This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
|
||||||
|
|
||||||
## Getting Started
|
## Getting Started
|
||||||
|
|||||||
+5
-9
@@ -73,15 +73,11 @@
|
|||||||
"read_more": "Read More"
|
"read_more": "Read More"
|
||||||
},
|
},
|
||||||
"about_us": {
|
"about_us": {
|
||||||
"name": "Transparency International-Kyrgyzstan",
|
"name": "About us KGROAD",
|
||||||
"description": "Branch of the international organization Transparency International in the Kyrgyz Republic.",
|
"description1": "Transparency International is a global independent organization that studies and fights against corruption both internationally and within individual countries, one of the goals of which is to achieve greater transparency and accountability of government.",
|
||||||
"mission": "Promoting effective public policy and good governance to prevent corruption and strengthen democracy in the country.",
|
"description2": "The team of Transparency International Kyrgyzstan has developed a platform for monitoring road construction and repair, containing an interactive map to provide access to information on roads and streets repaired in recent years, including cost of works, contractor details, warranty periods, links to procurement documents and other information on works, as well as generalized statistics on road works (e.g. road works performed by the same contractor). ",
|
||||||
"goals_and_priorities": {
|
"description3": "The platform will also provide users with the opportunity to promptly report defects on roads and the need to fix them, vote on the priority of road repairs and provide feedback in a convenient format that will allow citizens to independently analyze and monitor the use of execution of state road contracts. Information on road construction and repairs is collected from public data from the state procurement portal and the Ministry of Justice.",
|
||||||
"anti-corruption_education": "Anti-corruption education of the population, raising public awareness of the importance and significance of the fight against corruption in Kyrgyzstan;",
|
"description4":"In addition to the web platform, there are two mobile applications for iOS and Android platforms with functions similar to the website."
|
||||||
"study_of_corruption_practices": "Organization of the study of the practice and theory of combating corruption and the participation of civil society structures in Kyrgyzstan and other countries;",
|
|
||||||
"supporting_citizens_and_organizations": "Assistance to citizens and organizations in the implementation of their constitutional rights and freedoms;",
|
|
||||||
"international_experience": "Preferential orientation to international experience in reducing corruption, mastering its technologies and resources, as well as involving civil society structures in the international dialogue on combating corruption."
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"volunteers": {
|
"volunteers": {
|
||||||
"activists": "Activists",
|
"activists": "Activists",
|
||||||
|
|||||||
+120
-113
@@ -1,44 +1,44 @@
|
|||||||
{
|
{
|
||||||
"general": {
|
"general": {
|
||||||
"date": "Дата",
|
"date": "Күн",
|
||||||
"address": "Дарек",
|
"address": "Дарек",
|
||||||
"status": "Статус",
|
"status": "Статус",
|
||||||
"description": "Сүрөттөмө ",
|
"description": "Көйгөй",
|
||||||
"reviews": "Пикир",
|
"reviews": "Комментарийлер",
|
||||||
"rating": "Рейтинг",
|
"rating": "Рейтинг",
|
||||||
"review": "Пикир",
|
"review": "Комментарий",
|
||||||
"write_comment": "Пикир жазыңыз",
|
"write_comment": "Комментарий жазуу",
|
||||||
"search": "Издөө",
|
"search": "Издөө",
|
||||||
"search_for": "Издөө",
|
"search_for": "Издөө",
|
||||||
"city": "Шаар",
|
"city": "Шаар",
|
||||||
"added_roads": "Кошулган жолдор",
|
"added_roads": "Белгилөөлөр",
|
||||||
"broken_roads": "Бузулган жолдор",
|
"broken_roads": "Бузулган жолдор",
|
||||||
"accident_hotspots": "Кырсык очоктору",
|
"accident_hotspots": "Авариялык абалда",
|
||||||
"local_defects": "Жердик кемчиликтер",
|
"local_defects": "Жергиликтүү кемчиликтер",
|
||||||
"repair_plans": "Оңдоо пландарында",
|
"repair_plans": "Ремонттоо планында",
|
||||||
"repaired": "Оңдолду",
|
"repaired": "Ремонттолгон",
|
||||||
"fixed_local_defects": "Жердик кемчиликтер оңдолду",
|
"fixed_local_defects": "Жергиликтүү оңдолгон жолдор",
|
||||||
"news": "Жаңылыктар",
|
"news": "Жаңылыктар",
|
||||||
"details": "Кеңирирээк",
|
"details": "Кененирээк маалымат",
|
||||||
"navigation": "Навигация",
|
"navigation": "Навигация",
|
||||||
"contacts": "Байланыш",
|
"contacts": "Байланыш",
|
||||||
"download_our_app": "Биздин тиркемени жүктөп алыңыз",
|
"download_our_app": "Биздин колдонмону жүктөңүз",
|
||||||
"back": "Артка",
|
"back": "Артка",
|
||||||
"save": "Сактоо",
|
"save": "Сактоо",
|
||||||
"saving": "Сакталат",
|
"saving": "Сакталат",
|
||||||
"cancel": "Жокко чыгаруу",
|
"cancel": "Жокко чыгаруу",
|
||||||
"cancellation": "Жокко чыгаруу",
|
"cancellation": "Жокко чыгаруу",
|
||||||
"save_changes": "Өзгөрүүлөрдү сактоо",
|
"save_changes": "Өзгөртүүлөрдү сактоо",
|
||||||
"send": "Жөнөтүү",
|
"send": "Жиберүү",
|
||||||
"receive": "Алуу",
|
"receive": "Алуу",
|
||||||
"delete": "Жок кылуу",
|
"delete": "Жок кылуу",
|
||||||
"show_on_map": "Картада көрсөтүү",
|
"show_on_map": "Картада көрсөтүү",
|
||||||
"author_of_appeal": "Кайрылуунун автору",
|
"author_of_appeal": "Өтүнүчтүн автору",
|
||||||
"enter_city": "Шаарды киргизиңиз",
|
"enter_city": "Жерликти киргизиңиз",
|
||||||
"page_not_found": "Бет табылган жок (404)",
|
"page_not_found": "Барак табылган жок (404)",
|
||||||
"incorrect_address_or_nonexistent_page": "Дарек туура эмес терилген же андай бет жок",
|
"incorrect_address_or_nonexistent_page": "Дарек туура эмес же баракча жок",
|
||||||
"home": "Башкы бет",
|
"home": "Башкы бет",
|
||||||
"first_name": "Аты",
|
"first_name": "Аты-жөнү",
|
||||||
"last_name": "Фамилия",
|
"last_name": "Фамилия",
|
||||||
"email": "Электрондук почта"
|
"email": "Электрондук почта"
|
||||||
},
|
},
|
||||||
@@ -53,137 +53,144 @@
|
|||||||
"profile": "Профиль",
|
"profile": "Профиль",
|
||||||
"login": "Кирүү"
|
"login": "Кирүү"
|
||||||
},
|
},
|
||||||
|
"about_us": {
|
||||||
|
"name": "Биз жөнүндө",
|
||||||
|
"description1": "Transparency International ̶ это глобальная независимая организация по изучению и борьбе с коррупцией как в международном масштабе, так и в масштабе отдельных стран, одна из целей которой добиться большей прозрачности и подотчетности власти.",
|
||||||
|
"description2": "Команда Трансперенси Интернешнл Кыргызстан разработала платформу для мониторинга строительства и ремонта дорог, содержащая интерактивную карту по обеспечению доступа к информации о дорогах и улицах, отремонтированных за последние годы, включая стоимость работ, данные организации-подрядчика, гарантийные сроки, ссылки на закупочную документацию и другую информация о работах, а также обобщенная статистика по дорожным работам (например, дорожные работы, выполненные одним и тем же подрядчиком). ",
|
||||||
|
"description3": "Платформа также предоставит пользователям возможность оперативно сообщать о дефектах на дорогах и необходимости их устранения, голосовать за приоритетность ремонта дорог и предоставлять обратную связь в удобном формате, которые позволят гражданам самостоятельно анализировать и контролировать использование исполнения государственных дорожных контрактов. Информация по дорожным строительствам и ремонтам собирается из открытых данных портала госзакупок и Минюста.",
|
||||||
|
"description4":"Помимо веб-платформы имеются два мобильных приложения для платформ iOS и Android с функциями, аналогичными веб-сайту."
|
||||||
|
},
|
||||||
"home": {
|
"home": {
|
||||||
"title": "Кыргызстандын жолдору",
|
"title": "Кыргызстандын жолдору",
|
||||||
"subtitle": "Жолдорду коопсуз кылалы!",
|
"subtitle": "Жолдорду коопсуз кылалы!",
|
||||||
"info": "Жолдордун жаңы күйү",
|
"info": "Жолдун абалы боюнча акыркы маалымат",
|
||||||
"report_broken_road": "Бузулган жолду белгилөө",
|
"report_broken_road": "Бузулган жолду белгилөө",
|
||||||
"road_map": "Жол картасы",
|
"road_map": "Жол картасы",
|
||||||
"latest_news": "Жол кыймылы, курулуш жана иш-чаралары жөнүндө маалым болуңуз!",
|
"latest_news": "Жол кыймылы, жасалып жатканы ж.б. тууралуу акыркы жаңылыктардан кабардар болуңуз!",
|
||||||
"enter_location": "Шаар, айыл же аймакты киргизиңиз",
|
"enter_location": "Шаар, айыл же аймакты киргизиңиз",
|
||||||
"broken_roads": "Бузулган жол",
|
"broken_roads": "Бузулган жол",
|
||||||
"accident_hotspots": "Кырсык очогу",
|
"accident_hotspots": "Авариялык абалда",
|
||||||
"local_defects": "Жердик кемчилик",
|
"local_defects": "Жергиликтүү дефект",
|
||||||
"repair_plans": "Оңдоо планында",
|
"repair_plans": "Ремонттоо планында",
|
||||||
"repaired": "Оңдолду",
|
"repaired": "Оңдолгон",
|
||||||
"fixed_local_defects": "Жердик кемчилик оңдолду",
|
"fixed_local_defects": "Оңдолгон жергиликтүү дефект",
|
||||||
"rating": "Рейтинг",
|
"rating": "Рейтинг",
|
||||||
"road_discussions": "Жолдорду талкуулайбыз: рейтинг, тажрыйба, жолдо жайлуулук!",
|
"road_discussions": "Жолдорду талкуулоо: рейтинг, жеке тажрыйба, ылайык айдоо!",
|
||||||
"enter_address": "Даректи киргизиңиз",
|
"enter_address": "Даректи киргизиңиз",
|
||||||
"read_more": "Кеңирирээк"
|
"read_more": "Көбүрөөк маалымат"
|
||||||
},
|
},
|
||||||
"transparency_international_kyrgyzstan": {
|
"transparency_international_kyrgyzstan": {
|
||||||
"name": "Транспаренттыктык Интернационал-Кыргызстан",
|
"name": "Транспаренси Интернешнл-Кыргызстан",
|
||||||
"description": "Транспаренттыктык Интернационалдын Кыргызстан Республикасы бөлүмү.",
|
"description": "Transparency International эл аралык уюмунун Кыргыз Республикасындагы бөлүмү.",
|
||||||
"mission": "Коррупциянын ыкмасы менен демократияны күтүтүп, эффективдүү жамааттык саясат жана жакшы мамлекеттүү башкаруунун бириктирилүү үчүн.",
|
"mission": "Коррупциянын алдын алуу жана өлкөдө демократияны чыңдоо үчүн эффективдүү мамлекеттик саясатты жана ак ниет башкарууну алдыга жылдыруу.",
|
||||||
"goals_and_priorities": {
|
"goals_and_priorities": {
|
||||||
"anti-corruption_education": "Коррупция менен борбордук бийикти ашуу, Кыргызстанда коррупцияга каршы болгондоо маанилүүдүн жана азаттыктардын маанилүүлүгү үчүн жалпы айткынуу;",
|
"anti-corruption_education": "Кыргызстандын калкын коррупцияга каршы күрөштүн мааниси жана зарылчылыгы жөнүндө коомчулуктун маалымдуулугун жогорулатуу;",
|
||||||
"study_of_corruption_practices": "Коррупцияга каршы борбордукты тартуу жана учуруу теориясы менен, Кыргызстан менен башка өлкөлердеги кызмат көрсөтүүсү үчүн азаттыктыктын долбоорлорун жана каттоого жаткантыруу;",
|
"study_of_corruption_practices": "Кыргызстанда жана башка өлкөлөрдө коррупция менен күрөшүүнүн тажрыйбасы жана теориясын изилдөөнү уюштуруу жана ага жарандык коом структураларынын катышуусу;",
|
||||||
"supporting_citizens_and_organizations": "Граждандар менен биздин же компаниялардын конституциялык башкаруу менен жандуулаткануу;",
|
"supporting_citizens_and_organizations": "Жарандарга жана уюмдарга алардын конституциялык укуктарын жана эркиндиктерин ишке ашырууга жардам көрсөтүү;",
|
||||||
"international_experience": "Коррупциянын аздоого чейинки жыйынтыкты башкаруу үчүн көздөр тартуу, улуттуктары менен биргелеп, коррупцияга каршы көрсөткүчтөрдү мамлекеттик диалогга киргизүү."
|
"international_experience": "Коррупцияны азайтуу боюнча эл аралык тажрыйбага, анын технологияларын, ресурстарын колдонууга, ошондой эле коррупцияга каршы эл аралык диалогго жарандык коомдун түзүмдөрүн кошууга басымдуулук кылуу."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"volunteers": {
|
"volunteers": {
|
||||||
"activists": "Активисттер",
|
"activists": "Активисттер",
|
||||||
"received_votes": "Алган добуштары",
|
"received_votes": "Алынган добуштар",
|
||||||
"left_votes": "Калтырган добуштары",
|
"left_votes": "Калтырылган добуштар",
|
||||||
"rating": "Рейтинг"
|
"rating": "Рейтинг"
|
||||||
},
|
},
|
||||||
"profile": {
|
"profile": {
|
||||||
"personal_cabinet": "Жеке кеңсе",
|
"personal_cabinet": "Жеке кабинет",
|
||||||
"personal_data": "Жеке маалыматтар",
|
"personal_data": "Жеке маалымат",
|
||||||
"my_appeals": "Менин кайрылууларым",
|
"my_appeals": "Менин кайрылууларым",
|
||||||
"logout": "Чыгуу",
|
"logout": "Чыгуу",
|
||||||
"write_appeal": "Кайрылуу жазыңыз",
|
"write_appeal": "Кайрылуу",
|
||||||
"profile_photo": "Профиль сүрөтү",
|
"profile_photo": "Сүрөт",
|
||||||
"others_identification": "Профилиңиздин сүрөтү боюнча, башка адамдар сизди тааный алышат жана сиз кайсы аккаунтка киргениңизди аныктоо оңой болот.",
|
"others_identification": "Профиль сүрөтү аркылуу башка адамдар сизди тааный алышат, жана сиз кайсы аккаунтка киргениңиз белгилүү болот.",
|
||||||
"add_profile_photo": "Профиль сүрөтү кошуңуз",
|
"add_profile_photo": "Профиль сүрөтү кошуу",
|
||||||
"profile_photo_updated": "Профиль сүрөтү жаңырды",
|
"profile_photo_updated": "Сүрөттү жаңырланытуу",
|
||||||
"delete": "Жок кылуу",
|
"delete": "Жок кылуу",
|
||||||
"change": "Алмаштыруу"
|
"change": "Өзгөртүү"
|
||||||
},
|
},
|
||||||
"authorization": {
|
"authorization": {
|
||||||
"change_password": "Сырсөздү алмаштыруу",
|
"change_password": "Сыр сөздү өзгөртүү",
|
||||||
"old_password": "Эски сырсөз",
|
"old_password": "Эски сыр сөз",
|
||||||
"enter_old_password": "Эски сырсөз киргизиңиз",
|
"enter_old_password": "Эски сыр сөздү киргизиңиз",
|
||||||
"new_password": "Жаңы сырсөз",
|
"new_password": "Жаңы сыр сөз",
|
||||||
"enter_new_password": "Жаңы сырсөз киргизиңиз",
|
"enter_new_password": "Жаңы сыр сөздү киргизиңиз",
|
||||||
"confirm_new_password": "Жаңы сырсөзүңүздү ырастаңыз",
|
"confirm_new_password": "Жаңы сыр сөздү ырастоо",
|
||||||
"confirm_new_password_prompt": "Жаңы сырсөзүңүздү ырастаңыз",
|
"confirm_new_password_prompt": "Сураныч, жаңы сыр сөздү ырастоо зарыл",
|
||||||
"password": "Сырсөз",
|
"password": "Сыр сөз",
|
||||||
"forgot_password": "Сырсөзүңүздү унуттуңузбу?",
|
"forgot_password": "Сыр сөздү унуттуңузбу?",
|
||||||
"login": "Кирүү",
|
"login": "Кириш",
|
||||||
"register": "Каттоо",
|
"register": "Каттоо",
|
||||||
"sign_in_account": "Аккаунтуңузга кириңиз",
|
"sign_in_account": "Аккаунтка кириңиз",
|
||||||
"enter_credentials": "Маалыматыңызды киргизиңиз",
|
"enter_credentials": "Сураныч, киргизиңиз",
|
||||||
"login_via_google": "Google менен кирүү",
|
"login_via_google": "Google аркылуу кирүү",
|
||||||
"enter_password": "Сырсөздү киргизиңиз",
|
"enter_password": "Сыр сөздү киргизиңиз",
|
||||||
"password_requirements": "Сырсөз кеминде 8 белгиден, 1 баш тамгадан жана сандан турушу керек",
|
"password_requirements": "Минимум 8 белги, 1 башкы буюк тамга жана 1 сандар",
|
||||||
"no_account_yet": "Аккаунтуңуз али жокпу? Катталыңыз",
|
"no_account_yet": "Аккаунтуңуз жокпу? Катталыңыз",
|
||||||
"registration": "Каттоо",
|
"registration": "Каттоо",
|
||||||
"register_now": "Азыр катталыңыз",
|
"register_now": "Каттоо",
|
||||||
"already_have_account": "Аккаунтуңуз барбы? Аккаунтуңузга кириңиз",
|
"already_have_account": "Аккаунтуңуз барбы? Кириңиз",
|
||||||
"enter_email": "Электрондук почтаңызды киргизиңиз",
|
"enter_email": "Электрондук почтаны киргизиңиз",
|
||||||
"enter_email_for_code": "Электрондук почтаңызды киргизиңиз, биз сизге сырсөздү калыбына келтирүү кодун жөнөтөбүз",
|
"enter_email_for_code": "Электрондук почтаны киргизиңиз, биз сизге сыр сөздү жөнөтөбүз",
|
||||||
"send_code": "Код жөнөтүү",
|
"send_code": "Код жөнөтүү",
|
||||||
"confirm_code": "Кодду ырастоо",
|
"confirm_code": "Кодту ырастоо",
|
||||||
"enter_code": "Код киргизиңиз",
|
"enter_code": "Кодду киргизиңиз",
|
||||||
"enter_reset_code": "Сырсөзүңүздү жаңылоо жана калыбына келтирүү үчүн кодду киргизиңиз",
|
"enter_reset_code": "Сыр сөздү өзгөртүп жаңыртуу үчүн кодту киргизиңиз",
|
||||||
"reset_code": "Сырсөздүн жаңылоо коду",
|
"reset_code": "Сыр сөздү өзгөртүү коду",
|
||||||
"reset_password": "Сырсөздү жаңылоо",
|
"reset_password": "Сыр сөздү өзгөртүү",
|
||||||
"check_email": "Почтаңызды текшериңиз",
|
"check_email": "Почтаны текшериңиз",
|
||||||
"code_sent_to": "Кодду active1User@mail.com дарегине жөнөттүк",
|
"code_sent_to": "Биз кодду name@gmail.com почтасына жөнөттүк",
|
||||||
"confirmation_code": "Ырастоо коду",
|
"confirmation_code": "Ырастоо коду",
|
||||||
"confirm": "Ырастоо",
|
"confirm": "Ырастоо",
|
||||||
"resend_code_in": "Кодду кайра жөнөтүү ... кийин",
|
"resend_code_in": "Кодду кайра жөнөтүү",
|
||||||
"resend_code": "Кодду кайра жөнөтүү"
|
"resend_code": "Кодду кайра жөнөтүү"
|
||||||
},
|
},
|
||||||
"send_report": {
|
"send_report": {
|
||||||
"how_to_mark_road_section": "Жолдун бир бөлүгүн кантип белгилөө керек?",
|
"how_to_mark_road_section": "Жол бөлүмүн белгилөө",
|
||||||
"mark_road_instructions": "Төөгөнү коюп, жолдун бир бөлүгүн тарта баштаңыз (ал каалаган сандагы сынык сызыктардан турушу мүмкүн)",
|
"mark_road_instructions": "Төйнөгүчтү коюп, жолдун бир бөлүгүн тарта баштаңыз (ал каалаган сандагы сынык сызыктардан турушу мүмкүн).",
|
||||||
"remove_segment_instruction": "Кесиндини жок кылуу үчүн, чекиттерди кайра басыңыз.",
|
"remove_segment_instruction": "Жол бөлүгүн алып таштоо үчүн коюлган төйнөгүчтү кайра басыңыз.",
|
||||||
"add_problem_description": "Көйгөйдүн сүрөттөмөсүн кошуңуз",
|
"add_problem_description": "Көйгөйдү сүрөттөңүз",
|
||||||
"enter_description": "Сүрөттөмө киргизиңиз",
|
"enter_description": "Сүрөттөмөнү киргизиңиз",
|
||||||
"add_photos": "Сүрөттөрдү кошуңуз",
|
"add_photos": "Сүрөт салыңыз",
|
||||||
"upload_photos_instructions": "Белгилегиңиз келген жолго тиешелүү 5 сүрөткө чейин жүктөңүз. Сүрөттөр көйгөйдү жакшыраак түшүнүүгө жардам берет.",
|
"upload_photos_instructions": "Көйгөйдү ырастоо үчүн жолго тиешелүү 5 сүрөткө чеийн киргизсеңиз болот.",
|
||||||
"attach_file": "Файлды тиркөө (5 МБ чейин)",
|
"attach_file": "Сүрөт тиркөө (5 МБга чейин)",
|
||||||
"submit_for_moderation": "Модерацияга жөнөтүү",
|
"submit_for_moderation": "Модерацияга жиберүү",
|
||||||
"appeal_submitted": "Сиздин кайрылууңуз жөнөттүү",
|
"appeal_submitted": "Сиздин кайрылууңуз жиберилди",
|
||||||
"thanks_for_appeal": "Сиздин кайрылууңуз үчүн рахмат. Азыркуу учурда ал модерацияда.",
|
"thanks_for_appeal": "Кайрылууңуз үчүн рахмат. Азырынча ал модерацияда.",
|
||||||
"view_my_appeals": "Менин кайрылууларымды көрүү"
|
"view_my_appeals": "Менин кайрылууларымды көрүү"
|
||||||
},
|
},
|
||||||
"months": {
|
"months": {
|
||||||
"january": "Үчтүн Айы (январь)",
|
"january": "Үчтүн айы",
|
||||||
"february": "Бирдин Айы (февраль)",
|
"february": "Бирдин айы",
|
||||||
"march": "Жалган Куран (март)",
|
"march": "Жалган куран",
|
||||||
"april": "Чын Куран (апрель)",
|
"april": "Чын куран",
|
||||||
"may": "Бугу (май)",
|
"may": "Бугу",
|
||||||
"june": "Кулжа (июнь)",
|
"june": "Кулжа",
|
||||||
"july": "Теке (июль)",
|
"july": "Теке",
|
||||||
"august": "Баш Оона (август)",
|
"august": "Баш оона",
|
||||||
"september": "Аяк Оона (сентябрь)",
|
"september": "Аяк оона",
|
||||||
"october": "Тогуздун Айы (октябрь)",
|
"october": "Тогуздун айы",
|
||||||
"november": "Жетинин Айы (ноябрь)",
|
"november": "Жетинин айы",
|
||||||
"december": "Бештин Айы (декабрь)"
|
"december": "Бештин айы"
|
||||||
},
|
},
|
||||||
"validation_errors": {
|
"validation_errors": {
|
||||||
"invalid_email_format": "Жараксыз электрондук почта же сырсөз форматы",
|
"invalid_email_format": "Электрондук почтанын форматы туура эмес.",
|
||||||
"passwords_do_not_match": "Сырсөздөр дал келбейт.",
|
"passwords_do_not_match": "Сыр сөздөрү туура келбейт.",
|
||||||
"required_field_not_filled": "Милдеттүү талаа толтурулган жок.",
|
"required_field_not_filled": "Талап кылынган жер толтурулган эмес.",
|
||||||
"exceeded_maximum_length": "Максималдуу талаа узундугу ашты.",
|
"exceeded_maximum_length": "Тамгалардын максималдуу узундугу ашып кетти.",
|
||||||
"login_required_before_commenting": "Пикир калтыруудан мурун аккаунтуңузга кириңиз.",
|
"login_required_before_commenting": "Комментарий калтырыш үчүн жеке кабинетиңизге кириңиз же каттоодон өтүңүз.",
|
||||||
"login_required_before_like": "Жакты койгондон мурун аккаунтуңузга кириңиз."
|
"login_required_before_like": "Лайк коюш үчүн жеке кабинетиңизге кириңиз же каттоодон өтүңүз."
|
||||||
},
|
},
|
||||||
"server_errors": {
|
"server_errors": {
|
||||||
"invalid_email_or_password": "Жараксыз электрондук почта же сырсөз.",
|
"invalid_email_or_password": "Почта же сыр сөз туура эмес.",
|
||||||
"server_error_auth_attempt": "Сервер тарапта ката.",
|
"server_error_auth_attempt": "Авторизация аракетинде сервердеги ката.",
|
||||||
"login_failed": "Кирүүгө мүмкүн болгон эмес. Негизги нече кайталап уруксат бериңиз.",
|
"login_failed": "Кирүүгө мүмкүн эмес. Кийинчирээк кайталап көрүңүз.",
|
||||||
"account_already_exists": "Бул колдонуучу мурунтан эле бар.",
|
"account_already_exists": "Бул почта катталган.",
|
||||||
"account_not_found": "Аккаунт табылган жок.",
|
"account_not_found": "Аккаунт табылган жок.",
|
||||||
"invalid_activation_code": "Код жараксыз",
|
"invalid_activation_code": "Код жараксыз.",
|
||||||
"invalid_activation_code_reset": "Активдештирүү коду жарактуу",
|
"invalid_activation_code_reset": "Активация коду жараксыз.",
|
||||||
"invalid_password_reset_code": "Сырсөздү кайра коюу коду жараксыз",
|
"invalid_password_reset_code": "Сыр сөздү өзгөртүү коду жараксыз.",
|
||||||
"invalid_code": "Код туура эмес"
|
"invalid_code": "Туура эмес код."
|
||||||
},
|
},
|
||||||
"disclaimer": {
|
"disclaimer": {
|
||||||
"text": "Бул веб-сайт Европа Биримдиги тарабынан каржыланат. Анын мазмуну үчүн Трансперенси Интернешнл Кыргызстан гана жоопкерчиликтүү жана ал Европа Биримдигинин көз карашын сөзсүз түрдө чагылдырбайт."
|
"text": "Бул веб-сайт Европа Биримдиги тарабынан каржыланат. Анын мазмуну үчүн Трансперенси Интернешнл Кыргызстан гана жоопкерчиликтүү жана ал Европа Биримдигинин көз карашын сөзсүз түрдө чагылдырбайт."
|
||||||
@@ -200,8 +207,8 @@
|
|||||||
"title4": "Жеке маалыматтарды өткөрүп берүү",
|
"title4": "Жеке маалыматтарды өткөрүп берүү",
|
||||||
"title5": "Жеке маалыматтарды жок кылуу",
|
"title5": "Жеке маалыматтарды жок кылуу",
|
||||||
"title6": "Жеке маалыматтарды коргоо",
|
"title6": "Жеке маалыматтарды коргоо",
|
||||||
"title7": "Колдонуучунун суроо-талаптары",
|
"title7": "Колдонуучунун кайрылуулары",
|
||||||
"p1":"Бул Купуялык саясаты боюунча жобо ",
|
"p1":"Бул Купуялык саясатынын билдирүүсү почта тизмесин, сайттын пикир формасын жана домендик аталышта жайгашкан электрондук почта даректерин колдонгон жеке адамдар (мындан ары - Колдонуучулар) жөнүндө маалыматты иштеп чыгуу жана коргоо тартибин аныктайт.",
|
||||||
"p1o":" (мындан ары Сайт деп аталат) домендик аталышта жайгашкан почталык таркатма, сайттын пикир билдирүү формасын жана электрондук почта даректерин колдонгон жеке адамдар (мындан ары - Колдонуучулар) жөнүндө маалыматты колдонуу жана коргоо тартибин аныктайт. Биз жеке маалыматтарды кантип иштетээрибизди сүрөттөгөн Купуялык саясатын иштеп чыктык - автоматташтыруу куралдарын колдонуу менен же мындай куралдарды колдонбостон аткарылган ар кандай аракеттер (операциялар) же аракеттердин (операциялардын) жыйындысы, анын ичинде жеке маалыматтарды чогултуу, жазып алуу, системалаштыруу, топтоо, сактоо, тактоо (жаңыртуу, өзгөртүү), чыгаруу, пайдалануу, берүү (тараттуу, көрсөтүү, жетүү), өздүксүздөндүрүү, жаап коюу, өчүрүү, жок кылуу. Жеке маалыматтарды жана Сайттын колдонуучулары жөнүндө маалыматтарды иштетүүгө байланышкан мамилелер ушул Жобо менен жөнгө салынат. Бул Купуялык саясаты Сайттын колдонуучулары болуп саналган адамдар жөнүндө персоналдык маалыматтарды жана жеке мүнөздөгү маалыматтарды ( өздүктү тактаганга мүмкүндүк берген каалаган маалымат жана ага байланыштуу каалаган башка маалымат) иштетүүнүн бардык түрүн жөнгө салат. Бул Саясат дүйнөнүн каалаган жеринде жайгашкан адамдардан Интернет аркылуу да, аны колдонбостон да активдүү жана пассивдүү ар кандай каражаттар менен чогултулган жеке, персоналдык маалыматтарды иштетүүгө карата колдонулат.",
|
"p1o":" (мындан ары Сайт деп аталат) домендик аталышта жайгашкан почталык таркатма, сайттын пикир билдирүү формасын жана электрондук почта даректерин колдонгон жеке адамдар (мындан ары - Колдонуучулар) жөнүндө маалыматты колдонуу жана коргоо тартибин аныктайт. Биз жеке маалыматтарды кантип иштетээрибизди сүрөттөгөн Купуялык саясатын иштеп чыктык - автоматташтыруу куралдарын колдонуу менен же мындай куралдарды колдонбостон аткарылган ар кандай аракеттер (операциялар) же аракеттердин (операциялардын) жыйындысы, анын ичинде жеке маалыматтарды чогултуу, жазып алуу, системалаштыруу, топтоо, сактоо, тактоо (жаңыртуу, өзгөртүү), чыгаруу, пайдалануу, берүү (тараттуу, көрсөтүү, жетүү), өздүксүздөндүрүү, жаап коюу, өчүрүү, жок кылуу. Жеке маалыматтарды жана Сайттын колдонуучулары жөнүндө маалыматтарды иштетүүгө байланышкан мамилелер ушул Жобо менен жөнгө салынат. Бул Купуялык саясаты Сайттын колдонуучулары болуп саналган адамдар жөнүндө персоналдык маалыматтарды жана жеке мүнөздөгү маалыматтарды ( өздүктү тактаганга мүмкүндүк берген каалаган маалымат жана ага байланыштуу каалаган башка маалымат) иштетүүнүн бардык түрүн жөнгө салат. Бул Саясат дүйнөнүн каалаган жеринде жайгашкан адамдардан Интернет аркылуу да, аны колдонбостон да активдүү жана пассивдүү ар кандай каражаттар менен чогултулган жеке, персоналдык маалыматтарды иштетүүгө карата колдонулат.",
|
||||||
"p2":"Жеке маалыматтарды иштетүүнүн максаты Оператор тарабынан Сайтты жана анын кызматтарын пайдалануу боюнча Колдонуучулардын алдындагы милдеттерин аткаруу болуп саналат. Колдонуучунун жеке маалыматтарын иштетүү жеке маалыматтар субъектинин анын жеке маалыматтарын иштетүүгө макулдугу менен жүзөгө ашырылат. Жеке маалыматтар деп, аныкталган же аныкталуучу адамга (жеке маалыматтар субъектисине) түздөн-түз же кыйыр түрдө тиешелүү жана аныкталган адамды идентификациялоо же аны менен байланыштыруу үчүн колдонулушу мүмкүн болгон каалаган маалымат. Сиздин макулдугуңуз менен сизди почталык таркатмага киргизүү, ошондой эле Сайттагы пикир билдирүү формасы аркылуу биз менен байланышсаңыз, сизге жооп берүү үчүн атыңызды, фамилияңызды, атаңыздын атыңыздын жана электрондук почта дарегиңизди сурашыбыз мүмкүн.",
|
"p2":"Жеке маалыматтарды иштетүүнүн максаты Оператор тарабынан Сайтты жана анын кызматтарын пайдалануу боюнча Колдонуучулардын алдындагы милдеттерин аткаруу болуп саналат. Колдонуучунун жеке маалыматтарын иштетүү жеке маалыматтар субъектинин анын жеке маалыматтарын иштетүүгө макулдугу менен жүзөгө ашырылат. Жеке маалыматтар деп, аныкталган же аныкталуучу адамга (жеке маалыматтар субъектисине) түздөн-түз же кыйыр түрдө тиешелүү жана аныкталган адамды идентификациялоо же аны менен байланыштыруу үчүн колдонулушу мүмкүн болгон каалаган маалымат. Сиздин макулдугуңуз менен сизди почталык таркатмага киргизүү, ошондой эле Сайттагы пикир билдирүү формасы аркылуу биз менен байланышсаңыз, сизге жооп берүү үчүн атыңызды, фамилияңызды, атаңыздын атыңыздын жана электрондук почта дарегиңизди сурашыбыз мүмкүн.",
|
||||||
"p3": "Колдонуучулардын жеке маалыматтары электрондук алып жүрүүчүлөрдө гана сакталат жана автоматташтырылган системалардын жардамы менен иштетилет.",
|
"p3": "Колдонуучулардын жеке маалыматтары электрондук алып жүрүүчүлөрдө гана сакталат жана автоматташтырылган системалардын жардамы менен иштетилет.",
|
||||||
|
|||||||
+5
-9
@@ -73,15 +73,11 @@
|
|||||||
"read_more": "Читать"
|
"read_more": "Читать"
|
||||||
},
|
},
|
||||||
"about_us": {
|
"about_us": {
|
||||||
"name": "Transparency International-Кыргызстан",
|
"name": "О нас",
|
||||||
"description": "Филиал международной организации Transparency International в Кыргызской Республике.",
|
"description1": "Transparency International ̶ это глобальная независимая организация по изучению и борьбе с коррупцией как в международном масштабе, так и в масштабе отдельных стран, одна из целей которой добиться большей прозрачности и подотчетности власти.",
|
||||||
"mission": "Продвижение эффективной общественной политики и надлежащего управления в целях предотвращения коррупции и усиления демократии в стране.",
|
"description2": "Команда Трансперенси Интернешнл Кыргызстан разработала платформу для мониторинга строительства и ремонта дорог, содержащая интерактивную карту по обеспечению доступа к информации о дорогах и улицах, отремонтированных за последние годы, включая стоимость работ, данные организации-подрядчика, гарантийные сроки, ссылки на закупочную документацию и другую информация о работах, а также обобщенная статистика по дорожным работам (например, дорожные работы, выполненные одним и тем же подрядчиком). ",
|
||||||
"goals_and_priorities": {
|
"description3": "Платформа также предоставит пользователям возможность оперативно сообщать о дефектах на дорогах и необходимости их устранения, голосовать за приоритетность ремонта дорог и предоставлять обратную связь в удобном формате, которые позволят гражданам самостоятельно анализировать и контролировать использование исполнения государственных дорожных контрактов. Информация по дорожным строительствам и ремонтам собирается из открытых данных портала госзакупок и Минюста.",
|
||||||
"anti-corruption_education": "Антикоррупционное просвещение населения, повышение общественного осознания значимости и важности борьбы с коррупцией в Кыргызстане;",
|
"description4":"Помимо веб-платформы имеются два мобильных приложения для платформ iOS и Android с функциями, аналогичными веб-сайту."
|
||||||
"study_of_corruption_practices": "Организация изучения практики и теории борьбы с коррупцией и участия в ней структур гражданского общества в Кыргызстане и других странах;",
|
|
||||||
"supporting_citizens_and_organizations": "Содействие гражданам и организациям в реализации их конституционных прав и свобод;",
|
|
||||||
"international_experience": "Преимущественная ориентация на международный опыт уменьшения коррупции, освоение его технологий, ресурсов, а также включение структур гражданского общества в международный диалог борьбы с коррупцией."
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"volunteers": {
|
"volunteers": {
|
||||||
"activists": "Активисты",
|
"activists": "Активисты",
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
"@next/third-parties": "^14.1.0",
|
"@next/third-parties": "^14.1.0",
|
||||||
"axios": "^1.6.5",
|
"axios": "^1.6.5",
|
||||||
"dotenv": "^16.4.1",
|
"dotenv": "^16.4.1",
|
||||||
|
"html-react-parser": "^5.1.15",
|
||||||
"leaflet": "^1.9.4",
|
"leaflet": "^1.9.4",
|
||||||
"next": "^14.1.0",
|
"next": "^14.1.0",
|
||||||
"next-auth": "^4.24.5",
|
"next-auth": "^4.24.5",
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
.app {
|
// .app {
|
||||||
padding-top: 78px;
|
// padding-top: 78px;
|
||||||
}
|
// }
|
||||||
|
|
||||||
@media screen and (max-width: 768px) {
|
// @media screen and (max-width: 768px) {
|
||||||
.app {
|
// .app {
|
||||||
padding-top: 72px;
|
// padding-top: 72px;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
@@ -4,7 +4,7 @@ import { Metadata } from "next";
|
|||||||
import BreadCrumbs from "@/features/BreadCrumbs/BreadCrumbs";
|
import BreadCrumbs from "@/features/BreadCrumbs/BreadCrumbs";
|
||||||
import { apiInstance } from "@/shared/config/apiConfig";
|
import { apiInstance } from "@/shared/config/apiConfig";
|
||||||
import { IMetatag } from "@/shared/types/metatag-type";
|
import { IMetatag } from "@/shared/types/metatag-type";
|
||||||
|
import { useTranslations } from "next-intl";
|
||||||
export async function generateMetadata(): Promise<Metadata> {
|
export async function generateMetadata(): Promise<Metadata> {
|
||||||
const data = await apiInstance
|
const data = await apiInstance
|
||||||
.get<IMetatag[]>("/metatags/")
|
.get<IMetatag[]>("/metatags/")
|
||||||
@@ -50,51 +50,20 @@ export async function generateMetadata(): Promise<Metadata> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const AboutUs = () => {
|
const AboutUs = () => {
|
||||||
|
const t = useTranslations("about_us");
|
||||||
return (
|
return (
|
||||||
<div className="about-us page-padding">
|
<div className="about-us page-padding">
|
||||||
<BreadCrumbs homeRequired />
|
<BreadCrumbs homeRequired />
|
||||||
<Typography element="h2">О нас</Typography>
|
<Typography element="h2">{t("name")}</Typography>
|
||||||
|
|
||||||
<div className="about-us__descriptions">
|
<div className="about-us__descriptions">
|
||||||
<h3>
|
<h3>
|
||||||
Transparency International-Кыргызстан - филиал международной
|
{t("description1")}
|
||||||
организации Transparency International в Кыргызской
|
|
||||||
Республике.
|
|
||||||
</h3>
|
</h3>
|
||||||
<h3>Миссия ТИ-Кыргызстан</h3>
|
<h3>{t("description2")}
|
||||||
<p>
|
{t("description3")}</h3>
|
||||||
Продвижение эффективной общественной политики и надлежащего
|
<h3>{t("description4")}</h3>
|
||||||
управления в целях предотвращения коррупции и усиления
|
|
||||||
демократии в стране.{" "}
|
|
||||||
</p>
|
|
||||||
<h3>Цели и приоритеты ТИ-Кыргызстан:</h3>
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
- антикоррупционное просвещение населения, повышение
|
|
||||||
общественного осознания значимости и важности борьбы с
|
|
||||||
коррупцией в Кыргызстане;
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
- организация изучения практики и теории борьбы с
|
|
||||||
коррупцией и участия в ней структур гражданского общества
|
|
||||||
в Кыргызстане и других странах;
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
- содействие гражданам и организациям в реализации их
|
|
||||||
конституционных прав и свобод;
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
- преимущественная ориентация на международный опыт
|
|
||||||
уменьшения коррупции, освоение его технологий, ресурсов, а
|
|
||||||
также включение структур гражданского общества в
|
|
||||||
международный диалог борьбы с коррупцией.
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
</div>
|
||||||
<p className="about-us__author">
|
|
||||||
Photo By Mzximvs VdB from Brussels, belgium - Road to
|
|
||||||
Issyk-Kul (south shore), CC BY-SA 2.0
|
|
||||||
</p>
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -17,10 +17,7 @@ export default function LocaleLayout({
|
|||||||
return (
|
return (
|
||||||
<html lang={params.locale}>
|
<html lang={params.locale}>
|
||||||
<body>
|
<body>
|
||||||
<NextIntlClientProvider
|
<NextIntlClientProvider locale={params.locale} messages={messages}>
|
||||||
locale={params.locale}
|
|
||||||
messages={messages}
|
|
||||||
>
|
|
||||||
<Providers>
|
<Providers>
|
||||||
<Navbar />
|
<Navbar />
|
||||||
<div className="app">{children}</div>
|
<div className="app">{children}</div>
|
||||||
|
|||||||
@@ -8,15 +8,14 @@ import calendar from "./icons/calendar.svg";
|
|||||||
import ReviewSection from "@/widgets/ReviewSection/ReviewSection";
|
import ReviewSection from "@/widgets/ReviewSection/ReviewSection";
|
||||||
import BreadCrumbs from "@/features/BreadCrumbs/BreadCrumbs";
|
import BreadCrumbs from "@/features/BreadCrumbs/BreadCrumbs";
|
||||||
import { Metadata } from "next";
|
import { Metadata } from "next";
|
||||||
|
import parse from "html-react-parser";
|
||||||
|
|
||||||
export async function generateMetadata({
|
export async function generateMetadata({
|
||||||
params,
|
params,
|
||||||
}: {
|
}: {
|
||||||
params: { id: string };
|
params: { id: string };
|
||||||
}): Promise<Metadata> {
|
}): Promise<Metadata> {
|
||||||
const response = await apiInstance.get<INews>(
|
const response = await apiInstance.get<INews>(`/news/${params.id}/`);
|
||||||
`/news/${params.id}/`
|
|
||||||
);
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
title: response.data.title,
|
title: response.data.title,
|
||||||
@@ -28,6 +27,17 @@ export async function generateMetadata({
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
function convertLinksToHtml(text: string) {
|
||||||
|
const urlPattern =
|
||||||
|
/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|$!:,.;]*[-A-Z0-9+&@#\/%=~_|$])[\s.,;]?/gi;
|
||||||
|
return text.replace(urlPattern, (url) => {
|
||||||
|
const href = url.trim();
|
||||||
|
return `<a href="${href}" target="_blank" rel="noopener noreferrer">${href}</a>`;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
const formatDescription = (text: string) => {
|
||||||
|
return text.replace(/(\r\n|\n|\r)/g, "<br />");
|
||||||
|
};
|
||||||
|
|
||||||
const NewsDetails = async ({
|
const NewsDetails = async ({
|
||||||
params,
|
params,
|
||||||
@@ -35,9 +45,7 @@ const NewsDetails = async ({
|
|||||||
params: { id: string; новость: string };
|
params: { id: string; новость: string };
|
||||||
}) => {
|
}) => {
|
||||||
const getNewsById = async () => {
|
const getNewsById = async () => {
|
||||||
const response = await apiInstance.get<INews>(
|
const response = await apiInstance.get<INews>(`/news/${params.id}/`);
|
||||||
`/news/${params.id}/`
|
|
||||||
);
|
|
||||||
|
|
||||||
return response.data;
|
return response.data;
|
||||||
};
|
};
|
||||||
@@ -58,7 +66,8 @@ const NewsDetails = async ({
|
|||||||
"11": "Ноябрь",
|
"11": "Ноябрь",
|
||||||
"12": "Декабрь",
|
"12": "Декабрь",
|
||||||
};
|
};
|
||||||
|
const htmlContentWithLinks = convertLinksToHtml(data.description);
|
||||||
|
const formattedHtmlContent = formatDescription(htmlContentWithLinks);
|
||||||
return (
|
return (
|
||||||
<div className="news-details page-padding">
|
<div className="news-details page-padding">
|
||||||
<BreadCrumbs />
|
<BreadCrumbs />
|
||||||
@@ -71,9 +80,9 @@ const NewsDetails = async ({
|
|||||||
<Image src={calendar} alt="Calendar Icon" />
|
<Image src={calendar} alt="Calendar Icon" />
|
||||||
<p>
|
<p>
|
||||||
{months[data.created_at.slice(5, 7)]}{" "}
|
{months[data.created_at.slice(5, 7)]}{" "}
|
||||||
{data.created_at.slice(5, 7).slice(0, 1) === "0"
|
{data.created_at.slice(8, 10) === "0"
|
||||||
? data.created_at.slice(6, 7)
|
? data.created_at.slice(9, 10)
|
||||||
: data.created_at.slice(5, 7)}
|
: data.created_at.slice(8, 10)}
|
||||||
, {data.created_at.slice(0, 4)}
|
, {data.created_at.slice(0, 4)}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
@@ -87,7 +96,9 @@ const NewsDetails = async ({
|
|||||||
|
|
||||||
<div className="news-details__text">
|
<div className="news-details__text">
|
||||||
<h3>{data.title}</h3>
|
<h3>{data.title}</h3>
|
||||||
<p>{data.description}</p>
|
<div className="news-details__description">
|
||||||
|
{parse(formattedHtmlContent)}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<ReviewSection endpoint="news" id={data.id} />
|
<ReviewSection endpoint="news" id={data.id} />
|
||||||
|
|||||||
@@ -29,10 +29,7 @@ const NewsCard: React.FC<INewsCard> = ({
|
|||||||
return title;
|
return title;
|
||||||
};
|
};
|
||||||
const sliceDate = (date: string) => {
|
const sliceDate = (date: string) => {
|
||||||
return `${date.slice(8, 10)}/${date.slice(5, 7)}/${date.slice(
|
return `${date.slice(8, 10)}/${date.slice(5, 7)}/${date.slice(0, 4)}`;
|
||||||
0,
|
|
||||||
4
|
|
||||||
)}`;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const sliceDescription = (description: string) => {
|
const sliceDescription = (description: string) => {
|
||||||
|
|||||||
@@ -25,6 +25,7 @@
|
|||||||
|
|
||||||
img {
|
img {
|
||||||
width: 50px;
|
width: 50px;
|
||||||
|
height: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
input {
|
input {
|
||||||
|
|||||||
@@ -5,8 +5,7 @@ import Image from "next/image";
|
|||||||
import search from "./icons/search.svg";
|
import search from "./icons/search.svg";
|
||||||
import { useTranslations } from "next-intl";
|
import { useTranslations } from "next-intl";
|
||||||
|
|
||||||
interface ISearchFormProps
|
interface ISearchFormProps extends React.InputHTMLAttributes<HTMLInputElement> {
|
||||||
extends React.InputHTMLAttributes<HTMLInputElement> {
|
|
||||||
handleSubmit: (e: React.MouseEvent<HTMLFormElement>) => void;
|
handleSubmit: (e: React.MouseEvent<HTMLFormElement>) => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -20,11 +19,7 @@ const SearchForm: React.FC<ISearchFormProps> = ({
|
|||||||
}: ISearchFormProps) => {
|
}: ISearchFormProps) => {
|
||||||
const t = useTranslations("general");
|
const t = useTranslations("general");
|
||||||
return (
|
return (
|
||||||
<form
|
<form style={style} className="search-form" onSubmit={handleSubmit}>
|
||||||
style={style}
|
|
||||||
className="search-form"
|
|
||||||
onSubmit={handleSubmit}
|
|
||||||
>
|
|
||||||
<div className="search-form__input">
|
<div className="search-form__input">
|
||||||
<Image src={search} alt="Search Icon" />
|
<Image src={search} alt="Search Icon" />
|
||||||
<input
|
<input
|
||||||
|
|||||||
@@ -7,10 +7,10 @@ export const LINKS = () => {
|
|||||||
{ id: 1, pagename: t("home"), pathname: "/" },
|
{ id: 1, pagename: t("home"), pathname: "/" },
|
||||||
{ id: 2, pagename: t("about_us"), pathname: "/about-us" },
|
{ id: 2, pagename: t("about_us"), pathname: "/about-us" },
|
||||||
{ id: 3, pagename: t("privacy"), pathname: "/privacy" },
|
{ id: 3, pagename: t("privacy"), pathname: "/privacy" },
|
||||||
{ id: 3, pagename: t("support"), pathname: "/support" },
|
{ id: 4, pagename: t("support"), pathname: "/support" },
|
||||||
{ id: 4, pagename: t("statistics"), pathname: "/statistics" },
|
{ id: 5, pagename: t("statistics"), pathname: "/statistics" },
|
||||||
{ id: 5, pagename: t("news"), pathname: "/news" },
|
{ id: 6, pagename: t("news"), pathname: "/news" },
|
||||||
{ id: 6, pagename: t("volunteers"), pathname: "/volunteers" },
|
{ id: 7, pagename: t("volunteers"), pathname: "/volunteers" },
|
||||||
];
|
];
|
||||||
|
|
||||||
return LINKS;
|
return LINKS;
|
||||||
|
|||||||
@@ -9,7 +9,8 @@ import app_store_btn from "./icons/app-store-btn.svg";
|
|||||||
import play_market_btn from "./icons/play-market-btn.svg";
|
import play_market_btn from "./icons/play-market-btn.svg";
|
||||||
import { Link } from "@/shared/config/navigation";
|
import { Link } from "@/shared/config/navigation";
|
||||||
import { useTranslations } from "next-intl";
|
import { useTranslations } from "next-intl";
|
||||||
import NetKgTracker from "@/widgets/NetKgTracker/NetKgTracker";
|
//import NetKgTracker from "@/widgets/NetKgTracker/NetKgTracker";
|
||||||
|
//import GoogleAnalyticsWidget from "@/widgets/GoogleAnalyticsWidget/GoogleAnalyticsWidget";
|
||||||
|
|
||||||
const Footer = () => {
|
const Footer = () => {
|
||||||
const t = useTranslations("general");
|
const t = useTranslations("general");
|
||||||
@@ -18,9 +19,9 @@ const Footer = () => {
|
|||||||
return (
|
return (
|
||||||
<footer className="footer">
|
<footer className="footer">
|
||||||
<div className="footer__logo">
|
<div className="footer__logo">
|
||||||
<Link href="/">
|
{/* <Link href="/">
|
||||||
<Image src={logo} alt="Logo" />
|
<Image src={logo} alt="Logo" />
|
||||||
</Link>
|
</Link> */}
|
||||||
<p>© {tRights("text")}</p>
|
<p>© {tRights("text")}</p>
|
||||||
<p>{tDisclaimer("text")}</p>
|
<p>{tDisclaimer("text")}</p>
|
||||||
</div>
|
</div>
|
||||||
@@ -29,13 +30,16 @@ const Footer = () => {
|
|||||||
<ul>
|
<ul>
|
||||||
{LINKS().map((link) => (
|
{LINKS().map((link) => (
|
||||||
<li key={link.id}>
|
<li key={link.id}>
|
||||||
<Link href={link.pathname} key={link.id}>
|
<Link href={link.pathname}>{link.pagename}</Link>
|
||||||
{link.pagename}
|
|
||||||
</Link>
|
|
||||||
</li>
|
</li>
|
||||||
))}
|
))}
|
||||||
</ul>
|
</ul>
|
||||||
<NetKgTracker />
|
{/* Only for production
|
||||||
|
<NetKgTracker />*/}
|
||||||
|
<div className="footer__logo">
|
||||||
|
{/* <GoogleAnalyticsWidget /> */} {/* hide total amount*/}
|
||||||
|
</div>
|
||||||
|
*
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="footer__contacts">
|
<div className="footer__contacts">
|
||||||
@@ -45,12 +49,17 @@ const Footer = () => {
|
|||||||
<li>+9960312394038</li>
|
<li>+9960312394038</li>
|
||||||
|
|
||||||
<li>
|
<li>
|
||||||
{[youtube, facebook, instagram].map((net, i) => (
|
{[
|
||||||
<Link key={i} href="#">
|
{ src: youtube, url: "https://www.youtube.com/@TransparencyKyrgyzstan" },
|
||||||
<Image src={net} alt="Net Icon" key={net} />
|
{ src: facebook, url: "https://www.facebook.com/tikyrgyzstan" },
|
||||||
|
{ src: instagram, url: "https://www.instagram.com/transparencyinternational_kg?igsh=cTc2MHEwOW5vNDh2" }
|
||||||
|
].map((net, i) => (
|
||||||
|
<Link key={i} href={net.url} target="_blank" rel="noopener noreferrer">
|
||||||
|
<Image src={net.src} alt="Net Icon" />
|
||||||
</Link>
|
</Link>
|
||||||
))}
|
))}
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li>Photo By ThomasG, CC BY-SA 3.0</li>
|
<li>Photo By ThomasG, CC BY-SA 3.0</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
@@ -58,12 +67,16 @@ const Footer = () => {
|
|||||||
<div className="footer__apps">
|
<div className="footer__apps">
|
||||||
<h4>{t("download_our_app")}</h4>
|
<h4>{t("download_our_app")}</h4>
|
||||||
<div className="footer__apps-btns">
|
<div className="footer__apps-btns">
|
||||||
{[app_store_btn, play_market_btn].map((app, i) => (
|
{[
|
||||||
<Link key={i} href="#">
|
{ src: app_store_btn, url: "https://play.google.com/store/apps/details?id=fishrungames.kgroad" },
|
||||||
<Image src={app} alt="App Button" key={app} />
|
{ src: play_market_btn, url: "https://apps.apple.com/us/app/kg-road/id6484317991" }
|
||||||
|
].map((app, i) => (
|
||||||
|
<Link key={i} href={app.url} target="_blank" rel="noopener noreferrer">
|
||||||
|
<Image src={app.src} alt="App Button" />
|
||||||
</Link>
|
</Link>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -0,0 +1,44 @@
|
|||||||
|
'use client'
|
||||||
|
import React, { useEffect, useState, useCallback } from 'react';
|
||||||
|
import { apiInstance } from "@/shared/config/apiConfig";
|
||||||
|
import { AxiosError } from "axios";
|
||||||
|
|
||||||
|
const GoogleAnalyticsWidget = () => {
|
||||||
|
|
||||||
|
const [visitors, setVisitors] = useState<string>("");
|
||||||
|
|
||||||
|
/* const getAnalytics = async () => {
|
||||||
|
try {
|
||||||
|
const response = await apiInstance.get("/report/google_analytics/");
|
||||||
|
return response.data;
|
||||||
|
} catch (error: unknown) {
|
||||||
|
if (error instanceof AxiosError) console.log(error.message);
|
||||||
|
}
|
||||||
|
};*/
|
||||||
|
|
||||||
|
//const data = await getAnalytics();
|
||||||
|
|
||||||
|
const fetchMyAPI = useCallback(async () => {
|
||||||
|
const getAnalytics = async () => {
|
||||||
|
try {
|
||||||
|
const response = await apiInstance.get("/report/google_analytics/");
|
||||||
|
return response.data;
|
||||||
|
} catch (error: unknown) {
|
||||||
|
if (error instanceof AxiosError) console.log(error.message);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const data = await getAnalytics();
|
||||||
|
setVisitors(data.visitors);
|
||||||
|
}, [visitors])
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
fetchMyAPI();
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div><p>Total cummulative visitors: {visitors}</p></div>
|
||||||
|
)
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
export default GoogleAnalyticsWidget;
|
||||||
@@ -2,12 +2,30 @@
|
|||||||
|
|
||||||
.nav-auth-profile-lg,
|
.nav-auth-profile-lg,
|
||||||
.nav-auth-signin-lg {
|
.nav-auth-signin-lg {
|
||||||
width: fit-content;
|
// width: fit-content;
|
||||||
padding: 8px 16px;
|
// padding: 8px 16px;
|
||||||
background-color: $light-blue;
|
// background-color: $light-blue;
|
||||||
border-radius: 5px;
|
// border-radius: 5px;
|
||||||
font-weight: 900;
|
// font-weight: 900;
|
||||||
|
// color: white;
|
||||||
|
|
||||||
|
background-color: white;
|
||||||
|
color: #3695d8;
|
||||||
|
border-color: #3695d8;
|
||||||
|
border: 3px solid #3695d8;
|
||||||
|
padding-top: 12px;
|
||||||
|
padding-right: 20px;
|
||||||
|
padding-bottom: 12px;
|
||||||
|
padding-left: 20px;
|
||||||
|
border-radius: 15px;
|
||||||
|
cursor: pointer;
|
||||||
|
font-weight: 600;
|
||||||
|
transition: background-color 0.3s, color 0.3s;
|
||||||
|
|
||||||
|
&:hover{
|
||||||
|
background-color: #3695d8;
|
||||||
color: white;
|
color: white;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-auth-profile-sm,
|
.nav-auth-profile-sm,
|
||||||
@@ -20,3 +38,18 @@
|
|||||||
width: fit-content;
|
width: fit-content;
|
||||||
color: $light-blue;
|
color: $light-blue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.appeal-btn {
|
||||||
|
background-color: white;
|
||||||
|
color: #3695d8;
|
||||||
|
border-color: #3695d8;
|
||||||
|
border: 3px solid #3695d8;
|
||||||
|
padding-top: 12px;
|
||||||
|
padding-right: 20px;
|
||||||
|
padding-bottom: 12px;
|
||||||
|
padding-left: 20px;
|
||||||
|
border-radius: 15px;
|
||||||
|
cursor: pointer;
|
||||||
|
font-weight: 600;
|
||||||
|
transition: background-color 0.3s, color 0.3s;
|
||||||
|
}
|
||||||
@@ -10,6 +10,7 @@
|
|||||||
min-width: 130px;
|
min-width: 130px;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 120%;
|
top: 120%;
|
||||||
|
z-index: 9;
|
||||||
}
|
}
|
||||||
|
|
||||||
&__option,
|
&__option,
|
||||||
|
|||||||
@@ -1,9 +1,6 @@
|
|||||||
"use client";
|
|
||||||
|
|
||||||
import "./NavLanguage.scss";
|
import "./NavLanguage.scss";
|
||||||
import Image from "next/image";
|
import Image from "next/image";
|
||||||
import { useEffect, useRef, useState, useTransition } from "react";
|
import { useEffect, useRef, useState, useTransition } from "react";
|
||||||
import globus from "./icons/globus.svg";
|
|
||||||
import chevron from "./icons/chevron-down.svg";
|
import chevron from "./icons/chevron-down.svg";
|
||||||
import check from "./icons/check.svg";
|
import check from "./icons/check.svg";
|
||||||
import { useParams, useRouter } from "next/navigation";
|
import { useParams, useRouter } from "next/navigation";
|
||||||
@@ -32,10 +29,7 @@ const NavLanguage = () => {
|
|||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
function handleClickOutside(event: any) {
|
function handleClickOutside(event: any) {
|
||||||
if (
|
if (menuRef.current && !menuRef.current.contains(event.target)) {
|
||||||
menuRef.current &&
|
|
||||||
!menuRef.current.contains(event.target)
|
|
||||||
) {
|
|
||||||
setOpenMenu(false);
|
setOpenMenu(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -47,11 +41,18 @@ const NavLanguage = () => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div ref={menuRef} className="nav-language">
|
<div ref={menuRef} className="nav-language">
|
||||||
|
{/* <button
|
||||||
|
onClick={() => setOpenMenu((prev) => !prev)}
|
||||||
|
className="nav-language__btn"
|
||||||
|
> */}
|
||||||
|
{/* <Image src={globus} alt="globus icon" /> */}
|
||||||
<button
|
<button
|
||||||
onClick={() => setOpenMenu((prev) => !prev)}
|
onClick={() => setOpenMenu((prev) => !prev)}
|
||||||
className="nav-language__btn"
|
className="nav-language__btn"
|
||||||
>
|
>
|
||||||
<Image src={globus} alt="globus icon" />
|
{language === "ru" && <span>Рус</span>}
|
||||||
|
{language === "kg" && <span>Кырг</span>}
|
||||||
|
{language === "en" && <span>Eng</span>}
|
||||||
<Image src={chevron} alt="chevron icon" />
|
<Image src={chevron} alt="chevron icon" />
|
||||||
</button>
|
</button>
|
||||||
{openMenu && (
|
{openMenu && (
|
||||||
|
|||||||
@@ -1,15 +1,13 @@
|
|||||||
@import "../../shared/ui/variables.scss";
|
@import "../../shared/ui/variables.scss";
|
||||||
|
|
||||||
.navbar {
|
.navbar {
|
||||||
padding: 0 90px;
|
padding: 15px 90px;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 78px;
|
|
||||||
position: fixed;
|
|
||||||
z-index: 10005;
|
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
|
box-shadow: 0 4px 6px #0000001a;
|
||||||
|
|
||||||
&__logo {
|
&__logo {
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -17,9 +15,16 @@
|
|||||||
gap: 10px;
|
gap: 10px;
|
||||||
|
|
||||||
&_last {
|
&_last {
|
||||||
min-width: 78px;
|
// min-width: 78px;
|
||||||
max-width: 78px;
|
// max-width: 78px;
|
||||||
height: 100%;
|
// height: 100%;
|
||||||
|
|
||||||
|
margin-top: 30px;
|
||||||
|
height: 120px;
|
||||||
|
width: 120px;
|
||||||
|
display: inline-block;
|
||||||
|
margin-right: 10px;
|
||||||
|
object-fit: cover;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -39,8 +44,8 @@
|
|||||||
|
|
||||||
&__link_active {
|
&__link_active {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
font-weight: 900;
|
font-weight: 800;
|
||||||
border-bottom: 2px solid black;
|
// border-bottom: 2px solid black;
|
||||||
}
|
}
|
||||||
|
|
||||||
&__lang-and-auth {
|
&__lang-and-auth {
|
||||||
@@ -60,7 +65,7 @@
|
|||||||
|
|
||||||
@media screen and (max-width: 1220px) {
|
@media screen and (max-width: 1220px) {
|
||||||
.navbar {
|
.navbar {
|
||||||
padding: 0 60px;
|
// padding: 0 60px;
|
||||||
|
|
||||||
&__links {
|
&__links {
|
||||||
gap: 40px;
|
gap: 40px;
|
||||||
|
|||||||
@@ -32,13 +32,14 @@ const Navbar = () => {
|
|||||||
<section className="navbar">
|
<section className="navbar">
|
||||||
<div className="navbar__logo">
|
<div className="navbar__logo">
|
||||||
<Link href="/">
|
<Link href="/">
|
||||||
<Image src={logo} alt="Logo" />
|
<Image src={logo} alt="Logo" className="navbar__logo-ti" />
|
||||||
</Link>
|
</Link>
|
||||||
<Image
|
<Image
|
||||||
className="navbar__logo_last"
|
className="navbar__logo_last"
|
||||||
src={FOUNDED[locale as string]}
|
src={FOUNDED[locale as string]}
|
||||||
alt="Founded by EU Image"
|
alt="Founded by EU Image"
|
||||||
/>
|
/>
|
||||||
|
<NavLanguage />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<nav className="navbar__links">
|
<nav className="navbar__links">
|
||||||
@@ -56,7 +57,6 @@ const Navbar = () => {
|
|||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
<div className="navbar__lang-and-auth">
|
<div className="navbar__lang-and-auth">
|
||||||
<NavLanguage />
|
|
||||||
<NavAuth setOpenMenu={setOpenMenu} />
|
<NavAuth setOpenMenu={setOpenMenu} />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ import { apiInstance } from "@/shared/config/apiConfig";
|
|||||||
import { useSession } from "next-auth/react";
|
import { useSession } from "next-auth/react";
|
||||||
import { IDisplayMap } from "@/shared/types/map-type";
|
import { IDisplayMap } from "@/shared/types/map-type";
|
||||||
import Loader from "@/shared/ui/components/Loader/Loader";
|
import Loader from "@/shared/ui/components/Loader/Loader";
|
||||||
import { useRouter } from "@/shared/config/navigation";
|
|
||||||
import ReportMessage from "@/features/ReportMessage/ReportMessage";
|
import ReportMessage from "@/features/ReportMessage/ReportMessage";
|
||||||
|
|
||||||
interface ILatLng {
|
interface ILatLng {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
.header {
|
.header {
|
||||||
position: relative;
|
position: relative;
|
||||||
height: 386px;
|
height: 500px;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
.home-map {
|
.home-map {
|
||||||
width: 100%;
|
width: 88%;
|
||||||
height: 580px;
|
height: 580px;
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
|
|
||||||
|
|||||||
@@ -40,9 +40,7 @@ interface IHomeMapProps {
|
|||||||
reports: IData[];
|
reports: IData[];
|
||||||
}
|
}
|
||||||
|
|
||||||
const HomeMap: React.FC<IHomeMapProps> = ({
|
const HomeMap: React.FC<IHomeMapProps> = ({ reports }: IHomeMapProps) => {
|
||||||
reports,
|
|
||||||
}: IHomeMapProps) => {
|
|
||||||
const { display_location, latLng } = useMapStore();
|
const { display_location, latLng } = useMapStore();
|
||||||
const [position, setPosition] = useState<ILatLng>({
|
const [position, setPosition] = useState<ILatLng>({
|
||||||
lat: 42.8746,
|
lat: 42.8746,
|
||||||
@@ -95,10 +93,7 @@ const HomeMap: React.FC<IHomeMapProps> = ({
|
|||||||
lng: 74.606,
|
lng: 74.606,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (
|
if (latLng.lat === defPosition.lat && latLng.lng === defPosition.lng)
|
||||||
latLng.lat === defPosition.lat &&
|
|
||||||
latLng.lng === defPosition.lng
|
|
||||||
)
|
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -112,7 +107,7 @@ const HomeMap: React.FC<IHomeMapProps> = ({
|
|||||||
<MapContainer
|
<MapContainer
|
||||||
center={position}
|
center={position}
|
||||||
zoom={14}
|
zoom={14}
|
||||||
scrollWheelZoom={false}
|
scrollWheelZoom={true}
|
||||||
className="home-map"
|
className="home-map"
|
||||||
>
|
>
|
||||||
<TileLayer
|
<TileLayer
|
||||||
@@ -144,14 +139,10 @@ const HomeMap: React.FC<IHomeMapProps> = ({
|
|||||||
<Marker
|
<Marker
|
||||||
key={marker.id}
|
key={marker.id}
|
||||||
icon={icons[report.category]}
|
icon={icons[report.category]}
|
||||||
position={
|
position={[+marker.latitude, +marker.longitude] as LatLngTuple}
|
||||||
[+marker.latitude, +marker.longitude] as LatLngTuple
|
|
||||||
}
|
|
||||||
>
|
>
|
||||||
<Popup>
|
<Popup>
|
||||||
<Link href={`/report/${report?.id}`}>
|
<Link href={`/report/${report?.id}`}>{marker.address}</Link>
|
||||||
{marker.address}
|
|
||||||
</Link>
|
|
||||||
</Popup>
|
</Popup>
|
||||||
</Marker>
|
</Marker>
|
||||||
))
|
))
|
||||||
|
|||||||
Reference in new issue
Block a user