);
diff --git a/src/shared/components/promotion-slider.tsx b/src/shared/components/promotion-slider.tsx
index 3a25dd5..b5bc7d4 100644
--- a/src/shared/components/promotion-slider.tsx
+++ b/src/shared/components/promotion-slider.tsx
@@ -1,13 +1,13 @@
'use client';
-import { ChevronLeft, ChevronRight} from 'lucide-react';
+import { ChevronLeft, ChevronRight } from 'lucide-react';
import Image from 'next/image';
+import Link from 'next/link';
import { useEffect, useState } from 'react';
+import { useTextController } from '@/shared/language/hooks/use-text-controller';
import { Button } from '@/shared/shadcn-ui/button';
import { Card, CardContent } from '@/shared/shadcn-ui/card';
-import Link from 'next/link';
-import { useLanguage } from '../language';
const promotions = [
{
@@ -45,7 +45,7 @@ export default function PromotionSlider() {
const [currentIndex, setCurrentIndex] = useState(0);
const [visibleItems, setVisibleItems] = useState(3);
- const { t } = useLanguage()
+ const { t } = useTextController();
useEffect(() => {
const handleResize = () => {
@@ -110,15 +110,15 @@ export default function PromotionSlider() {
Действует до: {promo.validUntil}
-
-
diff --git a/src/shared/components/submit-button.tsx b/src/shared/components/submit-button.tsx
index 05df229..2f4e0fa 100644
--- a/src/shared/components/submit-button.tsx
+++ b/src/shared/components/submit-button.tsx
@@ -2,10 +2,9 @@
import { Loader2Icon } from 'lucide-react';
+import { useTextController } from '@/shared/language/hooks/use-text-controller';
import { Button, type ButtonProps } from '@/shared/shadcn-ui/button';
-import { useLanguage } from '../language';
-
interface SubmitButtonProps extends ButtonProps {
title?: string;
isLoading: boolean;
@@ -21,7 +20,7 @@ export const SubmitButton = ({
onClick,
...props
}: SubmitButtonProps) => {
- const { t } = useLanguage();
+ const { t } = useTextController();
return (
({
+ fetchText: builder.query({
+ query: () => '/text',
+ }),
+ }),
+});
+
+export const { useFetchTextQuery } = textControlApi;
diff --git a/src/shared/language/context/language-provider.tsx b/src/shared/language/context/language-provider.tsx
deleted file mode 100644
index de3e7c9..0000000
--- a/src/shared/language/context/language-provider.tsx
+++ /dev/null
@@ -1,73 +0,0 @@
-'use client';
-
-import { createContext, type ReactNode, useEffect, useState } from 'react';
-
-import enTranslations from '../locales/en.json';
-import ruTranslations from '../locales/ru.json';
-
-// Define available languages
-export const languages = {
- en: { name: 'English', flag: '🇬🇧' },
- ru: { name: 'Русский', flag: '🇷🇺' },
-};
-
-export type Language = keyof typeof languages;
-
-// Define translations type with flat structure
-export type Translations = Record;
-
-// Load translations
-const translations: Record = {
- en: enTranslations,
- ru: ruTranslations,
-};
-
-// Create context
-type LanguageContextType = {
- language: Language;
- setLanguage: (lang: Language) => void;
- t: (key: string) => string;
-};
-
-export const LanguageContext = createContext(
- undefined,
-);
-
-// Create provider
-export function LanguageProvider({ children }: { children: ReactNode }) {
- // Default to Russian, but check localStorage on client
- const [language, setLanguageState] = useState('ru');
-
- useEffect(() => {
- // Check if we're in the browser
- if (typeof window !== 'undefined') {
- const savedLanguage = localStorage.getItem('language') as Language;
- if (savedLanguage && languages[savedLanguage]) {
- setLanguageState(savedLanguage);
- }
- }
- }, []);
-
- const setLanguage = (lang: Language) => {
- setLanguageState(lang);
- if (typeof window !== 'undefined') {
- localStorage.setItem('language', lang);
- }
- };
-
- // Translation function for flat structure
- const t = (key: string): string => {
- if (translations[language][key]) {
- return translations[language][key];
- }
-
- console.warn(`Translation key not found: ${key}`);
- return key;
- };
-
- return (
-
- {children}
-
- );
-}
diff --git a/src/shared/language/context/text-control-provider.tsx b/src/shared/language/context/text-control-provider.tsx
new file mode 100644
index 0000000..0e3e4af
--- /dev/null
+++ b/src/shared/language/context/text-control-provider.tsx
@@ -0,0 +1,49 @@
+import { createContext, type ReactNode } from 'react';
+
+import { TextItem } from '@/shared/types/text.types';
+
+export type Translations = Record;
+
+// Create context
+type TextControlContextType = {
+ t: (key: string) => string;
+};
+
+export const TextControlContext = createContext<
+ TextControlContextType | undefined
+>(undefined);
+
+// Create provider
+
+export function TextControlProvider({
+ children,
+ textItems,
+}: {
+ children: ReactNode;
+ textItems: TextItem[];
+}) {
+ const textMap = textItems.reduce(
+ (pr, cr) => {
+ pr[cr.key] = cr.value;
+
+ return pr;
+ },
+ {} as Record,
+ );
+
+ // Translation function for flat structure
+ const t = (key: string): string => {
+ if (textMap[key]) {
+ return textMap[key];
+ }
+
+ console.warn(`Translation key not found: ${key}`);
+ return key;
+ };
+
+ return (
+
+ {children}
+
+ );
+}
diff --git a/src/shared/language/hooks/use-language.ts b/src/shared/language/hooks/use-text-controller.ts
similarity index 65%
rename from src/shared/language/hooks/use-language.ts
rename to src/shared/language/hooks/use-text-controller.ts
index 6473281..c519e2e 100644
--- a/src/shared/language/hooks/use-language.ts
+++ b/src/shared/language/hooks/use-text-controller.ts
@@ -2,10 +2,10 @@
import { useContext } from 'react';
-import { LanguageContext } from '../context/language-provider';
+import { TextControlContext } from '../context/text-control-provider';
-export function useLanguage() {
- const context = useContext(LanguageContext);
+export function useTextController() {
+ const context = useContext(TextControlContext);
if (context === undefined) {
throw new Error('useLanguage must be used within a LanguageProvider');
}
diff --git a/src/shared/language/index.ts b/src/shared/language/index.ts
index 35d8d88..b0ead61 100644
--- a/src/shared/language/index.ts
+++ b/src/shared/language/index.ts
@@ -1,6 +1,2 @@
-export {
- LanguageProvider,
- languages,
- type Language,
-} from './context/language-provider';
-export { useLanguage } from './hooks/use-language';
+export { TextControlProvider } from './context/text-control-provider';
+export { useTextController } from './hooks/use-text-controller';
diff --git a/src/shared/language/locales/en.json b/src/shared/language/locales/en.json
deleted file mode 100644
index 3256384..0000000
--- a/src/shared/language/locales/en.json
+++ /dev/null
@@ -1,108 +0,0 @@
-{
- "common.buttons.readMore": "Read More",
- "common.buttons.findStation": "Find Station",
- "common.buttons.learnMore": "Learn More",
- "common.buttons.download": "Download",
- "common.buttons.view": "View",
- "common.buttons.contactUs": "Contact Us",
- "common.buttons.apply": "Apply",
- "common.buttons.login": "Login",
- "common.buttons.logout": "Logout",
- "common.buttons.submit": "Submit",
- "common.buttons.filter": "Filter",
- "common.buttons.resetFilters": "Reset Filters",
- "common.buttons.downloadApp": "Download App",
- "common.buttons.purchaseCardAtGasStations": "Purchase a card at gas stations",
- "common.buttons.sendResume": "Send Resume",
- "common.buttons.showAllStations": "Show All Stations",
- "common.buttons.allPromotions": "All Promotions",
-
- "common.navigation.home": "Home",
- "common.navigation.about": "About Us",
- "common.navigation.clients": "For Clients",
- "common.navigation.stations": "Our Stations",
- "common.navigation.vacancies": "Vacancies",
- "common.navigation.promotions": "Promotions",
- "common.navigation.charity": "Charity",
- "common.navigation.certificates": "Certificates",
- "common.navigation.contacts": "Contacts",
-
- "common.footer.contacts": "Contacts",
- "common.footer.navigation": "Navigation",
- "common.footer.yourEmail": "Your email",
- "common.footer.rights": "All rights reserved.",
-
- "home.hero.title": "Modern Gas Station Network in Tajikistan",
- "home.hero.description": "Quality fuel, convenient locations, and excellent service for our customers",
-
- "home.about.title": "About Our Company",
- "home.about.description1": "Our gas station network is one of the leading in Tajikistan. We provide high-quality fuel and a high level of service for our customers for more than 15 years.",
- "home.about.description2": "We are constantly developing, opening new stations and improving service at existing ones. Our goal is to make refueling as convenient and fast as possible for every customer.",
- "home.about.features.quality.title": "Quality Fuel",
- "home.about.features.quality.description": "We guarantee the high quality of our fuel",
- "home.about.features.equipment.title": "Modern Equipment",
- "home.about.features.equipment.description": "All our stations are equipped with modern equipment",
- "home.about.features.staff.title": "Professional Staff",
- "home.about.features.staff.description": "Our employees are professionals in their field",
-
- "home.stations.title": "Our Stations",
- "home.stations.description": "Find the nearest station in our network. We are located in convenient places throughout Tajikistan.",
-
- "home.promotions.title": "Current Promotions",
- "home.promotions.description": "Special offers and promotions for our customers. Refuel profitably!",
-
- "home.vacancies.title": "Vacancies",
- "home.vacancies.description": "Join our team of professionals. We offer stable work and opportunities for growth.",
- "home.vacancies.all": "All vacancies",
- "home.vacancies.office": "Office",
- "home.vacancies.stations": "Stations",
- "home.vacancies.fullTime": "Full time",
- "home.vacancies.experience": "Experience from 1 year",
- "home.vacancies.shiftWork": "Shift work",
- "home.vacancies.training": "Training",
-
- "home.partners.title": "Our Partners",
- "home.partners.description": "We cooperate with leading companies to provide the best services to our customers.",
- "home.partners.becomePartner": "Become Our Partner",
- "home.partners.becomePartnerText": "We are open to cooperation and new partnerships. Contact us to discuss opportunities.",
-
- "home.charity.title": "Charity Foundation",
- "home.charity.description": "Our charity foundation was created to support socially significant projects in Tajikistan. We strive to contribute to the development of society and help those in need.",
- "home.charity.directions": "Main directions of our foundation's activities:",
- "home.charity.education": "Support for educational programs",
- "home.charity.children": "Help for children from low-income families",
- "home.charity.ecology": "Environmental initiatives",
- "home.charity.sports": "Support for sports events",
- "home.charity.learnMore": "Learn More About the Foundation",
-
- "home.cta.title": "Join Us",
- "home.cta.description": "Become part of our network. Get special offers, bonuses, and discounts.",
-
- "certificates.title": "Our Certificates",
- "certificates.description": "GasNetwork adheres to high standards of quality and safety. Our certificates confirm the compliance of our products and services with international and national standards.",
-
- "certificates.issueDate": "Issue Date",
- "certificates.expiryDate": "Valid Until",
- "certificates.faq": "Frequently Asked Questions",
-
- "auth.title": "Login to your account",
- "auth.description": "Log in to your personal account to access information about your bonuses, transaction history and other features.",
- "auth.bonusClient": "Bonus Client",
- "auth.corporateClient": "Corporate Client",
- "auth.bonusLogin.title": "Login for bonus clients",
- "auth.bonusLogin.description": "Enter your phone number and bonus card number to log in to your personal account.",
- "auth.corporateLogin.title": "Login for corporate clients",
- "auth.corporateLogin.description": "Enter your phone number and corporate card number to log in to your personal account.",
- "auth.phoneNumber": "Phone number",
- "auth.cardNumber": "Card number",
- "auth.loginIssues": "Having trouble logging in?",
-
- "map.filters": "Filters",
- "map.stationsList": "Stations List",
- "map.noStations": "No stations matching the selected filters",
- "map.ourStations": "Our Stations",
- "map.totalStations": "Total stations",
- "map.services": "Services",
- "map.cities": "Cities",
- "map.allCities": "All Cities"
-}
diff --git a/src/shared/language/locales/ru.json b/src/shared/language/locales/ru.json
deleted file mode 100644
index 3739fe2..0000000
--- a/src/shared/language/locales/ru.json
+++ /dev/null
@@ -1,344 +0,0 @@
-{
- "common.contacts.address": "ул. Рудаки 137, Душанбе, Таджикистан",
- "common.contacts.tel": "+992 (37) 223-45-67",
- "common.contacts.email": "info@gasnetwork.tj",
- "common.name": "Ориё",
-
- "common.buttons.readMore": "Подробнее",
- "common.buttons.findStation": "Найти заправку",
- "common.buttons.learnMore": "Узнать больше",
- "common.buttons.download": "Скачать",
- "common.buttons.view": "Просмотр",
- "common.buttons.contactUs": "Связаться с нами",
- "common.buttons.apply": "Подать заявку",
- "common.buttons.login": "Вход",
- "common.buttons.logout": "Выйти",
- "common.buttons.submit": "Отправить",
- "common.buttons.filter": "Фильтры",
- "common.buttons.resetFilters": "Сбросить фильтры",
- "common.buttons.downloadApp": "Скачать приложение",
- "common.buttons.purchaseCardAtGasStations": "Приобретайте карту в сети АЗС",
- "common.buttons.sendResume": "Отправить резюме",
- "common.buttons.showAllStations": "Показать все заправки",
- "common.buttons.allPromotions": "Все акции",
-
- "common.navigation.home": "Главная",
- "common.navigation.about": "О нас",
- "common.navigation.clients": "Клиентам",
- "common.navigation.stations": "Наши заправки",
- "common.navigation.vacancies": "Вакансии",
- "common.navigation.promotions": "Акции",
- "common.navigation.charity": "Благотворительность",
- "common.navigation.certificates": "Сертификаты",
- "common.navigation.loyatly": "Программа лояльности",
- "common.navigation.partners": "Партнеры",
- "common.navigation.contacts": "Контакты",
-
- "common.footer.contacts": "Контакты",
- "common.footer.navigation": "Навигация",
- "common.footer.yourEmail": "Ваш email",
- "common.footer.rights": "Все права защищены.",
-
- "home.hero.title": "Сеть современных заправок в Таджикистане",
- "home.hero.description": "Качественное топливо, удобное расположение и отличный сервис для наших клиентов",
-
- "home.stats.stations": "Заправок по стране",
- "home.stats.daily": "Клиентов ежедневно",
- "home.stats.years": "Лет на рынке",
- "home.stats.mode": "Работаем круглосуточно",
-
- "home.about.title": "О нашей компании",
- "home.about.description1": "Наша сеть заправок является одной из ведущих в Таджикистане. Мы предоставляем качественное топливо и высокий уровень обслуживания для наших клиентов уже более 15 лет.",
- "home.about.description2": "Мы постоянно развиваемся, открывая новые станции и улучшая сервис на существующих. Наша цель - сделать заправку автомобиля максимально удобной и быстрой для каждого клиента.",
- "home.about.features.quality.title": "Качественное топливо",
- "home.about.features.quality.description": "Мы гарантируем высокое качество нашего топлива",
- "home.about.features.equipment.title": "Современное оборудование",
- "home.about.features.equipment.description": "Все наши станции оснащены современным оборудованием",
- "home.about.features.staff.title": "Профессиональный персонал",
- "home.about.features.staff.description": "Наши сотрудники - профессионалы своего дела",
-
- "about.companyTimeline.rollUp.button": "Свернуть",
- "about.companyTimeline.show.button": "Показать больше",
- "about.gallery.previous": "Предыдущая",
- "about.gallery.next": "Следующая",
- "about.hero.imageAlt": "О нашей компании",
- "about.hero.title": "О нашей компании",
- "about.hero.subtitle": "Узнайте больше о нашей истории, ценностях и миссии. Мы стремимся предоставлять лучший сервис и качественное топливо для наших клиентов.",
-
- "about.overview.title": "Лидер на рынке Таджикистана",
- "about.overview.description1": "GasNetwork - ведущая сеть автозаправочных станций в Таджикистане, предоставляющая высококачественное топливо и превосходный сервис. Наша компания была основана в 2008 году и с тех пор стала символом надежности и качества в энергетическом секторе страны.",
- "about.overview.description2": "Мы гордимся тем, что предлагаем нашим клиентам только лучшее топливо, соответствующее международным стандартам качества. Наши заправочные станции оснащены современным оборудованием, которое обеспечивает быстрое и безопасное обслуживание.",
- "about.overview.description3": "Наша миссия - сделать поездки наших клиентов комфортными и безопасными, предоставляя качественное топливо и отличный сервис по всей стране.",
- "about.overview.imageAlt": "Главный офис GasNetwork",
-
- "about.overview.benefits.0.title": "Качество",
- "about.overview.benefits.0.description": "Топливо высшего стандарта",
- "about.overview.benefits.1.title": "Сервис",
- "about.overview.benefits.1.description": "Профессиональное обслуживание",
- "about.overview.benefits.2.title": "Инновации",
- "about.overview.benefits.2.description": "Современные технологии",
- "about.overview.benefits.3.title": "Доступность",
- "about.overview.benefits.3.description": "Станции по всей стране",
-
- "about.stats.title": "GasNetwork в цифрах",
- "about.stats.subtitle": "Наши достижения и рост за годы работы на рынке Таджикистана",
-
- "about.stats.items.0.value": "25",
- "about.stats.items.0.suffix": "+",
- "about.stats.items.0.label": "Заправок по стране",
- "about.stats.items.1.value": "15",
- "about.stats.items.1.label": "Лет на рынке",
- "about.stats.items.2.value": "150",
- "about.stats.items.2.suffix": "+",
- "about.stats.items.2.label": "Сотрудников",
- "about.stats.items.3.value": "1000000",
- "about.stats.items.3.suffix": "+",
- "about.stats.items.3.label": "Клиентов в год",
- "about.stats.items.4.label": "Литров топлива в месяц",
- "about.stats.items.5.label": "Довольных клиентов",
-
- "about.history.title": "Наша история",
- "about.history.subtitle": "История развития нашей компании от небольшой сети до лидера рынка",
-
- "about.stations.title": "Наши заправочные станции",
- "about.stations.subtitle": "Современные заправочные станции, оснащенные по последнему слову техники",
- "about.stations.description": "Наши заправочные станции расположены в стратегически важных точках по всему Таджикистану, обеспечивая удобный доступ для всех наших клиентов.",
- "about.stations.buttonText": "Найти ближайшую заправку",
-
- "about.values.title": "Наши ценности",
- "about.values.subtitle": "Принципы, которыми мы руководствуемся в нашей работе",
- "about.values.items.0.title": "Качество",
- "about.values.items.0.description": "Мы предлагаем только высококачественное топливо, соответствующее международным стандартам. Регулярные проверки и контроль качества гарантируют, что наши клиенты получают лучшее.",
- "about.values.items.1.title": "Клиентоориентированность",
- "about.values.items.1.description": "Наши клиенты - наш главный приоритет. Мы стремимся предоставить лучший сервис, удобные условия и приятную атмосферу на каждой нашей заправке.",
- "about.values.items.2.title": "Профессионализм",
- "about.values.items.2.description": "Наши сотрудники - профессионалы своего дела. Мы постоянно инвестируем в их обучение и развитие, чтобы обеспечить высокий уровень обслуживания.",
-
- "about.team.title": "Наша команда",
- "about.team.subtitle": "Познакомьтесь с профессионалами, которые делают GasNetwork лучшей сетью заправок в Таджикистане",
- "about.team.members.0.name": "Алишер Рахмонов",
- "about.team.members.0.position": "Генеральный директор",
- "about.team.members.1.name": "Фарида Каримова",
- "about.team.members.1.position": "Финансовый директор",
- "about.team.members.2.name": "Рустам Назаров",
- "about.team.members.2.position": "Технический директор",
- "about.team.members.3.name": "Зарина Шарипова",
- "about.team.members.3.position": "Директор по маркетингу",
-
- "about.testimonials.title": "Отзывы клиентов",
- "about.testimonials.subtitle": "Что говорят о нас наши клиенты",
- "about.testimonials.items.0.name": "Фархад К.",
- "about.testimonials.items.0.text": "Я всегда заправляюсь только на GasNetwork. Качество топлива на высоте, а обслуживание всегда приветливое и быстрое.",
- "about.testimonials.items.0.rating": "5",
- "about.testimonials.items.1.name": "Нигина М.",
- "about.testimonials.items.1.text": "Очень удобно, что заправки расположены по всему городу. Всегда чисто, есть кафе и магазин. Рекомендую!",
- "about.testimonials.items.1.rating": "5",
- "about.testimonials.items.2.name": "Джамшед Р.",
- "about.testimonials.items.2.text": "Пользуюсь картой лояльности GasNetwork уже 3 года. Накопил много бонусов и получил немало приятных подарков. Отличный сервис!",
- "about.testimonials.items.2.rating": "4",
-
- "home.stations.title": "Наши заправки",
- "home.stations.description": "Найдите ближайшую к вам заправку нашей сети. Мы расположены в удобных местах по всему Таджикистану.",
-
- "home.promotions.title": "Актуальные акции",
- "home.promotions.description": "Специальные предложения и акции для наших клиентов. Заправляйтесь выгодно!",
-
- "home.vacancies.title": "Вакансии",
- "home.vacancies.description": "Присоединяйтесь к нашей команде профессионалов. Мы предлагаем стабильную работу и возможности для роста.",
- "home.vacancies.all": "Все вакансии",
- "home.vacancies.office": "Офис",
- "home.vacancies.stations": "Заправки",
- "home.vacancies.fullTime": "Полный день",
- "home.vacancies.experience": "Опыт от 1 года",
- "home.vacancies.shiftWork": "Сменный график",
- "home.vacancies.training": "Обучение",
-
- "home.partners.title": "Наши партнеры",
- "home.partners.description": "Мы сотрудничаем с ведущими компаниями для предоставления лучших услуг нашим клиентам.",
- "home.partners.becomePartner": "Станьте нашим партнером",
- "home.partners.becomePartnerText": "Мы открыты для сотрудничества и новых партнерских отношений. Свяжитесь с нами для обсуждения возможностей.",
-
- "home.charity.title": "Благотворительный фонд",
- "home.charity.description": "Наш благотворительный фонд был создан для поддержки социально значимых проектов в Таджикистане. Мы стремимся внести свой вклад в развитие общества и помочь тем, кто в этом нуждается.",
- "home.charity.directions": "Основные направления деятельности нашего фонда:",
- "home.charity.education": "Поддержка образовательных программ",
- "home.charity.children": "Помощь детям из малообеспеченных семей",
- "home.charity.ecology": "Экологические инициативы",
- "home.charity.sports": "Поддержка спортивных мероприятий",
- "home.charity.learnMore": "Подробнее о фонде",
-
- "home.cta.title": "Присоединяйтесь к нам",
- "home.cta.description": "Станьте частью нашей сети. Получайте специальные предложения, бонусы и скидки.",
-
- "charity.events.button": "Принять участие",
- "charity.hero.imageAlt": "Благотворительный фонд GasNetwork",
- "charity.hero.title": "Благотворительный фонд GasNetwork",
- "charity.hero.subtitle": "Мы верим, что бизнес должен быть социально ответственным. Наш фонд поддерживает образование, здравоохранение и экологические инициативы в Таджикистане.",
-
- "charity.mission.title": "Наша миссия",
- "charity.mission.description1": "Благотворительный фонд GasNetwork был создан в 2020 году с целью поддержки социально значимых проектов в Таджикистане. Мы стремимся внести свой вклад в развитие общества и помочь тем, кто в этом нуждается.",
- "charity.mission.description2": "Наша миссия — создавать возможности для улучшения жизни людей через образование, здравоохранение, экологические инициативы и поддержку уязвимых групп населения.",
- "charity.mission.imageAlt": "Наша миссия",
-
- "charity.mission.principles.0.title": "Прозрачность",
- "charity.mission.principles.0.description": "Мы публикуем ежегодные отчеты о всех наших проектах и расходах, обеспечивая полную прозрачность нашей деятельности.",
- "charity.mission.principles.1.title": "Эффективность",
- "charity.mission.principles.1.description": "Мы тщательно выбираем проекты, которые могут принести максимальную пользу обществу и имеют долгосрочное влияние.",
- "charity.mission.principles.2.title": "Сотрудничество",
- "charity.mission.principles.2.description": "Мы сотрудничаем с местными и международными организациями для достижения наибольшего эффекта от наших инициатив.",
-
- "charity.stats.title": "Наш вклад в цифрах",
- "charity.stats.subtitle": "За время существования нашего фонда мы достигли значительных результатов",
- "charity.stats.items.0.value": "15+",
- "charity.stats.items.0.label": "Реализованных проектов",
- "charity.stats.items.1.value": "1.2M",
- "charity.stats.items.1.label": "Сомони пожертвований",
- "charity.stats.items.2.value": "5000+",
- "charity.stats.items.2.label": "Людей получили помощь",
-
- "charity.events.title": "Предстоящие мероприятия",
- "charity.events.subtitle": "Присоединяйтесь к нашим благотворительным мероприятиям и внесите свой вклад в общее дело",
-
- "charity.help.title": "Как вы можете помочь",
- "charity.help.subtitle": "Есть много способов внести свой вклад в наши благотворительные инициативы",
-
- "clients.title": "Для наших клиентов",
- "clients.description": "Информация для клиентов: программа лояльности, топливные карты, сертификаты и способы оплаты.",
- "clients.services.title": "Наши услуги для клиентов",
- "clients.services.subtitle": "Мы стремимся сделать обслуживание на наших заправках максимально удобным и выгодным для вас",
- "clients.benefits.title": "Преимущества для клиентов",
- "clients.benefits.subtitle": "Став клиентом GasNetwork, вы получаете множество преимуществ, которые делают заправку вашего автомобиля более выгодной и удобной.",
- "clients.header.loyalty.description": "Накапливайте баллы и получайте скидки на топливо и услуги",
- "clients.header.certificates.description": "Подарочные сертификаты на топливо и услуги нашей сети",
-
- "clients.loyalty.title": "Программа лояльности",
- "clients.loyalty.description": "Накапливайте баллы и получайте скидки на топливо и услуги нашей сети",
-
- "clients.loyalty.programm.about": "О программе лояльности",
- "clients.loyalty.programm.about-description": "Программа лояльности GasNetwork — это возможность получать баллы за каждую покупку топлива и услуг на наших заправочных станциях. Накопленные баллы можно обменять на скидки, подарки или дополнительные услуги.",
- "clients.loyalty.programm.about-description-2": "Участие в программе абсолютно бесплатное. Вам нужно только получить карту лояльности в любой нашей заправочной станции или зарегистрироваться в мобильном приложении.",
- "clients.loyalty.programm.conditions-1": "1 литр = 1 балл",
- "clients.loyalty.programm.conditions.description-1": "За каждый литр топлива вы получаете 1 балл",
- "clients.loyalty.programm.conditions-2": "Дополнительные баллы",
- "clients.loyalty.programm.conditions.description-2": "За покупки в магазине и кафе на заправке",
- "clients.loyalty.programm.conditions-3": "Специальные акции",
- "clients.loyalty.programm.conditions.description-3": "Удвоенные и утроенные баллы в праздничные дни",
-
- "clients.loyalty.works.title": "Как это работает",
- "clients.loyalty.works.description": "Простые шаги для участия в программе лояльности GasNetwork",
-
- "clients.loyalty.works.stage-1": "Получите карту",
- "clients.loyalty.works.stage.description-1": "Получите карту лояльности на любой заправке GasNetwork или зарегистрируйтесь в мобильном приложении",
- "clients.loyalty.works.stage-2": "Заправляйтесь",
- "clients.loyalty.works.stage.description-2": "Используйте карту при каждой заправке и покупке в магазинах на наших АЗС",
- "clients.loyalty.works.stage-3": "Накапливайте баллы",
- "clients.loyalty.works.stage.description-3": "Получайте баллы за каждую покупку и следите за их накоплением в приложении",
- "clients.loyalty.works.stage-4": "Получайте выгоду",
- "clients.loyalty.works.stage.description-4": "Обменивайте накопленные баллы на скидки, подарки или дополнительные услуги",
-
- "clients.loyalty.works.levels.title": "Уровни лояльности",
- "clients.loyalty.works.levels.description": "Чем больше вы заправляетесь, тем больше преимуществ получаете",
- "clients.loyalty.works.levels.card.mark": "возврат баллами",
-
- "clients.loyalty.works.levels.card-1.title": "Стандарт",
- "clients.loyalty.works.levels.card-1.percent": "1%",
- "clients.loyalty.works.levels.card-1.bonus-1": "1 балл за каждый литр топлива",
- "clients.loyalty.works.levels.card-1.bonus-2": "Участие в акциях",
- "clients.loyalty.works.levels.card-1.bonus-3": "Доступ к мобильному приложению",
-
- "clients.loyalty.works.levels.card-2.title": "Золотой",
- "clients.loyalty.works.levels.card-2.percent": "2%",
- "clients.loyalty.works.levels.card-2.bonus-1": "2 балла за каждый литр топлива",
- "clients.loyalty.works.levels.card-2.bonus-2": "Скидка 5% в кафе на заправках",
- "clients.loyalty.works.levels.card-2.bonus-3": "Приоритетное обслуживание",
- "clients.loyalty.works.levels.card-2.bonus-4": "Эксклюзивные акции",
-
- "clients.loyalty.works.levels.card-3.title": "Платиновый",
- "clients.loyalty.works.levels.card-3.percent": "3%",
- "clients.loyalty.works.levels.card-3.bonus-1": "3 балла за каждый литр топлива",
- "clients.loyalty.works.levels.card-3.bonus-2": "Скидка 10% в кафе на заправках",
- "clients.loyalty.works.levels.card-3.bonus-3": "Бесплатная мойка раз в месяц",
- "clients.loyalty.works.levels.card-3.bonus-4": "Персональный менеджер",
- "clients.loyalty.works.levels.card-3.bonus-5": "VIP-обслуживание",
-
- "certificates.title": "Наши сертификаты",
- "certificates.description": "GasNetwork придерживается высоких стандартов качества и безопасности. Наши сертификаты подтверждают соответствие нашей продукции и услуг международным и национальным стандартам.",
- "certificates.issueDate": "Дата выдачи",
- "certificates.expiryDate": "Действителен до",
- "certificates.faq": "Часто задаваемые вопросы",
-
- "auth.title": "Вход в личный кабинет",
- "auth.description": "Войдите в личный кабинет, чтобы получить доступ к информации о ваших бонусах, истории операций и другим возможностям.",
- "auth.bonusClient": "Бонусный клиент",
- "auth.corporateClient": "Корпоративный клиент",
- "auth.bonusLogin.title": "Вход для бонусных клиентов",
- "auth.bonusLogin.description": "Введите номер телефона и номер бонусной карты для входа в личный кабинет.",
- "auth.corporateLogin.title": "Вход для корпоративных клиентов",
- "auth.corporateLogin.description": "Введите номер телефона и номер корпоративной карты для входа в личный кабинет.",
- "auth.phoneNumber": "Номер телефона",
- "auth.cardNumber": "Номер карты",
- "auth.loginIssues": "Возникли проблемы со входом?",
- "auth.contactLink": "Свяжитесь с нами",
-
- "map.filters": "Фильтры",
- "map.stationsList": "Список заправок",
- "map.noStations": "Нет заправок, соответствующих выбранным фильтрам",
- "map.ourStations": "Наши заправки",
- "map.totalStations": "Всего станций",
- "map.services": "Услуги",
- "map.cities": "Города",
- "map.allCities": "Все города",
-
- "corporate.pageTitle": "Корпоративный кабинет",
- "corporate.logoutButton": "Выйти",
-
- "corporate.companyCard.title": "Информация о компании",
- "corporate.companyCard.companyNameLabel": "Название компании",
- "corporate.companyCard.cardsCountLabel": "Количество карт",
- "corporate.companyCard.registrationDateLabel": "Дата регистрации",
- "corporate.companyCard.fundLabel": "Фонд",
- "corporate.companyCard.overdraftLabel": "Овердрафт",
- "corporate.currency": "сомони",
-
- "corporate.fundCard.title": "Общий фонд",
- "corporate.fundCard.description": "Доступные средства",
- "corporate.fundCard.currency": "сомони",
-
- "corporate.transactions.title": "История операций",
- "corporate.transactions.dateFrom": "От",
- "corporate.transactions.dateTo": "До",
- "corporate.transactions.selectDate": "Выберите дату",
- "corporate.transactions.applyButton": "Применить",
-
- "corporate.transactions.tableHeaders.date": "Дата",
- "corporate.transactions.tableHeaders.station": "Станция",
- "corporate.transactions.tableHeaders.product": "Продукт",
- "corporate.transactions.tableHeaders.quantity": "Кол-во (л)",
- "corporate.transactions.tableHeaders.price": "Стоимость",
- "corporate.transactions.tableHeaders.total": "Сумма",
-
- "corporate.transactions.noTransactions": "Нет операций за выбранный период",
-
- "customer.pageTitle": "Личный кабинет",
- "customer.logoutButton": "Выйти",
-
- "customer.bonusCard.title": "Бонусная карта",
- "customer.bonusCard.description": "Ваши накопленные бонусы",
- "customer.bonusCard.points": "бонусных баллов",
- "customer.bonusCard.validUntil": "Действует до: 31.12.2023",
-
- "customer.infoCard.title": "Информация о клиенте",
- "customer.infoCard.fullNameLabel": "ФИО",
- "customer.infoCard.regDateLabel": "Дата регистрации",
- "customer.infoCard.cardNumberLabel": "Номер карты",
- "customer.infoCard.expiryDateLabel": "Срок действия",
-
- "customer.transactions.title": "История операций",
- "customer.transactions.dateColumn": "Дата",
- "customer.transactions.stationColumn": "АЗС",
- "customer.transactions.productColumn": "Топливо",
- "customer.transactions.quantityColumn": "Литры",
- "customer.transactions.priceColumn": "Цена",
- "customer.transactions.totalColumn": "Сумма",
- "customer.transactions.noData": "Нет данных о транзакциях"
-}
\ No newline at end of file
diff --git a/src/shared/language/ui/language-switcher.tsx b/src/shared/language/ui/language-switcher.tsx
deleted file mode 100644
index 0de4ed5..0000000
--- a/src/shared/language/ui/language-switcher.tsx
+++ /dev/null
@@ -1,44 +0,0 @@
-'use client';
-
-import { Check, Globe } from 'lucide-react';
-import { useState } from 'react';
-
-import { type Language, languages, useLanguage } from '@/shared/language';
-import { Button } from '@/shared/shadcn-ui/button';
-import {
- DropdownMenu,
- DropdownMenuContent,
- DropdownMenuItem,
- DropdownMenuTrigger,
-} from '@/shared/shadcn-ui/dropdown-menu';
-
-export function LanguageSwitcher() {
- const { language, setLanguage } = useLanguage();
- const [open, setOpen] = useState(false);
-
- return (
-
-
-
-
- Switch language
-
-
-
- {Object.entries(languages).map(([code, { name, flag }]) => (
- {
- setLanguage(code as Language);
- setOpen(false);
- }}
- >
- {flag}
- {name}
- {code === language && }
-
- ))}
-
-
- );
-}
diff --git a/src/shared/providers/providers.tsx b/src/shared/providers/providers.tsx
index e4fa1ea..b43be29 100644
--- a/src/shared/providers/providers.tsx
+++ b/src/shared/providers/providers.tsx
@@ -2,20 +2,22 @@
import { Provider } from 'react-redux';
-import { LanguageProvider } from '../language';
+import { TextControlProvider } from '../language';
import { store } from '../store';
import { ThemeProvider } from '../theme/theme-provider';
+import { TextItem } from '../types/text.types';
import { AosProvider } from './aos-provider';
import { Toaster } from './toaster';
type ProvidersProps = {
children: React.ReactNode;
+ textItems: TextItem[];
};
-export const Providers = ({ children }: ProvidersProps) => {
+export const Providers = ({ children, textItems }: ProvidersProps) => {
return (
-
+ {
-
+
);
};
diff --git a/src/shared/store/index.ts b/src/shared/store/index.ts
index 2411feb..fb9db85 100644
--- a/src/shared/store/index.ts
+++ b/src/shared/store/index.ts
@@ -1,15 +1,20 @@
import { configureStore } from '@reduxjs/toolkit';
import { setupListeners } from '@reduxjs/toolkit/query/react';
+import { createWrapper } from 'next-redux-wrapper';
+
import { baseAPI } from '@/shared/api/base-api';
import { rootReducer } from './root-reducer';
-export const store = configureStore({
- reducer: rootReducer,
- middleware: (getDefaultMiddleware) =>
- getDefaultMiddleware().concat(baseAPI.middleware),
- devTools: process.env.NODE_ENV === 'development',
-});
+export const makeStore = () =>
+ configureStore({
+ reducer: rootReducer,
+ middleware: (getDefaultMiddleware) =>
+ getDefaultMiddleware().concat(baseAPI.middleware),
+ devTools: process.env.NODE_ENV === 'development',
+ });
+
+export const store = makeStore();
setupListeners(store.dispatch);
@@ -17,3 +22,5 @@ setupListeners(store.dispatch);
export type RootState = ReturnType;
// Inferred type: {posts: PostsState, comments: CommentsState, users: UsersState}
export type AppDispatch = typeof store.dispatch;
+
+export const wrapper = createWrapper(makeStore);
diff --git a/src/shared/types/text.types.ts b/src/shared/types/text.types.ts
new file mode 100644
index 0000000..8a5ba7e
--- /dev/null
+++ b/src/shared/types/text.types.ts
@@ -0,0 +1,4 @@
+export interface TextItem {
+ key: string;
+ value: string | null;
+}
diff --git a/src/widgets/about-page/company-timeline.tsx b/src/widgets/about-page/company-timeline.tsx
index ee25915..ea6e15d 100644
--- a/src/widgets/about-page/company-timeline.tsx
+++ b/src/widgets/about-page/company-timeline.tsx
@@ -3,9 +3,9 @@
import { Calendar, ChevronDown, ChevronUp } from 'lucide-react';
import { useState } from 'react';
+import { useTextController } from '@/shared/language/hooks/use-text-controller';
import { Button } from '@/shared/shadcn-ui/button';
import { Card, CardContent } from '@/shared/shadcn-ui/card';
-import { useLanguage } from '@/shared/language';
const timelineEvents = [
{
@@ -62,7 +62,7 @@ export function CompanyTimeline() {
const [expanded, setExpanded] = useState(false);
const displayEvents = expanded ? timelineEvents : timelineEvents.slice(0, 4);
- const {t} = useLanguage()
+ const { t } = useTextController();
return (