update privacy

This commit is contained in:
heaven 2026-06-03 01:20:32 +03:00
parent c0658c38ec
commit a334612734

View file

@ -1,6 +1,6 @@
<!doctype html>
<!DOCTYPE html>
<html lang="en">
<head>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<meta name="theme-color" content="#0d0e11" />
@ -20,13 +20,18 @@
--fleet-soft: #a59cff;
color-scheme: dark;
}
*, *::before, *::after { box-sizing: border-box; }
html, body {
*,
*::before,
*::after {
box-sizing: border-box;
}
html,
body {
margin: 0;
padding: 0;
background: var(--bg);
color: var(--text);
font-family: -apple-system, "SF Pro Text", "Inter", system-ui, sans-serif;
font-family: -apple-system, 'SF Pro Text', 'Inter', system-ui, sans-serif;
-webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility;
}
@ -63,8 +68,13 @@
border-radius: 99px;
background: var(--fleet);
}
.brand-name { color: var(--text-strong); font-weight: 600; }
.brand-sep { color: var(--faint); }
.brand-name {
color: var(--text-strong);
font-weight: 600;
}
.brand-sep {
color: var(--faint);
}
h1 {
font-size: 34px;
@ -74,7 +84,11 @@
letter-spacing: -0.6px;
color: var(--text-strong);
}
.effective { color: var(--muted); font-size: 14px; margin: 0; }
.effective {
color: var(--muted);
font-size: 14px;
margin: 0;
}
.lang-switch {
display: inline-flex;
@ -91,10 +105,12 @@
font: inherit;
color: var(--muted);
cursor: pointer;
transition: color .15s ease;
transition: color 0.15s ease;
}
.lang-switch button:hover { color: var(--text); }
.lang-switch button[aria-pressed="true"] {
.lang-switch button:hover {
color: var(--text);
}
.lang-switch button[aria-pressed='true'] {
color: var(--text-strong);
font-weight: 600;
}
@ -113,28 +129,44 @@
scroll-margin-top: 24px;
}
p { margin: 0 0 14px; color: var(--text); }
p {
margin: 0 0 14px;
color: var(--text);
}
ul {
margin: 0 0 18px;
padding-left: 22px;
}
ul li { margin: 8px 0; padding-left: 4px; }
ul li::marker { color: var(--faint); }
ul li b, p b { color: var(--text-strong); font-weight: 600; }
ul li {
margin: 8px 0;
padding-left: 4px;
}
ul li::marker {
color: var(--faint);
}
ul li b,
p b {
color: var(--text-strong);
font-weight: 600;
}
a {
color: var(--fleet-soft);
text-decoration: none;
border-bottom: 1px solid rgba(165, 156, 255, 0.35);
transition: color .15s ease, border-color .15s ease;
transition: color 0.15s ease, border-color 0.15s ease;
}
a:hover {
color: #c0b9ff;
border-bottom-color: rgba(192, 185, 255, 0.7);
}
section[hidden] { display: none; }
section > h2:first-of-type { margin-top: 0; }
section[hidden] {
display: none;
}
section > h2:first-of-type {
margin-top: 0;
}
footer.doc {
margin-top: 64px;
@ -149,22 +181,37 @@
flex-wrap: wrap;
}
footer.doc .copy {
font-family: ui-monospace, "JetBrains Mono", monospace;
font-family: ui-monospace, 'JetBrains Mono', monospace;
}
footer.doc a {
color: var(--muted);
border-bottom-color: transparent;
}
footer.doc a:hover {
color: var(--text);
border-bottom-color: var(--divider);
}
footer.doc a { color: var(--muted); border-bottom-color: transparent; }
footer.doc a:hover { color: var(--text); border-bottom-color: var(--divider); }
@media (max-width: 560px) {
.frame { padding: 36px 20px 96px; }
h1 { font-size: 28px; }
h2 { font-size: 18px; margin: 36px 0 10px; }
body { font-size: 15.5px; line-height: 1.65; }
.frame {
padding: 36px 20px 96px;
}
h1 {
font-size: 28px;
}
h2 {
font-size: 18px;
margin: 36px 0 10px;
}
body {
font-size: 15.5px;
line-height: 1.65;
}
}
</style>
</head>
<body>
<div class="frame">
</head>
<body>
<div class="frame">
<header class="doc">
<div class="brand">
<span class="brand-dot" aria-hidden="true"></span>
@ -184,189 +231,218 @@
</header>
<section lang="en" data-lang="en">
<p>This is the privacy policy for <b>Vojo</b>, a chat app built on the open
<a href="https://matrix.org" rel="noopener">Matrix</a> protocol. It's maintained by
the Vojo Project, an independent developer. If you have questions about anything
here, write to <a href="mailto:vojochatdev@gmail.com">vojochatdev@gmail.com</a>.</p>
<h2>How Vojo works</h2>
<p>
Vojo is a chat app built on the open
<a href="https://matrix.org" rel="noopener">Matrix</a> protocol, maintained by the Vojo
Project, an independent developer. Your messages, profile and rooms live on a Matrix
server. By default that's <code>vojo.chat</code>, which we run. You can also sign in to
any other Matrix server you trust — if you do, the operator of that server holds your
data, not us. We try to keep this short; if anything is unclear, write to
<a href="mailto:vojochatdev@gmail.com">vojochatdev@gmail.com</a>.
</p>
<p>We try to keep this short and readable. If something is unclear, ask.</p>
<h2>What we hold, and why</h2>
<p>
To run the app we keep your account and profile, the messages and rooms you send and
receive, the media you share, and basic technical data such as your IP address and
connection times. Your device also caches messages and keys locally so you can read
offline and stay signed in.
</p>
<h2>How Vojo works, briefly</h2>
<p>Your messages, profile and rooms live on a Matrix server. By default that's
<code>vojo.chat</code>, which we run. You can also sign in to any other Matrix
server you trust — if you do, the operator of that server is the one holding your
data, not us.</p>
<p>
We process this to deliver and sync your messages and to ring your phone for calls —
that's our agreement with you. We keep limited logs to fight spam and abuse, which is our
legitimate interest. Optional features run only if you turn them on, with your consent. We
don't advertise, run analytics in the app, sell your data or profile you.
</p>
<h2>What we hold and what we use it for</h2>
<p>To make the app work we keep the obvious things: your account, the messages and
rooms you send and receive, the media you share, and basic technical data (IP
address, connection times) generated when your device talks to our servers. Your
device also caches messages and keys locally so you can read them offline and stay
signed in.</p>
<p>
You can turn on end-to-end encryption per chat. It isn't on by default: in a chat without
it, our server can see message content. With it on, we can see who's talking and when, but
not what's said. Voice and video calls are encrypted between participants and may pass
through our servers in transit; we don't record or store them.
</p>
<p>Direct conversations are end-to-end encrypted by default. In an encrypted room
we can see who's talking to whom and when, but not what they're saying. In an
unencrypted room we see the content too.</p>
<p>Voice calls are encrypted between participants. When your device can't reach the
other side directly, the audio is relayed through our infrastructure on its way
through — we don't record it and we don't keep it.</p>
<p>We use this data to run the service: deliver messages, sync your devices, ring
your phone for incoming calls, keep limited logs to fight abuse and spam. That's
the whole list. No advertising, no analytics, no resale, no profiling.</p>
<h2>Vojo AI</h2>
<p>
Vojo AI is an optional assistant. You don't have to use it — but if you start a one-to-one
chat with it, every message you send in that chat is forwarded to third-party AI providers
to write the reply: Grok by xAI (USA) and Google's Gemini (USA). In a group chat, only
messages that mention it are sent. If a reply needs current information, your question may
also be sent to Google Search to look it up. Each provider handles your text under its own
privacy policy. By using Vojo AI you agree to your messages being sent to these providers
to generate replies. Because they are in the United States, this transfers that content
outside the EU; the transfer relies on your explicit consent to this optional feature.
Replies are AI-generated and can be confidently wrong, so treat them as a first draft and
please don't send secrets. You can read the providers' policies at
<a href="https://x.ai/legal/privacy-policy" rel="noopener">x.ai/legal/privacy-policy</a>
and
<a href="https://ai.google.dev/gemini-api/terms" rel="noopener"
>ai.google.dev/gemini-api/terms</a
>.
</p>
<h2>Who else is involved</h2>
<ul>
<li><b>Our hosting provider.</b> The
<a href="https://www.hostinger.com" rel="noopener">Hostinger</a>
infrastructure carrying <code>vojo.chat</code> sits in the European Union.</li>
<li><b>Google's push service.</b> Push notifications go through Google so your
phone can wake up and ring or buzz. For end-to-end encrypted chats the
notification only carries the routing info needed to fetch the message
locally — the content stays on your Matrix server. For unencrypted chats
Google may see a short preview (who, where, snippet). This is the only
routine reason data leaves the EU; we rely on the Standard Contractual
Clauses for that transfer.</li>
<li><b>Bot checks.</b> Signing up, and a couple of optional features, briefly
load a third-party "are you a human" check. That provider sees your
interaction with the puzzle and is governed by its own privacy policy.</li>
<li><b>Optional bridges.</b> If you choose to connect Telegram, Discord or
WhatsApp through Vojo, your messages with those networks have to pass
through bridge infrastructure we run, and the network itself sees them
too. None of this turns on unless you opt in.</li>
</ul>
<p>
Push notifications go through Google so your phone can wake and ring. For encrypted chats
the notification carries only the routing info needed to fetch the message locally; for
unencrypted chats it may include a short preview. Signing up loads a Google
human-verification check (reCAPTCHA), and Google sees that interaction. If you choose to
connect another network you use, such as a messenger you already have an account on, your
messages with it pass through bridge infrastructure we run, and that network sees them too
— none of this is on unless you turn it on.
</p>
<p>
Our servers are hosted in the European Union. Some of the above sends data to providers
outside the EU. Apart from the Vojo AI transfer described above (which relies on your
consent), those transfers are covered by Standard Contractual Clauses, or by an adequacy
framework where the recipient is certified under one; a copy of the relevant safeguards,
and the current list of providers, is available on request at the address above.
</p>
<h2>Permissions on your phone</h2>
<p>On Android we ask for: the microphone (only used during calls); notifications
(so we can show you messages and ring for calls); permission to show calls over
the lock screen and to keep a call running with the screen off; and network access.
That's it. We don't touch your address book, photo library, SMS, precise location
or call log.</p>
<p>
On Android we ask for the microphone (used only during calls), notifications, permission
to show and keep calls running over the lock screen, and network access. That's it — we
don't touch your contacts, photo library, SMS, precise location or call log.
</p>
<h2>How long we keep things</h2>
<p>Your messages and account stay on your Matrix server until you delete them or
ask us to deactivate the account. Deletion is processed within about thirty days.
Server access logs are kept for no more than thirty days and then rotated out.</p>
<h2>How long we keep things, and your rights</h2>
<p>
Your messages and account stay on your Matrix server until you delete them or ask us to
deactivate the account. There is no in-app delete button yet: to have your account
deleted, email <a href="mailto:vojochatdev@gmail.com">vojochatdev@gmail.com</a> with your
<code>@username:vojo.chat</code> ID (the steps and details are at
<a href="https://vojo.chat/delete-account">vojo.chat/delete-account</a>). We complete
deletion within about thirty days. Server access logs are kept no longer than thirty days.
Data cached on your device is removed when you uninstall Vojo or clear its data in your
phone's settings.
</p>
<p>Data cached on your device goes away when you uninstall Vojo or clear its data
in your phone's settings. Signing out ends your session but doesn't always scrub
every cached message immediately — the cleanest reset is an uninstall.</p>
<h2>Your rights</h2>
<p>If you live in the EU/EEA (and in many other places the law works similarly),
you can ask us to show you what we hold, fix something that's wrong, delete your
data, hand it over in a portable form, or stop a particular use. You can also
withdraw any consent you've given for optional features, and complain to your
local data-protection authority if you think we're handling things badly. Email
the address at the top and we'll take it from there.</p>
<h2>Kids, changes, contact</h2>
<p>Vojo isn't aimed at anyone under 16, and we don't knowingly collect data from
children. If we change this policy in a way that actually affects you, we'll
update the date above and try to flag it inside the app. The current version
always lives at <a href="https://vojo.chat/privacy">vojo.chat/privacy</a>. For
anything else: <a href="mailto:vojochatdev@gmail.com">vojochatdev@gmail.com</a>.</p>
<p>
If you live in the EU/EEA (and in many places elsewhere the law is similar), you can ask
us to show, correct, export or delete your data, restrict or stop a particular use, or
withdraw a consent you've given — and you can complain to your local data-protection
authority. Email the address at the top. Vojo isn't aimed at anyone under 16, and we don't
knowingly collect children's data. The current version of this policy always lives at
<a href="https://vojo.chat/privacy">vojo.chat/privacy</a>; if we change it in a way that
affects you, we'll update the date above and flag it in the app.
</p>
</section>
<section lang="ru" data-lang="ru" hidden>
<p>Это политика конфиденциальности <b>Vojo</b> — чат-приложения на открытом
протоколе <a href="https://matrix.org" rel="noopener">Matrix</a>. Его поддерживает
проект Vojo, независимый разработчик. Если по тексту возникают вопросы — пишите
на <a href="mailto:vojochatdev@gmail.com">vojochatdev@gmail.com</a>.</p>
<h2>Как устроено Vojo</h2>
<p>
Vojo — чат-приложение на открытом протоколе
<a href="https://matrix.org" rel="noopener">Matrix</a>, его поддерживает проект Vojo,
независимый разработчик. Ваши сообщения, профиль и комнаты хранятся на Matrix-сервере. По
умолчанию это <code>vojo.chat</code>, который держим мы. Вы можете войти и на любой другой
Matrix-сервер, которому доверяете — тогда вашими данными распоряжается оператор того
сервера, а не мы. Стараемся писать коротко; если что-то непонятно — напишите на
<a href="mailto:vojochatdev@gmail.com">vojochatdev@gmail.com</a>.
</p>
<p>Постарались уложиться в нормальный читаемый объём. Если что-то непонятно —
спрашивайте.</p>
<h2>Что мы храним и зачем</h2>
<p>
Чтобы приложение работало, мы храним ваш аккаунт и профиль, отправленные и полученные
сообщения и комнаты, прикреплённые медиафайлы и базовые технические данные — IP-адрес и
время обращений. На самом устройстве хранится локальный кэш сообщений и ключей, чтобы
читать офлайн и не входить заново.
</p>
<h2>Как устроено</h2>
<p>Ваши сообщения, профиль и список комнат живут на Matrix-сервере. По умолчанию
это <code>vojo.chat</code>, который держим мы. Вы можете войти на любой другой
Matrix-сервер, которому доверяете — если так, оператором ваших данных будет тот
сервер, не мы.</p>
<p>
Эти данные мы обрабатываем, чтобы доставлять и синхронизировать сообщения и звонить на ваш
телефон при входящем вызове — это часть нашего соглашения с вами. Ограниченные логи мы
ведём для борьбы со спамом и злоупотреблениями — это наш законный интерес. Дополнительные
функции работают только если вы их включили, по вашему согласию. Мы не показываем рекламу,
не ведём аналитику в приложении, не продаём данные и не профилируем вас.
</p>
<h2>Что у нас лежит и зачем</h2>
<p>Чтобы приложение работало, у нас лежат предсказуемые вещи: ваш аккаунт, ваши
сообщения и комнаты, медиа, и базовые технические данные (IP, время запросов),
которые возникают, когда устройство разговаривает с нашими серверами. На самом
устройстве лежит локальный кэш сообщений и ключей — чтобы можно было читать
офлайн и не входить заново каждый раз.</p>
<p>
Сквозное шифрование можно включить для каждого чата отдельно. По умолчанию оно выключено:
в чате без него содержимое сообщений видит наш сервер. Когда оно включено, мы видим, кто и
когда переписывается, но не само содержимое. Голосовые и видеозвонки шифруются между
участниками и в пути могут проходить через наши серверы; мы их не записываем и не храним.
</p>
<p>Личные переписки по умолчанию защищены end-to-end шифрованием. В зашифрованной
комнате мы видим, кто кому пишет и когда, но не видим, что именно. В
незашифрованных комнатах мы видим и содержимое.</p>
<p>Голосовые звонки шифруются между участниками. Если устройство не может
дотянуться до собеседника напрямую, аудио ретранслируется через нашу
инфраструктуру по пути — мы его не записываем и не храним.</p>
<p>Все эти данные мы используем для того, чтобы сервис работал: доставка
сообщений, синхронизация устройств, входящие звонки, ограниченные логи для борьбы
со спамом и злоупотреблениями. Это весь список. Никакой рекламы, аналитики,
перепродажи или профилирования.</p>
<h2>Vojo AI</h2>
<p>
Vojo AI — необязательный ассистент. Пользоваться им необязательно, но если вы начнёте с
ним личный чат, каждое отправленное в этом чате сообщение передаётся сторонним
ИИ-сервисам, чтобы составить ответ: Grok от xAI (США) и Google Gemini (США). В групповом
чате отправляются только те сообщения, где его упомянули. Если для ответа нужна свежая
информация, ваш вопрос может также уйти в Google Поиск. Каждый сервис обрабатывает ваш
текст по своей политике конфиденциальности. Пользуясь Vojo AI, вы соглашаетесь, что ваши
сообщения отправляются этим сервисам для генерации ответов. Поскольку они находятся в США,
при этом содержимое передаётся за пределы ЕС; основанием для передачи служит ваше явное
согласие на эту необязательную функцию. Ответы генерирует ИИ, и он может уверенно
ошибаться — считайте их черновиком и не отправляйте секреты. Политики сервисов можно
прочитать на
<a href="https://x.ai/legal/privacy-policy" rel="noopener">x.ai/legal/privacy-policy</a> и
<a href="https://ai.google.dev/gemini-api/terms" rel="noopener"
>ai.google.dev/gemini-api/terms</a
>.
</p>
<h2>Кто ещё в этом участвует</h2>
<ul>
<li><b>Наш хостинг.</b>
<a href="https://www.hostinger.com" rel="noopener">Hostinger</a> держит
инфраструктуру <code>vojo.chat</code> в Европейском союзе.</li>
<li><b>Push-сервис Google.</b> Push-уведомления идут через Google, чтобы
телефон проснулся и зазвонил. Для зашифрованных переписок уведомление
несёт только маршрутную информацию, нужную для того чтобы подгрузить
сообщение локально — содержимое остаётся на Matrix-сервере. Для
незашифрованных Google может видеть короткий предпросмотр (кто, где,
фрагмент). Это единственный регулярный случай, когда данные выходят за
пределы ЕС; передача идёт по Стандартным договорным условиям Европейской
комиссии.</li>
<li><b>Капча.</b> При регистрации и в паре дополнительных функций ненадолго
подгружается сторонняя проверка «вы не робот». Этот провайдер видит ваше
взаимодействие с капчей и регулируется собственной политикой.</li>
<li><b>Опциональные мосты.</b> Если вы решите подключить Telegram, Discord
или WhatsApp через Vojo, сообщения с этими сетями неизбежно проходят
через мостовую инфраструктуру, которую держим мы, и сама сеть тоже их
видит. Без вашего явного действия это не включается.</li>
</ul>
<p>
Push-уведомления идут через Google, чтобы телефон проснулся и зазвонил. Для зашифрованных
чатов уведомление несёт только маршрутную информацию, по которой сообщение подгружается
локально; для незашифрованных в нём может быть короткий предпросмотр. При регистрации
загружается проверка Google, что вы человек (reCAPTCHA), и Google видит это
взаимодействие. Если вы решите подключить другую сеть, которой пользуетесь, например
мессенджер, где у вас уже есть аккаунт, сообщения с ней проходят через мостовую
инфраструктуру, которую держим мы, и сама сеть тоже их видит — без вашего включения это не
работает.
</p>
<p>
Наши серверы размещены в Европейском союзе. Часть перечисленного отправляет данные
сервисам за пределами ЕС. Кроме передачи в Vojo AI, описанной выше (она основана на вашем
согласии), эти передачи покрыты Стандартными договорными положениями (SCC) или рамочным
соглашением об адекватности, если получатель в нём сертифицирован; копию соответствующих
гарантий и актуальный список сервисов можно запросить по адресу выше.
</p>
<h2>Разрешения на телефоне</h2>
<p>На Android приложение просит: микрофон (используется только во время звонка);
уведомления (чтобы показывать сообщения и звонки); право показывать звонок поверх
локскрина и держать его при выключенном экране; доступ к сети. И всё. Мы не
трогаем адресную книгу, фотогалерею, SMS, точную геолокацию и журнал вызовов.</p>
<p>
На Android приложение запрашивает микрофон (только во время звонка), уведомления, право
показывать и удерживать звонок поверх экрана блокировки и доступ к сети. И всё — мы не
обращаемся к контактам, фотогалерее, SMS, точной геолокации и журналу вызовов.
</p>
<h2>Сколько мы это храним</h2>
<p>Сообщения и аккаунт лежат на Matrix-сервере до тех пор, пока вы их не
удалите или не попросите деактивировать аккаунт. Удаление обрабатывается в
течение тридцати дней. Журналы доступа на сервере хранятся не более тридцати
дней, затем уходят на ротацию.</p>
<h2>Сколько мы храним и ваши права</h2>
<p>
Сообщения и аккаунт хранятся на Matrix-сервере, пока вы их не удалите или не попросите
деактивировать аккаунт. Кнопки удаления в приложении пока нет: чтобы удалить аккаунт,
напишите на <a href="mailto:vojochatdev@gmail.com">vojochatdev@gmail.com</a> и укажите
свой ID вида <code>@username:vojo.chat</code> (шаги и подробности — на
<a href="https://vojo.chat/delete-account">vojo.chat/delete-account</a>). Удаление мы
выполняем примерно за тридцать дней. Журналы доступа на сервере хранятся не дольше
тридцати дней. Кэш на устройстве удаляется, когда вы удаляете Vojo или очищаете его данные
в настройках телефона.
</p>
<p>Кэш на устройстве пропадает, когда вы удаляете Vojo или очищаете его данные в
настройках телефона. Выход из аккаунта прекращает сессию, но не всегда подчищает
весь кэш сразу — самый чистый способ обнулиться — это переустановка.</p>
<h2>Ваши права</h2>
<p>Если вы живёте в ЕС/ЕЭЗ (а во многих других местах закон работает похоже), вы
можете попросить нас показать, что у нас лежит, поправить неверное, удалить,
отдать в переносимом виде, остановить конкретное использование. Можно отозвать
согласие на дополнительные функции и пожаловаться в местный надзорный орган, если
кажется, что мы что-то делаем не так. Напишите на адрес сверху, и пойдём
разбираться.</p>
<h2>Дети, изменения, контакты</h2>
<p>Vojo не рассчитан на людей младше 16 лет, и мы сознательно не собираем данные
детей. Если что-то поменяется так, что это вас реально касается, обновим дату в
начале и постараемся отметить это в самом приложении. Текущая версия всегда
лежит по адресу <a href="https://vojo.chat/privacy">vojo.chat/privacy</a>. По
любым другим вопросам:
<a href="mailto:vojochatdev@gmail.com">vojochatdev@gmail.com</a>.</p>
<p>
Если вы живёте в ЕС/ЕЭЗ (во многих странах закон работает похоже), вы можете попросить
показать, исправить, выгрузить или удалить ваши данные, ограничить или прекратить
конкретное использование, отозвать данное ранее согласие — и пожаловаться в местный
надзорный орган по защите данных. Напишите на адрес в начале. Vojo не рассчитан на лиц
младше 16 лет, и мы сознательно не собираем данные детей. Актуальная версия этой политики
всегда доступна по адресу <a href="https://vojo.chat/privacy">vojo.chat/privacy</a>; если
мы изменим её так, что это вас затронет, обновим дату вверху и отметим это в приложении.
</p>
</section>
<footer class="doc">
<span class="copy">© Vojo Project · 2026</span>
<a href="https://vojo.chat">vojo.chat</a>
</footer>
</div>
</div>
<script>
<script>
(function () {
var buttons = document.querySelectorAll('.lang-switch button');
var sections = document.querySelectorAll('section[data-lang]');
@ -384,17 +460,23 @@
if (h1 && H1[lang]) h1.textContent = H1[lang];
if (eff && EFF[lang]) eff.textContent = EFF[lang];
document.documentElement.lang = lang;
document.title = (lang === 'ru' ? 'Vojo — Политика конфиденциальности' : 'Vojo — Privacy Policy');
try { localStorage.setItem('vojo-privacy-lang', lang); } catch (e) {}
document.title =
lang === 'ru' ? 'Vojo — Политика конфиденциальности' : 'Vojo — Privacy Policy';
try {
localStorage.setItem('vojo-privacy-lang', lang);
} catch (e) {}
}
buttons.forEach(function (b) {
b.addEventListener('click', function () { setLang(b.dataset.lang); });
b.addEventListener('click', function () {
setLang(b.dataset.lang);
});
});
var stored = null;
try { stored = localStorage.getItem('vojo-privacy-lang'); } catch (e) {}
try {
stored = localStorage.getItem('vojo-privacy-lang');
} catch (e) {}
setLang(stored || 'en');
})();
</script>
</body>
</script>
</body>
</html>