/* ============================================================ i18n + mock data (RU / UZ-latin) Persona: Aziz Rahimov, 23 — выпускник, метит в digital-маркетинг ============================================================ */ // UI chrome strings const UI = { ru: { nav_stories: 'Лента', nav_jobs: 'Вакансии', nav_advisor: 'Советник', nav_growth: 'Рост', nav_profile: 'Профиль', // onboarding / chat advisor: 'Карьерный советник', online: 'на связи', typing: 'печатает', inputPh: 'Сообщение…', attach: 'Прикрепить диплом / CV', parsing: 'Читаю документ', extracted: 'Собрал из документа', skip: 'Пропустить и осмотреться', showProfile: 'Показать мой профиль', profileAssembling: 'Собираю профиль', assembled: 'Профиль собран', voiceHint: 'Можно голосом', // profile tray trayTitle: 'Твой профиль', role: 'Цель', skills: 'Навыки', education: 'Образование', location: 'Город', schedule: 'График', experience: 'Опыт', value: 'Оценка стоимости', // home / stories goodMorning: 'Доброе утро', weeklyPulse: 'Изменения за неделю', tapToHold: 'Удерживай — пауза', storyOf: 'из', // status statusTitle: 'Твой статус', statusSub: 'Управляешь видимостью сам', st_active: 'В поиске', st_open: 'Открыт к предложениям', st_closed: 'Не ищу', st_active_d: 'Видят все работодатели, ты в приоритете подбора', st_open_d: 'Видят при точном совпадении. Без спама', st_closed_d: 'Скрыт из поиска. Обзор остаётся с тобой', // jobs jobsTitle: 'Подобрано для тебя', jobsSub: 'Точно под тебя — 1–3 роли с обоснованием', tab_jobs: 'Вакансии', tab_intern: 'Стажировки', why: 'Почему подходит', match: 'совпадение', apply: 'Откликнуться', interesting: 'Интересно', applied: 'Отклик отправлен', hot: 'Горящая', remote: 'Удалёнка', internPay: 'Оплачивается', govProg: 'Госпрограмма', months: 'мес', // growth growthTitle: 'Твой рост', goal: 'Цель', readyFor: 'Готов к роли', changeGoal: 'Сменить цель', missing: 'Чего не хватает', microsteps: 'Шаги на сегодня', start: 'Начать', done: 'Готово', inProgress: 'В процессе', skillMap: 'Карта навыков', // profile screen estValue: 'Оценочная стоимость', perMonth: 'сум / мес', thisWeek: 'за неделю', canonicalSkills: 'Навыки', addSkill: 'Добавить', completeness: 'Профиль собран', improve: 'Дособрать с советником', privacy: 'Приватность и согласия', privacyNote: 'Диплом и контакты видит только тот, кому ты разрешил. Управляй в любой момент.', edit: 'Через диалог', languages: 'Языки', expTitle: 'Опыт', companiesHiring: 'Компании нанимают', whoViewed: 'Тебя смотрели', viewedSub: 'на этой неделе', native: 'родной', fluent: 'свободно', now: 'сейчас', seen: 'смотрели профили как у тебя', employers: 'работодателей', demand: 'спрос на твои навыки', newRoles: 'новые роли под тебя', level: 'уровень', settings: 'Настройки', lang: 'Язык', theme: 'Тема', light: 'Светлая', dark: 'Тёмная', next: 'Далее', back: 'Назад', }, uz: { nav_stories: 'Lenta', nav_jobs: 'Vakansiyalar', nav_advisor: 'Maslahatchi', nav_growth: 'Rivoj', nav_profile: 'Profil', advisor: 'Karyera maslahatchisi', online: 'aloqada', typing: 'yozmoqda', inputPh: 'Xabar…', attach: 'Diplom / CV biriktirish', parsing: 'Hujjatni o‘qiyapman', extracted: 'Hujjatdan yig‘dim', skip: 'O‘tkazib, ko‘rib chiqish', showProfile: 'Profilimni ko‘rsat', profileAssembling: 'Profil yig‘yapman', assembled: 'Profil yig‘ildi', voiceHint: 'Ovoz bilan ham mumkin', trayTitle: 'Sening profiling', role: 'Maqsad', skills: 'Ko‘nikmalar', education: 'Ta’lim', location: 'Shahar', schedule: 'Grafik', experience: 'Tajriba', value: 'Qiymat bahosi', goodMorning: 'Xayrli tong', weeklyPulse: 'Hafta o‘zgarishlari', tapToHold: 'Ushlab tur — pauza', storyOf: '/', statusTitle: 'Sening holating', statusSub: 'Ko‘rinishni o‘zing boshqarasan', st_active: 'Qidiruvda', st_open: 'Takliflarga ochiq', st_closed: 'Qidirmayapman', st_active_d: 'Barcha ish beruvchilar ko‘radi, tanlovda ustuvorsan', st_open_d: 'Faqat aniq moslikda ko‘rinadi. Spamsiz', st_closed_d: 'Qidiruvdan yashirin. Haftalik sharh sen bilan qoladi', jobsTitle: 'Sen uchun tanlandi', jobsSub: 'Aniq sen uchun — asosli 1–3 ta rol', tab_jobs: 'Vakansiyalar', tab_intern: 'Amaliyot', why: 'Nega mos keladi', match: 'moslik', apply: 'Javob berish', interesting: 'Qiziq', applied: 'Javob yuborildi', hot: 'Shoshilinch', remote: 'Masofadan', internPay: 'To‘lanadi', govProg: 'Davlat dasturi', months: 'oy', growthTitle: 'Sening rivojing', goal: 'Maqsad', readyFor: 'Rolga tayyorlik', changeGoal: 'Maqsadni almashtirish', missing: 'Nimalar yetishmaydi', microsteps: 'Bugungi qadamlar', start: 'Boshlash', done: 'Tayyor', inProgress: 'Jarayonda', skillMap: 'Ko‘nikmalar xaritasi', estValue: 'Taxminiy qiymat', perMonth: 'so‘m / oy', thisWeek: 'hafta ichida', canonicalSkills: 'Ko‘nikmalar', addSkill: 'Qo‘shish', completeness: 'Profil yig‘ildi', improve: 'Maslahatchi bilan to‘ldirish', privacy: 'Maxfiylik va rozilik', privacyNote: 'Diplom va kontaktni faqat sen ruxsat bergan ko‘radi. Istalgan payt boshqar.', edit: 'Suhbat orqali', languages: 'Tillar', expTitle: 'Tajriba', companiesHiring: 'Kompaniyalar ishga olmoqda', whoViewed: 'Seni ko‘rishdi', viewedSub: 'shu hafta', native: 'ona tili', fluent: 'erkin', now: 'hozir', seen: 'sendek profillarni ko‘rdi', employers: 'ish beruvchi', demand: 'ko‘nikmalaringga talab', newRoles: 'sen uchun yangi rollar', level: 'daraja', settings: 'Sozlamalar', lang: 'Til', theme: 'Mavzu', light: 'Yorug‘', dark: 'Tungi', next: 'Keyingi', back: 'Orqaga', }, }; // bilingual value helper function tr(o, lang) { return o ? (o[lang] ?? o.ru) : ''; } // ---- working brand name (placeholder — swap in one place) ---- const BRAND = { name: 'HR yordamchi', tagline: { ru: 'Помощник в карьере', uz: 'Karyera yordamchingiz' }, }; // ---- real UZ employers (names + brand colours; monogram tiles) ---- // Trademarked logos are referenced by name + brand colour, not reproduced. // `logo: true` → real logo file exists at logos/.png; else monogram tile. const BRANDS = { korzinka: { name: 'korzinka', short: 'k', bg: '#e3354a', logo: true }, uzum: { name: 'Uzum', short: 'u', bg: '#7000ff', logo: true }, click: { name: 'Click', short: 'C', bg: '#1a73e8', logo: true }, beeline: { name: 'Beeline', short: 'B', bg: '#ffcc00', fg: '#15171c', logo: true }, payme: { name: 'Payme', short: 'P', bg: '#19c2c9', logo: true }, humans: { name: 'Humans', short: 'H', bg: '#ff2d6f' }, anor: { name: 'Anorbank', short: 'a', bg: '#6b2fe0' }, artel: { name: 'Artel', short: 'A', bg: '#e2231a', logo: true }, epam: { name: 'EPAM', short: 'E', bg: '#27a8e0', logo: true }, go: { name: 'Yandex Go',short: 'Y', bg: '#fc3f1d', logo: true }, makro: { name: 'Makro', short: 'M', bg: '#e30613' }, tbc: { name: 'TBC', short: 'T', bg: '#00aeef', logo: true }, }; const PERSONA = { name: { ru: 'Азиз Рахимов', uz: 'Aziz Rahimov' }, initials: 'АР', initialsUz: 'AR', goal: { ru: 'Digital-маркетолог', uz: 'Digital marketolog' }, location: { ru: 'Ташкент', uz: 'Toshkent' }, schedule: { ru: 'Полная · стажировка', uz: 'To‘liq · amaliyot' }, edu: { ru: 'Маркетинг · ТГЭУ', uz: 'Marketing · TDIU' }, exp: { ru: '1 год · фриланс', uz: '1 yil · frilans' }, value: 5200000, valueLow: 4000000, valueHigh: 6500000, trend: 8, completeness: 86, }; // canonical skills with level 1..5 const SKILLS = [ { ru: 'SMM', uz: 'SMM', lvl: 4 }, { ru: 'Таргет-реклама', uz: 'Target reklama', lvl: 3 }, { ru: 'Контент', uz: 'Kontent', lvl: 4 }, { ru: 'Instagram', uz: 'Instagram', lvl: 5 }, { ru: 'Аналитика', uz: 'Analitika', lvl: 2 }, { ru: 'Копирайтинг', uz: 'Kopirayting', lvl: 3 }, ]; // chat onboarding script const CHAT = [ { who: 'ai', text: { ru: 'Салам! Я твой карьерный советник 👋 Это не анкета — просто поговорим. Кем работаешь или хочешь работать?', uz: 'Salom! Men sening karyera maslahatchingman 👋 Bu anketa emas — shunchaki suhbat. Kim bo‘lib ishlaysan yoki ishlamoqchisan?' } }, { who: 'choices', options: [ { ru: 'Хочу в маркетинг / SMM', uz: 'Marketing / SMM ga', pick: true }, { ru: 'Ищу первую работу', uz: 'Birinchi ishni qidiryapman' }, { ru: 'Курьер / водитель', uz: 'Kuryer / haydovchi' }, ] }, { who: 'ai', text: { ru: 'Отличная цель — спрос растёт. Чтобы не печатать всё руками: загрузи диплом или CV, и я соберу профиль сам. Можно и голосом рассказать.', uz: 'Zo‘r maqsad — talab o‘smoqda. Hammasini qo‘lda yozmaslik uchun: diplom yoki CV yukla, profilni o‘zim yig‘aman. Ovoz bilan ham aytsang bo‘ladi.' }, add: ['role'] }, { who: 'upload' }, { who: 'ai', text: { ru: 'Готово ✨ Из документа вижу: диплом по маркетингу (ТГЭУ), год ведения Instagram-проектов, базовый таргет. Разложил по навыкам — посмотри, всё верно?', uz: 'Tayyor ✨ Hujjatdan ko‘ryapman: marketing diplomi (TDIU), bir yil Instagram loyihalari, boshlang‘ich target. Ko‘nikmalarga ajratdim — to‘g‘rimi?' }, add: ['skills', 'education', 'experience'] }, { who: 'choices', options: [ { ru: 'Да, всё верно', uz: 'Ha, to‘g‘ri', pick: true }, { ru: 'Добавлю ещё навык', uz: 'Yana ko‘nikma qo‘shaman' }, ] }, { who: 'ai', text: { ru: 'Супер. Ещё два штриха. Какой формат ищешь?', uz: 'Zo‘r. Yana ikki savol. Qanday format qidiryapsan?' } }, { who: 'choices', options: [ { ru: 'Полная + готов на стажировку', uz: 'To‘liq + amaliyotga tayyor', pick: true }, { ru: 'Частичная', uz: 'Qisman' }, { ru: 'Удалёнка', uz: 'Masofadan' }, ], add: ['schedule'] }, { who: 'ai', text: { ru: 'И последнее — город?', uz: 'Va oxirgisi — shahar?' } }, { who: 'choices', options: [ { ru: 'Ташкент', uz: 'Toshkent', pick: true }, { ru: 'Самарканд', uz: 'Samarqand' }, { ru: 'Не важно', uz: 'Farqi yo‘q' }, ], add: ['location'] }, { who: 'assemble' }, { who: 'ai', text: { ru: 'Готово! Профиль собран на 86%. Я уже вижу твою оценочную стоимость и 3 роли под тебя. Заглянем?', uz: 'Tayyor! Profil 86% yig‘ildi. Taxminiy qiymating va 3 ta rolni allaqachon ko‘ryapman. Ko‘ramizmi?' } }, ]; // the tray facts revealed during chat const TRAY = { role: { key: 'role', icon: 'target', val: PERSONA.goal }, skills: { key: 'skills', icon: 'spark', val: { ru: 'SMM · Таргет · Контент · +3', uz: 'SMM · Target · Kontent · +3' } }, education: { key: 'education', icon: 'cap', val: PERSONA.edu }, experience: { key: 'experience',icon: 'briefcase', val: PERSONA.exp }, schedule: { key: 'schedule', icon: 'clock', val: PERSONA.schedule }, location: { key: 'location', icon: 'pin', val: PERSONA.location }, }; // weekly pulse / stories const STORIES = [ { type: 'value', accent: true, kicker: { ru: 'Изменения за неделю', uz: 'Hafta o‘zgarishlari' }, title: { ru: 'Твоя стоимость растёт', uz: 'Qiymating o‘smoqda' }, value: 5200000, trend: 8, sub: { ru: 'Рынок ценит твой SMM выше, чем неделю назад', uz: 'Bozor sening SMM’ingni bir hafta avvalgidan yuqori baholaydi' }, }, { type: 'watchers', kicker: { ru: 'Тебя заметили', uz: 'Seni payqashdi' }, big: '14', title: { ru: 'работодателей смотрели профили как у тебя', uz: 'ish beruvchi sendek profillarni ko‘rdi' }, sub: { ru: 'Включи «Открыт к предложениям» — попадёшь в их шортлисты', uz: '«Takliflarga ochiq»ni yoq — ularning ro‘yxatiga tushasan' }, }, { type: 'demand', kicker: { ru: 'Рынок навыков', uz: 'Ko‘nikmalar bozori' }, title: { ru: 'Спрос на SMM вырос', uz: 'SMM ga talab oshdi' }, delta: 12, sub: { ru: 'За месяц +12% вакансий с твоими навыками в Ташкенте', uz: 'Bir oyda Toshkentda sening ko‘nikmalaring bilan +12% vakansiya' }, }, { type: 'role', accent: true, brand: 'korzinka', kicker: { ru: 'Новая роль под тебя', uz: 'Sen uchun yangi rol' }, title: { ru: 'SMM-менеджер', uz: 'SMM menejer' }, company: 'korzinka', match: 92, sub: { ru: 'Подходит: опыт Instagram, таргет, твой город', uz: 'Mos: Instagram tajribasi, target, sening shahring' }, }, { type: 'gap', kicker: { ru: 'Один шаг сегодня', uz: 'Bugun bitta qadam' }, title: { ru: 'До Middle не хватает Google Ads', uz: 'Middle’ga Google Ads yetmaydi' }, sub: { ru: '15 минут в день — и через 3 недели закроешь пробел', uz: 'Kuniga 15 daqiqa — 3 haftada yopasan' }, }, { type: 'progress', kicker: { ru: 'Твой прогресс', uz: 'Sening yutug‘ing' }, title: { ru: 'Аналитика +1 уровень', uz: 'Analitika +1 daraja' }, sub: { ru: 'Ты стал ближе к роли Middle на 6%', uz: 'Middle roliga 6% yaqinlashding' }, }, ]; // matched jobs const JOBS = [ { title: { ru: 'SMM-менеджер', uz: 'SMM menejer' }, brand: 'korzinka', salary: { ru: '5–7 млн сум', uz: '5–7 mln so‘m' }, match: 92, hot: true, tags: [{ ru: 'Ташкент', uz: 'Toshkent' }, { ru: 'Полная', uz: 'To‘liq' }, { ru: 'Офис', uz: 'Ofis' }], why: [ { ru: '5 лет ведёшь Instagram — их основной канал', uz: 'Instagram’da tajriba — ularning asosiy kanali' }, { ru: 'Базовый таргет закрывает 80% задач роли', uz: 'Boshlang‘ich target rol vazifalarining 80%ini yopadi' }, { ru: 'Твой город, офис в 20 минутах', uz: 'Sening shahring, ofis 20 daqiqada' }, ], }, { title: { ru: 'Маркетолог-стажёр', uz: 'Marketolog-amaliyotchi' }, brand: 'uzum', salary: { ru: '3 млн сум', uz: '3 mln so‘m' }, match: 84, intern: true, tags: [{ ru: 'Ташкент', uz: 'Toshkent' }, { ru: 'Стажировка', uz: 'Amaliyot' }, { ru: '3 мес', uz: '3 oy' }], why: [ { ru: 'Идеальный старт для выпускника без коммерч. опыта', uz: 'Tijorat tajribasisiz bitiruvchi uchun ideal start' }, { ru: 'Менторство и оффер при успехе', uz: 'Mentorlik va muvaffaqiyatda ish taklifi' }, ], }, { title: { ru: 'Таргетолог', uz: 'Targetolog' }, brand: 'payme', salary: { ru: '6–8 млн сум', uz: '6–8 mln so‘m' }, match: 81, tags: [{ ru: 'Ташкент', uz: 'Toshkent' }, { ru: 'Гибрид', uz: 'Gibrid' }], why: [ { ru: 'Твой опыт таргета — прямое попадание', uz: 'Target tajribang — to‘g‘ridan-to‘g‘ri moslik' }, { ru: 'Рост до Performance-маркетолога за год', uz: 'Bir yilda Performance marketologgacha o‘sish' }, ], }, { title: { ru: 'Контент-менеджер', uz: 'Kontent menejer' }, brand: 'click', salary: { ru: '4–5 млн сум', uz: '4–5 mln so‘m' }, match: 78, remote: true, tags: [{ ru: 'Удалёнка', uz: 'Masofadan' }, { ru: 'Гибкий график', uz: 'Moslashuvchan' }], why: [ { ru: 'Сильный копирайтинг и контент в профиле', uz: 'Profilda kuchli kopirayting va kontent' }, { ru: 'Удалёнка — как ты и просил', uz: 'Masofadan — so‘raganingdek' }, ], }, { title: { ru: 'Бренд-маркетолог (ассистент)', uz: 'Brend marketolog (assistent)' }, brand: 'artel', salary: { ru: '5 млн сум', uz: '5 mln so‘m' }, match: 73, tags: [{ ru: 'Ташкент', uz: 'Toshkent' }, { ru: 'Полная', uz: 'To‘liq' }], why: [ { ru: 'Шанс вырасти из digital в бренд-маркетинг', uz: 'Digital’dan brend marketingga o‘sish imkoni' }, { ru: 'Большой бренд — сильная строчка в резюме', uz: 'Yirik brend — rezyumeda kuchli qator' }, ], }, ]; // internships (students) const INTERNS = [ { title: { ru: 'Маркетинг · стажировка', uz: 'Marketing · amaliyot' }, brand: 'uzum', pay: true, gov: false, months: 3, sub: { ru: 'Оплачивается · оффер при успехе', uz: 'To‘lanadi · muvaffaqiyatda taklif' } }, { title: { ru: 'SMM · практика', uz: 'SMM · amaliyot' }, brand: 'go', pay: false, gov: true, months: 2, sub: { ru: 'Госпрограмма молодёжной занятости', uz: 'Yoshlar bandligi davlat dasturi' } }, { title: { ru: 'Digital · стажировка', uz: 'Digital · amaliyot' }, brand: 'beeline', pay: true, gov: false, months: 6, sub: { ru: 'Оплачивается · гибкий график для студентов', uz: 'To‘lanadi · talabalar uchun moslashuvchan' } }, { title: { ru: 'Контент · практика', uz: 'Kontent · amaliyot' }, brand: 'click', pay: true, gov: false, months: 3, sub: { ru: 'Оплачивается · удалённо', uz: 'To‘lanadi · masofadan' } }, { title: { ru: 'Аналитика · стажировка', uz: 'Analitika · amaliyot' }, brand: 'epam', pay: false, gov: true, months: 4, sub: { ru: 'Госпрограмма · менторство', uz: 'Davlat dasturi · mentorlik' } }, ]; // employers who recently viewed similar profiles (home rail) const VIEWERS = ['korzinka', 'uzum', 'payme', 'click', 'humans', 'artel', 'beeline', 'tbc']; // growth / gap const GROWTH = { goal: { ru: 'Middle Digital-маркетолог', uz: 'Middle Digital marketolog' }, readiness: 64, missing: [ { ru: 'Google Ads', uz: 'Google Ads', sev: 'gap', note: { ru: 'ключевой для роли', uz: 'rol uchun asosiy' } }, { ru: 'SQL — базовый', uz: 'SQL — boshlang‘ich', sev: 'mid', note: { ru: 'для аналитики', uz: 'analitika uchun' } }, { ru: 'English B1', uz: 'English B1', sev: 'mid', note: { ru: 'cross-border роли', uz: 'cross-border rollar' } }, ], steps: [ { ru: 'Пройти урок «Структура Google Ads»', uz: '«Google Ads tuzilishi» darsini o‘tash', mins: 15, state: 'todo' }, { ru: 'Собрать 1 тестовую кампанию', uz: '1 ta sinov kampaniya yig‘ish', mins: 30, state: 'todo' }, { ru: 'Обновить кейс в профиле', uz: 'Profildagi keysni yangilash', mins: 10, state: 'progress' }, ], }; // languages const LANGS = [ { ru: 'Узбекский', uz: 'O‘zbek', lvl: { ru: 'родной', uz: 'ona tili' }, pct: 100 }, { ru: 'Русский', uz: 'Rus', lvl: { ru: 'свободно', uz: 'erkin' }, pct: 90 }, { ru: 'English', uz: 'Ingliz', lvl: { ru: 'B1', uz: 'B1' }, pct: 55 }, ]; // experience timeline const EXPERIENCE = [ { role: { ru: 'SMM-фрилансер', uz: 'SMM frilanser' }, org: { ru: 'Частные проекты', uz: 'Shaxsiy loyihalar' }, period: { ru: '2024 — сейчас', uz: '2024 — hozir' }, dur: { ru: '1 год', uz: '1 yil' } }, { role: { ru: 'Контент-волонтёр', uz: 'Kontent volontyor' }, org: { ru: 'Студсовет ТГЭУ', uz: 'TDIU talabalar kengashi' }, period: { ru: '2023 — 2024', uz: '2023 — 2024' }, dur: { ru: '8 мес', uz: '8 oy' } }, ]; Object.assign(window, { UI, tr, BRAND, BRANDS, VIEWERS, PERSONA, SKILLS, CHAT, TRAY, STORIES, JOBS, INTERNS, GROWTH, LANGS, EXPERIENCE });