From da79e359fccdf26cc21425c911f564b205c4a1af Mon Sep 17 00:00:00 2001 From: oskar Date: Fri, 31 Jul 2026 16:49:44 +0200 Subject: [PATCH] =?UTF-8?q?feat(i18n):=20angielskie=20t=C5=82umaczenia=20t?= =?UTF-8?q?re=C5=9Bci=20+=20tytu=C5=82=20i=20opis=20per=20j=C4=99zyk?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Krok 2 z dwóch: podmiana wartości w en.ts — struktura kluczy bez zmian, więc diff jest czysto tekstowy. App.tsx ustawia teraz document.title i meta description z t.meta obok atrybutu lang, bo index.html ma je zaszyte po polsku. Jedna uwaga do treści: dopisek "(nazwa robocza — do potwierdzenia przed publikacją)" nie miał wersji angielskiej w materiale źródłowym, a polski tekst na stronie EN wyglądałby na błąd. Wpisałem "(working name — to be confirmed before launch)" — do poprawy, jeśli ma brzmieć inaczej. Weryfikacja lokalna przed deployem: /, /privacy i /platforma renderują tekst identyczny z produkcją; /en, /en/privacy i /en/platforma nie zawierają ani jednego polskiego znaku diakrytycznego. Co-Authored-By: Claude Opus 5 (1M context) --- src/App.tsx | 14 ++- src/i18n/en.ts | 225 ++++++++++++++++++++++++------------------------- 2 files changed, 122 insertions(+), 117 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 5a931c7..58d949e 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -10,7 +10,7 @@ import CTASection from './components/CTASection'; import Footer from './components/Footer'; import PrivacyPolicyPage from './components/PrivacyPolicyPage'; import PlatformPage from './components/PlatformPage'; -import { useLang, stripLangPrefix } from './i18n'; +import { useLang, useT, stripLangPrefix } from './i18n'; import { usePathname } from './router'; function App() { @@ -18,15 +18,21 @@ function App() { // of leaving a stale page under a changed URL. const pathname = usePathname(); const lang = useLang(); + const t = useT(); // One route table for both languages: /en/privacy and /privacy both match // '/privacy' here. const route = stripLangPrefix(pathname); - // index.html ships lang="pl"; keep the document honest on the English routes - // (screen readers, translation prompts, search engines all read this). + // index.html ships the Polish lang/title/description; keep the document + // honest on the English routes (screen readers, translation prompts, the + // browser tab, search engines all read these). useEffect(() => { document.documentElement.lang = lang; - }, [lang]); + document.title = t.meta.title; + document + .querySelector('meta[name="description"]') + ?.setAttribute('content', t.meta.description); + }, [lang, t]); // The landing sections are client-rendered, so when a /#section URL arrives // with the initial request — following "Oferta"/"Kontakt" from /privacy or diff --git a/src/i18n/en.ts b/src/i18n/en.ts index 06dcda6..d92cb35 100644 --- a/src/i18n/en.ts +++ b/src/i18n/en.ts @@ -1,121 +1,117 @@ 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', + offerings: 'Services', + platform: 'Platform', + process: 'Process', + contact: 'Contact', + cta: 'Let\'s talk', }, 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', + titleBefore: 'We build the human ', + titleAccent: 'side', + titleAfter: ' of 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ę', + 'We design and deploy AI systems that help people work faster, smarter, and with more peace of mind — from automation to multi-agent product platforms.', + ctaPrimary: 'Start with an AI audit', + ctaSecondary: 'See our services', }, 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.', + title: 'What is humanAI?', + lead: 'humanAI combines advisory, automation, product development, and our own agentic environment. We help you move from curiosity about AI to working processes, tools, and systems.', points: [ - 'Strategia bez hype’u', - 'Automatyzacje, które da się utrzymać', - 'Agenci pod kontrolą człowieka', + 'Strategy without the hype', + 'Automation you can actually maintain', + 'Agents under human control', ], }, offerings: { - title: 'Nasza Oferta', - lead: 'Budujemy kompleksowe rozwiązania, które przekładają potencjał sztucznej inteligencji na realne wyniki biznesowe.', + title: 'Our Services', + lead: 'We build end-to-end solutions that turn the potential of artificial intelligence into real business outcomes.', // 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'], + 'We help you find real applications for AI in your business, choose priorities, and plan deployments without burning time on random experiments.', + points: ['process audit', 'use-case mapping', 'deployment prioritisation', 'AI safety policies'], }, 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'], + 'We build automations that connect AI models with everyday tools: documents, email, CRM, databases, APIs, and internal processes.', + points: ['operational automation', 'API integrations', 'human-in-the-loop workflows', 'monitoring and logs'], }, 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'], + 'We design and build applications, dashboards, chatbots, copilots, and semantic search tools that turn AI into a genuinely useful user experience.', + points: ['web applications', 'AI dashboards', 'chatbots and copilots', 'RAG / knowledge search'], }, 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', + 'We build multi-agent systems that can plan, execute tasks, use tools, and collaborate with humans while keeping control and auditability intact.', + points: ['agent orchestration', 'tool registry / MCP', 'approval gates', 'memory, logs & observability'], + linkLabel: 'See how it works', }, }, }, 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.', + title: 'AI shouldn\'t be a black box', + lead: 'The best AI deployments are understandable, measurable, and safe. That\'s why we design systems that show their work, leave a decision trail, and let humans approve the steps that matter.', items: { hitl: 'Human-in-the-loop', - security: 'Bezpieczeństwo od początku', - integration: 'Integracja z istniejącymi narzędziami', - impact: 'Mierzalny efekt biznesowy', + security: 'Security from day one', + integration: 'Integrates with what you already use', + impact: 'Measurable business impact', }, }, process: { - title: 'Od pomysłu do działającego systemu', - stepLabel: 'Krok', + title: 'From idea to working system', + stepLabel: 'Step', steps: { - diagnosis: 'Diagnoza', - design: 'Projekt rozwiązania', - prototype: 'Prototyp', - deployment: 'Wdrożenie', - maintenance: 'Utrzymanie i rozwój', + diagnosis: 'Diagnosis', + design: 'Solution design', + prototype: 'Prototype', + deployment: 'Deployment', + maintenance: 'Maintenance & growth', }, }, audience: { - title: 'Dla kogo', + title: 'Who we work with', items: [ - 'founderzy i małe zespoły', - 'firmy usługowe', - 'działy operacyjne', - 'zespoły produktowe', - 'software house’y i integratorzy', + 'founders and small teams', + 'service businesses', + 'operations teams', + 'product teams', + 'software houses and integrators', ], }, 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ł."', + title: 'Got a process that should already run itself?', + lead: 'Tell us what you\'re doing manually, repetitively, or too slowly. We\'ll see if AI can make it simpler.', + quote: '"One process, one problem, or one idea is enough to start."', }, footer: { - tagline: 'ludzka strona AI — budujemy praktyczne systemy AI dla ludzi i organizacji.', - navHeading: 'Nawigacja', - privacyHeading: 'Prywatność', - privacyPolicy: 'Polityka prywatności', + tagline: 'the human side of AI — we build practical AI systems for people and organisations.', + navHeading: 'Navigation', + privacyHeading: 'Privacy', + privacyPolicy: 'Privacy Policy', cookies: 'Cookies', - rights: 'Wszelkie prawa zastrzeżone.', + rights: 'All rights reserved.', }, meta: { - title: 'humanAI — ludzka strona AI', + title: 'humanAI — the human side of AI', description: - 'Strategia, automatyzacje, produkty AI i systemy multiagentowe projektowane z człowiekiem w centrum.', + 'Strategy, automation, AI products, and multi-agent systems designed with humans at the center.', }, contact: { labelName: 'Name', @@ -171,136 +167,139 @@ export const en: typeof pl = { ], }, platform: { - title: 'Nadzór nad systemami agentowymi', - workingName: '(nazwa robocza — do potwierdzenia przed publikacją)', + title: 'Overseeing agentic systems', + workingName: '(working name — to be confirmed before launch)', watchers: { - title: 'Kto pilnuje agentów, którzy pilnują wszystkiego innego?', + title: 'Who watches the agents that watch everything else?', 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: 'Automations and AI agents can work without a human — organising documents, controlling devices, reacting to events. But left unsupervised, sooner or later they\'ll do something nobody wanted. ', }, - { 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.', + t: 'We built a system that observes other systems — including other agentic systems', + em: 'strong', + }, + { + t: ' — it detects when something isn\'t working, diagnoses the cause, and fixes the problem itself. And wherever a decision is irreversible, it waits for a human.', }, ], - '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.', + 'This isn\'t a concept. The same core has been running our own distributed infrastructure for months — and has been through real incidents, each of which made it smarter.', ] as Rich[], }, problem: { - title: 'Problem, który znika', + title: 'The problem that disappears', 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: 'Autonomy without boundaries is a risk.', + body: ' Anything that can open a gate or change a service\'s configuration on its own needs a clear line: what it can do by itself, and what needs a human\'s go-ahead.', }, { - lead: 'Automatyka to nie inteligencja.', + lead: 'Automation isn\'t intelligence.', 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ę.' }, + { t: ' Many homes and businesses already have systems that ' }, + { t: 'execute', em: 'em' }, + { t: ' commands — lights, blinds, gates, document flows. The problem is that none of it ' }, + { t: 'understands', em: 'em' }, + { t: ': it doesn\'t connect facts, react to context, or learn.' }, ], }, { - 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.', + lead: 'Knowledge disappears.', + body: ' Why did something break a month ago, and what fixed it? That knowledge usually lives in one person\'s head, or in an unsearchable pile of documents.', }, ] as Bullet[], }, howItWorks: { - title: 'Jak to działa', + title: 'How it works', core: [ - { t: 'Rdzeń nadzoru — jeden, wspólny dla wszystkiego.', em: 'strong' }, + { t: 'The supervisory core — one, shared by everything.', 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.', + t: ' A lightweight agent on every machine reports the state of its services. A central "brain" builds a full picture from that, detects deviations from what should be running, and either fixes the problem itself — if the action is safe — or asks a human if it isn\'t.', }, ] 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: 'That "asking a human" part isn\'t theoretical. A real example: the system notices you\'ve left for the weekend and the blinds are still open. It won\'t close them on its own — it sends you a message: ', }, - { t: '„Nie zamknąłeś rolet. Zamknąć teraz?"', em: 'quote' }, + { t: '"You left the blinds open. Close them now?"', 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.', + t: ' You reply "yes" — and only then does the system hand that off to your existing home automation. The decision is always yours; the system handles the execution.', }, ] as Rich, tailored: [ - { t: 'System roboczy — budowany pod Ciebie.', em: 'strong' }, - { t: ' To, co ten nadzór pilnuje, dopasowujemy do konkretnej potrzeby.' }, + { t: 'The working system — built around you.', em: 'strong' }, + { t: ' What this supervision watches over is tailored to what you actually need.' }, ] as Rich, home: { - title: 'Dla domu', + title: 'For your home', 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: 'You already have an automated home — lights, blinds, gates, climate control — but that\'s automation, not intelligence: it does exactly what you tell it, and nothing more. We add a layer that ', }, - { t: 'rozumie kontekst', em: 'strong' }, + { t: 'understands context', 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.', + t: ': it recognises your car by its license plate and opens the gate before you get there. It sees on your cameras that no one\'s home and dims the lights for the night on its own. It notices you\'ve left and something was left open — and asks before it does anything.', }, ] 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, + title: 'For your business', + body: 'You\'ve got a mess of documents, a paper trail nobody\'s happy with, and data scattered across someone else\'s cloud that you don\'t fully control. We build you a paperless system on your own servers — with your own domain and authentication, with no dependency on external cloud providers. We index documents, photos, and correspondence so they can be searched by meaning, not just keywords. The interface — a web dashboard always, and a chatbot too if it genuinely fits your business — is matched to what you actually need, not to whatever\'s trendy.' 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, + 'Both paths share the same foundation: everything that\'s supposed to run is defined as code in a repository — every change has a history and can be rolled back — and both run under the same supervision that makes sure nothing fails silently.' as Rich, }, underTheHood: { - title: 'Pod maską — dla ciekawych', + title: 'Under the hood — for the curious', 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: 'A knowledge base shouldn\'t end up as a dead vector index. On top of semantic search, we build a ' }, + { t: 'readable, compiled wiki maintained by a language model', 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.', + t: ' — plain text files with cross-links between concepts, which the agent reads and updates the way a person maintains code. We build this on an open standard (Google OKF), not a closed format of our own — so the knowledge stays readable and portable.', }, ], }, { - 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: 'Queries first reach a cheaper model — a more expensive one only steps in when the task genuinely calls for it. In practice: summarising an entire document corpus once cost pennies instead of days of compute.', }, { - 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: 'Not everything needs to be online 24 hours a day. When the primary machine is asleep, queries automatically fail over to backup hardware — with no interruption the user would notice.', }, { - 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.', + body: 'The system tells the difference between "this service is down" and "this service is asleep as planned" — previously a common source of false alarms.', }, ] as Bullet[], }, why: { - title: 'Dlaczego to, a nie zwykły monitoring czy zwykła automatyka', + title: 'Why this, not ordinary monitoring or ordinary automation', bullets: [ - { lead: 'Rozumiemy kontekst, nie tylko wykonujemy polecenia.' }, - { lead: 'Naprawiamy, nie tylko alarmujemy.' }, + { lead: 'We understand context, not just execute commands.' }, + { lead: 'We fix things, not just raise alarms.' }, { - lead: 'Człowiek naprawdę jest w pętli', - body: ' — decyzje zawsze do Ciebie, wykonanie bierze na siebie system.', + lead: 'A human is genuinely in the loop', + body: ' — decisions are always yours, execution is the system\'s job.', }, - { lead: 'Zero czarnej skrzynki.', body: ' Każda decyzja zostawia ślad, który można później przejrzeć.' }, + { lead: 'Zero black box.', body: ' Every decision leaves a trail you can review later.' }, { - lead: 'Twoje dane zostają Twoje', - body: ' — własny serwer, własna domena, bez uzależnienia od cudzej chmury.', + lead: 'Your data stays yours', + body: ' — your own server, your own domain, no dependency on someone else\'s cloud.', }, ] as Bullet[], }, status: { - title: 'Uczciwie o tym, gdzie jesteśmy', + title: 'Honestly, where we are', 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.', + 'The supervisory core runs our infrastructure every day — self-healing works end to end, alerts reach a phone, the knowledge base answers questions even when the primary hardware is asleep.', + 'Dedicated deployments — for a specific home or business — we build as needed, on top of the same proven core. We\'d rather say plainly what we\'re still working on than promise more than what actually works.', ] 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', + title: 'Let\'s talk', + body: 'Tell us what you want to automate or organise — we\'ll figure out how to build it, and put it under the same supervision we run on ourselves.' as Rich, + button: 'Let\'s talk', }, }, };