From f525687c76b4b0562dedbc6e6d67c082685bffb9 Mon Sep 17 00:00:00 2001 From: silvavini9 Date: Sat, 11 Oct 2025 01:37:19 -0400 Subject: [PATCH 01/19] feat: inicia internalizacao utilizando next-intl --- next.config.mjs | 6 +- package-lock.json | 143 ++++++++++++++++++++++++- package.json | 1 + src/app/{ => [locale]/(home)}/page.tsx | 0 src/i18n/navigation.ts | 6 ++ src/i18n/request.ts | 16 +++ src/i18n/routing.ts | 8 ++ src/locales/en.json | 5 + src/locales/index.ts | 10 ++ src/locales/pt-br.json | 5 + src/middleware.ts | 16 +++ 11 files changed, 211 insertions(+), 5 deletions(-) rename src/app/{ => [locale]/(home)}/page.tsx (100%) create mode 100644 src/i18n/navigation.ts create mode 100644 src/i18n/request.ts create mode 100644 src/i18n/routing.ts create mode 100644 src/locales/en.json create mode 100644 src/locales/index.ts create mode 100644 src/locales/pt-br.json create mode 100644 src/middleware.ts diff --git a/next.config.mjs b/next.config.mjs index 1d61478..9962331 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -1,4 +1,8 @@ +import createNextIntlPlugin from 'next-intl/plugin' + +const withNextIntl = createNextIntlPlugin() + /** @type {import('next').NextConfig} */ const nextConfig = {} -export default nextConfig +export default withNextIntl(nextConfig) diff --git a/package-lock.json b/package-lock.json index ecb4fa0..e3ed654 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "clsx": "^2.1.1", "framer-motion": "^11.11.9", "next": "^14.2.13", + "next-intl": "^4.3.12", "react": "^18", "react-dom": "^18", "react-icons": "^5.3.0" @@ -183,6 +184,66 @@ "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==", "license": "MIT" }, + "node_modules/@formatjs/ecma402-abstract": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.3.6.tgz", + "integrity": "sha512-HJnTFeRM2kVFVr5gr5kH1XP6K0JcJtE7Lzvtr3FS/so5f1kpsqqqxy5JF+FRaO6H2qmcMfAUIox7AJteieRtVw==", + "license": "MIT", + "dependencies": { + "@formatjs/fast-memoize": "2.2.7", + "@formatjs/intl-localematcher": "0.6.2", + "decimal.js": "^10.4.3", + "tslib": "^2.8.0" + } + }, + "node_modules/@formatjs/ecma402-abstract/node_modules/@formatjs/intl-localematcher": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.6.2.tgz", + "integrity": "sha512-XOMO2Hupl0wdd172Y06h6kLpBz6Dv+J4okPLl4LPtzbr8f66WbIoy4ev98EBuZ6ZK4h5ydTN6XneT4QVpD7cdA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@formatjs/fast-memoize": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.7.tgz", + "integrity": "sha512-Yabmi9nSvyOMrlSeGGWDiH7rf3a7sIwplbvo/dlz9WCIjzIQAfy1RMf4S0X3yG724n5Ghu2GmEl5NJIV6O9sZQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@formatjs/icu-messageformat-parser": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.11.4.tgz", + "integrity": "sha512-7kR78cRrPNB4fjGFZg3Rmj5aah8rQj9KPzuLsmcSn4ipLXQvC04keycTI1F7kJYDwIXtT2+7IDEto842CfZBtw==", + "license": "MIT", + "dependencies": { + "@formatjs/ecma402-abstract": "2.3.6", + "@formatjs/icu-skeleton-parser": "1.8.16", + "tslib": "^2.8.0" + } + }, + "node_modules/@formatjs/icu-skeleton-parser": { + "version": "1.8.16", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.16.tgz", + "integrity": "sha512-H13E9Xl+PxBd8D5/6TVUluSpxGNvFSlN/b3coUp0e0JpuWXXnQDiavIpY3NnvSp4xhEMoXyyBvVfdFX8jglOHQ==", + "license": "MIT", + "dependencies": { + "@formatjs/ecma402-abstract": "2.3.6", + "tslib": "^2.8.0" + } + }, + "node_modules/@formatjs/intl-localematcher": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.10.tgz", + "integrity": "sha512-af3qATX+m4Rnd9+wHcjJ4w2ijq+rAVP3CCinJQvFv1kgSu1W6jypUmvleJxcewdxmutM8dmIRZFxO/IQBZmP2Q==", + "license": "MIT", + "dependencies": { + "tslib": "2" + } + }, "node_modules/@headlessui/react": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-2.1.8.tgz", @@ -682,6 +743,12 @@ "dev": true, "license": "MIT" }, + "node_modules/@schummar/icu-type-parser": { + "version": "1.21.5", + "resolved": "https://registry.npmjs.org/@schummar/icu-type-parser/-/icu-type-parser-1.21.5.tgz", + "integrity": "sha512-bXHSaW5jRTmke9Vd0h5P7BtWZG9Znqb8gSDxZnxaGSJnGwPLDPfS+3g0BKzeWqzgZPsIVZkM7m2tbo18cm5HBw==", + "license": "MIT" + }, "node_modules/@swc/counter": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", @@ -1735,6 +1802,12 @@ } } }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "license": "MIT" + }, "node_modules/deep-equal": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", @@ -3225,6 +3298,18 @@ "node": ">= 0.4" } }, + "node_modules/intl-messageformat": { + "version": "10.7.18", + "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.7.18.tgz", + "integrity": "sha512-m3Ofv/X/tV8Y3tHXLohcuVuhWKo7BBq62cqY15etqmLxg2DZ34AGGgQDeR+SCta2+zICb1NX83af0GJmbQ1++g==", + "license": "BSD-3-Clause", + "dependencies": { + "@formatjs/ecma402-abstract": "2.3.6", + "@formatjs/fast-memoize": "2.2.7", + "@formatjs/icu-messageformat-parser": "2.11.4", + "tslib": "^2.8.0" + } + }, "node_modules/is-arguments": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", @@ -4021,6 +4106,15 @@ "dev": true, "license": "MIT" }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/next": { "version": "14.2.33", "resolved": "https://registry.npmjs.org/next/-/next-14.2.33.tgz", @@ -4071,6 +4165,33 @@ } } }, + "node_modules/next-intl": { + "version": "4.3.12", + "resolved": "https://registry.npmjs.org/next-intl/-/next-intl-4.3.12.tgz", + "integrity": "sha512-yAmrQ3yx0zpNva/knniDvam3jT2d01Lv2aRgRxUIDL9zm9O4AsDjWbDIxX13t5RNf0KVnKkxH+iRcqEAmWecPg==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/amannn" + } + ], + "license": "MIT", + "dependencies": { + "@formatjs/intl-localematcher": "^0.5.4", + "negotiator": "^1.0.0", + "use-intl": "^4.3.12" + }, + "peerDependencies": { + "next": "^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0", + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/next/node_modules/postcss": { "version": "8.4.31", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", @@ -5641,9 +5762,9 @@ } }, "node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, "node_modules/type-check": { @@ -5754,7 +5875,7 @@ "version": "5.6.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -5824,6 +5945,20 @@ "punycode": "^2.1.0" } }, + "node_modules/use-intl": { + "version": "4.3.12", + "resolved": "https://registry.npmjs.org/use-intl/-/use-intl-4.3.12.tgz", + "integrity": "sha512-RxW2/D17irlDOJOzClKl+kWA7ReGLpo/A8f/LF7w1kIxO6mPKVh422JJ/pDCcvtYFCI4aPtn1AXUfELKbM+7tg==", + "license": "MIT", + "dependencies": { + "@formatjs/fast-memoize": "^2.2.0", + "@schummar/icu-type-parser": "1.21.5", + "intl-messageformat": "^10.5.14" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", diff --git a/package.json b/package.json index 01c714e..dd0a743 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "clsx": "^2.1.1", "framer-motion": "^11.11.9", "next": "^14.2.13", + "next-intl": "^4.3.12", "react": "^18", "react-dom": "^18", "react-icons": "^5.3.0" diff --git a/src/app/page.tsx b/src/app/[locale]/(home)/page.tsx similarity index 100% rename from src/app/page.tsx rename to src/app/[locale]/(home)/page.tsx diff --git a/src/i18n/navigation.ts b/src/i18n/navigation.ts new file mode 100644 index 0000000..9da6cb6 --- /dev/null +++ b/src/i18n/navigation.ts @@ -0,0 +1,6 @@ +import { createNavigation } from 'next-intl/navigation' +import { routing } from './routing' + +// Lightweight wrappers around Next.js' navigation +// APIs that consider the routing configuration +export const { Link, redirect, usePathname, useRouter, getPathname } = createNavigation(routing) diff --git a/src/i18n/request.ts b/src/i18n/request.ts new file mode 100644 index 0000000..793cee1 --- /dev/null +++ b/src/i18n/request.ts @@ -0,0 +1,16 @@ +import { getRequestConfig } from 'next-intl/server' + +import { locales, defaultLocale, Locale } from '@/locales' + +export default getRequestConfig(async ({ requestLocale }) => { + let locale = await requestLocale + + if (!locale || !locales.includes(locale as Locale)) { + locale = defaultLocale + } + + return { + locale, + messages: (await import(`@/locales/${locale}.json`)).default, + } +}) diff --git a/src/i18n/routing.ts b/src/i18n/routing.ts new file mode 100644 index 0000000..c609f35 --- /dev/null +++ b/src/i18n/routing.ts @@ -0,0 +1,8 @@ +import { defaultLocale, locales } from '@/locales' +import { defineRouting } from 'next-intl/routing' + +export const routing = defineRouting({ + locales: locales, + defaultLocale: defaultLocale, + localePrefix: 'as-needed', +}) diff --git a/src/locales/en.json b/src/locales/en.json new file mode 100644 index 0000000..8a71bae --- /dev/null +++ b/src/locales/en.json @@ -0,0 +1,5 @@ +{ + "HomePage": { + "title": "Hello world!" + } +} diff --git a/src/locales/index.ts b/src/locales/index.ts new file mode 100644 index 0000000..333a7b1 --- /dev/null +++ b/src/locales/index.ts @@ -0,0 +1,10 @@ +const PT_BR = 'pt-br' as const +const EN = 'en' as const + +const locales = [PT_BR, EN] as const + +const defaultLocale = PT_BR + +export type Locale = (typeof locales)[number] + +export { locales, defaultLocale } diff --git a/src/locales/pt-br.json b/src/locales/pt-br.json new file mode 100644 index 0000000..6d06ca9 --- /dev/null +++ b/src/locales/pt-br.json @@ -0,0 +1,5 @@ +{ + "HomePage": { + "title": "Olá Mundo" + } +} diff --git a/src/middleware.ts b/src/middleware.ts new file mode 100644 index 0000000..ae0f75c --- /dev/null +++ b/src/middleware.ts @@ -0,0 +1,16 @@ +import createMiddleware from 'next-intl/middleware' +import { routing } from './i18n/routing' + +export default createMiddleware(routing) + +export const config = { + matcher: [ + // Match all pathnames except for + // - … if they start with `/api`, `/trpc`, `/_next` or `/_vercel` + // - … the ones containing a dot (e.g. `favicon.ico`) + '/((?!api|trpc|_next|_vercel|.*\\..*).*)', + + // Match all pathnames within `{/:locale}/users` + '/([\\w-]+)?/users/(.+)', + ], +} From ec6436825d64d4697dac1dcbe72d52804c3db385 Mon Sep 17 00:00:00 2001 From: silvavini9 Date: Sat, 11 Oct 2025 01:46:26 -0400 Subject: [PATCH 02/19] refactor: remocao de duplicacao de pagina e de codigo --- .../termos-de-servico}/page.tsx | 10 +- src/app/termos-de-servico/page.tsx | 203 ------------------ 2 files changed, 7 insertions(+), 206 deletions(-) rename src/app/{Terms-of-Service => [locale]/termos-de-servico}/page.tsx (97%) delete mode 100644 src/app/termos-de-servico/page.tsx diff --git a/src/app/Terms-of-Service/page.tsx b/src/app/[locale]/termos-de-servico/page.tsx similarity index 97% rename from src/app/Terms-of-Service/page.tsx rename to src/app/[locale]/termos-de-servico/page.tsx index ea0d0a7..9ce1989 100644 --- a/src/app/Terms-of-Service/page.tsx +++ b/src/app/[locale]/termos-de-servico/page.tsx @@ -11,13 +11,17 @@ export default function TermsOfServicePage() { {/* LOGO E TÍTULO */}
- Termos de Serviço + + Termos de Serviço +
{/* TERMOS ORIGINAIS */} -
+ prose-strong:text-slate-900 prose-strong:font-bold" + >

Termos de Serviço

diff --git a/src/app/termos-de-servico/page.tsx b/src/app/termos-de-servico/page.tsx deleted file mode 100644 index ea0d0a7..0000000 --- a/src/app/termos-de-servico/page.tsx +++ /dev/null @@ -1,203 +0,0 @@ -import type { Metadata } from 'next' -import Container from '@/components/Container' - -export const metadata: Metadata = { - title: 'Termos de Serviço', - description: 'Termos de Serviço para o aplicativo Diaum.', -} - -export default function TermsOfServicePage() { - return ( - - {/* LOGO E TÍTULO */} -

- Termos de Serviço -
- {/* TERMOS ORIGINAIS */} -
-

Termos de Serviço

- -

- ESTES TERMOS CRIAM UM CONTRATO VINCULATIVO. -

- -

- Por favor, leia estes Termos de Serviço ("Termos") cuidadosamente porque eles formam um - contrato entre você e a Diaum app, nossos parceiros, funcionários, diretores, - patrocinadores e empresas afiliadas ("nós" e "conosco"). -

- -

- O aplicativo Diaum é uma solução de hardware e software que desabilita recursos que - distraem do smartphone do usuário (o "aplicativo Diaum"). -

- -

- Ao usar o aplicativo Diaum, você concorda em ficar vinculado a estes Termos. Se você - estiver usando os Serviços em nome de uma organização, você está concordando com estes - Termos para essa organização e prometendo que tem autoridade para vincular essa - organização a estes termos. Ao concordar com estes Termos, você está nos representando que - tem mais de 13 anos de idade. -

- -

- Você pode usar os Serviços apenas em conformidade com estes Termos e apenas se tiver o - poder de formar um contrato conosco e não for impedido sob quaisquer leis aplicáveis de - fazê-lo. -

- -

- SE VOCÊ NÃO CONCORDAR EM FICAR VINCULADO A ESTES TERMOS, -

- -

- VOCÊ NÃO DEVE USAR O SERVIÇO. -

- -

1. TAXAS

-

- Cobramos uma taxa pelo aplicativo Diaum. Reservamo-nos o direito, a nosso exclusivo - critério, de alterar as Taxas a qualquer momento conforme considerarmos apropriado. -

- -

2. ALTERAÇÕES NO SERVIÇO

-

- Podemos modificar estes termos ou quaisquer termos adicionais que se apliquem ao Serviço. - Você deve verificar os termos regularmente. Se você não concordar com os termos - modificados para um Serviço, você deve descontinuar o uso desse Serviço. -

- -

3. ACESSO AOS SERVIÇOS

-

- Apenas você pode usar os Serviços. Você deve manter sua conta e senhas confidenciais e não - autorizar terceiros a acessar ou usar o Serviço em seu nome. É sua responsabilidade nos - contatar imediatamente se sua conta for hackeada, comprometida ou mal utilizada de outra - forma. Você é responsável por todas as atividades que ocorrem com sua conta. Não seremos - responsáveis por qualquer perda ou dano decorrente de qualquer uso não autorizado de suas - contas. -

-

- Se um terceiro, como um empregador, lhe deu sua conta, essa parte tem direitos sobre sua - conta e pode: gerenciar sua conta, redefinir sua senha, ou suspender ou cancelar sua - conta; visualizar os dados de uso e perfil de sua conta, incluindo como e quando sua conta - é usada; e ler ou armazenar conteúdo em sua conta. -

- -

4. CONSENTIMENTO PARA COMUNICAÇÕES ELETRÔNICAS E SOLICITAÇÃO

-

- Ao se registrar conosco, você entende que podemos enviar comunicações ou dados sobre os - Serviços, incluindo mas não limitado a (a) avisos sobre seu uso dos Serviços, e (b) - informações promocionais e materiais sobre nossos produtos e serviços, via correio - eletrônico. Damos a você a oportunidade de optar por não receber tais correios eletrônicos - não obrigatórios de nós seguindo as instruções de cancelamento fornecidas na mensagem. -

-

- Também podemos enviar a você, em formato eletrônico, avisos obrigatórios sobre o Serviço e - informações que a lei nos obriga a fornecer. Podemos fornecer informações obrigatórias ou - exigidas a você por email no endereço que você especificou quando se inscreveu no Serviço. - Avisos obrigatórios ou exigidos enviados por email serão considerados dados e recebidos - quando o email for enviado. Você não pode optar por não receber avisos obrigatórios ou - exigidos. Se você não consentir em receber avisos obrigatórios ou exigidos - eletronicamente, deve parar de usar o Serviço. -

- -

5. PAGAMENTOS E REEMBOLSOS

-

- Você deve estar autorizado a usar o método de pagamento que inserir quando criar uma conta - de cobrança. Você nos autoriza a cobrar de você pelo Serviço usando seu método de - pagamento e por qualquer recurso pago do Serviço que você escolher se inscrever ou usar - enquanto estes Termos estiverem em vigor. Podemos iniciar pagamentos (a) antecipadamente; - (b) no momento da compra; (c) logo após a compra; ou (d) de forma recorrente para Serviços - de assinatura. -

- -

6. ISENÇÃO DE GARANTIA E LIMITAÇÃO DE RESPONSABILIDADE

-

- O APLICATIVO DIAUM É FORNECIDO "COMO ESTÁ", POR SUA PRÓPRIA CONTA E RISCO, SEM GARANTIA OU - CONDIÇÃO EXPRESSA OU IMPLÍCITA DE QUALQUER TIPO. TAMBÉM RENUNCIAMOS A QUAISQUER GARANTIAS - DE COMERCIALIZAÇÃO, ADEQUAÇÃO PARA UM PROPÓSITO PARTICULAR OU NÃO VIOLAÇÃO. -

-

- NÃO SOMOS RESPONSÁVEIS POR QUALQUER DANO OU PERDA DE DADOS QUE POSSA RESULTAR DO USO DO - APLICATIVO DIAUM. RENUNCIAMOS AINDA A QUALQUER GARANTIA DE QUE O CONTEÚDO SERÁ ENTREGUE - LIVRE DE FALHA TÉCNICA OU DEFEITO OU QUE MONITORAREMOS OU GERENCIAREMOS QUAISQUER DIREITOS - ASSOCIADOS A QUALQUER CONTEÚDO. -

-

- EM NENHUM EVENTO SEREMOS NÓS OU NOSSOS PARCEIROS RESPONSÁVEIS POR QUAISQUER DANOS GERAIS, - DIRETOS, INCIDENTAIS, INDIRETOS, ESPECIAIS, PUNITIVOS OU CONSEQUENCIAIS EM CONEXÃO COM OU - DECORRENTES DESTE ACORDO, INCLUINDO MAS NÃO LIMITADO A QUALQUER PERDA DE OPORTUNIDADE, - NEGÓCIOS, LUCRO, RECEITA OU ROYALTIES, INDEPENDENTEMENTE DA CAUSA E SE DECORRENTE DE - CONTRATO, DELITO, NEGLIGÊNCIA, VIOLAÇÃO OU OUTRA TEORIA DE RESPONSABILIDADE, MESMO QUE NÓS - OU NOSSOS PARCEIROS TENHAMOS SIDO AVISADOS DA POSSIBILIDADE DE TAL DANO. -

- -

7. ESCOLHA DA LEI, JURISDIÇÃO E FORO, E LIMITAÇÕES

-

- Este Acordo e sua validade serão regidos e interpretados de acordo com as leis - substantivas do estado de Wisconsin, EUA, excluindo seus princípios de conflitos de leis. - Qualquer controvérsia ou reivindicação decorrente ou relacionada a este Acordo, ou - violação do mesmo, será finalmente resolvida por arbitragem administrada pela Associação - Americana de Arbitragem de acordo com suas Regras de Arbitragem Comercial, e o julgamento - sobre a decisão proferida pelo(s) árbitro(s) pode ser registrado em qualquer tribunal com - jurisdição sobre o mesmo. A sede da arbitragem será a cidade de Madison, Wisconsin, EUA. -

- -

8. ACORDO INTEGRAL

-

- Estes Termos (incluindo a Política de Privacidade) constituem o acordo integral e - exclusivo entre você e nós com relação ao Serviço, e substituem e substituem quaisquer - outros acordos, termos e condições aplicáveis ao Serviço. Estes Termos não criam direitos - de terceiros beneficiários. Nossa falha em fazer cumprir uma disposição não é uma renúncia - ao nosso direito de fazê-lo posteriormente. -

- -

9. DIVISIBILIDADE

-

- Se uma disposição dos Termos for considerada inexequível, as disposições restantes dos - Termos permanecerão em pleno efeito e um termo executável será substituído refletindo - nossa intenção o mais próximo possível. -

- -

10. LIBERAÇÃO E COMPROMISSO DE NÃO PROCESSAR

-

- Na medida máxima permitida por lei, você libera e se compromete a não processar nós, - nossos parceiros, nossas empresas afiliadas, e nossos respectivos diretores, agentes, - joint ventures, funcionários, representantes legais e fornecedores de todas e quaisquer - reivindicações, demandas e danos (reais e consequenciais) de todo tipo e natureza, - conhecidos e desconhecidos, suspeitos e não suspeitos, divulgados e não divulgados, - decorrentes ou de qualquer forma conectados com disputas entre você e um organizador de - evento. Ao entrar nesta liberação, você expressamente renuncia a quaisquer proteções - (sejam estatutárias ou outras) que de outra forma limitariam a cobertura desta liberação - para incluir apenas aquelas reivindicações que você pode conhecer ou suspeitar que existam - em seu favor no momento de concordar com esta liberação. -

- -

11. INDENIZAÇÃO

-

- Você concorda em nos indenizar e manter nossas subsidiárias, afiliadas e seus respectivos - diretores, advogados, agentes, funcionários, licenciadores e fornecedores (os - "Indenizados") isentos de qualquer reivindicação ou demanda e todas as responsabilidades, - custos e despesas (incluindo honorários advocatícios razoáveis) incorridos por nós e (se - aplicável) qualquer Indenizado resultante de ou decorrente de sua violação de qualquer - lei, violação de qualquer representação ou garantia neste acordo, ou violação dos direitos - de terceiros, incluindo direitos de propriedade intelectual. -

- -

12. PROPRIEDADE INTELECTUAL

-

- Todas as marcas registradas, direitos autorais, software, conteúdo, know-how, tecnologia - proprietária e informações, boa vontade e outras propriedades intelectuais criadas, - desenvolvidas ou licenciadas por nós são nossa propriedade intelectual exclusiva. Nada - aqui criará qualquer cessão ou licença de nossa propriedade intelectual para você ou - qualquer terceiro. -

- -

Data de vigência: 10 de outubro de 2025

-
- - ) -} From 728f1db81383480e3179a4a47a7597330f734570 Mon Sep 17 00:00:00 2001 From: silvavini9 Date: Sat, 11 Oct 2025 02:08:20 -0400 Subject: [PATCH 03/19] feat: internalizacao do hero component feita --- src/app/layout.tsx | 41 +++++++++++++++++++++++++++------------ src/components/Header.tsx | 2 +- src/components/Hero.tsx | 10 ++++++---- src/data/hero.ts | 6 ------ src/locales/en.json | 6 +++++- src/locales/pt-br.json | 6 +++++- 6 files changed, 46 insertions(+), 25 deletions(-) delete mode 100644 src/data/hero.ts diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 8d2b628..d025e3c 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -7,6 +7,8 @@ import Footer from '@/components/Footer' import { siteDetails } from '@/data/siteDetails' import './globals.css' +import { Locale } from '@/locales' +import { NextIntlClientProvider, useMessages } from 'next-intl' const manrope = Manrope({ subsets: ['latin'] }) const sourceSans = Source_Sans_3({ subsets: ['latin'] }) @@ -14,14 +16,22 @@ const sourceSans = Source_Sans_3({ subsets: ['latin'] }) export const metadata: Metadata = { title: siteDetails.metadata.title, description: siteDetails.metadata.description, - keywords: [`${siteDetails.siteName}`, 'app', 'bloqueio', 'conteúdo', 'pornografia', 'hábitos', 'foco', 'controle', 'vida'], + keywords: [ + `${siteDetails.siteName}`, + 'app', + 'bloqueio', + 'conteúdo', + 'pornografia', + 'hábitos', + 'foco', + 'controle', + 'vida', + ], authors: [{ name: siteDetails.siteName }], creator: siteDetails.siteName, publisher: siteDetails.siteName, icons: { - icon: [ - { url: '/favicon.ico', sizes: 'any' }, - ], + icon: [{ url: '/favicon.ico', sizes: 'any' }], }, robots: { index: true, @@ -61,18 +71,25 @@ export const metadata: Metadata = { }, } -export default function RootLayout({ - children, -}: Readonly<{ +interface RootLayoutProps { children: React.ReactNode -}>) { + params: { + locale: Locale + } +} + +export default function RootLayout({ children, params: { locale } }: Readonly) { + const messages = useMessages() + return ( - + {siteDetails.googleAnalyticsId && } -
-
{children}
-
+ +
+
{children}
+
+ ) diff --git a/src/components/Header.tsx b/src/components/Header.tsx index 8a571d8..f4ae862 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -25,7 +25,7 @@ const Header: React.FC = () => { {siteDetails.siteName} diff --git a/src/components/Hero.tsx b/src/components/Hero.tsx index c07f5d6..991ef6b 100644 --- a/src/components/Hero.tsx +++ b/src/components/Hero.tsx @@ -4,9 +4,11 @@ import Image from 'next/image' import AppStoreButton from './AppStoreButton' import PlayStoreButton from './PlayStoreButton' -import { heroDetails } from '@/data/hero' +import { useTranslations } from 'next-intl' const Hero: React.FC = () => { + const translation = useTranslations('HomePage.HeroComponent') + return (
{

- {heroDetails.heading} + {translation('heading')}

-

{heroDetails.subheading}

+

{translation('subheading')}

Date: Sat, 11 Oct 2025 02:10:49 -0400 Subject: [PATCH 04/19] refactor: utiliza camel case corretamente --- src/components/Hero.tsx | 2 +- src/locales/en.json | 4 ++-- src/locales/pt-br.json | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/Hero.tsx b/src/components/Hero.tsx index 991ef6b..fd1b31c 100644 --- a/src/components/Hero.tsx +++ b/src/components/Hero.tsx @@ -7,7 +7,7 @@ import PlayStoreButton from './PlayStoreButton' import { useTranslations } from 'next-intl' const Hero: React.FC = () => { - const translation = useTranslations('HomePage.HeroComponent') + const translation = useTranslations('homePage.heroComponent') return (
Date: Sat, 11 Oct 2025 02:26:03 -0400 Subject: [PATCH 05/19] feat: internacionalizacao do header --- src/components/Header.tsx | 8 +++++--- src/data/menuItems.ts | 32 +++++++++++++++++--------------- src/locales/en.json | 13 +++++++++++++ src/locales/pt-br.json | 13 +++++++++++++ src/types.ts | 2 ++ 5 files changed, 50 insertions(+), 18 deletions(-) diff --git a/src/components/Header.tsx b/src/components/Header.tsx index f4ae862..c075705 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -5,12 +5,14 @@ import React, { useState } from 'react' import { Transition } from '@headlessui/react' import { HiOutlineXMark, HiBars3 } from 'react-icons/hi2' import Container from './Container' -import { siteDetails } from '@/data/siteDetails' -import { menuItems } from '@/data/menuItems' +import { getMenuItems } from '@/data/menuItems' import Image from 'next/image' +import { useTranslations } from 'next-intl' const Header: React.FC = () => { const [isOpen, setIsOpen] = useState(false) + const translation = useTranslations('header') + const menuItems = getMenuItems(translation) const toggleMenu = () => { setIsOpen(!isOpen) @@ -26,7 +28,7 @@ const Header: React.FC = () => { width="40" height="40" src="/images/diaum-logo.png" - alt={siteDetails.siteName} + alt={translation('siteName')} className="h-10 w-auto" /> diff --git a/src/data/menuItems.ts b/src/data/menuItems.ts index 1201697..d5baf48 100644 --- a/src/data/menuItems.ts +++ b/src/data/menuItems.ts @@ -1,16 +1,18 @@ -import { IMenuItem } from '@/types' +import { IMenuItem, TTranslateFunction } from '@/types' -export const menuItems: IMenuItem[] = [ - { - text: 'Features', - url: '#features', - }, - { - text: 'Pricing', - url: '#pricing', - }, - { - text: 'Testimonials', - url: '#testimonials', - }, -] +export function getMenuItems(t: TTranslateFunction): IMenuItem[] { + return [ + { + text: t('features'), + url: '#features', + }, + { + text: t('pricing'), + url: '#pricing', + }, + { + text: t('testimonials'), + url: '#testimonials', + }, + ] +} diff --git a/src/locales/en.json b/src/locales/en.json index 5d31087..f61fe02 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -1,4 +1,17 @@ { + "globals": { + "siteName": "diaum", + "siteUrl": "https://diaum.app/", + "metadata": { + "title": "diaum - Content Blocking App | Free, Focused, and in Control of Your Life", + "description": "Transform your habits with diaum - the app that blocks pornography and inappropriate content. Be free, focused, and in control of your life from Day One. Free download!" + } + }, + "header": { + "features": "Features", + "pricing": "Pricing", + "testimonials": "Testimonials" + }, "homePage": { "heroComponent": { "heading": "Free, focused, and in control of your life.", diff --git a/src/locales/pt-br.json b/src/locales/pt-br.json index 6b1d178..2c3fce0 100644 --- a/src/locales/pt-br.json +++ b/src/locales/pt-br.json @@ -1,4 +1,17 @@ { + "globals": { + "siteName": "diaum", + "siteUrl": "https://diaum.app/", + "metadata": { + "title": "diaum - App de Bloqueio de Conteúdo | Livre, Focado e no Controle da Sua Vida", + "description": "Transforme seus hábitos com o diaum - o app que bloqueia pornografia e conteúdo inadequado. Seja livre, focado e no controle da sua vida desde o Dia Um. Download gratuito!" + } + }, + "header": { + "features": "Features", + "pricing": "Preço", + "testimonials": "Testemunhos" + }, "homePage": { "heroComponent": { "heading": "Livre, Focado e no Controle da Sua Vida.", diff --git a/src/types.ts b/src/types.ts index d6850b3..12b759f 100644 --- a/src/types.ts +++ b/src/types.ts @@ -51,3 +51,5 @@ export interface ISocials { x?: string [key: string]: string | undefined } + +export type TTranslateFunction = (string: string) => string From 8b2d421eb86927a0d40899dcd332c38c88425c94 Mon Sep 17 00:00:00 2001 From: silvavini9 Date: Sat, 11 Oct 2025 03:05:47 -0400 Subject: [PATCH 06/19] feat: footer internacionalizado e correcoes em alguns dados --- src/components/Footer.tsx | 114 ++++++++++++++++++-------------------- src/components/Header.tsx | 3 +- src/data/footer.ts | 56 +++++++++---------- src/locales/en.json | 16 +++++- src/locales/pt-br.json | 18 +++++- src/types.ts | 8 +++ 6 files changed, 119 insertions(+), 96 deletions(-) diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx index 74ce2bc..5529ee0 100644 --- a/src/components/Footer.tsx +++ b/src/components/Footer.tsx @@ -1,43 +1,43 @@ -import Link from 'next/link'; -import Script from 'next/script'; -import React from 'react'; -import Image from 'next/image'; -import { FaEnvelope } from 'react-icons/fa'; - -import { siteDetails } from '@/data/siteDetails'; -import { footerDetails } from '@/data/footer'; -import { getPlatformIconByName } from '@/utils'; +import Link from 'next/link' +import Script from 'next/script' +import React from 'react' +import Image from 'next/image' +import { FaEnvelope } from 'react-icons/fa' + +import { siteDetails } from '@/data/siteDetails' +import { getFooterDetails } from '@/data/footer' +import { getPlatformIconByName } from '@/utils' +import { useTranslations } from 'next-intl' +import { IFooterDetails } from '@/types' type ContactPointLD = { - '@type': 'ContactPoint'; - email?: string; - telephone?: string; - contactType: 'customer support' | string; -}; + '@type': 'ContactPoint' + email?: string + telephone?: string + contactType: 'customer support' | string +} type OrganizationLD = { - '@context': 'https://schema.org'; - '@type': 'Organization'; - name: string; - url: string; - logo?: string; - sameAs?: string[]; - contactPoint?: ContactPointLD[]; -}; - -function buildOrganizationJsonLd(): string { - const sameAs = Object.values(footerDetails.socials ?? {}).filter( - (v): v is string => Boolean(v) - ); - - const contactPoint: ContactPointLD[] = []; + '@context': 'https://schema.org' + '@type': 'Organization' + name: string + url: string + logo?: string + sameAs?: string[] + contactPoint?: ContactPointLD[] +} + +function buildOrganizationJsonLd(footerDetails: IFooterDetails): string { + const sameAs = Object.values(footerDetails.socials ?? {}).filter((v): v is string => Boolean(v)) + + const contactPoint: ContactPointLD[] = [] if (footerDetails.email) { contactPoint.push({ '@type': 'ContactPoint', email: footerDetails.email, contactType: 'customer support', - }); + }) } if (footerDetails.telephone) { @@ -45,7 +45,7 @@ function buildOrganizationJsonLd(): string { '@type': 'ContactPoint', telephone: footerDetails.telephone, contactType: 'customer support', - }); + }) } const org: OrganizationLD = { @@ -56,12 +56,15 @@ function buildOrganizationJsonLd(): string { logo: siteDetails.logoUrl, sameAs: sameAs.length ? sameAs : undefined, contactPoint: contactPoint.length ? contactPoint : undefined, - }; + } - return JSON.stringify(org); + return JSON.stringify(org) } const Footer: React.FC = () => { + const translations = useTranslations('footer') + const footerDetails = getFooterDetails(translations) + return (
{ />
@@ -93,32 +96,24 @@ const Footer: React.FC = () => { {siteDetails.siteName} -

- {footerDetails.subheading} -

+

{footerDetails.subheading}

@@ -194,12 +186,12 @@ const Footer: React.FC = () => {

- Copyright © {new Date().getFullYear()} {siteDetails.siteName}. Todos os - direitos reservados. + Copyright © {new Date().getFullYear()} {siteDetails.siteName}.{' '} + {translations('copyright')}

- ); -}; + ) +} -export default Footer; +export default Footer diff --git a/src/components/Header.tsx b/src/components/Header.tsx index c075705..cff6d62 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -8,6 +8,7 @@ import Container from './Container' import { getMenuItems } from '@/data/menuItems' import Image from 'next/image' import { useTranslations } from 'next-intl' +import { siteDetails } from '@/data/siteDetails' const Header: React.FC = () => { const [isOpen, setIsOpen] = useState(false) @@ -28,7 +29,7 @@ const Header: React.FC = () => { width="40" height="40" src="/images/diaum-logo.png" - alt={translation('siteName')} + alt={siteDetails.siteName} className="h-10 w-auto" /> diff --git a/src/data/footer.ts b/src/data/footer.ts index 4957f6e..12fd4bf 100644 --- a/src/data/footer.ts +++ b/src/data/footer.ts @@ -1,32 +1,28 @@ -import { IMenuItem, ISocials } from '@/types' +import { IFooterDetails, TTranslateFunction } from '@/types' -export const footerDetails: { - subheading: string - quickLinks: IMenuItem[] - email: string - telephone: string - socials: ISocials -} = { - subheading: 'Um app para bloqueio de conteudo adulto e criaçao de novos habitos.', - quickLinks: [ - { - text: 'Features', - url: '#features', +export function getFooterDetails(t: TTranslateFunction): IFooterDetails { + return { + subheading: t('subheading'), + quickLinks: [ + { + text: t('quickLinks.features'), + url: '#features', + }, + { + text: t('quickLinks.pricing'), + url: '#pricing', + }, + { + text: t('quickLinks.testimonials'), + url: '#testimonials', + }, + ], + email: 'contato@diaum.app', + telephone: '', + socials: { + github: 'https://github.com/Diaum', + linkedin: 'https://www.linkedin.com', + instagram: 'https://www.instagram.com/diaum.app', }, - { - text: 'Pricing', - url: '#pricing', - }, - { - text: 'Testimonials', - url: '#testimonials', - }, - ], - email: 'contato@diaum.app', - telephone: '', - socials: { - github: 'https://github.com/Diaum', - linkedin: 'https://www.linkedin.com', - instagram: 'https://www.instagram.com/diaum.app', - }, -} \ No newline at end of file + } +} diff --git a/src/locales/en.json b/src/locales/en.json index f61fe02..8d02be8 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -1,7 +1,5 @@ { "globals": { - "siteName": "diaum", - "siteUrl": "https://diaum.app/", "metadata": { "title": "diaum - Content Blocking App | Free, Focused, and in Control of Your Life", "description": "Transform your habits with diaum - the app that blocks pornography and inappropriate content. Be free, focused, and in control of your life from Day One. Free download!" @@ -18,5 +16,19 @@ "subheading": "An app to block content, transform your habits, and overcome pornography from Day One.", "centerImageSrc": "/images/hero-mockup.webp" } + }, + "footer": { + "subheading": "An app for blocking adult content and creating new habits.", + "quickLinks": { + "title": "Quick Links", + "features": "Features", + "pricing": "Pricing", + "testimonials": "Testimonials" + }, + "about": "About", + "privacyPolicy": "Privacy Policy", + "termsOfUse": "Terms Of Use", + "contact": "Contact", + "copyright": "All rights reserved." } } diff --git a/src/locales/pt-br.json b/src/locales/pt-br.json index 2c3fce0..288cce3 100644 --- a/src/locales/pt-br.json +++ b/src/locales/pt-br.json @@ -1,7 +1,5 @@ { "globals": { - "siteName": "diaum", - "siteUrl": "https://diaum.app/", "metadata": { "title": "diaum - App de Bloqueio de Conteúdo | Livre, Focado e no Controle da Sua Vida", "description": "Transforme seus hábitos com o diaum - o app que bloqueia pornografia e conteúdo inadequado. Seja livre, focado e no controle da sua vida desde o Dia Um. Download gratuito!" @@ -18,5 +16,21 @@ "subheading": "Um App para bloquear conteudos e transformar seus hábitos e vencendo a pornografia desde o Dia Um.", "centerImageSrc": "/images/hero-mockup.webp" } + }, + "footer": { + "subheading": "Um app para bloqueio de conteudo adulto e criaçao de novos habitos.", + "quickLinks": { + "title": "Links Rápidos", + "features": "Features", + "pricing": "Preço", + "testimonials": "Testemunhos" + }, + "about": "Sobre", + "privacyPolicy": "Política de Privacidade", + "termsOfUse": "Termos de Uso", + "contact": "Contato", + "sendEmail": "Enviar e-mail para {email}", + "callPhone": "Ligar para {phone}", + "copyright": "Todos os direitos reservados." } } diff --git a/src/types.ts b/src/types.ts index 12b759f..3c00dd0 100644 --- a/src/types.ts +++ b/src/types.ts @@ -53,3 +53,11 @@ export interface ISocials { } export type TTranslateFunction = (string: string) => string + +export interface IFooterDetails { + subheading: string + quickLinks: IMenuItem[] + email: string + telephone: string + socials: ISocials +} From 409a2fd907efc616111e9e81afee1c35cf5cb42e Mon Sep 17 00:00:00 2001 From: silvavini9 Date: Sat, 11 Oct 2025 12:17:26 -0400 Subject: [PATCH 07/19] refactor: removido internalizacao nao utilizada --- src/locales/pt-br.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/locales/pt-br.json b/src/locales/pt-br.json index 288cce3..8f0c8c9 100644 --- a/src/locales/pt-br.json +++ b/src/locales/pt-br.json @@ -29,8 +29,6 @@ "privacyPolicy": "Política de Privacidade", "termsOfUse": "Termos de Uso", "contact": "Contato", - "sendEmail": "Enviar e-mail para {email}", - "callPhone": "Ligar para {phone}", "copyright": "Todos os direitos reservados." } } From 14fb9c02dc0f4beee13d3640cd7992217ee103b4 Mon Sep 17 00:00:00 2001 From: silvavini9 Date: Sat, 11 Oct 2025 13:23:23 -0400 Subject: [PATCH 08/19] feat: internalizacao da pagina termos de servico --- src/app/[locale]/termos-de-servico/page.tsx | 207 +++++--------------- src/locales/en.json | 74 +++++++ src/locales/pt-br.json | 74 +++++++ 3 files changed, 197 insertions(+), 158 deletions(-) diff --git a/src/app/[locale]/termos-de-servico/page.tsx b/src/app/[locale]/termos-de-servico/page.tsx index 9ce1989..63cd36d 100644 --- a/src/app/[locale]/termos-de-servico/page.tsx +++ b/src/app/[locale]/termos-de-servico/page.tsx @@ -1,18 +1,25 @@ import type { Metadata } from 'next' import Container from '@/components/Container' - -export const metadata: Metadata = { - title: 'Termos de Serviço', - description: 'Termos de Serviço para o aplicativo Diaum.', +import { useTranslations } from 'next-intl' +import { getTranslations } from 'next-intl/server' + +export async function generateMetadata(): Promise { + const t = await getTranslations('termsOfService') + return { + title: t('title'), + description: t('description'), + } } export default function TermsOfServicePage() { + const translation = useTranslations('termsOfService') + return ( {/* LOGO E TÍTULO */}
- Termos de Serviço + {translation('title')}
{/* TERMOS ORIGINAIS */} @@ -22,185 +29,69 @@ export default function TermsOfServicePage() { prose-h2:mt-8 prose-h2:mb-2 prose-h2:text-lg prose-h2:font-bold prose-h2:text-slate-800 prose-strong:text-slate-900 prose-strong:font-bold" > -

Termos de Serviço

+

{translation('title')}

- ESTES TERMOS CRIAM UM CONTRATO VINCULATIVO. + {translation('content.firstParagraph')}

-

- Por favor, leia estes Termos de Serviço ("Termos") cuidadosamente porque eles formam um - contrato entre você e a Diaum app, nossos parceiros, funcionários, diretores, - patrocinadores e empresas afiliadas ("nós" e "conosco"). -

+

{translation('content.secondParagraph')}

-

- O aplicativo Diaum é uma solução de hardware e software que desabilita recursos que - distraem do smartphone do usuário (o "aplicativo Diaum"). -

+

{translation('content.thirdParagraph')}

-

- Ao usar o aplicativo Diaum, você concorda em ficar vinculado a estes Termos. Se você - estiver usando os Serviços em nome de uma organização, você está concordando com estes - Termos para essa organização e prometendo que tem autoridade para vincular essa - organização a estes termos. Ao concordar com estes Termos, você está nos representando que - tem mais de 13 anos de idade. -

+

{translation('content.fourthParagraph')}

-

- Você pode usar os Serviços apenas em conformidade com estes Termos e apenas se tiver o - poder de formar um contrato conosco e não for impedido sob quaisquer leis aplicáveis de - fazê-lo. -

+

{translation('content.fifthParagraph')}

- SE VOCÊ NÃO CONCORDAR EM FICAR VINCULADO A ESTES TERMOS, + {translation('content.sixthParagraph')}

- VOCÊ NÃO DEVE USAR O SERVIÇO. + {translation('content.seventhParagraph')}

-

1. TAXAS

-

- Cobramos uma taxa pelo aplicativo Diaum. Reservamo-nos o direito, a nosso exclusivo - critério, de alterar as Taxas a qualquer momento conforme considerarmos apropriado. -

+

{translation('content.sections.1.title')}

+

{translation('content.sections.1.text')}

-

2. ALTERAÇÕES NO SERVIÇO

-

- Podemos modificar estes termos ou quaisquer termos adicionais que se apliquem ao Serviço. - Você deve verificar os termos regularmente. Se você não concordar com os termos - modificados para um Serviço, você deve descontinuar o uso desse Serviço. -

+

{translation('content.sections.2.title')}

+

{translation('content.sections.2.text')}

-

3. ACESSO AOS SERVIÇOS

-

- Apenas você pode usar os Serviços. Você deve manter sua conta e senhas confidenciais e não - autorizar terceiros a acessar ou usar o Serviço em seu nome. É sua responsabilidade nos - contatar imediatamente se sua conta for hackeada, comprometida ou mal utilizada de outra - forma. Você é responsável por todas as atividades que ocorrem com sua conta. Não seremos - responsáveis por qualquer perda ou dano decorrente de qualquer uso não autorizado de suas - contas. -

-

- Se um terceiro, como um empregador, lhe deu sua conta, essa parte tem direitos sobre sua - conta e pode: gerenciar sua conta, redefinir sua senha, ou suspender ou cancelar sua - conta; visualizar os dados de uso e perfil de sua conta, incluindo como e quando sua conta - é usada; e ler ou armazenar conteúdo em sua conta. -

+

{translation('content.sections.3.title')}

+

{translation('content.sections.3.paragraphs.0')}

+

{translation('content.sections.3.paragraphs.1')}

-

4. CONSENTIMENTO PARA COMUNICAÇÕES ELETRÔNICAS E SOLICITAÇÃO

-

- Ao se registrar conosco, você entende que podemos enviar comunicações ou dados sobre os - Serviços, incluindo mas não limitado a (a) avisos sobre seu uso dos Serviços, e (b) - informações promocionais e materiais sobre nossos produtos e serviços, via correio - eletrônico. Damos a você a oportunidade de optar por não receber tais correios eletrônicos - não obrigatórios de nós seguindo as instruções de cancelamento fornecidas na mensagem. -

-

- Também podemos enviar a você, em formato eletrônico, avisos obrigatórios sobre o Serviço e - informações que a lei nos obriga a fornecer. Podemos fornecer informações obrigatórias ou - exigidas a você por email no endereço que você especificou quando se inscreveu no Serviço. - Avisos obrigatórios ou exigidos enviados por email serão considerados dados e recebidos - quando o email for enviado. Você não pode optar por não receber avisos obrigatórios ou - exigidos. Se você não consentir em receber avisos obrigatórios ou exigidos - eletronicamente, deve parar de usar o Serviço. -

+

{translation('content.sections.4.title')}

+

{translation('content.sections.4.paragraphs.0')}

+

{translation('content.sections.4.paragraphs.1')}

-

5. PAGAMENTOS E REEMBOLSOS

-

- Você deve estar autorizado a usar o método de pagamento que inserir quando criar uma conta - de cobrança. Você nos autoriza a cobrar de você pelo Serviço usando seu método de - pagamento e por qualquer recurso pago do Serviço que você escolher se inscrever ou usar - enquanto estes Termos estiverem em vigor. Podemos iniciar pagamentos (a) antecipadamente; - (b) no momento da compra; (c) logo após a compra; ou (d) de forma recorrente para Serviços - de assinatura. -

+

{translation('content.sections.5.title')}

+

{translation('content.sections.5.text')}

-

6. ISENÇÃO DE GARANTIA E LIMITAÇÃO DE RESPONSABILIDADE

-

- O APLICATIVO DIAUM É FORNECIDO "COMO ESTÁ", POR SUA PRÓPRIA CONTA E RISCO, SEM GARANTIA OU - CONDIÇÃO EXPRESSA OU IMPLÍCITA DE QUALQUER TIPO. TAMBÉM RENUNCIAMOS A QUAISQUER GARANTIAS - DE COMERCIALIZAÇÃO, ADEQUAÇÃO PARA UM PROPÓSITO PARTICULAR OU NÃO VIOLAÇÃO. -

-

- NÃO SOMOS RESPONSÁVEIS POR QUALQUER DANO OU PERDA DE DADOS QUE POSSA RESULTAR DO USO DO - APLICATIVO DIAUM. RENUNCIAMOS AINDA A QUALQUER GARANTIA DE QUE O CONTEÚDO SERÁ ENTREGUE - LIVRE DE FALHA TÉCNICA OU DEFEITO OU QUE MONITORAREMOS OU GERENCIAREMOS QUAISQUER DIREITOS - ASSOCIADOS A QUALQUER CONTEÚDO. -

-

- EM NENHUM EVENTO SEREMOS NÓS OU NOSSOS PARCEIROS RESPONSÁVEIS POR QUAISQUER DANOS GERAIS, - DIRETOS, INCIDENTAIS, INDIRETOS, ESPECIAIS, PUNITIVOS OU CONSEQUENCIAIS EM CONEXÃO COM OU - DECORRENTES DESTE ACORDO, INCLUINDO MAS NÃO LIMITADO A QUALQUER PERDA DE OPORTUNIDADE, - NEGÓCIOS, LUCRO, RECEITA OU ROYALTIES, INDEPENDENTEMENTE DA CAUSA E SE DECORRENTE DE - CONTRATO, DELITO, NEGLIGÊNCIA, VIOLAÇÃO OU OUTRA TEORIA DE RESPONSABILIDADE, MESMO QUE NÓS - OU NOSSOS PARCEIROS TENHAMOS SIDO AVISADOS DA POSSIBILIDADE DE TAL DANO. -

+

{translation('content.sections.6.title')}

+

{translation('content.sections.6.paragraphs.0')}

+

{translation('content.sections.6.paragraphs.1')}

+

{translation('content.sections.6.paragraphs.2')}

-

7. ESCOLHA DA LEI, JURISDIÇÃO E FORO, E LIMITAÇÕES

-

- Este Acordo e sua validade serão regidos e interpretados de acordo com as leis - substantivas do estado de Wisconsin, EUA, excluindo seus princípios de conflitos de leis. - Qualquer controvérsia ou reivindicação decorrente ou relacionada a este Acordo, ou - violação do mesmo, será finalmente resolvida por arbitragem administrada pela Associação - Americana de Arbitragem de acordo com suas Regras de Arbitragem Comercial, e o julgamento - sobre a decisão proferida pelo(s) árbitro(s) pode ser registrado em qualquer tribunal com - jurisdição sobre o mesmo. A sede da arbitragem será a cidade de Madison, Wisconsin, EUA. -

+

{translation('content.sections.7.title')}

+

{translation('content.sections.7.text')}

-

8. ACORDO INTEGRAL

-

- Estes Termos (incluindo a Política de Privacidade) constituem o acordo integral e - exclusivo entre você e nós com relação ao Serviço, e substituem e substituem quaisquer - outros acordos, termos e condições aplicáveis ao Serviço. Estes Termos não criam direitos - de terceiros beneficiários. Nossa falha em fazer cumprir uma disposição não é uma renúncia - ao nosso direito de fazê-lo posteriormente. -

+

{translation('content.sections.8.title')}

+

{translation('content.sections.8.text')}

-

9. DIVISIBILIDADE

-

- Se uma disposição dos Termos for considerada inexequível, as disposições restantes dos - Termos permanecerão em pleno efeito e um termo executável será substituído refletindo - nossa intenção o mais próximo possível. -

+

{translation('content.sections.9.title')}

+

{translation('content.sections.9.text')}

-

10. LIBERAÇÃO E COMPROMISSO DE NÃO PROCESSAR

-

- Na medida máxima permitida por lei, você libera e se compromete a não processar nós, - nossos parceiros, nossas empresas afiliadas, e nossos respectivos diretores, agentes, - joint ventures, funcionários, representantes legais e fornecedores de todas e quaisquer - reivindicações, demandas e danos (reais e consequenciais) de todo tipo e natureza, - conhecidos e desconhecidos, suspeitos e não suspeitos, divulgados e não divulgados, - decorrentes ou de qualquer forma conectados com disputas entre você e um organizador de - evento. Ao entrar nesta liberação, você expressamente renuncia a quaisquer proteções - (sejam estatutárias ou outras) que de outra forma limitariam a cobertura desta liberação - para incluir apenas aquelas reivindicações que você pode conhecer ou suspeitar que existam - em seu favor no momento de concordar com esta liberação. -

+

{translation('content.sections.10.title')}

+

{translation('content.sections.10.text')}

-

11. INDENIZAÇÃO

-

- Você concorda em nos indenizar e manter nossas subsidiárias, afiliadas e seus respectivos - diretores, advogados, agentes, funcionários, licenciadores e fornecedores (os - "Indenizados") isentos de qualquer reivindicação ou demanda e todas as responsabilidades, - custos e despesas (incluindo honorários advocatícios razoáveis) incorridos por nós e (se - aplicável) qualquer Indenizado resultante de ou decorrente de sua violação de qualquer - lei, violação de qualquer representação ou garantia neste acordo, ou violação dos direitos - de terceiros, incluindo direitos de propriedade intelectual. -

+

{translation('content.sections.11.title')}

+

{translation('content.sections.11.text')}

-

12. PROPRIEDADE INTELECTUAL

-

- Todas as marcas registradas, direitos autorais, software, conteúdo, know-how, tecnologia - proprietária e informações, boa vontade e outras propriedades intelectuais criadas, - desenvolvidas ou licenciadas por nós são nossa propriedade intelectual exclusiva. Nada - aqui criará qualquer cessão ou licença de nossa propriedade intelectual para você ou - qualquer terceiro. -

+

{translation('content.sections.12.title')}

+

{translation('content.sections.12.text')}

-

Data de vigência: 10 de outubro de 2025

+

{translation('content.effectiveDate')}

) diff --git a/src/locales/en.json b/src/locales/en.json index 8d02be8..0cba7b8 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -17,6 +17,80 @@ "centerImageSrc": "/images/hero-mockup.webp" } }, + "termsOfService": { + "title": "Terms of Service", + "description": "Terms of Service for the Diaum app.", + "content": { + "firstParagraph": "THESE TERMS CREATE A BINDING CONTRACT.", + "secondParagraph": "Please read these Terms of Service (\"Terms\") carefully because they form a contract between you and Diaum app, our partners, employees, directors, sponsors, and affiliated companies (\"we\" and \"us\").", + "thirdParagraph": "The Diaum app is a hardware and software solution that disables features that distract users from their smartphones (the \"Diaum app\").", + "fourthParagraph": "By using the Diaum app, you agree to be bound by these Terms. If you are using the Services on behalf of an organization, you agree to these Terms for that organization and represent that you have the authority to bind that organization to these terms. By agreeing to these Terms, you represent that you are over 13 years of age.", + "fifthParagraph": "You may use the Services only in accordance with these Terms and only if you have the power to form a contract with us and are not barred under any applicable laws from doing so.", + "sixthParagraph": "IF YOU DO NOT AGREE TO BE BOUND BY THESE TERMS,", + "seventhParagraph": "YOU MUST NOT USE THE SERVICE.", + "sections": { + "1": { + "title": "1. FEES", + "text": "We charge a fee for the Diaum app. We reserve the right, at our sole discretion, to change the Fees at any time as we deem appropriate." + }, + "2": { + "title": "2. CHANGES TO THE SERVICE", + "text": "We may modify these terms or any additional terms that apply to the Service. You should check the terms regularly. If you do not agree to the modified terms for a Service, you should discontinue using that Service." + }, + "3": { + "title": "3. ACCESS TO SERVICES", + "paragraphs": [ + "Only you may use the Services. You must keep your account and passwords confidential and not authorize third parties to access or use the Service on your behalf. It is your responsibility to contact us immediately if your account is hacked, compromised, or otherwise misused. You are responsible for all activities that occur under your account. We will not be liable for any loss or damage arising from any unauthorized use of your accounts.", + "If a third party, such as an employer, provided you with your account, that party has rights over your account and may: manage your account, reset your password, or suspend or terminate your account; view your account usage and profile data, including how and when your account is used; and read or store content in your account." + ] + }, + "4": { + "title": "4. CONSENT TO ELECTRONIC COMMUNICATIONS AND SOLICITATION", + "paragraphs": [ + "By registering with us, you understand that we may send communications or data regarding the Services, including but not limited to (a) notices about your use of the Services, and (b) promotional information and materials about our products and services via email. We give you the opportunity to opt out of receiving such non-mandatory emails from us by following the unsubscribe instructions provided in the message.", + "We may also send you, in electronic format, mandatory notices about the Service and information that we are required by law to provide. We may send required or mandatory information to you by email at the address you specified when signing up for the Service. Required or mandatory notices sent by email will be deemed given and received when the email is sent. You cannot opt out of receiving required or mandatory notices. If you do not consent to receive required or mandatory notices electronically, you must stop using the Service." + ] + }, + "5": { + "title": "5. PAYMENTS AND REFUNDS", + "text": "You must be authorized to use the payment method you enter when creating a billing account. You authorize us to charge you for the Service using your payment method and for any paid feature of the Service you choose to subscribe to or use while these Terms are in effect. We may initiate payments (a) in advance; (b) at the time of purchase; (c) shortly after purchase; or (d) on a recurring basis for subscription Services." + }, + "6": { + "title": "6. WARRANTY DISCLAIMER AND LIMITATION OF LIABILITY", + "paragraphs": [ + "THE DIAUM APP IS PROVIDED \"AS IS\", AT YOUR OWN RISK, WITHOUT ANY EXPRESS OR IMPLIED WARRANTY OR CONDITION OF ANY KIND. WE ALSO DISCLAIM ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.", + "WE ARE NOT RESPONSIBLE FOR ANY DAMAGE OR DATA LOSS THAT MAY RESULT FROM THE USE OF THE DIAUM APP. WE FURTHER DISCLAIM ANY WARRANTY THAT THE CONTENT WILL BE DELIVERED FREE OF TECHNICAL FAILURE OR DEFECT OR THAT WE WILL MONITOR OR MANAGE ANY RIGHTS ASSOCIATED WITH ANY CONTENT.", + "IN NO EVENT SHALL WE OR OUR PARTNERS BE LIABLE FOR ANY GENERAL, DIRECT, INCIDENTAL, INDIRECT, SPECIAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES IN CONNECTION WITH OR ARISING OUT OF THIS AGREEMENT, INCLUDING BUT NOT LIMITED TO ANY LOSS OF OPPORTUNITY, BUSINESS, PROFIT, REVENUE, OR ROYALTIES, REGARDLESS OF THE CAUSE AND WHETHER ARISING FROM CONTRACT, TORT, NEGLIGENCE, BREACH, OR OTHER THEORY OF LIABILITY, EVEN IF WE OR OUR PARTNERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." + ] + }, + "7": { + "title": "7. GOVERNING LAW, JURISDICTION, AND VENUE, AND LIMITATIONS", + "text": "This Agreement and its validity shall be governed by and construed in accordance with the substantive laws of the State of Wisconsin, USA, excluding its conflict of laws principles. Any dispute or claim arising out of or related to this Agreement, or its breach, shall be finally settled by arbitration administered by the American Arbitration Association in accordance with its Commercial Arbitration Rules, and judgment on the award rendered by the arbitrator(s) may be entered in any court having jurisdiction thereof. The seat of arbitration shall be the city of Madison, Wisconsin, USA." + }, + "8": { + "title": "8. ENTIRE AGREEMENT", + "text": "These Terms (including the Privacy Policy) constitute the entire and exclusive agreement between you and us regarding the Service and supersede and replace any other agreements, terms, and conditions applicable to the Service. These Terms do not create any third-party beneficiary rights. Our failure to enforce a provision is not a waiver of our right to do so later." + }, + "9": { + "title": "9. SEVERABILITY", + "text": "If any provision of the Terms is found unenforceable, the remaining provisions of the Terms will remain in full effect, and an enforceable term will be substituted reflecting our intent as closely as possible." + }, + "10": { + "title": "10. RELEASE AND COVENANT NOT TO SUE", + "text": "To the maximum extent permitted by law, you release and agree not to sue us, our partners, our affiliated companies, and our respective directors, agents, joint ventures, employees, legal representatives, and suppliers from any and all claims, demands, and damages (actual and consequential) of every kind and nature, known and unknown, suspected and unsuspected, disclosed and undisclosed, arising out of or in any way connected with disputes between you and an event organizer. By entering into this release, you expressly waive any protections (whether statutory or otherwise) that would otherwise limit the scope of this release to include only those claims that you may know or suspect exist in your favor at the time of agreeing to this release." + }, + "11": { + "title": "11. INDEMNIFICATION", + "text": "You agree to indemnify and hold us, our subsidiaries, affiliates, and their respective directors, attorneys, agents, employees, licensors, and suppliers (the “Indemnified Parties”) harmless from any claim or demand and all liabilities, costs, and expenses (including reasonable attorney fees) incurred by us and (if applicable) any Indemnified Party resulting from or arising out of your violation of any law, breach of any representation or warranty in this agreement, or violation of third-party rights, including intellectual property rights." + }, + "12": { + "title": "12. INTELLECTUAL PROPERTY", + "text": "All trademarks, copyrights, software, content, know-how, proprietary technology and information, goodwill, and other intellectual property created, developed, or licensed by us are our exclusive intellectual property. Nothing herein shall create any assignment or license of our intellectual property to you or any third party." + } + }, + "effectiveDate": "Effective date: October 10, 2025" + } + }, "footer": { "subheading": "An app for blocking adult content and creating new habits.", "quickLinks": { diff --git a/src/locales/pt-br.json b/src/locales/pt-br.json index 8f0c8c9..8a87636 100644 --- a/src/locales/pt-br.json +++ b/src/locales/pt-br.json @@ -17,6 +17,80 @@ "centerImageSrc": "/images/hero-mockup.webp" } }, + "termsOfService": { + "title": "Termos de Serviço", + "description": "Termos de Serviço para o aplicativo Diaum.", + "content": { + "firstParagraph": "ESTES TERMOS CRIAM UM CONTRATO VINCULATIVO.", + "secondParagraph": "Por favor, leia estes Termos de Serviço (\"Termos\") cuidadosamente porque eles formam um contrato entre você e a Diaum app, nossos parceiros, funcionários, diretores, patrocinadores e empresas afiliadas (\"nós\" e \"conosco\").", + "thirdParagraph": "O aplicativo Diaum é uma solução de hardware e software que desabilita recursos que distraem do smartphone do usuário (o \"aplicativo Diaum\").", + "fourthParagraph": "Ao usar o aplicativo Diaum, você concorda em ficar vinculado a estes Termos. Se você estiver usando os Serviços em nome de uma organização, você está concordando com estes Termos para essa organização e prometendo que tem autoridade para vincular essa organização a estes termos. Ao concordar com estes Termos, você está nos representando que tem mais de 13 anos de idade.", + "fifthParagraph": "Você pode usar os Serviços apenas em conformidade com estes Termos e apenas se tiver o poder de formar um contrato conosco e não for impedido sob quaisquer leis aplicáveis de fazê-lo.", + "sixthParagraph": "SE VOCÊ NÃO CONCORDAR EM FICAR VINCULADO A ESTES TERMOS,", + "seventhParagraph": "VOCÊ NÃO DEVE USAR O SERVIÇO.", + "sections": { + "1": { + "title": "1. TAXAS", + "text": "Cobramos uma taxa pelo aplicativo Diaum. Reservamo-nos o direito, a nosso exclusivo critério, de alterar as Taxas a qualquer momento conforme considerarmos apropriado." + }, + "2": { + "title": "2. ALTERAÇÕES NO SERVIÇO", + "text": "Podemos modificar estes termos ou quaisquer termos adicionais que se apliquem ao Serviço. Você deve verificar os termos regularmente. Se você não concordar com os termos modificados para um Serviço, você deve descontinuar o uso desse Serviço." + }, + "3": { + "title": "3. ACESSO AOS SERVIÇOS", + "paragraphs": [ + "Apenas você pode usar os Serviços. Você deve manter sua conta e senhas confidenciais e não autorizar terceiros a acessar ou usar o Serviço em seu nome. É sua responsabilidade nos contatar imediatamente se sua conta for hackeada, comprometida ou mal utilizada de outra forma. Você é responsável por todas as atividades que ocorrem com sua conta. Não seremos responsáveis por qualquer perda ou dano decorrente de qualquer uso não autorizado de suas contas.", + "Se um terceiro, como um empregador, lhe deu sua conta, essa parte tem direitos sobre sua conta e pode: gerenciar sua conta, redefinir sua senha, ou suspender ou cancelar sua conta; visualizar os dados de uso e perfil de sua conta, incluindo como e quando sua conta é usada; e ler ou armazenar conteúdo em sua conta." + ] + }, + "4": { + "title": "4. CONSENTIMENTO PARA COMUNICAÇÕES ELETRÔNICAS E SOLICITAÇÃO", + "paragraphs": [ + "Ao se registrar conosco, você entende que podemos enviar comunicações ou dados sobre os Serviços, incluindo mas não limitado a (a) avisos sobre seu uso dos Serviços, e (b) informações promocionais e materiais sobre nossos produtos e serviços, via correio eletrônico. Damos a você a oportunidade de optar por não receber tais correios eletrônicos não obrigatórios de nós seguindo as instruções de cancelamento fornecidas na mensagem.", + "Também podemos enviar a você, em formato eletrônico, avisos obrigatórios sobre o Serviço e informações que a lei nos obriga a fornecer. Podemos fornecer informações obrigatórias ou exigidas a você por email no endereço que você especificou quando se inscreveu no Serviço. Avisos obrigatórios ou exigidos enviados por email serão considerados dados e recebidos quando o email for enviado. Você não pode optar por não receber avisos obrigatórios ou exigidos. Se você não consentir em receber avisos obrigatórios ou exigidos eletronicamente, deve parar de usar o Serviço." + ] + }, + "5": { + "title": "5. PAGAMENTOS E REEMBOLSOS", + "text": "Você deve estar autorizado a usar o método de pagamento que inserir quando criar uma conta de cobrança. Você nos autoriza a cobrar de você pelo Serviço usando seu método de pagamento e por qualquer recurso pago do Serviço que você escolher se inscrever ou usar enquanto estes Termos estiverem em vigor. Podemos iniciar pagamentos (a) antecipadamente; (b) no momento da compra; (c) logo após a compra; ou (d) de forma recorrente para Serviços de assinatura." + }, + "6": { + "title": "6. ISENÇÃO DE GARANTIA E LIMITAÇÃO DE RESPONSABILIDADE", + "paragraphs": [ + "O APLICATIVO DIAUM É FORNECIDO \"COMO ESTÁ\", POR SUA PRÓPRIA CONTA E RISCO, SEM GARANTIA OU CONDIÇÃO EXPRESSA OU IMPLÍCITA DE QUALQUER TIPO. TAMBÉM RENUNCIAMOS A QUAISQUER GARANTIAS DE COMERCIALIZAÇÃO, ADEQUAÇÃO PARA UM PROPÓSITO PARTICULAR OU NÃO VIOLAÇÃO.", + "NÃO SOMOS RESPONSÁVEIS POR QUALQUER DANO OU PERDA DE DADOS QUE POSSA RESULTAR DO USO DO APLICATIVO DIAUM. RENUNCIAMOS AINDA A QUALQUER GARANTIA DE QUE O CONTEÚDO SERÁ ENTREGUE LIVRE DE FALHA TÉCNICA OU DEFEITO OU QUE MONITORAREMOS OU GERENCIAREMOS QUAISQUER DIREITOS ASSOCIADOS A QUALQUER CONTEÚDO.", + "EM NENHUM EVENTO SEREMOS NÓS OU NOSSOS PARCEIROS RESPONSÁVEIS POR QUAISQUER DANOS GERAIS, DIRETOS, INCIDENTAIS, INDIRETOS, ESPECIAIS, PUNITIVOS OU CONSEQUENCIAIS EM CONEXÃO COM OU DECORRENTES DESTE ACORDO, INCLUINDO MAS NÃO LIMITADO A QUALQUER PERDA DE OPORTUNIDADE, NEGÓCIOS, LUCRO, RECEITA OU ROYALTIES, INDEPENDENTEMENTE DA CAUSA E SE DECORRENTE DE CONTRATO, DELITO, NEGLIGÊNCIA, VIOLAÇÃO OU OUTRA TEORIA DE RESPONSABILIDADE, MESMO QUE NÓS OU NOSSOS PARCEIROS TENHAMOS SIDO AVISADOS DA POSSIBILIDADE DE TAL DANO." + ] + }, + "7": { + "title": "7. ESCOLHA DA LEI, JURISDIÇÃO E FORO, E LIMITAÇÕES", + "text": "Este Acordo e sua validade serão regidos e interpretados de acordo com as leis substantivas do estado de Wisconsin, EUA, excluindo seus princípios de conflitos de leis. Qualquer controvérsia ou reivindicação decorrente ou relacionada a este Acordo, ou violação do mesmo, será finalmente resolvida por arbitragem administrada pela Associação Americana de Arbitragem de acordo com suas Regras de Arbitragem Comercial, e o julgamento sobre a decisão proferida pelo(s) árbitro(s) pode ser registrado em qualquer tribunal com jurisdição sobre o mesmo. A sede da arbitragem será a cidade de Madison, Wisconsin, EUA." + }, + "8": { + "title": "8. ACORDO INTEGRAL", + "text": "Estes Termos (incluindo a Política de Privacidade) constituem o acordo integral e exclusivo entre você e nós com relação ao Serviço, e substituem e substituem quaisquer outros acordos, termos e condições aplicáveis ao Serviço. Estes Termos não criam direitos de terceiros beneficiários. Nossa falha em fazer cumprir uma disposição não é uma renúncia ao nosso direito de fazê-lo posteriormente." + }, + "9": { + "title": "9. DIVISIBILIDADE", + "text": "Se uma disposição dos Termos for considerada inexequível, as disposições restantes dos Termos permanecerão em pleno efeito e um termo executável será substituído refletindo nossa intenção o mais próximo possível." + }, + "10": { + "title": "10. LIBERAÇÃO E COMPROMISSO DE NÃO PROCESSAR", + "text": "Na medida máxima permitida por lei, você libera e se compromete a não processar nós, nossos parceiros, nossas empresas afiliadas, e nossos respectivos diretores, agentes, joint ventures, funcionários, representantes legais e fornecedores de todas e quaisquer reivindicações, demandas e danos (reais e consequenciais) de todo tipo e natureza, conhecidos e desconhecidos, suspeitos e não suspeitos, divulgados e não divulgados, decorrentes ou de qualquer forma conectados com disputas entre você e um organizador de evento. Ao entrar nesta liberação, você expressamente renuncia a quaisquer proteções (sejam estatutárias ou outras) que de outra forma limitariam a cobertura desta liberação para incluir apenas aquelas reivindicações que você pode conhecer ou suspeitar que existam em seu favor no momento de concordar com esta liberação." + }, + "11": { + "title": "11. INDENIZAÇÃO", + "text": "Você concorda em nos indenizar e manter nossas subsidiárias, afiliadas e seus respectivos diretores, advogados, agentes, funcionários, licenciadores e fornecedores (os \"Indenizados\") isentos de qualquer reivindicação ou demanda e todas as responsabilidades, custos e despesas (incluindo honorários advocatícios razoáveis) incorridos por nós e (se aplicável) qualquer Indenizado resultante de ou decorrente de sua violação de qualquer lei, violação de qualquer representação ou garantia neste acordo, ou violação dos direitos de terceiros, incluindo direitos de propriedade intelectual." + }, + "12": { + "title": "12. PROPRIEDADE INTELECTUAL", + "text": "Todas as marcas registradas, direitos autorais, software, conteúdo, know-how, tecnologia proprietária e informações, boa vontade e outras propriedades intelectuais criadas, desenvolvidas ou licenciadas por nós são nossa propriedade intelectual exclusiva. Nada aqui criará qualquer cessão ou licença de nossa propriedade intelectual para você ou qualquer terceiro." + } + }, + "effectiveDate": "Data de vigência: 10 de outubro de 2025" + } + }, "footer": { "subheading": "Um app para bloqueio de conteudo adulto e criaçao de novos habitos.", "quickLinks": { From e308122a6d504a1943eabae1fc7511c7b6be7399 Mon Sep 17 00:00:00 2001 From: silvavini9 Date: Sat, 11 Oct 2025 13:30:03 -0400 Subject: [PATCH 09/19] fix: lint error --- src/components/Footer.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx index 5529ee0..065acd9 100644 --- a/src/components/Footer.tsx +++ b/src/components/Footer.tsx @@ -53,7 +53,7 @@ function buildOrganizationJsonLd(footerDetails: IFooterDetails): string { '@type': 'Organization', name: siteDetails.siteName, url: siteDetails.siteUrl, - logo: siteDetails.logoUrl, + logo: siteDetails.siteLogo, sameAs: sameAs.length ? sameAs : undefined, contactPoint: contactPoint.length ? contactPoint : undefined, } From 5cec66c3931f80cca4590711d30f0cad47119cba Mon Sep 17 00:00:00 2001 From: silvavini9 Date: Sat, 11 Oct 2025 13:39:14 -0400 Subject: [PATCH 10/19] feat: gera metadata dado a localizacao da pagina, ingles ou portugues --- src/app/layout.tsx | 112 +++++++++++++++++++++------------------- src/data/siteDetails.ts | 7 --- 2 files changed, 59 insertions(+), 60 deletions(-) diff --git a/src/app/layout.tsx b/src/app/layout.tsx index d025e3c..d58ecff 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -9,66 +9,72 @@ import { siteDetails } from '@/data/siteDetails' import './globals.css' import { Locale } from '@/locales' import { NextIntlClientProvider, useMessages } from 'next-intl' +import { getLocale, getTranslations } from 'next-intl/server' const manrope = Manrope({ subsets: ['latin'] }) const sourceSans = Source_Sans_3({ subsets: ['latin'] }) -export const metadata: Metadata = { - title: siteDetails.metadata.title, - description: siteDetails.metadata.description, - keywords: [ - `${siteDetails.siteName}`, - 'app', - 'bloqueio', - 'conteúdo', - 'pornografia', - 'hábitos', - 'foco', - 'controle', - 'vida', - ], - authors: [{ name: siteDetails.siteName }], - creator: siteDetails.siteName, - publisher: siteDetails.siteName, - icons: { - icon: [{ url: '/favicon.ico', sizes: 'any' }], - }, - robots: { - index: true, - follow: true, - googleBot: { +export async function generateMetadata(): Promise { + const t = await getTranslations('globals.metadata') + const locale = await getLocale() + + return { + title: t('title'), + description: t('description'), + keywords: [ + `${siteDetails.siteName}`, + 'app', + 'bloqueio', + 'conteúdo', + 'pornografia', + 'hábitos', + 'foco', + 'controle', + 'vida', + ], + authors: [{ name: siteDetails.siteName }], + creator: siteDetails.siteName, + publisher: siteDetails.siteName, + icons: { + icon: [{ url: '/favicon.ico', sizes: 'any' }], + }, + robots: { index: true, follow: true, - 'max-video-preview': -1, - 'max-image-preview': 'large', - 'max-snippet': -1, - }, - }, - openGraph: { - title: siteDetails.metadata.title, - description: siteDetails.metadata.description, - url: siteDetails.siteUrl, - type: 'website', - locale: siteDetails.locale, - siteName: siteDetails.siteName, - images: [ - { - url: '/images/diaum-logo.png', - width: 1200, - height: 630, - alt: `${siteDetails.metadata.title}`, + googleBot: { + index: true, + follow: true, + 'max-video-preview': -1, + 'max-image-preview': 'large', + 'max-snippet': -1, }, - ], - }, - twitter: { - card: 'summary_large_image', - title: siteDetails.metadata.title, - description: siteDetails.metadata.description, - images: ['/images/diaum-logo.png'], - }, - alternates: { - canonical: siteDetails.siteUrl, - }, + }, + openGraph: { + title: t('title'), + description: t('description'), + url: siteDetails.siteUrl, + type: 'website', + locale: locale, + siteName: siteDetails.siteName, + images: [ + { + url: '/images/diaum-logo.png', + width: 1200, + height: 630, + alt: `${t('title')}`, + }, + ], + }, + twitter: { + card: 'summary_large_image', + title: t('title'), + description: t('description'), + images: ['/images/diaum-logo.png'], + }, + alternates: { + canonical: siteDetails.siteUrl, + }, + } } interface RootLayoutProps { diff --git a/src/data/siteDetails.ts b/src/data/siteDetails.ts index 148fc47..cae52f8 100644 --- a/src/data/siteDetails.ts +++ b/src/data/siteDetails.ts @@ -1,13 +1,6 @@ export const siteDetails = { siteName: 'diaum', siteUrl: 'https://diaum.app/', - metadata: { - title: 'diaum - App de Bloqueio de Conteúdo | Livre, Focado e no Controle da Sua Vida', - description: - 'Transforme seus hábitos com o diaum - o app que bloqueia pornografia e conteúdo inadequado. Seja livre, focado e no controle da sua vida desde o Dia Um. Download gratuito!', - }, - language: 'pt-br', - locale: 'pt-BR', siteLogo: `${process.env.BASE_PATH || ''}/images/diaum-logo.png`, googleAnalyticsId: '', } From 5bbac88620ec702af206407bb0d5591d842ecf82 Mon Sep 17 00:00:00 2001 From: silvavini9 Date: Sat, 11 Oct 2025 13:50:50 -0400 Subject: [PATCH 11/19] docs: adiciona parte de internalizacao na docs de contribuidor --- README-CONTRIBUIDOR.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/README-CONTRIBUIDOR.md b/README-CONTRIBUIDOR.md index 363b0bd..5f4d524 100644 --- a/README-CONTRIBUIDOR.md +++ b/README-CONTRIBUIDOR.md @@ -1,4 +1,3 @@ - # README para Primeiros Colaboradores - Diaum > **Bem-vindo ao projeto Diaum!** 🎉 @@ -38,7 +37,10 @@ Antes de começar, certifique-se de ter instalado: diaum/ ├── src/ │ ├── app/ # Páginas e rotas (Next.js App Router) +│ │ ├── [locale]/ # Páginas da aplicação que são localizadas │ ├── components/ # Componentes React reutilizáveis +│ ├── locales/ # Textos de localização +│ ├── i18n/ # Configurações da localização como routing e definição de linguagem │ ├── data/ # Dados e configurações │ │ ├── siteDetails.ts │ │ └── ... @@ -50,7 +52,7 @@ diaum/ ### Pastas Principais -- **`/src/app`**: Contém as páginas e rotas do site +- **`/src/app/[locale]`**: Contém as páginas e rotas do site - **`/src/components`**: Componentes React modulares e reutilizáveis - **`/src/data`**: Arquivos de configuração e dados do site - **`/public`**: Assets estáticos (imagens, ícones, etc.) @@ -82,6 +84,7 @@ O site Diaum possui as seguintes seções: - Clone seu fork localmente 2. **Crie uma Nova Branch** + ```bash git checkout -b feature/nova-secao # ou @@ -94,12 +97,14 @@ O site Diaum possui as seguintes seções: - Certifique-se de que não quebrou funcionalidades existentes 4. **Commit suas Mudanças** + ```bash git add . git commit -m "feat: adiciona nova seção de componentes" ``` 5. **Push para seu Fork** + ```bash git push origin feature/nova-secao ``` @@ -129,7 +134,7 @@ O site Diaum possui as seguintes seções: ## 🚀 Deploy -A forma mais rápida de fazer deploy do Diaum é no [Vercel](https://vercel.com/). +A forma mais rápida de fazer deploy do Diaum é no [Vercel](https://vercel.com/). Consulte a [documentação de deploy do Next.js](https://vercel.com/docs/deployments/deployment-methods) para outras opções de deployment. @@ -155,11 +160,13 @@ Consulte a [documentação de deploy do Next.js](https://vercel.com/docs/deploym ## ❓ Dúvidas Frequentes ### Como faço para rodar os testes? + ```bash npm test ``` ### Como faço o build de produção? + ```bash npm run build ``` @@ -167,6 +174,7 @@ npm run build ### Como reporto um bug? Abra uma issue no GitHub com: + - Descrição clara do problema - Passos para reproduzir - Comportamento esperado vs. atual From 3df81864fb56f0550699836794cf04605291fa4c Mon Sep 17 00:00:00 2001 From: silvavini9 Date: Sat, 11 Oct 2025 13:59:47 -0400 Subject: [PATCH 12/19] feat: keywords internacionalizadas --- src/app/layout.tsx | 20 +++++++++----------- src/locales/en.json | 3 ++- src/locales/pt-br.json | 3 ++- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/app/layout.tsx b/src/app/layout.tsx index d58ecff..e9441ac 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -18,20 +18,18 @@ export async function generateMetadata(): Promise { const t = await getTranslations('globals.metadata') const locale = await getLocale() + const keywords = [ + siteDetails.siteName, + ...t('keywords') + .split(',') + .map(k => k.trim()), + ] + + console.log(keywords) return { title: t('title'), description: t('description'), - keywords: [ - `${siteDetails.siteName}`, - 'app', - 'bloqueio', - 'conteúdo', - 'pornografia', - 'hábitos', - 'foco', - 'controle', - 'vida', - ], + keywords: keywords, authors: [{ name: siteDetails.siteName }], creator: siteDetails.siteName, publisher: siteDetails.siteName, diff --git a/src/locales/en.json b/src/locales/en.json index 0cba7b8..312fb72 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -2,7 +2,8 @@ "globals": { "metadata": { "title": "diaum - Content Blocking App | Free, Focused, and in Control of Your Life", - "description": "Transform your habits with diaum - the app that blocks pornography and inappropriate content. Be free, focused, and in control of your life from Day One. Free download!" + "description": "Transform your habits with diaum - the app that blocks pornography and inappropriate content. Be free, focused, and in control of your life from Day One. Free download!", + "keywords": "app, blocking, content, pornography, habits, focus, control, life" } }, "header": { diff --git a/src/locales/pt-br.json b/src/locales/pt-br.json index 8a87636..5523c71 100644 --- a/src/locales/pt-br.json +++ b/src/locales/pt-br.json @@ -2,7 +2,8 @@ "globals": { "metadata": { "title": "diaum - App de Bloqueio de Conteúdo | Livre, Focado e no Controle da Sua Vida", - "description": "Transforme seus hábitos com o diaum - o app que bloqueia pornografia e conteúdo inadequado. Seja livre, focado e no controle da sua vida desde o Dia Um. Download gratuito!" + "description": "Transforme seus hábitos com o diaum - o app que bloqueia pornografia e conteúdo inadequado. Seja livre, focado e no controle da sua vida desde o Dia Um. Download gratuito!", + "keywords": "app, bloqueio, conteúdo, pornografia, hábitos, foco, controle, vida" } }, "header": { From 088613b69759243bafc59d70947086e1c79a0422 Mon Sep 17 00:00:00 2001 From: silvavini9 Date: Sat, 11 Oct 2025 14:01:05 -0400 Subject: [PATCH 13/19] refactor: remove console.log --- src/app/layout.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/app/layout.tsx b/src/app/layout.tsx index e9441ac..8ae147b 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -25,7 +25,6 @@ export async function generateMetadata(): Promise { .map(k => k.trim()), ] - console.log(keywords) return { title: t('title'), description: t('description'), From f896cbcccb417a54c035165934ded71b7bb6970c Mon Sep 17 00:00:00 2001 From: silvavini9 Date: Sat, 11 Oct 2025 14:23:34 -0400 Subject: [PATCH 14/19] feat: adiciona telefone a internalizacao --- src/components/Footer.tsx | 2 +- src/locales/en.json | 1 + src/locales/pt-br.json | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx index 065acd9..72334a4 100644 --- a/src/components/Footer.tsx +++ b/src/components/Footer.tsx @@ -154,7 +154,7 @@ const Footer: React.FC = () => { className="block mt-2 text-[var(--footer-text)] hover:text-[var(--footer-link)] transition-colors" aria-label={`Ligar para ${footerDetails.telephone}`} > - Telefone: {footerDetails.telephone} + {translations('phone')}: {footerDetails.telephone} )} diff --git a/src/locales/en.json b/src/locales/en.json index 312fb72..21ac6de 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -104,6 +104,7 @@ "privacyPolicy": "Privacy Policy", "termsOfUse": "Terms Of Use", "contact": "Contact", + "phone": "Phone", "copyright": "All rights reserved." } } diff --git a/src/locales/pt-br.json b/src/locales/pt-br.json index 5523c71..ba4b7e4 100644 --- a/src/locales/pt-br.json +++ b/src/locales/pt-br.json @@ -104,6 +104,7 @@ "privacyPolicy": "Política de Privacidade", "termsOfUse": "Termos de Uso", "contact": "Contato", + "phone": "Telefone", "copyright": "Todos os direitos reservados." } } From c70af75f3b893bed02963472043d61419d86d235 Mon Sep 17 00:00:00 2001 From: silvavini9 Date: Sat, 11 Oct 2025 14:36:35 -0400 Subject: [PATCH 15/19] feat: adiciona traducao nas arias-label do footer --- src/components/Footer.tsx | 8 ++++---- src/locales/en.json | 5 ++++- src/locales/pt-br.json | 5 ++++- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx index 72334a4..a220fba 100644 --- a/src/components/Footer.tsx +++ b/src/components/Footer.tsx @@ -99,7 +99,7 @@ const Footer: React.FC = () => {

{footerDetails.subheading}

-