Skip to content

Commit

Permalink
Merge pull request #5 from hugodeaguiar/translate
Browse files Browse the repository at this point in the history
Configuring i18next and English version.
hugodeaguiar authored Jan 21, 2025

Verified

This commit was signed with the committer’s verified signature.
IvanRibakov Ivan Ribakov
2 parents 916c3a0 + 6ce23e3 commit 4d3a2eb
Showing 7 changed files with 912 additions and 168 deletions.
32 changes: 32 additions & 0 deletions locales/en/translation.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
{
"title": "GetIP.dev - What is my IP?",
"title-privacy": "GetIP.dev - Privacy Policy",
"home-description": "Discover your current IP address with GetIP.dev, the ideal tool to help troubleshoot network and security issues.",
"your-current-ip": "Your current IP address:",
"city": "City:",
"region": "Region:",
"country": "Country:",
"provider": "Provider:",
"cookie-consent": "We use cookies to ensure you have the best experience on our site.",
"see-more": "See more",
"pp-info": "Collected Information",
"pp-info-1": "When you visit our website, we use Google Tag Manager to monitor and analyze user interactions. The information collected may include:",
"pp-info-1-1": "Browsing data (pages visited, time spent, clicks, etc.)",
"pp-info-1-2": "IP address (which can be used to determine geographical location)",
"pp-info-1-3": "Information about the device and browser used",
"pp-use": "Use of Information",
"pp-use-1": "The information collected is used exclusively to:",
"pp-use-1-1": "Improve the user experience on the site",
"pp-use-1-2": "Understand how visitors interact with our content",
"pp-use-1-3": "Perform statistical analyses to optimize site performance",
"pp-share": "Information Sharing",
"pp-share-description": "We do not sell, trade, or otherwise transfer your personally identifiable information to third parties. The information collected by Google Tag Manager is stored and managed by Google, in accordance with Google's privacy policy.",
"pp-cookies": "Cookies",
"pp-cookies-description": "Our site may use cookies to store temporary information and improve your browsing experience. You can choose to disable cookies in your browser settings, but this may affect the functionality of the site.",
"pp-security": "Information Security",
"pp-security-description": "We adopt appropriate security measures to protect your personal information against unauthorized access, alteration, disclosure, or destruction.",
"pp-updates": "Privacy Policy Changes",
"pp-updates-description": "We reserve the right to update this privacy policy periodically. Any changes will be posted on this page, and the modification date will be updated at the top of the page.",
"pp-contact": "Contact",
"pp-contact-description": "If you have any questions about this privacy policy, please contact us at [email protected]."
}
32 changes: 32 additions & 0 deletions locales/pt/translation.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
{
"title": "GetIP.dev - Qual é o meu IP?",
"title-privacy": "GetIP.dev - Política de Privacidade",
"home-description": "Descubra seu endereço IP atual com GetIP.dev, a ferramenta ideal para ajudar a solucionar problemas de rede e segurança.",
"your-current-ip": "Seu endereço de IP atual:",
"city": "Cidade:",
"region": "Estado:",
"country": "País:",
"provider": "Provedor:",
"cookie-consent": "Utilizamos cookies para garantir que você tenha a melhor experiência em nosso site.",
"see-more": "Saiba mais",
"pp-info": "Informações Coletadas",
"pp-info-1": "Quando você visita o nosso site, utilizamos o Google Tag Manager para monitorar e analisar as interações dos usuários. As informações coletadas podem incluir:",
"pp-info-1-1": "Dados de navegação (páginas visitadas, tempo de permanência, cliques, etc.)",
"pp-info-1-2": "Endereço IP (que pode ser utilizado para determinar a localização geográfica)",
"pp-info-1-3": "Informações sobre o dispositivo e navegador utilizado",
"pp-use": "Uso das Informações",
"pp-use-1": "As informações coletadas são utilizadas exclusivamente para:",
"pp-use-1-1": "Melhorar a experiência do usuário no site",
"pp-use-1-2": "Entender como os visitantes interagem com nosso conteúdo",
"pp-use-1-3": "Realizar análises estatísticas para otimizar a performance do site",
"pp-share": "Compartilhamento de Informações",
"pp-share-description": "Nós não vendemos, trocamos ou de outra forma transferimos para terceiros as suas informações pessoais identificáveis. As informações coletadas pelo Google Tag Manager são armazenadas e gerenciadas pelo Google, em conformidade com a política de privacidade do Google.",
"pp-cookies": "Cookies",
"pp-cookies-description": "O nosso site pode utilizar cookies para armazenar informações temporárias e melhorar a sua experiência de navegação. Você pode optar por desativar os cookies nas configurações do seu navegador, mas isso pode afetar a funcionalidade do site.",
"pp-security": "Segurança das Informações",
"pp-security-description": "Adotamos medidas de segurança adequadas para proteger as suas informações pessoais contra acessos não autorizados, alteração, divulgação ou destruição.",
"pp-updates": "Alterações na Política de Privacidade",
"pp-updates-description": "Reservamos o direito de atualizar esta política de privacidade periodicamente. Qualquer alteração será publicada nesta página, e a data de modificação será atualizada no topo da página.",
"pp-contact": "Contato",
"pp-contact-description": "Se você tiver alguma dúvida sobre esta política de privacidade, entre em contato conosco através do [email protected]."
}
846 changes: 714 additions & 132 deletions package-lock.json

Large diffs are not rendered by default.

5 changes: 5 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -12,7 +12,12 @@
"license": "ISC",
"dependencies": {
"consolidate": "^1.0.3",
"env": "^0.0.2",
"express": "^4.17.1",
"i18next": "^24.2.1",
"i18next-browser-languagedetector": "^8.0.2",
"i18next-fs-backend": "^2.6.0",
"i18next-http-middleware": "^3.7.1",
"internal-ip": "^8.0.0",
"mustache": "^4.2.0",
"public-ip": "^6.0.2"
103 changes: 98 additions & 5 deletions server.mjs
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import express from 'express';
import consolidate from 'consolidate';
import https from 'https';
import i18next from 'i18next';
import Backend from 'i18next-fs-backend';
import path from 'path';

const app = express();

app.set('trust proxy', true);

// assign the mustache engine to .html files
@@ -50,28 +52,119 @@ function getIPInfo(callback, ip) {
req.end();
}

function initI18n(lang) {
i18next
.use(Backend)
.init({
lng: lang,
ignoreRoutes: ['images/', 'public/', 'css/', 'js/'],
backend: {
loadPath: path.join(process.cwd(), 'locales', '{{lng}}', '{{ns}}.json'),
},
fallbackLng: 'en',
preload: ['en', 'pt'],
lowerCaseLng: true,
debug: false
});
}

function generateHomeViewData(lang, ip, info) {
return {
'title' : i18next.t('title'),
'ip': ip,
'ipinfo' : info,
'home_description': i18next.t('home-description'),
'html_lang': lang == 'en' ? 'en' : 'pt_BR',
'your_current_ip': i18next.t('your-current-ip'),
'city': i18next.t('city'),
'region': i18next.t('region'),
'country': i18next.t('country'),
'provider': i18next.t('provider'),
'cookie_consent': i18next.t('cookie-consent'),
'see_more': i18next.t('see-more')
};
}

function generatePPViewData(lang) {
return {
'title' : i18next.t('title-privacy'),
'html_lang': lang == 'en' ? 'en' : 'pt_BR',
'cookie_consent': i18next.t('cookie-consent'),
'see_more': i18next.t('see-more'),
'pp_info': i18next.t('pp-info'),
'pp_info_1': i18next.t('pp-info-1'),
'pp_info_1_1': i18next.t('pp-info-1-1'),
'pp_info_1_2': i18next.t('pp-info-1-2'),
'pp_info_1_3': i18next.t('pp-info-1-3'),
'pp_use': i18next.t('pp-use'),
'pp_use_1': i18next.t('pp-use-1'),
'pp_use_1_1': i18next.t('pp-use-1-1'),
'pp_use_1_2': i18next.t('pp-use-1-2'),
'pp_use_1_3': i18next.t('pp-use-1-3'),
'pp_share': i18next.t('pp-share'),
'pp_share_description': i18next.t('pp-share-description'),
'pp_cookies': i18next.t('pp-cookies'),
'pp_cookies_description': i18next.t('pp-cookies-description'),
'pp_security': i18next.t('pp-security'),
'pp_security_description': i18next.t('pp-security-description'),
'pp_updates': i18next.t('pp-updates'),
'pp_updates_description': i18next.t('pp-updates-description'),
'pp_contact': i18next.t('pp-contact'),
'pp_contact_description': i18next.t('pp-contact-description')
};
}


app.get('/', async (req, res) => {
initI18n('pt');

const ip = req.ip;
getIPInfo((info) => {
info = JSON.parse(info);

var viewdata = generateHomeViewData('pt', ip, info);

res.render('index', viewdata);
}, ip)
});

app.get('/en', async (req, res) => {
initI18n('en');

const ip = req.ip;
getIPInfo((info) => {
info = JSON.parse(info);

var viewdata = { 'title' : 'GetIP.dev - Qual é meu IP?', 'ip': ip, 'ipinfo' : info};
var viewdata = generateHomeViewData('pt', ip, info);

res.render('index', viewdata);
}, ip)
});

app.get('/politica-de-privacidade', async (req, res) => {
var viewdata = { 'title' : 'GetIP.dev - Política de Privacidade'};
initI18n('pt');

setTimeout(() => {
var viewdata = generatePPViewData('pt');

res.render('privacy-policy', viewdata);
}, 300);
});

app.get('/en/privacy-policy', async (req, res) => {
initI18n('en');

setTimeout(() => {
var viewdata = generatePPViewData('pt');

res.render('privacy-policy');
res.render('privacy-policy', viewdata);
}, 300);
});

app.get('/qual-e-meu-ip', async (req, res) => {
const ip = req.ip;

var viewdata = { 'title' : 'GetIP.dev - Qual é meu IP?', 'ip': ip };
var viewdata = { 'title' : i18next.t('title'), 'ip': ip };

res.render('index', viewdata);
});
16 changes: 8 additions & 8 deletions views/index.html
Original file line number Diff line number Diff line change
@@ -45,35 +45,35 @@ <h1>
<div class="splash-container">
<div class="splash">
<p class="splash-subhead">
Descubra seu endereço IP atual com GetIP.dev, a ferramenta ideal para ajudar a solucionar problemas de rede e segurança.
{{ home_description }}
</p>

<h2 class="second-title">Seu endereço de IP atual:</h2>
<h2 class="second-title">{{ your_current_ip }}</h2>
<div class="splash-head">
<span>{{ ip }}</span>
</div>
<br>
<div class="pure-g ipinfo">
<div class="pure-u-1">
<ul class="pure-menu-list">
<li class="pure-menu-item"><strong>Cidade:</strong> {{ipinfo.city}}{{^ipinfo.city}}Não identificada.{{/ipinfo.city}}</li>
<li class="pure-menu-item"><strong>Estado:</strong> {{ipinfo.region}}{{^ipinfo.region}}Não identificado.{{/ipinfo.region}}</li>
<li class="pure-menu-item"><strong>País:</strong> {{ipinfo.country}}{{^ipinfo.country}}Não identificado.{{/ipinfo.country}}</li>
<li class="pure-menu-item"><strong>Provedor:</strong> {{ipinfo.org}}{{^ipinfo.org}}Não identificado.{{/ipinfo.org}}</li>
<li class="pure-menu-item"><strong>{{ city }}</strong> {{ipinfo.city}}{{^ipinfo.city}}Não identificada.{{/ipinfo.city}}</li>
<li class="pure-menu-item"><strong>{{ region }}</strong> {{ipinfo.region}}{{^ipinfo.region}}Não identificado.{{/ipinfo.region}}</li>
<li class="pure-menu-item"><strong>{{ country }}</strong> {{ipinfo.country}}{{^ipinfo.country}}Não identificado.{{/ipinfo.country}}</li>
<li class="pure-menu-item"><strong>{{ provider }}</strong> {{ipinfo.org}}{{^ipinfo.org}}Não identificado.{{/ipinfo.org}}</li>
</ul>
</div>
</div>
</div>
</div>

<div class="footer l-box is-center">
Copyright © 2024 - Todos os direitos reservados para <a href="https://www.linkedin.com/in/hugodeaguiar/?locale=en_US" target="_blank">Hugo Aguiar</a>
Copyright © 2024 - 2025 - A project by <a href="https://www.linkedin.com/in/hugodeaguiar/?locale=en_US" target="_blank">Hugo Aguiar</a>
</div>
</div>

<!-- Cookie Consent Popup -->
<div class="cookie-consent-popup" id="cookieConsentPopup">
<p>Utilizamos cookies para garantir que você tenha a melhor experiência em nosso site.<a href="/politica-de-privacidade" style="color: #ffd700;"> Saiba Mais</a></p>
<p>{{ cookie_consent }}<a href="/politica-de-privacidade" style="color: #ffd700;"> {{ see_more }}</a></p>
<button class="pure-button pure-button-primary" id="acceptCookies">Ok</button>
</div>

46 changes: 23 additions & 23 deletions views/privacy-policy.html
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<!doctype html>
<html lang="pt_BR">
<html lang="{{ html_lang }}">
<head>
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-DT6ZK3NM44"></script>
@@ -55,54 +55,54 @@ <h1>

<div class="pure-g privacy-policy">
<div class="content">
<h2>1. Informações Coletadas</h2>
<h2>1. {{ pp_info }}</h2>

<p>
Quando você visita o nosso site, utilizamos o Google Tag Manager para monitorar e analisar as interações dos usuários. As informações coletadas podem incluir:
{{ pp_info_1 }}

<ol>
<li>Dados de navegação (páginas visitadas, tempo de permanência, cliques, etc.)</li>
<li>Endereço IP (que pode ser utilizado para determinar a localização geográfica)</li>
<li>Informações sobre o dispositivo e navegador utilizado</li>
<li>{{ pp_info_1_1 }}</li>
<li>{{ pp_info_1_2 }}</li>
<li>{{ pp_info_1_3 }}</li>
</ol>
</p>


<h2>2. Uso das Informações</h2>
<h2>2. {{ pp_use }}</h2>

<p>As informações coletadas são utilizadas exclusivamente para:</p>
<p>{{ pp_use_1 }}</p>

<ol>
<li>Melhorar a experiência do usuário no site</li>
<li>Entender como os visitantes interagem com nosso conteúdo</li>
<li>Realizar análises estatísticas para otimizar a performance do site</li>
<li>{{ pp_use_1_1 }}</li>
<li>{{ pp_use_1_2 }}</li>
<li>{{ pp_use_1_3 }}</li>
</ol>

<h2>3. Compartilhamento de Informações</h2>
<p>Nós não vendemos, trocamos ou de outra forma transferimos para terceiros as suas informações pessoais identificáveis. As informações coletadas pelo Google Tag Manager são armazenadas e gerenciadas pelo Google, em conformidade com a política de privacidade do Google.</p>
<h2>3. {{ pp_share }}</h2>
<p>{{ pp_share_description }}</p>

<h2>4. Cookies</h2>
<p>O nosso site pode utilizar cookies para armazenar informações temporárias e melhorar a sua experiência de navegação. Você pode optar por desativar os cookies nas configurações do seu navegador, mas isso pode afetar a funcionalidade do site.</p>
<h2>4. {{ pp_cookies }}</h2>
<p>{{ pp_cookie_description }}</p>

<h2>5. Segurança das Informações</h2>
<p>Adotamos medidas de segurança adequadas para proteger as suas informações pessoais contra acessos não autorizados, alteração, divulgação ou destruição.</p>
<h2>5. {{ pp_security }}</h2>
<p>{{ pp_security_description }}</p>

<h2>6. Alterações na Política de Privacidade</h2>
<p>Reservamos o direito de atualizar esta política de privacidade periodicamente. Qualquer alteração será publicada nesta página, e a data de modificação será atualizada no topo da página.</p>
<h2>6. {{ pp_updates }}</h2>
<p>{{ pp_updates_description }}</p>

<h2>7. Contato</h2>
<p>Se você tiver alguma dúvida sobre esta política de privacidade, entre em contato conosco através do contact@noffort.co.</p>
<h2>7. {{ pp_contact }}</h2>
<p>{{ pp_contact_description }}</p>
</div>
</div>

<div class="footer l-box is-center">
Copyright © 2024 - Todos os direitos reservados para <a href="https://www.linkedin.com/in/hugodeaguiar/?locale=en_US" target="_blank">Hugo Aguiar</a>
Copyright © 2024 - 2025 - A project by <a href="https://www.linkedin.com/in/hugodeaguiar/?locale=en_US" target="_blank">Hugo Aguiar</a>
</div>
</div>

<!-- Cookie Consent Popup -->
<div class="cookie-consent-popup" id="cookieConsentPopup">
<p>Utilizamos cookies para garantir que você tenha a melhor experiência em nosso site.<a href="/politica-de-privacidade" style="color: #ffd700;"> Saiba Mais</a></p>
<p>{{ cookie_consent }}<a href="/politica-de-privacidade" style="color: #ffd700;"> {{ see_more }}</a></p>
<button class="pure-button pure-button-primary" id="acceptCookies">Ok</button>
</div>

0 comments on commit 4d3a2eb

Please sign in to comment.