From 605bc3d0259e0d8e65cf64febaa898a0e6060e22 Mon Sep 17 00:00:00 2001 From: oskar Date: Fri, 31 Jul 2026 16:46:46 +0200 Subject: [PATCH] =?UTF-8?q?refactor(i18n):=20ca=C5=82a=20tre=C5=9B=C4=87?= =?UTF-8?q?=20landingu=20i=20/platforma=20przez=20useT()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Krok 1 z dwóch: przenosi stringi, nie tłumaczy ich. en.ts dostaje komplet kluczy z polską treścią — angielskie wartości wchodzą osobnym commitem, żeby diff tłumaczeń dało się czytać zdanie po zdaniu. - data/content.ts: zostaje sama struktura (id, icon, href). Ikony to komponenty Reacta i nie mogą wejść do słowników; kolejność i liczba kart są przez to zdefiniowane raz, a nie duplikowane per język. - i18n/types.ts + RichText: akapity z / w środku zdania trzymamy jako listę przebiegów. Bez dangerouslySetInnerHTML — tłumaczenie nie może wstrzyknąć znaczników. - en.ts typowane jako `typeof pl`, więc rozjazd kluczy to błąd builda. Przy ~150 kluczach to główne ryzyko tej zmiany. - privacy.backToHome -> common.backToHome (używane przez obie podstrony). Weryfikacja: renderowany tekst porównany z produkcją na wszystkich sześciu trasach — identyczny, poza linkiem powrotnym na /en/platforma, który był zahardkodowany po polsku i teraz zgadza się z /en/privacy. Co-Authored-By: Claude Opus 5 (1M context) --- src/components/About.tsx | 18 +- src/components/Audience.tsx | 8 +- src/components/CTASection.tsx | 12 +- src/components/Footer.tsx | 23 ++- src/components/Header.tsx | 18 +- src/components/Hero.tsx | 13 +- src/components/Offerings.tsx | 54 ++++-- src/components/PlatformPage.tsx | 194 ++++++-------------- src/components/PrivacyPolicyPage.tsx | 2 +- src/components/Process.tsx | 11 +- src/components/RichText.tsx | 36 ++++ src/components/WhyHumanAI.tsx | 12 +- src/data/content.ts | 111 ++++-------- src/i18n/en.ts | 254 ++++++++++++++++++++++++++- src/i18n/pl.ts | 247 +++++++++++++++++++++++++- src/i18n/types.ts | 17 ++ 16 files changed, 738 insertions(+), 292 deletions(-) create mode 100644 src/components/RichText.tsx create mode 100644 src/i18n/types.ts diff --git a/src/components/About.tsx b/src/components/About.tsx index 261f197..a123234 100644 --- a/src/components/About.tsx +++ b/src/components/About.tsx @@ -1,13 +1,10 @@ import React from 'react'; import { motion } from 'framer-motion'; import { CheckCircle2 } from 'lucide-react'; +import { useT } from '../i18n'; const About = () => { - const points = [ - "Strategia bez hype’u", - "Automatyzacje, które da się utrzymać", - "Agenci pod kontrolą człowieka" - ]; + const t = useT(); return (
@@ -19,14 +16,11 @@ const About = () => { viewport={{ once: true }} transition={{ duration: 0.6 }} > -

Czym jest humanAI?

-

- humanAI łączy doradztwo, automatyzację, budowę produktów i własne środowisko agentowe. - Pomagamy przejść od ciekawości wokół AI do działających procesów, narzędzi i systemów. -

- +

{t.about.title}

+

{t.about.lead}

+
- {points.map((point, index) => ( + {t.about.points.map((point, index) => ( { + const t = useT(); + return (
-

Dla kogo

+

{t.audience.title}

- {audience.map((item, index) => ( + {t.audience.items.map((item, index) => ( {
-

- Masz proces, który powinien już pracować sam? -

-

- Opowiedz, co robisz ręcznie, powtarzalnie albo zbyt wolno. Sprawdzimy, czy AI może to uprościć. -

+

{t.cta.title}

+

{t.cta.lead}

@@ -119,9 +115,7 @@ const CTASection = () => { support@gethumanai.pl
-

- "Na start wystarczy jeden proces, jeden problem albo jeden pomysł." -

+

{t.cta.quote}

diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx index a34f890..69b37da 100644 --- a/src/components/Footer.tsx +++ b/src/components/Footer.tsx @@ -1,9 +1,10 @@ import React from 'react'; -import { localizePath, stripLangPrefix, useLang } from '../i18n'; +import { localizePath, stripLangPrefix, useLang, useT } from '../i18n'; const Footer = () => { const currentYear = new Date().getFullYear(); const lang = useLang(); + const t = useT(); // Same reasoning as the /#section nav links below: this footer is shared with // /privacy and /platforma, so the logo needs a real href to get home from @@ -24,9 +25,7 @@ const Footer = () => { humanAI -

- ludzka strona AI — budujemy praktyczne systemy AI dla ludzi i organizacji. -

+

{t.footer.tagline}

-

Prywatność

+

{t.footer.privacyHeading}

-

© {currentYear} humanAI. Wszelkie prawa zastrzeżone.

+

© {currentYear} humanAI. {t.footer.rights}

LinkedIn X / Twitter diff --git a/src/components/Header.tsx b/src/components/Header.tsx index db1ccaa..b2c719b 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -1,11 +1,12 @@ import React, { useState, useEffect } from 'react'; import { Menu, X } from 'lucide-react'; import { motion, AnimatePresence } from 'framer-motion'; -import { localizePath, useLang } from '../i18n'; +import { localizePath, useLang, useT } from '../i18n'; import LangSwitcher from './LangSwitcher'; const Header = () => { const lang = useLang(); + const t = useT(); const [isScrolled, setIsScrolled] = useState(false); const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); @@ -19,13 +20,12 @@ const Header = () => { // Root-relative so the links also work from the standalone pages (/privacy, // /platforma), where these sections do not exist — and localized so they keep - // the visitor on the language they are currently reading. Labels stay Polish - // until the section copy itself is translated. + // the visitor on the language they are currently reading. const navLinks = [ - { name: 'Oferta', href: localizePath('/#offerings', lang) }, - { name: 'Platforma', href: localizePath('/platforma', lang) }, - { name: 'Proces', href: localizePath('/#process', lang) }, - { name: 'Kontakt', href: localizePath('/#contact', lang) }, + { name: t.nav.offerings, href: localizePath('/#offerings', lang) }, + { name: t.nav.platform, href: localizePath('/platforma', lang) }, + { name: t.nav.process, href: localizePath('/#process', lang) }, + { name: t.nav.contact, href: localizePath('/#contact', lang) }, ]; return ( @@ -51,7 +51,7 @@ const Header = () => { ))} - Porozmawiajmy + {t.nav.cta} @@ -90,7 +90,7 @@ const Header = () => { className="btn-primary text-center" onClick={() => setIsMobileMenuOpen(false)} > - Porozmawiajmy + {t.nav.cta}
setIsMobileMenuOpen(false)} /> diff --git a/src/components/Hero.tsx b/src/components/Hero.tsx index 15eb3ef..b604c8f 100644 --- a/src/components/Hero.tsx +++ b/src/components/Hero.tsx @@ -1,8 +1,11 @@ import React from 'react'; import { motion } from 'framer-motion'; import { ArrowRight } from 'lucide-react'; +import { useT } from '../i18n'; const Hero = () => { + const t = useT(); + return (
{/* Background elements */} @@ -17,18 +20,20 @@ const Hero = () => { transition={{ duration: 0.6 }} >

- Budujemy ludzką stronę AI + {t.hero.titleBefore} + {t.hero.titleAccent} + {t.hero.titleAfter}

- Projektujemy i wdrażamy systemy AI, które pomagają ludziom pracować szybciej, mądrzej i spokojniej — od automatyzacji po multiagentowe platformy produktowe. + {t.hero.subtitle}

diff --git a/src/components/Offerings.tsx b/src/components/Offerings.tsx index 230acc2..286e5cd 100644 --- a/src/components/Offerings.tsx +++ b/src/components/Offerings.tsx @@ -1,11 +1,29 @@ import React from 'react'; import { motion } from 'framer-motion'; import { offerings } from '../data/content'; +import type { OfferingId } from '../data/content'; +import { localizePath, useLang, useT } from '../i18n'; import { ArrowRight, ChevronRight } from 'lucide-react'; +import type { LucideIcon } from 'lucide-react'; -const OfferingCard = ({ offering, index }: { offering: any, index: number }) => { - const Icon = offering.icon; - +type Copy = { + title: string; + description: string; + points: readonly string[]; + linkLabel?: string; +}; + +const OfferingCard = ({ + copy, + icon: Icon, + href, + index, +}: { + copy: Copy; + icon: LucideIcon; + href?: string; + index: number; +}) => { return (
-

{offering.title}

+

{copy.title}

- {offering.description} + {copy.description}

    - {offering.points.map((point: string, i: number) => ( + {copy.points.map((point, i) => (
  • {point}
  • ))}
- {offering.link && ( + {href && copy.linkLabel && ( - {offering.link.label} + {copy.linkLabel} )} @@ -43,19 +61,29 @@ const OfferingCard = ({ offering, index }: { offering: any, index: number }) => }; const Offerings = () => { + const t = useT(); + const lang = useLang(); + return (
-

Nasza Oferta

+

{t.offerings.title}

- Budujemy kompleksowe rozwiązania, które przekładają potencjał sztucznej inteligencji na realne wyniki biznesowe. + {t.offerings.lead}

- +
{offerings.map((offering, index) => ( - + ))}
diff --git a/src/components/PlatformPage.tsx b/src/components/PlatformPage.tsx index e2da998..38a9e36 100644 --- a/src/components/PlatformPage.tsx +++ b/src/components/PlatformPage.tsx @@ -1,15 +1,28 @@ import React from 'react'; import { ArrowRight, Building2, CheckCircle2, ChevronRight, Home } from 'lucide-react'; import Footer from './Footer'; -import { localizePath, useLang } from '../i18n'; +import RichText from './RichText'; +import { localizePath, useLang, useT } from '../i18n'; +import type { Bullet } from '../i18n/types'; import LangSwitcher from './LangSwitcher'; -// Standalone product page at /platforma (and /en/platforma). The copy is not -// localized yet — the site only translates contact.* and privacy.* — but the -// links are, so reaching this page from /en does not strand you in Polish. +// Standalone product page at /platforma (and /en/platforma). All copy lives in +// i18n under `platform`; paragraphs that carry inline emphasis are stored as +// runs and rendered through (see i18n/types.ts). const PlatformPage = () => { + const t = useT(); const lang = useLang(); + const renderBullet = (bullet: Bullet, i: number, Icon: typeof ChevronRight) => ( +
  • + + + {bullet.lead && {bullet.lead}} + {bullet.body && } + +
  • + ); + return (
    @@ -19,7 +32,7 @@ const PlatformPage = () => { @@ -27,83 +40,42 @@ const PlatformPage = () => {
    -

    Nadzór nad systemami agentowymi

    -

    - (nazwa robocza — do potwierdzenia przed publikacją) -

    +

    {t.platform.title}

    +

    {t.platform.workingName}

    {/* ── Kto pilnuje agentów ───────────────────────────────────────── */}
    -

    - Kto pilnuje agentów, którzy pilnują wszystkiego innego? -

    -

    - {'Automatyzacje i agenci AI potrafią pracować bez człowieka — porządkować dokumenty, sterować urządzeniami, reagować na zdarzenia. Ale zostawione bez nadzoru, prędzej czy później zrobią coś, czego nikt nie chciał. Zbudowaliśmy system, który '} - - obserwuje inne systemy — w tym inne systemy agentowe - - {' — wykrywa, że coś nie działa, diagnozuje przyczynę i naprawia problem sam. A tam, gdzie decyzja jest nieodwracalna, czeka na człowieka.'} -

    -

    - {'To nie koncept. Ten sam rdzeń od miesięcy prowadzi naszą własną, rozproszoną infrastrukturę — i przeszedł przez realne awarie, z których każda coś go nauczyła.'} -

    +

    {t.platform.watchers.title}

    + {t.platform.watchers.paragraphs.map((paragraph, i) => ( +

    + +

    + ))}
    {/* ── Problem, który znika ──────────────────────────────────────── */}
    -

    Problem, który znika

    +

    {t.platform.problem.title}

      -
    • - - - Autonomia bez ram to ryzyko. - {' Coś, co może samo otworzyć bramę albo zmienić konfigurację usługi, potrzebuje jasnej granicy: co wolno zrobić samodzielnie, co wymaga zgody człowieka.'} - -
    • -
    • - - - Automatyka to nie inteligencja. - {' Wiele domów i firm ma już systemy, które '} - wykonują - {' polecenia — światła, rolety, bramy, obieg dokumentów. Problem w tym, że nic tego nie '} - rozumie - {': nie kojarzy faktów, nie reaguje na kontekst, nie uczy się.'} - -
    • -
    • - - - Wiedza znika. - {' Dlaczego coś się zepsuło miesiąc temu i co wtedy pomogło? Zwykle ta wiedza siedzi w głowie jednej osoby albo w nieprzeszukiwalnym stosie dokumentów.'} - -
    • + {t.platform.problem.bullets.map((bullet, i) => renderBullet(bullet, i, ChevronRight))}
    {/* ── Jak to działa ─────────────────────────────────────────────── */}
    -

    Jak to działa

    +

    {t.platform.howItWorks.title}

    - - Rdzeń nadzoru — jeden, wspólny dla wszystkiego. - - {' Lekki agent na każdej maszynie zgłasza stan usług. Centralny „mózg" buduje z tego pełny obraz sytuacji, wykrywa odchylenia od tego, co powinno działać, i albo naprawia problem sam — jeśli akcja jest bezpieczna — albo pyta człowieka, jeśli nie jest.'} +

    - {'To „pytanie człowieka" nie jest teorią. Przykład z życia: system zauważa, że wyjechałeś na weekend, a rolety zostały otwarte. Sam ich nie zamknie — wysyła Ci wiadomość: '} - {'„Nie zamknąłeś rolet. Zamknąć teraz?"'} - {' Odpisujesz „tak" — i dopiero wtedy system zleca to istniejącej automatyce domowej. Decyzja zawsze należy do Ciebie; wykonanie bierze na siebie system.'} +

    - - System roboczy — budowany pod Ciebie. - - {' To, co ten nadzór pilnuje, dopasowujemy do konkretnej potrzeby.'} +

    {/* Dwie ścieżki, jeden rdzeń — karty obok siebie */} @@ -112,11 +84,9 @@ const PlatformPage = () => {
    -

    Dla domu

    +

    {t.platform.howItWorks.home.title}

    - {'Masz już zautomatyzowany dom — światła, rolety, bramy, klimatyzację — ale to automatyka, nie inteligencja: robi dokładnie to, co jej każesz, i nic więcej. Dokładamy warstwę, która '} - rozumie kontekst - {': rozpoznaje Twój samochód po tablicy rejestracyjnej i otwiera bramę, zanim dojedziesz do niej. Widzi na kamerach, że nikogo nie ma w domu, i sama wygasza światła na noc. Zauważa, że wyjechałeś, a coś zostało otwarte — i pyta, zanim cokolwiek zrobi.'} +

    @@ -124,116 +94,52 @@ const PlatformPage = () => {
    -

    Dla firm

    +

    {t.platform.howItWorks.business.title}

    - {'Masz bałagan w dokumentach, obieg papierowy, który nikogo nie satysfakcjonuje, i dane rozsiane po cudzych chmurach, nad którymi nie masz pełnej kontroli. Budujemy Ci paperless na Twoich własnych serwerach — z własną domeną i autoryzacją, bez uzależnienia od zewnętrznych dostawców chmury. Indeksujemy dokumenty, zdjęcia i korespondencję tak, żeby dało się to przeszukać po sensie, nie po słowach kluczowych. Interfejs — webowy panel, a jeśli to naprawdę pasuje do Twojej firmy, także chatbot — dobieramy do tego, czego faktycznie potrzebujesz, a nie do tego, co akurat modne.'} +

    - {'Obie ścieżki łączy to samo: cała konfiguracja tego, co ma działać, jest zapisana jako kod w repozytorium — każda zmiana ma historię i da się ją cofnąć — i obie działają pod tym samym nadzorem, który pilnuje, żeby nic nie zawiodło po cichu.'} +

    {/* ── Pod maską ─────────────────────────────────────────────────── */}
    -

    Pod maską — dla ciekawych

    +

    {t.platform.underTheHood.title}

      -
    • - - - {'Baza wiedzy nie kończy jako martwy indeks. Nad wyszukiwaniem semantycznym powstaje '} - - czytelna, kompilowana wiki utrzymywana przez model językowy - - {' — pliki tekstowe z linkami między pojęciami, które agent czyta i aktualizuje tak jak człowiek utrzymuje kod. Budujemy to na otwartym standardzie (Google OKF), nie na własnym, zamkniętym formacie — żeby wiedza, którą zbudujemy, zawsze zostawała czytelna i przenośna.'} - -
    • -
    • - - - {'Do zapytań najpierw sięga tańszy model — droższy dopiero wtedy, gdy sprawa naprawdę tego wymaga. W praktyce: streszczenie całego korpusu dokumentów potrafiło kosztować grosze zamiast dni obliczeń.'} - -
    • -
    • - - - {'Nie wszystko musi być online 24 godziny na dobę. Kiedy główna maszyna śpi, zapytania automatycznie przejmuje zapasowy sprzęt — bez przerwy zauważalnej dla użytkownika.'} - -
    • -
    • - - - {'System sam odróżnia „usługa nie działa" od „usługa śpi zgodnie z planem" — co wcześniej było częstym źródłem fałszywych alarmów.'} - -
    • + {t.platform.underTheHood.bullets.map((bullet, i) => renderBullet(bullet, i, ChevronRight))}
    {/* ── Dlaczego to ───────────────────────────────────────────────── */}
    -

    - Dlaczego to, a nie zwykły monitoring czy zwykła automatyka -

    +

    {t.platform.why.title}

      -
    • - - - - Rozumiemy kontekst, nie tylko wykonujemy polecenia. - - -
    • -
    • - - - Naprawiamy, nie tylko alarmujemy. - -
    • -
    • - - - Człowiek naprawdę jest w pętli - {' — decyzje zawsze do Ciebie, wykonanie bierze na siebie system.'} - -
    • -
    • - - - Zero czarnej skrzynki. - {' Każda decyzja zostawia ślad, który można później przejrzeć.'} - -
    • -
    • - - - Twoje dane zostają Twoje - {' — własny serwer, własna domena, bez uzależnienia od cudzej chmury.'} - -
    • + {t.platform.why.bullets.map((bullet, i) => renderBullet(bullet, i, CheckCircle2))}
    {/* ── Gdzie jesteśmy ────────────────────────────────────────────── */}
    -

    Uczciwie o tym, gdzie jesteśmy

    -

    - {'Rdzeń nadzoru prowadzi naszą infrastrukturę na co dzień — samonaprawa działa od początku do końca, alerty trafiają na telefon, baza wiedzy odpowiada na pytania nawet gdy główny sprzęt śpi.'} -

    -

    - {'Dedykowane wdrożenia — pod konkretny dom czy firmę — budujemy w miarę potrzeb, opierając się na tym samym, sprawdzonym rdzeniu. Wolimy powiedzieć wprost, co jeszcze dopracowujemy, niż obiecywać więcej niż działa.'} -

    +

    {t.platform.status.title}

    + {t.platform.status.paragraphs.map((paragraph, i) => ( +

    + +

    + ))}
    {/* ── CTA ───────────────────────────────────────────────────────── */}
    -

    Umów rozmowę

    +

    {t.platform.cta.title}

    - {'Powiedz, co chcesz zautomatyzować albo uporządkować — zobaczymy, jak to zbudować i objąć nadzorem, który sami na sobie testujemy.'} +

    - Porozmawiajmy + {t.platform.cta.button}
    diff --git a/src/components/PrivacyPolicyPage.tsx b/src/components/PrivacyPolicyPage.tsx index 5de2e1f..f66188d 100644 --- a/src/components/PrivacyPolicyPage.tsx +++ b/src/components/PrivacyPolicyPage.tsx @@ -17,7 +17,7 @@ const PrivacyPolicyPage = () => { diff --git a/src/components/Process.tsx b/src/components/Process.tsx index b64dd6c..35eb221 100644 --- a/src/components/Process.tsx +++ b/src/components/Process.tsx @@ -1,13 +1,16 @@ import React from 'react'; import { motion } from 'framer-motion'; import { processSteps } from '../data/content'; +import { useT } from '../i18n'; const Process = () => { + const t = useT(); + return (
    -

    Od pomysłu do działającego systemu

    +

    {t.process.title}

    @@ -30,8 +33,10 @@ const Process = () => {
    - Krok {step.id} -

    {step.title}

    + + {t.process.stepLabel} {step.number} + +

    {t.process.steps[step.id]}

    ); diff --git a/src/components/RichText.tsx b/src/components/RichText.tsx new file mode 100644 index 0000000..6326706 --- /dev/null +++ b/src/components/RichText.tsx @@ -0,0 +1,36 @@ +import React from 'react'; +import type { Rich } from '../i18n/types'; + +/** + * Renders copy that carries inline emphasis (see i18n/types.ts). Keeps the + * dictionaries free of markup: no dangerouslySetInnerHTML, so a translation can + * never inject elements. + */ +const RichText = ({ content }: { content: Rich }) => { + if (typeof content === 'string') return <>{content}; + + return ( + <> + {content.map((run, i) => { + if (run.em === 'strong') { + return ( + + {run.t} + + ); + } + if (run.em === 'quote') { + return ( + + {run.t} + + ); + } + if (run.em === 'em') return {run.t}; + return {run.t}; + })} + + ); +}; + +export default RichText; diff --git a/src/components/WhyHumanAI.tsx b/src/components/WhyHumanAI.tsx index 23ae49b..7873873 100644 --- a/src/components/WhyHumanAI.tsx +++ b/src/components/WhyHumanAI.tsx @@ -1,8 +1,11 @@ import React from 'react'; import { motion } from 'framer-motion'; import { whyHumanAI } from '../data/content'; +import { useT } from '../i18n'; const WhyHumanAI = () => { + const t = useT(); + return (
    @@ -13,7 +16,7 @@ const WhyHumanAI = () => { viewport={{ once: true }} className="text-3xl md:text-5xl font-bold mb-8" > - AI nie powinno być czarną skrzynką + {t.why.title} { transition={{ delay: 0.1 }} className="text-xl text-muted leading-relaxed" > - Najlepsze wdrożenia AI są zrozumiałe, mierzalne i bezpieczne. Dlatego projektujemy systemy, - które pokazują swoje działanie, zostawiają ślad decyzyjny i pozwalają człowiekowi zatwierdzać ważne kroki. + {t.why.lead}
    @@ -32,7 +34,7 @@ const WhyHumanAI = () => { const Icon = item.icon; return ( {
    -

    {item.title}

    +

    {t.why.items[item.id]}

    ); })} diff --git a/src/data/content.ts b/src/data/content.ts index b517313..d2e0d7f 100644 --- a/src/data/content.ts +++ b/src/data/content.ts @@ -1,83 +1,46 @@ -import { - Zap, - Search, - Workflow, - Layers, - Users, - Cpu, - ShieldCheck, - BarChart3, - Layout, - MessageSquare, +import { + Zap, + Search, + Workflow, + Layers, + Users, + Cpu, + ShieldCheck, + BarChart3, + Layout, Eye, Settings, - Rocket + Rocket, } from 'lucide-react'; +// Structure only — no copy. Icons are React components and cannot live in the +// dictionaries without pulling React into them, and ids/hrefs are not +// translatable anyway. The matching text lives in i18n under the same id, so +// order and cardinality are defined once here rather than duplicated per +// language. + export const offerings = [ - { - id: 'strategy', - title: 'AI Strategy & Advisory', - description: 'Pomagamy znaleźć realne zastosowania AI w firmie, wybrać priorytety i zaplanować wdrożenia bez przepalania czasu na przypadkowe eksperymenty.', - points: ['audyt procesów', 'mapa use case’ów', 'priorytetyzacja wdrożeń', 'polityki bezpieczeństwa AI'], - icon: Search - }, - { - id: 'automation', - title: 'AI Automation & Workflows', - description: 'Budujemy automatyzacje, które łączą modele AI z codziennymi narzędziami: dokumentami, mailem, CRM, bazami danych, API i wewnętrznymi procesami.', - points: ['automatyzacje operacyjne', 'integracje API', 'workflow z człowiekiem w pętli', 'monitoring i logi'], - icon: Workflow - }, - { - id: 'products', - title: 'AI Products & Interfaces', - description: 'Projektujemy i tworzymy aplikacje, panele, chatboty, copilots i wyszukiwarki semantyczne, które przekładają AI na użyteczne doświadczenie użytkownika.', - points: ['aplikacje webowe', 'panele AI', 'chatboty i copilots', 'RAG / wyszukiwanie w wiedzy'], - icon: Layout - }, - { - id: 'multiagent', - title: 'Multiagent Systems & Infrastructure', - description: 'Tworzymy systemy wieloagentowe, które potrafią planować, wykonywać zadania, korzystać z narzędzi i współpracować z człowiekiem przy zachowaniu kontroli i audytowalności.', - points: ['agent orchestration', 'tool registry / MCP', 'approval gates', 'pamięć, logi i obserwowalność'], - icon: Cpu, - // Deep-link to the dedicated product page (/platforma). - link: { label: 'Zobacz jak to działa', href: '/platforma' } - } -]; + { id: 'strategy', icon: Search }, + { id: 'automation', icon: Workflow }, + { id: 'products', icon: Layout }, + // Deep-link to the dedicated product page; the label is translated. + { id: 'multiagent', icon: Cpu, link: { href: '/platforma' } }, +] as const; +export type OfferingId = (typeof offerings)[number]['id']; export const whyHumanAI = [ - { - title: 'Human-in-the-loop', - icon: Users - }, - { - title: 'Bezpieczeństwo od początku', - icon: ShieldCheck - }, - { - title: 'Integracja z istniejącymi narzędziami', - icon: Layers - }, - { - title: 'Mierzalny efekt biznesowy', - icon: BarChart3 - } -]; + { id: 'hitl', icon: Users }, + { id: 'security', icon: ShieldCheck }, + { id: 'integration', icon: Layers }, + { id: 'impact', icon: BarChart3 }, +] as const; +export type WhyId = (typeof whyHumanAI)[number]['id']; export const processSteps = [ - { id: 1, title: 'Diagnoza', icon: Eye }, - { id: 2, title: 'Projekt rozwiązania', icon: Layout }, - { id: 3, title: 'Prototyp', icon: Zap }, - { id: 4, title: 'Wdrożenie', icon: Rocket }, - { id: 5, title: 'Utrzymanie i rozwój', icon: Settings } -]; - -export const audience = [ - 'founderzy i małe zespoły', - 'firmy usługowe', - 'działy operacyjne', - 'zespoły produktowe', - 'software house’y i integratorzy' -]; + { id: 'diagnosis', number: 1, icon: Eye }, + { id: 'design', number: 2, icon: Layout }, + { id: 'prototype', number: 3, icon: Zap }, + { id: 'deployment', number: 4, icon: Rocket }, + { id: 'maintenance', number: 5, icon: Settings }, +] as const; +export type StepId = (typeof processSteps)[number]['id']; diff --git a/src/i18n/en.ts b/src/i18n/en.ts index 5ea23fa..06dcda6 100644 --- a/src/i18n/en.ts +++ b/src/i18n/en.ts @@ -1,4 +1,122 @@ -export const en = { +import type { Bullet, Rich } from './types'; +import type { pl } from './pl'; + +// Step 1 of the i18n rollout: the keys are in place, the values are still the +// Polish source text. Translating them is the next commit — this file's diff is +// then purely textual and reviewable sentence by sentence. + +export const en: typeof pl = { + nav: { + offerings: 'Oferta', + platform: 'Platforma', + process: 'Proces', + contact: 'Kontakt', + cta: 'Porozmawiajmy', + }, + common: { + backToHome: '← Back to homepage', + }, + hero: { + // Split so the accent span can wrap a different phrase per language. + titleBefore: 'Budujemy ', + titleAccent: 'ludzką stronę', + titleAfter: ' AI', + subtitle: + 'Projektujemy i wdrażamy systemy AI, które pomagają ludziom pracować szybciej, mądrzej i spokojniej — od automatyzacji po multiagentowe platformy produktowe.', + ctaPrimary: 'Zacznijmy od audytu AI', + ctaSecondary: 'Zobacz ofertę', + }, + about: { + title: 'Czym jest humanAI?', + lead: 'humanAI łączy doradztwo, automatyzację, budowę produktów i własne środowisko agentowe. Pomagamy przejść od ciekawości wokół AI do działających procesów, narzędzi i systemów.', + points: [ + 'Strategia bez hype’u', + 'Automatyzacje, które da się utrzymać', + 'Agenci pod kontrolą człowieka', + ], + }, + offerings: { + title: 'Nasza Oferta', + lead: 'Budujemy kompleksowe rozwiązania, które przekładają potencjał sztucznej inteligencji na realne wyniki biznesowe.', + // Service names stay identical across languages, but are kept as per-language + // keys so they can diverge later without a refactor. + items: { + strategy: { + title: 'AI Strategy & Advisory', + description: + 'Pomagamy znaleźć realne zastosowania AI w firmie, wybrać priorytety i zaplanować wdrożenia bez przepalania czasu na przypadkowe eksperymenty.', + points: ['audyt procesów', 'mapa use case’ów', 'priorytetyzacja wdrożeń', 'polityki bezpieczeństwa AI'], + }, + automation: { + title: 'AI Automation & Workflows', + description: + 'Budujemy automatyzacje, które łączą modele AI z codziennymi narzędziami: dokumentami, mailem, CRM, bazami danych, API i wewnętrznymi procesami.', + points: ['automatyzacje operacyjne', 'integracje API', 'workflow z człowiekiem w pętli', 'monitoring i logi'], + }, + products: { + title: 'AI Products & Interfaces', + description: + 'Projektujemy i tworzymy aplikacje, panele, chatboty, copilots i wyszukiwarki semantyczne, które przekładają AI na użyteczne doświadczenie użytkownika.', + points: ['aplikacje webowe', 'panele AI', 'chatboty i copilots', 'RAG / wyszukiwanie w wiedzy'], + }, + multiagent: { + title: 'Multiagent Systems & Infrastructure', + description: + 'Tworzymy systemy wieloagentowe, które potrafią planować, wykonywać zadania, korzystać z narzędzi i współpracować z człowiekiem przy zachowaniu kontroli i audytowalności.', + points: ['agent orchestration', 'tool registry / MCP', 'approval gates', 'pamięć, logi i obserwowalność'], + linkLabel: 'Zobacz jak to działa', + }, + }, + }, + why: { + title: 'AI nie powinno być czarną skrzynką', + lead: 'Najlepsze wdrożenia AI są zrozumiałe, mierzalne i bezpieczne. Dlatego projektujemy systemy, które pokazują swoje działanie, zostawiają ślad decyzyjny i pozwalają człowiekowi zatwierdzać ważne kroki.', + items: { + hitl: 'Human-in-the-loop', + security: 'Bezpieczeństwo od początku', + integration: 'Integracja z istniejącymi narzędziami', + impact: 'Mierzalny efekt biznesowy', + }, + }, + process: { + title: 'Od pomysłu do działającego systemu', + stepLabel: 'Krok', + steps: { + diagnosis: 'Diagnoza', + design: 'Projekt rozwiązania', + prototype: 'Prototyp', + deployment: 'Wdrożenie', + maintenance: 'Utrzymanie i rozwój', + }, + }, + audience: { + title: 'Dla kogo', + items: [ + 'founderzy i małe zespoły', + 'firmy usługowe', + 'działy operacyjne', + 'zespoły produktowe', + 'software house’y i integratorzy', + ], + }, + cta: { + title: 'Masz proces, który powinien już pracować sam?', + lead: 'Opowiedz, co robisz ręcznie, powtarzalnie albo zbyt wolno. Sprawdzimy, czy AI może to uprościć.', + quote: '"Na start wystarczy jeden proces, jeden problem albo jeden pomysł."', + }, + footer: { + tagline: 'ludzka strona AI — budujemy praktyczne systemy AI dla ludzi i organizacji.', + navHeading: 'Nawigacja', + privacyHeading: 'Prywatność', + privacyPolicy: 'Polityka prywatności', + cookies: 'Cookies', + rights: 'Wszelkie prawa zastrzeżone.', + }, + meta: { + title: 'humanAI — ludzka strona AI', + description: + 'Strategia, automatyzacje, produkty AI i systemy multiagentowe projektowane z człowiekiem w centrum.', + }, contact: { labelName: 'Name', placeholderName: 'Your name', @@ -25,7 +143,6 @@ export const en = { title: 'Privacy Policy', lastUpdated: 'Last updated: June 2026', intro: 'This privacy policy describes how humanAI (gethumanai.pl) processes personal data and protects the privacy of its users.', - backToHome: '← Back to homepage', sections: [ { title: '1. Data Controller', @@ -53,4 +170,137 @@ export const en = { }, ], }, + platform: { + title: 'Nadzór nad systemami agentowymi', + workingName: '(nazwa robocza — do potwierdzenia przed publikacją)', + watchers: { + title: 'Kto pilnuje agentów, którzy pilnują wszystkiego innego?', + paragraphs: [ + [ + { + t: 'Automatyzacje i agenci AI potrafią pracować bez człowieka — porządkować dokumenty, sterować urządzeniami, reagować na zdarzenia. Ale zostawione bez nadzoru, prędzej czy później zrobią coś, czego nikt nie chciał. Zbudowaliśmy system, który ', + }, + { t: 'obserwuje inne systemy — w tym inne systemy agentowe', em: 'strong' }, + { + t: ' — wykrywa, że coś nie działa, diagnozuje przyczynę i naprawia problem sam. A tam, gdzie decyzja jest nieodwracalna, czeka na człowieka.', + }, + ], + 'To nie koncept. Ten sam rdzeń od miesięcy prowadzi naszą własną, rozproszoną infrastrukturę — i przeszedł przez realne awarie, z których każda coś go nauczyła.', + ] as Rich[], + }, + problem: { + title: 'Problem, który znika', + bullets: [ + { + lead: 'Autonomia bez ram to ryzyko.', + body: ' Coś, co może samo otworzyć bramę albo zmienić konfigurację usługi, potrzebuje jasnej granicy: co wolno zrobić samodzielnie, co wymaga zgody człowieka.', + }, + { + lead: 'Automatyka to nie inteligencja.', + body: [ + { t: ' Wiele domów i firm ma już systemy, które ' }, + { t: 'wykonują', em: 'em' }, + { t: ' polecenia — światła, rolety, bramy, obieg dokumentów. Problem w tym, że nic tego nie ' }, + { t: 'rozumie', em: 'em' }, + { t: ': nie kojarzy faktów, nie reaguje na kontekst, nie uczy się.' }, + ], + }, + { + lead: 'Wiedza znika.', + body: ' Dlaczego coś się zepsuło miesiąc temu i co wtedy pomogło? Zwykle ta wiedza siedzi w głowie jednej osoby albo w nieprzeszukiwalnym stosie dokumentów.', + }, + ] as Bullet[], + }, + howItWorks: { + title: 'Jak to działa', + core: [ + { t: 'Rdzeń nadzoru — jeden, wspólny dla wszystkiego.', em: 'strong' }, + { + t: ' Lekki agent na każdej maszynie zgłasza stan usług. Centralny „mózg" buduje z tego pełny obraz sytuacji, wykrywa odchylenia od tego, co powinno działać, i albo naprawia problem sam — jeśli akcja jest bezpieczna — albo pyta człowieka, jeśli nie jest.', + }, + ] as Rich, + humanAsk: [ + { + t: 'To „pytanie człowieka" nie jest teorią. Przykład z życia: system zauważa, że wyjechałeś na weekend, a rolety zostały otwarte. Sam ich nie zamknie — wysyła Ci wiadomość: ', + }, + { t: '„Nie zamknąłeś rolet. Zamknąć teraz?"', em: 'quote' }, + { + t: ' Odpisujesz „tak" — i dopiero wtedy system zleca to istniejącej automatyce domowej. Decyzja zawsze należy do Ciebie; wykonanie bierze na siebie system.', + }, + ] as Rich, + tailored: [ + { t: 'System roboczy — budowany pod Ciebie.', em: 'strong' }, + { t: ' To, co ten nadzór pilnuje, dopasowujemy do konkretnej potrzeby.' }, + ] as Rich, + home: { + title: 'Dla domu', + body: [ + { + t: 'Masz już zautomatyzowany dom — światła, rolety, bramy, klimatyzację — ale to automatyka, nie inteligencja: robi dokładnie to, co jej każesz, i nic więcej. Dokładamy warstwę, która ', + }, + { t: 'rozumie kontekst', em: 'strong' }, + { + t: ': rozpoznaje Twój samochód po tablicy rejestracyjnej i otwiera bramę, zanim dojedziesz do niej. Widzi na kamerach, że nikogo nie ma w domu, i sama wygasza światła na noc. Zauważa, że wyjechałeś, a coś zostało otwarte — i pyta, zanim cokolwiek zrobi.', + }, + ] as Rich, + }, + business: { + title: 'Dla firm', + body: 'Masz bałagan w dokumentach, obieg papierowy, który nikogo nie satysfakcjonuje, i dane rozsiane po cudzych chmurach, nad którymi nie masz pełnej kontroli. Budujemy Ci paperless na Twoich własnych serwerach — z własną domeną i autoryzacją, bez uzależnienia od zewnętrznych dostawców chmury. Indeksujemy dokumenty, zdjęcia i korespondencję tak, żeby dało się to przeszukać po sensie, nie po słowach kluczowych. Interfejs — webowy panel, a jeśli to naprawdę pasuje do Twojej firmy, także chatbot — dobieramy do tego, czego faktycznie potrzebujesz, a nie do tego, co akurat modne.' as Rich, + }, + shared: + 'Obie ścieżki łączy to samo: cała konfiguracja tego, co ma działać, jest zapisana jako kod w repozytorium — każda zmiana ma historię i da się ją cofnąć — i obie działają pod tym samym nadzorem, który pilnuje, żeby nic nie zawiodło po cichu.' as Rich, + }, + underTheHood: { + title: 'Pod maską — dla ciekawych', + bullets: [ + { + body: [ + { t: 'Baza wiedzy nie kończy jako martwy indeks. Nad wyszukiwaniem semantycznym powstaje ' }, + { t: 'czytelna, kompilowana wiki utrzymywana przez model językowy', em: 'strong' }, + { + t: ' — pliki tekstowe z linkami między pojęciami, które agent czyta i aktualizuje tak jak człowiek utrzymuje kod. Budujemy to na otwartym standardzie (Google OKF), nie na własnym, zamkniętym formacie — żeby wiedza, którą zbudujemy, zawsze zostawała czytelna i przenośna.', + }, + ], + }, + { + body: 'Do zapytań najpierw sięga tańszy model — droższy dopiero wtedy, gdy sprawa naprawdę tego wymaga. W praktyce: streszczenie całego korpusu dokumentów potrafiło kosztować grosze zamiast dni obliczeń.', + }, + { + body: 'Nie wszystko musi być online 24 godziny na dobę. Kiedy główna maszyna śpi, zapytania automatycznie przejmuje zapasowy sprzęt — bez przerwy zauważalnej dla użytkownika.', + }, + { + body: 'System sam odróżnia „usługa nie działa" od „usługa śpi zgodnie z planem" — co wcześniej było częstym źródłem fałszywych alarmów.', + }, + ] as Bullet[], + }, + why: { + title: 'Dlaczego to, a nie zwykły monitoring czy zwykła automatyka', + bullets: [ + { lead: 'Rozumiemy kontekst, nie tylko wykonujemy polecenia.' }, + { lead: 'Naprawiamy, nie tylko alarmujemy.' }, + { + lead: 'Człowiek naprawdę jest w pętli', + body: ' — decyzje zawsze do Ciebie, wykonanie bierze na siebie system.', + }, + { lead: 'Zero czarnej skrzynki.', body: ' Każda decyzja zostawia ślad, który można później przejrzeć.' }, + { + lead: 'Twoje dane zostają Twoje', + body: ' — własny serwer, własna domena, bez uzależnienia od cudzej chmury.', + }, + ] as Bullet[], + }, + status: { + title: 'Uczciwie o tym, gdzie jesteśmy', + paragraphs: [ + 'Rdzeń nadzoru prowadzi naszą infrastrukturę na co dzień — samonaprawa działa od początku do końca, alerty trafiają na telefon, baza wiedzy odpowiada na pytania nawet gdy główny sprzęt śpi.', + 'Dedykowane wdrożenia — pod konkretny dom czy firmę — budujemy w miarę potrzeb, opierając się na tym samym, sprawdzonym rdzeniu. Wolimy powiedzieć wprost, co jeszcze dopracowujemy, niż obiecywać więcej niż działa.', + ] as Rich[], + }, + cta: { + title: 'Umów rozmowę', + body: 'Powiedz, co chcesz zautomatyzować albo uporządkować — zobaczymy, jak to zbudować i objąć nadzorem, który sami na sobie testujemy.' as Rich, + button: 'Porozmawiajmy', + }, + }, }; diff --git a/src/i18n/pl.ts b/src/i18n/pl.ts index bdd7459..32e9d01 100644 --- a/src/i18n/pl.ts +++ b/src/i18n/pl.ts @@ -1,4 +1,117 @@ +import type { Bullet, Rich } from './types'; + export const pl = { + nav: { + offerings: 'Oferta', + platform: 'Platforma', + process: 'Proces', + contact: 'Kontakt', + cta: 'Porozmawiajmy', + }, + common: { + backToHome: '← Wróć na stronę główną', + }, + hero: { + // Split so the accent span can wrap a different phrase per language. + titleBefore: 'Budujemy ', + titleAccent: 'ludzką stronę', + titleAfter: ' AI', + subtitle: + 'Projektujemy i wdrażamy systemy AI, które pomagają ludziom pracować szybciej, mądrzej i spokojniej — od automatyzacji po multiagentowe platformy produktowe.', + ctaPrimary: 'Zacznijmy od audytu AI', + ctaSecondary: 'Zobacz ofertę', + }, + about: { + title: 'Czym jest humanAI?', + lead: 'humanAI łączy doradztwo, automatyzację, budowę produktów i własne środowisko agentowe. Pomagamy przejść od ciekawości wokół AI do działających procesów, narzędzi i systemów.', + points: [ + 'Strategia bez hype’u', + 'Automatyzacje, które da się utrzymać', + 'Agenci pod kontrolą człowieka', + ], + }, + offerings: { + title: 'Nasza Oferta', + lead: 'Budujemy kompleksowe rozwiązania, które przekładają potencjał sztucznej inteligencji na realne wyniki biznesowe.', + // Service names stay identical across languages, but are kept as per-language + // keys so they can diverge later without a refactor. + items: { + strategy: { + title: 'AI Strategy & Advisory', + description: + 'Pomagamy znaleźć realne zastosowania AI w firmie, wybrać priorytety i zaplanować wdrożenia bez przepalania czasu na przypadkowe eksperymenty.', + points: ['audyt procesów', 'mapa use case’ów', 'priorytetyzacja wdrożeń', 'polityki bezpieczeństwa AI'], + }, + automation: { + title: 'AI Automation & Workflows', + description: + 'Budujemy automatyzacje, które łączą modele AI z codziennymi narzędziami: dokumentami, mailem, CRM, bazami danych, API i wewnętrznymi procesami.', + points: ['automatyzacje operacyjne', 'integracje API', 'workflow z człowiekiem w pętli', 'monitoring i logi'], + }, + products: { + title: 'AI Products & Interfaces', + description: + 'Projektujemy i tworzymy aplikacje, panele, chatboty, copilots i wyszukiwarki semantyczne, które przekładają AI na użyteczne doświadczenie użytkownika.', + points: ['aplikacje webowe', 'panele AI', 'chatboty i copilots', 'RAG / wyszukiwanie w wiedzy'], + }, + multiagent: { + title: 'Multiagent Systems & Infrastructure', + description: + 'Tworzymy systemy wieloagentowe, które potrafią planować, wykonywać zadania, korzystać z narzędzi i współpracować z człowiekiem przy zachowaniu kontroli i audytowalności.', + points: ['agent orchestration', 'tool registry / MCP', 'approval gates', 'pamięć, logi i obserwowalność'], + linkLabel: 'Zobacz jak to działa', + }, + }, + }, + why: { + title: 'AI nie powinno być czarną skrzynką', + lead: 'Najlepsze wdrożenia AI są zrozumiałe, mierzalne i bezpieczne. Dlatego projektujemy systemy, które pokazują swoje działanie, zostawiają ślad decyzyjny i pozwalają człowiekowi zatwierdzać ważne kroki.', + items: { + hitl: 'Human-in-the-loop', + security: 'Bezpieczeństwo od początku', + integration: 'Integracja z istniejącymi narzędziami', + impact: 'Mierzalny efekt biznesowy', + }, + }, + process: { + title: 'Od pomysłu do działającego systemu', + stepLabel: 'Krok', + steps: { + diagnosis: 'Diagnoza', + design: 'Projekt rozwiązania', + prototype: 'Prototyp', + deployment: 'Wdrożenie', + maintenance: 'Utrzymanie i rozwój', + }, + }, + audience: { + title: 'Dla kogo', + items: [ + 'founderzy i małe zespoły', + 'firmy usługowe', + 'działy operacyjne', + 'zespoły produktowe', + 'software house’y i integratorzy', + ], + }, + cta: { + title: 'Masz proces, który powinien już pracować sam?', + lead: 'Opowiedz, co robisz ręcznie, powtarzalnie albo zbyt wolno. Sprawdzimy, czy AI może to uprościć.', + quote: '"Na start wystarczy jeden proces, jeden problem albo jeden pomysł."', + }, + footer: { + tagline: 'ludzka strona AI — budujemy praktyczne systemy AI dla ludzi i organizacji.', + navHeading: 'Nawigacja', + privacyHeading: 'Prywatność', + privacyPolicy: 'Polityka prywatności', + cookies: 'Cookies', + rights: 'Wszelkie prawa zastrzeżone.', + }, + meta: { + title: 'humanAI — ludzka strona AI', + description: + 'Strategia, automatyzacje, produkty AI i systemy multiagentowe projektowane z człowiekiem w centrum.', + }, contact: { labelName: 'Imię', placeholderName: 'Twoje imię', @@ -25,7 +138,6 @@ export const pl = { title: 'Polityka prywatności', lastUpdated: 'Ostatnia aktualizacja: czerwiec 2026', intro: 'Niniejsza polityka prywatności opisuje, w jaki sposób humanAI (gethumanai.pl) przetwarza dane osobowe i dba o prywatność użytkowników.', - backToHome: '← Wróć na stronę główną', sections: [ { title: '1. Administrator danych', @@ -53,4 +165,137 @@ export const pl = { }, ], }, + platform: { + title: 'Nadzór nad systemami agentowymi', + workingName: '(nazwa robocza — do potwierdzenia przed publikacją)', + watchers: { + title: 'Kto pilnuje agentów, którzy pilnują wszystkiego innego?', + paragraphs: [ + [ + { + t: 'Automatyzacje i agenci AI potrafią pracować bez człowieka — porządkować dokumenty, sterować urządzeniami, reagować na zdarzenia. Ale zostawione bez nadzoru, prędzej czy później zrobią coś, czego nikt nie chciał. Zbudowaliśmy system, który ', + }, + { t: 'obserwuje inne systemy — w tym inne systemy agentowe', em: 'strong' }, + { + t: ' — wykrywa, że coś nie działa, diagnozuje przyczynę i naprawia problem sam. A tam, gdzie decyzja jest nieodwracalna, czeka na człowieka.', + }, + ], + 'To nie koncept. Ten sam rdzeń od miesięcy prowadzi naszą własną, rozproszoną infrastrukturę — i przeszedł przez realne awarie, z których każda coś go nauczyła.', + ] as Rich[], + }, + problem: { + title: 'Problem, który znika', + bullets: [ + { + lead: 'Autonomia bez ram to ryzyko.', + body: ' Coś, co może samo otworzyć bramę albo zmienić konfigurację usługi, potrzebuje jasnej granicy: co wolno zrobić samodzielnie, co wymaga zgody człowieka.', + }, + { + lead: 'Automatyka to nie inteligencja.', + body: [ + { t: ' Wiele domów i firm ma już systemy, które ' }, + { t: 'wykonują', em: 'em' }, + { t: ' polecenia — światła, rolety, bramy, obieg dokumentów. Problem w tym, że nic tego nie ' }, + { t: 'rozumie', em: 'em' }, + { t: ': nie kojarzy faktów, nie reaguje na kontekst, nie uczy się.' }, + ], + }, + { + lead: 'Wiedza znika.', + body: ' Dlaczego coś się zepsuło miesiąc temu i co wtedy pomogło? Zwykle ta wiedza siedzi w głowie jednej osoby albo w nieprzeszukiwalnym stosie dokumentów.', + }, + ] as Bullet[], + }, + howItWorks: { + title: 'Jak to działa', + core: [ + { t: 'Rdzeń nadzoru — jeden, wspólny dla wszystkiego.', em: 'strong' }, + { + t: ' Lekki agent na każdej maszynie zgłasza stan usług. Centralny „mózg" buduje z tego pełny obraz sytuacji, wykrywa odchylenia od tego, co powinno działać, i albo naprawia problem sam — jeśli akcja jest bezpieczna — albo pyta człowieka, jeśli nie jest.', + }, + ] as Rich, + humanAsk: [ + { + t: 'To „pytanie człowieka" nie jest teorią. Przykład z życia: system zauważa, że wyjechałeś na weekend, a rolety zostały otwarte. Sam ich nie zamknie — wysyła Ci wiadomość: ', + }, + { t: '„Nie zamknąłeś rolet. Zamknąć teraz?"', em: 'quote' }, + { + t: ' Odpisujesz „tak" — i dopiero wtedy system zleca to istniejącej automatyce domowej. Decyzja zawsze należy do Ciebie; wykonanie bierze na siebie system.', + }, + ] as Rich, + tailored: [ + { t: 'System roboczy — budowany pod Ciebie.', em: 'strong' }, + { t: ' To, co ten nadzór pilnuje, dopasowujemy do konkretnej potrzeby.' }, + ] as Rich, + home: { + title: 'Dla domu', + body: [ + { + t: 'Masz już zautomatyzowany dom — światła, rolety, bramy, klimatyzację — ale to automatyka, nie inteligencja: robi dokładnie to, co jej każesz, i nic więcej. Dokładamy warstwę, która ', + }, + { t: 'rozumie kontekst', em: 'strong' }, + { + t: ': rozpoznaje Twój samochód po tablicy rejestracyjnej i otwiera bramę, zanim dojedziesz do niej. Widzi na kamerach, że nikogo nie ma w domu, i sama wygasza światła na noc. Zauważa, że wyjechałeś, a coś zostało otwarte — i pyta, zanim cokolwiek zrobi.', + }, + ] as Rich, + }, + business: { + title: 'Dla firm', + body: 'Masz bałagan w dokumentach, obieg papierowy, który nikogo nie satysfakcjonuje, i dane rozsiane po cudzych chmurach, nad którymi nie masz pełnej kontroli. Budujemy Ci paperless na Twoich własnych serwerach — z własną domeną i autoryzacją, bez uzależnienia od zewnętrznych dostawców chmury. Indeksujemy dokumenty, zdjęcia i korespondencję tak, żeby dało się to przeszukać po sensie, nie po słowach kluczowych. Interfejs — webowy panel, a jeśli to naprawdę pasuje do Twojej firmy, także chatbot — dobieramy do tego, czego faktycznie potrzebujesz, a nie do tego, co akurat modne.' as Rich, + }, + shared: + 'Obie ścieżki łączy to samo: cała konfiguracja tego, co ma działać, jest zapisana jako kod w repozytorium — każda zmiana ma historię i da się ją cofnąć — i obie działają pod tym samym nadzorem, który pilnuje, żeby nic nie zawiodło po cichu.' as Rich, + }, + underTheHood: { + title: 'Pod maską — dla ciekawych', + bullets: [ + { + body: [ + { t: 'Baza wiedzy nie kończy jako martwy indeks. Nad wyszukiwaniem semantycznym powstaje ' }, + { t: 'czytelna, kompilowana wiki utrzymywana przez model językowy', em: 'strong' }, + { + t: ' — pliki tekstowe z linkami między pojęciami, które agent czyta i aktualizuje tak jak człowiek utrzymuje kod. Budujemy to na otwartym standardzie (Google OKF), nie na własnym, zamkniętym formacie — żeby wiedza, którą zbudujemy, zawsze zostawała czytelna i przenośna.', + }, + ], + }, + { + body: 'Do zapytań najpierw sięga tańszy model — droższy dopiero wtedy, gdy sprawa naprawdę tego wymaga. W praktyce: streszczenie całego korpusu dokumentów potrafiło kosztować grosze zamiast dni obliczeń.', + }, + { + body: 'Nie wszystko musi być online 24 godziny na dobę. Kiedy główna maszyna śpi, zapytania automatycznie przejmuje zapasowy sprzęt — bez przerwy zauważalnej dla użytkownika.', + }, + { + body: 'System sam odróżnia „usługa nie działa" od „usługa śpi zgodnie z planem" — co wcześniej było częstym źródłem fałszywych alarmów.', + }, + ] as Bullet[], + }, + why: { + title: 'Dlaczego to, a nie zwykły monitoring czy zwykła automatyka', + bullets: [ + { lead: 'Rozumiemy kontekst, nie tylko wykonujemy polecenia.' }, + { lead: 'Naprawiamy, nie tylko alarmujemy.' }, + { + lead: 'Człowiek naprawdę jest w pętli', + body: ' — decyzje zawsze do Ciebie, wykonanie bierze na siebie system.', + }, + { lead: 'Zero czarnej skrzynki.', body: ' Każda decyzja zostawia ślad, który można później przejrzeć.' }, + { + lead: 'Twoje dane zostają Twoje', + body: ' — własny serwer, własna domena, bez uzależnienia od cudzej chmury.', + }, + ] as Bullet[], + }, + status: { + title: 'Uczciwie o tym, gdzie jesteśmy', + paragraphs: [ + 'Rdzeń nadzoru prowadzi naszą infrastrukturę na co dzień — samonaprawa działa od początku do końca, alerty trafiają na telefon, baza wiedzy odpowiada na pytania nawet gdy główny sprzęt śpi.', + 'Dedykowane wdrożenia — pod konkretny dom czy firmę — budujemy w miarę potrzeb, opierając się na tym samym, sprawdzonym rdzeniu. Wolimy powiedzieć wprost, co jeszcze dopracowujemy, niż obiecywać więcej niż działa.', + ] as Rich[], + }, + cta: { + title: 'Umów rozmowę', + body: 'Powiedz, co chcesz zautomatyzować albo uporządkować — zobaczymy, jak to zbudować i objąć nadzorem, który sami na sobie testujemy.' as Rich, + button: 'Porozmawiajmy', + }, + }, }; diff --git a/src/i18n/types.ts b/src/i18n/types.ts new file mode 100644 index 0000000..d62e81e --- /dev/null +++ b/src/i18n/types.ts @@ -0,0 +1,17 @@ +/** + * Shapes for copy that carries inline emphasis. Text with / inside a + * sentence cannot be one flat string without either splitting the component or + * injecting HTML — so it is stored as a list of runs and rendered by . + */ + +export type Run = { + t: string; + /** 'quote' is an that brightens to full foreground — used for quoted speech. */ + em?: 'strong' | 'em' | 'quote'; +}; + +/** Plain text, or a run list when the sentence needs inline emphasis. */ +export type Rich = string | Run[]; + +/** List item rendered as an optional bold lead-in followed by the rest. */ +export type Bullet = { lead?: string; body?: Rich };