Replace manifesto bar with compact context bar + add privacy page

- layout.php: replace large manifesto section (eyebrow/title/sub/4 stats) with
  a slim dbn-context-bar strip linking to why-ours, pricing, MCP, and privacy
- i18n.php: add context_bar_* + footer_privacy_link + privacy_page_title keys
  to all 4 language blocks (en, no, uk, pl)
- dbn-tools-redesign.css: add .dbn-context-bar styles with mobile wrap
- privacy.php: new standalone page in 4 languages covering in-memory processing,
  metadata-only logging, My Case opt-in storage, EU data locations, and HTTPS transport
- footer.php: add Privacy link to first footer column

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-24 14:44:44 +02:00
parent aafe8efaa4
commit 7df3b7f8d3
5 changed files with 567 additions and 13 deletions
+51
View File
@@ -819,3 +819,54 @@ body[data-active-tool='citations'] .results {
transition-duration: 0.001ms !important;
}
}
/* ── Context bar (replaces manifesto, added 2026-05-24) ──────────────────── */
.dbn-context-bar {
display: flex;
align-items: center;
gap: 0.5rem 1.25rem;
flex-wrap: wrap;
padding: 0.45rem 1.25rem;
background: var(--color-navy, #00205B);
font-size: 0.8rem;
color: rgba(255, 255, 255, 0.7);
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
}
.dbn-context-bar__tag {
font-weight: 600;
color: #fff;
white-space: nowrap;
flex-shrink: 0;
}
.dbn-context-bar__links {
display: flex;
gap: 0.25rem 1rem;
flex-wrap: wrap;
list-style: none;
margin: 0;
padding: 0;
}
.dbn-context-bar__links a {
color: rgba(255, 255, 255, 0.72);
text-decoration: none;
white-space: nowrap;
transition: color 0.15s ease;
}
.dbn-context-bar__links a:hover,
.dbn-context-bar__links a:focus-visible {
color: #fff;
text-decoration: underline;
}
@media (max-width: 640px) {
.dbn-context-bar {
flex-direction: column;
align-items: flex-start;
gap: 0.35rem;
padding: 0.55rem 1rem;
}
}
+1
View File
@@ -28,6 +28,7 @@ function _ft(string $key, string $lang): string {
<a href="https://dobetternorge.no/library.php"><?= _ft('footer_legal_lib', $_footerLang) ?></a>
<a href="/pricing.php"><?= _ft('pricing_nav_link', $_footerLang) ?></a>
<a href="/why-ours.php"><?= _ft('why_ours_trust_link', $_footerLang) ?></a>
<a href="/privacy.php"><?= _ft('footer_privacy_link', $_footerLang) ?></a>
<a href="mailto:support@dobetternorge.no"><?= _ft('footer_report', $_footerLang) ?></a>
</div>
<div class="lt-footer__link-col">
+32
View File
@@ -512,6 +512,14 @@ function dbnToolsTranslations(): array
'mcp_tool_setup_link' => 'Set up MCP →',
'mcp_tool_yes' => 'Yes',
'mcp_tool_no' => 'No',
// ── Context bar + privacy page (added 2026-05-24) ────────────────
'context_bar_tag' => 'AI legal tools · Norway · since 2019',
'context_bar_why' => 'Why different from ChatGPT →',
'context_bar_pricing' => 'Pricing →',
'context_bar_mcp' => 'MCP for developers →',
'context_bar_privacy' => 'Privacy →',
'footer_privacy_link' => 'Privacy',
'privacy_page_title' => 'Privacy — Do Better Norge Tools',
],
'no' => [
'meta_title' => 'Do Better Norge - juridiske AI-verktøy',
@@ -956,6 +964,14 @@ function dbnToolsTranslations(): array
'mcp_tool_setup_link' => 'Sett opp MCP →',
'mcp_tool_yes' => 'Ja',
'mcp_tool_no' => 'Nei',
// ── Context bar + privacy page (added 2026-05-24) ────────────────
'context_bar_tag' => 'AI juridiske verktøy · Norge · siden 2019',
'context_bar_why' => 'Hvorfor annerledes enn ChatGPT →',
'context_bar_pricing' => 'Priser →',
'context_bar_mcp' => 'MCP for utviklere →',
'context_bar_privacy' => 'Personvern →',
'footer_privacy_link' => 'Personvern',
'privacy_page_title' => 'Personvern — Do Better Norge verktøy',
],
'uk' => [
'meta_title' => 'Do Better Norge - юридичні AI інструменти',
@@ -1400,6 +1416,14 @@ function dbnToolsTranslations(): array
'mcp_tool_setup_link' => 'Налаштувати MCP →',
'mcp_tool_yes' => 'Так',
'mcp_tool_no' => 'Ні',
// ── Context bar + privacy page (added 2026-05-24) ────────────────
'context_bar_tag' => 'Інструменти правової підготовки · Норвегія · з 2019',
'context_bar_why' => 'Чому відрізняється від ChatGPT →',
'context_bar_pricing' => 'Ціни →',
'context_bar_mcp' => 'MCP для розробників →',
'context_bar_privacy' => 'Конфіденційність →',
'footer_privacy_link' => 'Конфіденційність',
'privacy_page_title' => 'Конфіденційність — Do Better Norge',
],
'pl' => [
'meta_title' => 'Do Better Norge - prawne narzędzia AI',
@@ -1844,6 +1868,14 @@ function dbnToolsTranslations(): array
'mcp_tool_setup_link' => 'Skonfiguruj MCP →',
'mcp_tool_yes' => 'Tak',
'mcp_tool_no' => 'Nie',
// ── Context bar + privacy page (added 2026-05-24) ────────────────
'context_bar_tag' => 'Narzędzia prawne · Norwegia · od 2019',
'context_bar_why' => 'Dlaczego różni się od ChatGPT →',
'context_bar_pricing' => 'Cennik →',
'context_bar_mcp' => 'MCP dla deweloperów →',
'context_bar_privacy' => 'Prywatność →',
'footer_privacy_link' => 'Prywatność',
'privacy_page_title' => 'Prywatność — Do Better Norge',
],
];
}
+8 -12
View File
@@ -73,19 +73,15 @@ window.DBN_USER_TIER = <?= json_encode(FreeTier::tier((int)$_SESSION['dbn_tools_
<main id="appShell" class="app-shell">
<section class="manifesto" role="banner">
<div class="manifesto-copy">
<p class="manifesto-eyebrow"><?= htmlspecialchars(dbnToolsT('manifesto_eyebrow', $uiLang)) ?></p>
<h2 class="manifesto-title"><?= htmlspecialchars(dbnToolsT('manifesto_title', $uiLang)) ?></h2>
<p class="manifesto-sub"><?= htmlspecialchars(dbnToolsT('manifesto_sub', $uiLang)) ?></p>
<div class="dbn-context-bar" role="note">
<span class="dbn-context-bar__tag"><?= htmlspecialchars(dbnToolsT('context_bar_tag', $uiLang)) ?></span>
<nav class="dbn-context-bar__links" aria-label="About">
<a href="/why-ours.php<?= $uiLang !== 'en' ? '?lang=' . urlencode($uiLang) : '' ?>"><?= htmlspecialchars(dbnToolsT('context_bar_why', $uiLang)) ?></a>
<a href="/pricing.php<?= $uiLang !== 'en' ? '?lang=' . urlencode($uiLang) : '' ?>"><?= htmlspecialchars(dbnToolsT('context_bar_pricing', $uiLang)) ?></a>
<a href="/mcp-tool.php<?= $uiLang !== 'en' ? '?lang=' . urlencode($uiLang) : '' ?>"><?= htmlspecialchars(dbnToolsT('context_bar_mcp', $uiLang)) ?></a>
<a href="/privacy.php<?= $uiLang !== 'en' ? '?lang=' . urlencode($uiLang) : '' ?>"><?= htmlspecialchars(dbnToolsT('context_bar_privacy', $uiLang)) ?></a>
</nav>
</div>
<div class="manifesto-stats" aria-label="Headline statistics">
<div class="manifesto-stat"><strong>23</strong><span><?= htmlspecialchars(dbnToolsT('stat_echr', $uiLang)) ?></span></div>
<div class="manifesto-stat"><strong>64%</strong><span><?= htmlspecialchars(dbnToolsT('stat_loss', $uiLang)) ?></span></div>
<div class="manifesto-stat"><strong>1,731</strong><span><?= htmlspecialchars(dbnToolsT('stat_tribunal', $uiLang)) ?></span></div>
<div class="manifesto-stat"><strong>20+</strong><span><?= htmlspecialchars(dbnToolsT('stat_pending', $uiLang)) ?></span></div>
</div>
</section>
<div class="disclaimer" role="note">
<?= htmlspecialchars(dbnToolsT('disclaimer', $uiLang)) ?>
+474
View File
@@ -0,0 +1,474 @@
<?php
declare(strict_types=1);
require_once __DIR__ . '/includes/bootstrap.php';
$uiLang = dbnToolsCurrentLanguage();
$isAuthed = dbnToolsIsAuthenticated();
$langPath = '/privacy.php';
$toolsLogin = 'https://dobetternorge.no/tools-login.php?return=' . urlencode('/privacy.php');
$registerUrl = 'https://dobetternorge.no/register.php';
$ctaUrl = $isAuthed ? '/dashboard.php' : $toolsLogin;
$translations = [
'en' => [
'page_title' => 'Privacy — Do Better Norge Tools',
'meta_desc' => 'How Do Better Norge Tools handles your documents and data. Free-plan processing is in-memory only; paid plans offer secure EU-hosted case storage.',
'nav_open' => 'Open tools →',
'nav_signin' => 'Sign in',
'hero_kicker' => 'Privacy & data handling',
'hero_title' => 'Your documents stay yours.',
'hero_sub' => 'Free-plan processing is in memory and discarded when your session ends. Paid plans let you choose to save your case — stored encrypted in the EU, visible only to you.',
// Legal disclaimer
'legal_h' => 'Legal information, not legal advice',
'legal_p' => 'These tools provide legal information and preparation support. They do not constitute legal advice. AI output may contain errors — always confirm next steps with a qualified Norwegian lawyer before acting.',
// In-memory processing
'memory_h' => 'How your text and files are processed',
'memory_p1' => 'When you paste text or upload a document (PDF, DOCX, TXT, audio), it is sent to our AI pipeline over an encrypted HTTPS connection, processed in memory, and the result is returned to you.',
'memory_p2' => 'By default, document content is not written to disk or retained after your session ends. This applies to all free-plan users and to any tool used outside the My Case feature.',
'memory_badge' => 'Free plan — always',
// What we do store
'store_h' => 'What we record (free plan)',
'store_p' => 'For all users we log only operational metadata to monitor service health and improve the tools:',
'store_li1' => 'Tool name used (e.g. "transcribe", "timeline")',
'store_li2' => 'Response time (latency)',
'store_li3' => 'UI language selected',
'store_li4' => 'Anonymous session ID (not linked to your name or email)',
'store_never' => 'We never log the content of your documents or pasted text.',
// Paid plan — My Case
'mycase_h' => 'My Case — paid plans only (opt-in)',
'mycase_p1' => 'Subscribers to Plus, Pro, or Pro+ Family who activate My Case choose to store their documents in a private, encrypted corpus. This is entirely opt-in — nothing is saved unless you upload to My Case explicitly.',
'mycase_list_title' => 'Your My Case corpus is:',
'mycase_li1' => 'Visible only to you (and team members you invite on Pro+)',
'mycase_li2' => 'Stored encrypted within the EU at all times',
'mycase_li3' => 'Deletable at any time — document by document or all at once',
'mycase_li4' => 'Retained for 90 days after subscription cancellation, then deleted',
'mycase_badge' => 'Plus · Pro · Pro+ Family',
// Data locations
'locations_h' => 'Where your data lives (EU only)',
'locations_p' => 'All processing and storage takes place within the European Union:',
'locations_li1' => 'Application servers: Hetzner Falkenstein (Germany DE) and Helsinki (Finland FI)',
'locations_li2' => 'AI services: Microsoft Azure West Europe (NL) and Norway East (NO)',
'locations_li3' => 'Payments: Stripe Ireland (IE) — we never see your card number',
'locations_li4' => 'Vector search and document indexing: Hetzner dedicated servers, Germany',
// Transport
'transport_h' => 'Secure transport',
'transport_p' => 'All connections use HTTPS/TLS 1.2 or higher. No data is ever transmitted over unencrypted channels. API calls between internal services use private VLAN channels within Hetzner infrastructure.',
// Contact
'contact_h' => 'Questions or deletion requests',
'contact_p' => 'To ask about your data or request deletion of your account and any stored documents, email us:',
'contact_email' => 'support@dobetternorge.no',
// Links back
'back_tools' => '← Back to tools',
'link_why' => 'Why our tools give different answers than ChatGPT →',
'link_pricing' => 'Plans & pricing →',
'link_mcp' => 'MCP for developers →',
],
'no' => [
'page_title' => 'Personvern — Do Better Norge verktøy',
'meta_desc' => 'Slik håndterer Do Better Norge verktøy dokumentene og dataene dine. Gratisnivå behandler alt i minnet; betalte planer tilbyr sikker EU-lagring.',
'nav_open' => 'Åpne verktøy →',
'nav_signin' => 'Logg inn',
'hero_kicker' => 'Personvern og datahåndtering',
'hero_title' => 'Dokumentene dine forblir dine.',
'hero_sub' => 'Behandling på gratisnivå skjer i minnet og slettes når økten avsluttes. Betalte planer lar deg velge å lagre saken din kryptert i EU, kun synlig for deg.',
'legal_h' => 'Juridisk informasjon, ikke juridisk rådgivning',
'legal_p' => 'Disse verktøyene gir juridisk informasjon og forberedelsesstøtte. De utgjør ikke juridisk rådgivning. AI-output kan inneholde feil kontroller alltid neste steg med en kvalifisert norsk advokat før du handler.',
'memory_h' => 'Slik behandles tekst og filer',
'memory_p1' => 'Når du limer inn tekst eller laster opp et dokument (PDF, DOCX, TXT, lyd), sendes det til vår AI-pipeline over en kryptert HTTPS-tilkobling, behandles i minnet og resultatet returneres til deg.',
'memory_p2' => 'Som standard skrives ikke dokumentinnhold til disk eller beholdes etter at økten avsluttes. Dette gjelder alle brukere på gratisnivå og alle verktøy brukt utenfor Min sak.',
'memory_badge' => 'Gratisnivå — alltid',
'store_h' => 'Hva vi lagrer (gratisnivå)',
'store_p' => 'For alle brukere logger vi bare operasjonelle metadata for å overvåke tjenestens helse og forbedre verktøyene:',
'store_li1' => 'Verktøynavn brukt (f.eks. «transkripsjon», «tidslinje»)',
'store_li2' => 'Responstid (latens)',
'store_li3' => 'Valgt grensesnittspråk',
'store_li4' => 'Anonym økt-ID (ikke knyttet til navn eller e-post)',
'store_never' => 'Vi logger aldri innholdet i dokumentene dine eller tekst du limer inn.',
'mycase_h' => 'Min sak — kun betalte planer (valgfritt)',
'mycase_p1' => 'Abonnenter på Pluss, Pro eller Pro+ Familie som aktiverer Min sak, velger å lagre dokumentene sine i et privat, kryptert korpus. Dette er helt valgfritt ingenting lagres med mindre du laster opp til Min sak eksplisitt.',
'mycase_list_title' => 'Ditt Min sak-korpus er:',
'mycase_li1' => 'Synlig kun for deg (og teammedlemmer du inviterer på Pro+)',
'mycase_li2' => 'Lagret kryptert i EU til enhver tid',
'mycase_li3' => 'Slettbart når som helst dokument for dokument eller alt på én gang',
'mycase_li4' => 'Beholdt i 90 dager etter avsluttet abonnement, deretter slettet',
'mycase_badge' => 'Pluss · Pro · Pro+ Familie',
'locations_h' => 'Hvor dataene dine befinner seg (kun EU)',
'locations_p' => 'All behandling og lagring skjer innenfor EU:',
'locations_li1' => 'Applikasjonsservere: Hetzner Falkenstein (Tyskland DE) og Helsinki (Finland FI)',
'locations_li2' => 'AI-tjenester: Microsoft Azure Vest-Europa (NL) og Norge Øst (NO)',
'locations_li3' => 'Betalinger: Stripe Irland (IE) vi ser aldri kortnummeret ditt',
'locations_li4' => 'Vektorsøk og dokumentindeksering: Hetzner dedikerte servere, Tyskland',
'transport_h' => 'Sikker transport',
'transport_p' => 'Alle tilkoblinger bruker HTTPS/TLS 1.2 eller høyere. Data overføres aldri over ukrypterte kanaler. API-kall mellom interne tjenester bruker private VLAN-kanaler i Hetzner-infrastrukturen.',
'contact_h' => 'Spørsmål eller slettingsforespørsler',
'contact_p' => 'For spørsmål om dataene dine eller for å be om sletting av konto og lagrede dokumenter, send e-post til:',
'contact_email' => 'support@dobetternorge.no',
'back_tools' => '← Tilbake til verktøy',
'link_why' => 'Hvorfor verktøyene gir andre svar enn ChatGPT →',
'link_pricing' => 'Planer og priser →',
'link_mcp' => 'MCP for utviklere →',
],
'uk' => [
'page_title' => 'Конфіденційність — Do Better Norge',
'meta_desc' => 'Як Do Better Norge обробляє ваші документи та дані. Безкоштовний план обробляє дані лише в пам\'яті; платні плани пропонують безпечне сховище в ЄС.',
'nav_open' => 'Відкрити інструменти →',
'nav_signin' => 'Увійти',
'hero_kicker' => 'Конфіденційність і обробка даних',
'hero_title' => 'Ваші документи залишаються вашими.',
'hero_sub' => 'Безкоштовний план обробляє дані в пам\'яті й видаляє їх після завершення сесії. Платні плани дозволяють зберігати справу — зашифровано в ЄС, доступно лише вам.',
'legal_h' => 'Юридична інформація, а не юридична консультація',
'legal_p' => 'Ці інструменти надають юридичну інформацію та підтримку у підготовці. Вони не є юридичною консультацією. Результати ШІ можуть містити помилки — завжди погоджуйте наступні кроки з кваліфікованим норвезьким юристом.',
'memory_h' => 'Як обробляється текст і файли',
'memory_p1' => 'Коли ви вставляєте текст або завантажуєте документ (PDF, DOCX, TXT, аудіо), він надсилається до нашого AI-конвеєра через зашифроване HTTPS-з\'єднання, обробляється в пам\'яті й результат повертається вам.',
'memory_p2' => 'За замовчуванням вміст документа не записується на диск і не зберігається після завершення сесії. Це стосується всіх користувачів безкоштовного плану та будь-якого інструменту поза функцією «Моя справа».',
'memory_badge' => 'Безкоштовний план — завжди',
'store_h' => 'Що ми зберігаємо (безкоштовний план)',
'store_p' => 'Для всіх користувачів ми логуємо лише операційні метадані для моніторингу стану сервісу та вдосконалення інструментів:',
'store_li1' => 'Назва використаного інструменту (напр. «транскрибування», «хронологія»)',
'store_li2' => 'Час відповіді (затримка)',
'store_li3' => 'Вибрана мова інтерфейсу',
'store_li4' => 'Анонімний ідентифікатор сесії (не пов\'язаний з вашим іменем або email)',
'store_never' => 'Ми ніколи не логуємо вміст ваших документів або вставленого тексту.',
'mycase_h' => 'Моя справа — лише платні плани (за вибором)',
'mycase_p1' => 'Підписники Plus, Pro або Pro+ Family, які активують «Мою справу», обирають зберігати документи в приватному зашифрованому корпусі. Це повністю за вашим вибором — нічого не зберігається без явного завантаження до «Моєї справи».',
'mycase_list_title' => 'Ваш корпус «Мої справи»:',
'mycase_li1' => 'Видимий лише вам (і запрошеним учасникам команди на Pro+)',
'mycase_li2' => 'Зберігається зашифрованим у ЄС постійно',
'mycase_li3' => 'Може бути видалений будь-коли — по одному документу або всі разом',
'mycase_li4' => 'Зберігається 90 днів після скасування підписки, потім видаляється',
'mycase_badge' => 'Plus · Pro · Pro+ Family',
'locations_h' => 'Де зберігаються ваші дані (лише ЄС)',
'locations_p' => 'Вся обробка та зберігання відбувається в межах Євросоюзу:',
'locations_li1' => 'Сервери додатків: Hetzner Falkenstein (Німеччина DE) та Гельсінкі (Фінляндія FI)',
'locations_li2' => 'AI-сервіси: Microsoft Azure Захід Європи (NL) та Норвегія Схід (NO)',
'locations_li3' => 'Платежі: Stripe Ірландія (IE) — ми ніколи не бачимо вашого номера картки',
'locations_li4' => 'Векторний пошук і індексування документів: виділені сервери Hetzner, Німеччина',
'transport_h' => 'Безпечна передача даних',
'transport_p' => 'Усі з\'єднання використовують HTTPS/TLS 1.2 або вище. Дані ніколи не передаються незашифрованими каналами. API-виклики між внутрішніми сервісами використовують приватні VLAN-канали в інфраструктурі Hetzner.',
'contact_h' => 'Запитання або запит на видалення',
'contact_p' => 'Щоб дізнатися про свої дані або запросити видалення облікового запису та збережених документів, напишіть нам:',
'contact_email' => 'support@dobetternorge.no',
'back_tools' => '← Назад до інструментів',
'link_why' => 'Чому наші інструменти дають інші відповіді, ніж ChatGPT →',
'link_pricing' => 'Плани та ціни →',
'link_mcp' => 'MCP для розробників →',
],
'pl' => [
'page_title' => 'Prywatność — Do Better Norge',
'meta_desc' => 'Jak Do Better Norge obsługuje Twoje dokumenty i dane. Plan bezpłatny przetwarza dane tylko w pamięci; płatne plany oferują bezpieczne przechowywanie w UE.',
'nav_open' => 'Otwórz narzędzia →',
'nav_signin' => 'Zaloguj się',
'hero_kicker' => 'Prywatność i zarządzanie danymi',
'hero_title' => 'Twoje dokumenty pozostają Twoje.',
'hero_sub' => 'Przetwarzanie w planie bezpłatnym odbywa się w pamięci i jest usuwane po zakończeniu sesji. Płatne plany pozwalają zapisać swoją sprawę — zaszyfrowaną w UE, widoczną tylko dla Ciebie.',
'legal_h' => 'Informacja prawna, nie porada prawna',
'legal_p' => 'Te narzędzia zapewniają informacje prawne i wsparcie w przygotowaniu. Nie stanowią porady prawnej. Wyniki AI mogą zawierać błędy — zawsze konsultuj kolejne kroki z wykwalifikowanym norweskim prawnikiem.',
'memory_h' => 'Jak przetwarzany jest tekst i pliki',
'memory_p1' => 'Gdy wklejasz tekst lub przesyłasz dokument (PDF, DOCX, TXT, audio), jest on wysyłany do naszego pipeline\'u AI przez szyfrowane połączenie HTTPS, przetwarzany w pamięci i wynik jest zwracany do Ciebie.',
'memory_p2' => 'Domyślnie treść dokumentu nie jest zapisywana na dysku ani przechowywana po zakończeniu sesji. Dotyczy to wszystkich użytkowników planu bezpłatnego i każdego narzędzia używanego poza funkcją Moja Sprawa.',
'memory_badge' => 'Plan bezpłatny — zawsze',
'store_h' => 'Co rejestrujemy (plan bezpłatny)',
'store_p' => 'Dla wszystkich użytkowników rejestrujemy tylko metadane operacyjne w celu monitorowania kondycji usługi i ulepszania narzędzi:',
'store_li1' => 'Nazwa użytego narzędzia (np. „transkrypcja", „oś czasu")',
'store_li2' => 'Czas odpowiedzi (opóźnienie)',
'store_li3' => 'Wybrany język interfejsu',
'store_li4' => 'Anonimowy identyfikator sesji (niepowiązany z Twoim imieniem ani adresem e-mail)',
'store_never' => 'Nigdy nie rejestrujemy treści Twoich dokumentów ani wklejonego tekstu.',
'mycase_h' => 'Moja Sprawa — tylko plany płatne (opcjonalnie)',
'mycase_p1' => 'Subskrybenci Plus, Pro lub Pro+ Family, którzy aktywują Moją Sprawę, wybierają przechowywanie dokumentów w prywatnym, zaszyfrowanym korpusie. Jest to całkowicie opcjonalne — nic nie jest zapisywane, jeśli nie prześlesz do Mojej Sprawy.',
'mycase_list_title' => 'Twój korpus Moja Sprawa:',
'mycase_li1' => 'Widoczny tylko dla Ciebie (i zaproszonych członków zespołu w Pro+)',
'mycase_li2' => 'Przechowywany w zaszyfrowanej postaci w UE przez cały czas',
'mycase_li3' => 'Możliwy do usunięcia w dowolnym momencie — dokument po dokumencie lub wszystko naraz',
'mycase_li4' => 'Przechowywany przez 90 dni po anulowaniu subskrypcji, a następnie usuwany',
'mycase_badge' => 'Plus · Pro · Pro+ Family',
'locations_h' => 'Gdzie przechowywane są Twoje dane (tylko UE)',
'locations_p' => 'Całe przetwarzanie i przechowywanie odbywa się w Unii Europejskiej:',
'locations_li1' => 'Serwery aplikacji: Hetzner Falkenstein (Niemcy DE) i Helsinki (Finlandia FI)',
'locations_li2' => 'Usługi AI: Microsoft Azure Europa Zachodnia (NL) i Norwegia Wschodnia (NO)',
'locations_li3' => 'Płatności: Stripe Irlandia (IE) — nigdy nie widzimy numeru Twojej karty',
'locations_li4' => 'Wyszukiwanie wektorowe i indeksowanie dokumentów: dedykowane serwery Hetzner, Niemcy',
'transport_h' => 'Bezpieczny transport',
'transport_p' => 'Wszystkie połączenia używają HTTPS/TLS 1.2 lub nowszego. Dane nigdy nie są przesyłane przez nieszyfrowane kanały. Wywołania API między wewnętrznymi usługami używają prywatnych kanałów VLAN w infrastrukturze Hetzner.',
'contact_h' => 'Pytania lub prośby o usunięcie',
'contact_p' => 'Aby zapytać o swoje dane lub poprosić o usunięcie konta i przechowywanych dokumentów, napisz do nas:',
'contact_email' => 'support@dobetternorge.no',
'back_tools' => '← Powrót do narzędzi',
'link_why' => 'Dlaczego nasze narzędzia dają inne odpowiedzi niż ChatGPT →',
'link_pricing' => 'Plany i cennik →',
'link_mcp' => 'MCP dla deweloperów →',
],
];
$t = $translations[$uiLang] ?? $translations['en'];
?>
<!doctype html>
<html lang="<?= htmlspecialchars($uiLang) ?>">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title><?= htmlspecialchars($t['page_title']) ?></title>
<meta name="description" content="<?= htmlspecialchars($t['meta_desc']) ?>">
<meta name="robots" content="index, follow">
<link rel="canonical" href="https://tools.dobetternorge.no/privacy.php">
<meta property="og:title" content="<?= htmlspecialchars($t['page_title']) ?>">
<meta property="og:description" content="<?= htmlspecialchars($t['meta_desc']) ?>">
<meta property="og:type" content="website">
<meta name="theme-color" content="#00205B">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Crimson+Pro:wght@400;600;700&family=IBM+Plex+Sans:wght@400;500;600;700&display=swap">
<link rel="stylesheet" href="assets/css/tools.css">
<link rel="stylesheet" href="assets/css/dbn-tools-redesign.css">
<style>
.priv-hero {
background: linear-gradient(135deg, #00205B 0%, #001840 100%);
padding: 3.5rem 1.5rem 3rem;
text-align: center;
color: #fff;
}
.priv-hero__kicker {
font-size: 0.8125rem;
font-weight: 600;
letter-spacing: 0.08em;
text-transform: uppercase;
color: rgba(255,255,255,0.6);
margin: 0 0 0.75rem;
}
.priv-hero__title {
font-family: 'Crimson Pro', Georgia, serif;
font-size: clamp(1.75rem, 4vw, 2.75rem);
font-weight: 700;
line-height: 1.15;
margin: 0 0 1rem;
}
.priv-hero__sub {
font-size: 1.0625rem;
color: rgba(255,255,255,0.8);
max-width: 640px;
margin: 0 auto;
line-height: 1.6;
}
.priv-body {
max-width: 760px;
margin: 0 auto;
padding: 2.5rem 1.5rem 4rem;
}
.priv-section {
margin-bottom: 2.5rem;
padding-bottom: 2.5rem;
border-bottom: 1px solid #e8eaf0;
}
.priv-section:last-of-type {
border-bottom: none;
}
.priv-section__badge {
display: inline-block;
font-size: 0.72rem;
font-weight: 700;
letter-spacing: 0.05em;
text-transform: uppercase;
background: #e8f0fe;
color: #1a3a7c;
border-radius: 3px;
padding: 0.15rem 0.55rem;
margin-bottom: 0.65rem;
}
.priv-section__badge--paid {
background: #fef3c7;
color: #7c5a00;
}
.priv-section h2 {
font-family: 'Crimson Pro', Georgia, serif;
font-size: 1.45rem;
font-weight: 700;
color: #00205B;
margin: 0 0 0.75rem;
}
.priv-section p {
color: #334;
line-height: 1.7;
margin: 0 0 0.85rem;
}
.priv-section ul {
color: #334;
line-height: 1.7;
padding-left: 1.4rem;
margin: 0.5rem 0 0.85rem;
}
.priv-section ul li {
margin-bottom: 0.35rem;
}
.priv-legal-box {
background: #fffbeb;
border-left: 3px solid #f59e0b;
padding: 1rem 1.25rem;
border-radius: 0 6px 6px 0;
}
.priv-legal-box h2 {
color: #92400e;
}
.priv-legal-box p {
color: #78350f;
}
.priv-locations-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 0.75rem;
margin-top: 0.75rem;
}
.priv-location-card {
background: #f0f4ff;
border-radius: 6px;
padding: 0.85rem 1rem;
font-size: 0.9rem;
color: #334;
line-height: 1.45;
}
.priv-location-card strong {
display: block;
color: #00205B;
font-weight: 600;
margin-bottom: 0.15rem;
}
.priv-contact-box {
background: #f6f8ff;
border-radius: 8px;
padding: 1.25rem 1.5rem;
text-align: center;
}
.priv-contact-box a {
color: #00205B;
font-weight: 600;
font-size: 1rem;
}
.priv-nav-links {
display: flex;
gap: 1rem 1.5rem;
flex-wrap: wrap;
padding: 1.5rem 0 0;
border-top: 1px solid #e8eaf0;
margin-top: 1rem;
}
.priv-nav-links a {
color: #00205B;
font-size: 0.9rem;
text-decoration: none;
}
.priv-nav-links a:hover { text-decoration: underline; }
</style>
</head>
<body class="kdoc-page">
<!-- Nav -->
<header class="lt-nav">
<a href="https://dobetternorge.no" class="lt-nav__brand">
<picture>
<source srcset="assets/images/logo-header.webp" type="image/webp">
<img class="lt-nav__logo" src="assets/images/logo-header.png" alt="Do Better Norge" width="140" height="36" loading="eager">
</picture>
<span class="lt-nav__badge">Legal Tools</span>
</a>
<div class="lt-nav__right">
<nav class="shell-lang-switcher" aria-label="Language">
<?php foreach (dbnToolsSupportedLanguages() as $langCode): ?>
<a href="<?= htmlspecialchars($langPath . '?lang=' . $langCode) ?>" class="<?= $langCode === $uiLang ? 'is-active' : '' ?>"><?= htmlspecialchars(dbnToolsLanguageLabel($langCode)) ?></a>
<?php endforeach; ?>
</nav>
<?php if ($isAuthed): ?>
<a href="/dashboard.php" class="lt-nav__cta lt-nav__cta--enter"><?= htmlspecialchars($t['nav_open']) ?></a>
<?php else: ?>
<a href="<?= htmlspecialchars($toolsLogin) ?>" class="lt-nav__cta"><?= htmlspecialchars($t['nav_signin']) ?></a>
<?php endif; ?>
</div>
</header>
<!-- Hero -->
<section class="priv-hero">
<p class="priv-hero__kicker"><?= htmlspecialchars($t['hero_kicker']) ?></p>
<h1 class="priv-hero__title"><?= htmlspecialchars($t['hero_title']) ?></h1>
<p class="priv-hero__sub"><?= htmlspecialchars($t['hero_sub']) ?></p>
</section>
<main class="priv-body">
<!-- Legal disclaimer -->
<div class="priv-section priv-legal-box">
<h2>⚖ <?= htmlspecialchars($t['legal_h']) ?></h2>
<p><?= htmlspecialchars($t['legal_p']) ?></p>
</div>
<!-- In-memory processing -->
<div class="priv-section">
<span class="priv-section__badge"><?= htmlspecialchars($t['memory_badge']) ?></span>
<h2><?= htmlspecialchars($t['memory_h']) ?></h2>
<p><?= htmlspecialchars($t['memory_p1']) ?></p>
<p><?= htmlspecialchars($t['memory_p2']) ?></p>
</div>
<!-- What we store -->
<div class="priv-section">
<h2><?= htmlspecialchars($t['store_h']) ?></h2>
<p><?= htmlspecialchars($t['store_p']) ?></p>
<ul>
<li><?= htmlspecialchars($t['store_li1']) ?></li>
<li><?= htmlspecialchars($t['store_li2']) ?></li>
<li><?= htmlspecialchars($t['store_li3']) ?></li>
<li><?= htmlspecialchars($t['store_li4']) ?></li>
</ul>
<p><strong><?= htmlspecialchars($t['store_never']) ?></strong></p>
</div>
<!-- My Case -->
<div class="priv-section">
<span class="priv-section__badge priv-section__badge--paid"><?= htmlspecialchars($t['mycase_badge']) ?></span>
<h2><?= htmlspecialchars($t['mycase_h']) ?></h2>
<p><?= htmlspecialchars($t['mycase_p1']) ?></p>
<p><?= htmlspecialchars($t['mycase_list_title']) ?></p>
<ul>
<li><?= htmlspecialchars($t['mycase_li1']) ?></li>
<li><?= htmlspecialchars($t['mycase_li2']) ?></li>
<li><?= htmlspecialchars($t['mycase_li3']) ?></li>
<li><?= htmlspecialchars($t['mycase_li4']) ?></li>
</ul>
</div>
<!-- Data locations -->
<div class="priv-section">
<h2><?= htmlspecialchars($t['locations_h']) ?></h2>
<p><?= htmlspecialchars($t['locations_p']) ?></p>
<div class="priv-locations-grid">
<div class="priv-location-card"><strong>🇩🇪 🇫🇮</strong><?= htmlspecialchars($t['locations_li1']) ?></div>
<div class="priv-location-card"><strong>🇳🇱 🇳🇴</strong><?= htmlspecialchars($t['locations_li2']) ?></div>
<div class="priv-location-card"><strong>🇮🇪</strong><?= htmlspecialchars($t['locations_li3']) ?></div>
<div class="priv-location-card"><strong>🇩🇪</strong><?= htmlspecialchars($t['locations_li4']) ?></div>
</div>
</div>
<!-- Transport -->
<div class="priv-section">
<h2><?= htmlspecialchars($t['transport_h']) ?></h2>
<p><?= htmlspecialchars($t['transport_p']) ?></p>
</div>
<!-- Contact -->
<div class="priv-section priv-contact-box">
<h2><?= htmlspecialchars($t['contact_h']) ?></h2>
<p><?= htmlspecialchars($t['contact_p']) ?></p>
<a href="mailto:<?= htmlspecialchars($t['contact_email']) ?>"><?= htmlspecialchars($t['contact_email']) ?></a>
</div>
<!-- Nav links -->
<nav class="priv-nav-links" aria-label="Related pages">
<a href="/<?= $uiLang !== 'en' ? '?lang=' . urlencode($uiLang) : '' ?>"><?= htmlspecialchars($t['back_tools']) ?></a>
<a href="/why-ours.php<?= $uiLang !== 'en' ? '?lang=' . urlencode($uiLang) : '' ?>"><?= htmlspecialchars($t['link_why']) ?></a>
<a href="/pricing.php<?= $uiLang !== 'en' ? '?lang=' . urlencode($uiLang) : '' ?>"><?= htmlspecialchars($t['link_pricing']) ?></a>
<a href="/mcp-tool.php<?= $uiLang !== 'en' ? '?lang=' . urlencode($uiLang) : '' ?>"><?= htmlspecialchars($t['link_mcp']) ?></a>
</nav>
</main>
<?php require_once __DIR__ . '/includes/footer.php'; ?>
<script src="assets/js/tools.js" defer></script>
</body>
</html>