diff --git a/next/components/atoms/FilterAccordion.js b/next/components/atoms/FilterAccordion.js index 413643df..84c0405d 100644 --- a/next/components/atoms/FilterAccordion.js +++ b/next/components/atoms/FilterAccordion.js @@ -11,10 +11,11 @@ import { Skeleton } from "@chakra-ui/react"; import { useEffect, useState } from "react"; +import { useTranslation } from 'next-i18next'; import Checkbox from "../atoms/Checkbox"; import { ControlledInput, ControlledInputSimple} from "./ControlledInput"; import SectionText from "./SectionText"; -import SearchIcon from "../../public/img/icons/searchIcon" +import SearchIcon from "../../public/img/icons/searchIcon"; export function BaseFilterAccordion({ fieldName, @@ -26,6 +27,8 @@ export function BaseFilterAccordion({ alwaysOpen = false, isHovering = true }) { + const { t } = useTranslation('common'); + return ( @@ -85,6 +88,7 @@ export function CheckboxFilterAccordion({ canSearch = false, isLoading }) { + const { t } = useTranslation('common'); const [options , setOptions] = useState([]) const [search, setSearch] = useState(""); const [inputFocus, setInputFocus] = useState(false) @@ -130,7 +134,7 @@ export function CheckboxFilterAccordion({ onChange={setSearch} inputFocus={inputFocus} changeInputFocus={setInputFocus} - placeholder="Pesquisar" + placeholder={t('search')} fill="#464A51" icon={ { return options.map((option, i) => { - if(option.name){ return ( - window.open(option.url, "_blank")} - > - {option.name} - ) - } else { return } - }) - } + if(option.name){ + const menuItemProps = { + key: i, + letterSpacing: "0.1px", + lineHeight: "18px", + fontWeight: "400", + fontSize: "12px", + fontFamily: "Roboto", + color: "#252A32", + backgroundColor: "#FFF", + padding: "0 16px 10px", + _focus: {backgroundColor: "transparent"}, + _hover: {backgroundColor: "transparent", opacity: "0.7"}, + }; + + if (option.url) { + return ( + window.open(option.url, "_blank")} + > + {option.name} + + ); + } else if (option.component) { + return ( + + {React.cloneElement(option.component, { + style: { + letterSpacing: "0.1px", + lineHeight: "18px", + fontWeight: "400", + fontSize: "12px", + fontFamily: "Roboto", + color: "#252A32", + } + })} + + ); + } + } else { + return ; + } + }); + }; return ( diff --git a/next/components/atoms/Link.js b/next/components/atoms/Link.js index e9cbd56c..ffa533be 100644 --- a/next/components/atoms/Link.js +++ b/next/components/atoms/Link.js @@ -1,4 +1,6 @@ -import { Link as ChakraLink } from "@chakra-ui/react"; +import { Text } from "@chakra-ui/react"; +import NextLink from 'next/link'; +import { useRouter } from 'next/router'; export default function Link({ children, @@ -8,19 +10,26 @@ export default function Link({ fontWeight = "700", ...props }) { + const { locale } = useRouter(); + return ( - - {children} - + + + {children} + + ); } + diff --git a/next/components/atoms/ObservationLevelTable.js b/next/components/atoms/ObservationLevelTable.js index 97c271fe..f1f04f21 100644 --- a/next/components/atoms/ObservationLevelTable.js +++ b/next/components/atoms/ObservationLevelTable.js @@ -7,9 +7,16 @@ import { Th, Td, } from "@chakra-ui/react"; +import { useTranslation } from 'next-i18next'; +import { useRouter } from 'next/router'; +import { capitalize } from "lodash"; export default function ObservationLevel({ resource }) { - const headers = ["Entidade","Colunas Correspondentes"] + const { t } = useTranslation('dataset'); + const router = useRouter(); + const { locale } = router; + + const headers = [t('observationLevelTable.entityHeader'), t('observationLevelTable.columnsHeader')]; let array = [] const keys = Object.keys(resource?.observationLevels) @@ -18,8 +25,9 @@ export default function ObservationLevel({ resource }) { const value = resource?.observationLevels[elm] const valueEntity = () => { + if(value.entity[`name${capitalize(locale)}`]) return value.entity[`name${capitalize(locale)}`] if(value.entity.name) return value.entity.name - return "Não informado" + return t('observationLevelTable.notProvided') } const valueColumns = () => { @@ -30,7 +38,7 @@ export default function ObservationLevel({ resource }) { columns.push(column?.name) }) } else { - columns = ["Não informado"] + columns = [t('observationLevelTable.notProvided')] } return columns.join(", ") } diff --git a/next/components/atoms/SectionLink.js b/next/components/atoms/SectionLink.js index c0065928..8e39cccb 100644 --- a/next/components/atoms/SectionLink.js +++ b/next/components/atoms/SectionLink.js @@ -1,8 +1,10 @@ import { Link as ChakraLink } from "@chakra-ui/react"; +import NextLink from 'next/link'; import { useEffect, useState } from "react"; import { useCheckMobile } from "../../hooks/useCheckMobile.hook"; +import { useRouter } from 'next/router'; -export default function Link({ +export default function SectionLink({ children, href, target, @@ -10,27 +12,29 @@ export default function Link({ }) { const [isMobileMod, setIsMobileMod] = useState(false) const isMobile = useCheckMobile(); + const { locale } = useRouter(); useEffect(() => { setIsMobileMod(isMobile) }, [isMobile]) return ( - - {children} - + + + {children} + + ); } diff --git a/next/components/atoms/ThemeTag.js b/next/components/atoms/ThemeTag.js index f6d09340..1e8cb696 100644 --- a/next/components/atoms/ThemeTag.js +++ b/next/components/atoms/ThemeTag.js @@ -1,24 +1,28 @@ -import { Tag } from "@chakra-ui/react"; +import Link from '../atoms/Link'; +import { Tag } from '@chakra-ui/react'; -export function ThemeTag({ name, ...style }) { +export function ThemeTag({ slug, locale, ...props }) { return ( - - {name} - + + {slug} + ); } diff --git a/next/components/molecules/ColumnsTable.js b/next/components/molecules/ColumnsTable.js index 6e2cc0be..2453ec29 100644 --- a/next/components/molecules/ColumnsTable.js +++ b/next/components/molecules/ColumnsTable.js @@ -20,7 +20,8 @@ import cookies from 'js-cookie'; import { ControlledInputSimple } from '../atoms/ControlledInput'; import Checkbox from '../atoms/Checkbox'; import { triggerGAEvent, formatBytes } from '../../utils'; - +import { useTranslation } from 'next-i18next'; +import { capitalize } from 'lodash'; import { getColumnsBdmTable } from "../../pages/api/tables/index"; @@ -33,6 +34,7 @@ import RedirectIcon from '../../public/img/icons/redirectIcon'; import 'katex/dist/katex.min.css'; function SearchColumn({ isLoaded, resource, columns }) { + const { t } = useTranslation('dataset'); const [inputFocus, setInputFocus] = useState(false) const [search, setSearch] = useState("") const [value, setValue] = useState("") @@ -71,7 +73,7 @@ function SearchColumn({ isLoaded, resource, columns }) { onChange={setSearch} inputFocus={inputFocus} changeInputFocus={setInputFocus} - placeholder="Pesquisar colunas" + placeholder={t('column.search')} fill="#464A51" height="48px" maxWidth="100%" @@ -95,15 +97,15 @@ export default function ColumnsTable({ setHasLoading, numberColumns, template, - columnsPro }) { const router = useRouter() - const { query } = router + const { query, locale } = router const [resource, setResource] = useState({}) const [columns, setColumns] = useState({}) const [isError, setIsError] = useState(false) const [isLoading, setIsLoading] = useState(true) const [isSearchLoading, setIsSearchLoading] = useState(true) + const { t } = useTranslation('dataset'); const isChecked = (columnSlug) => checkedColumns.includes(columnSlug) @@ -153,7 +155,6 @@ export default function ColumnsTable({ if(result) { setResource(result.sort(sortElements)) numberColumns(result.length) - columnsPro(filterClosedTables(result)) setColumns(result.sort(sortElements)) setHasLoading(false) setIsSearchLoading(false) @@ -174,45 +175,36 @@ export default function ColumnsTable({ const headers = [ { - pt: "Nome", - tooltip:"Nome da coluna." + pt: t('column.name'), + tooltip: t('column.nameTooltip') }, { - pt: - template === "download" ? - "Tabela de tradução" - : - "Precisa de tradução" - , - tooltip: - template === "download" ? - "Para traduzir os códigos institucionais da tabela você precisa utilizar as tabelas de dicionário e diretórios, dependendo de qual coluna você quiser usar." - : - "A coluna possui códigos institucionais a serem traduzidos." + pt: template === "download" ? t('column.translationTable') : t('column.needsTranslation'), + tooltip: template === "download" ? t('column.translationTableTooltip') : t('column.needsTranslationTooltip') }, { - pt: "Descrição", - tooltip:"Descrição dos dados da coluna." + pt: t('column.description'), + tooltip: t('column.descriptionTooltip') }, { - pt: "Tipo No BigQuery", - tooltip:"Tipo de dado no BigQuery — categorias: INTEGER (Inteiro), STRING (Texto), DATE (Data), FLOAT64 (Decimal), GEOGRAPHY (Geográfico)." + pt: t('column.bigQueryType'), + tooltip: t('column.bigQueryTypeTooltip') }, { - pt: "Cobertura Temporal", - tooltip:"Data inicial e final de cobertura dos dados. Pode variar entre colunas, de acordo com a disponibilidade nos dados originais." + pt: t('column.temporalCoverage'), + tooltip: t('column.temporalCoverageTooltip') }, { - pt: "Unidade De Medida", - tooltip:"Unidade de medida da coluna — ex: km, m2, kg." + pt: t('column.measurementUnit'), + tooltip: t('column.measurementUnitTooltip') }, { - pt: "Contém Dados Sensíveis (LGPD)", - tooltip:"Indica se a coluna possui dados sensíveis — ex: CPF identificado, dados de conta bancária, etc." + pt: t('column.sensitiveData'), + tooltip: t('column.sensitiveDataTooltip') }, { - pt: "Observações", - tooltip:"Descreve processos de tratamentos realizados na coluna que precisam ser evidenciados." + pt: t('column.observations'), + tooltip: t('column.observationsTooltip') } ] @@ -289,10 +281,10 @@ export default function ColumnsTable({ fill:"#0057A4" }} > - Baixar tabela que faz a tradução desta coluna + {t('column.downloadTranslationTable')} - Dicionário + {t('column.dictionary')} ) } @@ -308,17 +300,17 @@ export default function ColumnsTable({ const datasetName = value?.table?.dataset?.name || "" const tableName = value?.table?.name || "" - if(gcpDatasetID === "br_bd_diretorios_data_tempo") return "Não precisa de tradução" + if(gcpDatasetID === "br_bd_diretorios_data_tempo") return t('column.noTranslationNeeded') if(gcpDatasetID === "br_bd_diretorios_brasil") { - if(gcpTableId === "empresa" || gcpTableId === "cep") return "Não precisa de tradução" + if(gcpTableId === "empresa" || gcpTableId === "cep") return t('column.noTranslationNeeded') } - if(value?.name === "ddd") return "Não precisa de tradução" + if(value?.name === "ddd") return t('column.noTranslationNeeded') return ( {value === null ? - Não precisa de tradução + {t('column.noTranslationNeeded')} : @@ -353,12 +345,12 @@ export default function ColumnsTable({ {value?.table?.isClosed || !downloadInfo.downloadPermitted ? <> - Acessar tabela que faz a tradução desta coluna + {t('column.accessTranslationTable')} : <> - Baixar tabela que faz a tradução desta coluna + {t('column.downloadTranslationTable')} } @@ -375,7 +367,7 @@ export default function ColumnsTable({ } const measurementUnit = (value) => { - if(!value) return "Não informado" + if(!value) return t('column.notProvided') const splitValue = value.split(/([^a-z])/) const translated = (value) => value.map((elm) => elm) @@ -440,7 +432,7 @@ export default function ColumnsTable({ handleCheckboxChange(elm.node.name)} + isChecked={isChecked(elm.node[`name${capitalize(locale)}`] || elm.node.name)} + onChange={() => handleCheckboxChange(elm.node[`name${capitalize(locale)}`] || elm.node.name)} /> - {elm?.node?.name ? elm.node.name : "Não informado"} + {elm?.node?.[`name${capitalize(locale)}`] || elm?.node?.name || t('column.notProvided')} - {elm?.node?.description ? elm.node.description : "Não informado"} + {elm?.node?.[`description${capitalize(locale)}`] || elm?.node?.description || t('column.notProvided')} - {elm?.node?.bigqueryType?.name ? elm.node.bigqueryType.name : "Não informado"} + {elm?.node?.bigqueryType?.name ? elm.node.bigqueryType.name : t('column.notProvided')} {elm?.node?.coverage?.start && elm?.node?.coverage?.end ? elm.node.coverage.start +" - "+ elm.node.coverage.end : - "Não informado" + t('column.notProvided') } @@ -682,22 +674,22 @@ export default function ColumnsTable({ {elm?.node?.measurementUnit ? measurementUnit(elm.node.measurementUnit) : - "Não informado" + t('column.notProvided') } { - elm?.node?.containsSensitiveData === true ? "Sim" + elm?.node?.containsSensitiveData === true ? t('column.yes') : - elm?.node?.containsSensitiveData === false ? "Não" + elm?.node?.containsSensitiveData === false ? t('column.no') : - "Não informado" + t('column.notProvided') } - {elm?.node?.observations ? elm.node.observations : "Não informado"} + {elm?.node?.[`observations${capitalize(locale)}`] || elm?.node?.observations || t('column.notProvided')} ))} diff --git a/next/components/molecules/DataInformationQuery.js b/next/components/molecules/DataInformationQuery.js index f798053c..89717f95 100644 --- a/next/components/molecules/DataInformationQuery.js +++ b/next/components/molecules/DataInformationQuery.js @@ -22,6 +22,7 @@ import pythonHighlight from "highlight.js/lib/languages/python"; import rHighlight from "highlight.js/lib/languages/r"; import cookies from "js-cookie"; import 'highlight.js/styles/obsidian.css' +import { useTranslation } from 'next-i18next'; import GreenTab from "../atoms/GreenTab"; import Toggle from "../atoms/Toggle"; @@ -172,13 +173,13 @@ export function CodeHighlight({ language, children }) { } export default function DataInformationQuery({ resource }) { + const { t } = useTranslation('dataset'); const [tabAccessIndex, setTabAccessIndex] = useState(0) const [tabIndex, setTabIndex] = useState(0) const [downloadPermitted, setDownloadPermitted] = useState(false) const [downloadWarning, setDownloadWarning] = useState("") const [checkedColumns, setCheckedColumns] = useState([]) const [numberColumns, setNumberColumns] = useState(0) - const [columnsTranslationPro, setColumnsTranslationPro] = useState([]) const [sqlCode, setSqlCode] = useState("") const [insufficientChecks, setInsufficientChecks] = useState(false) const [includeTranslation, setIncludeTranslation] = useState(true) @@ -277,7 +278,7 @@ export default function DataInformationQuery({ resource }) { } const handleAccessIndexes = (index) => { - const categoryValues = ["BigQuery e Pacotes", "Download"] + const categoryValues = [t('table.bigQueryAndPackages'), t('table.download')]; setTabAccessIndex(index) triggerGAEvent("category_click", categoryValues[index]) } @@ -321,7 +322,7 @@ export default function DataInformationQuery({ resource }) { textAlign="center" lineHeight="40px" > - Compare os planos + {t('table.compareThePlans')} - BigQuery e Pacotes - Download + {t('table.bigQueryAndPackages')} + {t('table.download')} - {tabAccessIndex === 0 ? "Selecione as colunas que você deseja acessar:" : "Confira as colunas da tabela:"} + {tabAccessIndex === 0 ? t('table.selectColumns') : t('table.checkColumns')} @@ -388,7 +389,6 @@ export default function DataInformationQuery({ resource }) { hasLoading={hasLoadingColumns} setHasLoading={setHasLoadingColumns} template={tabAccessIndex === 1 ? "download" : "checks"} - columnsPro={setColumnsTranslationPro} /> - Essa tabela possui códigos institucionais que variam entre anos. Por isso, ainda estamos trabalhando para automatizar o processo de tradução. - Por enquanto, recomendamos acessar o dicionário e os diretórios para entender como traduzir os códigos presentes na tabela. + {t('table.infoTranslationNotAvailable', { returnObjects: true })[0]} + {t('table.infoTranslationNotAvailable', { returnObjects: true })[1]} + {t('table.infoTranslationNotAvailable', { returnObjects: true })[2]} + {t('table.infoTranslationNotAvailable', { returnObjects: true })[3]} + {t('table.infoTranslationNotAvailable', { returnObjects: true })[4]} @@ -440,10 +443,10 @@ export default function DataInformationQuery({ resource }) { defaultChecked={resource?.dataset?._id === "e083c9a2-1cee-4342-bedc-535cbad6f3cd" ? false : true} value={includeTranslation} onChange={() => setIncludeTranslation(!includeTranslation)} - />Traduzir códigos institucionais + />{t('table.translateInstitutionalCodes')} - Essa tabela completa, com todas as colunas, tem {formatBytes(resource.uncompressedFileSize)}. Cuidado para não ultrapassar o limite de processamento gratuito do BigQuery. - {numberColumns === checkedColumns.length && "Para otimizar a consulta, você pode selecionar menos colunas ou adicionar filtros no BigQuery."} + {t('table.warningLargeTable', { returnObjects: true })[0]} + {formatBytes(resource.uncompressedFileSize)} + {t('table.warningLargeTable', { returnObjects: true })[1]} + {t('table.warningLargeTable', { returnObjects: true })[2]} + {t('table.warningLargeTable', { returnObjects: true })[3]} + + {numberColumns === checkedColumns.length && t('table.warningLargeTableOptimize')} } @@ -500,7 +508,7 @@ export default function DataInformationQuery({ resource }) { > } @@ -540,7 +548,7 @@ export default function DataInformationQuery({ resource }) { backgroundColor:"#22703E" }} > - Gerar consulta + {t('table.generateQuery')} @@ -561,40 +569,39 @@ export default function DataInformationQuery({ resource }) { > {isUserPro() === false && downloadWarning === "free" && - Estes dados estão disponíveis porque diversas pessoas colaboram para a sua manutenção. - Antes de baixar os dados, apoie você também com uma doação financeira ou - - saiba como contribuir com seu tempo. - + {t('table.infoDataAvailability', { returnObjects: true })[0]} + + {t('table.infoDataAvailability', { returnObjects: true })[1]} + . } {isUserPro() === false && downloadWarning === "100mbBetween1gb" && - O download de tabelas com tamanho entre 100 MB e 1 GB está disponível apenas para + {t('table.warningPaidPlanRequired', { returnObjects: true })[0]} assinantes dos nossos planos pagos - . No entanto, você pode acessar a tabela gratuitamente utilizando SQL, Python ou R. Considere atualizar para um plano pago para fazer o download. + > + {t('table.warningPaidPlanRequired', { returnObjects: true })[1]} + + {t('table.warningPaidPlanRequired', { returnObjects: true })[2]} } {downloadWarning === "biggest1gb" && } @@ -635,7 +642,7 @@ export default function DataInformationQuery({ resource }) { width="16px" height="16px" /> - Download da tabela {downloadWarning !== "biggest1gb" && `(${formatBytes(resource.uncompressedFileSize)})`} + {t('table.downloadTable')} {downloadWarning !== "biggest1gb" && `(${formatBytes(resource.uncompressedFileSize)})`} @@ -694,7 +701,7 @@ export default function DataInformationQuery({ resource }) { lineHeight="20px" color="#252A32" > - No editor de consultas do BigQuery, digite a seguinte instrução: + {t('table.bigQueryInstructions')} @@ -707,7 +714,7 @@ export default function DataInformationQuery({ resource }) { isLoaded={!isLoadingCode} > - Primeira vez usando o BigQuery? + {t('table.firstTimeBigQuery')} - Siga o passo a passo. + {t('table.followStepByStep')} @@ -761,7 +768,7 @@ export default function DataInformationQuery({ resource }) { fontSize="14px" lineHeight="20px" > - Acessar o BigQuery + {t('table.accessBigQuery')} @@ -804,7 +811,7 @@ export default function DataInformationQuery({ resource }) { lineHeight="20px" color="#252A32" > - No terminal do Python, digite a seguinte instrução: + {t('table.pythonInstructions')} @@ -817,7 +824,7 @@ export default function DataInformationQuery({ resource }) { isLoaded={!isLoadingCode} > - Primeira vez usando o pacote Python? + {t('table.firstTimePython')} - Siga o passo a passo. + {t('table.followStepByStep')} @@ -875,7 +882,7 @@ bd.read_sql(query = query, billing_project_id = billing_id)`} lineHeight="20px" color="#252A32" > - No terminal do R, digite a seguinte instrução: + {t('table.rInstructions')} @@ -888,7 +895,7 @@ bd.read_sql(query = query, billing_project_id = billing_id)`} isLoaded={!isLoadingCode} > - Primeira vez usando o pacote R? + {t('table.firstTimeR')} - Siga o passo a passo. + {t('table.followStepByStep')} diff --git a/next/components/molecules/Footer.js b/next/components/molecules/Footer.js index b73156d5..e8e14333 100644 --- a/next/components/molecules/Footer.js +++ b/next/components/molecules/Footer.js @@ -7,6 +7,8 @@ import { import Link from "../atoms/Link"; import BodyText from "../atoms/BodyText" import { isMobileMod } from "../../hooks/useCheckMobile.hook" +import { useTranslation } from 'next-i18next'; +import { useRouter } from 'next/router'; import YoutubeIcon from "../../public/img/icons/youtubeIcon"; // import TwitterIcon from "../../public/img/icons/twitterIcon"; @@ -51,6 +53,9 @@ function SocialLink({ href, icon }) { } function FooterLink(props) { + const router = useRouter(); + const { locale } = router; + return ( ) @@ -80,6 +86,8 @@ function TextFooterSimple({children, ...props}) { } export default function Footer({ template, ocult = false }) { + const { t } = useTranslation('common'); + if(template === "simple") return ( - - ® 2024 Base dos Dados - - - Termos de Uso - - - Políticas de Privacidade - - - Contato + + {t('footer.copyright', { year: new Date().getFullYear() })} + + + {t('footer.termsOfUse')} + + + + + {t('footer.privacyPolicy')} + + + + + {t('footer.contact')} + + @@ -150,7 +173,7 @@ export default function Footer({ template, ocult = false }) { letterSpacing="-0.4px" color="#FFF" paddingBottom="40px" - >Base dos Dados + >{t('footer.title')} - + - Mecanismo de busca + {t('footer.products.searchEngine')} - Datalake público + {t('footer.products.publicDatalake')} - Pacotes + {t('footer.products.dataPackages')} - BD Pro + {t('footer.products.bdPro')} - BD Edu + {t('footer.products.bdEdu')} - + - Captura de dados + {t('footer.services.dataCapture')} - Análise de dados + {t('footer.services.dataAnalytics')} - Consultoria de dados + {t('footer.services.dataConsulting')} - Estudos de caso + {t('footer.services.caseStudies')} - + - Documentação + {t('footer.tutorials.documentation')} - Vídeos no YouTube + {t('footer.tutorials.youtubeVideos')} - + - Quem somos + {t('footer.institutional.aboutUs')} - Transparência + {t('footer.institutional.transparency')} - Newsletter + {t('footer.institutional.newsletter')} - Carreiras + {t('footer.institutional.careers')} - Perguntas frequentes + {t('footer.institutional.faq')} - Termos e Privacidade + {t('footer.institutional.termsAndPrivacy')} - Contato + {t('footer.institutional.contact')} - Apoie o projeto + {t('footer.institutional.supportProject')} @@ -259,7 +282,7 @@ export default function Footer({ template, ocult = false }) { alignItems="flex-start" marginTop={isMobileMod() && "16px"} > - ® 2024 Base dos Dados + {t('footer.copyright', { year: new Date().getFullYear() })} diff --git a/next/components/molecules/Menu.js b/next/components/molecules/Menu.js index 3b5060d7..bee64f58 100644 --- a/next/components/molecules/Menu.js +++ b/next/components/molecules/Menu.js @@ -23,9 +23,10 @@ import { } from "@chakra-ui/react"; import { useEffect, useRef, useState, useMemo } from "react"; import { useRouter } from "next/router" +import { useTranslation } from 'next-i18next'; import cookies from "js-cookie"; import MenuDropdown from "./MenuDropdown"; -import { isMobileMod, useCheckMobile } from "../../hooks/useCheckMobile.hook" +import { useCheckMobile } from "../../hooks/useCheckMobile.hook" import { ControlledInputSimple } from "../atoms/ControlledInput"; import Link from "../atoms/Link"; import RoundedButton from "../atoms/RoundedButton"; @@ -42,7 +43,15 @@ import RedirectIcon from "../../public/img/icons/redirectIcon"; import SettingsIcon from "../../public/img/icons/settingsIcon"; import SignOutIcon from "../../public/img/icons/signOutIcon"; +function useIsMobileMod() { + return useCheckMobile(); +} + function MenuDrawer({ userData, isOpen, onClose, links }) { + const { t } = useTranslation('menu'); + const { locale } = useRouter(); + const isMobile = useIsMobileMod(); + return ( @@ -133,14 +142,12 @@ function MenuDrawer({ userData, isOpen, onClose, links }) { })} - {userData ? + {userData ? ( <> - : - - + - Entrar - + {t('enter', { ns: 'menu' })} + - - Cadastrar - + {t('register', { ns: 'menu' })} + - } + )} ); @@ -196,12 +201,13 @@ function MenuDrawer({ userData, isOpen, onClose, links }) { function MenuDrawerUser({ userData, isOpen, onClose, isUserPro}) { const router = useRouter() + const { t } = useTranslation('menu'); const links = [ - {name: "Perfil público", value: "profile"}, - {name: "Conta", value: "account"}, - {name: "Senha", value: "new_password"}, - {name: "Planos e pagamento", value: "plans_and_payment"}, + {name: t('public_profile'), value: "profile"}, + {name: t('account'), value: "account"}, + {name: t('password'), value: "new_password"}, + {name: t('plans_and_payment'), value: "plans_and_payment"}, ] // {name: "Acessos", value: "accesses"}, @@ -282,7 +288,7 @@ function MenuDrawerUser({ userData, isOpen, onClose, isUserPro}) { lineHeight="20px" color="#252A32" > - Configurações + {t('settings')} @@ -343,7 +349,7 @@ function MenuDrawerUser({ userData, isOpen, onClose, isUserPro}) { lineHeight="20px" marginLeft="8px !important" > - Sair + {t('exit')} @@ -354,6 +360,8 @@ function MenuDrawerUser({ userData, isOpen, onClose, isUserPro}) { function MenuUser ({ userData, onOpen, onClose, isUserPro }) { const timerRef = useRef() const [isOpenMenu, setIsOpenMenu] = useState(false) + const { t } = useTranslation('menu'); + const isMobile = useIsMobileMod(); const btnMouseEnterEvent = () => { setIsOpenMenu(true) @@ -372,7 +380,7 @@ function MenuUser ({ userData, onOpen, onClose, isUserPro }) { setIsOpenMenu(false) } - if(useCheckMobile()) { + if(isMobile) { return ( - Configurações + {t('settings')} @@ -530,7 +538,7 @@ function MenuUser ({ userData, onOpen, onClose, isUserPro }) { fontWeight="400" lineHeight="20px" > - Sair + {t('exit')} @@ -541,15 +549,18 @@ function MenuUser ({ userData, onOpen, onClose, isUserPro }) { } function SearchInputUser ({ user }) { + const { t } = useTranslation('menu'); const inputMobileRef = useRef(null) const [search, setSearch] = useState("") const [showInput, setShowInput] = useState(false) const [inputFocus, setInputFocus] = useState(false) + const isMobile = useIsMobileMod(); + const router = useRouter(); function openSearchLink() { if(search.trim() === "") return triggerGAEvent("search_menu", search.trim()) - window.open(`/dataset?q=${search.trim()}`, "_self") + router.push(`/dataset?q=${search.trim()}`); } const handleClickOutside = (event) => { @@ -570,7 +581,7 @@ function SearchInputUser ({ user }) { } }, [showInput]) - if (isMobileMod()) return ( + if (isMobile) return ( openSearchLink()} - /> + { + e.preventDefault(); + openSearchLink(); + }} + > + + } /> @@ -631,16 +649,23 @@ function SearchInputUser ({ user }) { onEnterPress={openSearchLink} inputFocus={inputFocus} changeInputFocus={setInputFocus} - placeholder="Pesquisar dados" + placeholder={t('search_data')} fill="#464A51" icon={ - openSearchLink()} - /> + { + e.preventDefault(); + openSearchLink(); + }} + > + + } /> @@ -655,6 +680,9 @@ function DesktopLinks({ userTemplate = false, isUserPro }) { + const isMobile = useIsMobileMod(); + const { t } = useTranslation('common', 'menu'); + function LinkMenuDropDown ({ url, text, icon }) { const [flag, setFlag] = useBoolean() @@ -773,7 +801,7 @@ function DesktopLinks({ })} - {userTemplate && !isMobileMod() && + {userTemplate && !isMobile && @@ -782,19 +810,19 @@ function DesktopLinks({ {(path === "/dataset" || path === "/dataset/[dataset]") && {t('tooltip.faq')}}, + {name: t('tooltip.documentation'), url: "https://basedosdados.github.io/mais/"}, + {name: t('tooltip.youtubeVideos'), url: "https://www.youtube.com/c/BasedosDados/featured"}, {}, - {name:"Instale os nossos pacotes", url: "https://basedosdados.github.io/mais/access_data_packages/"}, + {name: t('tooltip.installPackages'), url: "https://basedosdados.github.io/mais/access_data_packages/"}, {}, - {name:"Como citar a BD?", url: "/perguntas-frequentes/#reference"}, - {name:"O que são diretórios?", url: "/perguntas-frequentes/#directories"}, + {name: t('tooltip.howToCite'), component: {t('tooltip.howToCite')}}, + {name: t('tooltip.whatAreDirectories'), component: {t('tooltip.whatAreDirectories')}}, {}, - {name:"Fale com nossa comunidade no Discord", url: "https://discord.gg/huKWpsVYx4"}, - {name:"Entre em contato", url: "/contato"}, + {name: t('tooltip.discordCommunity'), url: "https://discord.gg/huKWpsVYx4"}, + {name: t('tooltip.contactUs'), component: {t('tooltip.contactUs')}}, ]} /> } @@ -805,10 +833,8 @@ function DesktopLinks({ ) : ( <> - - Entrar - + {t('enter', { ns: 'menu' })} + - - Cadastrar - + {t('register', { ns: 'menu' })} + )} @@ -863,9 +887,12 @@ function DesktopLinks({ } export default function MenuNav({ simpleTemplate = false, userTemplate = false }) { + const { t } = useTranslation('menu'); const router = useRouter() - const { route } = router - const userBD = useMemo(() => cookies.get("userBD") || null, [cookies]) + const { route, locale } = router + const [userBD, setUserBD] = useState(null) + const [isLoading, setIsLoading] = useState(true) + const isMobile = useIsMobileMod(); const menuDisclosure = useDisclosure() const menuUserMobile = useDisclosure() @@ -884,6 +911,12 @@ export default function MenuNav({ simpleTemplate = false, userTemplate = false } return false } + useEffect(() => { + const cookieUserBD = cookies.get("userBD") + setUserBD(cookieUserBD || null) + setIsLoading(false) + }, []) + const handleScroll = () => { const currentScrollY = window.scrollY if (currentScrollY > lastScrollY) { @@ -900,7 +933,7 @@ export default function MenuNav({ simpleTemplate = false, userTemplate = false } return () => { window.removeEventListener('scroll', handleScroll) } - }, [lastScrollY]) + }, [lastScrollY, route]) function maxWidthDataset() { if (route === "/dataset" || route === "/dataset/[dataset]") return "1440px" @@ -908,45 +941,50 @@ export default function MenuNav({ simpleTemplate = false, userTemplate = false } } useEffect(() => { - let userInfo = userBD - if(userInfo !== null && userInfo !== "undefined") { - const res = JSON.parse(userInfo) - setUserData({ - email: res.email, - username: res.username, - picture: res.picture || "", - }) + if(isLoading) return + if(userBD !== null && userBD !== "undefined") { + try { + const res = JSON.parse(userBD) + setUserData({ + email: res.email, + username: res.username, + picture: res.picture || "", + }) + } catch (error) { + console.error("Error parsing user data:", error) + setUserData(null) + } } else { setUserData(null) } - }, [userBD]) + }, [userBD, isLoading]) const links = { - Dados: "/dataset", - Soluções: [ - {icon: , name: "Dados exclusivos", href: "https://info.basedosdados.org/bd-pro"}, - {icon: , name: "Curso de dados", href: "https://info.basedosdados.org/bd-edu-sql"}, - {icon: , name: "Serviços", href: "/servicos"}, + [t('data')]: `/dataset`, + [t('solutions')]: [ + {icon: , name: [t('exclusive_data')], href: "https://info.basedosdados.org/bd-pro"}, + {icon: , name: [t('data_courses')], href: "https://info.basedosdados.org/bd-edu-sql"}, + {icon: , name: [t('services')], href: "/servicos"}, ], - "Preços": "/precos", - Tutoriais: [ - {name: "Documentação", href: "https://basedosdados.github.io/mais/"}, - {name: "Vídeos no YouTube", href: "https://www.youtube.com/c/BasedosDados/featured"}, - {name: "Blog", href: "https://medium.com/basedosdados"} + [t('prices')]: "/precos", + [t('tutorials')]: [ + {name: [t('documentation')], href: "https://basedosdados.github.io/mais/"}, + {name: [t('youtube_videos')], href: "https://www.youtube.com/c/BasedosDados/featured"}, + {name: [t('blog')], href: "https://medium.com/basedosdados"} ], - Institucional: [ - {name: "Quem somos", href: "/quem-somos"}, - {name: "Transparência", href: "/transparencia"}, - {name: "Newsletter", href: "https://info.basedosdados.org/newsletter"}, - {name: "Carreiras", href: "https://info.basedosdados.org/carreiras"}, - {name: "Perguntas frequentes", href: "/perguntas-frequentes"}, + [t('institutional')]: [ + {name: [t('about_us')], href: "/quem-somos"}, + {name: [t('transparency')], href: "/transparencia"}, + {name: [t('newsletter')], href: "https://info.basedosdados.org/newsletter"}, + {name: [t('jobs')], href: "https://info.basedosdados.org/carreiras"}, + {name: [t('faq')], href: "/perguntas-frequentes"}, ], - Contato: "/contato", + [t('contact')]: "/contato", Button: [] } useEffect(() => { - document.addEventListener("scroll", () => { + const handleScroll = () => { if (window.scrollY >= 225) setIsScrollDown(true) if (window.scrollY <= 225) setIsScrollDown(false) @@ -955,8 +993,17 @@ export default function MenuNav({ simpleTemplate = false, userTemplate = false } else divRef.current.style.boxShadow = "0px 1px 8px 1px rgba(64, 60, 67, 0.16)"; - }); - }, [divRef.current]) + }; + + document.addEventListener("scroll", handleScroll); + return () => { + document.removeEventListener("scroll", handleScroll); + }; + }, []) + + if (isLoading) { + return null; + } return ( <> @@ -973,7 +1020,7 @@ export default function MenuNav({ simpleTemplate = false, userTemplate = false } width="100%" left="0px" backgroundColor="#FFFFFF" - padding={isMobileMod() ? "15px 20px" : "15px 24px"} + padding={isMobile ? "15px 20px" : "15px 24px"} zIndex="99" transition="0.5s" as="nav" @@ -1039,13 +1086,13 @@ export default function MenuNav({ simpleTemplate = false, userTemplate = false } /> } - {userTemplate && isMobileMod() && + {userTemplate && isMobile && } - {useCheckMobile() && userData && + {isMobile && userData && + if(!value) return if(startDate === null && endDate === null) return function Dates ({ date, ...props }) { @@ -133,6 +135,7 @@ export function TemporalCoverageString({ export function TemporalCoverageBar ({ value }) { const [values, setValues] = useState({}) const plansModal = useDisclosure() + const { t } = useTranslation('dataset'); const isUserPro = () => { let user @@ -173,7 +176,7 @@ export function TemporalCoverageBar ({ value }) { setValues(newValue) }, [value]) - if(values === null) return + if(values === null) return return ( - Compare os planos + {t('temporalCoverageBar.comparePlans')} - GRÁTIS + {t('temporalCoverageBar.free')} - PAGO + {t('temporalCoverageBar.paid')} {isUserPro() ? ( + Object.values(listThemes).map((elm) => (
{ ) } -function CardThemes ({ responsive, datasetsCards = [], loading }) { +function CardThemes ({ responsive, datasetsCards = [], loading, locale }) { + const { t } = useTranslation('common'); const [screenQuery, setScreenQuery] = useState(0) + useEffect(() => { if(responsive.mobileQuery) return setScreenQuery(1) @@ -210,8 +214,9 @@ function CardThemes ({ responsive, datasetsCards = [], loading }) { textAlign="center" marginBottom={responsive.mobileQuery ? "16px" : "32px"} > - Nenhum conjunto com todos os temas selecionados foi encontrado. - Tente desmarcar algum dos temas. + {t('noDatasetsFound', { returnObjects: true })[0]} + {useCheckMobile() ? null :
} + {t('noDatasetsFound', { returnObjects: true })[1]}
} @@ -246,7 +251,7 @@ function CardThemes ({ responsive, datasetsCards = [], loading }) { )) } @@ -271,7 +277,7 @@ function CardThemes ({ responsive, datasetsCards = [], loading }) { ) } -export default function ThemeCatalog ({ data }) { +export default function ThemeCatalog ({ data, locale }) { const [listThemes, setListThemes] = useState([]) const [defaultDatasetsCards, setDefaultDatasetCards] = useState([]) const [fetchThemesTimeout, setFetchThemesTimeout] = useState(null) @@ -300,17 +306,24 @@ export default function ThemeCatalog ({ data }) { if(fetchThemesTimeout) clearTimeout(fetchThemesTimeout) setLoading(true) - const fetchFunc = setTimeout(() => { - getDatasetsByThemes(selectedTheme) - .then(res => { - setDatasetsCards(res) - setLoading(false) - }) + const fetchFunc = setTimeout(async () => { + try { + const response = await axios.get('/api/themes/getDatasetsByThemes', { + params: { themes: selectedTheme.join(','), locale } + }); + setDatasetsCards(response.data); + setLoading(false); + } catch (error) { + console.error('Error fetching datasets by themes:', error); + setLoading(false); + } }, 500) setFetchThemesTimeout(fetchFunc) + } else { + setDatasetsCards(defaultDatasetsCards); } - },[selectedTheme]) + }, [selectedTheme, locale, defaultDatasetsCards]); const handleSelectTheme = (elm) => { triggerGAEvent("theme_home", elm) @@ -334,6 +347,7 @@ export default function ThemeCatalog ({ data }) { selectedTheme={selectedTheme} onSelectTheme={handleSelectTheme} responsive={{mobileQuery, baseQuery, mediumQuery, lgQuery}} + locale={locale} /> ) diff --git a/next/components/organisms/BePartner.js b/next/components/organisms/BePartner.js index 5d35ad77..fb84f90d 100644 --- a/next/components/organisms/BePartner.js +++ b/next/components/organisms/BePartner.js @@ -7,6 +7,7 @@ import { Image } from "@chakra-ui/react"; import { useEffect, useState } from "react"; +import { useTranslation } from 'next-i18next'; import { NamedAvatar } from "../molecules/NamedAvatar"; import { useCheckMobile } from "../../hooks/useCheckMobile.hook"; import Carousel from "../atoms/Carousel"; @@ -77,6 +78,7 @@ function PartnerBox({ src, ...props }) { export function BePartner() { const [isMobileMod, setIsMobileMod] = useState(false) const isMobile = useCheckMobile(); + const { t } = useTranslation('common'); useEffect(() => { setIsMobileMod(isMobile) @@ -84,7 +86,6 @@ export function BePartner() { return ( - {/* Como impactamos pessoas e organizações */} - Parcerias com + {t('partners.partnershipsWith')} - O siconfiBD é um pacote que traz de forma rápida e programática os - dados da Secretaria do Tesouro Nacional. - O código é construído de forma open-source pela equipe do Tesouro - e utiliza as tabelas tratadas BD+ para compor funções em R. - Qual a despesa de pessoal dos 100 municípios brasileiros mais - populosos? Essas e mais de outras 18 perguntas podem ser consultadas - diretamente pelo pacote, sem necessidade de SQL. + {t('partners.testimonials.fernando.quote')} - Com o apoio da Base dos Dados realizamos o levantamento das - desigualdades de gênero e raça nas eleições 2016-2020 e das - distorções de financiamento de campanhas de prefeitas e vereadoras - nas últimas eleições, o que resultará no lançamento de uma publicação inédita. + {t('partners.testimonials.marina.quote')} - Criamos um importante produto nosso, a Fotografia do Município, - em parceria com a BD. A Fotografia - agrega diversos indicadores socioeconômicos dos municípios - brasileiros. A Ponte fez o planejamento e desenho do relatório, - enquanto a BD cuidou da parte técnica de visualização e gestão de - dados. A parceria foi o que nos permitiu avançar rápido no - desenvolvimento da ferramenta, e garantiu a qualidade de dados - alta como queríamos desde o início. + {t('partners.testimonials.amanda.quote')} diff --git a/next/components/organisms/Database.js b/next/components/organisms/Database.js index a661d5dc..9e375df6 100644 --- a/next/components/organisms/Database.js +++ b/next/components/organisms/Database.js @@ -6,7 +6,11 @@ import { Text, Box } from "@chakra-ui/react"; +import { useTranslation } from 'next-i18next'; +import { capitalize } from "lodash"; +import { useRouter } from 'next/router'; import { useCheckMobile } from "../../hooks/useCheckMobile.hook"; +import Link from '../atoms/Link'; import LinkIcon from "../../public/img/icons/linkIcon"; import InfoArrowIcon from "../../public/img/icons/infoArrowIcon"; @@ -21,34 +25,30 @@ export default function Database({ rawDataSources, informationRequests, contains, + locale }) { + const { t } = useTranslation('dataset'); + const router = useRouter(); const Tables = () => { let tablesNumber = tables.number if(tables.number === undefined) tablesNumber = 0 return ( - 0 ? `/dataset/${id}?table=${tables.id}` : "#"} cursor={tablesNumber > 0 ? "pointer" : "normal"} color={tablesNumber === 0 ? "#ACAEB1" : "#0068C5"} fill={tablesNumber === 0 ? "#ACAEB1" : "#0068C5"} pointerEvents={tablesNumber === 0 && "none"} - fontFamily="Roboto" fontWeight="400" - fontSize="14px" - lineHeight="20px" _hover={{ color: "#0057A4", fill: "#0057A4" }} - href={tablesNumber > 0 ? `/dataset/${id}?table=${tables.id}` : ""} > @@ -57,9 +57,9 @@ export default function Database({ whiteSpace="nowrap" > {tablesNumber}{" "} - {tablesNumber === 1 ? "tabela tratada" : "tabelas tratadas"} + {tablesNumber === 1 ? t('datasetCard.table') : t('datasetCard.tables')} - + ) } @@ -68,27 +68,20 @@ export default function Database({ if(rawDataSources.number === undefined) rawDataSourcesNumber = 0 return ( - 0 ? "pointer" : "normal"} color={rawDataSourcesNumber === 0 ? "#ACAEB1" : "#0068C5"} fill={rawDataSourcesNumber === 0 ? "#ACAEB1" : "#0068C5"} pointerEvents={rawDataSourcesNumber === 0 && "none"} - fontFamily="Roboto" fontWeight="400" - fontSize="14px" - lineHeight="20px" _hover={{ color: "#0057A4", fill: "#0057A4" }} - href={rawDataSourcesNumber > 0 ? `/dataset/${id}?raw_data_source=${rawDataSources.id}` : ""} + href={rawDataSourcesNumber > 0 ? `/dataset/${id}?raw_data_source=${rawDataSources.id}` : "#"} > @@ -97,9 +90,9 @@ export default function Database({ whiteSpace="nowrap" > {rawDataSourcesNumber}{" "} - {rawDataSourcesNumber === 1 ? "fonte original" : "fontes originais"} + {rawDataSourcesNumber === 1 ? t('datasetCard.rawDataSource') : t('datasetCard.rawDataSources')} - + ) } @@ -108,27 +101,20 @@ export default function Database({ if(informationRequests.number === undefined) informationRequestsNumber = 0 return ( - 0 ? "pointer" : "normal"} color={informationRequestsNumber === 0 ? "#ACAEB1" : "#0068C5"} fill={informationRequestsNumber === 0 ? "#ACAEB1" : "#0068C5"} pointerEvents={informationRequestsNumber === 0 && "none"} - fontFamily="Roboto" fontWeight="400" - fontSize="14px" - lineHeight="20px" _hover={{ color: "#0057A4", fill: "#0057A4" }} - href={informationRequestsNumber > 0 ? `/dataset/${id}?information_request=${informationRequests.id}` : ""} + href={informationRequestsNumber > 0 ? `/dataset/${id}?information_request=${informationRequests.id}` : "#"} > @@ -137,9 +123,9 @@ export default function Database({ whiteSpace="nowrap" > {informationRequestsNumber}{" "} - {informationRequestsNumber === 1 ? "pedido LAI" : "pedidos LAI"} + {informationRequestsNumber === 1 ? t('datasetCard.informationRequest') : t('datasetCard.informationRequests')} - + ) } @@ -157,27 +143,29 @@ export default function Database({ height="100%" spacing={6} > - - {organization.name - + _hover={{ opacity: 0.9 }} + > + {organization[`name${capitalize(locale)}`] +
+ - - {name} - + + {name} + + - Organização: + {t('organization')}: - - {organization?.name} - + + {organization[`name${capitalize(locale)}`] || organization?.name} + + - Cobertura temporal: + {t('temporalCoverage')}: - {temporalCoverageText ? temporalCoverageText : "Não informado"} + {temporalCoverageText ? temporalCoverageText : t('noCoverage')} @@ -283,7 +276,7 @@ export default function Database({ lineHeight="20px" color="#464A51" > - Recursos: + {t('tables')}: - {contains.free && "Grátis"} {contains.free && contains.pro && "e"} {contains.pro && "Pagos"} - {!contains.free && !contains.pro && "Não informado"} + {contains.free && t('openData')} {contains.free && contains.pro && t('and')} {contains.pro && t('closedData')} + {!contains.free && !contains.pro && t('none')} diff --git a/next/components/organisms/DatabaseCard.js b/next/components/organisms/DatabaseCard.js index ae95ee68..28a8d8c1 100644 --- a/next/components/organisms/DatabaseCard.js +++ b/next/components/organisms/DatabaseCard.js @@ -6,6 +6,8 @@ import { Tooltip, Stack } from "@chakra-ui/react"; +import { useTranslation } from 'next-i18next'; +import { capitalize } from "lodash"; import Card from "../molecules/Card"; import { CategoryIcon } from "../atoms/CategoryIcon"; import Link from "../atoms/Link"; @@ -13,14 +15,16 @@ import { ThemeTag } from "../atoms/ThemeTag"; export default function DatabaseCard({ name, - categories = [], + themes = [], organization, tags = [], tables, rawDataSources, informationRequests, link, + locale, }) { + const { t } = useTranslation('dataset'); const databaseInfo = [] if(tables.number > 0) { @@ -37,20 +41,23 @@ export default function DatabaseCard({ 0 ? "pointer" : "default"} - _hover={tables?.number === undefined ||tables?.number > 0 && {opacity : "0.7"}} - color={tables?.number === undefined || tables?.number === 0? "#C4C4C4" : "#2B8C4D"} + _hover={tables?.number === undefined || tables?.number > 0 ? {opacity : "0.7"} : undefined} > - 0 ? `${link}?table=${tables?.id}` : ""} target="_blank" - style={{display: "flex"}} + display="flex" + fontFamily="Ubuntu" + fontSize="14px" + letterSpacing="0.3px" + fontWeight="700" + color={tables?.number === undefined || tables?.number === 0 ? "#C4C4C4" : "#2B8C4D"} > - {tables?.number === 1 ? - "1 tabela tratada" - : - `${tables?.number || 0} tabelas tratadas` - } - + {tables?.number === 1 ? + t('datasetCard.oneTable') : + t('datasetCard.multipleTables', { count: tables?.number || 0 }) + } +
) @@ -59,22 +66,22 @@ export default function DatabaseCard({ if (rawDataSources.number > 0) { databaseInfo.push( rawDataSources.number === 1 ? - "1 fonte original" : - `${rawDataSources.number} fontes originais` + t('datasetCard.oneRawDataSource') : + t('datasetCard.multipleRawDataSources', { count: rawDataSources.number }) ) } if (informationRequests.number > 0) { databaseInfo.push( informationRequests.number === 1 ? - "1 pedido LAI" : - `${informationRequests.number} pedidos LAI` + t('datasetCard.oneInformationRequest') : + t('datasetCard.multipleInformationRequests', { count: informationRequests.number }) ) } return ( ( + icons={themes.length !== 0 && [ + ...themes.slice(0,6).map((c,i) => ( @@ -139,7 +146,9 @@ export default function DatabaseCard({ fontSize="12px" fontWeight="400" color="#6F6F6F" - >{organization.name} + > + {organization[`name${capitalize(locale)}`] || organization.name || organization.slug} + @@ -150,13 +159,13 @@ export default function DatabaseCard({ {tags.length !== 0 && tags.slice(0,3).map((t, i) => ( ))} @@ -190,7 +199,7 @@ export default function DatabaseCard({ cursor={databaseInfo[1] && "pointer"} _hover={databaseInfo[1] && {opacity : "0.7"}} > - {databaseInfo[1] ? databaseInfo[1] : "0 fontes originais"} + {databaseInfo[1] ? databaseInfo[1] : t('datasetCard.noRawDataSources')} - {databaseInfo[2] ? databaseInfo[2] : "0 pedidos LAI"} + {databaseInfo[2] ? databaseInfo[2] : t('datasetCard.noInformationRequests')} diff --git a/next/components/organisms/DatasetResource.js b/next/components/organisms/DatasetResource.js index 4a0fe163..573c5511 100644 --- a/next/components/organisms/DatasetResource.js +++ b/next/components/organisms/DatasetResource.js @@ -15,8 +15,10 @@ import { } from "@chakra-ui/react"; import { useRef, useEffect, useState } from "react"; import { useRouter } from "next/router"; +import { useTranslation } from 'next-i18next'; +import { capitalize } from 'lodash'; -import BdmTablePage from "./BdmTablePage"; +import TablePage from "./TablePage"; import RawDataSourcesPage from "./RawDataSourcesPage"; import InformationRequestPage from "./InformationRequestPage"; @@ -26,10 +28,11 @@ export default function DatasetResource({ dataset }) { const router = useRouter() - const { query } = router + const { query, locale } = router const [tables, setTables] = useState([]) const [rawDataSources, setRawDataSources] = useState([]) const [informationRequests, setInformationRequests] = useState([]) + const { t } = useTranslation('dataset'); const displayScreen = useBreakpointValue({ base: "mobile", lg: "desktop" }) const pushQuery = (key, value) => { @@ -52,24 +55,23 @@ export default function DatasetResource({ } useEffect(() => { - // Id do dataset do SAEB - let dataset_tables = [] - if(dataset?._id === "e083c9a2-1cee-4342-bedc-535cbad6f3cd") { - dataset_tables = dataset?.tables?.edges.map((elm) => elm.node) - .filter((elm) => elm?.status?.slug !== "under_review").sort(sortElements) || [] - } else { - dataset_tables = dataset?.tables?.edges.map((elm) => elm.node) - .filter((elm) => elm?.status?.slug !== "under_review") - .filter((elm) => elm?.slug !== "dicionario") - .filter((elm) => elm?.slug !== "dictionary").sort(sortElements) || [] - } - const raw_data_sources = dataset?.rawDataSources?.edges.map((elm) => elm.node).filter((elm) => elm?.status?.slug !== "under_review").sort(sortElements) || [] - const information_request = dataset?.informationRequests?.edges.map((elm) => elm.node).filter((elm) => elm?.status?.slug !== "under_review").sort(sortElements) || [] + let dataset_tables = Object.values(dataset?.tables || {}) + .filter((elm) => elm?.status?.slug !== "under_review") + .filter((elm) => elm?.slug !== "dicionario" && elm?.slug !== "dictionary") + .sort(sortElements); + + let raw_data_sources = Object.values(dataset?.rawDataSources || {}) + .filter((elm) => elm?.status?.slug !== "under_review") + .sort(sortElements); - setTables(dataset_tables) - setRawDataSources(raw_data_sources) - setInformationRequests(information_request) + let information_request = Object.values(dataset?.informationRequests || {}) + .filter((elm) => elm?.status?.slug !== "under_review") + .sort(sortElements); + + setTables(dataset_tables); + setRawDataSources(raw_data_sources); + setInformationRequests(information_request); const queryParams = new URLSearchParams(window.location.search) @@ -81,8 +83,8 @@ export default function DatasetResource({ }, [dataset]) function SwitchResource ({route}) { - if (route.hasOwnProperty("table")) return - if (route.hasOwnProperty("raw_data_source")) return + if (route.hasOwnProperty("table")) return + if (route.hasOwnProperty("raw_data_source")) return if (route.hasOwnProperty("information_request")) return return null } @@ -146,7 +148,7 @@ export default function DatasetResource({ borderRadius="10px" /> onChange(elm._id)} > - {elm.name || elm.number} + {elm[`name${capitalize(locale)}`] || elm.name || elm.number} @@ -382,7 +384,7 @@ export default function DatasetResource({ spacing={0} > { @@ -392,7 +394,7 @@ export default function DatasetResource({ /> { @@ -402,7 +404,7 @@ export default function DatasetResource({ /> { @@ -411,7 +413,7 @@ export default function DatasetResource({ hasDivider={tables.length > 0 || rawDataSources.length > 0 ? true : false} /> - : + : } diff --git a/next/components/organisms/InformationRequestPage.js b/next/components/organisms/InformationRequestPage.js index 87edd540..6b78a987 100644 --- a/next/components/organisms/InformationRequestPage.js +++ b/next/components/organisms/InformationRequestPage.js @@ -7,24 +7,29 @@ import { Divider } from "@chakra-ui/react"; import { useEffect, useState } from "react"; +import { useTranslation } from 'next-i18next'; +import { useRouter } from 'next/router'; +import { capitalize } from "lodash"; import ReadMore from "../atoms/ReadMore"; -import { TemporalCoverage } from "../molecules/TemporalCoverageDisplay"; import { AlertDiscalimerBox } from "../molecules/DisclaimerBox"; import FourOFour from "../templates/404"; import RedirectIcon from "../../public/img/icons/redirectIcon"; export default function InformationRequestPage({ id }) { + const { t } = useTranslation('dataset'); + const router = useRouter(); + const { locale } = router; const [isLoading, setIsLoading] = useState(true) const [resource, setResource] = useState({}) const [isError, setIsError] = useState(false) useEffect(() => { - const featchInformationRequest = async () => { + const fetchInformationRequest = async () => { setIsLoading(true) - try { - const response = await fetch(`/api/datasets/getInformationRequest?p=${id}`, { method: "GET" }) + const url = `/api/datasets/getInformationRequest?id=${id}&locale=${locale}`; + const response = await fetch(url, { method: "GET" }) const result = await response.json() if (result.success) { @@ -42,9 +47,8 @@ export default function InformationRequestPage({ id }) { } } - featchInformationRequest() - },[id]) - + fetchInformationRequest() + }, [id, locale]) const AddInfoTextBase = ({ title, text, ...props }) => { return ( @@ -74,7 +78,7 @@ export default function InformationRequestPage({ id }) { fontSize="14px" lineHeight="20px" color="#464A51" - >{text || "Não informado"} + >{text || t('informationRequest.notProvided')} ) } @@ -121,7 +125,7 @@ export default function InformationRequestPage({ id }) { textOverflow="ellipsis" whiteSpace="nowrap" > - Número do pedido: {resource?.number} + {t('informationRequest.requestNumber', { number: resource?.number })} @@ -131,7 +135,7 @@ export default function InformationRequestPage({ id }) { marginTop="8px !important" > - Estes dados não passaram pela metodologia de tratamento da Base dos Dados. + {t('informationRequest.disclaimer')} @@ -167,7 +171,7 @@ export default function InformationRequestPage({ id }) { backgroundColor: resource?.dataUrl ? "#22703E" : "#ACAEB1" }} > - Acessar dados + {t('informationRequest.accessData')} - Acessar pedido + {t('informationRequest.accessRequest')} - Descrição + {t('informationRequest.description')} @@ -231,7 +235,7 @@ export default function InformationRequestPage({ id }) { isLoaded={!isLoading} > - {resource?.observations || "Não informado"} + {resource?.[`observations${capitalize(locale)}`] || resource?.observations || t('informationRequest.notProvided')} @@ -246,12 +250,12 @@ export default function InformationRequestPage({ id }) { lineHeight="20px" color="#252A32" > - Informações adicionais + {t('informationRequest.additionalInformation')} diff --git a/next/components/organisms/RawDataSourcesPage.js b/next/components/organisms/RawDataSourcesPage.js index a97243cb..30817cf6 100644 --- a/next/components/organisms/RawDataSourcesPage.js +++ b/next/components/organisms/RawDataSourcesPage.js @@ -8,10 +8,12 @@ import { Divider } from "@chakra-ui/react"; import { useState, useEffect } from "react"; +import { useTranslation } from 'next-i18next'; +import { useRouter } from 'next/router'; +import { capitalize } from "lodash"; import ReadMore from "../atoms/ReadMore"; import ObservationLevel from "../atoms/ObservationLevelTable"; -import { TemporalCoverage } from "../molecules/TemporalCoverageDisplay"; import { AlertDiscalimerBox } from "../molecules/DisclaimerBox"; import FourOFour from "../templates/404"; @@ -19,15 +21,19 @@ import RedirectIcon from "../../public/img/icons/redirectIcon" import InfoIcon from "../../public/img/icons/infoIcon"; export default function RawDataSourcesPage({ id }) { + const { t } = useTranslation('dataset'); + const router = useRouter(); + const { locale } = router; const [isLoading, setIsLoading] = useState(true) const [resource, setResource] = useState({}) const [isError, setIsError] = useState(false) useEffect(() => { - const featchRawDataSources = async () => { + const fetchRawDataSources = async () => { setIsLoading(true) try { - const response = await fetch(`/api/datasets/getRawDataSources?p=${id}`, { method: "GET" }) + const url = `/api/datasets/getRawDataSource?id=${id}&locale=${locale}`; + const response = await fetch(url, { method: "GET" }) const result = await response.json() if (result.success) { @@ -45,11 +51,11 @@ export default function RawDataSourcesPage({ id }) { } } - featchRawDataSources() - },[id]) + fetchRawDataSources() + }, [id, locale]) const ObjectValues = (value) => { - if(value === undefined || Object.keys(value).length === 0) return "Não informado" + if(value === undefined || Object.keys(value).length === 0) return t('rawDataSource.notProvided') const array = [] @@ -57,32 +63,32 @@ export default function RawDataSourcesPage({ id }) { array.push(elm.name) }) - if(array.length === 0) return "Não informado" + if(array.length === 0) return t('rawDataSource.notProvided') return array.join(", ").toString() } const TrueOrFalse = (value) => { switch (value) { case true: - return "Sim" + return t('rawDataSource.yes') break; case false: - return "Não" + return t('rawDataSource.no') break; default: - return "Não informado" + return t('rawDataSource.notProvided') break; } } const UpdateFrequency = () => { const value = resource?.updates?.[0] - if(value === undefined || Object.keys(value).length === 0) return "Não informado" + if(value === undefined || Object.keys(value).length === 0) return t('rawDataSource.notProvided') if(value?.frequency >= 0 && value?.entity?.name) return `${value.frequency} ${value.entity.name}` if(value?.entity?.name) return `${value.entity.name}` - return "Não informado" + return t('rawDataSource.notProvided') } const TooltipText = ({ text, info, ...props }) => { @@ -174,7 +180,7 @@ export default function RawDataSourcesPage({ id }) { fontSize="14px" lineHeight="20px" color="#464A51" - >{text || "Não informado"} + >{text || t('rawDataSource.notProvided')} ) } @@ -215,7 +221,7 @@ export default function RawDataSourcesPage({ id }) { marginTop="8px !important" > - Estes dados não passaram pela metodologia de tratamento da Base dos Dados. + {t('rawDataSource.rawDataDisclaimer')} @@ -248,7 +254,7 @@ export default function RawDataSourcesPage({ id }) { backgroundColor: resource?.url ? "#22703E" : "#ACAEB1" }} > - Acessar fonte original + {t('rawDataSource.accessOriginalSource')} - Descrição + {t('rawDataSource.description')} @@ -282,7 +288,7 @@ export default function RawDataSourcesPage({ id }) { isLoaded={!isLoading} > - {resource?.description || "Não informado"} + {resource?.[`description${capitalize(locale)}`] || resource?.description || t('rawDataSource.notProvided')} @@ -297,40 +303,40 @@ export default function RawDataSourcesPage({ id }) { lineHeight="20px" color="#252A32" > - Informações adicionais + {t('rawDataSource.additionalInfo')} @@ -353,24 +359,24 @@ export default function RawDataSourcesPage({ id }) { lineHeight="20px" color="#464A51" > - Não informado + {t('rawDataSource.notProvided')} } diff --git a/next/components/organisms/BdmTablePage.js b/next/components/organisms/TablePage.js similarity index 84% rename from next/components/organisms/BdmTablePage.js rename to next/components/organisms/TablePage.js index a2a9374c..c5057c0e 100644 --- a/next/components/organisms/BdmTablePage.js +++ b/next/components/organisms/TablePage.js @@ -9,6 +9,9 @@ import { Tooltip, } from "@chakra-ui/react"; import { useState, useEffect } from "react"; +import { useTranslation } from 'next-i18next'; +import { useRouter } from 'next/router'; +import { capitalize } from 'lodash'; import ReadMore from "../atoms/ReadMore"; import { formatBytes } from "../../utils"; import ObservationLevel from "../atoms/ObservationLevelTable"; @@ -24,7 +27,10 @@ import InfoIcon from "../../public/img/icons/infoIcon"; import DownloadIcon from "../../public/img/icons/downloadIcon"; import RedirectIcon from "../../public/img/icons/redirectIcon"; -export default function BdmTablePage({ id }) { +export default function TablePage({ id }) { + const { t } = useTranslation('dataset'); + const router = useRouter(); + const { locale } = router; const [isLoading, setIsLoading] = useState(true) const [resource, setResource] = useState({}) const [isError, setIsError] = useState(false) @@ -33,7 +39,7 @@ export default function BdmTablePage({ id }) { const fetchData = async () => { setIsLoading(true) try { - const response = await fetch(`/api/tables/getBdmTable?p=${id}`, { method: "GET" }) + const response = await fetch(`/api/tables/getTable?id=${id}&locale=${locale}`, { method: "GET" }) const result = await response.json() if (result.success) { @@ -52,7 +58,7 @@ export default function BdmTablePage({ id }) { } fetchData() - }, [id]) + }, [id, locale]) const TooltipText = ({ text, info, ...props }) => { return ( @@ -159,7 +165,7 @@ export default function BdmTablePage({ id }) { lineHeight="20px" color="#464A51" > - Não informado + {t('table.notProvided')} } {resource?.email && } @@ -196,33 +202,33 @@ export default function BdmTablePage({ id }) { let formats {yearFrequency ? formats = { - "second":`Atualização a cada ${frequency} segundos`, - "minute":`Atualização a cada ${frequency} minutos`, - "hour":`Atualização a cada ${frequency} horas`, - "day":`Atualização a cada ${frequency} dias`, - "week":`Atualização a cada ${frequency} semanas`, - "month":`Atualização a cada ${frequency} meses`, - "bimester":`Atualização a cada ${frequency} bimestres`, - "quarter":`Atualização a cada ${frequency} trimestres`, - "semester":`Atualização a cada ${frequency} semestres`, - "year":`Atualização a cada ${frequency} anos`, + "second":`${t('table.updateEvery')} ${frequency} ${t('table.seconds')}`, + "minute":`${t('table.updateEvery')} ${frequency} ${t('table.minutes')}`, + "hour":`${t('table.updateEvery')} ${frequency} ${t('table.hours')}`, + "day":`${t('table.updateEvery')} ${frequency} ${t('table.days')}`, + "week":`${t('table.updateEvery')} ${frequency} ${t('table.weeks')}`, + "month":`${t('table.updateEvery')} ${frequency} ${t('table.months')}`, + "bimester":`${t('table.updateEvery')} ${frequency} ${t('table.bimonths')}`, + "quarter":`${t('table.updateEvery')} ${frequency} ${t('table.quarters')}`, + "semester":`${t('table.updateEvery')} ${frequency} ${t('table.semesters')}`, + "year":`${t('table.updateEvery')} ${frequency} ${t('table.years')}`, } : formats = { - "second":"Atualização por segundo", - "minute":"Atualização por minuto", - "hour":"Atualização por hora", - "day":"Atualização diária", - "week":"Atualização semanal", - "month":"Atualização mensal", - "bimester":"Atualização bimestral", - "quarter":"Atualização trimestral", - "semester":"Atualização semestral", - "year":"Atualização anual", + "second":t('table.updatePerSecond'), + "minute":t('table.updatePerMinute'), + "hour":t('table.updatePerHour'), + "day":t('table.dailyUpdate'), + "week":t('table.weeklyUpdate'), + "month":t('table.monthlyUpdate'), + "bimester":t('table.bimonthlyUpdate'), + "quarter":t('table.quarterlyUpdate'), + "semester":t('table.semiannualUpdate'), + "year":t('table.annualUpdate'), } } - return formats[value] ? formats[value] : "Atualização não definida" + return formats[value] ? formats[value] : t('table.updateNotDefined') } if(isError) return @@ -251,7 +257,7 @@ export default function BdmTablePage({ id }) { textOverflow="ellipsis" whiteSpace={{base: "normal", lg:"nowrap"}} > - {resource?.name} + {resource?.[`name${capitalize(locale)}`] || resource?.name} {resource?.uncompressedFileSize && - {resource?.description || "Não informado"} + {resource?.[`description${capitalize(locale)}`] || resource?.description || t('table.notProvided')} @@ -293,7 +299,7 @@ export default function BdmTablePage({ id }) { lineHeight="20px" color="#252A32" > - Cobertura temporal da tabela + {t('table.temporalCoverage')} @@ -314,7 +320,7 @@ export default function BdmTablePage({ id }) { lineHeight="20px" color="#252A32" > - Acesso aos dados + {t('table.dataAccess')} @@ -332,7 +338,7 @@ export default function BdmTablePage({ id }) { lineHeight="20px" color="#252A32" > - Frequência de atualização dos dados + {t('table.dataUpdateFrequency')} @@ -361,13 +367,8 @@ export default function BdmTablePage({ id }) { {resource?.updates?.[0]?.latest ? `${formatDate(resource.updates[0].latest)}:` : - "Não informado:" - } - - - Última vez que atualizamos na BD - - + t('table.notProvided') + }: {t('table.lastUpdateBD')} {resource?.updates?.[0]?.frequency && - Sem previsão de atualização + {t('table.noUpdateScheduled')} } @@ -418,13 +419,8 @@ export default function BdmTablePage({ id }) { {resource?.rawDataSource?.[0]?.updates?.[0]?.latest ? `${formatDate(resource.rawDataSource[0].updates[0].latest)}:` : - "Não informado:" - } - - - Última vez que atualizaram na fonte original - - + t('table.notProvided') + }: {t('table.lastUpdateRawDataSource')} {resource?.rawDataSource?.[0]?.updates?.[0]?.frequency ? - Sem previsão de atualização + {t('table.noUpdateScheduled')} : <> @@ -476,11 +472,8 @@ export default function BdmTablePage({ id }) { {resource?.rawDataSource?.[0]?.polls?.[0]?.latest ? `${formatDate(resource.rawDataSource[0].polls[0].latest)}:` : - "Não informado:" - } - - Última vez que verificamos a fonte original - + t('table.notProvided') + }: {t('table.lastCheckRawDataSource')} @@ -494,7 +487,7 @@ export default function BdmTablePage({ id }) { lineHeight="20px" color="#252A32" > - ID do BigQuery + {t('table.bigQueryID')} @@ -526,7 +519,7 @@ export default function BdmTablePage({ id }) { }} > {!resource?.cloudTables ? - "Não informado" + t('table.notProvided') : resource?.cloudTables?.[0]?.gcpProjectId+"."+resource?.cloudTables?.[0]?.gcpDatasetId+"."+resource?.cloudTables?.[0]?.gcpTableId } @@ -543,8 +536,8 @@ export default function BdmTablePage({ id }) { - {resource?.partitions ? resource.partitions :"Não informado"} + {resource?.partitions ? resource.partitions : t('table.notProvided')} @@ -567,8 +560,8 @@ export default function BdmTablePage({ id }) { @@ -590,7 +583,7 @@ export default function BdmTablePage({ id }) { lineHeight="20px" color="#464A51" > - Não informado + {t('table.notProvided')} } @@ -599,8 +592,8 @@ export default function BdmTablePage({ id }) { - Download dos arquivos + {t('table.downloadFiles')} : - "Não informado" + t('table.notProvided') } @@ -650,8 +643,8 @@ export default function BdmTablePage({ id }) { @@ -690,12 +683,12 @@ export default function BdmTablePage({ id }) { }} href={`/dataset/${elm?.dataset?._id}?raw_data_source=${elm?._id}`} > - {elm?.name} + {elm?.[`name${capitalize(locale)}`] || elm?.name} ) }) : - "Não informado" + t('table.notProvided') } @@ -711,7 +704,7 @@ export default function BdmTablePage({ id }) { lineHeight="20px" color="#252A32" > - Informações adicionais + {t('table.additionalInformation')} @@ -733,9 +726,9 @@ export default function BdmTablePage({ id }) { fontSize="14px" lineHeight="20px" color="#252A32" - >Publicação por + >{t('table.publishedBy')} @@ -757,9 +750,9 @@ export default function BdmTablePage({ id }) { fontSize="14px" lineHeight="20px" color="#252A32" - >Tratamento por + >{t('table.dataCleanedBy')} @@ -781,14 +774,14 @@ export default function BdmTablePage({ id }) { fontSize="14px" lineHeight="20px" color="#252A32" - >Versão + >{t('table.version')} {resource?.version || "Não informado"} + >{resource?.version || t('table.notProvided')} ) diff --git a/next/components/templates/main.js b/next/components/templates/main.js index b0ce3a54..e15907cb 100644 --- a/next/components/templates/main.js +++ b/next/components/templates/main.js @@ -9,6 +9,7 @@ export function MainPageTemplate({ cleanTemplate = false, userTemplate = false, footerTemplate = "default", + locale, ...style }) { diff --git a/next/content/privacyPolicy.js b/next/content/privacyPolicy.js index 72f5363c..2cc536c8 100644 --- a/next/content/privacyPolicy.js +++ b/next/content/privacyPolicy.js @@ -3,13 +3,14 @@ import { VStack, Stack, Box, - Text } from "@chakra-ui/react"; import BodyText from "../components/atoms/BodyText"; import SectionText from "../components/atoms/SectionText"; import { SimpleTable } from "../components/atoms/SimpleTable"; +import { useTranslation } from 'react-i18next'; export default function PrivacyPolicy() { + const { t } = useTranslation('terms'); const TitleText = ({ children, ...props }) => { return ( - Base dos Dados ("Nós", "Nosso" ou "Nossos"). Comprometemo-nos a proteger e respeitar sua privacidade e cumprir todas as obrigações estabelecidas na Lei Geral de Proteção de Dados ("LGPD"). - Esta Política de Privacidade descreve como coletamos, usamos, compartilhamos e protegemos suas informações pessoais. Ao acessar ou usar nossos serviços, você concorda com os termos e práticas descritos nesta Política de Privacidade. + {t('PP.header.subContent1')} + {t('PP.header.subContent2')} - 1. Informações que Coletamos + {t('PP.term1.title')} - 1.1. Coletamos informações pessoais que você nos fornece diretamente ao usar nossos serviços. Isso pode incluir seu nome, endereço de e-mail, informações de pagamento e outras informações que você escolher compartilhar conosco. - 1.2. Também coletamos informações de forma automática, incluindo dados de uso, endereço IP, tipo de navegador, e informações sobre o dispositivo que você usa para acessar nossos serviços. + {t('PP.term1.subContent1')} + {t('PP.term1.subContent2')} @@ -76,10 +77,10 @@ export default function PrivacyPolicy() { alignItems="start" gap="8px" > - 2. Uso das Informações + {t('PP.term2.title')} - 2.1. Utilizamos suas informações pessoais para fornecer e melhorar nossos serviços, incluindo o processamento de pagamentos, o fornecimento de suporte ao cliente e a personalização da experiência do usuário. - 2.2. Não venderemos, alugaremos ou compartilharemos suas informações pessoais com terceiros não afiliados sem o seu consentimento explícito. + {t('PP.term2.subContent1')} + {t('PP.term2.subContent2')} @@ -90,7 +91,7 @@ export default function PrivacyPolicy() { alignItems="start" gap="8px" > - 3. Cookies e Tecnologias Semelhantes + {t('PP.term3.title')} - 3.1. Cookies são pedaços de dados que ajudam o site a lembrar suas preferências e tornar a navegação mais eficiente. - 3.2. Esses cookies são necessários para garantir o funcionamento adequado do site, melhorar o desempenho e personalizar a experiência de navegação, como idioma e região. - 3.3. Cookies usados: + {t('PP.term3.subContent1')} + {t('PP.term3.subContent2')} - 3.4. Ao continuar a usar nosso site, você concorda com o uso desses cookies. Se preferir não usá-los, recomendamos que ajuste as configurações do seu navegador. No entanto, isso afetará sua capacidade de fazer login e acessar áreas restritas. - Se tiver alguma dúvida sobre esses cookies ou qualquer outra questão de privacidade, entre em contato conosco através do endereço de e-mail contato@basedosdados.org. + {t('PP.term3.subContent4')} + {t('PP.term3.subContent5')} @@ -136,8 +141,8 @@ export default function PrivacyPolicy() { alignItems="start" gap="8px" > - 4. Segurança das Informações - 4.1. Implementamos medidas de segurança técnicas e organizacionais para proteger suas informações pessoais contra acesso não autorizado e uso indevido. + {t('PP.term4.title')} + {t('PP.term4.subContent1')} - 5. Seus Direitos - 5.1. De acordo com a LGPD, você tem direito de acessar, retificar, excluir ou portar seus dados pessoais. Se você deseja exercer esses direitos ou tiver alguma dúvida sobre como suas informações estão sendo tratadas, entre em contato conosco através do endereço de e-mail contato@basedosdados.org. + {t('PP.term5.title')} + {t('PP.term5.subContent1')} - 6. Alterações nesta Política de Privacidade - 6.1. Reservamo-nos o direito de atualizar esta Política de Privacidade periodicamente. As alterações serão publicadas em nosso site, e a data da última atualização será revisada. Recomendamos que você revise esta Política regularmente para se manter informado sobre nossas práticas de privacidade. + {t('PP.term6.title')} + {t('PP.term6.subContent1')} - 7. Contato - 7.1. Para quaisquer perguntas ou preocupações relacionadas à nossa Política de Privacidade, entre em contato conosco através do endereço de e-mail contato@basedosdados.org. + {t('PP.term7.title')} + {t('PP.term7.subContent1')} - Esta Política de Privacidade foi elaborada de acordo com as disposições da LGPD e visa garantir que suas informações pessoais sejam tratadas com o devido respeito e cuidado. + {t('PP.finalNote')} ) } \ No newline at end of file diff --git a/next/content/serviceTerms.js b/next/content/serviceTerms.js index a4e774bc..397a75d2 100644 --- a/next/content/serviceTerms.js +++ b/next/content/serviceTerms.js @@ -5,8 +5,10 @@ import { } from "@chakra-ui/react"; import BodyText from "../components/atoms/BodyText"; import SectionText from "../components/atoms/SectionText"; +import { useTranslation } from 'next-i18next'; export default function ServiceTerms() { + const { t } = useTranslation('terms'); const TitleText = ({ children, ...props }) => { return ( - 1. Aceitação dos Termos - Ao acessar ou usar os serviços oferecidos pela Base dos Dados ("Nós", "Nosso" ou "Nossos"), você concorda em cumprir e aceitar estes Termos de Serviço. Se você não concordar com todos os termos e condições deste acordo, não poderá utilizar nossos serviços. + {t('ToS.term1.title')} + {t('ToS.term1.content')} - 2. Descrição do Serviço - 2.1. Nossos serviços consistem em uma assinatura mensal que concede aos seus assinantes o acesso a diversos dados exclusivos, harmonizados e atualizados na plataforma da Base dos Dados. O acesso se dá via os pacotes Python ou R da Base dos Dados, ou via BigQuery, serviço de armazenamento de dados de baixo custo e totalmente gerenciado do Google para análises. + {t('ToS.term2.title')} + {t('ToS.term2.content')} - 3. Pagamento e Assinaturas + {t('ToS.term3.title')} - 3.1. Ao fazer a assinatura, você concorda em pagar a taxa mensal especificada. O pagamento será processado automaticamente a cada mês, a menos que você cancele sua assinatura antes da data de renovação, devidamente explicita na contratação do serviço. - 3.2. Ao fazer a assinatura, você concorda que seus dados sejam utilizados na criação e manutenção de usuários na plataforma de pagamentos Stripe. - 3.3. Os preços e os métodos de pagamento estão sujeitos a alterações a critério exclusivo da Base dos Dados. As alterações de preço ou de métodos de pagamento serão notificadas com antecedência. + {t('ToS.term3.subContent1')} + {t('ToS.term3.subContent2')} + {t('ToS.term3.subContent3')} @@ -85,8 +87,8 @@ export default function ServiceTerms() { alignItems="start" gap="8px" > - 4. Cancelamento e Reembolso - 4.1. Você pode cancelar sua assinatura a qualquer momento através das opções disponíveis em sua conta. No entanto, não serão fornecidos reembolsos ou créditos por períodos em que a assinatura não foi utilizada. + {t('ToS.term4.title')} + {t('ToS.term4.content')} - 5. Uso Responsável - 5.1. Você concorda em usar nossos serviços de forma responsável e em conformidade com todas as leis e regulamentos aplicáveis. + {t('ToS.term5.title')} + {t('ToS.term5.content')} - 6. Propriedade Intelectual - 6.1. Todos os direitos de propriedade intelectual relacionados aos dados fornecidos são de propriedade de terceiros e estão sujeitos às suas respectivas políticas de uso. + {t('ToS.term6.title')} + {t('ToS.term6.content')} - 7. Privacidade - 7.1. O uso de seus dados pessoais é regido por nossa Política de Privacidade. Ao usar nossos serviços, você concorda com a coleta e o uso de suas informações conforme descrito em nossa Política de Privacidade. + {t('ToS.term7.title')} + {t('ToS.term7.content')} - 8. Rescisão - 8.1. Reservamo-nos o direito de encerrar ou suspender sua conta a qualquer momento, por qualquer motivo, sem aviso prévio. + {t('ToS.term8.title')} + {t('ToS.term8.content')} - 9. Limitação de Responsabilidade - 9.1. Em nenhuma circunstância seremos responsáveis por danos diretos, indiretos, especiais, incidentais ou consequentes decorrentes do uso ou da incapacidade de usar nossos serviços. + {t('ToS.term9.title')} + {t('ToS.term9.content')} - 10. Alterações nos Termos de Serviço - 10.1. Reservamo-nos o direito de modificar estes Termos de Serviço a qualquer momento. As alterações serão efetivas após a publicação das versões atualizadas em nosso site. + {t('ToS.term10.title')} + {t('ToS.term10.content')} - 11. Lei Aplicável e Jurisdição - 11.1. Estes Termos de Serviço serão regidos e interpretados de acordo com as leis do Brasil. Qualquer disputa relacionada a estes termos estará sujeita à jurisdição exclusiva dos tribunais do Rio de Janeiro, RJ, Brasil. + {t('ToS.term11.title')} + {t('ToS.term11.content')} - 12. Contato - 12.1. Para entrar em contato conosco com perguntas ou preocupações relacionadas a estes Termos de Serviço, por favor, envie um e-mail para suporte.bdpro@basedosdados.org. + {t('ToS.term12.title')} + {t('ToS.term12.content')} - Ao utilizar nossos serviços, você concorda com todos os termos e condições estabelecidos neste acordo. Por favor, leia estes termos atentamente antes de prosseguir. + {t('ToS.finalNote')} ) } \ No newline at end of file diff --git a/next/next-i18next.config.js b/next/next-i18next.config.js new file mode 100644 index 00000000..3e655990 --- /dev/null +++ b/next/next-i18next.config.js @@ -0,0 +1,7 @@ +module.exports = { + i18n: { + locales: ['pt', 'en', 'es'], + defaultLocale: 'pt', + localeDetection: false + }, +} \ No newline at end of file diff --git a/next/next.config.js b/next/next.config.js index 925123f3..21d313bd 100644 --- a/next/next.config.js +++ b/next/next.config.js @@ -1,4 +1,9 @@ module.exports = { + i18n: { + locales: ['pt', 'en', 'es'], + defaultLocale: 'pt', + localeDetection: false + }, images: { unoptimized: true, disableStaticImages: true, diff --git a/next/package.json b/next/package.json index 082fab59..c815a250 100644 --- a/next/package.json +++ b/next/package.json @@ -22,11 +22,15 @@ "framer-motion": "^4.1.17", "fuzzy-search": "^3.2.1", "highlight.js": "^11.9.0", + "i18next": "^23.15.1", "js-cookie": "^3.0.5", + "lodash": "^4.17.21", "next": "^12.3.4", + "next-i18next": "^15.3.1", "next-logger": "4.0.0", "react": "^17.0.2", "react-dom": "^17.0.2", + "react-i18next": "^15.0.1", "react-image-crop": "^11.0.4", "react-latex-next": "^2.2.0", "react-paginate": "^8.2.0", diff --git a/next/pages/_app.js b/next/pages/_app.js index d42f03eb..fb444884 100644 --- a/next/pages/_app.js +++ b/next/pages/_app.js @@ -1,3 +1,5 @@ +import { appWithTranslation } from 'next-i18next'; +import { useRouter } from 'next/router'; import { ChakraProvider } from "@chakra-ui/react"; import { QueryClient, QueryClientProvider } from "react-query"; import Head from "next/head"; @@ -5,6 +7,9 @@ import themeBD from "../styles/themeBD"; import "../styles/globals.css"; function MyApp({ Component, pageProps }) { + const router = useRouter(); + const { locale } = router; + const queryClient = new QueryClient({ cacheTime: 0, }); @@ -95,7 +100,7 @@ function MyApp({ Component, pageProps }) { - + {/**/} @@ -130,4 +135,4 @@ function MyApp({ Component, pageProps }) { ); } -export default MyApp; +export default appWithTranslation(MyApp); diff --git a/next/pages/api/datasets/getInformationRequest.js b/next/pages/api/datasets/getInformationRequest.js index 819cebb9..6bd4ec1f 100644 --- a/next/pages/api/datasets/getInformationRequest.js +++ b/next/pages/api/datasets/getInformationRequest.js @@ -1,9 +1,10 @@ import axios from "axios"; import { cleanGraphQLResponse } from "../../../utils"; +import { capitalize } from 'lodash'; const API_URL= `${process.env.NEXT_PUBLIC_API_URL}/api/v1/graphql` -async function getInformationRequest(id) { +async function getInformationRequest(id, locale = 'pt') { try { const res = await axios({ url: API_URL, @@ -19,6 +20,7 @@ async function getInformationRequest(id) { url dataUrl observations + observations${capitalize(locale)} updates { edges { node { @@ -29,10 +31,7 @@ async function getInformationRequest(id) { entity { _id name - category { - _id - name - } + name${capitalize(locale)} } } } @@ -40,6 +39,7 @@ async function getInformationRequest(id) { status { _id name + name${capitalize(locale)} } } } @@ -58,10 +58,11 @@ async function getInformationRequest(id) { } export default async function handler(req, res) { - const result = await getInformationRequest(req.query.p) + const { id: id, locale } = req.query; + const result = await getInformationRequest(id, locale); if(result.errors) return res.status(500).json({error: result.errors, success: false}) if(result === "err") return res.status(500).json({error: "err", success: false}) return res.status(200).json({resource: cleanGraphQLResponse(result?.data?.allInformationrequest?.edges[0]?.node), success: true}) -} +} \ No newline at end of file diff --git a/next/pages/api/datasets/getRawDataSources.js b/next/pages/api/datasets/getRawDataSource.js similarity index 82% rename from next/pages/api/datasets/getRawDataSources.js rename to next/pages/api/datasets/getRawDataSource.js index ae69b459..20d81eb1 100644 --- a/next/pages/api/datasets/getRawDataSources.js +++ b/next/pages/api/datasets/getRawDataSource.js @@ -1,9 +1,10 @@ import axios from "axios"; import { cleanGraphQLResponse } from "../../../utils"; +import { capitalize } from 'lodash'; -const API_URL= `${process.env.NEXT_PUBLIC_API_URL}/api/v1/graphql` +const API_URL = `${process.env.NEXT_PUBLIC_API_URL}/api/v1/graphql`; -async function getRawDataSources(id) { +async function getRawDataSource(id, locale = 'pt') { try { const res = await axios({ url: API_URL, @@ -16,19 +17,23 @@ async function getRawDataSources(id) { node { _id name + name${capitalize(locale)} description + description${capitalize(locale)} url languages { edges { node { _id name + name${capitalize(locale)} } } } availability { _id name + name${capitalize(locale)} } containsStructuredData containsApi @@ -83,6 +88,7 @@ async function getRawDataSources(id) { _id url name + name${capitalize(locale)} } coverages { edges { @@ -91,6 +97,7 @@ async function getRawDataSources(id) { area { _id name + name${capitalize(locale)} } } } @@ -102,17 +109,18 @@ async function getRawDataSources(id) { `, variables: null } - }) - const data = res.data - return data + }); + const data = res.data; + return data; } catch (error) { - console.error(error) - return "err" + console.error(error); + return "err"; } } export default async function handler(req, res) { - const result = await getRawDataSources(req.query.p) + const { id: id, locale } = req.query; + const result = await getRawDataSource(id, locale); if(result.errors) return res.status(500).json({error: result.errors, success: false}) if(result === "err") return res.status(500).json({error: "err", success: false}) diff --git a/next/pages/api/datasets/getSearchDatasets.js b/next/pages/api/datasets/getSearchDatasets.js index a994113f..96752064 100644 --- a/next/pages/api/datasets/getSearchDatasets.js +++ b/next/pages/api/datasets/getSearchDatasets.js @@ -2,7 +2,7 @@ import axios from "axios"; const API_URL= `${process.env.NEXT_PUBLIC_API_URL}/search/` -export default async function getSearchDatasets({q, filter = [], page}) { +export default async function getSearchDatasets({q, filter = [], page, locale}) { const searchString = () => { if(q) return `q=${q}&` return "" @@ -26,7 +26,7 @@ export default async function getSearchDatasets({q, filter = [], page}) { } try { - const res = await axios.get(`${API_URL}?${searchString()}${filters()}${pageState()}`) + const res = await axios.get(`${API_URL}?${searchString()}${filters()}${pageState()}&locale=${locale}`) return res.data } catch (error) { console.error(error) diff --git a/next/pages/api/datasets/getShowDataset.js b/next/pages/api/datasets/getShowDataset.js index ff92af0f..e5d15e54 100644 --- a/next/pages/api/datasets/getShowDataset.js +++ b/next/pages/api/datasets/getShowDataset.js @@ -1,8 +1,10 @@ import axios from "axios"; +import { cleanGraphQLResponse } from "../../../utils"; +import { capitalize } from 'lodash'; const API_URL= `${process.env.NEXT_PUBLIC_API_URL}/api/v1/graphql` -export default async function getShowDataset(id) { +async function getShowDataset(id, locale='pt') { try { const res = await axios({ url: API_URL, @@ -16,13 +18,16 @@ export default async function getShowDataset(id) { _id slug name + name${capitalize(locale)} description + description${capitalize(locale)} coverage themes { edges { node { _id name + name${capitalize(locale)} } } } @@ -31,6 +36,7 @@ export default async function getShowDataset(id) { node { _id name + name${capitalize(locale)} } } } @@ -38,6 +44,7 @@ export default async function getShowDataset(id) { _id slug name + name${capitalize(locale)} website picture } @@ -50,6 +57,8 @@ export default async function getShowDataset(id) { status { _id slug + name + name${capitalize(locale)} } } } @@ -59,10 +68,13 @@ export default async function getShowDataset(id) { node { _id name + name${capitalize(locale)} order status { _id slug + name + name${capitalize(locale)} } } } @@ -72,12 +84,15 @@ export default async function getShowDataset(id) { node { _id name + name${capitalize(locale)} slug isClosed order status { _id slug + name + name${capitalize(locale)} } } } @@ -96,3 +111,13 @@ export default async function getShowDataset(id) { console.error(error) } } + +export default async function handler(req, res) { + const { id: id, locale } = req.query; + const result = await getShowDataset(id, locale); + + if(result.errors) return res.status(500).json({error: result.errors, success: false}) + if(result === "err") return res.status(500).json({error: "err", success: false}) + + return res.status(200).json({resource: cleanGraphQLResponse(result), success: true}) +} \ No newline at end of file diff --git a/next/pages/api/datasets/index.js b/next/pages/api/datasets/index.js index 49bc3d6a..1ccac140 100644 --- a/next/pages/api/datasets/index.js +++ b/next/pages/api/datasets/index.js @@ -1,6 +1,5 @@ import getSearchDatasets from "./getSearchDatasets"; import getListDatasets from "./getListDatasets"; -import getShowDataset from "./getShowDataset"; import postDataset from "./postDataset"; import getDatasetEdit from "./getDatasetEdit"; import deleteDataset from "./deleteDataset"; @@ -8,7 +7,6 @@ import deleteDataset from "./deleteDataset"; export { getSearchDatasets, getListDatasets, - getShowDataset, postDataset, getDatasetEdit, deleteDataset diff --git a/next/pages/api/tables/getBdmTable.js b/next/pages/api/tables/getTable.js similarity index 89% rename from next/pages/api/tables/getBdmTable.js rename to next/pages/api/tables/getTable.js index 475e6a1e..aa8bfec9 100644 --- a/next/pages/api/tables/getBdmTable.js +++ b/next/pages/api/tables/getTable.js @@ -1,9 +1,10 @@ import axios from "axios"; import { cleanGraphQLResponse } from "../../../utils"; +import { capitalize } from 'lodash'; const API_URL= `${process.env.NEXT_PUBLIC_API_URL}/api/v1/graphql` -async function getBdmTable(id) { +async function getTable(id, locale='pt') { try { const res = await axios({ url: API_URL, @@ -17,7 +18,9 @@ async function getBdmTable(id) { _id slug name + name${capitalize(locale)} description + description${capitalize(locale)} isClosed dataset { _id @@ -25,6 +28,8 @@ async function getBdmTable(id) { organization { _id slug + name + name${capitalize(locale)} area { _id slug @@ -104,12 +109,14 @@ async function getBdmTable(id) { node { _id name + name${capitalize(locale)} } } } entity { _id name + name${capitalize(locale)} } } } @@ -131,7 +138,8 @@ async function getBdmTable(id) { } export default async function handler(req, res) { - const result = await getBdmTable(req.query.p) + const { id: id, locale } = req.query; + const result = await getTable(id, locale); if(result.errors) return res.status(500).json({error: result.errors, success: false}) if(result === "err") return res.status(500).json({error: "err", success: false}) diff --git a/next/pages/api/themes/getAllDatasets.js b/next/pages/api/themes/getAllDatasets.js index 1fec55be..2fdd2c62 100644 --- a/next/pages/api/themes/getAllDatasets.js +++ b/next/pages/api/themes/getAllDatasets.js @@ -2,11 +2,13 @@ import axios from "axios"; const API_URL= `${process.env.NEXT_PUBLIC_API_URL}/search/` -export default async function getAllDatasets() { +export default async function getAllDatasets(locale = 'pt') { try { - const res = await axios.get(API_URL) - return res.data.results + const res = await axios.get(API_URL, { + params: { locale }, + }); + return res.data.results; } catch (error) { - console.error(error) + console.error(error); } } diff --git a/next/pages/api/themes/getAllThemes.js b/next/pages/api/themes/getAllThemes.js index 402c2838..12c9ae54 100644 --- a/next/pages/api/themes/getAllThemes.js +++ b/next/pages/api/themes/getAllThemes.js @@ -1,8 +1,10 @@ import axios from "axios"; +import { cleanGraphQLResponse } from "../../../utils"; +import { capitalize } from 'lodash'; -const API_URL= `${process.env.NEXT_PUBLIC_API_URL}/api/v1/graphql` +const API_URL = `${process.env.NEXT_PUBLIC_API_URL}/api/v1/graphql`; -export default async function getAllThemes() { +async function getAllThemes(locale = 'pt') { try { const res = await axios({ url: API_URL, @@ -16,6 +18,7 @@ export default async function getAllThemes() { _id slug name + name${capitalize(locale)} } } } @@ -23,10 +26,20 @@ export default async function getAllThemes() { `, variables: null } - }) - const data = res?.data?.data?.allTheme?.edges - return data + }); + const data = res?.data?.data?.allTheme?.edges; + return data; } catch (error) { - console.error(error) + console.error(error); + return "err"; } +} + +export default async function handler(req, res) { + const { locale } = req.query; + const result = await getAllThemes(locale); + + if (result === "err") return res.status(500).json({ error: "err", success: false }); + + return res.status(200).json({ resource: cleanGraphQLResponse(result), success: true }); } \ No newline at end of file diff --git a/next/pages/api/themes/getDatasetsByThemes.js b/next/pages/api/themes/getDatasetsByThemes.js index b6eaeed7..788d96c1 100644 --- a/next/pages/api/themes/getDatasetsByThemes.js +++ b/next/pages/api/themes/getDatasetsByThemes.js @@ -1,18 +1,30 @@ import axios from "axios"; -const API_URL= `${process.env.NEXT_PUBLIC_API_URL}/search/` +const API_URL = `${process.env.NEXT_PUBLIC_API_URL}/search/`; -export default async function getDatasetsByThemes(themes) { - let query = [] +export default async function getDatasetsByThemes(req, res) { + const { themes, locale } = req.query; + let query = [`locale=${locale || "pt"}`]; - themes.forEach(element => { - query.push(`theme=${element}`) - }); + if (Array.isArray(themes)) { + themes.forEach(element => { + query.push(`theme=${encodeURIComponent(element)}`); + }); + } else if (themes) { + + const themeArray = themes.replace(/[\[\]]/g, '').split(','); + themeArray.forEach(theme => { + query.push(`theme=${encodeURIComponent(theme.trim())}`); + }); + } + + const fullUrl = `${API_URL}?${query.join("&")}`; try { - const res = await axios.get(`${API_URL}?${query.join("&")}`) - return res.data.results + const response = await axios.get(fullUrl, { timeout: 5000 }); + res.status(200).json(response.data.results); } catch (error) { - console.error(error) + console.error(error); + return "err" } } diff --git a/next/pages/api/themes/index.js b/next/pages/api/themes/index.js index f76d4b8b..a4c25a5a 100644 --- a/next/pages/api/themes/index.js +++ b/next/pages/api/themes/index.js @@ -1,9 +1,5 @@ -import getAllThemes from "./getAllThemes"; import getAllDatasets from "./getAllDatasets"; -import getDatasetsByThemes from "./getDatasetsByThemes" export { - getAllThemes, getAllDatasets, - getDatasetsByThemes } \ No newline at end of file diff --git a/next/pages/contato-consultoria.js b/next/pages/contato-consultoria.js index 32a36537..846f4b7e 100644 --- a/next/pages/contato-consultoria.js +++ b/next/pages/contato-consultoria.js @@ -6,12 +6,23 @@ import Head from "next/head"; import { useEffect } from "react"; import { MainPageTemplate } from "../components/templates/main"; import { withPages } from "../hooks/pages.hook"; +import { useTranslation } from 'next-i18next'; +import { serverSideTranslations } from 'next-i18next/serverSideTranslations'; -export async function getStaticProps() { - return await withPages() +export async function getStaticProps({ locale }) { + const pages = await withPages(); + return { + ...pages, + props: { + ...pages.props, + ...(await serverSideTranslations(locale, ['common', 'menu', 'contact'])), + }, + }; } export default function ContactConsultancy() { + const { t } = useTranslation('contact'); + useEffect(() => { const script = document.createElement('script'); script.src='https://js.hsforms.net/forms/embed/v2.js'; @@ -32,15 +43,15 @@ export default function ContactConsultancy() { return ( - Consultoria – Base dos Dados + {t('consulting.title')} diff --git a/next/pages/contato.js b/next/pages/contato.js index 4c5a97fd..33668325 100644 --- a/next/pages/contato.js +++ b/next/pages/contato.js @@ -5,18 +5,28 @@ import { } from "@chakra-ui/react"; import Head from "next/head"; import { useEffect } from "react"; +import { useTranslation } from 'next-i18next'; +import { serverSideTranslations } from 'next-i18next/serverSideTranslations'; import Display from "../components/atoms/Display"; import Subtitle from "../components/atoms/Subtitle"; import BodyText from "../components/atoms/BodyText"; import Link from "../components/atoms/Link"; import { MainPageTemplate } from "../components/templates/main"; import { withPages } from "../hooks/pages.hook"; - -export async function getStaticProps() { - return await withPages() + +export async function getStaticProps({ locale }) { + const pages = await withPages(); + return { + props: { + ...pages, + ...(await serverSideTranslations(locale, ['common', 'menu', 'contact'])), + }, + }; } export default function Contato({ pages }) { + const { t } = useTranslation('contact'); + useEffect(() => { const script = document.createElement('script'); script.src='https://js.hsforms.net/forms/v2.js'; @@ -37,15 +47,15 @@ export default function Contato({ pages }) { return ( - Contato – Base dos Dados + {t('pageTitle')} @@ -67,23 +77,24 @@ export default function Contato({ pages }) { color="#2B8C4D" paddingBottom="16px" > - Entre em contato + {t('contactTitle')} - Envie sua mensagem no formulário ao lado para falar com nossa equipe. + {t('contactDescription')} - Apoio institucional + {t('institutionalSupportTitle')} - A Base dos Dados é mantida por meio doações de pessoas que acreditam na transparência e acesso a dados de qualidade. Colabore para o crescimento e fortalecimento da iniciativa. + {t('institutionalSupportDescription')} - Serviços + {t('servicesTitle')} - Fale diretamente com nossa equipe comercial para marcarmos uma conversa e avaliarmos como{" "} + {t('servicesDescription')} - nossos serviços - podem ajudar. + {t('servicesLink')} + {t('servicesLinkText')} - Projetos e Parcerias + {t('projectsPartnershipsTitle')} - Desenvolvemos projetos e aplicações com outras organizações afins para promover o acesso a dados públicos de qualidade. Estamos sempre abertos a novas ideias. + {t('projectsPartnershipsDescription')} - Dados + {t('dataTitle')} - Auxiliamos pessoas e organizações a subirem dados no nosso datalake. Escreva sua proposta para nossa equipe de Dados. + {t('dataDescription')} - Dúvidas? Fale com a nossa comunidade no{" "} + {t('questionsText')} - Discord. + {t('discordLink')}. diff --git a/next/pages/dataset/[dataset].js b/next/pages/dataset/[dataset].js index a07b97fb..dd64b8e3 100644 --- a/next/pages/dataset/[dataset].js +++ b/next/pages/dataset/[dataset].js @@ -12,9 +12,11 @@ import { import { useState, useEffect } from "react"; import { useRouter } from "next/router"; import Head from "next/head"; +import { useTranslation } from 'next-i18next'; +import { serverSideTranslations } from 'next-i18next/serverSideTranslations'; +import { capitalize } from 'lodash'; import BigTitle from "../../components/atoms/BigTitle"; -import Link from "../../components/atoms/Link"; import GreenTab from "../../components/atoms/GreenTab"; import ReadMore from "../../components/atoms/ReadMore"; import DatasetResource from "../../components/organisms/DatasetResource"; @@ -26,20 +28,38 @@ import CrossingIcon from "../../public/img/icons/crossingIcon"; import { getListDatasets, - getShowDataset, } from "../api/datasets/index"; -import { withPages } from "../../hooks/pages.hook"; - export async function getStaticProps(context) { - const dataset = await getShowDataset(context.params.dataset) || null + const { locale, params } = context; + + let dataset = null; + try { + const url = `${process.env.NEXT_PUBLIC_BASE_URL_FRONTEND}/api/datasets/getShowDataset?id=${params.dataset}&locale=${locale}`; + const response = await fetch(url, { method: "GET" }); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + + const result = await response.json(); + + if (result.success) { + dataset = result.resource; + } else { + console.error("API error:", result.error); + } + } catch (error) { + console.error("Fetch error:", error.message); + } - return await withPages({ + return { props: { + ...(await serverSideTranslations(locale, ['dataset', 'common', 'menu'])), dataset, }, revalidate: 30, - }) + }; } export async function getStaticPaths(context) { @@ -54,7 +74,9 @@ export async function getStaticPaths(context) { } export default function DatasetPage ({ dataset }) { + const { t } = useTranslation('dataset', 'common'); const router = useRouter() + const { locale } = router const { query } = router const [tabIndex, setTabIndex] = useState(0) @@ -70,7 +92,7 @@ export default function DatasetPage ({ dataset }) { return ( - {dataset.name} – Base dos Dados + {dataset.name} – {t('dataBasis')} - + - {dataset.name || "Conjunto sem nome"} + {dataset[`name${capitalize(locale)}`] || dataset.name || t('noName')} - {dataset?.description || "Nenhuma descrição fornecida."} + {dataset[`description${capitalize(locale)}`] || dataset.description || t('noDescription')} @@ -158,7 +180,7 @@ export default function DatasetPage ({ dataset }) { color="#252A32" marginBottom="8px" > - Cobertura temporal do conjunto + {t('temporalCoverage')} - {dataset.coverage || "Nenhuma cobertura temporal fornecida."} + {dataset.coverage || t('noCoverage')} @@ -180,7 +202,7 @@ export default function DatasetPage ({ dataset }) { color="#252A32" marginBottom="8px" > - Organização + {t('organization')} - {dataset?.organization?.name || "Nenhuma organização fornecida."} + {dataset.organization?.[`name${capitalize(locale)}`] || dataset.organization?.name || t('noOrganization')} @@ -218,7 +240,7 @@ export default function DatasetPage ({ dataset }) { height="18px" marginRight="6px" /> - Dados + {t('data')} @@ -228,7 +250,7 @@ export default function DatasetPage ({ dataset }) { height="24px" marginRight="2px" /> - Cruzamento + {t('crossing')} diff --git a/next/pages/dataset/edit/index.js b/next/pages/dataset/edit/index.js index 248c1e88..95721d6c 100644 --- a/next/pages/dataset/edit/index.js +++ b/next/pages/dataset/edit/index.js @@ -19,10 +19,6 @@ import { getAllOrganizations } from "../../api/organizations"; -import { - getAllThemes -} from "../../api/themes"; - import { getAllTags } from "../../api/tags"; @@ -58,11 +54,6 @@ export default function Control() { setOrganizations(allOrganizations) } - const fetchThemes = async () => { - const allThemes = await getAllThemes() - setThemes(allThemes) - } - const fetchTags = async () => { const allTags = await getAllTags() setTags(allTags) @@ -76,7 +67,6 @@ export default function Control() { const fetchData = async () => { const promises = [] promises.push(fetchOrganizations()) - promises.push(fetchThemes()) promises.push(fetchTags()) promises.push(fetchStatus()) await Promise.all(promises) diff --git a/next/pages/dataset/index.js b/next/pages/dataset/index.js index 451a776b..05c5f8a4 100644 --- a/next/pages/dataset/index.js +++ b/next/pages/dataset/index.js @@ -14,9 +14,11 @@ import ReactPaginate from "react-paginate"; import { useRouter } from "next/router"; import { useEffect, useState } from "react"; import cookies from "js-cookie"; +import { useTranslation } from 'next-i18next'; +import { serverSideTranslations } from 'next-i18next/serverSideTranslations'; +import Link from "../../components/atoms/Link"; import { isMobileMod, useCheckMobile } from "../../hooks/useCheckMobile.hook"; import { triggerGAEvent } from "../../utils"; -import { withPages } from "../../hooks/pages.hook"; import { getSearchDatasets @@ -31,11 +33,16 @@ import { MainPageTemplate } from "../../components/templates/main"; import FilterIcon from "../../public/img/icons/filterIcon"; import NotFoundImage from "../../public/img/notFoundImage"; -export async function getStaticProps() { - return await withPages() +export async function getStaticProps({ locale }) { + return { + props: { + ...(await serverSideTranslations(locale, ['common', 'dataset', 'menu'])), + }, + }; } export default function SearchDatasetPage() { + const { t } = useTranslation('dataset') const router = useRouter() const query = router.query @@ -49,7 +56,8 @@ export default function SearchDatasetPage() { const [isLoading, setIsLoading] = useState(true) async function getDatasets({q, filters, page}) { - const res = await getSearchDatasets({q:q, filter: filters, page:page}) + const { locale } = router + const res = await getSearchDatasets({q, filter: filters, page, locale: locale || 'pt'}) if(res === undefined) return router.push({pathname:"500"}) if(res?.count === 0) setShowEmptyState(true) setPageInfo({page: page, count: res?.count}) @@ -250,7 +258,7 @@ export default function SearchDatasetPage() { backgroundColor: "#22703E" }} > - Fazer uma proposta + {t('suggestData')} - Ver roadmap de dados + {t('viewDataRoadmap')} @@ -287,7 +295,7 @@ export default function SearchDatasetPage() { - Limpar filtros - + {t('clearFilters')} + ) } @@ -510,10 +516,10 @@ export default function SearchDatasetPage() { return ( - Dados – Base dos Dados + {t('pageTitle')} @@ -551,7 +557,7 @@ export default function SearchDatasetPage() { width="100%" marginLeft="8px" > - Filtrar + {t('filter')} @@ -568,24 +574,24 @@ export default function SearchDatasetPage() { color="#464A51" marginBottom="4px" > - Conjuntos com + {t('datasetsWith')} elm.key === 1)[0]?.count || 0} /> elm.key === 1)[0]?.count || 0} /> elm.key === 1)[0]?.count || 0} /> @@ -606,18 +612,18 @@ export default function SearchDatasetPage() { color="#464A51" marginBottom="4px" > - Recursos + {t('tables')} elm.key === 1)[0]?.count || 0} /> elm.key === 1)[0]?.count || 0} /> @@ -630,7 +636,7 @@ export default function SearchDatasetPage() { choices={aggregations?.themes} valueField="key" displayField="name" - fieldName="Tema" + fieldName={t('theme')} valuesChecked={valuesCheckedFilter("theme")} onChange={(value) => handleSelectFilter(["theme",`${value}`])} isLoading={!isLoading} @@ -644,7 +650,7 @@ export default function SearchDatasetPage() { choices={aggregations?.organizations} valueField="key" displayField="name" - fieldName="Organização" + fieldName={t('organization')} valuesChecked={valuesCheckedFilter("organization")} onChange={(value) => handleSelectFilter(["organization",`${value}`])} isLoading={!isLoading} @@ -658,7 +664,7 @@ export default function SearchDatasetPage() { choices={aggregations?.tags} valueField="key" displayField="name" - fieldName="Etiqueta" + fieldName={t('tag')} valuesChecked={valuesCheckedFilter("tag")} onChange={(value) => handleSelectFilter(["tag",`${value}`])} isLoading={!isLoading} @@ -672,7 +678,7 @@ export default function SearchDatasetPage() { choices={aggregations?.observation_levels} valueField="key" displayField="name" - fieldName="Nível da observação" + fieldName={t('observationLevel')} valuesChecked={valuesCheckedFilter("observation_level")} onChange={(value) => handleSelectFilter(["observation_level",`${value}`])} isLoading={!isLoading} @@ -704,25 +710,32 @@ export default function SearchDatasetPage() { lineHeight="20px" color="#71757A" > - {count ? - `${count} conjunto${count > 1 ? "s": ""} encontrado${count > 1 ? "s": ""} ${!!query.q ? ` para ${query.q}` : ""}` - : - count === 0 && showEmptyState ? - `0 conjuntos encontrados` - : + {count ? ( + t('datasetsFound_plural', { + count: count, + query: query.q ? t('forQuery', { query: query.q }) : '' + }) + ) : count === 0 && showEmptyState ? ( + t('noDatasetsFound') + ) : ( - encontrando conjuntos {!!query.q ? ` para ${query.q}` : ""} + + + {t('findingDatasets', { + query: query.q ? t('forQuery', { query: query.q }) : '' + })} + - } + )} {showEmptyState && } @@ -746,22 +759,22 @@ export default function SearchDatasetPage() { {pageInfo?.count >=1 && pageInfo?.count <=10 && } {pageInfo.page >= 2 && } {!showEmptyState && res.id === params.id); return { - props : CaseStudiesContent.find((res) => res.id === context.params.id), + props: { + ...(await serverSideTranslations(locale, ['common', 'menu', 'caseStudies'])), + ...caseStudy, + }, revalidate: 30 - } + } } export async function getStaticPaths(context) { @@ -47,6 +53,7 @@ export default function CaseStudies ({ sector, body }) { + const { t } = useTranslation('caseStudies'); const [isMobileMod, setIsMobileMod] = useState(false) const isMobile = useCheckMobile(); @@ -57,7 +64,7 @@ export default function CaseStudies ({ return ( - {displayTitle} – Base dos Dados + {t('pageTitle', { title: displayTitle })} - {!isMobileMod && + {!isMobileMod && ( {`<< Voltar`} - } + > + {t('backLink')} + + )} {isMobileMod && - Queremos ajudar você. + {t('contactText')} window.open("/contato", "_blank")} > - Entre em contato + {t('contactButton')} diff --git a/next/pages/index.js b/next/pages/index.js index 9a6d25e6..f9eb35e9 100644 --- a/next/pages/index.js +++ b/next/pages/index.js @@ -11,6 +11,9 @@ import { } from "@chakra-ui/react"; import { useState } from "react"; import { useMediaQuery } from "@chakra-ui/react"; +import { serverSideTranslations } from 'next-i18next/serverSideTranslations'; +import { useTranslation } from 'next-i18next'; +import { useRouter } from 'next/router'; import { isMobileMod } from "../hooks/useCheckMobile.hook"; import BodyText from "../components/atoms/BodyText"; import ControlledInput from "../components/atoms/ControlledInput"; @@ -28,7 +31,6 @@ import { MainPageTemplate } from "../components/templates/main"; import { triggerGAEvent } from "../utils"; import { - getAllThemes, getAllDatasets } from "./api/themes/index" @@ -43,9 +45,12 @@ import ProductsFiltersImage from "../public/img/productsFiltersImage"; import ProcessedDataImage from "../public/img/processedDataImage"; import BDLogoEduImage from "../public/img/logos/bd_logo_edu"; -export async function getStaticProps() { - const themes = await getAllThemes() - const defaultDataset = await getAllDatasets() +export async function getStaticProps({ locale }) { + const themesResponse = await fetch(`${process.env.NEXT_PUBLIC_BASE_URL_FRONTEND}/api/themes/getAllThemes?locale=${locale}`) + const themesData = await themesResponse.json() + const themes = themesData.resource + + const defaultDataset = await getAllDatasets(locale) let dataThemeCatalog = { themes: themes, @@ -54,13 +59,16 @@ export async function getStaticProps() { return { props: { + ...(await serverSideTranslations(locale, ['common', 'menu', 'dataset'])), dataThemeCatalog }, revalidate: 30 } } -function Hero({ dataThemeCatalog }) { +function Hero({ dataThemeCatalog, locale }) { + const { t } = useTranslation('common'); + const router = useRouter(); const [search, setSearch] = useState(""); const [tags, setTags] = useState([]) const [mediumQuery] = useMediaQuery("(max-width: 1366px)") @@ -68,7 +76,7 @@ function Hero({ dataThemeCatalog }) { function openSearchLink() { triggerGAEvent("search", search) triggerGAEvent("search_home", search) - return window.open(`/dataset?q=${search}`, "_self"); + router.push(`/dataset?q=${search}`); } return ( @@ -118,7 +126,7 @@ function Hero({ dataThemeCatalog }) { > + { + e.preventDefault(); + openSearchLink(); + }} + > + + : - Termos populares: + {t('popular_terms')} } {tags.map((elm, i) => - + )} @@ -198,9 +213,9 @@ function Hero({ dataThemeCatalog }) { cursor="pointer" onClick={() => window.open("#theme", "_self")} > - Busque por tema + {t('search_by_theme')} - + @@ -209,6 +224,8 @@ function Hero({ dataThemeCatalog }) { } function Products() { + const { t } = useTranslation('common'); + return ( - Facilitamos o trabalho para que a distância {!isMobileMod() &&
} - entre você e sua análise seja apenas uma boa pergunta. + {t('products.facilitation_text')} + {!isMobileMod() &&
} + {t('products.analysis_distance')} + {t('products.good_question')}.
@@ -245,21 +264,19 @@ function Products() { letterSpacing="0.5px" lineHeight="24px" > - FILTROS + {t('products.filters')} - Busque dados como quiser + {t('products.search_as_you_want')} - São vários filtros para ajudar você a encontrar os dados que necessita. - Ao navegar entre centenas de conjuntos de dados disponíveis na plataforma, - você pode refinar sua busca por tema, organização, cobertura temporal, nível da observação e mais. + {t('products.search_description')} - Comece sua pesquisa + {t('products.start_search')} @@ -289,22 +306,20 @@ function Products() { letterSpacing="0.5px" lineHeight="24px" > - TABELAS TRATADAS + {t('products.processed_tables')} - Acesse dados de qualidade + {t('products.access_quality_data')} - Com as tabelas tratadas do nosso datalake público, - você não precisa mais gastar horas limpando bases. - Nossa metodologia de padronização permite cruzar facilmente dados de diferentes organizações. Assim, você pode focar no que realmente importa. + {t('products.processed_tables_description')} - Veja os dados disponíveis + {t('products.view_available_data')} @@ -331,20 +346,19 @@ function Products() { letterSpacing="0.5px" lineHeight="24px" > - PACOTES + {t('products.packages')} - Explore na sua linguagem favorita + {t('products.explore_in_your_favorite_language')} - Desenvolvemos pacotes para acesso aos dados tratados em Python, R e linha de comando. Além disso, você pode consultar e filtrar - dados usando SQL no editor do nosso datalake público no Google BigQuery. + {t('products.packages_description')} - Saiba como acessar + {t('products.learn_how_to_access')} @@ -393,7 +407,6 @@ function Products() { } export function TextPix ({ title, text }) { - return ( @@ -428,6 +441,7 @@ export function StepText ({index, text}) { } function Support() { + const { t } = useTranslation('common'); const { hasCopied, onCopy } = useClipboard("42494318000116") return ( @@ -445,8 +459,7 @@ function Support() { textAlign="center" margin={isMobileMod() ? "80px 0px 24px" : "104px 0px 24px"} > - Existimos através do esforço de pessoas que {!isMobileMod() &&
} - acreditam no acesso a dados abertos de qualidade. + {t('support.existence_through_effort')} {!isMobileMod() &&
} {t('support.those_who_believe_in_quality_open_data')} Apoie a Base dos Dados você também + > + {t('support.support_us_too')} } - title="Entusiasta" + title={t('support.enthusiast')} spacing={4} > - Bolso apertado? Apenas R$0,50 por
dia para nos ajudar a manter a iniciativa. + {t('support.tight_pocket')}
{t('support.enthusiast_description')}
- R$

15

/ mês + R$

15

/ {t('support.month')}
@@ -513,7 +527,7 @@ function Support() { backgroundColor="#FF8484" /> } - title="Databaser" + title={t('support.databaser')} titleStyle={{ fontSize:"22px", color:"#FF8484", @@ -530,8 +544,8 @@ function Support() { margin="16px 0 24px !important" letterSpacing="0.2px" > - Doe R$ 1 real por dia - para fazer databasers felizes. + {t('support.donate_1_real_per_day')} + {t('support.to_make_databasers_happy')}
- R$

30

/ mês + R$

30

/ {t('support.month')} @@ -557,7 +571,7 @@ function Support() { heightImage="100%" /> } - title="Mestre dos dados" + title={t('support.master_of_data')} spacing={4} > - Menos de R$2 reais por dia para pouparmos ainda mais seu trabalho. + {t('support.master_of_data_description')} - R$

50

/ mês + R$

50

/ {t('support.month')}
@@ -595,7 +609,7 @@ function Support() { lineHeight="32px" paddingBottom={!isMobileMod() && "32px"} > - Doe qualquer valor via PIX + {t('support.donate_any_amount_via_pix')} - - - + + + - - + + @@ -641,16 +655,16 @@ function Support() { marginTop="32px" > - {hasCopied ? "Copiada chave PIX" :"Copiar chave PIX"} + {hasCopied ? t('support.pix_key_copied') : t('support.copy_pix_key')} - Siga o passo a passo - - - - + {t('support.follow_the_steps')} + + + + @@ -660,8 +674,9 @@ function Support() { textAlign="center" margin="32px 0 !important" > - 💰 Gostaria de apoiar a BD institucionalmente? + 💰 {t('support.want_to_institutionally_support_bd')} Entre em contato conosco. + > + {t('support.contact_us')}
@@ -679,6 +695,7 @@ function Support() { } function BDEdu () { + const { t } = useTranslation('common'); const closeDate = new Date(2024, 2, 26) const currentDate = new Date() @@ -699,20 +716,23 @@ function BDEdu () { Venha aprender com quem é referência {!isMobileMod() &&
} em disponibilizar dados públicos no Brasil + > + {t('edu.learn_from_the_reference')} + {!isMobileMod() &&
} + {t('edu.in_making_public_data_available')}
- Com nosso curso você pode ir mais longe na sua pesquisa, profissão, ou organização. + {t('edu.with_our_course_you_can_go_further')} - - Aproveite o preço promocional + + {t('edu.take_advantage_of_the_promotional_price')} @@ -720,9 +740,12 @@ function BDEdu () { } export default function Home({ dataThemeCatalog }) { + const router = useRouter(); + const { locale } = router; + return ( - + {/* */} diff --git a/next/pages/perguntas-frequentes.js b/next/pages/perguntas-frequentes.js index 70f96b04..ddb29cab 100644 --- a/next/pages/perguntas-frequentes.js +++ b/next/pages/perguntas-frequentes.js @@ -14,6 +14,8 @@ import { isMobileMod } from "../hooks/useCheckMobile.hook"; import { QuestionFAQ } from "../content/FAQ"; import { MainPageTemplate } from "../components/templates/main"; import { withPages } from "../hooks/pages.hook"; +import { serverSideTranslations } from 'next-i18next/serverSideTranslations'; +import { useTranslation } from 'next-i18next'; import { DebouncedControlledInput } from "../components/atoms/ControlledInput"; import Display from "../components/atoms/Display"; @@ -25,8 +27,14 @@ import styles from "../styles/faq.module.css"; import 'highlight.js/styles/obsidian.css'; -export async function getStaticProps() { - return await withPages() +export async function getStaticProps({ locale }) { + return { + props: { + ...(await serverSideTranslations(locale, ['common', 'menu', 'faq', 'user'])), + ...(await withPages()), + }, + revalidate: 30 + } } const QuestionsBox = ({ question, answer, id, active }) => { @@ -105,6 +113,7 @@ const QuestionsBox = ({ question, answer, id, active }) => { } export default function FAQ({}) { + const { t } = useTranslation('faq'); const [allQuestions, setAllQuestions] = useState([]) const [questions, setQuestions] = useState([]) const [categorySelected, setCategorySelected] = useState("") @@ -182,15 +191,15 @@ export default function FAQ({}) { return ( - Perguntas frequentes – Base dos Dados + {t('pageTitle')} @@ -205,7 +214,7 @@ export default function FAQ({}) { paddingBottom={isMobileMod() ? "56px" : "66px" } color="#2B8C4D" > - Perguntas frequentes + {t('title')} setSearchFilter(val)} paddingBottom={isMobileMod() ? "56px" : "126px" } maxWidth="600px" - placeholder="Pesquise" + placeholder={t('searchPlaceholder')} inputStyle={{ padding: "12px 32px 12px 16px", height: "48px", @@ -278,7 +287,7 @@ export default function FAQ({}) { > {questions.length === 0 ? - Infelizmente, não encontramos nenhuma pergunta relacionada à sua busca. + {t('noQuestionsFound')} : questions.map((elm, i) => @@ -299,7 +308,7 @@ export default function FAQ({}) { lineHeight="16px" letterSpacing="0.2px" > - Não encontrou sua pergunta? Entre em contato com nossa equipe. + {t('contactText')} {t('contactLink')} diff --git a/next/pages/precos.js b/next/pages/precos.js index 4b930e70..cdcf6be6 100644 --- a/next/pages/precos.js +++ b/next/pages/precos.js @@ -7,6 +7,10 @@ import { import { useEffect, useState } from "react"; import Head from "next/head"; import cookies from 'js-cookie'; +import { useTranslation } from 'next-i18next'; +import { serverSideTranslations } from 'next-i18next/serverSideTranslations'; +import Link from 'next/link'; +import { useRouter } from 'next/router'; import Toggle from "../components/atoms/Toggle"; import { MainPageTemplate } from "../components/templates/main"; import { isMobileMod } from "../hooks/useCheckMobile.hook"; @@ -15,8 +19,14 @@ import { withPages } from "../hooks/pages.hook"; import CheckIcon from "../public/img/icons/checkIcon"; import InfoIcon from '../public/img/icons/infoIcon'; -export async function getStaticProps(context) { - return await withPages() +export async function getStaticProps({ locale }) { + const pagesProps = await withPages(); + return { + props: { + ...pagesProps, + ...(await serverSideTranslations(locale, ['common', 'prices', 'menu'])), + }, + }; } export const CardPrice = ({ @@ -27,7 +37,10 @@ export const CardPrice = ({ textResource, resources = [], button, + locale, }) => { + const { t } = useTranslation('prices'); + return ( /mês + >{t('perMonth')} {anualPlan && price.toLocaleString('pt-BR', { style: 'currency', currency: 'BRL', minimumFractionDigits: 0 })+" cobrado uma vez no ano"} + >{anualPlan && t('annualBillingMessage', { + price: price.toLocaleString('pt-BR', { style: 'currency', currency: 'BRL', minimumFractionDigits: 0 }) + })} @@ -198,7 +213,7 @@ export const CardPrice = ({ flexDirection="column" gap="16px" > - {button.isCurrentPlan ? + {button.isCurrentPlan ? ( - {button.text} + {t('currentPlan')} - : - { - if(button.onClick) return button.onClick() - return window.open(button.href, "_self") - }} - display="flex" - alignItems="center" - justifyContent="center" - width="100%" - borderRadius="8px" - backgroundColor="#0D99FC" - padding="12px 16px" - cursor="pointer" - color="#FFF" - fontFamily="Roboto" - fontWeight="500" - fontSize="20px" - lineHeight="36px" - _hover={{ - backgroundColor: "#0B89E2" - }} - > - {button.text} - - } + ) : ( + + + {t(button.text)} + + + )} Leia os - Termos de Serviço + >{t('readThe')} + + + {t('termsOfService')} + + . @@ -275,6 +292,8 @@ export const CardPrice = ({ } export function SectionPrice() { + const { t } = useTranslation('prices'); + const { locale } = useRouter(); const [toggleAnual, setToggleAnual] = useState(true) const [plans, setPlans] = useState(null) const [username, setUsername] = useState(null) @@ -382,7 +401,7 @@ export function SectionPrice() { textAlign="center" color="#252A32" > - Desconto anual + {t('annualDiscount')} Economize 20% + >{t('save20')} @@ -406,58 +425,52 @@ export function SectionPrice() { spacing={0} > Para você descobrir o potencial da plataforma de dados} - price={"0"} - textResource="Recursos:" - resources={[ - {name: "Bases de baixa frequência atualizadas"}, - {name: "Tabelas tratadas"}, - {name: "Dados integrados", tooltip: "Nossa metodologia de padronização e compatibilização de dados permite que você cruze tabelas de diferentes instituições e temas de maneira simplificada."}, - {name: "Acesso em nuvem"}, - {name: "Acesso via SQL, Python e R"}, - {name: "Integração com ferramentas BI"}, - {name: "Download direto até 100 MB", tooltip: "Esse limite não se aplica ao acesso via SQL, Python e R."}, - ]} + title={t('plans.free.title')} + subTitle={t('plans.free.subtitle')} + price="0" + textResource={t('features')} + resources={t('plans.free.features', { returnObjects: true }).map((feature, index) => ({ + name: feature, + tooltip: index === 1 ? t('tooltips.integratedData') : (index === 6 ? t('tooltips.downloadLimit') : null) + }))} button={{ - text: "Explorar recursos", + text: t('exploreFeatures'), href: "/dataset", }} + locale={locale} /> Para você ter acesso aos
dados mais atualizados} + title={t('plans.pro.title')} + subTitle={t('plans.pro.subtitle')} price={plans?.[`bd_pro_${toggleAnual ? "year" : "month"}`].amount || 444} anualPlan={toggleAnual} - textResource="Todos os recursos da BD Grátis, mais:" - resources={[ - {name: "Dezenas de bases de alta frequência atualizadas"}, - {name: "Tabela de referência de empresas com informações atualizadas"}, - {name: "Download direto até 1GB (80% das tabelas da plataforma)", tooltip: "Tabelas maiores que 1 GB não estão disponíveis para download parcial ou completo. Esse limite não se aplica ao acesso via SQL, Python e R."} - ]} + textResource={t('allFeaturesPlus', { plan: t('plans.free.title') })} + resources={t('plans.pro.features', { returnObjects: true }).map((feature, index) => ({ + name: feature, + tooltip: index === 2 ? t('tooltips.downloadLimitPro') : null + }))} button={{ - text: isBDPro.isCurrentPlan && planIntervalPlan() ? "Plano atual" : hasSubscribed ? "Assinar" : "Iniciar teste grátis", + text: isBDPro.isCurrentPlan && planIntervalPlan() ? t('currentPlan') : hasSubscribed ? t('subscribe') : t('startFreeTrial'), href: username === null ? `/user/login?i=${plans?.[`bd_pro_${toggleAnual ? "year" : "month"}`]._id}` :`/user/${username}?plans_and_payment&i=${plans?.[`bd_pro_${toggleAnual ? "year" : "month"}`]._id}`, isCurrentPlan: isBDPro.isCurrentPlan && planIntervalPlan(), }} + locale={locale} /> Para sua empresa ganhar tempo
e qualidade em decisões} + title={t('plans.enterprise.title')} + subTitle={t('plans.enterprise.subtitle')} price={plans?.[`bd_empresas_${toggleAnual ? "year" : "month"}`].amount || 3360} anualPlan={toggleAnual} - textResource="Todos os recursos da BD Pro, mais:" - resources={[ - {name: "Acesso para 10 contas"}, - {name: "Suporte prioritário via email e Discord"} - ]} + textResource={t('allFeaturesPlus', { plan: t('plans.pro.title') })} + resources={t('plans.enterprise.features', { returnObjects: true }).map(feature => ({ name: feature }))} button={{ - text: isBDEmp.isCurrentPlan && planIntervalPlan() ? "Plano atual" : hasSubscribed ? "Assinar" : "Iniciar teste grátis", + text: isBDEmp.isCurrentPlan && planIntervalPlan() ? t('currentPlan') : hasSubscribed ? t('subscribe') : t('startFreeTrial'), href: username === null ? `/user/login?i=${plans?.[`bd_empresas_${toggleAnual ? "year" : "month"}`]._id}` :`/user/${username}?plans_and_payment&i=${plans?.[`bd_empresas_${toggleAnual ? "year" : "month"}`]._id}`, isCurrentPlan: isBDEmp.isCurrentPlan && planIntervalPlan(), }} + locale={locale} /> @@ -465,18 +478,20 @@ export function SectionPrice() { } export default function Price() { + const { t } = useTranslation('prices'); + return ( - Preços – Base dos Dados + {t('pageTitle')} @@ -500,7 +515,7 @@ export default function Price() { textAlign="center" lineHeight="70px" > - Compare os planos + {t('comparePlans')} diff --git a/next/pages/quem-somos.js b/next/pages/quem-somos.js index f37d3b9e..82972103 100755 --- a/next/pages/quem-somos.js +++ b/next/pages/quem-somos.js @@ -14,6 +14,8 @@ import { useState, useEffect } from "react"; import { useDisclosure } from "@chakra-ui/hooks"; import { MainPageTemplate } from "../components/templates/main"; import { isMobileMod } from "../hooks/useCheckMobile.hook"; +import { useTranslation } from 'next-i18next'; +import { serverSideTranslations } from 'next-i18next/serverSideTranslations'; import Display from "../components/atoms/Display"; import RoundedButton from "../components/atoms/RoundedButton"; @@ -34,12 +36,13 @@ import DiscordIcon from "../public/img/icons/discordIcon"; import RedirectIcon from "../public/img/icons/redirectIcon"; import styles from "../styles/quemSomos.module.css"; -export async function getServerSideProps() { +export async function getServerSideProps({ locale }) { const response = await fetch(`${process.env.NEXT_PUBLIC_BASE_URL_FRONTEND}/api/team/getAllPeople`, {method: "GET"}) const data = await response.json() return { props: { + ...(await serverSideTranslations(locale, ['aboutUs', 'common', 'menu'])), data }, } @@ -253,6 +256,7 @@ const TeamBox = ({ } export default function QuemSomos({ data }) { + const { t } = useTranslation('aboutUs'); const [allPeople, setAllPeople] = useState([]) const [people, setPeople] = useState([]) const [filterTeam, setFilterTeam] = useState("") @@ -350,15 +354,15 @@ export default function QuemSomos({ data }) { return ( - Quem Somos – Base dos Dados + {t('pageTitle')} @@ -399,7 +403,7 @@ export default function QuemSomos({ data }) { textAlign="center" marginBottom={isMobileMod() ? "80px" : "136px"} > - Facilitamos o acesso a dados {isMobileMod() ? " " :
} para que a distância entre você e sua análise{isMobileMod() ? " " :
}seja apenas uma boa pergunta. + {t('heroTitle1')} {isMobileMod() ? " " :
} {t('heroTitle2')} {isMobileMod() ? " " :
} {t('heroTitle3')} {t('heroTitle4')}. @@ -415,19 +419,19 @@ export default function QuemSomos({ data }) { >
- +114 mil + {t('usersCount')} - usuários na plataforma + {t('usersText')}
- +1,3 milhão + {t('queriesCount')} - consultas aos dados + {t('queriesText')}
@@ -447,16 +451,16 @@ export default function QuemSomos({ data }) { lineHeight={isMobileMod() ? "40px" : "54px"} letterSpacing={isMobileMod() ? "-0.5px" : "-0.8px" } > - A Base dos Dados + {t('aboutTitle')} - Somos uma organização não-governamental sem fins lucrativos e open source que atua para universalizar o acesso a dados de qualidade. Fazemos isso através da criação de ferramentas inovadoras, da produção e difusão do conhecimento e da promoção de uma cultura de transparência e dados abertos. + {t('aboutText1')} - Ao quebrar barreiras técnicas para quem já faz e quem quer começar a fazer análise de dados, reunimos uma rede altamente engajada que potencializa o impacto do nosso trabalho. Estamos construindo uma comunidade de pessoas que acreditam no uso inteligente de dados como instrumento para o desenvolvimento socioeconômico e que encontram na BD uma grande aliada. + {t('aboutText2')} - O que queremos é aproximar diferentes setores da sociedade de informações que são de interesse coletivo, mas ainda pouco acessíveis para a maioria das pessoas. Acreditamos que ampliar o acesso e uso de dados abertos favorece o aumento da participação social, a melhoria da gestão pública e o aperfeiçoamento da democracia. + {t('aboutText3')} @@ -474,7 +478,7 @@ export default function QuemSomos({ data }) { letterSpacing={isMobileMod() ? "-0.5px" : "-0.8px" } textAlign="center" > - Reconhecimentos + {t('recognitionTitle')} - Google Cloud Customer Award + {t('googleCloudAwardTitle')} - O prêmio reconheceu as implementações mais inovadoras e transformadoras do Google Cloud ao redor do mundo. - Fomos a única organização brasileira a receber a premiação na categoria de Impacto Social, que também selecionou outras iniciativas que usam tecnologia para promover mais abertura e transparência. + {t('googleCloudAwardText')} - Veja mais detalhes + {t('googleCloudAwardLink')} @@ -540,7 +543,7 @@ export default function QuemSomos({ data }) { letterSpacing={{base: "0.2px", lg: "0px"}} marginBottom={{base: "8px", lg: "16px"}} > - XXVI Prêmio Tesouro Nacional 2021 + {t('treasuryAwardTitle')} - Conquistamos o 1º lugar na categoria Soluções do prêmio, que tem como objetivo reconhecer o desenvolvimento de aplicações em ciências de dados e inteligência artificial aplicadas a finanças públicas. Fomos selecionados por conta de nosso trabalho compatibilizando informações de despesas e receitas orçamentárias do Setor Público Brasileiro. + {t('treasuryAwardText')} - Veja mais detalhes + {t('treasuryAwardLink')} @@ -589,7 +592,7 @@ export default function QuemSomos({ data }) { letterSpacing={isMobileMod() ? "-0.5px" : "-0.8px" } color="#FFF" > - Nossa história + {t('historyTitle')} Alguns dos marcos que definiram nossa trajetória até aqui + >{t('historySubtitle')}
- Nosso co-fundador, Ricardo Dahis, enxergou a necessidade de uma plataforma com capacidade de busca e filtragem de diferentes conjuntos de dados e iniciou esse trabalho lançando o mecanismo de busca da BD. + {t('historyBox1Text')} - Foi já no primeiro contato de João Carabetta, também co-fundador da BD, com Ricardo Dahis que veio a ambiciosa proposta: estruturar um grande datalake público pelo BigQuery e usar o mecanismo de busca para catalogação das bases e de seus metadados. + {t('historyBox2Text')} - Nos últimos três minutos de um domingo de setembro, o GitHub testemunhou o commit que mudaria para sempre a vida de quem trabalha com dados públicos. Criamos a estrutura do nosso datalake, uma ferramenta que faria a alegria de muita gente que já passou tantos domingos limpando bases. + {t('historyBox3Text')} - Começamos a receber apoio financeiro de pessoas que acreditam na importância do nosso trabalho. Isso foi fundamental para escalar nossas atividades, afinal, nem só de esforço e boa vontade se faz um bom projeto. + {t('historyBox4Text')} - Abrimos a primeira vaga de Assistente de Dados e contratamos a primeira pessoa remunerada para integrar nossa equipe. Aos poucos, esse time foi crescendo e hoje não é mais tão fácil assim ser funcionário(a) do mês. + {t('historyBox5Text')} - A RAIS foi nossa primeira grande base tratada e disponibilizada no datalake público. Subimos seus assombrosos 260 GB de microdados completos, com informações de 1985 até 2019, possibilitando agregações por município e UF. + {t('historyBox6Text')} - Nos tornamos oficialmente o Instituto Base dos Dados, uma organização sem fins lucrativos, com equipe formal, CNPJ e tudo que tem direito. Um passo importante para consolidar nosso trabalho. + {t('historyBox7Text')} - Desenvolver o novo site foi um dos maiores e desafiadores projetos que assumimos. Apesar dos momentos de caos e peças mirabolantes, aos poucos tudo foi se encaixando e tomando a forma de uma plataforma com a nossa cara. Assim, nasceu a primeira versão do novo site da BD, com interface mais intuitiva, design moderno e uma estrutura que facilita ainda mais a experiência dos usuários. + {t('historyBox8Text')} - Precisamos de muitas mãos para carregar essa conquista. Recebemos o Google Cloud Customer Award na categoria de Impacto Social. O prêmio inédito foi anunciado no evento internacional, Google Cloud Next'21, e tem como objetivo reconhecer as implementações mais inovadoras e transformadoras do Google Cloud ao redor do mundo. + {t('historyBox9Text')} - Conquistamos o 1º lugar na categoria Soluções do XXVI Prêmio Tesouro Nacional 2021. O prêmio tem como objetivo expandir as fronteiras do conhecimento em finanças públicas, promovendo a normalização de temas específicos quando tratados consistentemente pela pesquisa científica. + {t('historyBox10Text')} - A necessidade de ter um repositório que centralize importantes bases de dados já tratadas e padronizadas não é exclusiva do Brasil. Imagina ter um datalake aberto que permite o acesso e cruzamento de dados de diversos países diferentes? Esse é o futuro da BD. + {t('historyBox11Text')}
@@ -709,7 +712,7 @@ export default function QuemSomos({ data }) { letterSpacing={isMobileMod() ? "-0.5px" : "-0.8px" } textAlign="center" > - Uma equipe colaborativa + {t('teamTitle')} {data.length > 0 ? @@ -729,7 +732,7 @@ export default function QuemSomos({ data }) { top={isMobileMod()? "0" : "120px"} z-index="20" > - {schemasTeam?.map((elm, i) => ( + {t('teamCategories', { returnObjects: true }).map((elm, i) => ( - Venha colaborar com a transparência + {t('joinUsTitle')} - Faça parte de uma organização que está mudando a maneira de acessar dados.
- Reunimos pessoas de várias partes do Brasil, empenhadas em contribuir e trabalhar
- por mais transparência pública. + {t('joinUsText')}
window.open("https://info.basedosdados.org/carreiras", "_blank")} > - Veja as vagas abertas + {t('joinUsButton')}
diff --git a/next/pages/servicos.js b/next/pages/servicos.js index 5cdba911..86e7c900 100644 --- a/next/pages/servicos.js +++ b/next/pages/servicos.js @@ -8,6 +8,8 @@ import { import { useEffect, useState } from "react"; import ImageNext from "next/image"; import Head from "next/head"; +import { useTranslation } from 'next-i18next'; +import { serverSideTranslations } from 'next-i18next/serverSideTranslations'; import { CaseStudiesPaged } from "../content/caseStudies"; import Display from "../components/atoms/Display"; import BodyText from "../components/atoms/BodyText"; @@ -22,11 +24,19 @@ import BDLogoLabImage from "../public/img/logos/bd_logo_lab" import CheckIcon from "../public/img/icons/checkIcon"; -export async function getStaticProps(context) { - return await withPages() + +export async function getStaticProps({ locale }) { + return { + props: { + ...(await serverSideTranslations(locale, ['common', 'services', 'menu'])), + ...(await withPages()), + }, + }; } function FixedBottomBar() { + const { t } = useTranslation('services'); + return ( - Gostaria de marcar uma reunião com nossa equipe? + {t('fixedBottomBar.text')} - Entre em contato + {t('fixedBottomBar.buttonText')} @@ -68,6 +78,8 @@ function FixedBottomBar() { } function Slogan () { + const { t } = useTranslation('services'); + return ( - Nossos serviços + {t('slogan.title')} - A Base dos Dados é a especialista que ajuda você ou sua equipe a trabalhar e extrair o máximo de valor dos dados. + {t('slogan.description')} - - Vamos fazer um projeto juntos - + + {t('slogan.cta')} + + ) } @@ -193,6 +208,7 @@ function WorkflowBox({ order, title, subtitle, children}) { } function CaseStudies ({}) { + const { t } = useTranslation('services'); const [CaseStudiesPages, setCaseStudiesPages] = useState([]) useEffect(() => { @@ -215,7 +231,7 @@ function CaseStudies ({}) { textAlign="center" marginBottom={useCheckMobile() ? "8px" : "16px"} > - Nossas soluções + {t('caseStudies.title')} - Descubra por que as instituições escolhem inovar com a Base dos Dados + {t('caseStudies.subtitle')} - Leia o estudo de caso + {t('caseStudies.readMore')} )} @@ -312,22 +328,21 @@ function CaseStudies ({}) { } export default function Services() { + const { t } = useTranslation('services'); + const services = { - "Captura de dados": - "https://storage.googleapis.com/basedosdados-website/images/cloud.png", - "Análise de dados": - "https://storage.googleapis.com/basedosdados-website/images/bar.png", - "Consultoria de dados": - "https://storage.googleapis.com/basedosdados-website/images/lightbulb.png", + [t('services.dataCapture')]: "https://storage.googleapis.com/basedosdados-website/images/cloud.png", + [t('services.dataAnalysis')]: "https://storage.googleapis.com/basedosdados-website/images/bar.png", + [t('services.dataConsulting')]: "https://storage.googleapis.com/basedosdados-website/images/lightbulb.png", } return ( - Serviços – Base dos Dados + {t('pageTitle')} @@ -345,6 +360,7 @@ export default function Services() { width="100%" maxWidth="1264px" margin="0 auto !important" + alignItems="center" direction={{ base: "column", lg: "row" }} gap="120px" > @@ -372,36 +388,31 @@ export default function Services() { spacing={0} > - Captura de dados + {t('dataCapture.title')} - Capturamos e disponibilizamos dados sob demanda com rapidez, escala e baixo custo. + {t('dataCapture.description')} - Você não precisa se preocupar em criar e manter uma infraestrutura - própria ou escrever códigos - nós cuidamos disso. Tudo é feito - seguindo a metodologia de tratamento e padronização da Base dos Dados, - e conforme as melhores práticas de engenharia de dados do mercado. As - tabelas tratadas podem ser disponibilizadas com exclusividade ou serem - públicas. + {t('dataCapture.longDescription')} - Principais vantagens - - Mesmo queries muito complexas demoram apenas minutos para serem processadas. + {t('dataCapture.advantages.title')} + + {t('dataCapture.advantages.speedDescription')} - - Nosso datalake escala magicamente para hexabytes se necessário. + + {t('dataCapture.advantages.scaleDescription')} - - Todo usuário possui 1TB gratuito por mês para consulta aos dados. + + {t('dataCapture.advantages.costDescription')} - Nosso trabalho com engenharia de dados + {t('dataCapture.work.title')} - - Utilizando da infraestrutura do Google Cloud Platform, uma - das maiores plataformas de armazenamento e processamento de dados, - garantimos a segurança e a confiabilidade do nosso trabalho. + + {t('dataCapture.work.technology.description')} - - Seja envios pontuais, atualizações recorrentes, acesso via{" "} - API, ou conexão com plataformas de BI, entregamos a - solução que você precisa de forma ágil e completa. + + {t('dataCapture.work.flexibility.description')} - - Frameworks reconhecidos - - } - > - Com frameworks e sistemas de gestão de dados, garantimos a qualidade e a organização do seu sistema - de dados sem gerar qualquer preocupação para sua equipe. + + {t('dataCapture.work.frameworks.description')} @@ -443,31 +443,26 @@ export default function Services() { spacing={0} > - Análise de dados + {t('dataAnalysis.title')} - Construímos análises, relatórios e indicadores essenciais para sua pesquisa ou tomada de decisão. + {t('dataAnalysis.description')} - As informações e insights são geradas a partir de diversos - conjuntos de dados já tratados no nosso datalake público - atrelado à expertise da nossa equipe de Dados. E mais: - utilizamos nossa metodologia padrão de tratamento para que você também - possa cruzar esses dados com quaisquer outras bases disponíveis no{" "} - datalake. + {t('dataAnalysis.longDescription')} - Exemplos de perguntas que podemos responder + {t('dataAnalysis.examples.title')} - Como vem evoluindo a economia brasileira, com indicadores detalhados mensais por setor? + {t('dataAnalysis.examples.example1')} - Quais escolas terão performance acima da média do estado em matemática no ano que vem? + {t('dataAnalysis.examples.example2')} - Quantas vezes o Diário Oficial da União publica sobre certo tema a cada dia? + {t('dataAnalysis.examples.example3')}
@@ -482,34 +477,31 @@ export default function Services() { spacing={0} > - Consultoria de dados + {t('dataConsulting.title')} - Orientamos como aplicar a nossa metodologia de limpeza, estruturação e padronização de dados + {t('dataConsulting.description')} - No seu projeto ou organização através de workshops e materiais - exclusivos. Reproduzir nosso processo de tratamento em seu próprio - banco de dados pode poupar horas de trabalho de sua equipe ao - consultar, manipular ou atualizar as informações. + {t('dataConsulting.longDescription')} - Principais vantagens + {t('dataConsulting.advantages.title')} - Experiência em construir infraestruturas capazes de suportar milhares de acessos mensais. + {t('dataConsulting.advantages.advantage1')} - Flexibilidade para projetos remotos em qualquer lugar do país. + {t('dataConsulting.advantages.advantage2')} - Equipe diversa e com expertise em diferentes áreas do conhecimento e dados. + {t('dataConsulting.advantages.advantage3')} - Frentes de atuação + {t('dataConsulting.areas.title')} - - Mentoria para equipes de engenharia de dados que buscam estruturar - processos de manutenção de dados, seus próprios datalakes ou - ainda alavancarem-se utilizando a infraestrutura da Base dos Dados. + + {t('dataConsulting.areas.infrastructure.description')} - - Workshops práticos, mostrando como funciona o datalake da - Base dos Dados e ensinando como explorar dados públicos para - matérias jornalísticas ou pesquisas científicas. + + {t('dataConsulting.areas.analysis.description')} - - Programas personalizados de ensino para utilizar pacotes de Python e - R da Base dos Dados, além de mentoria de SQL para construir análises - rápidas e escaláveis direto na nuvem. + + {t('dataConsulting.areas.programming.description')} @@ -545,65 +531,59 @@ export default function Services() { spacing={0} > - Nosso fluxo de trabalho + {t('workflow.title')} - Uma mesma metodologia de trabalho para todos os serviços, pautada na - satisfação dos clientes e na primazia pela qualidade. + {t('workflow.description')} - - Trabalhamos colaborativamente para compreender as reais necessidades por trás dos pedidos de nossos clientes. O trabalho de descoberta compreende discussões sobre os objetivos do projeto ou o uso dos dados a serem capturados e analisados. É nesta etapa que fica claro para nossa equipe e para os clientes o objetivo final do serviço. + + {t('workflow.steps.demand.description')} - - O segundo passo é entender qual a melhor forma de entregarmos o valor que você precisa. Não trabalhamos com propostas genéricas. Cada projeto é pensado e orientado 100% para as demandas dos clientes, seja no formato de entrega de dados, análises ou capacitações específicas. + + {t('workflow.steps.planning.description')} - - Uma vez alinhado o escopo, formato e expectativas, entregamos uma - proposta de orçamento completamente transparente. Para isso, - consideramos fatores como a quantidade e complexidade de{" "} - datasets, trabalho necessário, tamanho da equipe e urgência. - Tudo explícito de forma direta e em conformidade com o que foi - determinado até então. + + {t('workflow.steps.budget.description')} - - Por fim, nossa entrega é comprometida com prazos e, sobretudo, - qualidade. A comunicação é constante durante toda execução. - Trabalhando de forma lean e com profissionais experientes na - área, nossa equipe preza pela satisfação de nossos clientes. + + {t('workflow.steps.execution.description')} - - - Vamos fazer um projeto juntos - + + {t('slogan.cta')} + +
) diff --git a/next/pages/termos-e-privacidade.js b/next/pages/termos-e-privacidade.js index a0321581..f2dc3cec 100644 --- a/next/pages/termos-e-privacidade.js +++ b/next/pages/termos-e-privacidade.js @@ -13,12 +13,21 @@ import { MainPageTemplate } from "../components/templates/main"; import ServiceTerms from "../content/serviceTerms"; import PrivacyPolicy from "../content/privacyPolicy"; import { withPages } from "../hooks/pages.hook"; +import { useTranslation } from 'next-i18next'; +import { serverSideTranslations } from 'next-i18next/serverSideTranslations'; -export async function getStaticProps() { - return await withPages() +export async function getStaticProps({ locale }) { + const pages = await withPages(); + return { + props: { + ...pages, + ...(await serverSideTranslations(locale, ['common', 'menu', 'terms'])), + }, + }; } export default function TermsAndPolitics() { + const { t } = useTranslation('terms'); const router = useRouter() const { query } = router const [sectionSelected, setSectionSelected] = useState("") @@ -35,13 +44,13 @@ export default function TermsAndPolitics() { let targetElement = "" if(id === "terms") { - targetElement = document.getElementById("Termos de Serviço") - setSectionSelected("Termos de Serviço") + targetElement = document.getElementById("Terms Of Service") + setSectionSelected("Terms Of Service") movedScroll(useCheckMobile() ? 210 : 120) } if(id === "privacy") { - targetElement = document.getElementById("Políticas de Privacidade") - setSectionSelected("Políticas de Privacidade") + targetElement = document.getElementById("Privacy Policy") + setSectionSelected("Privacy Policy") movedScroll(targetElement?.offsetTop+120) } },[query?.section]) @@ -56,7 +65,7 @@ export default function TermsAndPolitics() { const targetElement = document.getElementById(elm) if (targetElement) { - if(targetElement.id === "Termos de Serviço") { + if(targetElement.id === "Terms Of Service") { movedScroll(useCheckMobile() ? 210 : 80) } else { movedScroll(targetElement?.offsetTop+120) @@ -81,7 +90,7 @@ export default function TermsAndPolitics() { letterSpacing="0.2px" onClick={() => handlerClick(section)} > - {section} + {t(section)} ) } @@ -89,10 +98,10 @@ export default function TermsAndPolitics() { return ( - Termos – Base dos Dados + {t('pageTitle')} @@ -107,7 +116,7 @@ export default function TermsAndPolitics() { paddingBottom={isMobileMod() ? "56px" : "66px" } color="#2B8C4D" > - Termos e Privacidade + {t('mainTitle')} - - + + Termos de Serviço + >{t('termsOfService')} Políticas de Privacidade + >{t('privacyPolicy')} diff --git a/next/pages/transparencia.js b/next/pages/transparencia.js index cda9011e..d22490df 100644 --- a/next/pages/transparencia.js +++ b/next/pages/transparencia.js @@ -5,6 +5,8 @@ import { } from "@chakra-ui/react"; import Head from "next/head"; import { useEffect, useState } from "react"; +import { useTranslation } from 'next-i18next'; +import { serverSideTranslations } from 'next-i18next/serverSideTranslations'; import { useCheckMobile } from "../hooks/useCheckMobile.hook"; import { withPages } from "../hooks/pages.hook"; import { MainPageTemplate } from "../components/templates/main"; @@ -17,11 +19,18 @@ import RoundedButton from "../components/atoms/RoundedButton"; import TransparencyImage from "../public/img/transparencyImage"; import DonationImage from "../public/img/donationImage"; -export async function getStaticProps() { - return await withPages() +export async function getStaticProps({ locale }) { + const pages = await withPages(); + return { + props: { + ...(await serverSideTranslations(locale, ['common', 'transparency', 'menu'])), + pages, + }, + }; } export default function Transparencia({ pages }) { + const { t } = useTranslation('transparency'); const [isMobileMod, setIsMobileMod] = useState(false) const isMobile = useCheckMobile(); @@ -88,15 +97,15 @@ export default function Transparencia({ pages }) { return ( - Transparência – Base dos Dados + {t('pageTitle')} @@ -116,14 +125,12 @@ export default function Transparencia({ pages }) { lineHeight={isMobileMod ? "40px" : "54px"} letterSpacing={isMobileMod ? "-0.5px" : "-0.8px" } > - Nossas contas são {isMobileMod ? " " :
} transparentes e abertas {isMobileMod ? " " :
} – como todo o resto. + {t('mainTitle1')} {isMobileMod ? " " :
} + {t('mainTitle2')} {isMobileMod ? " " :
} + {t('mainTitle3')} - - Somos uma organização não-governamental sem fins lucrativos e open source. A transparência fundamenta todas as nossas ações, desde o trabalho com dados públicos até a prestação de contas. Utilizamos os recursos para facilitar o acesso de milhares de pessoas a dados de qualidade. - - - Nesse espaço, você encontra informações referentes às nossas atividades, receitas e despesas. Acompanhe de perto como garantimos a sustentabilidade da organização. - + + {t('mainDescription2')}
- Indicador de sobrevida + {t('survivalIndicator')} @@ -178,13 +185,13 @@ export default function Transparencia({ pages }) { display={isMobileMod ? "none" : "flex"} paddingBottom={{base: "8px", lg: "24px"}} > - Indicador de sobrevida + {t('survivalIndicator')} - Esse é nosso indicador de sobrevida. Ele mostra o tempo que nossas atividades poderiam se manter caso a organização arrecadasse só o que já está planejado e se continuasse gastando como na média dos três meses anteriores. + {t('survivalDescription1')} - Abaixo, você confere os detalhes das fontes e destinações de recursos da organização. + {t('survivalDescription2')} @@ -199,14 +206,13 @@ export default function Transparencia({ pages }) { textAlign={isMobileMod ? "start" : "center"} paddingBottom={isMobileMod ? "24px" : "8px"} > - Dados da contabilidade + {t('accountingData')} - Como não poderia deixar de ser, todos os microdados{isMobileMod ? " " :
} - relativos à contabilidade da BD estão disponíveis no datalake público. + {t('accountingDescription1')} {isMobileMod ? " " :
} {t('accountingDescription2')}
- Acesse + {t('accessButton')} @@ -231,12 +237,12 @@ export default function Transparencia({ pages }) { gridGap={{ base: "64px", lg: "80px" }} > @@ -247,8 +253,8 @@ export default function Transparencia({ pages }) { textAlign={isMobileMod ? "start" : "end"} fontSize={isMobileMod ? "14px" : "16px"} > - Veja o painel completo aqui. + {t('fullDashboard')} {t('here')}. @@ -260,7 +266,7 @@ export default function Transparencia({ pages }) { - Estatuto e relatórios + {t('statuteReports')} - Em nosso estatuto, estão presentes as diretrizes que regulamentam o funcionamento e o processo de tomada de decisões da organização. O documento inclui também os direitos e deveres dos membros e as competências dos conselhos administrativos e fiscais. + {t('statuteDescription')} - Nossos relatórios apresentam todas as atividades empenhadas pela equipe. São diversos projetos que colaboram com a promoção da cultura de transparência, o desenvolvimento socioeconômico e a construção de políticas públicas baseadas em dados e evidências. + {t('reportsDescription')} @@ -294,7 +300,7 @@ export default function Transparencia({ pages }) { color="#42B0FF" href="https://storage.googleapis.com/basedosdados-website/pdf/bd_estatuto_social.pdf" > - BD Estatuto Social + {t('DBStatute')} @@ -313,7 +319,7 @@ export default function Transparencia({ pages }) { color="#42B0FF" href="https://drive.google.com/file/d/1OvqJWAg-m3IRt3NAYZB20uxemNqXJ_MO/view?usp=drive_link" > - BD Relatório Anual 2023 + {t('DBReport2023')} @@ -332,7 +338,7 @@ export default function Transparencia({ pages }) { color="#42B0FF" href="https://storage.googleapis.com/basedosdados-website/pdf/bd_relatorio_anual_2022.pdf" > - BD Relatório Anual 2022 + {t('DBReport2022')} @@ -352,7 +358,7 @@ export default function Transparencia({ pages }) { color="#42B0FF" href="https://storage.googleapis.com/basedosdados-website/pdf/bd_relatorio_anual_2021.pdf" > - BD Relatório Anual 2021 + {t('DBReport2021')} @@ -379,7 +385,7 @@ export default function Transparencia({ pages }) { paddingBottom={{base: "20px", lg: "24px"}} color="#FFF" > - Você também acredita no {isMobileMod ? " " :
} acesso a dados de qualidade? + {t('supportTitle1')} {isMobileMod ? " " :
} {t('supportTitle2')} - Tudo o que fazemos só é possível por conta das pessoas que apoiam o nosso trabalho. Ajude a BD a continuar facilitando o acesso a dados públicos. Com qualquer valor, você contribui para a manutenção dos nossos projetos e a sobrevivência da organização. + {t('supportDescription')} window.open("https://apoia.se/basedosdados", "_blank")} > - Apoie agora + {t('supportButton')} diff --git a/next/pages/user/[username].js b/next/pages/user/[username].js index 729e24df..1f53005e 100644 --- a/next/pages/user/[username].js +++ b/next/pages/user/[username].js @@ -45,6 +45,8 @@ import { CardPrice } from "../precos"; import PaymentSystem from "../../components/organisms/PaymentSystem"; import ImageCrop from "../../components/molecules/ImgCrop"; import { cleanString, triggerGAEvent } from "../../utils"; +import { useTranslation } from "react-i18next"; +import { serverSideTranslations } from 'next-i18next/serverSideTranslations'; import { LabelTextForm, @@ -70,7 +72,7 @@ import ErrIcon from "../../public/img/icons/errIcon"; import stylesPS from "../../styles/paymentSystem.module.css"; export async function getServerSideProps(context) { - const { req, res } = context + const { req, res, locale } = context let user = null if(req.cookies.userBD) user = JSON.parse(req.cookies.userBD) @@ -129,6 +131,7 @@ export async function getServerSideProps(context) { return { props: { + ...(await serverSideTranslations(locale, ['menu', 'user', 'prices'])), getUser, } } @@ -136,6 +139,7 @@ export async function getServerSideProps(context) { // Sections Of User Page const ProfileConfiguration = ({ userInfo }) => { + const { t } = useTranslation('user'); const [isLoading, setIsLoading] = useState(true) const [isImgLoading, setIsImgLoading] = useState(false) const [formData, setFormData] = useState({ @@ -197,22 +201,22 @@ const ProfileConfiguration = ({ userInfo }) => { const validationErrors = {} if (!formData.firstName) { - validationErrors.firstName = "Seu nome é um campo obrigatorio." + validationErrors.firstName = t('username.requiredField') } if(/\s/.test(formData.website)) { - validationErrors.website = "Não pode haver espaçamento nesse campo." + validationErrors.website = t('username.noSpaces') } if(/\s/.test(formData.github)) { - validationErrors.github = "Não pode haver espaçamento nesse campo." + validationErrors.github = t('username.noSpaces') } if(/\s/.test(formData.twitter)) { - validationErrors.twitter = "Não pode haver espaçamento nesse campo." + validationErrors.twitter = t('username.noSpaces') } if(/\s/.test(formData.linkedin)) { - validationErrors.linkedin = "Não pode haver espaçamento nesse campo." + validationErrors.linkedin = t('username.noSpaces') } if (formData.website) { - if(!formData.website.startsWith("http")) validationErrors.website = "Informe uma URL válida." + if(!formData.website.startsWith("http")) validationErrors.website = t('username.invalidURL') } setErrors(validationErrors) @@ -301,14 +305,14 @@ const ProfileConfiguration = ({ userInfo }) => { - + { - + { - + { checked={formData.isEmailVisible} onChange={handleCheckboxChange} /> - Tornar o e-mail de acesso à sua conta visível para o público. + {t('username.makeEmailPublic')} - + { - + @@ -412,7 +416,7 @@ const ProfileConfiguration = ({ userInfo }) => { name="github" value={formData.github} onChange={handleInputChange} - placeholder="Link para o perfil no GitHub" + placeholder={t('username.githubProfileLink')} fontFamily="ubuntu" height="40px" fontSize="14px" @@ -435,7 +439,7 @@ const ProfileConfiguration = ({ userInfo }) => { name="twitter" value={formData.twitter} onChange={handleInputChange} - placeholder="Link para o perfil no Twitter" + placeholder={t('username.twitterProfileLink')} fontFamily="ubuntu" height="40px" fontSize="14px" @@ -458,7 +462,7 @@ const ProfileConfiguration = ({ userInfo }) => { name="linkedin" value={formData.linkedin} onChange={handleInputChange} - placeholder="Link para o perfil no LinkedIn" + placeholder={t('username.linkedinProfileLink')} fontFamily="ubuntu" height="40px" fontSize="14px" @@ -481,7 +485,7 @@ const ProfileConfiguration = ({ userInfo }) => { letterSpacing="0.3px" color="#7D7D7D" > - Ao preencher os campos desta página, você nos dá consentimento para compartilhar essas informações onde quer que o seu perfil de usuário apareça. + {t('username.shareInfo')} { {isLoading ? : - "Atualizar perfil" + t('username.updateProfile') } @@ -508,7 +512,7 @@ const ProfileConfiguration = ({ userInfo }) => { width="100%" fontSize="18px" letterSpacing="0.1px" - >Foto de perfil + >{t('username.profilePicture')} { hasArrow isDisabled={menuAvatar.isOpen} bg="#2A2F38" - label="Editar" + label={t('username.edit')} fontSize="14px" fontWeight="400" letterSpacing="0.5px" @@ -598,7 +602,7 @@ const ProfileConfiguration = ({ userInfo }) => { color="#252A32" margin="0" _hover={{ color: "#42B0FF" }} - >Atualizar a foto + >{t('username.updatePicture')} { color="#252A32" _hover={{ color: "#42B0FF" }} onClick={() => hanlderRemovePicture()} - >Remover foto + >{t('username.removePicture')} @@ -630,6 +634,7 @@ const ProfileConfiguration = ({ userInfo }) => { } const Account = ({ userInfo }) => { + const { t } = useTranslation('user'); const emailModal = useDisclosure() const usernameModal = useDisclosure() const eraseModalAccount = useDisclosure() @@ -654,8 +659,8 @@ const Account = ({ userInfo }) => { async function submitUpdate() { setErrors({}) - if(formData.username === "") return setErrors({username: "Nome de usuário inválido."}) - if(formData.username.includes(" ")) return setErrors({username: "Nome de usuário não pode conter espaços."}) + if(formData.username === "") return setErrors({username: t('username.invalidUsername')}) + if(formData.username.includes(" ")) return setErrors({username: t('username.noSpacesInUsername')}) setIsLoading(true) const reg = new RegExp("(?<=:).*") @@ -673,13 +678,13 @@ const Account = ({ userInfo }) => { } if(result?.errors?.length > 0) { - setErrors({username: "Nome de usuário inválido ou já existe uma conta com este nome de usuário."}) + setErrors({username: t('username.usernameAlreadyExists')}) setIsLoading(false) } } async function eraseAccount(string) { - if(string = "deletar minha conta") { + if(string = t('username.deleteAccount')) { setIsLoading(true) const reg = new RegExp("(?<=:).*") const [ id ] = reg.exec(userInfo.id) @@ -696,7 +701,7 @@ const Account = ({ userInfo }) => { } } - const stringConfirm = confirmationWord === "deletar minha conta" + const stringConfirm = confirmationWord === t('username.deleteAccount') return ( @@ -726,7 +731,7 @@ const Account = ({ userInfo }) => { lineHeight="16px" letterSpacing="0.2px" marginLeft="8px !important" - >Voltar + >{t('username.back')} { Alterar e-mail + >{t('username.changeEmail')} { Confirme seu endereço de e-mail + >{t('username.confirmEmailAddress')} Enviamos uma confirmação de e-mail para + >{t('username.emailSentTo')} dadinho@basedosdados.org Confira sua caixa de entrada e siga as
-instruções enviadas no e-mail para completar a alteração.
+ >{t('username.checkInboxAndFollowInstructions')}
: - Insira o seu novo endereço de e-mail. Enviaremos as instruções para você completar a alteração. + {t('username.enterNewEmail')} - + - + window.open("./password-recovery", "_self")} - >Esqueceu a senha? + >{t('username.forgotPassword')} @@ -828,7 +832,7 @@ instruções enviadas no e-mail para completar a alteração. : setEmailSent(true)} > - Enviar e-mail + {t('username.sendEmail')} } @@ -883,7 +887,7 @@ instruções enviadas no e-mail para completar a alteração. Alterar nome de usuário + >{t('username.changeUsername')} - + : - "Atualizar nome de usuário" + t('username.updateUsername') } @@ -934,7 +938,7 @@ instruções enviadas no e-mail para completar a alteração. Tem certeza que deseja deletar sua conta? + >{t('username.confirmAccountDeletion')} - Após deletar sua conta, todos os dados serão permanentemente removidos e não poderão ser recuperados. + {t('username.accountDeletionWarning')} @@ -961,7 +965,7 @@ instruções enviadas no e-mail para completar a alteração.Por favor, confirme escrevendo: "deletar minha conta" abaixo. + >{t('username.confirmDeletion')} setConfirmationWord(e.target.value)} @@ -993,7 +997,7 @@ instruções enviadas no e-mail para completar a alteração. - Cancelar + {t('username.cancel')} : - "Deletar" + t('username.delete') } - {/* - E-mail - {userInfo.email} - emailModal.onOpen()} - >Alterar e-mail - */} - - Nome de usuário + {t('username.username')} usernameModal.onOpen()} - >Alterar nome de usuário + >{t('username.changeUsername')} - Exportar dados da conta - Saiba como seus dados são armazenados em nossos Termos de Uso e Políticas de Privacidade.{!isMobileMod() &&
} Para exportar os dados da sua conta, entre em contato conosco.
+ {t('username.exportAccountData')} + {t('username.dataStorageInfo')}{!isMobileMod() &&
} {t('username.exportDataInstructions')}
Entre em contato + >{t('username.contactUs')}
- Deletar conta - Após a exclusão, não será possível recuperar o acesso à sua conta. + {t('username.deleteAccount')} + {t('username.accountAccessWarning')} eraseModalAccount.onOpen()} - >Deletar minha conta + >{t('username.deleteMyAccount')}
) } const NewPassword = ({ userInfo }) => { + const { t } = useTranslation('user'); const newPasswordModal = useDisclosure() const [formData, setFormData] = useState({ password: "", @@ -1113,7 +1097,7 @@ const NewPassword = ({ userInfo }) => { const validationErrors = {} if(formData.password !== "" && formData.password === formData.newPassword) { - validationErrors.newPassword = "A nova senha tem quer ser diferente da atual" + validationErrors.newPassword = t('username.newPasswordDifferent') } if(!/^.{8,}$/.test(formData.newPassword)) { regexPassword = {...regexPassword, amount: true} @@ -1131,27 +1115,27 @@ const NewPassword = ({ userInfo }) => { regexPassword = {...regexPassword, special: true} } if (!formData.confirmPassword) { - validationErrors.confirmPassword = "Confirmar a senha é necessário" + validationErrors.confirmPassword = t('username.confirmPasswordRequired') } if(/\s/.test(formData.confirmPassword)) { - validationErrors.newPassword = "As senhas inseridas não podem conter espaçamentos." - validationErrors.confirmPassword = "As senhas inseridas não podem conter espaçamentos." + validationErrors.newPassword = t('username.noSpacesInPassword') + validationErrors.confirmPassword = t('username.noSpacesInPassword') } if(formData.confirmPassword !== formData.newPassword) { - validationErrors.confirmPassword = "A senha inserida não coincide com a senha criada no campo acima. Por favor, verifique se não há erros de digitação e tente novamente." + validationErrors.confirmPassword = t('username.passwordMismatch') } if(Object.keys(regexPassword).length > 0) validationErrors.regexPassword = regexPassword if(formData.password === "") { - validationErrors.password = "Por favor, insira a senha." + validationErrors.password = t('username.enterPassword') } if(formData.password !== "") { const result = await fetch(`/api/user/getToken?a=${btoa(userInfo.email)}&q=${btoa(formData.password)}&s=${"true"}`, {method: "GET"}) .then(res => res.json()) if(result.error) { - validationErrors.password = "A senha está incorreta. Por favor, tente novamente." + validationErrors.password = t('username.incorrectPassword') } } setErrors(validationErrors) @@ -1198,12 +1182,12 @@ const NewPassword = ({ userInfo }) => { Sua senha foi alterada com sucesso + >{t('username.passwordChangedSuccessfully')} Agora você pode utilizar a nova senha para acessar sua
conta na Base dos Dados.
+ >{t('username.useNewPassword')} { _hover={{transform: "none", opacity: 0.8}} onClick={() => window.open(`/user/${userInfo.username}`, "_self")} > - Continuar nas configurações + {t('username.continueSettings')} { _hover={{transform: "none", opacity: 0.8}} onClick={() => window.open("/", "_self")} > - Ir para a página inicial + {t('username.goToHomepage')} @@ -1244,7 +1228,7 @@ const NewPassword = ({ userInfo }) => { width="100%" marginBottom="8px" > - + { justifyContent="end" _hover={{opacity: "0.6"}} onClick={() => window.open("./password-recovery", "_self")} - >Esqueceu a senha? + >{t('username.forgotPassword')} { autoComplete="current-password" value={formData.password} onChange={(e) => handleInputChange(e, "password")} - placeholder="Insira a senha atual" + placeholder={t('username.enterCurrentPassword')} fontFamily="ubuntu" height="40px" fontSize="14px" @@ -1282,14 +1266,14 @@ const NewPassword = ({ userInfo }) => { }} elmRight={showPassword ? : { _hover={{opacity: "0.6"}} marginTop="8px" onClick={() => window.open("./password-recovery", "_self")} - >Esqueceu a senha? + >{t('username.forgotPassword')} - + { autoComplete="new-password" value={formData.newPassword} onChange={(e) => handleInputChange(e, "newPassword")} - placeholder="Crie uma nova senha" + placeholder={t('username.createNewPassword')} fontFamily="ubuntu" height="40px" fontSize="14px" @@ -1335,14 +1319,14 @@ const NewPassword = ({ userInfo }) => { }} elmRight={showNewPassword ? : { flexDirection="row" gap="4px" alignItems="flex-start" - > 0 ? "flex" : "none" : "none"}/> Certifique-se que a senha tenha no mínimo: + > 0 ? "flex" : "none" : "none"}/> {t('username.passwordRequirements')} - 8 caracteres - Uma letra maiúscula - Uma letra minúscula - Um dígito - Um caractere especial, dentre ! @ # ? ! % & * + {t('username.minCharacters')} + {t('username.uppercaseLetter')} + {t('username.lowercaseLetter')} + {t('username.digit')} + {t('username.specialCharacter')} {errors.newPassword && @@ -1377,7 +1361,7 @@ const NewPassword = ({ userInfo }) => { - + { autoComplete="new-password" value={formData.confirmPassword} onChange={(e) => handleInputChange(e, "confirmPassword")} - placeholder="Insira a senha novamente" + placeholder={t('username.enterPasswordAgain')} fontFamily="ubuntu" height="40px" fontSize="14px" @@ -1399,14 +1383,14 @@ const NewPassword = ({ userInfo }) => { }} elmRight={showConfirmPassword ? : { {isLoading ? : - "Atualizar senha" + t('username.updatePassword') } @@ -1438,9 +1422,9 @@ const NewPassword = ({ userInfo }) => { } const PlansAndPayment = ({ userData }) => { + const { t } = useTranslation('user'); const router = useRouter() const { query } = router - const [plan, setPlan] = useState("") const [checkoutInfos, setCheckoutInfos] = useState({}) const [valueCoupon, setValueCoupon] = useState("") @@ -1543,28 +1527,28 @@ const PlansAndPayment = ({ userData }) => { const resources = { "BD Gratis" : { - title: "BD Grátis", + title: t('username.DBFree'), buttons: [{ - text:"Comparar planos", + text: t('username.comparePlans'), onClick: () => { PlansModal.onOpen() setToggleAnual(true) }} ], resources : [ - {name: "Bases de baixa frequência atualizadas"}, - {name: "Tabelas tratadas"}, - {name: "Dados integrados", tooltip: "Nossa metodologia de padronização e compatibilização de dados permite que você cruze tabelas de diferentes instituições e temas de maneira simplificada."}, - {name: "Acesso em nuvem"}, - {name: "Acesso via SQL, Python e R"}, - {name: "Integração com ferramentas BI"}, - planActive ? "" : {name: "Download direto até 100 MB", tooltip: "Esse limite não se aplica ao acesso via SQL, Python e R."}, + {name: t('username.processedTables')}, + {name: t('username.integratedData'), tooltip: t('username.dataIntegrationTooltip')}, + {name: t('updatedLowFrequencyData')}, + {name: t('username.cloudAccess')}, + {name: t('username.sqlPythonRAccess')}, + {name: t('username.biIntegration')}, + planActive ? "" : {name: t('username.directDownloadLimit'), tooltip: t('username.downloadLimitTooltip')}, ] }, "bd_pro" : { - title: "BD Pro", + title: t('username.DBPro'), buttons : [{ - text:"Cancelar plano", + text: t('username.cancelPlan'), onClick: () => CancelModalPlan.onOpen(), props: { borderColor: subscriptionInfo?.canceledAt ? "#ACAEB1" : "#42B0FF", @@ -1573,15 +1557,15 @@ const PlansAndPayment = ({ userData }) => { } }], resources : [ - {name: "Dezenas de bases de alta frequência atualizadas"}, - {name: "Tabela de referência de empresas com informações atualizadas"}, - {name: "Download direto até 1 GB", tooltip: "Tabelas maiores que 1 GB não estão disponíveis para download parcial ou completo. Esse limite não se aplica ao acesso via SQL, Python e R."}, + {name: t('username.dozensOfHighFrequencyDatasets')}, + {name: t('username.companyReferenceTable')}, + {name: t('username.directDownloadLimitPro'), tooltip: t('username.downloadLimitProTooltip')}, ] }, "bd_pro_empresas" : { - title: "BD Empresas", + title: t('username.DBEnterprise'), buttons : [{ - text:"Cancelar plano", + text: t('username.cancelPlan'), onClick: () => CancelModalPlan.onOpen(), props: { borderColor: subscriptionInfo?.canceledAt ? "#ACAEB1" : "#42B0FF", @@ -1590,8 +1574,8 @@ const PlansAndPayment = ({ userData }) => { } }], resources : [ - {name: "Acesso para 10 contas"}, - {name: "Suporte prioritário via email e Discord"} + {name: t('username.accessFor10Accounts')}, + {name: t('username.prioritySupport')} ]} } @@ -1734,11 +1718,11 @@ const PlansAndPayment = ({ userData }) => { function formattedPlanInterval (value, variant = false) { if(variant) { - if(value === "month") return "mês" - if(value === "year") return "ano" + if(value === "month") return t('username.month') + if(value === "year") return t('username.year') } else { - if(value === "month") return "(Mensal)" - if(value === "year") return "(Anual)" + if(value === "month") return t('username.monthly') + if(value === "year") return t('username.annually') } } @@ -1775,13 +1759,13 @@ const PlansAndPayment = ({ userData }) => { const CouponDisplay = () => { let limitText - if(couponInfos?.duration === "once") limitText = toggleAnual ? "(válido por 1 ano)" : "(válido por 1 mês)" - if(couponInfos?.duration === "repeating") limitText = `(válido por ${couponInfos?.durationInMonths} ${couponInfos?.durationInMonths.length === 1 ? "mês" : "meses"})` + if(couponInfos?.duration === "once") limitText = toggleAnual ? t('username.validFor1Year') : t('username.validFor1Month') + if(couponInfos?.duration === "repeating") limitText = `${t('username.validFor')} ${couponInfos?.durationInMonths} ${couponInfos?.durationInMonths.length === 1 ? t('username.month') : t('username.months')}` return ( <> - Cupom {coupon.toUpperCase()} {limitText} + {t('username.coupon')} {coupon.toUpperCase()} {limitText} - {couponInfos?.discountAmount?.toLocaleString('pt-BR', { style: 'currency', currency: 'BRL', minimumFractionDigits: 2 })}/{formattedPlanInterval(checkoutInfos?.interval, true)} @@ -1802,7 +1786,7 @@ const PlansAndPayment = ({ userData }) => { return ( <> - Total a pagar + {t('username.totalToPay')} {value}/{formattedPlanInterval(checkoutInfos?.interval, true)} @@ -1890,7 +1874,7 @@ const PlansAndPayment = ({ userData }) => { fontSize="24px" lineHeight="36px" > - Pagamento + {t('username.payment')} { setValueCoupon("") PlansModal.onOpen() }} - >Alterar plano + >{t('username.changePlan')} { fontSize="16px" lineHeight="24px" color="#252A32" - >Desconto anual + > + {t('username.annualDiscount')} + - { padding="2px 4px" borderRadius="4px" height="32px" - >Economize 20% + > + {t('username.save20')} + @@ -2007,7 +1996,7 @@ const PlansAndPayment = ({ userData }) => { lineHeight="24px" color="#252A32" > - Cupom de desconto + {t('username.discountCoupon')} { inputFocus={couponInputFocus} changeInputFocus={setCouponInputFocus} width="100%" - placeholder="Insira o cupom" + placeholder={t('username.enterCoupon')} inputElementStyle={{ display: "none", }} @@ -2039,7 +2028,7 @@ const PlansAndPayment = ({ userData }) => { position="absolute" top="10px" right="12px" - alt="apagar" + alt={t('username.clear')} width="24px" height="24px" fill="#878A8E" @@ -2073,7 +2062,7 @@ const PlansAndPayment = ({ userData }) => { lineHeight="20px" onClick={() => validateStripeCoupon()} > - Aplicar + {t('username.apply')} @@ -2094,7 +2083,7 @@ const PlansAndPayment = ({ userData }) => { width="21px" height="21px" fill="#BF3434" - /> Por favor, insira um cupom válido. + /> {t('username.enterValidCoupon')} } @@ -2106,7 +2095,9 @@ const PlansAndPayment = ({ userData }) => { fontSize="16px" lineHeight="24px" color="#464A51" - >Período de teste - 7 dias grátis + > + {t('username.trialPeriod')} + @@ -2122,7 +2113,7 @@ const PlansAndPayment = ({ userData }) => { color="#464A51" > - Subtotal + {t('username.subtotal')} {checkoutInfos?.amount?.toLocaleString('pt-BR', { style: 'currency', currency: 'BRL', minimumFractionDigits: 2 })}/{formattedPlanInterval(checkoutInfos?.interval, true)} @@ -2142,7 +2133,13 @@ const PlansAndPayment = ({ userData }) => { lineHeight="24px" color="#464A51" > - A partir do {couponInfos?.duration === "once" && 2} {couponInfos?.duration === "repeating" && couponInfos?.durationInMonths + 1}º {formattedPlanInterval(checkoutInfos?.interval, true)} {!hasSubscribed && "e 7º dia"}, o total a pagar será de {checkoutInfos?.amount?.toLocaleString('pt-BR', { style: 'currency', currency: 'BRL', minimumFractionDigits: 2 })}/{formattedPlanInterval(checkoutInfos?.interval, true)}. + {t('username.afterCouponExpiration', { + duration: couponInfos?.duration === "once" ? 2 : couponInfos?.durationInMonths + 1, + interval: formattedPlanInterval(checkoutInfos?.interval, true), + trialDay: !hasSubscribed && t('username.andTrialDay'), + amount: checkoutInfos?.amount?.toLocaleString('pt-BR', { style: 'currency', currency: 'BRL', minimumFractionDigits: 2 }), + interval2: formattedPlanInterval(checkoutInfos?.interval, true) + })} } @@ -2188,7 +2185,7 @@ const PlansAndPayment = ({ userData }) => { lineHeight="24px" color="#252A32" > - Detalhes do pagamento + {t('username.paymentDetails')} { lineHeight="36px" color="#252A32" > - Assinatura efetuada com sucesso! + {t('username.congratulations')} +// Assinatura efetuada com sucesso! { lineHeight="24px" color="#464A51" > - O acesso aos dados foi concedido para o e-mail {emailGCP}. Se precisar alterar o e-mail de acesso, você pode fazer isso na seção “BigQuery” das configurações da sua conta. - Em caso de dúvida, entre em contato com nosso suporte. + {t('username.paymentSuccessful')} +// O acesso aos dados foi concedido para o e-mail {emailGCP}. Se precisar alterar o e-mail de acesso, você pode fazer isso na seção “BigQuery” das configurações da sua conta. +// Em caso de dúvida, entre em contato com nosso suporte. @@ -2509,7 +2508,8 @@ const PlansAndPayment = ({ userData }) => { {isLoading ? : - "Alterar e-mail de acesso" + t('username.continueSettings') +// "Alterar e-mail de acesso" } @@ -2541,7 +2541,7 @@ const PlansAndPayment = ({ userData }) => { {isLoadingH ? : - "Ir para a página inicial" + t('username.goToHomepage') } @@ -2585,7 +2585,7 @@ const PlansAndPayment = ({ userData }) => { lineHeight="40px" color="#252A32" > - O pagamento falhou + {t('username.paymentFailed')} { letterSpacing="0.2px" color="#7D7D7D" > - Houve um problema ao processar seu pagamento. - Por favor, verifique se as informações estão corretas ou tente novamente mais tarde. - Se esta mensagem continuar a ser exibida, + {t('username.paymentError')} { href="/contato" target="_self" marginLeft="2px" - >entre em contato + >{t('username.contactUs')} . @@ -2624,7 +2622,7 @@ const PlansAndPayment = ({ userData }) => { _hover={{transform: "none", opacity: 0.8}} onClick={() => ErroPaymentModal.onClose()} > - Entendi + {t('username.understood')} @@ -2656,7 +2654,7 @@ const PlansAndPayment = ({ userData }) => { lineHeight="36px" paddingLeft="10px" > - Compare os planos + {t('username.comparePlans')} { textAlign="center" color="#252A32" > - Desconto anual + {t('username.annualDiscount')} { padding="2px 4px" borderRadius="4px" height="32px" - >Economize 20% + > + {t('username.save20')} + @@ -2724,12 +2724,11 @@ const PlansAndPayment = ({ userData }) => { spacing={0} > Para você descobrir o potencial da plataforma de dados} + title={t('username.DBFree')} + subTitle={<>{t('username.DBFreeSubtitle')}} price={"0"} - textResource="Recursos:" + textResource={t('username.resources')} resources={[ - {name: "Bases de baixa frequência atualizadas"}, {name: "Tabelas tratadas"}, {name: "Dados integrados", tooltip: "Nossa metodologia de padronização e compatibilização de dados permite que você cruze tabelas de diferentes instituições e temas de maneira simplificada."}, {name: "Acesso em nuvem"}, @@ -2738,25 +2737,25 @@ const PlansAndPayment = ({ userData }) => { {name: "Download direto até 100 MB", tooltip: "Esse limite não se aplica ao acesso via SQL, Python e R."}, ]} button={{ - text: "Explorar recursos", + text: t('username.exploreFeatures'), href: "/dataset", noHasModal: true, }} /> Para você ter acesso aos
dados mais atualizados} + title={t('username.DBPro')} + subTitle={<>{t('username.DBProSubtitle')}} price={plans?.[`bd_pro_${toggleAnual ? "year" : "month"}`].amount || 444} anualPlan={toggleAnual} - textResource="Todos os recursos da BD Grátis, mais:" + textResource={t('username.allDBFreeResources')} resources={[ - {name: "Dezenas de bases de alta frequência atualizadas"}, - {name: "Tabela de referência de empresas com informações atualizadas"}, - {name: "Download direto até 1GB (80% das tabelas da plataforma)", tooltip: "Tabelas maiores que 1 GB não estão disponíveis para download parcial ou completo. Esse limite não se aplica ao acesso via SQL, Python e R."} + {name: t('username.dozensOfHighFrequencyDatasets')}, + {name: t('username.companyReferenceTable')}, + {name: t('username.directDownloadLimitPro'), tooltip: t('username.downloadLimitProTooltip')} ]} button={{ - text: `${subscriptionInfo?.stripeSubscription === "bd_pro" ? "Plano atual" : hasSubscribed ? "Assinar" : "Iniciar teste grátis"}`, + text: `${subscriptionInfo?.stripeSubscription === "bd_pro" ? t('username.currentPlan') : hasSubscribed ? t('username.subscribe') : t('username.startFreeTrial')}`, onClick: subscriptionInfo?.stripeSubscription === "bd_pro" ? () => {} : () => { setPlan(plans?.[`bd_pro_${toggleAnual ? "year" : "month"}`]._id) PlansModal.onClose() @@ -2767,17 +2766,17 @@ const PlansAndPayment = ({ userData }) => { /> Para sua empresa ganhar tempo
e qualidade em decisões} + title={t('username.DBEnterprise')} + subTitle={<>{t('username.DBEnterpriseSubtitle')}} price={plans?.[`bd_empresas_${toggleAnual ? "year" : "month"}`].amount || 3360} anualPlan={toggleAnual} - textResource="Todos os recursos da BD Pro, mais:" + textResource={t('username.allDBProResources')} resources={[ - {name: "Acesso para 10 contas"}, - {name: "Suporte prioritário via email e Discord"} + {name: t('username.accessFor10Accounts')}, + {name: t('username.prioritySupport')} ]} button={{ - text: `${subscriptionInfo?.stripeSubscription === "bd_pro_empresas" ? "Plano atual" : hasSubscribed ? "Assinar" : "Iniciar teste grátis"}`, + text: `${subscriptionInfo?.stripeSubscription === "bd_pro_empresas" ? t('username.currentPlan') : hasSubscribed ? t('username.subscribe') : t('username.startFreeTrial')}`, onClick: subscriptionInfo?.stripeSubscription === "bd_pro_empresas" ? () => {} : () => { setPlan(plans?.[`bd_empresas_${toggleAnual ? "year" : "month"}`]._id) PlansModal.onClose() @@ -2802,7 +2801,7 @@ const PlansAndPayment = ({ userData }) => { height={isMobileMod() ? "100%" : "fit-content"} > - Alteração de planos + {t('username.planChange')} { - Para realizar o upgrade ou downgrade, por favor, - entre em contato com a nossa equipe. - Estamos prontos para ajudar você a fazer a transição para o novo plano o mais rápido possível! + {t('username.changePlanInstructions')} @@ -2828,14 +2825,14 @@ const PlansAndPayment = ({ userData }) => { > { AlertChangePlanModal.onClose() window.open("/contato", "_self") }} > - Entrar em contato + {t('username.contactUs')} @@ -2852,7 +2849,7 @@ const PlansAndPayment = ({ userData }) => { height={isMobileMod() ? "100%" : "fit-content"} > - Tem certeza que deseja cancelar seu plano? + {t('username.confirmPlanCancellation')} { _hover={{transform: "none", opacity: 0.8}} onClick={() => CancelModalPlan.onClose()} > - Voltar + {t('username.back')} { {isLoadingCanSub ? : - "Cancelar plano" + t('username.cancelPlan') } @@ -2922,7 +2919,7 @@ const PlansAndPayment = ({ userData }) => { fontWeight="500" letterSpacing="0.1px" > - {planActive ? planCanceled ? "Cancelado" : "Ativo" : "Ativo"} + {planActive ? planCanceled ? t('username.canceled') : t('username.active') : t('username.active')} { lineHeight="22px" color="#252A32" > - {subscriptionInfo?.canceledAt ? "Acesso ao plano disponível até:" : "Próxima data de renovação automática: "} @@ -3001,7 +2998,7 @@ const PlansAndPayment = ({ userData }) => { lineHeight="16px" letterSpacing="0.2px" marginBottom="8px" - >Inclui + >{t('username.includes')} {defaultResource.resources.map((elm, index) => { if(elm === "") return return @@ -3033,7 +3030,7 @@ const PlansAndPayment = ({ userData }) => { lineHeight="16px" letterSpacing="0.2px" marginBottom="8px" - >Não inclui} + >{t('username.doesNotInclude')}} {!planActive && <> @@ -3065,7 +3062,7 @@ const PlansAndPayment = ({ userData }) => { setToggleAnual(true) }} > - Veja tudo e compare os planos + {t('username.viewAllAndComparePlans')} } @@ -3084,7 +3081,7 @@ const Accesses = ({ userInfo }) => { top="-10px" placement="top" bg="#2A2F38" - label="Disponível apenas no plano BD Empresas" + label={t('username.onlyAvailableInBDEnterprises')} fontSize="14px" fontWeight="400" fontFamily="Lato" @@ -3101,7 +3098,7 @@ const Accesses = ({ userInfo }) => { _hover={{transform: "none"}} cursor="default" backgroundColor="#C4C4C4" - >Adicionar usuário + >{t('username.addUser')}
@@ -3117,7 +3114,7 @@ const Accesses = ({ userInfo }) => { fontWeight="400" lineHeight="16px" letterSpacing="0.2px" - >Usuário + >{t('username.user')} { lineHeight="16px" letterSpacing="0.2px" width="100%" - >Acesso + >{t('username.access')} { lineHeight="27px" letterSpacing="0.3px" > - Administrador + {t('username.administrator')} @@ -3328,6 +3325,7 @@ const BigQuery = ({ userInfo }) => { } export default function UserPage({ getUser }) { + const { t } = useTranslation('user') const router = useRouter() const { query } = router const [userInfo, setUserInfo] = useState({}) @@ -3343,11 +3341,15 @@ export default function UserPage({ getUser }) { } const choices = [ - {bar: "Perfil público", title: "Perfil público", value: "profile", index: 0}, - {bar: "Conta", title: "Conta", value: "account", index: 1}, - {bar: "Senha", title: "Alterar senha", value: "new_password", index: 2}, - {bar: "Planos e pagamento", title: "Planos e pagamento", value: "plans_and_payment", index: 3}, - isUserPro() && {bar: "BigQuery", title: "BigQuery", value: "big_query", index: 4}, + {bar: t('username.publicProfile'), title: t('username.publicProfile'), value: "profile", index: 0}, + {bar: t('username.account'), title: t('username.account'), value: "account", index: 1}, + {bar: t('username.changePassword'), title: t('username.changePassword'), value: "new_password", index: 2}, + {bar: t('username.plansAndPayment'), title: t('username.plansAndPayment'), value: "plans_and_payment", index: 3}, +// {bar: "Perfil público", title: "Perfil público", value: "profile", index: 0}, +// {bar: "Conta", title: "Conta", value: "account", index: 1}, +// {bar: "Senha", title: "Alterar senha", value: "new_password", index: 2}, +// {bar: "Planos e pagamento", title: "Planos e pagamento", value: "plans_and_payment", index: 3}, +// isUserPro() && {bar: "BigQuery", title: "BigQuery", value: "big_query", index: 4}, ] // {bar: "Acessos", title: "Gerenciar acessos", value: "accesses", index: 4}, @@ -3376,7 +3378,7 @@ export default function UserPage({ getUser }) { spacing={0} gap="40px" > - Configurações + {t('username.settings')} res.json()) - const data = result + .then(res => res.json()); + const data = result; return { props: { + ...(await serverSideTranslations(locale, ['user'])), data } } } export default function ActiveAccount({ data }) { + const { t } = useTranslation('user'); + return ( Conta ativa + >{t('activate.accountActive')} - Parabéns! Sua conta foi ativada com sucesso. Agora você faz parte da nossa comunidade. - Agradecemos por se juntar a nós. Estamos aqui para ajudar no que precisar. - Bem-vindo(a)! + {t('activate.congratulations')} + {t('activate.thankYou')} + {t('activate.welcome')} window.open("/user/login", "_self")} > - Logar na conta + {t('activate.loginToAccount')} : @@ -72,14 +76,14 @@ export default function ActiveAccount({ data }) { letterSpacing={isMobileMod() ? "0" : "-0.4px"} fontweith="500" textAlign="center" - >Algo deu errado + >{t('activate.somethingWentWrong')} - Lamentamos informar que ocorreu um problema durante a ativação da sua conta. Pedimos desculpas pela inconveniência. + {t('activate.activationProblem')} window.open("/contato", "_self")} > - Entrar em contato + {t('activate.contactUs')} } diff --git a/next/pages/user/check-email.js b/next/pages/user/check-email.js index a11241f2..dcfd04ca 100644 --- a/next/pages/user/check-email.js +++ b/next/pages/user/check-email.js @@ -4,6 +4,8 @@ import { } from "@chakra-ui/react"; import { useState, useEffect } from "react"; import axios from "axios"; +import { useTranslation } from 'next-i18next'; +import { serverSideTranslations } from 'next-i18next/serverSideTranslations'; import Display from "../../components/atoms/Display"; import { isMobileMod } from "../../hooks/useCheckMobile.hook" @@ -11,7 +13,16 @@ import { MainPageTemplate } from "../../components/templates/main"; import { EmailConfirmImage } from "../../public/img/emailImage"; +export async function getStaticProps({ locale }) { + return { + props: { + ...(await serverSideTranslations(locale, ['user'])), + }, + }; +} + export default function CheckEmail() { + const { t } = useTranslation('user'); const [email, setEmail] = useState("") const [count, setCount] = useState(0) const [forwardingDisabled, setForwardingDisabled] = useState(false) @@ -70,7 +81,7 @@ export default function CheckEmail() { letterSpacing={isMobileMod() ? "0" : "-0.4px"} fontweith="500" textAlign="center" - >Confirme seu endereço de e-mail + >{t('checkEmail.confirmEmail')} - Enviamos uma confirmação de e-mail para + {t('checkEmail.sentConfirmation')} - Confira sua caixa de entrada e siga as instruções enviadas no e-mail para completar o cadastro. + {t('checkEmail.checkInbox')} handleEmailConfirm()} - >{forwardingDisabled ? `Espere ${count} segundos...` :"Reenviar e-mail"} + >{forwardingDisabled ? t('checkEmail.waitSeconds', { count }) : t('checkEmail.resendEmail')} ) -} \ No newline at end of file +} diff --git a/next/pages/user/login.js b/next/pages/user/login.js index 24ad958c..7cffb749 100644 --- a/next/pages/user/login.js +++ b/next/pages/user/login.js @@ -9,6 +9,8 @@ import axios from "axios"; import { useState } from "react"; import { useRouter } from "next/router"; import cookies from 'js-cookie'; +import { useTranslation } from 'next-i18next'; +import { serverSideTranslations } from 'next-i18next/serverSideTranslations'; import Display from "../../components/atoms/Display"; import Input from "../../components/atoms/SimpleInput"; @@ -23,11 +25,18 @@ import { EyeIcon, EyeOffIcon } from "../../public/img/icons/eyeIcon"; import { withPages } from "../../hooks/pages.hook"; -export async function getStaticProps() { - return await withPages() +export async function getStaticProps({ locale }) { + const pages = await withPages(); + return { + props: { + ...pages, + ...(await serverSideTranslations(locale, ['user'])), + }, + }; } export default function Login() { + const { t } = useTranslation('user'); const router = useRouter() const { query } = router const [formData, setFormData] = useState({ email: "", password: "" }) @@ -46,11 +55,11 @@ export default function Login() { let validationErrors = {} if (!formData.email) { - validationErrors.email = "Por favor, insira um endereço de e-mail válido." + validationErrors.email = t('login.emailError'); } else if (!/^\S+@\S+$/.test(formData.email)) { - validationErrors.email = "Por favor, insira um endereço de e-mail válido." + validationErrors.email = t('login.emailError'); } - if (!formData.password) validationErrors.password = "Por favor, insira a senha." + if (!formData.password) validationErrors.password = t('login.passwordError'); setErrors(validationErrors) if (Object.keys(validationErrors).length === 0) { @@ -72,12 +81,12 @@ export default function Login() { await axios.post(`${process.env.NEXT_PUBLIC_API_URL}/account/account_activate/${btoa(id)}/`) return window.open("/user/check-email?e=1", "_self") } - return setErrors({login:"E-mail ou senha incorretos."}) + return setErrors({login: t('login.loginError')}) } const userData = await fetch(`/api/user/getUser?p=${btoa(result.id)}`, {method: "GET"}) .then(res => res.json()) - if(userData.error) return setErrors({login:"Não foi possível conectar ao servidor. Tente novamente mais tarde."}) + if(userData.error) return setErrors({login: t('login.serverError')}) cookies.set('userBD', JSON.stringify(userData)) @@ -125,7 +134,7 @@ export default function Login() { letterSpacing={isMobileMod() ? "-0.4px" : "-1.5px"} marginBottom="40px" textAlign="center" - >Faça login + >{t('login.title')} {errors.login && - + handleInputChange(e, "email")} - placeholder="Insira seu e-mail" + placeholder={t('login.emailPlaceholder')} fontFamily="ubuntu" height="40px" fontSize="14px" @@ -172,7 +181,7 @@ export default function Login() { width="100%" marginBottom="8px" > - + window.open("./password-recovery", "_self")} - >Esqueceu a senha? + >{t('login.forgotPassword')} @@ -196,7 +205,7 @@ export default function Login() { autoComplete="current-password" value={formData.password} onChange={(e) => handleInputChange(e, "password")} - placeholder="Insira sua senha" + placeholder={t('login.passwordPlaceholder')} fontFamily="ubuntu" height="40px" fontSize="14px" @@ -236,7 +245,7 @@ export default function Login() { marginBottom="24px !important" backgroundColor="#42B0FF" > - Entrar + {t('login.loginButton')} @@ -249,7 +258,7 @@ export default function Login() { fontSize="14px" fontFamily="ubuntu" > - Não tem uma conta? + {t('login.noAccount')} window.open("./register", "_self")} - >{" "}Cadastre-se + >{t('login.signUp')} . diff --git a/next/pages/user/password-recovery.js b/next/pages/user/password-recovery.js index 80d8e6a6..8fce83e3 100644 --- a/next/pages/user/password-recovery.js +++ b/next/pages/user/password-recovery.js @@ -11,6 +11,8 @@ import { import { useState, useEffect } from "react"; import axios from "axios"; import InputForm from "../../components/atoms/SimpleInput"; +import { useTranslation } from 'next-i18next'; +import { serverSideTranslations } from 'next-i18next/serverSideTranslations'; import Display from "../../components/atoms/Display"; import Link from "../../components/atoms/Link"; @@ -23,24 +25,27 @@ import Exclamation from "../../public/img/icons/exclamationIcon"; import { EyeIcon, EyeOffIcon } from "../../public/img/icons/eyeIcon"; export async function getServerSideProps(context) { - const { query } = context - let confirmed = false + const { query, locale } = context; + let confirmed = false; - if(query.q !== undefined && query.p !== undefined) confirmed = true + if (query.q !== undefined && query.p !== undefined) confirmed = true; - let uid = query?.q || "" - let confirmToken = query?.p || "" + let uid = query?.q || ""; + let confirmToken = query?.p || ""; return { props: { + ...(await serverSideTranslations(locale, ['user'])), confirmed, uid, - confirmToken - } - } + confirmToken, + }, + }; } export default function PasswordRecovery({ confirmed, uid, confirmToken }) { + const { t } = useTranslation('user'); + const [email, setEmail] = useState("") const [error, setError] = useState("") const [count, setCount] = useState(0) @@ -69,14 +74,14 @@ export default function PasswordRecovery({ confirmed, uid, confirmToken }) { if(value === "") return null const regexEmail = /^[^\s@]+@[^\s@]+\.[^\s@]+$/ - if(!regexEmail.test(value)) return setError("Endereço de e-mail inválido.") + if(!regexEmail.test(value)) return setError(t('passwordRecovery.invalidEmail')) const API_URL = `${process.env.NEXT_PUBLIC_API_URL}` const getIdUser = await fetch(`/api/user/getIdUser?p=${btoa(value)}`, {method: "GET"}) .then(res => res.json()) - if(getIdUser.error) return setError("Endereço de e-mail inválido.") + if(getIdUser.error) return setError(t('passwordRecovery.invalidEmail')) const reg = new RegExp("(?<=:).*") const [ id ] = reg.exec(getIdUser?.id) @@ -124,20 +129,20 @@ export default function PasswordRecovery({ confirmed, uid, confirmToken }) { regexPassword = {...regexPassword, special: true} } if (!formData.confirmPassword) { - validationErrors.confirmPassword = "Confirmar a senha é necessário" + validationErrors.confirmPassword = t('passwordRecovery.confirmPasswordRequired') } if(/\s/.test(formData.confirmPassword)) { - validationErrors.password = "As senhas inseridas não podem conter espaçamentos." - validationErrors.confirmPassword = "As senhas inseridas não podem conter espaçamentos." + validationErrors.password = t('passwordRecovery.passwordNoSpaces') + validationErrors.confirmPassword = t('passwordRecovery.passwordNoSpaces') } if(formData.confirmPassword !== formData.password) { - validationErrors.confirmPassword = "A senha inserida não coincide com a senha criada no campo acima. Por favor, verifique se não há erros de digitação e tente novamente." + validationErrors.confirmPassword = t('passwordRecovery.passwordMismatch') } if(Object.keys(regexPassword).length > 0) validationErrors.regexPassword = regexPassword if(formData.password === "") { - validationErrors.password = "Por favor, insira a senha." + validationErrors.password = t('passwordRecovery.passwordRequired') } setErrors(validationErrors) @@ -199,7 +204,7 @@ export default function PasswordRecovery({ confirmed, uid, confirmToken }) { letterSpacing={isMobileMod() ? "0" : "-0.4px"} fontweith="500" textAlign="center" - >Redefina sua nova senha + >{t('passwordRecovery.titleConfirmed')}
- + handleInputChange(e, "password")} - placeholder="Crie uma nova senha" + placeholder={t('passwordRecovery.newPasswordPlaceholder')} fontFamily="ubuntu" height="40px" fontSize="14px" @@ -258,13 +263,13 @@ export default function PasswordRecovery({ confirmed, uid, confirmToken }) { flexDirection="row" gap="4px" alignItems="flex-start" - > 0 ? "flex" : "none" : "none"}/> Certifique-se que a senha tenha no mínimo: + > 0 ? "flex" : "none" : "none"}/> {t('passwordRecovery.passwordRequirements')} - 8 caracteres - Uma letra maiúscula - Uma letra minúscula - Um dígito - Um caractere especial, dentre ! @ # ? ! % & * + {t('passwordRecovery.passwordRequirementChars')} + {t('passwordRecovery.passwordRequirementUppercase')} + {t('passwordRecovery.passwordRequirementLowercase')} + {t('passwordRecovery.passwordRequirementDigit')} + {t('passwordRecovery.passwordRequirementSpecial')} {errors.password && @@ -274,7 +279,7 @@ export default function PasswordRecovery({ confirmed, uid, confirmToken }) { - + handleInputChange(e, "confirmPassword")} - placeholder="Insira a senha novamente" + placeholder={t('passwordRecovery.confirmPasswordPlaceholder')} fontFamily="ubuntu" height="40px" fontSize="14px" @@ -322,7 +327,7 @@ export default function PasswordRecovery({ confirmed, uid, confirmToken }) { _hover={{transform: "none", opacity: 0.8}} width="fit-content" > - Atualizar senha + {t('passwordRecovery.updatePassword')} @@ -354,7 +359,7 @@ export default function PasswordRecovery({ confirmed, uid, confirmToken }) { letterSpacing={isMobileMod() ? "0" : "-0.4px"} fontweith="500" textAlign="center" - >Redefina sua senha + >{t('passwordRecovery.title')} - Insira o endereço de e-mail que você usou para cadastrar sua conta. Enviaremos as instruções para você redefinir sua senha. + {t('passwordRecovery.description')} - E-mail + {t('passwordRecovery.emailLabel')} handleEmailPasswordRecovery(email)} > - {forwardingDisabled ? `Espere ${count} segundos...` :"Enviar e-mail de redefinição"} + {forwardingDisabled ? t('passwordRecovery.waitSeconds', { count }) : t('passwordRecovery.sendResetEmail')} - Se ainda precisar de ajuda, entre em contato. + {t('passwordRecovery.needHelp')}{' '} + + {t('passwordRecovery.contactUs')} + + . diff --git a/next/pages/user/register.js b/next/pages/user/register.js index cf8d045d..664a9d1a 100644 --- a/next/pages/user/register.js +++ b/next/pages/user/register.js @@ -9,6 +9,8 @@ import { Text } from "@chakra-ui/react"; import { useState } from "react"; +import { useTranslation } from 'next-i18next'; +import { serverSideTranslations } from 'next-i18next/serverSideTranslations'; import { triggerGAEvent } from "../../utils"; import Input from "../../components/atoms/SimpleInput"; @@ -24,11 +26,18 @@ import Link from "../../components/atoms/Link"; import { withPages } from "../../hooks/pages.hook"; -export async function getStaticProps() { - return await withPages() +export async function getStaticProps({ locale }) { + return { + props: { + ...(await serverSideTranslations(locale, ['user'])), + ...(await withPages()), + }, + }; } export default function Register() { + const { t } = useTranslation('user'); + const [formData, setFormData] = useState({ firstName: "", lastName: "", @@ -64,19 +73,19 @@ export default function Register() { const validationErrors = {} if (!formData.firstName) { - validationErrors.firstName = "Por favor, insira seu nome." + validationErrors.firstName = t('signup.errors.firstName') } if (!formData.username) { - validationErrors.username = "Nome de usuário inválido ou já existe uma conta com este nome de usuário." + validationErrors.username = t('signup.errors.username.invalid') } if(/\s/.test(formData.username)) { - validationErrors.username = "Nome de usuário não pode haver espaçamento." + validationErrors.username = t('signup.errors.username.noSpaces') } if (!formData.email) { - validationErrors.email = "Endereço de e-mail inválido ou já existe uma conta com este e-mail." + validationErrors.email = t('signup.errors.email.invalid') } if (!/^\S+@\S+$/.test(formData.email)) { - validationErrors.email = "Endereço de e-mail inválido ou já existe uma conta com este e-mail." + validationErrors.email = t('signup.errors.email.invalid') } if(!/^.{8,}$/.test(formData.password)) { regexPassword = {...regexPassword, amount: true} @@ -94,14 +103,14 @@ export default function Register() { regexPassword = {...regexPassword, special: true} } if (!formData.confirmPassword) { - validationErrors.confirmPassword = "Confirmar a senha é necessário." + validationErrors.confirmPassword = t('signup.errors.confirmPassword.required') } if(/\s/.test(formData.confirmPassword)) { - validationErrors.password = "As senhas inseridas não podem conter espaçamentos." - validationErrors.confirmPassword = "As senhas inseridas não podem conter espaçamentos." + validationErrors.password = t('signup.errors.password.noSpaces') + validationErrors.confirmPassword = t('signup.errors.password.noSpaces') } if(formData.confirmPassword !== formData.password) { - validationErrors.confirmPassword = "A senha inserida não coincide com a senha criada no campo acima. Por favor, verifique se não há erros de digitação e tente novamente." + validationErrors.confirmPassword = t('signup.errors.confirmPassword.mismatch') } if(Object.keys(regexPassword).length > 0) validationErrors.regexPassword = regexPassword @@ -127,12 +136,12 @@ export default function Register() { let arrayErrors = {} if(result?.success === false) { - arrayErrors = ({register: "Error ao tentar se cadastrar, tente novamente mais tarde!"}) + arrayErrors = ({register: t('signup.errors.register')}) } if(result?.errors?.length > 0) { result.errors.map((elm) => { - if(elm.field === "email") arrayErrors = ({...arrayErrors, email: "Conta com este email já existe."}) - if(elm.field === "username") arrayErrors = ({...arrayErrors, username: "Conta com este nome de usuário já existe."}) + if(elm.field === "email") arrayErrors = ({...arrayErrors, email: t('signup.errors.email.exists')}) + if(elm.field === "username") arrayErrors = ({...arrayErrors, username: t('signup.errors.username.exists')}) }) } setErrors(arrayErrors) @@ -181,7 +190,7 @@ export default function Register() { letterSpacing={isMobileMod() ? "-0.4px" : "-1.5px"} marginBottom="40px" textAlign="center" - >Cadastre-se + >{t('signup.title')}
- + handleInputChange(e, "firstName")} - placeholder="Insira seu nome" + placeholder={t('signup.placeholders.firstName')} fontFamily="ubuntu" height="40px" fontSize="14px" @@ -208,13 +217,13 @@ export default function Register() { - + handleInputChange(e, "lastName")} - placeholder="Insira seu sobrenome (opcional)" + placeholder={t('signup.placeholders.lastName')} fontFamily="ubuntu" height="40px" fontSize="14px" @@ -227,7 +236,7 @@ export default function Register() { - + handleInputChange(e, "email")} - placeholder="Insira seu e-mail" + placeholder={t('signup.placeholders.email')} fontFamily="ubuntu" height="40px" fontSize="14px" @@ -248,7 +257,7 @@ export default function Register() { - + handleInputChange(e, "username")} - placeholder="Insira seu nome de usuário" + placeholder={t('signup.placeholders.username')} fontFamily="ubuntu" height="40px" fontSize="14px" @@ -269,7 +278,7 @@ export default function Register() { - + handleInputChange(e, "password")} - placeholder="Crie uma senha" + placeholder={t('signup.placeholders.password')} fontFamily="ubuntu" height="40px" fontSize="14px" @@ -317,18 +326,18 @@ export default function Register() { flexDirection="row" gap="4px" alignItems="flex-start" - > 0 ? "flex" : "none" : "none"}/> Certifique-se que a senha tenha no mínimo: + > 0 ? "flex" : "none" : "none"}/> {t('signup.errors.password.requirements')} - 8 caracteres - Uma letra maiúscula - Uma letra minúscula - Um dígito - Um caractere especial, dentre ! @ # ? ! % & * + {t('signup.errors.password.chars')} + {t('signup.errors.password.uppercase')} + {t('signup.errors.password.lowercase')} + {t('signup.errors.password.digit')} + {t('signup.errors.password.special')} - + handleInputChange(e, "confirmPassword")} - placeholder="Insira a senha novamente" + placeholder={t('signup.placeholders.confirmPassword')} fontFamily="ubuntu" height="40px" fontSize="14px" @@ -377,7 +386,7 @@ export default function Register() { marginTop="24px !important" backgroundColor={errors?.register ? "#D93B3B" : "#42B0FF"} > - Cadastrar + {t('signup.register')} @@ -397,7 +406,15 @@ export default function Register() { letterSpacing= "0.3px" marginTop="16px !important" > - Ao clicar em “Cadastrar” acima, você confirma que leu, compreendeu e aceita os Termos de Serviço e Políticas de Privacidade da Base dos Dados. + {t('signup.termsAgreement.part1')} + + {t('signup.termsAgreement.termsLink')} + + {t('signup.termsAgreement.part2')} + + {t('signup.termsAgreement.privacyLink')} + + {t('signup.termsAgreement.part3')} - Já tem uma conta? Faça login. + {t('signup.alreadyHaveAccount')} {t('signup.login')}. diff --git a/next/public/locales/en/aboutUs.json b/next/public/locales/en/aboutUs.json new file mode 100644 index 00000000..ae432fa0 --- /dev/null +++ b/next/public/locales/en/aboutUs.json @@ -0,0 +1,73 @@ +{ + "pageTitle": "About Us – Data Basis", + "pageDescription": "Get to know Data Basis. We facilitate access to data so that the distance between you and your analysis is just a good question. Learn more about the organization's history and the team behind our work.", + "heroTitle1": "We facilitate access to data", + "heroTitle2": "so that the distance between you and your analysis", + "heroTitle3": "will be", + "heroTitle4": "just a good question", + "usersCount": "+114 thousand", + "usersText": "users on the platform", + "queriesCount": "+1.3 million", + "queriesText": "data queries", + "aboutTitle": "Data Basis", + "aboutText1": "We are a non-profit, open-source non-governmental organization that works to universalize access to quality data. We do this through the creation of innovative tools, the production and dissemination of knowledge, and the promotion of a culture of transparency and open data.", + "aboutText2": "By breaking down technical barriers for those who already do and those who want to start doing data analysis, we bring together a highly engaged network that enhances the impact of our work. We are building a community of people who believe in the intelligent use of data as an instrument for socioeconomic development and who find in BD a great ally.", + "aboutText3": "What we want is to bring different sectors of society closer to information that is of collective interest, but still not very accessible to most people. We believe that expanding access to and use of open data favors increased social participation, improved public management, and the enhancement of democracy.", + "recognitionTitle": "Recognition", + "googleCloudAwardTitle": "Google Cloud Customer Award", + "googleCloudAwardText": "The award recognized the most innovative and transformative implementations of Google Cloud around the world. We were the only Brazilian organization to receive the award in the Social Impact category, which also selected other initiatives that use technology to promote more openness and transparency.", + "googleCloudAwardLink": "See more details", + "treasuryAwardTitle": "XXVI National Treasury Award 2021", + "treasuryAwardText": "We won 1st place in the Solutions category of the award, which aims to recognize the development of applications in data science and artificial intelligence applied to public finance. We were selected because of our work in reconciling information on expenditures and budget revenues of the Brazilian Public Sector.", + "treasuryAwardLink": "See more details", + "historyTitle": "Our history", + "historySubtitle": "Some of the milestones that have defined our journey so far", + "historyBox1Title": "A large catalog", + "historyBox1Date": "OCT 2019", + "historyBox1Text": "Our co-founder, Ricardo Dahis, saw the need for a platform with search and filtering capabilities for different datasets and started this work by launching BD's search engine.", + "historyBox2Title": "The email", + "historyBox2Date": "SEP 2020", + "historyBox2Text": "It was in João Carabetta's first contact with Ricardo Dahis, also co-founder of BD, that the ambitious proposal came: to structure a large public datalake through BigQuery and use the search engine for cataloging the databases and their metadata.", + "historyBox3Title": "A happy Sunday", + "historyBox3Date": "SEP 2020", + "historyBox3Text": "In the last three minutes of a September Sunday, GitHub witnessed the commit that would forever change the lives of those working with public data. We created the structure of our datalake, a tool that would bring joy to many people who have spent so many Sundays cleaning databases.", + "historyBox4Title": "Not just goodwill...", + "historyBox4Date": "SEP 2020", + "historyBox4Text": "We started receiving financial support from people who believe in the importance of our work. This was fundamental to scale our activities, after all, a good project is not made of effort and goodwill alone.", + "historyBox5Title": "Employee of the month", + "historyBox5Date": "NOV 2020", + "historyBox5Text": "We opened the first Data Assistant position and hired the first paid person to join our team. Gradually, this team grew and today it's not so easy to be employee of the month.", + "historyBox6Title": "The first of many", + "historyBox6Date": "JAN 2021", + "historyBox6Text": "RAIS was our first major database treated and made available in the public datalake. We uploaded its staggering 260 GB of complete microdata, with information from 1985 to 2019, enabling aggregations by municipality and state.", + "historyBox7Title": "Officially real", + "historyBox7Date": "JUN 2021", + "historyBox7Text": "We officially became the Data Basis Institute, a non-profit organization, with a formal team, CNPJ, and everything it's entitled to. An important step to consolidate our work.", + "historyBox8Title": "With a new face", + "historyBox8Date": "SEP 2021", + "historyBox8Text": "Developing the new website was one of the biggest and most challenging projects we've taken on. Despite moments of chaos and intricate pieces, gradually everything fell into place and took the form of a platform with our face. Thus, the first version of BD's new website was born, with a more intuitive interface, modern design, and a structure that further facilitates the user experience.", + "historyBox9Title": "A heavyweight award", + "historyBox9Date": "OCT 2021", + "historyBox9Text": "We needed many hands to carry this achievement. We received the Google Cloud Customer Award in the Social Impact category. The unprecedented award was announced at the international event, Google Cloud Next'21, and aims to recognize the most innovative and transformative implementations of Google Cloud around the world.", + "historyBox10Title": "We came first to the treasury", + "historyBox10Date": "NOV 2021", + "historyBox10Text": "We won 1st place in the Solutions category of the XXVI National Treasury Award 2021. The award aims to expand the frontiers of knowledge in public finance, promoting the standardization of specific topics when consistently addressed by scientific research.", + "historyBox11Title": "Conquering the world", + "historyBox11Date": "Very soon", + "historyBox11Text": "The need to have a repository that centralizes important databases already treated and standardized is not exclusive to Brazil. Imagine having an open datalake that allows access and cross-referencing of data from several different countries? This is the future of BD.", + "teamTitle": "A collaborative team", + "teamCategories": [ + "Co-founders", + "Associates", + "Administrative", + "Fundraising, Partnerships and Projects", + "Communication", + "Data", + "Platform", + "BD Edu", + "Fiscal Council" + ], + "joinUsTitle": "Come collaborate with transparency", + "joinUsText": "Be part of an organization that is changing the way to access data. We bring together people from various parts of Brazil, committed to contributing and working for more public transparency.", + "joinUsButton": "See open positions" +} \ No newline at end of file diff --git a/next/public/locales/en/caseStudies.json b/next/public/locales/en/caseStudies.json new file mode 100644 index 00000000..998be96a --- /dev/null +++ b/next/public/locales/en/caseStudies.json @@ -0,0 +1,6 @@ +{ + "pageTitle": "{{title}} – Data Basis", + "backLink": "<< Back", + "contactText": "We want to help you.", + "contactButton": "Contact us" +} \ No newline at end of file diff --git a/next/public/locales/en/common.json b/next/public/locales/en/common.json new file mode 100644 index 00000000..6e3ca040 --- /dev/null +++ b/next/public/locales/en/common.json @@ -0,0 +1,136 @@ +{ + "search_placeholder": "Find the data you need", + "search_placeholder_mobile": "Find the data", + "popular_terms": "Popular terms:", + "search_by_theme": "Search by theme", + "noDatasetsFound": ["No dataset with all selected themes was found.","Try unselecting some of the themes."], + "min": "Min", + "max": "Max", + "search": "Search", + "products": { + "facilitation_text": "We make the work easier so that the distance", + "analysis_distance": "between you and your analysis is ", + "good_question": "just a good question", + "filters": "FILTERS", + "search_as_you_want": "Search for data as you wish", + "search_description": "There are several filters to help you find the data you need. As you navigate through hundreds of datasets available on the platform, you can refine your search by theme, organization, time coverage, observation level, and more.", + "start_search": "Start your search", + "processed_tables": "PROCESSED TABLES", + "access_quality_data": "Access quality data", + "processed_tables_description": "With the processed tables from our public data lake, you no longer need to spend hours cleaning datasets. Our standardization methodology allows you to easily cross-reference data from different organizations. This way, you can focus on what really matters.", + "view_available_data": "View available data", + "packages": "PACKAGES", + "explore_in_your_favorite_language": "Explore in your favorite language", + "packages_description": "We have developed packages for accessing processed data in Python, R, and command line. Additionally, you can query and filter data using SQL in our public data lake editor on Google BigQuery.", + "learn_how_to_access": "Learn how to access" + }, + "support": { + "existence_through_effort": "We exist through the effort of people who", + "those_who_believe_in_quality_open_data": "believe in access to quality open data.", + "support_us_too": "Support Data Basis too", + "enthusiast": "Enthusiast", + "tight_pocket": "Tight budget? Just R$0.50 per", + "enthusiast_description": "day to help us maintain the initiative.", + "month": "month", + "databaser": "Databaser", + "donate_1_real_per_day": "Donate R$1 per day", + "to_make_databasers_happy": "to make databasers happy.", + "master_of_data": "Master of Data", + "master_of_data_description": "Less than R$2 per day to save you even more work.", + "donate_any_amount_via_pix": "Donate any amount via PIX", + "company_name": "Company Name", + "cnpj": "CNPJ", + "bank": "Bank", + "agency": "Branch", + "account": "Account", + "pix_key_copied": "PIX key copied", + "copy_pix_key": "Copy PIX key", + "follow_the_steps": "Follow the steps", + "step_1": "Open your bank app;", + "step_2": "Choose the PIX payment option;", + "step_3": "Scan the QR Code or enter the key on the side;", + "step_4": "Make your donation!", + "want_to_institutionally_support_bd": "Would you like to support BD institutionally? ", + "contact_us": "Contact us." + }, + "edu": { + "learn_from_the_reference": "Come learn from those who are a reference", + "in_making_public_data_available": "in making public data available in Brazil", + "with_our_course_you_can_go_further": "With our course, you can go further in your research, profession, or organization.", + "take_advantage_of_the_promotional_price": "Take advantage of the promotional price" + }, + "tooltip": { + "helpAndResources": "Help and resources", + "faq": "Frequently asked questions", + "documentation": "Documentation", + "youtubeVideos": "YouTube videos", + "installPackages": "Install our packages", + "howToCite": "How to cite our work?", + "whatAreDirectories": "What are directories?", + "discordCommunity": "Talk to our community on Discord", + "contactUs": "Contact us" + }, + "footer": { + "title": "Data Basis", + "copyright": "® {{year}} Data Basis", + "termsOfUse": "Terms of Use", + "privacyPolicy": "Privacy Policy", + "contact": "Contact", + "faq": "FAQ", + "newsletter": "Newsletter", + "careers": "Careers", + "supportProject": "Support the project", + "products": { + "title": "PRODUCTS", + "searchEngine": "Search engine", + "publicDatalake": "Public datalake", + "dataPackages": "Data packages", + "bdPro": "BD Pro", + "bdEdu": "BD Edu" + }, + "services": { + "title": "SERVICES", + "dataCapture": "Data capture", + "dataAnalytics": "Data analytics", + "dataConsulting": "Data consulting", + "caseStudies": "Case studies" + }, + "tutorials": { + "title": "TUTORIALS", + "documentation": "Documentation", + "blog": "Blog", + "youtubeVideos": "Videos" + }, + "institutional": { + "title": "INSTITUTIONAL", + "aboutUs": "About us", + "transparency": "Transparency", + "newsletter": "Newsletter", + "careers": "Careers", + "faq": "FAQ", + "termsAndPrivacy": "Terms and Privacy", + "contact": "Contact", + "supportProject": "Support the project" + } + }, + "partners": { + "partnershipsWith": "Partnerships with", + "testimonials": { + "fernando": { + "name": "Fernando Barbalho", + "position": "Data Scientist at the National Treasury", + "quote": "SiconfiBD is a package that quickly and programmatically brings data from the National Treasury Secretariat. The code is built open-source by the Treasury team and uses DB tables to compose functions in R. What is the personnel expense of the 100 most populous Brazilian municipalities? These and more than 18 other questions can be consulted directly through the package, without the need for SQL." + }, + "marina": { + "name": "Marina Barros", + "position": "Executive Director of Instituto Alziras", + "quote": "With the support of Data Basis, we conducted a survey of gender and race inequalities in the 2016-2020 elections and the distortions in campaign financing for female mayors and councilors in the last elections, which will result in the launch of an unprecedented publication." + }, + "amanda": { + "name": "Amanda de Albuquerque and Mariana Carvalho", + "position": "Co-founders of A Ponte", + "quote": "We created an important product of ours, the Municipality Photograph, in partnership with DB. The Photograph aggregates various socioeconomic indicators of Brazilian municipalities. A Ponte did the planning and design of the report, while BD took care of the technical part of data visualization and management. The partnership allowed us to advance quickly in the development of the tool and ensured the high data quality we wanted from the beginning." + } + } + } +} \ No newline at end of file diff --git a/next/public/locales/en/contact.json b/next/public/locales/en/contact.json new file mode 100644 index 00000000..00f69b1d --- /dev/null +++ b/next/public/locales/en/contact.json @@ -0,0 +1,22 @@ +{ + "pageTitle": "Contact – Data Basis", + "pageDescription": "Get in touch with our team.", + "contactTitle": "Get in touch", + "contactDescription": "Send your message in the form beside to speak with our team.", + "institutionalSupportTitle": "Institutional Support", + "institutionalSupportDescription": "Data Basis is maintained through donations from people who believe in transparency and access to quality data. Collaborate for the growth and strengthening of the initiative.", + "servicesTitle": "Services", + "servicesDescription": "Speak directly with our commercial team to schedule a conversation and evaluate how our ", + "servicesLink": "services", + "servicesLinkText": "can help.", + "projectsPartnershipsTitle": "Projects and Partnerships", + "projectsPartnershipsDescription": "We develop projects and applications with other like-minded organizations to promote access to quality public data. We are always open to new ideas.", + "dataTitle": "Data", + "dataDescription": "We assist individuals and organizations in uploading data to our datalake. Write your proposal to our Data team.", + "questionsText": "Questions? Talk to our community on ", + "discordLink": "Discord", + "consulting": { + "title": "Consulting – Data Basis", + "description": "Get in touch with our team." + } +} \ No newline at end of file diff --git a/next/public/locales/en/dataset.json b/next/public/locales/en/dataset.json new file mode 100644 index 00000000..d4197204 --- /dev/null +++ b/next/public/locales/en/dataset.json @@ -0,0 +1,215 @@ +{ + "dataBasis": "Data Basis", + "noName": "Unnamed dataset", + "noDescription": "No description", + "temporalCoverage": "Temporal coverage", + "noCoverage": "No temporal coverage", + "organization": "Organization", + "noOrganization": "No organization", + "none": "None", + "dataAlt": "data", + "data": "Data", + "crossingAlt": "crossing", + "crossing": "Crossing", + "suggestData": "Make a proposal", + "viewDataRoadmap": "View data roadmap", + "pageTitle": "Data – Data Basis", + "filter": "Filter", + "datasetsWith": "Datasets with", + "tables": "Tables", + "rawDataSources": "Raw data sources", + "informationRequests": "LAI requests", + "resources": "Resources", + "openData": "Free", + "closedData": "Paid", + "theme": "Theme", + "tag": "Tag", + "observationLevel": "Observation level", + "datasetsFound": "{{count}} dataset found", + "datasetsFound_plural": "{{count}} datasets found", + "for": "for", + "findingDatasets": "finding datasets", + "findingDatasets_plural": "finding {{count}} datasets", + "forQuery": "for \"{{query}}\"", + "forQuery_plural": "for \"{{query}}\"", + "noDatasetsFound": "No datasets found for your search.", + "ooops": "Oops...", + "unfortunatelyNoDatasetsFound": "Unfortunately, we didn't find any datasets for your search.", + "tryRelatedTerms": "Try searching for related terms or suggest new data to add to be added to Data Basis.", + "stillNotFound": "Still haven't found what you're looking for?", + "suggestNewData": "Propose new data", + "clearFilters": "Clear filters", + "previous": "Previous", + "next": "Next", + "datasetCard": { + "table": "table", + "tables": "tables", + "oneTable": "1 table", + "multipleTables": "{{count}} tables", + "rawDataSource": "raw data source", + "rawDataSources": "raw data sources", + "oneRawDataSource": "1 raw data source", + "multipleRawDataSources": "{{count}} raw data sources", + "noRawDataSources": "0 raw data sources", + "informationRequest": "information request", + "informationRequests": "information requests", + "oneInformationRequest": "1 information request", + "multipleInformationRequests": "{{count}} information requests", + "noInformationRequests": "0 information requests", + "and": "and" + }, + "table": { + "notProvided": "Not provided", + "temporalCoverage": "Temporal coverage", + "dataAccess": "Data access", + "dataUpdateFrequency": "Data update frequency", + "lastUpdateBD": "Last update in Data Basis", + "noUpdateScheduled": "No update scheduled", + "lastUpdateRawDataSource": "Last update in raw data source", + "lastCheckRawDataSource": "Last time we checked the original source", + "bigQueryID": "BigQuery ID", + "partitionsInBigQuery": "Partitions in BigQuery", + "partitionsTooltip": "Partitions are divisions made in a table to facilitate data management and querying. By segmenting a large table into smaller partitions, the amount of bytes read is reduced, which helps control costs and improves query performance.", + "observationLevel": "Observation level", + "observationLevelTooltip": "Indicates the smallest possible granularity of analysis with that data. For example, a table with state-level observation allows us to perform an analysis at the country level (as it's broader than state), but not an analysis by municipality (which would be a more specific breakdown).", + "downloadFiles": "Download files", + "rawDataSources": "Raw data sources", + "rawDataSourcesTooltip": "Links to pages with useful information about the dataset. We always try to provide the closest path to the source to download the original data.", + "auxiliaryFiles": "Auxiliary files", + "auxiliaryFilesTooltip": "Auxiliary files give more context and help to understand the data better. They can include technical notes, descriptions of collection and sampling, etc.", + "additionalInformation": "Additional information", + "publishedBy": "Published by", + "dataCleanedBy": "Data cleaned by", + "version": "Version", + "updateEvery": "Update every", + "updatePerSecond": "Update per second", + "updatePerMinute": "Update per minute", + "updatePerHour": "Update per hour", + "dailyUpdate": "Daily update", + "weeklyUpdate": "Weekly update", + "monthlyUpdate": "Monthly update", + "bimonthlyUpdate": "Bimonthly update", + "quarterlyUpdate": "Quarterly update", + "semiannualUpdate": "Semiannual update", + "annualUpdate": "Annual update", + "days": "days", + "weeks": "weeks", + "months": "months", + "bimonths": "bimonths", + "quarters": "quarters", + "semesters": "semesters", + "years": "years", + "updateNotDefined": "Update not defined", + "selectColumns": "Select the columns you want to access:", + "checkColumns": "Check the table columns:", + "translateInstitutionalCodes": "Translate institutional codes", + "translateTooltip": "For example, translate the code \"2927408\" to \"Salvador-BA\"", + "generateQuery": "Generate query", + "downloadTable": "Download table", + "bigQueryInstructions": "In the BigQuery query editor, enter the following instruction:", + "firstTimeBigQuery": "First time using BigQuery?", + "followStepByStep": "Follow the step-by-step guide.", + "accessBigQuery": "Access BigQuery", + "pythonInstructions": "In the Python terminal, enter the following instruction:", + "firstTimePython": "First time using the Python package?", + "rInstructions": "In the R terminal, enter the following instruction:", + "firstTimeR": "First time using the R package?", + "compareThePlans": "Compare the plans", + "warningLargeTable": ["This complete table, with all columns, has ", ". Be careful not to exceed the ", "free processing limit", "of BigQuery."], + "warningLargeTableOptimize": "To optimize the query, you can select fewer columns or add filters in BigQuery.", + "errorInsufficientChecks": "Please select above the columns you want to access.", + "infoTranslationNotAvailable": ["This table has institutional codes that vary between years. Therefore, we are still working to automate the translation process. For now, we recommend accessing the ", "dictionary","and the", "directories", "to understand how to translate the codes present in the table."], + "infoDataAvailability": ["These data are available because several people contribute to their maintenance. Before downloading the data, support you too with a financial donation or ", "learn how to contribute your time"], + "warningPaidPlanRequired": ["The download of tables with size between 100 MB and 1 GB is available only for ", "subscribers of our paid plans", ". However, you can access the table for free using SQL, Python or R. Consider updating to a paid plan to make the download."], + "errorTableTooLarge": "The table size has exceeded the allowed limit for download, of 1 GB. You can access the data in SQL, Python or R.", + "bigQueryAndPackages": "BigQuery and Packages", + "download": "Download" + }, + "temporalCoverageBar": { + "title": "Temporal coverage", + "notProvided": "Not provided", + "noCoverage": "No temporal coverage", + "free": "FREE", + "paid": "PAID", + "accessGranted": "Access granted for the period", + "upgradeRequired": "Upgrade to access the period", + "comparePlans": "Compare the plans" + }, + "column": { + "search": "Search columns", + "name": "Name", + "nameTooltip": "Column name.", + "translationTable": "Translation table", + "translationTableTooltip": "To translate the institutional codes in the table, you need to use the dictionary and directory tables, depending on which column you want to use.", + "needsTranslation": "Needs translation", + "needsTranslationTooltip": "The column has institutional codes to be translated.", + "description": "Description", + "descriptionTooltip": "Column data description.", + "bigQueryType": "BigQuery Type", + "bigQueryTypeTooltip": "Data type in BigQuery — categories: INTEGER (Integer), STRING (Text), DATE (Date), FLOAT64 (Decimal), GEOGRAPHY (Geographic).", + "temporalCoverage": "Temporal Coverage", + "temporalCoverageTooltip": "Data initial and final coverage of the data. Can vary between columns, according to the availability in the original data.", + "measurementUnit": "Measurement Unit", + "measurementUnitTooltip": "Column measurement unit — ex: km, m2, kg.", + "sensitiveData": "Contains Sensitive Data (LGPD)", + "sensitiveDataTooltip": "Indicates if the column has sensitive data — ex: Identified CPF, bank account data, etc.", + "observations": "Observations", + "observationsTooltip": "Describes treatment processes performed on the column that need to be highlighted.", + "downloadTranslationTable": "Download table that makes the translation of this column", + "accessTranslationTable": "Access table that makes the translation of this column", + "dictionary": "Dictionary", + "noTranslationNeeded": "No need for translation", + "notProvided": "Not provided", + "yes": "Yes", + "no": "No" + }, + "observationLevelTable": { + "entityHeader": "Entity", + "columnsHeader": "Corresponding Columns", + "notProvided": "Not provided" + }, + "rawDataSource": { + "name": "Name", + "description": "Description", + "url": "URL", + "additionalInfo": "Additional information", + "yes": "Yes", + "no": "No", + "notProvided": "Not provided", + "lastUpdateDate": "Last update date", + "lastCheckDate": "Last check date", + "updateFrequency": "Update frequency", + "coverageStart": "Coverage start", + "coverageEnd": "Coverage end", + "observationLevel": "Observation level", + "observationLevelTooltip": "Indicates the smallest possible granularity of analysis with that data. For example, a table with state-level observation allows us to perform an analysis at the country level (as it's broader than state), but not an analysis by municipality (which would be a more specific breakdown).", + "format": "Format", + "treatment": "Treatment", + "language": "Language", + "availability": "Availability", + "hasStructuredData": "Has structured data", + "hasAPI": "Has API", + "requiresIPFromCountry": "Requires IP from country", + "requiresRegistration": "Requires registration", + "isFree": "Is free", + "rawDataDisclaimer": "These data have been cleaned with the Data Basis methodology.", + "accessOriginalSource": "Access the raw data source", + "license": "License", + "dataAccessLink": "Data access link", + "dataAccessInstructions": "Data access instructions", + "auxiliaryFiles": "Auxiliary files", + "auxiliaryFilesDescription": "Auxiliary files description", + "version": "Version", + "versionDescription": "Version description" + }, + "informationRequest": { + "requestNumber": "Request number: {{number}}", + "disclaimer": "These data have not passed the treatment methodology of the Data Basis.", + "accessData": "Access data", + "accessRequest": "Access request", + "description": "Description", + "notProvided": "Not provided", + "additionalInformation": "Additional information", + "status": "Status" + } +} \ No newline at end of file diff --git a/next/public/locales/en/faq.json b/next/public/locales/en/faq.json new file mode 100644 index 00000000..d0680a30 --- /dev/null +++ b/next/public/locales/en/faq.json @@ -0,0 +1,292 @@ +{ + "questions": [ + { + "question": "Os dados da BD são públicos ou privados?", + "answer": "

Em sua grande maioria, as bases de dados encontradas em nossa plataforma são públicas. Porém, também estão listadas algumas bases privadas. Nossa organização não possui fins lucrativos, portanto, não comercializamos a listagem de bases em nossa plataforma. Acreditamos ser útil listar conjuntos de dados privados, uma vez que as pessoas podem ter interesse em adquirí-las ao encontrá-las em nosso site.

", + "categories": ["Dados"], + "keywords": "público, privado", + "id": "public-or-private" + }, + { + "question": "Preciso pagar para acessar os dados da BD?", + "answer": "

O acesso à maioria dos dados oferecidos pela BD é grátis. Só em dois casos pode ser necessário pagamento. São esses:

1. Alguns dados fazem parte dos nossos planos avançados, Pro e Empresas, como indicado nas páginas das tabelas. Nesse caso é necessário uma assinatura para acessar os dados.

2. Uma forma de acessar nossos dados é através do BigQuery, no Google Cloud, que oferece até 1 Terabyte gratuito por mês para seus usuários. Ressaltamos que esse limite costuma ser o suficiente, mesmo para análises com bases mais robustas, como a RAIS ou Censo Escolar. Caso você ultrapasse esse limite, o BigQuery cobra 5 dólares por terabyte de dados que sua consulta irá processar.

", + "categories": ["Dados"], + "keywords": "pagar, custo, gratuito, grátis, mensalidade", + "id": "do-i-have-to-pay" + }, + { + "question": "É possível fazer o download dos dados da BD?", + "answer": "

Sim, você pode baixar o arquivo CSV completo das tabelas tratadas direto na plataforma. No entanto, tabelas com mais de 200.000 linhas só podem ser acessados através do nosso data lake no BigQuery ou dos nossos pacotes em Python e R.

", + "categories": ["Dados"], + "keywords": "download, baixar, CSV, arquivo", + "id": "download" + }, + { + "question": "Qual é o limite de download dos dados da BD na plataforma?", + "answer": "

O limite para download dos dados na nossa plataforma é de 200.000 linhas. Para acessar tabelas que ultrapassam esse limite, utilize nosso datalake no BigQuery ou nossos pacotes em Python e R.

", + "categories": ["Dados"], + "keywords": "limite, download, baixar, tamanho, máximo, arquivo", + "id": "download-limit" + }, + { + "question": "Quais tipos de dados encontro na BD?", + "answer": "

Em nossa plataforma, você encontra três tipos de dados: tabelas tratadas, fontes originais e pedidos LAI.

", + "categories": ["Dados"], + "keywords": "tipo, categoria", + "id": "data-resources" + }, + { + "question": "O que são tabelas tratadas?", + "answer": "

São tabelas prontas para análise, disponíveis via SQL, Python e R. O processo de tratamento das tabelas envolve a padronização de nomes de variáveis e compatibilização de códigos, o que permite que o cruzamento de tabelas de diferentes instituições e temas seja tão simples quanto qualquer outra consulta.

", + "categories": ["Dados"], + "keywords": "tratada, tratado, BD+, tabela, datalake, cruzar, cruzamento, padronização, compatibilização", + "id": "tables" + }, + { + "question": "O que são fontes originais?", + "answer": "

São links para páginas externas à plataforma com informações úteis sobre o conjunto de dados. A maioria destes são dados que ainda não disponibilizamos na BD como tabelas tratadas. Tentamos sempre fornecer o caminho mais próximo possível à fonte para baixar os dados originais.

", + "categories": ["Dados"], + "keywords": "fonte original, externo", + "id": "external-links" + }, + { + "question": "O que são pedidos LAI?", + "answer": "

São pedidos feitos através da Lei de Acesso à Informação (LAI). A LAI, lei nº 12.527/2011 regulamenta o direito, previsto na Constituição, de qualquer pessoa solicitar e receber dos órgãos e entidades públicos, de todos os entes e Poderes, informações públicas por eles produzidas ou custodiadas.

", + "categories": ["Dados"], + "keywords": "LAI, acesso à informação, lei", + "id": "information-requests" + }, + { + "question": "Como acessar as tabelas tratadas?", + "answer": "

Você pode consultar as tabelas tratadas BD+ de diferentes maneiras. Além de fazer o download direto na plataforma, é possível explorar os dados com SQL através do BigQuery ou com os pacotes em Python e R.

", + "categories": ["Dados"], + "keywords": "acesso, consulta, tratada, tratado, BD+, download, baixar, pacote, SQL, BigQuery, Python, R", + "id": "access-tables" + }, + { + "question": "Como acessar as fontes originais?", + "answer": "

Você pode acessar as fontes originais dos dados clicando no botão de redirecionamento para o link externo à plataforma.

", + "categories": ["Dados"], + "keywords": "acesso, consulta, fonte original, externo", + "id": "access-external-links" + }, + { + "question": "Como acessar os pedidos LAI?", + "answer": "

Você pode acessar os pedidos LAI clicando no botão de redirecionamento para o link externo à plataforma.

", + "categories": ["Dados"], + "keywords": "acesso, consulta, LAI, acesso à informação, lei", + "id": "access-information-requests" + }, + { + "question": "O que são diretórios?", + "answer": "

São tabelas que ligam diversos códigos institucionais e informações de diferentes entidades brasileiras. Isso é importante porque resolve o problema de não existir um identificador único para entidades – como UF, município, escola, distrito, setor censitário, categorias CID-10 e CID-9, CBO-2002 e CBO-1992, etc – entre instituições ou, ainda, a mudança de identificadores e nomes com typos entre anos e instituições. Para saber mais, confira nosso tutorial sobre Diretórios Brasileiros.

", + "categories": ["Dados"], + "keywords": "diretório, entidade, identificador, chave, primária", + "id": "directories" + }, + { + "question": "Os dados da BD são atualizados automaticamente?", + "answer": "

Alguns dados são atualizados automaticamente e outros não. Temos um compromisso de atualizar automaticamente qualquer base de frequência mensal ou maior. Esses dados de alta frequência estão disponíveis nos nossos planos avançados, Pro e Empresas.

", + "categories": ["Dados"], + "keywords": "atualização, automatização, frequência", + "id": "data-updated" + }, + { + "question": "Como utilizar os pacotes da BD?", + "answer": "

Nossos pacotes permitem o acesso ao datalake público direto do seu computador ou ambiente de desenvolvimento. Para começar a explorar nossos dados em Python ou R, siga os tutoriais de instalação dos pacotes presentes na nossa documentação.

", + "categories": ["Dados"], + "keywords": "pacote, Python, R, instalação, documentação", + "id": "packages" + }, + { + "question": "O que é nível da observação?", + "answer": "

O nível da observação indica o que representa cada linha da tabela. É como se a combinação das colunas que compõem o nível da observação fosse uma chave primária. Essa informação é útil pois indica qual a menor granularidade possível de análise com aquele dado. Por exemplo, uma tabela com nível da observação de estado permite que façamos uma análise no país (por ser mais amplo que estado), mas não uma análise por município (que já seria um recorte mais específico).

", + "categories": ["Dados"], + "keywords": "nível, observação, chave, primária", + "id": "level-of-observation" + }, + { + "question": "Onde eu posso sugerir a inclusão de novos dados na plataforma?", + "answer": "

É muito importante saber quais dados a nossa comunidade precisa para que a equipe adicione os conjuntos solicitados no processo de priorização de dados. Temos um canal no Discord preparado para receber suas propostas e sugestões, basta você seguir os passos indicados lá. Acesse por aqui.

", + "categories": ["Dados"], + "keywords": "inclusão, solicitação, proposta, sugestão", + "id": "data-proposal" + }, + { + "question": "O que são os planos Pro e Empresas?", + "answer": "

Além do plano gratuito, a BD conta com planos avançados: Pro, para usuários individuais, e Empresas, para até 10 usuários de uma mesma organização. Nesses planos estão disponíveis além dos dados já existentes no data lake público da BD, dezenas de conjuntos de dados exclusivos priorizados para solucionar problemas e te ajudar em sua equipe, organização ou pesquisa. Além de conjuntos de dados exclusivos, os planos oferecem acesso à à versão mais atualizada de algumas das nossas principais tabelas, como do CNES, dados de CNPJ, do Brasileirão, dentre muitas outras.

", + "categories": ["Planos Pagos"], + "keywords": "pro, empresas, assinatura, dados exclusivos, pagar, custo, gratuito, grátis, mensalidade", + "id": "subscriptions" + }, + { + "question": "Quais dados tenho acesso com os planos pagos?", + "answer": "

A assinatura dá acesso a dados de alta frequência atualizados. Esses podem às vezes ser um subconjunto de uma tabela tratada maior, ou ser uma tabela tratada inteira. Nosso mecanismo de busca e páginas específicas de conjuntos indicam o que é disponível gratuitamente e o que está coberto pela assinatura dos planos pagos.

", + "categories": ["Planos Pagos"], + "keywords": "pro, empresas, assinatura, dados exclusivos, pagar, custo, gratuito, grátis, mensalidade", + "id": "subscriptions-data" + }, + { + "question": "Como os dados da BD Pro são atualizados?", + "answer": "

Todos os dados disponíveis na BD Pro são atualizados automaticamente via nossa tecnologia de gerência de fluxos. A BD usa o que há de mais moderno em engenharia de dados para garantir a mais alta qualidade e consistência no que disponibilizamos.

", + "categories": ["Planos Pagos"], + "keywords": "pro, empresas, assinatura, dados exclusivos, atualizacao", + "id": "subscriptions-data-update" + }, + { + "question": "Quanto custa uma assinatura BD Pro?", + "answer": "

Atualmente temos dois planos. O plano Pro custa R$47 por mês, dando acesso a todos os dados de alta frequência atualizados para um único usuário. O plano Empresas custa R$350 por mês, incluindo acesso para 10 contas e suporte prioritário com nossa equipe.

", + "categories": ["Planos Pagos"], + "keywords": "pro, empresas, assinatura, preco", + "id": "subscriptions-prices" + }, + { + "question": "O que é o datalake da BD no BigQuery?", + "answer": "

É um banco de dados público hospedado no BigQuery, ferramenta potente de armazenamento e análise de dados do Google Cloud, com todas as tabelas tratadas BD+ para você consultar direto do seu navegador. As vantagens de utilizar nosso datalake no BigQuery estão relacionadas à velocidade do processamento, escalabilidade e economia.

", + "categories": ["BigQuery"], + "keywords": "BigQuery, Google, Cloud, datalake, BD+", + "id": "datalake" + }, + { + "question": "Por que preciso de uma conta no Google Cloud?", + "answer": "

Nosso banco de dados público é hospedado no BigQuery, uma ferramenta potente de armazenamento e análise de dados do Google Cloud. Para esse serviço, o Google Cloud oferece até 1 Terabyte gratuito por mês para seus usuários. Assim, é necessário que você crie uma conta para associar as consultas do banco a você e contabilizar o total de processamento utilizado no mês. A criação da conta não requer nenhum cartão ou forma de pagamento prévio, ou seja, o BigQuery inicia automaticamente no modo Sandbox, que permite que você utilize os recursos sem adicionar um modo de pagamento.

", + "categories": ["BigQuery"], + "keywords": "conta, cadastro, BigQuery, Google, Cloud", + "id": "google-account" + }, + { + "question": "O que acontece se eu exceder o limite mensal de 1 TB gratuito do Google Cloud?", + "answer": "

Caso você exceda o limite, são cobrados 5 dólares por Terabyte de dados que sua consulta irá processar. Mas ressaltamos que o limite de 1 Terabyte do Google costuma ser suficiente, mesmo para análises com bases mais robustas, como a RAIS ou Censo Escolar.

", + "categories": ["BigQuery"], + "keywords": "limite, terabyte, TB, Google, Cloud", + "id": "data-limit" + }, + { + "question": "Como criar um projeto no Google Cloud?", + "answer": "

Para criar um projeto no Google Cloud, basta ter um e-mail cadastrado no Google. É necessário ter um projeto seu, mesmo que vazio, para você fazer consultas em nosso datalake público.

  1. Acesse o Google Cloud.t=\"_blank\">Google Cloud. Caso for a sua primeira vez, aceite os Termos de Serviço.
  2. Clique em Create Project/Criar Projeto. Escolha um nome bacana para o projeto.
  3. Clique em Create/Criar.
", + "categories": ["BigQuery"], + "keywords": "criar, cadastrar, projeto, Google, Cloud", + "id": "google-cloud-project" + }, + { + "question": "Quais as melhores práticas para fazer uma consulta no BigQuery?", + "answer": "

Para verificar uma amostra de todas as variáveis da tabela, use:

SELECT * FROM  dataset.table_name LIMIT 100
  • A primeira dica valiosa é selecionar as colunas que você vai usar. O BigQuery funciona usando um modelo colunar, portanto, quanto menos colunas você usar, melhor vai ser o desempenho da sua consulta. Isso significa evitar o clássico
    SELECT * FROM table_name
    e escolher as colunas de seu interesse. Parece chato, mas ajuda muito!
  • Para tabelas grandes, uma boa prática é filtrar os anos e estados de seu interesse com a cláusula
    WHERE
    . Como utilizamos o sistema de particionamento, isso vai reduzir drasticamente o custo e o tempo de processamento.

Essas são as dicas mais simples e rápidas de executar. Para saber mais sobre boas práticas, acesse o manual completo disponibilizado pelo Google Cloud.

", + "categories": ["BigQuery"], + "keywords": "prática, dica, otimização, desempenho, consulta, BigQuery, selecionar, filtrar", + "id": "best-practices-performance" + }, + { + "question": "O que são os tipos no BigQuery?", + "answer": "

São os tipos de dados do Google Standard SQL. Suas categorias incluem: INTEGER (Inteiro), STRING (Texto), DATE (Data), FLOAT64 (Decimal), GEOGRAPHY (Geográfico), entre outras.

", + "categories": ["BigQuery"], + "keywords": "tipo, categoria, BigQuery, INTEGER, STRING, DATE, FLOAT, GEOGRAPHY", + "id": "bigquery-types" + }, + { + "question": "O que são as partições no BigQuery?", + "answer": "

As partições são divisões feitas em uma tabela para facilitar o gerenciamento e a consulta aos dados. Ao segmentar uma tabela grande em partições menores, a quantidade de bytes lidos é reduzida, o que ajuda a controlar os custos e melhora o desempenho da consulta.

", + "categories": ["BigQuery"], + "keywords": "partição, particionamento, otimização, desempenho, BigQuery", + "id": "bigquery-partitions" + }, + { + "question": "O que é a BD Lab?", + "answer": "

A BD Lab é nosso braço de serviços, parcerias e projetos. É pela BD Lab que interagimos com outras organizações, provendo nossa expertise acumulada em tecnologia e dados. Enxergamos esses projetos como componente indispensável da nossa missão de promover o uso de dados para a promoção do bem-estar social.

", + "categories": ["BD Lab"], + "keywords": "bd lab, consultoria, projeto", + "id": "bd-lab" + }, + { + "question": "Como surgiu a BD Lab?", + "answer": "

A BD Lab foi criada para garantir a sustentabilidade da organização, de forma a manter e expandir nossos produtos de forma gratuita. A prestação de serviços de dados e a realização de projetos com parceiros vêm sendo chave não só na geração de receita, mas também no fortalecimento da nossa posição de referência na disponibilização de dados de qualidade.

", + "categories": ["BD Lab"], + "keywords": "bd lab, consultoria, projeto, origem", + "id": "bd-lab-origin" + }, + { + "question": "O que é a BD Edu?", + "answer": "

A BD Edu é nosso braço de educação, com a missão de capacitar pessoas para resolver problemas com dados. Já prestamos serviços de formação para organizações como Vetor Brasil, Souk Analytics e ProForest, além de nossos cursos abertos ao público. Oferecemos cursos ao vivo e assíncronos e todo o valor arrecadado é revertido em investimento na Base dos Dados.

", + "categories": ["BD Edu"], + "keywords": "bd edu, educacao, formacao, curso", + "id": "bd-edu" + }, + { + "question": "Quais cursos a BD Edu oferece?", + "answer": "

Atualmente oferecemos cursos de análises de dados com ferramentas importantes para o mercado, como SQL, Python, editores de planilhas e Google Cloud. Porém, nossa equipe é capacitada para desenvolver cursos sob demanda e temos trabalhado para lançar novos modelos de formações.

", + "categories": ["BD Edu"], + "keywords": "bd edu, educacao, formacao, curso", + "id": "bd-edu-courses" + }, + { + "question": "Os cursos da BD possuem certificado?", + "answer": "

Sim, sempre que um curso é concluído nós emitimos um certificado oficial da BD constando as informações pessoais do aluno e sobre o curso. O certificado é verificável e pode ser compartilhado nas redes ou anexado ao seu currículo.

", + "categories": ["BD Edu"], + "keywords": "bd edu, educacao, formacao, curso, certificado", + "id": "bd-edu-certificates" + }, + { + "question": "Tenho dúvidas sobre os cursos da BD Edu, existe um canal especializado para contato?", + "answer": "

Sim, você pode tirar suas dúvidas pelo email suporte.bdedu@basedosdados.org. Nossa equipe faz a checagem diária para prestar o melhor suporte possível.

", + "categories": ["BD Edu"], + "keywords": "bd edu, educacao, formacao, curso, certificado", + "id": "bd-edu-contact" + }, + { + "question": "Qual plataforma é utilizada para as atividades dos cursos da BD Edu?", + "answer": "

Utilizamos a plataforma coda.io, que funciona como um editor de documentos que combina recursos de planilhas, apresentações, processadores de texto e aplicativos. Por lá temos nossa Área do Aluno(a), onde é possível encontrar o cronograma, links para as aulas ao vivo, aulas gravadas, página de submissão de exercício, fórum de dúvidas, materiais extras e mais.

", + "categories": ["BD Edu"], + "keywords": "bd edu, educacao, formacao, curso, plataforma", + "id": "bd-edu-platform" + }, + { + "question": "Quem organiza e ministra os cursos da BD Edu?", + "answer": "

Nossos cursos são desenvolvidos e revisados por especialistas que trabalham na equipe da Base dos Dados. Você pode checar o perfil de todos em nossa página institucional.

", + "categories": ["BD Edu"], + "keywords": "bd edu, educacao, formacao, curso, suporte", + "id": "bd-edu-teacher" + }, + { + "question": "A BD é uma empresa?", + "answer": "

Não. A BD é constituída como uma associação sem fins lucrativos chamada \"Instituto Base dos Dados\" com sede no Rio de Janeiro e com CNPJ 42.494.318/0001-16.

", + "categories": ["Institucional"], + "keywords": "natureza legal, empresa, ong, lucro", + "id": "legal-nature" + }, + { + "question": "Como a BD se financia?", + "answer": "

Ao longo dos anos, a BD cresceu com o apoio financeiro de usuários e de pessoas que se identificam com nossa missão. Hoje, contamos também com nossa área de Serviços e Parcerias (BD Lab) e nossos planos de acesso a dados exclusivos de alta frequência atualizados (BD Pro). Confira mais sobre a contabilidade da organização em nossa página de Transparência.

", + "categories": ["Institucional"], + "keywords": "financiamento, sustentabilidade, contabilidade, serviço, parceria", + "id": "financing" + }, + { + "question": "Como citar a BD?", + "answer": "

Você pode referenciar de duas maneiras:

Dahis et al. (2022) Data Basis: Universalizing Access to High-Quality Data. Disponível em: {``}.

", + "categories": ["Institucional"], + "keywords": "citar, citação, referência", + "id": "reference" + }, + { + "question": "Como a BD coleta dados pessoais?", + "answer": "

Coletamos informações pessoais que você nos fornece diretamente ao usar nossos serviços. Isso pode incluir seu nome, endereço de e-mail, informações de pagamento e outras informações que você escolher compartilhar conosco. Também coletamos informações de forma automática, através de cookies, incluindo dados de uso, endereço IP, tipo de navegador, e informações sobre o dispositivo que você usa para acessar nossos serviços.

Utilizamos suas informações pessoais para fornecer e melhorar nossos serviços, incluindo o processamento de pagamentos, o fornecimento de suporte ao cliente e a personalização da experiência do usuário. Não venderemos, alugaremos ou compartilharemos suas informações pessoais com terceiros não afiliados sem o seu consentimento explícito. Para mais informações, acesse nossos Termos de Uso e Políticas de Privacidade aqui.

", + "categories": ["Institucional"], + "keywords": "privacidade, uso, lgpd", + "id": "personal-data" + } + ], + "pageTitle": "Perguntas frequentes – Base dos Dados", + "pageDescription": "Aqui você encontra as respostas para as suas dúvidas sobre a Base dos Dados. Saiba mais sobre nossos dados, como acessá-los pelo BigQuery usando SQL ou com os pacotes Python e R agora mesmo.", + "title": "Perguntas frequentes", + "searchPlaceholder": "Pesquise", + "categories": { + "data": "Dados", + "paidPlans": "Planos Pagos", + "bigQuery": "BigQuery", + "bdLab": "BD Lab", + "bdEdu": "BD Edu", + "institutional": "Institucional" + }, + "noQuestionsFound": "Infelizmente, não encontramos nenhuma pergunta relacionada à sua busca.", + "contactText": "Não encontrou sua pergunta?", + "contactLink": "Entre em contato" +} \ No newline at end of file diff --git a/next/public/locales/en/index.json b/next/public/locales/en/index.json new file mode 100644 index 00000000..e69de29b diff --git a/next/public/locales/en/menu.json b/next/public/locales/en/menu.json new file mode 100644 index 00000000..b7f18f0c --- /dev/null +++ b/next/public/locales/en/menu.json @@ -0,0 +1,28 @@ +{ + "enter": "Sign in", + "register": "Sign up", + "public_profile": "Public profile", + "account": "Account", + "password": "Password", + "plans_and_payment": "Plans and payment", + "settings": "Settings", + "exit": "Sign out", + "search_data": "Search data", + "data": "Data", + "solutions": "Solutions", + "exclusive_data": "Exclusive data", + "data_courses": "Data courses", + "services": "Services", + "prices": "Prices", + "tutorials": "Tutorials", + "documentation": "Documentation", + "youtube_videos": "Youtube videos", + "blog": "Blog", + "institutional": "Institutional", + "about_us": "About us", + "transparency": "Transparency", + "newsletter": "Newsletter", + "jobs": "Jobs", + "faq": "FAQ", + "contact": "Contact" +} \ No newline at end of file diff --git a/next/public/locales/en/prices.json b/next/public/locales/en/prices.json new file mode 100644 index 00000000..68cfd346 --- /dev/null +++ b/next/public/locales/en/prices.json @@ -0,0 +1,56 @@ +{ + "pageTitle": "Prices – Data Basis", + "ogTitle": "Price – Data Basis", + "ogDescription": "Compare Data Basis plans: Free, Pro, and Enterprise. With DB Pro, you get advanced features of our platform, high-frequency data, and exclusive datasets starting at R$47/month.", + "comparePlans": "Compare plans", + "annualDiscount": "Annual discount", + "annualBillingMessage": "{{price}} charged once a year", + "save20": "Save 20%", + "perMonth": "/month", + "chargedAnnually": "charged once a year", + "readThe": "Read the", + "termsOfService": "Terms of Service", + "features": "Features:", + "allFeaturesPlus": "All features of {{plan}}, plus:", + "currentPlan": "Current plan", + "subscribe": "Subscribe", + "startFreeTrial": "Start free trial", + "exploreFeatures": "Explore features", + "plans": { + "free": { + "title": "DB Free", + "subtitle": "For you to discover the potential of the data platform", + "features": [ + "Processed tables", + "Integrated data", + "Updated low-frequency data", + "Cloud access", + "Access via SQL, Python, and R", + "Integration with BI tools", + "Direct download up to 100 MB" + ] + }, + "pro": { + "title": "DB Pro", + "subtitle": "For you to access the most up-to-date data", + "features": [ + "Dozens of updated high-frequency datasets", + "Company reference table with updated information", + "Direct download up to 1GB (80% of the platform's tables)" + ] + }, + "enterprise": { + "title": "DB Enterprise", + "subtitle": "For your company to save time and improve decision quality", + "features": [ + "Access for 10 accounts", + "Priority support via email and Discord" + ] + } + }, + "tooltips": { + "integratedData": "Our data standardization and compatibility methodology allows you to cross-reference tables from different institutions and themes in a simplified manner.", + "downloadLimit": "This limit does not apply to access via SQL, Python, and R.", + "downloadLimitPro": "Tables larger than 1 GB are not available for partial or complete download. This limit does not apply to access via SQL, Python, and R." + } + } \ No newline at end of file diff --git a/next/public/locales/en/services.json b/next/public/locales/en/services.json new file mode 100644 index 00000000..f211e55b --- /dev/null +++ b/next/public/locales/en/services.json @@ -0,0 +1,111 @@ +{ + "pageTitle": "Services – Data Basis", + "metaTitle": "Services – Data Basis", + "slogan": { + "title": "Our services", + "description": "Data Basis is the expert that helps you or your team work with and extract maximum value from data.", + "cta": "Let's work on a project together" + }, + "services": { + "dataCapture": "Data capture", + "dataAnalysis": "Data analysis", + "dataConsulting": "Data consulting" + }, + "caseStudies": { + "title": "Our solutions", + "subtitle": "Discover why institutions choose to innovate with Data Basis", + "readMore": "Read the case study" + }, + "dataCapture": { + "title": "Data capture", + "description": "We capture and provide data on demand with speed, scale, and low cost.", + "longDescription": "You don't need to worry about creating and maintaining your own infrastructure or writing code - we take care of that. Everything is done following Data Basis' treatment and standardization methodology, and according to the best data engineering practices in the market. The processed tables can be made available exclusively or be public.", + "advantages": { + "title": "Main advantages", + "speed": "Speed", + "speedDescription": "Even very complex queries take only minutes to process.", + "scale": "Scale", + "scaleDescription": "Our data lake magically scales to hexabytes if necessary.", + "cost": "Low cost", + "costDescription": "Every user has 1TB free per month for data queries." + }, + "work": { + "title": "Our work with data engineering", + "technology": { + "title": "Cutting-edge technology", + "description": "Using Google Cloud Platform infrastructure, one of the largest data storage and processing platforms, we ensure the security and reliability of our work." + }, + "flexibility": { + "title": "Flexibility", + "description": "Whether it's one-time submissions, recurring updates, API access, or connection to BI platforms, we deliver the solution you need in an agile and complete way." + }, + "frameworks": { + "title": "Recognized frameworks", + "description": "With frameworks and data management systems, we ensure the quality and organization of your data system without generating any concerns for your team." + } + } + }, + "dataAnalysis": { + "title": "Data analysis", + "description": "We build essential analyses, reports, and indicators for your research or decision-making.", + "longDescription": "The information and insights are generated from various datasets already processed in our public data lake, coupled with the expertise of our Data team. And more: we use our standard treatment methodology so that you can also cross-reference this data with any other bases available in the data lake.", + "examples": { + "title": "Examples of questions we can answer", + "example1": "How has the Brazilian economy been evolving, with detailed monthly indicators by sector?", + "example2": "Which schools will perform above the state average in mathematics next year?", + "example3": "How many times does the Official Gazette of the Union publish about a certain topic each day?" + } + }, + "dataConsulting": { + "title": "Data consulting", + "description": "We guide you on how to apply our methodology for cleaning, structuring, and standardizing data", + "longDescription": "In your project or organization through workshops and exclusive materials. Reproducing our treatment process in your own database can save hours of work for your team when querying, manipulating, or updating information.", + "advantages": { + "title": "Main advantages", + "advantage1": "Experience in building infrastructures capable of supporting thousands of monthly accesses.", + "advantage2": "Flexibility for remote projects anywhere in the country.", + "advantage3": "Diverse team with expertise in different areas of knowledge and data." + }, + "areas": { + "title": "Areas of expertise", + "infrastructure": { + "title": "Infrastructure", + "description": "Mentoring for data engineering teams looking to structure data maintenance processes, their own data lakes, or leverage themselves using Data Basis infrastructure." + }, + "analysis": { + "title": "Analysis", + "description": "Practical workshops, showing how Data Basis data lake works and teaching how to explore public data for journalistic articles or scientific research." + }, + "programming": { + "title": "Programming", + "description": "Customized teaching programs to use Data Basis Python and R packages, as well as SQL mentoring to build fast and scalable analyses directly in the cloud." + } + } + }, + "workflow": { + "title": "Our workflow", + "description": "The same work methodology for all services, based on customer satisfaction and excellence in quality.", + "steps": { + "demand": { + "title": "Demand", + "subtitle": "Identification of client demands and needs", + "description": "We work collaboratively to understand the real needs behind our clients' requests. The discovery work includes discussions about project objectives or the use of data to be captured and analyzed. It is at this stage that the final objective of the service becomes clear to our team and clients." + }, + "planning": { + "title": "Planning", + "subtitle": "Alignment of business, engineering, or training expectations", + "description": "The second step is to understand the best way to deliver the value you need. We don't work with generic proposals. Each project is 100% thought out and oriented towards client demands, whether in the format of data delivery, analyses, or specific training." + }, + "budget": { + "title": "Budget", + "subtitle": "Transparent and simplified budget", + "description": "Once the scope, format, and expectations are aligned, we deliver a completely transparent budget proposal. For this, we consider factors such as the quantity and complexity of datasets, necessary work, team size, and urgency. Everything is explicitly stated in a direct manner and in accordance with what has been determined so far." + }, + "execution": { + "title": "Execution", + "subtitle": "Agile execution and value delivery", + "description": "Finally, our delivery is committed to deadlines and, above all, quality. Communication is constant throughout the execution. Working in a lean manner and with experienced professionals in the field, our team values the satisfaction of our clients." + } + } + } +} \ No newline at end of file diff --git a/next/public/locales/en/terms.json b/next/public/locales/en/terms.json new file mode 100644 index 00000000..acaa70a8 --- /dev/null +++ b/next/public/locales/en/terms.json @@ -0,0 +1,119 @@ +{ + "pageTitle": "Terms – Data Basis", + "ogTitle": "Terms and Privacy – Data Basis", + "mainTitle": "Terms and Privacy", + "termsOfService": "Terms of Service", + "privacyPolicy": "Privacy Policy", + "ToS": { + "term1": { + "title": "1. Acceptance of Terms", + "content": "By accessing or using the services offered by Data Basis (\"We\", \"Our\" or \"Us\"), you agree to comply with and accept these Terms of Service. If you do not agree with all the terms and conditions of this agreement, you may not use our services." + }, + "term2": { + "title": "2. Service Description", + "content": "2.1. Our services consist of a monthly subscription that grants subscribers access to various exclusive, harmonized, and updated data on the Data Basis platform. Access is provided via Data Basis Python or R packages, or via BigQuery, Google's low-cost and fully managed data storage service for analysis." + }, + "term3": { + "title": "3. Payment and Subscriptions", + "content": "", + "subContent1": "3.1. By subscribing, you agree to pay the specified monthly fee. Payment will be processed automatically each month unless you cancel your subscription before the renewal date, which is clearly stated when you sign up for the service.", + "subContent2": "3.2. By subscribing, you agree that your data will be used in the creation and maintenance of users on the Stripe payment platform.", + "subContent3": "3.3. Prices and payment methods are subject to change at the sole discretion of Data Basis. Price or payment method changes will be notified in advance." + }, + "term4": { + "title": "4. Cancellation and Refund", + "content": "4.1. You can cancel your subscription at any time through the options available in your account. However, no refunds or credits will be provided for periods when the subscription was not used." + }, + "term5": { + "title": "5. Responsible Use", + "content": "5.1. You agree to use our services responsibly and in compliance with all applicable laws and regulations." + }, + "term6": { + "title": "6. Intellectual Property", + "content": "6.1. All intellectual property rights related to the provided data are owned by third parties and are subject to their respective usage policies." + }, + "term7": { + "title": "7. Privacy", + "content": "7.1. The use of your personal data is governed by our Privacy Policy. By using our services, you agree to the collection and use of your information as described in our Privacy Policy." + }, + "term8": { + "title": "8. Termination", + "content": "8.1. We reserve the right to terminate or suspend your account at any time, for any reason, without prior notice." + }, + "term9": { + "title": "9. Limitation of Liability", + "content": "9.1. Under no circumstances will we be liable for any direct, indirect, special, incidental, or consequential damages arising from the use or inability to use our services." + }, + "term10": { + "title": "10. Changes to Terms of Service", + "content": "10.1. We reserve the right to modify these Terms of Service at any time. Changes will be effective upon posting of the updated versions on our website." + }, + "term11": { + "title": "11. Applicable Law and Jurisdiction", + "content": "11.1. These Terms of Service will be governed and interpreted in accordance with the laws of Brazil. Any dispute related to these terms will be subject to the exclusive jurisdiction of the courts of Rio de Janeiro, RJ, Brazil." + }, + "term12": { + "title": "12. Contact", + "content": "12.1. To contact us with questions or concerns related to these Terms of Service, please send an email to suporte.bdpro@basedosdados.org." + }, + "finalNote": "By using our services, you agree to all the terms and conditions set forth in this agreement. Please read these terms carefully before proceeding." + }, + "PP": { + "header": { + "subContent1": "Data Basis (\"We\", \"Our\" or \"Us\"). We commit to protecting and respecting your privacy and complying with all obligations established in the General Data Protection Regulation (\"LGPD\").", + "subContent2": "This Privacy Policy describes how we collect, use, share and protect your personal information. By accessing or using our services, you agree to the terms and practices described in this Privacy Policy." + }, + "term1": { + "title": "1. Information We Collect", + "subContent1": "1.1. We collect personal information that you provide directly to us when using our services. This may include your name, email address, payment information, and other information you choose to share with us.", + "subContent2": "1.2. We also collect information automatically, including usage data, IP address, browser type, and information about the device you use to access our services." + }, + "term2": { + "title": "2. Use of Information", + "subContent1": "2.1. We use your personal information to provide and improve our services, including payment processing, customer support, and user experience customization.", + "subContent2": "2.2. We will not sell, rent, or share your personal information with non-affiliated third parties without your explicit consent." + }, + "term3": { + "title": "3. Cookies and Similar Technologies", + "subContent1": "3.1. Cookies are pieces of data that help the site remember your preferences and make navigation more efficient.", + "subContent2": "3.2. These cookies are necessary to ensure the proper functioning of the site, improve performance, and personalize the navigation experience, such as language and region.", + "subContent3": { + "title": "3.3. Cookies used:", + "headers": { + "header1": "Name", + "header2": "Retention", + "header3": "Purpose" + }, + "row1": { + "name": "userBD", + "retention": "7 days", + "purpose": "When logging into our site, this special cookie is created to store your basic information. This cookie is essential to allow you to remain logged in and access protected areas of the site. Without it, you will not be able to log in." + }, + "row2": { + "name": "token", + "retention": "7 days", + "purpose": "When logging into our site, this special cookie is created to store your access token. This token not only allows you to remain logged in, but also acts as a guardian to ensure the integrity of your settings and personal information." + } + }, + "subContent4": "3.4. By continuing to use our site, you agree to the use of these cookies. If you prefer not to use them, we recommend adjusting your browser settings. However, this will affect your ability to log in and access restricted areas.", + "subContent5": "If you have any questions about these cookies or any other privacy issue, please contact us at the email address contato@basedosdados.org." + }, + "term4": { + "title": "4. Information Security", + "subContent1": "4.1. We implement technical and organizational security measures to protect your personal information against unauthorized access and misuse." + }, + "term5": { + "title": "5. Your Rights", + "subContent1": "5.1. Under the LGPD, you have the right to access, correct, delete or port your personal data. If you wish to exercise these rights or have any questions about how your information is being processed, please contact us at the email address contato@basedosdados.org." + }, + "term6": { + "title": "6. Changes to this Privacy Policy", + "subContent1": "6.1. We reserve the right to update this Privacy Policy periodically. Changes will be published on our site, and the last update date will be reviewed. We recommend that you review this Privacy Policy regularly to stay informed about our privacy practices." + }, + "term7": { + "title": "7. Contact", + "subContent1": "7.1. For any questions or concerns related to our Privacy Policy, please contact us at the email address contato@basedosdados.org." + }, + "finalNote": "This Privacy Policy has been prepared in accordance with the provisions of the LGPD and aims to ensure that your personal information is treated with the necessary respect and care." + } +} \ No newline at end of file diff --git a/next/public/locales/en/transparency.json b/next/public/locales/en/transparency.json new file mode 100644 index 00000000..d94d0529 --- /dev/null +++ b/next/public/locales/en/transparency.json @@ -0,0 +1,31 @@ +{ + "pageTitle": "Transparency – Data Basis", + "ogDescription": "We use resources to facilitate access to quality data for thousands of people. In this space, you'll find information regarding our activities, revenues, and expenses. Follow closely how we ensure the organization's sustainability and learn how you can also support us.", + "mainTitle1": "Our accounts are", + "mainTitle2": " transparent and open", + "mainTitle3": " – like everything else.", + "mainDescription1": "We are a non-profit, open-source non-governmental organization. Transparency is the foundation of all our actions, from working with public data to accountability. We use resources to facilitate access to quality data for thousands of people.", + "mainDescription2": "In this space, you'll find information regarding our activities, revenues, and expenses. Follow closely how we ensure the organization's sustainability.", + "survivalIndicator": "Survival indicator", + "survivalDescription1": "This is our survival indicator. It shows how long our activities could be maintained if the organization only collected what is already planned and continued spending as in the average of the previous three months.", + "survivalDescription2": "Below, you can see the details of the organization's sources and allocations of resources.", + "accountingData": "Accounting data", + "accountingDescription1": "As it should be, all microdata ", + "accountingDescription2": " related to DB's accounting is available in the public datalake.", + "accessButton": "Access", + "accumulatedRevenue": "Accumulated revenue this year", + "accumulatedExpenses": "Accumulated expenses this year", + "fullDashboard": "See the full dashboard", + "here": "here", + "statuteReports": "Statute and reports", + "statuteDescription": "Our statute contains the guidelines that regulate the organization's functioning and decision-making process. The document also includes the rights and duties of members and the competencies of the administrative and fiscal councils.", + "reportsDescription": "Our reports present all activities undertaken by the team. There are various projects that collaborate with promoting a culture of transparency, socioeconomic development, and the construction of public policies based on data and evidence.", + "DBStatute": "DB Social Statute", + "DBReport2023": "BD Annual Report 2023", + "DBReport2022": "BD Annual Report 2022", + "DBReport2021": "BD Annual Report 2021", + "supportTitle1": "Do you also believe in access", + "supportTitle2": " to quality data?", + "supportDescription": "Everything we do is only possible because of the people who support our work. Help DB continue to facilitate access to public data. With any amount, you contribute to the maintenance of our projects and the survival of the organization.", + "supportButton": "Support now" +} \ No newline at end of file diff --git a/next/public/locales/en/user.json b/next/public/locales/en/user.json new file mode 100644 index 00000000..f8c7132e --- /dev/null +++ b/next/public/locales/en/user.json @@ -0,0 +1,237 @@ +{ + "login": { + "title": "Log in", + "emailLabel": "Email", + "emailPlaceholder": "Enter your email", + "emailError": "Please enter a valid email address.", + "passwordLabel": "Password", + "passwordPlaceholder": "Enter your password", + "passwordError": "Please enter the password.", + "forgotPassword": "Forgot password?", + "loginButton": "Sign in", + "noAccount": "Don't have an account?", + "signUp": "Sign up", + "loginError": "Incorrect email or password.", + "serverError": "Unable to connect to the server. Please try again later." + }, + "signup": { + "title": "Sign up", + "firstName": "Name", + "lastName": "Last name", + "email": "Email", + "username": "Username", + "password": "Password", + "confirmPassword": "Confirm password", + "register": "Register", + "alreadyHaveAccount": "Already have an account?", + "login": "Login", + "termsAgreement": { + "part1": "By clicking \"Sign up\" above, you confirm that you have read, understood and accepted the ", + "termsLink": "Terms of Service", + "part2": " and ", + "privacyLink": "Privacy Policy", + "part3": " of Data Basis." + }, + "placeholders": { + "firstName": "Enter your name", + "lastName": "Enter your last name (optional)", + "email": "Enter your email", + "username": "Enter your username", + "password": "Create a password", + "confirmPassword": "Enter the password again" + }, + "errors": { + "firstName": "Please enter your name.", + "username": { + "invalid": "Invalid username or an account with this username already exists.", + "noSpaces": "Username cannot have spaces.", + "exists": "Account with this username already exists." + }, + "email": { + "invalid": "Invalid email address or an account with this email already exists.", + "exists": "Account with this email already exists." + }, + "password": { + "noSpaces": "Passwords entered cannot contain spaces.", + "requirements": "Ensure that the password has at least:", + "chars": "8 characters", + "uppercase": "An uppercase letter", + "lowercase": "A lowercase letter", + "digit": "A digit", + "special": "A special character, among ! @ # ? ! % & *" + }, + "confirmPassword": { + "required": "Confirming the password is required.", + "mismatch": "The password entered does not match the password created in the field above. Please check for typing errors and try again." + }, + "register": "Error trying to register, try again later!" + } + }, + "username": { + "userSettings": "User settings", + "firstName": "First name", + "enterFirstName": "Enter your first name", + "lastName": "Last name", + "enterLastName": "Enter your last name", + "email": "Email", + "makeEmailPublic": "Make email public", + "url": "URL", + "enterURL": "Enter your website URL", + "socialMedia": "Social media", + "githubProfileLink": "GitHub profile link", + "twitterProfileLink": "Twitter profile link", + "linkedinProfileLink": "LinkedIn profile link", + "shareInfo": "This information will be shared publicly. So be careful with what you share.", + "updateProfile": "Update profile", + "profilePicture": "Profile picture", + "edit": "Edit", + "updatePicture": "Update picture", + "removePicture": "Remove picture", + "invalidUsername": "Invalid username", + "noSpacesInUsername": "Username cannot contain spaces", + "invalidOrExistingUsername": "Invalid or already existing username", + "deleteAccount": "Delete account", + "back": "Back", + "changeEmail": "Change email", + "confirmEmail": "Confirm your email", + "emailSentTo": "We sent an email to:", + "checkInbox": "Check your inbox and follow the instructions sent in the email to complete the change.", + "username": "Username", + "enterUsername": "Enter your username", + "currentPassword": "Current password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New password", + "enterNewPassword": "Enter your new password", + "confirmNewPassword": "Confirm new password", + "enterConfirmNewPassword": "Enter your new password again", + "forgotPassword": "Forgot your password?", + "createNewPassword": "Create a new password", + "enterPasswordAgain": "Enter the password again", + "passwordRequirements": "The password must contain:", + "minCharacters": "At least 8 characters", + "uppercaseLetter": "An uppercase letter", + "lowercaseLetter": "A lowercase letter", + "digit": "A number", + "specialCharacter": "A special character (!@#$%^&*)", + "updatePassword": "Update password", + "currentPlan": "Current plan", + "freePlan": "Free plan", + "subscribe": "Subscribe", + "startFreeTrial": "Start free trial", + "cancelPlan": "Cancel plan", + "planChange": "Plan change", + "planChangeInstructions": "To change your plan, contact us:", + "contactUs": "Contact us", + "changeUsername": "Change username", + "newUsername": "New username", + "confirmDeleteAccount": "Are you sure you want to delete your account?", + "deleteAccountWarning": "This action cannot be undone. This will permanently delete your account and remove all your data from our servers.", + "confirmDeleteInstructions": "Type 'delete account' to confirm", + "cancel": "Cancel", + "exploreResources": "Explore resources", + "payment": "Payment", + "changePlan": "Change plan", + "annualDiscount": "Annual discount", + "save20": "Save 20%", + "discountCoupon": "Discount coupon", + "enterCoupon": "Enter coupon", + "apply": "Apply", + "invalidCoupon": "Invalid coupon", + "trialPeriod": "You will have a 7-day free trial before being charged.", + "subtotal": "Subtotal", + "couponEffect": "From the {{couponDuration}}th {{planInterval}}{{trialDay}}, you will be charged {{totalAmount}}/{{planInterval2}}.", + "andTrialDay": " and after the trial period,", + "paymentDetails": "Payment details", + "congratulations": "Congratulations!", + "paymentSuccessful": "Your payment was processed successfully. You will receive an email with your purchase details.", + "continueSettings": "Continue to settings", + "goToHomepage": "Go to homepage", + "paymentFailed": "Payment failed", + "paymentError": "An error occurred while processing your payment. Please try again or contact support:", + "understood": "Understood", + "comparePlans": "Compare plans", + "resources": "Resources", + "processedTables": "Processed tables", + "integratedData": "Integrated data", + "integratedDataTooltip": "Our data standardization and compatibility methodology allows you to cross-reference tables from different institutions and themes in a simplified manner.", + "updatedLowFrequencyData": "Updated low-frequency data", + "cloudAccess": "Cloud access", + "sqlPythonRAccess": "Access via SQL, Python, and R", + "biIntegration": "Integration with BI tools", + "downloadLimit": "Direct download up to 100 MB", + "downloadLimitTooltip": "This limit does not apply to access via SQL, Python, and R.", + "proPlan": "BD Pro", + "allFreePlanResources": "All free plan resources, plus:", + "highFrequencyTables": "Dozens of updated high-frequency databases", + "companyReferenceTable": "Company reference table with updated information", + "downloadLimitPro": "Direct download up to 1 GB", + "downloadLimitProTooltip": "Tables larger than 1 GB are not available for partial or complete download. This limit does not apply to access via SQL, Python, and R.", + "passwordChangedSuccessfully": "Password changed successfully!", + "useNewPassword": "Use your new password to log in next time.", + "settings": "Settings", + "publicProfile": "Public profile", + "account": "Account", + "changePassword": "Password", + "plansAndPayment": "Plans and payment", + "accessFor10Accounts": "Access for 10 users", + "prioritySupport": "Priority support via email and Discord", + "viewAllAndComparePlans": "View all and compare plans", + "confirmEmailAddress": "Confirm your email address", + "checkInboxAndFollowInstructions": "Check your inbox and follow the instructions sent in the email to complete the change.", + "enterNewEmail": "Enter your new email address", + "newEmail": "New email", + "enterEmail": "Enter your email", + "sendEmail": "Send email", + "updateUsername": "Update username", + "exportAccountData": "Export account data", + "dataStorageInfo": "Learn how your data is stored in our Terms of Use and Privacy Policies. To export your account data, contact us.", + "exportDataInstructions": "To export your data, contact us:", + "deleteMyAccount": "Delete my account", + "accountAccessWarning": "By deleting your account, you will lose access to all your data and information.", + "usernameAlreadyExists": "Username already exists" + }, + "activate": { + "accountActive": "Active account", + "congratulations": "Congratulations! Your account has been successfully activated. You are now part of our community.", + "thankYou": "Thank you for joining us. We're here to help you out whenever you need it.", + "welcome": "Welcome!", + "loginToAccount": "Log in to account", + "somethingWentWrong": "Something went wrong", + "activationProblem": "We regret to inform you that there was a problem during account activation. We apologize for the inconvenience.", + "contactUs": "Contact us" + }, + "checkEmail": { + "confirmEmail": "Confirm your email address", + "sentConfirmation": "We sent an email confirmation to", + "checkInbox": "Check your inbox and follow the instructions sent in the email to complete registration.", + "resendEmail": "Resend email", + "waitSeconds": "Wait {{count}} seconds..." + }, + "passwordRecovery": { + "title": "Reset your password", + "titleConfirmed": "Reset your new password", + "description": "Enter the email address you used to register your account. We'll send you instructions to reset your password.", + "emailLabel": "Email", + "emailPlaceholder": "Enter your email", + "invalidEmail": "Invalid email address.", + "sendResetEmail": "Send reset email", + "waitSeconds": "Wait {{count}} seconds...", + "needHelp": "If you still need help,", + "contactUs": "contact us", + "newPasswordLabel": "New Password", + "newPasswordPlaceholder": "Create a new password", + "confirmPasswordLabel": "Confirm new password", + "confirmPasswordPlaceholder": "Enter the password again", + "updatePassword": "Update password", + "passwordRequirements": "Make sure the password has at least:", + "passwordRequirementChars": "8 characters", + "passwordRequirementUppercase": "An uppercase letter", + "passwordRequirementLowercase": "A lowercase letter", + "passwordRequirementDigit": "A digit", + "passwordRequirementSpecial": "A special character, among ! @ # ? ! % & *", + "confirmPasswordRequired": "Confirming the password is required", + "passwordNoSpaces": "Passwords entered cannot contain spaces.", + "passwordMismatch": "The password entered does not match the password created in the field above. Please check for typing errors and try again.", + "passwordRequired": "Please enter the password." + } +} \ No newline at end of file diff --git a/next/public/locales/es/aboutUs.json b/next/public/locales/es/aboutUs.json new file mode 100644 index 00000000..c7ea881a --- /dev/null +++ b/next/public/locales/es/aboutUs.json @@ -0,0 +1,73 @@ +{ + "pageTitle": "Sobre Nosotros – Base de los Datos", + "pageDescription": "Conoce Base de los Datos. Facilitamos el acceso a los datos para que la distancia entre tú y tu análisis sea solo una buena pregunta. Aprende más sobre la historia de la organización y el equipo detrás de nuestro trabajo.", + "heroTitle1": "Facilitamos el acceso a los datos", + "heroTitle2": "para que la distancia entre tú y tu análisis", + "heroTitle3": "sea", + "heroTitle4": "solo una buena pregunta", + "usersCount": "+114 mil", + "usersText": "usuarios en la plataforma", + "queriesCount": "+1.3 millones", + "queriesText": "consultas de datos", + "aboutTitle": "Base de los Datos", + "aboutText1": "Somos una organización no gubernamental sin fines de lucro y de código abierto que trabaja para universalizar el acceso a datos de calidad. Lo hacemos a través de la creación de herramientas innovadoras, la producción y difusión de conocimiento, y la promoción de una cultura de transparencia y datos abiertos.", + "aboutText2": "Al romper las barreras técnicas para quienes ya hacen y quienes quieren comenzar a hacer análisis de datos, reunimos una red altamente comprometida que potencia el impacto de nuestro trabajo. Estamos construyendo una comunidad de personas que creen en el uso inteligente de los datos como instrumento para el desarrollo socioeconómico y que encuentran en BD un gran aliado.", + "aboutText3": "Lo que queremos es acercar a diferentes sectores de la sociedad a información que es de interés colectivo, pero aún poco accesible para la mayoría de las personas. Creemos que ampliar el acceso y uso de datos abiertos favorece una mayor participación social, una mejor gestión pública y el fortalecimiento de la democracia.", + "recognitionTitle": "Reconocimiento", + "googleCloudAwardTitle": "Premio Google Cloud Customer", + "googleCloudAwardText": "El premio reconoció las implementaciones más innovadoras y transformadoras de Google Cloud en todo el mundo. Fuimos la única organización brasileña en recibir el premio en la categoría de Impacto Social, que también seleccionó otras iniciativas que utilizan la tecnología para promover más apertura y transparencia.", + "googleCloudAwardLink": "Ver más detalles", + "treasuryAwardTitle": "XXVI Premio del Tesoro Nacional 2021", + "treasuryAwardText": "Ganamos el 1er lugar en la categoría de Soluciones del premio, que tiene como objetivo reconocer el desarrollo de aplicaciones en ciencia de datos e inteligencia artificial aplicadas a las finanzas públicas. Fuimos seleccionados por nuestro trabajo en la conciliación de información sobre gastos e ingresos presupuestarios del Sector Público Brasileño.", + "treasuryAwardLink": "Ver más detalles", + "historyTitle": "Nuestra historia", + "historySubtitle": "Algunos de los hitos que han definido nuestro viaje hasta ahora", + "historyBox1Title": "Un gran catálogo", + "historyBox1Date": "OCT 2019", + "historyBox1Text": "Nuestro cofundador, Ricardo Dahis, vio la necesidad de una plataforma con capacidades de búsqueda y filtrado para diferentes conjuntos de datos y comenzó este trabajo lanzando el motor de búsqueda de BD.", + "historyBox2Title": "El correo electrónico", + "historyBox2Date": "SEP 2020", + "historyBox2Text": "Fue en el primer contacto de João Carabetta con Ricardo Dahis, también cofundador de BD, que surgió la ambiciosa propuesta: estructurar un gran datalake público a través de BigQuery y utilizar el motor de búsqueda para catalogar las bases de datos y sus metadatos.", + "historyBox3Title": "Un domingo feliz", + "historyBox3Date": "SEP 2020", + "historyBox3Text": "En los últimos tres minutos de un domingo de septiembre, GitHub fue testigo del commit que cambiaría para siempre la vida de quienes trabajan con datos públicos. Creamos la estructura de nuestro datalake, una herramienta que traería alegría a muchas personas que han pasado tantos domingos limpiando bases de datos.", + "historyBox4Title": "No solo buena voluntad...", + "historyBox4Date": "SEP 2020", + "historyBox4Text": "Comenzamos a recibir apoyo financiero de personas que creen en la importancia de nuestro trabajo. Esto fue fundamental para escalar nuestras actividades, después de todo, un buen proyecto no se hace solo de esfuerzo y buena voluntad.", + "historyBox5Title": "Empleado del mes", + "historyBox5Date": "NOV 2020", + "historyBox5Text": "Abrimos la primera posición de Asistente de Datos y contratamos a la primera persona remunerada para unirse a nuestro equipo. Gradualmente, este equipo creció y hoy no es tan fácil ser el empleado del mes.", + "historyBox6Title": "El primero de muchos", + "historyBox6Date": "ENE 2021", + "historyBox6Text": "RAIS fue nuestra primera gran base de datos tratada y puesta a disposición en el datalake público. Subimos sus asombrosos 260 GB de microdatos completos, con información desde 1985 hasta 2019, permitiendo agregaciones por municipio y estado.", + "historyBox7Title": "Oficialmente real", + "historyBox7Date": "JUN 2021", + "historyBox7Text": "Nos convertimos oficialmente en el Instituto Base de los Datos, una organización sin fines de lucro, con un equipo formal, CNPJ y todo lo que tiene derecho. Un paso importante para consolidar nuestro trabajo.", + "historyBox8Title": "Con una nueva cara", + "historyBox8Date": "SEP 2021", + "historyBox8Text": "Desarrollar el nuevo sitio web fue uno de los proyectos más grandes y desafiantes que hemos emprendido. A pesar de momentos de caos y piezas intrincadas, gradualmente todo encajó y tomó la forma de una plataforma con nuestra cara. Así nació la primera versión del nuevo sitio web de BD, con una interfaz más intuitiva, diseño moderno y una estructura que facilita aún más la experiencia del usuario.", + "historyBox9Title": "Un premio de peso pesado", + "historyBox9Date": "OCT 2021", + "historyBox9Text": "Necesitamos muchas manos para llevar este logro. Recibimos el Premio Google Cloud Customer en la categoría de Impacto Social. El premio sin precedentes fue anunciado en el evento internacional Google Cloud Next'21, y tiene como objetivo reconocer las implementaciones más innovadoras y transformadoras de Google Cloud en todo el mundo.", + "historyBox10Title": "Llegamos primero al tesoro", + "historyBox10Date": "NOV 2021", + "historyBox10Text": "Ganamos el 1er lugar en la categoría de Soluciones del XXVI Premio del Tesoro Nacional 2021. El premio tiene como objetivo expandir las fronteras del conocimiento en finanzas públicas, promoviendo la estandarización de temas específicos cuando son abordados consistentemente por la investigación científica.", + "historyBox11Title": "Conquistando el mundo", + "historyBox11Date": "Muy pronto", + "historyBox11Text": "La necesidad de tener un repositorio que centralice bases de datos importantes ya tratadas y estandarizadas no es exclusiva de Brasil. ¿Imaginas tener un datalake abierto que permita acceder y cruzar datos de varios países diferentes? Este es el futuro de BD.", + "teamTitle": "Un equipo colaborativo", + "teamCategories": [ + "Cofundadores", + "Asociados", + "Administrativo", + "Recaudación de fondos, Asociaciones y Proyectos", + "Comunicación", + "Datos", + "Plataforma", + "BD Edu", + "Consejo Fiscal" + ], + "joinUsTitle": "Ven a colaborar con la transparencia", + "joinUsText": "Sé parte de una organización que está cambiando la forma de acceder a los datos. Reunimos a personas de varias partes de Brasil, comprometidas a contribuir y trabajar por más transparencia pública.", + "joinUsButton": "Ver posiciones abiertas" +} \ No newline at end of file diff --git a/next/public/locales/es/caseStudies.json b/next/public/locales/es/caseStudies.json new file mode 100644 index 00000000..608e3edb --- /dev/null +++ b/next/public/locales/es/caseStudies.json @@ -0,0 +1,6 @@ +{ + "pageTitle": "{{title}} – Base de los Datos", + "backLink": "<< Volver", + "contactText": "Queremos ayudarle.", + "contactButton": "Contactar" +} \ No newline at end of file diff --git a/next/public/locales/es/common.json b/next/public/locales/es/common.json new file mode 100644 index 00000000..851a0ae3 --- /dev/null +++ b/next/public/locales/es/common.json @@ -0,0 +1,136 @@ +{ + "search_placeholder": "Encuentra los datos que necesitas", + "search_placeholder_mobile": "Encuentra los datos", + "popular_terms": "Términos populares:", + "search_by_theme": "Buscar por tema", + "noDatasetsFound": ["Ningún conjunto con todos los temas seleccionados fue encontrado.","Intente desmarcar alguno de los temas."], + "min": "Mín", + "max": "Máx", + "search": "Buscar", + "products": { + "facilitation_text": "Facilitamos el trabajo para que la distancia", + "analysis_distance": "entre tú y tu análisis sea ", + "good_question": "solo una buena pregunta", + "filters": "FILTROS", + "search_as_you_want": "Busca datos como desees", + "search_description": "Hay varios filtros para ayudarte a encontrar los datos que necesitas. Mientras navegas por cientos de conjuntos de datos disponibles en la plataforma, puedes refinar tu búsqueda por tema, organización, cobertura temporal, nivel de observación y más.", + "start_search": "Comienza tu búsqueda", + "processed_tables": "TABLAS PROCESADAS", + "access_quality_data": "Accede a datos de calidad", + "processed_tables_description": "Con las tablas procesadas de nuestro lago de datos público, ya no necesitas pasar horas limpiando conjuntos de datos. Nuestra metodología de estandarización te permite cruzar fácilmente datos de diferentes organizaciones. Así, puedes concentrarte en lo que realmente importa.", + "view_available_data": "Ver datos disponibles", + "packages": "PAQUETES", + "explore_in_your_favorite_language": "Explora en tu lenguaje favorito", + "packages_description": "Hemos desarrollado paquetes para acceder a datos procesados en Python, R y línea de comandos. Además, puedes consultar y filtrar datos usando SQL en nuestro editor de lago de datos público en Google BigQuery.", + "learn_how_to_access": "Aprende cómo acceder" + }, + "support": { + "existence_through_effort": "Existimos gracias al esfuerzo de personas que", + "those_who_believe_in_quality_open_data": "creen en el acceso a datos abiertos de calidad.", + "support_us_too": "Apoya a Base dos Dados también", + "enthusiast": "Entusiasta", + "tight_pocket": "¿Presupuesto ajustado? Solo R$0,50 por", + "enthusiast_description": "día para ayudarnos a mantener la iniciativa.", + "month": "mes", + "databaser": "Databaser", + "donate_1_real_per_day": "Dona R$1 por día", + "to_make_databasers_happy": "para hacer felices a los databasers.", + "master_of_data": "Maestro de Datos", + "master_of_data_description": "Menos de R$2 por día para ahorrarte aún más trabajo.", + "donate_any_amount_via_pix": "Dona cualquier cantidad vía PIX", + "company_name": "Nombre de la Empresa", + "cnpj": "CNPJ", + "bank": "Banco", + "agency": "Sucursal", + "account": "Cuenta", + "pix_key_copied": "Clave PIX copiada", + "copy_pix_key": "Copiar clave PIX", + "follow_the_steps": "Sigue los pasos", + "step_1": "Abre tu app bancaria;", + "step_2": "Elige la opción de pago PIX;", + "step_3": "Escanea el código QR o ingresa la clave al lado;", + "step_4": "¡Haz tu donación!", + "want_to_institutionally_support_bd": "¿Te gustaría apoyar a BD institucionalmente? ", + "contact_us": "Contáctanos." + }, + "edu": { + "learn_from_the_reference": "Ven a aprender de quienes son referencia", + "in_making_public_data_available": "en hacer disponibles datos públicos en Brasil", + "with_our_course_you_can_go_further": "Con nuestro curso, puedes ir más allá en tu investigación, profesión u organización.", + "take_advantage_of_the_promotional_price": "Aprovecha el precio promocional" + }, + "tooltip": { + "helpAndResources": "Ayuda y recursos", + "faq": "Preguntas frecuentes", + "documentation": "Documentación", + "youtubeVideos": "Videos de YouTube", + "installPackages": "Instalar nuestros paquetes", + "howToCite": "¿Cómo citar nuestro trabajo?", + "whatAreDirectories": "¿Qué son los directorios?", + "discordCommunity": "Habla con nuestra comunidad en Discord", + "contactUs": "Contáctanos" + }, + "footer": { + "title": "Base de los Datos", + "copyright": "® {{year}} Base de los Datos", + "termsOfUse": "Términos de uso", + "privacyPolicy": "Política de privacidad", + "contact": "Contacto", + "faq": "Preguntas frecuentes", + "newsletter": "Boletín", + "careers": "Carreras", + "supportProject": "Apoya el proyecto", + "products": { + "title": "PRODUCTOS", + "searchEngine": "Motor de búsqueda", + "publicDatalake": "Datalake público", + "dataPackages": "Paquetes", + "bdPro": "BD Pro", + "bdEdu": "BD Edu" + }, + "services": { + "title": "SERVICIOS", + "dataCapture": "Captura de datos", + "dataAnalytics": "Análisis de datos", + "dataConsulting": "Consultoría de datos", + "caseStudies": "Estudios de caso" + }, + "tutorials": { + "title": "TUTORIALES", + "documentation": "Documentación", + "blog": "Blog", + "youtubeVideos": "Vídeos" + }, + "institutional": { + "title": "INSTITUCIONAL", + "aboutUs": "Quiénes somos", + "transparency": "Transparencia", + "newsletter": "Boletín", + "careers": "Carreras", + "faq": "Preguntas frecuentes", + "termsAndPrivacy": "Términos y Privacidad", + "contact": "Contacto", + "supportProject": "Apoya el proyecto" + } + }, + "partners": { + "partnershipsWith": "Asociaciones con", + "testimonials": { + "fernando": { + "name": "Fernando Barbalho", + "position": "Científico de Datos del Tesoro Nacional", + "quote": "SiconfiBD es un paquete que trae de forma rápida y programática los datos de la Secretaría del Tesoro Nacional. El código es construido de forma open-source por el equipo del Tesoro y utiliza las tablas tratadas BD+ para componer funciones en R. ¿Cuál es el gasto de personal de los 100 municipios brasileños más poblados? Estas y más de otras 18 preguntas pueden ser consultadas directamente a través del paquete, sin necesidad de SQL." + }, + "marina": { + "name": "Marina Barros", + "position": "Directora Ejecutiva del Instituto Alziras", + "quote": "Con el apoyo de Base de los Datos, realizamos un estudio sobre las desigualdades de género y raza en las elecciones 2016-2020 y las distorsiones en el financiamiento de campañas de alcaldesas y concejalas en las últimas elecciones, lo que resultará en el lanzamiento de una publicación inédita." + }, + "amanda": { + "name": "Amanda de Albuquerque y Mariana Carvalho", + "position": "Cofundadoras de A Ponte", + "quote": "Creamos un producto importante nuestro, la Fotografía del Municipio, en asociación con BD. La Fotografía agrega varios indicadores socioeconómicos de los municipios brasileños. A Ponte hizo la planificación y el diseño del informe, mientras que BD se encargó de la parte técnica de visualización y gestión de datos. La asociación nos permitió avanzar rápidamente en el desarrollo de la herramienta y garantizó la alta calidad de datos que queríamos desde el principio." + } + } + } +} \ No newline at end of file diff --git a/next/public/locales/es/contact.json b/next/public/locales/es/contact.json new file mode 100644 index 00000000..19c1892a --- /dev/null +++ b/next/public/locales/es/contact.json @@ -0,0 +1,22 @@ +{ + "pageTitle": "Contacto – Base de los Datos", + "pageDescription": "Ponte en contacto con nuestro equipo.", + "contactTitle": "Ponte en contacto", + "contactDescription": "Envía tu mensaje en el formulario al lado para hablar con nuestro equipo.", + "institutionalSupportTitle": "Apoyo institucional", + "institutionalSupportDescription": "Base de los Datos se mantiene a través de donaciones de personas que creen en la transparencia y el acceso a datos de calidad. Colabora para el crecimiento y fortalecimiento de la iniciativa.", + "servicesTitle": "Servicios", + "servicesDescription": "Habla directamente con nuestro equipo comercial para programar una conversación y evaluar cómo nuestros ", + "servicesLink": "servicios", + "servicesLinkText": "pueden ayudar.", + "projectsPartnershipsTitle": "Proyectos y Asociaciones", + "projectsPartnershipsDescription": "Desarrollamos proyectos y aplicaciones con otras organizaciones afines para promover el acceso a datos públicos de calidad. Siempre estamos abiertos a nuevas ideas.", + "dataTitle": "Datos", + "dataDescription": "Ayudamos a personas y organizaciones a subir datos a nuestro datalake. Escribe tu propuesta a nuestro equipo de Datos.", + "questionsText": "¿Preguntas? Habla con nuestra comunidad en ", + "discordLink": "Discord", + "consulting": { + "title": "Consultoria – Base de los Datos", + "description": "Ponte en contacto con nuestro equipo." + } + } \ No newline at end of file diff --git a/next/public/locales/es/dataset.json b/next/public/locales/es/dataset.json new file mode 100644 index 00000000..512b8235 --- /dev/null +++ b/next/public/locales/es/dataset.json @@ -0,0 +1,213 @@ +{ + "dataBasis": "Base de los Datos", + "noName": "Conjunto de datos sin nombre", + "noDescription": "Sin descripción", + "temporalCoverage": "Cobertura temporal", + "noCoverage": "Sin cobertura temporal", + "organization": "Organización", + "noOrganization": "Sin organización", + "none": "Ninguno", + "dataAlt": "datos", + "data": "Datos", + "crossingAlt": "cruce", + "crossing": "Cruce", + "suggestData": "Hacer una propuesta", + "viewDataRoadmap": "Ver hoja de ruta de datos", + "pageTitle": "Datos – Base de Datos", + "filter": "Filtrar", + "datasetsWith": "Conjuntos de datos con", + "tables": "Tablas procesadas", + "rawDataSources": "Fuentes originales", + "informationRequests": "Solicitudes LAI", + "resources": "Recursos", + "openData": "Gratuito", + "closedData": "De pago", + "theme": "Tema", + "tag": "Etiqueta", + "observationLevel": "Nivel de observación", + "datasetsFound": "{{count}} conjunto de datos encontrado", + "datasetsFound_plural": "{{count}} conjuntos de datos encontrados", + "for": "para", + "findingDatasets": "buscando conjuntos de datos", + "findingDatasets_plural": "buscando {{count}} conjuntos de datos", + "forQuery": "para \"{{query}}\"", + "forQuery_plural": "para \"{{query}}\"", + "noDatasetsFound": "No encontramos ningún conjunto de datos para tu búsqueda.", + "ooops": "Ups...", + "unfortunatelyNoDatasetsFound": "Desafortunadamente, no encontramos ningún conjunto de datos para tu búsqueda.", + "tryRelatedTerms": "Intenta buscar términos relacionados o proponer nuevos datos para agregar a la BD.", + "stillNotFound": "¿Aún no has encontrado lo que buscas?", + "suggestNewData": "Proponer nuevos datos", + "clearFilters": "Limpiar filtros", + "previous": "Anterior", + "next": "Siguiente", + "datasetCard": { + "table": "tabla", + "tables": "tablas", + "oneTable": "1 tabla", + "multipleTables": "{{count}} tablas", + "rawDataSource": "fuente de datos original", + "rawDataSources": "fuentes de datos originales", + "oneRawDataSource": "1 fuente de datos original", + "multipleRawDataSources": "{{count}} fuentes de datos originales", + "noRawDataSources": "0 fuentes de datos originales", + "informationRequest": "solicitud LAI", + "informationRequests": "solicitudes LAI", + "oneInformationRequest": "1 solicitud LAI", + "multipleInformationRequests": "{{count}} solicitudes LAI", + "noInformationRequests": "0 solicitudes LAI", + "and": "y" + }, + "table": { + "notProvided": "No informado", + "temporalCoverage": "Cobertura temporal", + "dataAccess": "Acceso a los datos", + "dataUpdateFrequency": "Frecuencia de actualización de datos", + "lastUpdateBD": "Última actualización en la Base de Datos", + "noUpdateScheduled": "Sin actualización programada", + "lastUpdateRawDataSource": "Última actualización en la fuente de datos brutos", + "lastCheckRawDataSource": "Última verificación de la fuente original", + "bigQueryID": "ID de BigQuery", + "partitionsInBigQuery": "Particiones en BigQuery", + "partitionsTooltip": "Las particiones son divisiones hechas en una tabla para facilitar la gestión y consulta de datos. Al segmentar una tabla grande en particiones más pequeñas, se reduce la cantidad de bytes leídos, lo que ayuda a controlar los costos y mejora el rendimiento de las consultas.", + "observationLevel": "Nivel de observación", + "observationLevelTooltip": "Indica la granularidad más pequeña posible de análisis con esos datos. Por ejemplo, una tabla con nivel de observación estatal nos permite realizar un análisis a nivel nacional (por ser más amplio que el estado), pero no un análisis por municipio (que sería un desglose más específico).", + "downloadFiles": "Descargar archivos", + "rawDataSources": "Fuentes de datos brutos", + "rawDataSourcesTooltip": "Enlaces a páginas con información útil sobre el conjunto de datos. Siempre intentamos proporcionar la ruta más cercana a la fuente para descargar los datos originales.", + "auxiliaryFiles": "Archivos auxiliares", + "auxiliaryFilesTooltip": "Los archivos auxiliares proporcionan más contexto y ayudan a entender mejor los datos. Pueden incluir notas técnicas, descripciones de recolección y muestreo, etc.", + "additionalInformation": "Información adicional", + "publishedBy": "Publicado por", + "dataCleanedBy": "Datos limpiados por", + "version": "Versión", + "updateEvery": "Actualización cada", + "updatePerSecond": "Actualización por segundo", + "updatePerMinute": "Actualización por minuto", + "updatePerHour": "Actualización por hora", + "dailyUpdate": "Actualización diaria", + "weeklyUpdate": "Actualización semanal", + "monthlyUpdate": "Actualización mensual", + "bimonthlyUpdate": "Actualización bimestral", + "quarterlyUpdate": "Actualización trimestral", + "semiannualUpdate": "Actualización semestral", + "annualUpdate": "Actualización anual", + "days": "días", + "weeks": "semanas", + "months": "meses", + "bimonths": "bimestres", + "quarters": "trimestres", + "semesters": "semestres", + "years": "años", + "updateNotDefined": "Actualización no definida", + "selectColumns": "Seleccione las columnas que desea acceder:", + "checkColumns": "Compruebe las columnas de la tabla:", + "translateInstitutionalCodes": "Traducir códigos institucionales", + "translateTooltip": "Por ejemplo, traducir el código \"2927408\" a \"Salvador-BA\"", + "generateQuery": "Generar consulta", + "downloadTable": "Descargar tabla", + "bigQueryInstructions": "En el editor de consultas de BigQuery, ingrese la siguiente instrucción:", + "firstTimeBigQuery": "¿Es la primera vez que utiliza BigQuery?", + "followStepByStep": "Siga el paso a paso.", + "accessBigQuery": "Acceder a BigQuery", + "pythonInstructions": "En el terminal de Python, ingrese la siguiente instrucción:", + "firstTimePython": "¿Es la primera vez que utiliza el paquete Python?", + "rInstructions": "En el terminal de R, ingrese la siguiente instrucción:", + "firstTimeR": "¿Es la primera vez que utiliza el paquete R?", + "compareThePlans": "Comparar los planes", + "warningLargeTable": ["Esta tabla completa, con todas las columnas, tiene ", ". Ten cuidado de no exceder el ", "límite de procesamiento gratuito", "de BigQuery."], + "warningLargeTableOptimize": "Para optimizar la consulta, puedes seleccionar menos columnas o agregar filtros en BigQuery.", + "errorInsufficientChecks": "Por favor, selecciona arriba las columnas que deseas acceder.", + "infoTranslationNotAvailable": ["Esta tabla tiene códigos institucionales que varían entre años. Por eso, todavía estamos trabajando para automatizar el proceso de traducción. Por ahora, recomendamos acceder al ", "diccionario", "y los", "directorios", "para entender cómo traducir los códigos presentes en la tabla."], + "infoDataAvailability": ["Estos datos están disponibles porque varias personas contribuyen a su mantenimiento. Antes de descargar los datos, apóyanos también con una donación financiera o ", "aprende cómo contribuir con tu tiempo"], + "warningPaidPlanRequired": ["La descarga de tablas con tamaño entre 100 MB y 1 GB está disponible solo para ", "suscriptores de nuestros planes de pago", ". Sin embargo, puedes acceder a la tabla gratis utilizando SQL, Python o R. Considera actualizar a un plan de pago para hacer la descarga."], + "errorTableTooLarge": "El tamaño de la tabla ha excedido el límite permitido para descarga, de 1 GB. Puedes acceder a los datos en SQL, Python o R.", + "bigQueryAndPackages": "BigQuery y Paquetes", + "download": "Descargar" + }, + "temporalCoverageBar": { + "title": "Cobertura temporal", + "notProvided": "No informado", + "noCoverage": "Sin cobertura temporal", + "free": "GRATIS", + "paid": "PAGO", + "accessGranted": "Acceso liberado para el período", + "upgradeRequired": "Actualiza a un plano para liberar el período", + "comparePlans": "Comparar los planes" + }, + "column": { + "search": "Buscar columnas", + "name": "Nombre", + "nameTooltip": "Nombre de la columna.", + "translationTable": "Tabla de traducción", + "translationTableTooltip": "Para traducir los códigos institucionales en la tabla, necesitas usar las tablas de diccionario y directorio, dependiendo de la columna que desees usar.", + "needsTranslation": "Necesita traducción", + "needsTranslationTooltip": "La columna tiene códigos institucionales para ser traducidos.", + "description": "Descripción", + "descriptionTooltip": "Descripción de los datos de la columna.", + "bigQueryType": "Tipo BigQuery", + "bigQueryTypeTooltip": "Tipo de datos en BigQuery — categorías: INTEGER (Entero), STRING (Texto), DATE (Fecha), FLOAT64 (Decimal), GEOGRAPHY (Geográfico).", + "temporalCoverage": "Cobertura Temporal", + "temporalCoverageTooltip": "Cobertura inicial y final de los datos. Puede variar entre columnas, según la disponibilidad en los datos originales.", + "measurementUnit": "Unidad de Medida", + "measurementUnitTooltip": "Unidad de medida de la columna — ej: km, m2, kg.", + "sensitiveData": "Contiene Datos Sensibles (LGPD)", + "sensitiveDataTooltip": "Indica si la columna tiene datos sensibles — ej: CPF identificado, datos de cuenta bancaria, etc.", + "observations": "Observaciones", + "observationsTooltip": "Describe los procesos de tratamiento realizados en la columna que necesitan ser destacados.", + "downloadTranslationTable": "Descargar tabla que hace la traducción de esta columna", + "accessTranslationTable": "Acceder a la tabla que hace la traducción de esta columna", + "dictionary": "Diccionario", + "noTranslationNeeded": "No necesita traducción", + "notProvided": "No informado", + "yes": "Sí", + "no": "No" + }, + "observationLevelTable": { + "entityHeader": "Entidad", + "columnsHeader": "Columnas Correspondientes", + "notProvided": "No informado" + }, + "rawDataSource": { + "name": "Nombre", + "description": "Descripción", + "url": "URL", + "additionalInfo": "Información adicional", + "yes": "Sí", + "no": "No", + "notProvided": "No proporcionado", + "lastUpdateDate": "Fecha de última actualización", + "lastCheckDate": "Fecha de última verificación", + "updateFrequency": "Frecuencia de actualización", + "coverageStart": "Inicio de cobertura", + "coverageEnd": "Fin de cobertura", + "observationLevel": "Nivel de observación", + "observationLevelTooltip": "Indica la granularidad más pequeña posible de análisis con esos datos. Por ejemplo, una tabla con nivel de observación estatal nos permite realizar un análisis a nivel nacional (por ser más amplio que el estado), pero no un análisis por municipio (que sería un desglose más específico).", + "format": "Formato", + "treatment": "Tratamiento", + "language": "Lenguaje", + "availability": "Disponibilidad", + "hasStructuredData": "Tiene datos estructurados", + "hasAPI": "Tiene API", + "requiresIPFromCountry": "Requiere IP de algún país", + "requiresRegistration": "Requiere registro", + "isFree": "Es gratuito", + "license": "Licencia", + "dataAccessLink": "Enlace de acceso a los datos", + "dataAccessInstructions": "Instrucciones de acceso a los datos", + "auxiliaryFiles": "Archivos auxiliares", + "auxiliaryFilesDescription": "Descripción de archivos auxiliares", + "version": "Versión", + "versionDescription": "Descripción de la versión" + }, + "informationRequest": { + "requestNumber": "Número del pedido: {{number}}", + "disclaimer": "Estos datos no han pasado por la metodología de tratamiento de la Base de Datos.", + "accessData": "Acceder a los datos", + "accessRequest": "Acceder al pedido", + "description": "Descripción", + "notProvided": "No informado", + "additionalInformation": "Información adicional", + "status": "Estado" + } +} \ No newline at end of file diff --git a/next/public/locales/es/faq.json b/next/public/locales/es/faq.json new file mode 100644 index 00000000..e19c1a5a --- /dev/null +++ b/next/public/locales/es/faq.json @@ -0,0 +1,292 @@ +{ + "questions": [ + { + "question": "Os dados da BD são públicos ou privados?", + "answer": "

Em sua grande maioria, as bases de dados encontradas em nossa plataforma são públicas. Porém, também estão listadas algumas bases privadas. Nossa organização não possui fins lucrativos, portanto, não comercializamos a listagem de bases em nossa plataforma. Acreditamos ser útil listar conjuntos de dados privados, uma vez que as pessoas podem ter interesse em adquirí-las ao encontrá-las em nosso site.

", + "categories": ["Dados"], + "keywords": "público, privado", + "id": "public-or-private" + }, + { + "question": "Preciso pagar para acessar os dados da BD?", + "answer": "

O acesso à maioria dos dados oferecidos pela BD é grátis. Só em dois casos pode ser necessário pagamento. São esses:

1. Alguns dados fazem parte dos nossos planos avançados, Pro e Empresas, como indicado nas páginas das tabelas. Nesse caso é necessário uma assinatura para acessar os dados.

2. Uma forma de acessar nossos dados é através do BigQuery, no Google Cloud, que oferece até 1 Terabyte gratuito por mês para seus usuários. Ressaltamos que esse limite costuma ser o suficiente, mesmo para análises com bases mais robustas, como a RAIS ou Censo Escolar. Caso você ultrapasse esse limite, o BigQuery cobra 5 dólares por terabyte de dados que sua consulta irá processar.

", + "categories": ["Dados"], + "keywords": "pagar, custo, gratuito, grátis, mensalidade", + "id": "do-i-have-to-pay" + }, + { + "question": "É possível fazer o download dos dados da BD?", + "answer": "

Sim, você pode baixar o arquivo CSV completo das tabelas tratadas direto na plataforma. No entanto, tabelas com mais de 200.000 linhas só podem ser acessados através do nosso data lake no BigQuery ou dos nossos pacotes em Python e R.

", + "categories": ["Dados"], + "keywords": "download, baixar, CSV, arquivo", + "id": "download" + }, + { + "question": "Qual é o limite de download dos dados da BD na plataforma?", + "answer": "

O limite para download dos dados na nossa plataforma é de 200.000 linhas. Para acessar tabelas que ultrapassam esse limite, utilize nosso datalake no BigQuery ou nossos pacotes em Python e R.

", + "categories": ["Dados"], + "keywords": "limite, download, baixar, tamanho, máximo, arquivo", + "id": "download-limit" + }, + { + "question": "Quais tipos de dados encontro na BD?", + "answer": "

Em nossa plataforma, você encontra três tipos de dados: tabelas tratadas, fontes originais e pedidos LAI.

", + "categories": ["Dados"], + "keywords": "tipo, categoria", + "id": "data-resources" + }, + { + "question": "O que são tabelas tratadas?", + "answer": "

São tabelas prontas para análise, disponíveis via SQL, Python e R. O processo de tratamento das tabelas envolve a padronização de nomes de variáveis e compatibilização de códigos, o que permite que o cruzamento de tabelas de diferentes instituições e temas seja tão simples quanto qualquer outra consulta.

", + "categories": ["Dados"], + "keywords": "tratada, tratado, BD+, tabela, datalake, cruzar, cruzamento, padronização, compatibilização", + "id": "tables" + }, + { + "question": "O que são fontes originais?", + "answer": "

São links para páginas externas à plataforma com informações úteis sobre o conjunto de dados. A maioria destes são dados que ainda não disponibilizamos na BD como tabelas tratadas. Tentamos sempre fornecer o caminho mais próximo possível à fonte para baixar os dados originais.

", + "categories": ["Dados"], + "keywords": "fonte original, externo", + "id": "external-links" + }, + { + "question": "O que são pedidos LAI?", + "answer": "

São pedidos feitos através da Lei de Acesso à Informação (LAI). A LAI, lei nº 12.527/2011 regulamenta o direito, previsto na Constituição, de qualquer pessoa solicitar e receber dos órgãos e entidades públicos, de todos os entes e Poderes, informações públicas por eles produzidas ou custodiadas.

", + "categories": ["Dados"], + "keywords": "LAI, acesso à informação, lei", + "id": "information-requests" + }, + { + "question": "Como acessar as tabelas tratadas?", + "answer": "

Você pode consultar as tabelas tratadas BD+ de diferentes maneiras. Além de fazer o download direto na plataforma, é possível explorar os dados com SQL através do BigQuery ou com os pacotes em Python e R.

", + "categories": ["Dados"], + "keywords": "acesso, consulta, tratada, tratado, BD+, download, baixar, pacote, SQL, BigQuery, Python, R", + "id": "access-tables" + }, + { + "question": "Como acessar as fontes originais?", + "answer": "

Você pode acessar as fontes originais dos dados clicando no botão de redirecionamento para o link externo à plataforma.

", + "categories": ["Dados"], + "keywords": "acesso, consulta, fonte original, externo", + "id": "access-external-links" + }, + { + "question": "Como acessar os pedidos LAI?", + "answer": "

Você pode acessar os pedidos LAI clicando no botão de redirecionamento para o link externo à plataforma.

", + "categories": ["Dados"], + "keywords": "acesso, consulta, LAI, acesso à informação, lei", + "id": "access-information-requests" + }, + { + "question": "O que são diretórios?", + "answer": "

São tabelas que ligam diversos códigos institucionais e informações de diferentes entidades brasileiras. Isso é importante porque resolve o problema de não existir um identificador único para entidades – como UF, município, escola, distrito, setor censitário, categorias CID-10 e CID-9, CBO-2002 e CBO-1992, etc – entre instituições ou, ainda, a mudança de identificadores e nomes com typos entre anos e instituições. Para saber mais, confira nosso tutorial sobre Diretórios Brasileiros.

", + "categories": ["Dados"], + "keywords": "diretório, entidade, identificador, chave, primária", + "id": "directories" + }, + { + "question": "Os dados da BD são atualizados automaticamente?", + "answer": "

Alguns dados são atualizados automaticamente e outros não. Temos um compromisso de atualizar automaticamente qualquer base de frequência mensal ou maior. Esses dados de alta frequência estão disponíveis nos nossos planos avançados, Pro e Empresas.

", + "categories": ["Dados"], + "keywords": "atualização, automatização, frequência", + "id": "data-updated" + }, + { + "question": "Como utilizar os pacotes da BD?", + "answer": "

Nossos pacotes permitem o acesso ao datalake público direto do seu computador ou ambiente de desenvolvimento. Para começar a explorar nossos dados em Python ou R, siga os tutoriais de instalação dos pacotes presentes na nossa documentação.

", + "categories": ["Dados"], + "keywords": "pacote, Python, R, instalação, documentação", + "id": "packages" + }, + { + "question": "O que é nível da observação?", + "answer": "

O nível da observação indica o que representa cada linha da tabela. É como se a combinação das colunas que compõem o nível da observação fosse uma chave primária. Essa informação é útil pois indica qual a menor granularidade possível de análise com aquele dado. Por exemplo, uma tabela com nível da observação de estado permite que façamos uma análise no país (por ser mais amplo que estado), mas não uma análise por município (que já seria um recorte mais específico).

", + "categories": ["Dados"], + "keywords": "nível, observação, chave, primária", + "id": "level-of-observation" + }, + { + "question": "Onde eu posso sugerir a inclusão de novos dados na plataforma?", + "answer": "

É muito importante saber quais dados a nossa comunidade precisa para que a equipe adicione os conjuntos solicitados no processo de priorização de dados. Temos um canal no Discord preparado para receber suas propostas e sugestões, basta você seguir os passos indicados lá. Acesse por aqui.

", + "categories": ["Dados"], + "keywords": "inclusão, solicitação, proposta, sugestão", + "id": "data-proposal" + }, + { + "question": "O que são os planos Pro e Empresas?", + "answer": "

Além do plano gratuito, a BD conta com planos avançados: Pro, para usuários individuais, e Empresas, para até 10 usuários de uma mesma organização. Nesses planos estão disponíveis além dos dados já existentes no data lake público da BD, dezenas de conjuntos de dados exclusivos priorizados para solucionar problemas e te ajudar em sua equipe, organização ou pesquisa. Além de conjuntos de dados exclusivos, os planos oferecem acesso à à versão mais atualizada de algumas das nossas principais tabelas, como do CNES, dados de CNPJ, do Brasileirão, dentre muitas outras.

", + "categories": ["Planos Pagos"], + "keywords": "pro, empresas, assinatura, dados exclusivos, pagar, custo, gratuito, grátis, mensalidade", + "id": "subscriptions" + }, + { + "question": "Quais dados tenho acesso com os planos pagos?", + "answer": "

A assinatura dá acesso a dados de alta frequência atualizados. Esses podem às vezes ser um subconjunto de uma tabela tratada maior, ou ser uma tabela tratada inteira. Nosso mecanismo de busca e páginas específicas de conjuntos indicam o que é disponível gratuitamente e o que está coberto pela assinatura dos planos pagos.

", + "categories": ["Planos Pagos"], + "keywords": "pro, empresas, assinatura, dados exclusivos, pagar, custo, gratuito, grátis, mensalidade", + "id": "subscriptions-data" + }, + { + "question": "Como os dados da BD Pro são atualizados?", + "answer": "

Todos os dados disponíveis na BD Pro são atualizados automaticamente via nossa tecnologia de gerência de fluxos. A BD usa o que há de mais moderno em engenharia de dados para garantir a mais alta qualidade e consistência no que disponibilizamos.

", + "categories": ["Planos Pagos"], + "keywords": "pro, empresas, assinatura, dados exclusivos, atualizacao", + "id": "subscriptions-data-update" + }, + { + "question": "Quanto custa uma assinatura BD Pro?", + "answer": "

Atualmente temos dois planos. O plano Pro custa R$47 por mês, dando acesso a todos os dados de alta frequência atualizados para um único usuário. O plano Empresas custa R$350 por mês, incluindo acesso para 10 contas e suporte prioritário com nossa equipe.

", + "categories": ["Planos Pagos"], + "keywords": "pro, empresas, assinatura, preco", + "id": "subscriptions-prices" + }, + { + "question": "O que é o datalake da BD no BigQuery?", + "answer": "

É um banco de dados público hospedado no BigQuery, ferramenta potente de armazenamento e análise de dados do Google Cloud, com todas as tabelas tratadas BD+ para você consultar direto do seu navegador. As vantagens de utilizar nosso datalake no BigQuery estão relacionadas à velocidade do processamento, escalabilidade e economia.

", + "categories": ["BigQuery"], + "keywords": "BigQuery, Google, Cloud, datalake, BD+", + "id": "datalake" + }, + { + "question": "Por que preciso de uma conta no Google Cloud?", + "answer": "

Nosso banco de dados público é hospedado no BigQuery, uma ferramenta potente de armazenamento e análise de dados do Google Cloud. Para esse serviço, o Google Cloud oferece até 1 Terabyte gratuito por mês para seus usuários. Assim, é necessário que você crie uma conta para associar as consultas do banco a você e contabilizar o total de processamento utilizado no mês. A criação da conta não requer nenhum cartão ou forma de pagamento prévio, ou seja, o BigQuery inicia automaticamente no modo Sandbox, que permite que você utilize os recursos sem adicionar um modo de pagamento.

", + "categories": ["BigQuery"], + "keywords": "conta, cadastro, BigQuery, Google, Cloud", + "id": "google-account" + }, + { + "question": "O que acontece se eu exceder o limite mensal de 1 TB gratuito do Google Cloud?", + "answer": "

Caso você exceda o limite, são cobrados 5 dólares por Terabyte de dados que sua consulta irá processar. Mas ressaltamos que o limite de 1 Terabyte do Google costuma ser suficiente, mesmo para análises com bases mais robustas, como a RAIS ou Censo Escolar.

", + "categories": ["BigQuery"], + "keywords": "limite, terabyte, TB, Google, Cloud", + "id": "data-limit" + }, + { + "question": "Como criar um projeto no Google Cloud?", + "answer": "

Para criar um projeto no Google Cloud, basta ter um e-mail cadastrado no Google. É necessário ter um projeto seu, mesmo que vazio, para você fazer consultas em nosso datalake público.

  1. Acesse o Google Cloud.t=\"_blank\">Google Cloud. Caso for a sua primeira vez, aceite os Termos de Serviço.
  2. Clique em Create Project/Criar Projeto. Escolha um nome bacana para o projeto.
  3. Clique em Create/Criar.
", + "categories": ["BigQuery"], + "keywords": "criar, cadastrar, projeto, Google, Cloud", + "id": "google-cloud-project" + }, + { + "question": "Quais as melhores práticas para fazer uma consulta no BigQuery?", + "answer": "

Para verificar uma amostra de todas as variáveis da tabela, use:

SELECT * FROM  dataset.table_name LIMIT 100
  • A primeira dica valiosa é selecionar as colunas que você vai usar. O BigQuery funciona usando um modelo colunar, portanto, quanto menos colunas você usar, melhor vai ser o desempenho da sua consulta. Isso significa evitar o clássico
    SELECT * FROM table_name
    e escolher as colunas de seu interesse. Parece chato, mas ajuda muito!
  • Para tabelas grandes, uma boa prática é filtrar os anos e estados de seu interesse com a cláusula
    WHERE
    . Como utilizamos o sistema de particionamento, isso vai reduzir drasticamente o custo e o tempo de processamento.

Essas são as dicas mais simples e rápidas de executar. Para saber mais sobre boas práticas, acesse o manual completo disponibilizado pelo Google Cloud.

", + "categories": ["BigQuery"], + "keywords": "prática, dica, otimização, desempenho, consulta, BigQuery, selecionar, filtrar", + "id": "best-practices-performance" + }, + { + "question": "O que são os tipos no BigQuery?", + "answer": "

São os tipos de dados do Google Standard SQL. Suas categorias incluem: INTEGER (Inteiro), STRING (Texto), DATE (Data), FLOAT64 (Decimal), GEOGRAPHY (Geográfico), entre outras.

", + "categories": ["BigQuery"], + "keywords": "tipo, categoria, BigQuery, INTEGER, STRING, DATE, FLOAT, GEOGRAPHY", + "id": "bigquery-types" + }, + { + "question": "O que são as partições no BigQuery?", + "answer": "

As partições são divisões feitas em uma tabela para facilitar o gerenciamento e a consulta aos dados. Ao segmentar uma tabela grande em partições menores, a quantidade de bytes lidos é reduzida, o que ajuda a controlar os custos e melhora o desempenho da consulta.

", + "categories": ["BigQuery"], + "keywords": "partição, particionamento, otimização, desempenho, BigQuery", + "id": "bigquery-partitions" + }, + { + "question": "O que é a BD Lab?", + "answer": "

A BD Lab é nosso braço de serviços, parcerias e projetos. É pela BD Lab que interagimos com outras organizações, provendo nossa expertise acumulada em tecnologia e dados. Enxergamos esses projetos como componente indispensável da nossa missão de promover o uso de dados para a promoção do bem-estar social.

", + "categories": ["BD Lab"], + "keywords": "bd lab, consultoria, projeto", + "id": "bd-lab" + }, + { + "question": "Como surgiu a BD Lab?", + "answer": "

A BD Lab foi criada para garantir a sustentabilidade da organização, de forma a manter e expandir nossos produtos de forma gratuita. A prestação de serviços de dados e a realização de projetos com parceiros vêm sendo chave não só na geração de receita, mas também no fortalecimento da nossa posição de referência na disponibilização de dados de qualidade.

", + "categories": ["BD Lab"], + "keywords": "bd lab, consultoria, projeto, origem", + "id": "bd-lab-origin" + }, + { + "question": "O que é a BD Edu?", + "answer": "

A BD Edu é nosso braço de educação, com a missão de capacitar pessoas para resolver problemas com dados. Já prestamos serviços de formação para organizações como Vetor Brasil, Souk Analytics e ProForest, além de nossos cursos abertos ao público. Oferecemos cursos ao vivo e assíncronos e todo o valor arrecadado é revertido em investimento na Base dos Dados.

", + "categories": ["BD Edu"], + "keywords": "bd edu, educacao, formacao, curso", + "id": "bd-edu" + }, + { + "question": "Quais cursos a BD Edu oferece?", + "answer": "

Atualmente oferecemos cursos de análises de dados com ferramentas importantes para o mercado, como SQL, Python, editores de planilhas e Google Cloud. Porém, nossa equipe é capacitada para desenvolver cursos sob demanda e temos trabalhado para lançar novos modelos de formações.

", + "categories": ["BD Edu"], + "keywords": "bd edu, educacao, formacao, curso", + "id": "bd-edu-courses" + }, + { + "question": "Os cursos da BD possuem certificado?", + "answer": "

Sim, sempre que um curso é concluído nós emitimos um certificado oficial da BD constando as informações pessoais do aluno e sobre o curso. O certificado é verificável e pode ser compartilhado nas redes ou anexado ao seu currículo.

", + "categories": ["BD Edu"], + "keywords": "bd edu, educacao, formacao, curso, certificado", + "id": "bd-edu-certificates" + }, + { + "question": "Tenho dúvidas sobre os cursos da BD Edu, existe um canal especializado para contato?", + "answer": "

Sim, você pode tirar suas dúvidas pelo email suporte.bdedu@basedosdados.org. Nossa equipe faz a checagem diária para prestar o melhor suporte possível.

", + "categories": ["BD Edu"], + "keywords": "bd edu, educacao, formacao, curso, certificado", + "id": "bd-edu-contact" + }, + { + "question": "Qual plataforma é utilizada para as atividades dos cursos da BD Edu?", + "answer": "

Utilizamos a plataforma coda.io, que funciona como um editor de documentos que combina recursos de planilhas, apresentações, processadores de texto e aplicativos. Por lá temos nossa Área do Aluno(a), onde é possível encontrar o cronograma, links para as aulas ao vivo, aulas gravadas, página de submissão de exercício, fórum de dúvidas, materiais extras e mais.

", + "categories": ["BD Edu"], + "keywords": "bd edu, educacao, formacao, curso, plataforma", + "id": "bd-edu-platform" + }, + { + "question": "Quem organiza e ministra os cursos da BD Edu?", + "answer": "

Nossos cursos são desenvolvidos e revisados por especialistas que trabalham na equipe da Base dos Dados. Você pode checar o perfil de todos em nossa página institucional.

", + "categories": ["BD Edu"], + "keywords": "bd edu, educacao, formacao, curso, suporte", + "id": "bd-edu-teacher" + }, + { + "question": "A BD é uma empresa?", + "answer": "

Não. A BD é constituída como uma associação sem fins lucrativos chamada \"Instituto Base dos Dados\" com sede no Rio de Janeiro e com CNPJ 42.494.318/0001-16.

", + "categories": ["Institucional"], + "keywords": "natureza legal, empresa, ong, lucro", + "id": "legal-nature" + }, + { + "question": "Como a BD se financia?", + "answer": "

Ao longo dos anos, a BD cresceu com o apoio financeiro de usuários e de pessoas que se identificam com nossa missão. Hoje, contamos também com nossa área de Serviços e Parcerias (BD Lab) e nossos planos de acesso a dados exclusivos de alta frequência atualizados (BD Pro). Confira mais sobre a contabilidade da organização em nossa página de Transparência.

", + "categories": ["Institucional"], + "keywords": "financiamento, sustentabilidade, contabilidade, serviço, parceria", + "id": "financing" + }, + { + "question": "Como citar a BD?", + "answer": "

Você pode referenciar de duas maneiras:

Dahis et al. (2022) Data Basis: Universalizing Access to High-Quality Data. Disponível em: {``}.

", + "categories": ["Institucional"], + "keywords": "citar, citação, referência", + "id": "reference" + }, + { + "question": "Como a BD coleta dados pessoais?", + "answer": "

Coletamos informações pessoais que você nos fornece diretamente ao usar nossos serviços. Isso pode incluir seu nome, endereço de e-mail, informações de pagamento e outras informações que você escolher compartilhar conosco. Também coletamos informações de forma automática, através de cookies, incluindo dados de uso, endereço IP, tipo de navegador, e informações sobre o dispositivo que você usa para acessar nossos serviços.

Utilizamos suas informações pessoais para fornecer e melhorar nossos serviços, incluindo o processamento de pagamentos, o fornecimento de suporte ao cliente e a personalização da experiência do usuário. Não venderemos, alugaremos ou compartilharemos suas informações pessoais com terceiros não afiliados sem o seu consentimento explícito. Para mais informações, acesse nossos Termos de Uso e Políticas de Privacidade aqui.

", + "categories": ["Institucional"], + "keywords": "privacidade, uso, lgpd", + "id": "personal-data" + } + ], + "pageTitle": "Perguntas frequentes – Base dos Dados", + "pageDescription": "Aqui você encontra as respostas para as suas dúvidas sobre a Base dos Dados. Saiba mais sobre nossos dados, como acessá-los pelo BigQuery usando SQL ou com os pacotes Python e R agora mesmo.", + "title": "Perguntas frequentes", + "searchPlaceholder": "Pesquise", + "categories": [ + "Dados", + "Planos Pagos", + "BigQuery", + "BD Lab", + "BD Edu", + "Institucional" + ], + "noQuestionsFound": "Infelizmente, não encontramos nenhuma pergunta relacionada à sua busca.", + "notFoundQuestion": "Não encontrou sua pergunta?", + "contactUs": "Entre em contato" +} \ No newline at end of file diff --git a/next/public/locales/es/menu.json b/next/public/locales/es/menu.json new file mode 100644 index 00000000..a94f05eb --- /dev/null +++ b/next/public/locales/es/menu.json @@ -0,0 +1,28 @@ +{ + "enter": "Entrar", + "register": "Registrar", + "public_profile": "Perfil público", + "account": "Cuenta", + "password": "Contraseña", + "plans_and_payment": "Planes y pago", + "settings": "Configuraciones", + "exit": "Salir", + "search_data": "Buscar datos", + "data": "Datos", + "solutions": "Soluciones", + "exclusive_data": "Datos exclusivos", + "data_courses": "Cursos de datos", + "services": "Servicios", + "prices": "Precios", + "tutorials": "Tutoriales", + "documentation": "Documentación", + "youtube_videos": "Videos de Youtube", + "blog": "Blog", + "institutional": "Institucional", + "about_us": "Sobre nosotros", + "transparency": "Transparencia", + "newsletter": "Newsletter", + "jobs": "Trabajos", + "faq": "FAQ", + "contact": "Contacto" +} \ No newline at end of file diff --git a/next/public/locales/es/prices.json b/next/public/locales/es/prices.json new file mode 100644 index 00000000..ca9d6fab --- /dev/null +++ b/next/public/locales/es/prices.json @@ -0,0 +1,56 @@ +{ + "pageTitle": "Precios – Base de los Datos", + "ogTitle": "Precio – Base de los Datos", + "ogDescription": "Compare los planes de Base de los Datos: Gratis, Pro y Empresas. Con BD Pro, cuenta con funciones avanzadas de nuestra plataforma, datos de alta frecuencia y conjuntos exclusivos desde R$47/mes.", + "comparePlans": "Comparar planes", + "annualDiscount": "Descuento anual", + "annualBillingMessage": "{{price}} cobrado una vez al año", + "save20": "Ahorre 20%", + "perMonth": "/mes", + "chargedAnnually": "cobrado una vez al año", + "readThe": "Lea los", + "termsOfService": "Términos de Servicio", + "features": "Características:", + "allFeaturesPlus": "Todas las características de {{plan}}, más:", + "currentPlan": "Plan actual", + "subscribe": "Suscribirse", + "startFreeTrial": "Iniciar prueba gratuita", + "exploreFeatures": "Explorar características", + "plans": { + "free": { + "title": "BD Gratis", + "subtitle": "Para que descubras el potencial de la plataforma de datos", + "features": [ + "Tablas procesadas", + "Datos integrados", + "Datos de baja frecuencia actualizados", + "Acceso en la nube", + "Acceso vía SQL, Python y R", + "Integración con herramientas BI", + "Descarga directa hasta 100 MB" + ] + }, + "pro": { + "title": "BD Pro", + "subtitle": "Para que tengas acceso a los datos más actualizados", + "features": [ + "Decenas de bases de alta frecuencia actualizadas", + "Tabla de referencia de empresas con información actualizada", + "Descarga directa hasta 1GB (80% de las tablas de la plataforma)" + ] + }, + "enterprise": { + "title": "BD Empresas", + "subtitle": "Para que tu empresa gane tiempo y calidad en las decisiones", + "features": [ + "Acceso para 10 cuentas", + "Soporte prioritario por correo electrónico y Discord" + ] + } + }, + "tooltips": { + "integratedData": "Nuestra metodología de estandarización y compatibilización de datos te permite cruzar tablas de diferentes instituciones y temas de manera simplificada.", + "downloadLimit": "Este límite no se aplica al acceso vía SQL, Python y R.", + "downloadLimitPro": "Las tablas mayores de 1 GB no están disponibles para descarga parcial o completa. Este límite no se aplica al acceso vía SQL, Python y R." + } + } \ No newline at end of file diff --git a/next/public/locales/es/services.json b/next/public/locales/es/services.json new file mode 100644 index 00000000..95481292 --- /dev/null +++ b/next/public/locales/es/services.json @@ -0,0 +1,111 @@ +{ + "pageTitle": "Servicios – Base de los Datos", + "metaTitle": "Servicios – Base de los Datos", + "slogan": { + "title": "Nuestros servicios", + "description": "Base de los Datos es el experto que te ayuda a ti o a tu equipo a trabajar y extraer el máximo valor de los datos.", + "cta": "Hagamos un proyecto juntos" + }, + "services": { + "dataCapture": "Captura de datos", + "dataAnalysis": "Análisis de datos", + "dataConsulting": "Consultoría de datos" + }, + "caseStudies": { + "title": "Nuestras soluciones", + "subtitle": "Descubre por qué las instituciones eligen innovar con Base de los Datos", + "readMore": "Lee el caso de estudio" + }, + "dataCapture": { + "title": "Captura de datos", + "description": "Capturamos y ponemos a disposición datos bajo demanda con rapidez, escala y bajo costo.", + "longDescription": "No necesitas preocuparte por crear y mantener una infraestructura propia o escribir códigos - nosotros nos encargamos de eso. Todo se hace siguiendo la metodología de tratamiento y estandarización de Base de los Datos, y conforme a las mejores prácticas de ingeniería de datos del mercado. Las tablas tratadas pueden estar disponibles de forma exclusiva o ser públicas.", + "advantages": { + "title": "Principales ventajas", + "speed": "Rapidez", + "speedDescription": "Incluso las consultas muy complejas tardan solo minutos en procesarse.", + "scale": "Escala", + "scaleDescription": "Nuestro datalake escala mágicamente a hexabytes si es necesario.", + "cost": "Bajo costo", + "costDescription": "Cada usuario tiene 1TB gratuito por mes para consultar los datos." + }, + "work": { + "title": "Nuestro trabajo con ingeniería de datos", + "technology": { + "title": "Tecnología de punta", + "description": "Utilizando la infraestructura de Google Cloud Platform, una de las mayores plataformas de almacenamiento y procesamiento de datos, garantizamos la seguridad y confiabilidad de nuestro trabajo." + }, + "flexibility": { + "title": "Flexibilidad", + "description": "Ya sean envíos puntuales, actualizaciones recurrentes, acceso vía API o conexión con plataformas de BI, entregamos la solución que necesitas de forma ágil y completa." + }, + "frameworks": { + "title": "Frameworks reconocidos", + "description": "Con frameworks y sistemas de gestión de datos, garantizamos la calidad y organización de tu sistema de datos sin generar ninguna preocupación para tu equipo." + } + } + }, + "dataAnalysis": { + "title": "Análisis de datos", + "description": "Construimos análisis, informes e indicadores esenciales para tu investigación o toma de decisiones.", + "longDescription": "La información y los insights se generan a partir de diversos conjuntos de datos ya tratados en nuestro datalake público junto con la experiencia de nuestro equipo de Datos. Y más: utilizamos nuestra metodología estándar de tratamiento para que también puedas cruzar estos datos con cualquier otra base disponible en el datalake.", + "examples": { + "title": "Ejemplos de preguntas que podemos responder", + "example1": "¿Cómo ha evolucionado la economía brasileña, con indicadores detallados mensuales por sector?", + "example2": "¿Qué escuelas tendrán un rendimiento por encima del promedio estatal en matemáticas el próximo año?", + "example3": "¿Cuántas veces el Diario Oficial de la Unión publica sobre cierto tema cada día?" + } + }, + "dataConsulting": { + "title": "Consultoría de datos", + "description": "Orientamos cómo aplicar nuestra metodología de limpieza, estructuración y estandarización de datos", + "longDescription": "En tu proyecto u organización a través de talleres y materiales exclusivos. Reproducir nuestro proceso de tratamiento en tu propia base de datos puede ahorrar horas de trabajo de tu equipo al consultar, manipular o actualizar la información.", + "advantages": { + "title": "Principales ventajas", + "advantage1": "Experiencia en construir infraestructuras capaces de soportar miles de accesos mensuales.", + "advantage2": "Flexibilidad para proyectos remotos en cualquier lugar del país.", + "advantage3": "Equipo diverso y con experiencia en diferentes áreas del conocimiento y datos." + }, + "areas": { + "title": "Áreas de actuación", + "infrastructure": { + "title": "Infraestructura", + "description": "Mentoría para equipos de ingeniería de datos que buscan estructurar procesos de mantenimiento de datos, sus propios datalakes o incluso potenciarse utilizando la infraestructura de Base de los Datos." + }, + "analysis": { + "title": "Análisis", + "description": "Talleres prácticos, mostrando cómo funciona el datalake de Base de los Datos y enseñando cómo explorar datos públicos para artículos periodísticos o investigaciones científicas." + }, + "programming": { + "title": "Programación", + "description": "Programas personalizados de enseñanza para utilizar paquetes de Python y R de Base de los Datos, además de mentoría de SQL para construir análisis rápidos y escalables directamente en la nube." + } + } + }, + "workflow": { + "title": "Nuestro flujo de trabajo", + "description": "Una misma metodología de trabajo para todos los servicios, basada en la satisfacción de los clientes y en la excelencia en la calidad.", + "steps": { + "demand": { + "title": "Demanda", + "subtitle": "Identificación de demandas y necesidades del cliente", + "description": "Trabajamos colaborativamente para comprender las necesidades reales detrás de las solicitudes de nuestros clientes. El trabajo de descubrimiento incluye discusiones sobre los objetivos del proyecto o el uso de los datos a ser capturados y analizados. Es en esta etapa donde queda claro para nuestro equipo y para los clientes el objetivo final del servicio." + }, + "planning": { + "title": "Planificación", + "subtitle": "Alineación de expectativas de negocio, ingeniería o capacitación", + "description": "El segundo paso es entender cuál es la mejor forma de entregar el valor que necesitas. No trabajamos con propuestas genéricas. Cada proyecto está pensado y orientado 100% a las demandas de los clientes, ya sea en el formato de entrega de datos, análisis o capacitaciones específicas." + }, + "budget": { + "title": "Presupuesto", + "subtitle": "Presupuesto transparente y simplificado", + "description": "Una vez alineado el alcance, formato y expectativas, entregamos una propuesta de presupuesto completamente transparente. Para ello, consideramos factores como la cantidad y complejidad de datasets, trabajo necesario, tamaño del equipo y urgencia. Todo explícito de forma directa y en conformidad con lo que se ha determinado hasta entonces." + }, + "execution": { + "title": "Ejecución", + "subtitle": "Ejecución ágil y entrega de valor", + "description": "Por último, nuestra entrega está comprometida con los plazos y, sobre todo, con la calidad. La comunicación es constante durante toda la ejecución. Trabajando de forma lean y con profesionales experimentados en el área, nuestro equipo se enfoca en la satisfacción de nuestros clientes." + } + } + } +} \ No newline at end of file diff --git a/next/public/locales/es/terms.json b/next/public/locales/es/terms.json new file mode 100644 index 00000000..00f53dba --- /dev/null +++ b/next/public/locales/es/terms.json @@ -0,0 +1,119 @@ +{ + "pageTitle": "Términos – Base de los Datos", + "ogTitle": "Términos y Privacidad – Base de los Datos", + "mainTitle": "Términos y Privacidad", + "termsOfService": "Términos de Servicio", + "privacyPolicy": "Política de Privacidad", + "ToS": { + "term1": { + "title": "1. Aceptación de los Términos", + "content": "Al acceder o utilizar los servicios ofrecidos por Base de los Datos (\"Nosotros\", \"Nuestro\" o \"Nuestros\"), usted acepta cumplir y aceptar estos Términos de Servicio. Si no está de acuerdo con todos los términos y condiciones de este acuerdo, no podrá utilizar nuestros servicios." + }, + "term2": { + "title": "2. Descripción del Servicio", + "content": "2.1. Nuestros servicios consisten en una suscripción mensual que otorga a sus suscriptores acceso a diversos datos exclusivos, armonizados y actualizados en la plataforma de Base de los Datos. El acceso se proporciona a través de los paquetes Python o R de Base de los Datos, o a través de BigQuery, el servicio de almacenamiento de datos de bajo costo y totalmente administrado de Google para análisis." + }, + "term3": { + "title": "3. Pago y Suscripciones", + "content": "", + "subContent1": "3.1. Al suscribirse, acepta pagar la tarifa mensual especificada. El pago se procesará automáticamente cada mes, a menos que cancele su suscripción antes de la fecha de renovación, que se indica claramente al contratar el servicio.", + "subContent2": "3.2. Al suscribirse, acepta que sus datos se utilicen en la creación y mantenimiento de usuarios en la plataforma de pagos Stripe.", + "subContent3": "3.3. Los precios y los métodos de pago están sujetos a cambios a discreción exclusiva de Base de los Datos. Los cambios en los precios o métodos de pago se notificarán con antelación." + }, + "term4": { + "title": "4. Cancelación y Reembolso", + "content": "4.1. Puede cancelar su suscripción en cualquier momento a través de las opciones disponibles en su cuenta. Sin embargo, no se proporcionarán reembolsos ni créditos por períodos en los que no se utilizó la suscripción." + }, + "term5": { + "title": "5. Uso Responsable", + "content": "5.1. Usted acepta utilizar nuestros servicios de manera responsable y de conformidad con todas las leyes y regulaciones aplicables." + }, + "term6": { + "title": "6. Propiedad Intelectual", + "content": "6.1. Todos los derechos de propiedad intelectual relacionados con los datos proporcionados son propiedad de terceros y están sujetos a sus respectivas políticas de uso." + }, + "term7": { + "title": "7. Privacidad", + "content": "7.1. El uso de sus datos personales se rige por nuestra Política de Privacidad. Al utilizar nuestros servicios, acepta la recopilación y el uso de su información según se describe en nuestra Política de Privacidad." + }, + "term8": { + "title": "8. Rescisión", + "content": "8.1. Nos reservamos el derecho de terminar o suspender su cuenta en cualquier momento, por cualquier motivo, sin previo aviso." + }, + "term9": { + "title": "9. Limitación de Responsabilidad", + "content": "9.1. En ningún caso seremos responsables por daños directos, indirectos, especiales, incidentales o consecuentes que surjan del uso o la imposibilidad de usar nuestros servicios." + }, + "term10": { + "title": "10. Cambios en los Términos de Servicio", + "content": "10.1. Nos reservamos el derecho de modificar estos Términos de Servicio en cualquier momento. Los cambios entrarán en vigor después de la publicación de las versiones actualizadas en nuestro sitio web." + }, + "term11": { + "title": "11. Ley Aplicable y Jurisdicción", + "content": "11.1. Estos Términos de Servicio se regirán e interpretarán de acuerdo con las leyes de Brasil. Cualquier disputa relacionada con estos términos estará sujeta a la jurisdicción exclusiva de los tribunales de Río de Janeiro, RJ, Brasil." + }, + "term12": { + "title": "12. Contacto", + "content": "12.1. Para contactarnos con preguntas o inquietudes relacionadas con estos Términos de Servicio, envíe un correo electrónico a suporte.bdpro@basedosdados.org." + }, + "finalNote": "Al utilizar nuestros servicios, usted acepta todos los términos y condiciones establecidos en este acuerdo. Por favor, lea estos términos cuidadosamente antes de continuar." + }, + "PP": { + "header": { + "subContent1": "Base de los Datos (\"Nosotros\", \"Nuestro\" o \"Nuestros\"). Nos comprometemos a proteger y respetar su privacidad y cumplir con todas las obligaciones establecidas en la Ley General de Protección de Datos (\"LGPD\").", + "subContent2": "Esta Política de Privacidad describe cómo recopilamos, usamos, compartimos y protegemos su información personal. Al acceder o usar nuestros servicios, usted acepta los términos y prácticas descritos en esta Política de Privacidad." + }, + "term1": { + "title": "1. Información que Recopilamos", + "subContent1": "1.1. Recopilamos información personal que nos proporciona directamente al usar nuestros servicios. Esto puede incluir su nombre, dirección de correo electrónico, información de pago y otras informaciones que elija compartir con nosotros.", + "subContent2": "1.2. También recopilamos información de forma automática, incluida la información de uso, la dirección IP, el tipo de navegador y la información sobre el dispositivo que usa para acceder a nuestros servicios." + }, + "term2": { + "title": "2. Uso de la Información", + "subContent1": "2.1. Utilizamos su información personal para proporcionar y mejorar nuestros servicios, incluyendo el procesamiento de pagos, la prestación de atención al cliente y la personalización de la experiencia del usuario.", + "subContent2": "2.2. No venderemos, alquilaremos ni compartiremos su información personal con terceros no afiliados sin su consentimiento explícito." + }, + "term3": { + "title": "3. Cookies y Tecnologías Similares", + "subContent1": "3.1. Las cookies son fragmentos de datos que ayudan al sitio web a recordar sus preferencias y hacer la navegación más eficiente.", + "subContent2": "3.2. Estas cookies son necesarias para garantizar el funcionamiento adecuado del sitio, mejorar el rendimiento y personalizar la experiencia de navegación, como el idioma y la región.", + "subContent3": { + "title": "3.3. Cookies utilizadas:", + "headers": { + "header1": "Nombre de la Cookie", + "header2": "Retención", + "header3": "Finalidad" + }, + "row1": { + "name": "userBD", + "retention": "7 días", + "purpose": "Al iniciar sesión en nuestro sitio, se crea esta cookie especial para almacenar su información básica. Esta cookie es esencial para permitirle permanecer conectado y acceder a las áreas protegidas del sitio. Sin ella, no podrá iniciar sesión." + }, + "row2": { + "name": "token", + "retention": "7 días", + "purpose": "Al iniciar sesión en nuestro sitio, se crea esta cookie especial para almacenar su token de acceso. Este token no solo le permite permanecer conectado, sino que también actúa como un guardián para garantizar la integridad de sus configuraciones e información personal." + } + }, + "subContent4": "3.4. Al continuar utilizando nuestro sitio, usted acepta el uso de estas cookies. Si prefiere no usarlas, le recomendamos que ajuste la configuración de su navegador. Sin embargo, esto afectará su capacidad para iniciar sesión y acceder a áreas restringidas.", + "subContent5": "Si tiene alguna pregunta sobre estas cookies o cualquier otra cuestión de privacidad, póngase en contacto con nosotros a través de la dirección de correo electrónico contato@basedosdados.org." + }, + "term4": { + "title": "4. Seguridad de la Información", + "subContent1": "4.1. Implementamos medidas de seguridad técnicas y organizativas para proteger su información personal contra el acceso no autorizado y el uso indebido." + }, + "term5": { + "title": "5. Sus Derechos", + "subContent1": "5.1. De acuerdo con la LGPD, usted tiene derecho a acceder, rectificar, eliminar o portar sus datos personales. Si desea ejercer estos derechos o tiene alguna pregunta sobre cómo se está tratando su información, póngase en contacto con nosotros a través de la dirección de correo electrónico contato@basedosdados.org." + }, + "term6": { + "title": "6. Cambios en esta Política de Privacidad", + "subContent1": "6.1. Nos reservamos el derecho de actualizar esta Política de Privacidad periódicamente. Los cambios se publicarán en nuestro sitio web, y se revisará la fecha de la última actualización. Le recomendamos que revise esta Política regularmente para mantenerse informado sobre nuestras prácticas de privacidad." + }, + "term7": { + "title": "7. Contacto", + "subContent1": "7.1. Para cualquier pregunta o inquietud relacionada con nuestra Política de Privacidad, póngase en contacto con nosotros a través de la dirección de correo electrónico contato@basedosdados.org." + }, + "finalNote": "Esta Política de Privacidad ha sido elaborada de acuerdo con las disposiciones de la LGPD y tiene como objetivo garantizar que su información personal sea tratada con el debido respeto y cuidado." + } +} \ No newline at end of file diff --git a/next/public/locales/es/transparency.json b/next/public/locales/es/transparency.json new file mode 100644 index 00000000..13936406 --- /dev/null +++ b/next/public/locales/es/transparency.json @@ -0,0 +1,31 @@ +{ + "pageTitle": "Transparencia – Base de los Dados", + "ogDescription": "Utilizamos los recursos para facilitar el acceso de miles de personas a datos de calidad. En este espacio, encontrarás información sobre nuestras actividades, ingresos y gastos. Sigue de cerca cómo garantizamos la sostenibilidad de la organización y descubre cómo tú también puedes apoyarnos.", + "mainTitle1": "Nuestras cuentas son", + "mainTitle2": " transparentes y abiertas", + "mainTitle3": " - como todo lo demás.", + "mainDescription1": "Somos una organización no gubernamental sin fines de lucro y de código abierto. La transparencia fundamenta todas nuestras acciones, desde el trabajo con datos públicos hasta la rendición de cuentas. Utilizamos los recursos para facilitar el acceso de miles de personas a datos de calidad.", + "mainDescription2": "En este espacio, encontrarás información sobre nuestras actividades, ingresos y gastos. Sigue de cerca cómo garantizamos la sostenibilidad de la organización.", + "survivalIndicator": "Indicador de supervivencia", + "survivalDescription1": "Este es nuestro indicador de supervivencia. Muestra el tiempo que nuestras actividades podrían mantenerse si la organización recaudara solo lo que ya está planificado y continuara gastando como en el promedio de los tres meses anteriores.", + "survivalDescription2": "A continuación, puedes ver los detalles de las fuentes y destinos de los recursos de la organización.", + "accountingData": "Datos contables", + "accountingDescription1": "Como no podría ser de otra manera, todos los microdatos", + "accountingDescription2": " relativos a la contabilidad de BD están disponibles en el datalake público.", + "accessButton": "Acceder", + "accumulatedRevenue": "Ingresos acumulados este año", + "accumulatedExpenses": "Gastos acumulados este año", + "fullDashboard": "Ver el panel completo", + "here": "aquí", + "statuteReports": "Estatuto e informes", + "statuteDescription": "En nuestro estatuto se encuentran las directrices que regulan el funcionamiento y el proceso de toma de decisiones de la organización. El documento también incluye los derechos y deberes de los miembros y las competencias de los consejos administrativos y fiscales.", + "reportsDescription": "Nuestros informes presentan todas las actividades realizadas por el equipo. Son diversos proyectos que colaboran con la promoción de la cultura de transparencia, el desarrollo socioeconómico y la construcción de políticas públicas basadas en datos y evidencias.", + "DBStatute": "BD Estatuto Social", + "DBReport2023": "BD Informe Anual 2023", + "DBReport2022": "BD Informe Anual 2022", + "DBReport2021": "BD Informe Anual 2021", + "supportTitle1": "¿Tú también crees en el acceso", + "supportTitle2": " a dados de calidad?", + "supportDescription": "Todo lo que hacemos solo es posible gracias a las personas que apoyan nuestro trabajo. Ayuda a BD a continuar facilitando el acceso a datos públicos. Con cualquier cantidad, contribuyes al mantenimiento de nuestros proyectos y a la supervivencia de la organización.", + "supportButton": "Apoya ahora" +} \ No newline at end of file diff --git a/next/public/locales/es/user.json b/next/public/locales/es/user.json new file mode 100644 index 00000000..5046f978 --- /dev/null +++ b/next/public/locales/es/user.json @@ -0,0 +1,237 @@ +{ + "login": { + "title": "Iniciar sesión", + "emailLabel": "Correo electrónico", + "emailPlaceholder": "Ingrese su correo electrónico", + "emailError": "Por favor, ingrese una dirección de correo electrónico válida.", + "passwordLabel": "Contraseña", + "passwordPlaceholder": "Ingrese su contraseña", + "passwordError": "Por favor, ingrese la contraseña.", + "forgotPassword": "¿Olvidó su contraseña?", + "loginButton": "Entrar", + "noAccount": "¿No tiene una cuenta?", + "signUp": "Regístrese", + "loginError": "Correo electrónico o contraseña incorrectos.", + "serverError": "No se pudo conectar al servidor. Intente nuevamente más tarde." + }, + "signup": { + "title": "Regístrese", + "firstName": "Nombre", + "lastName": "Apellido", + "email": "Correo electrónico", + "username": "Nombre de usuario", + "password": "Contraseña", + "confirmPassword": "Confirme la contraseña", + "register": "Regístrese", + "alreadyHaveAccount": "¿Ya tiene una cuenta?", + "login": "Iniciar sesión", + "termsAgreement": { + "part1": "Al hacer clic en \"Regístrese\" arriba, confirma que ha leído, entendido y aceptado los ", + "termsLink": "Términos de Servicio", + "part2": " y la ", + "privacyLink": "Política de Privacidad", + "part3": " de la Base de los Datos." + }, + "placeholders": { + "firstName": "Ingrese su nombre", + "lastName": "Ingrese su apellido (opcional)", + "email": "Ingrese su correo electrónico", + "username": "Ingrese su nombre de usuario", + "password": "Cree una contraseña", + "confirmPassword": "Ingrese la contraseña nuevamente" + }, + "errors": { + "firstName": "Por favor, ingrese su nombre.", + "username": { + "invalid": "Nombre de usuario inválido o ya existe una cuenta con este nombre de usuario.", + "noSpaces": "El nombre de usuario no puede tener espacios.", + "exists": "Ya existe una cuenta con este nombre de usuario." + }, + "email": { + "invalid": "Dirección de correo electrónico inválida o ya existe una cuenta con este correo electrónico.", + "exists": "Ya existe una cuenta con este correo electrónico." + }, + "password": { + "noSpaces": "Las contraseñas ingresadas no pueden contener espacios.", + "requirements": "Asegúrese de que la contraseña tenga al menos:", + "chars": "8 caracteres", + "uppercase": "Una letra mayúscula", + "lowercase": "Una letra minúscula", + "digit": "Un dígito", + "special": "Un carácter especial, entre ! @ # ? ! % & *" + }, + "confirmPassword": { + "required": "Es necesario confirmar la contraseña.", + "mismatch": "La contraseña ingresada no coincide con la contraseña creada en el campo anterior. Por favor, verifique si no hay errores de escritura e intente nuevamente." + }, + "register": "Error al intentar registrarse, ¡intente nuevamente más tarde!" + } + }, + "username": { + "userSettings": "Configuración del usuario", + "firstName": "Nombre", + "enterFirstName": "Ingrese su nombre", + "lastName": "Apellido", + "enterLastName": "Ingrese su apellido", + "email": "Correo electrónico", + "makeEmailPublic": "Hacer público el correo electrónico", + "url": "URL", + "enterURL": "Ingrese la URL de su sitio web", + "socialMedia": "Redes sociales", + "githubProfileLink": "Enlace del perfil de GitHub", + "twitterProfileLink": "Enlace del perfil de Twitter", + "linkedinProfileLink": "Enlace del perfil de LinkedIn", + "shareInfo": "Esta información se compartirá públicamente. Tenga cuidado con lo que comparte.", + "updateProfile": "Actualizar perfil", + "profilePicture": "Foto de perfil", + "edit": "Editar", + "updatePicture": "Actualizar foto", + "removePicture": "Eliminar foto", + "invalidUsername": "Nombre de usuario inválido", + "noSpacesInUsername": "El nombre de usuario no puede contener espacios", + "invalidOrExistingUsername": "Nombre de usuario inválido o ya existente", + "deleteAccount": "Eliminar cuenta", + "back": "Volver", + "changeEmail": "Cambiar correo electrónico", + "confirmEmail": "Confirme su correo electrónico", + "emailSentTo": "Hemos enviado un correo electrónico a:", + "checkInbox": "Revise su bandeja de entrada y siga las instrucciones enviadas en el correo electrónico para completar el cambio.", + "username": "Nombre de usuario", + "enterUsername": "Ingrese su nombre de usuario", + "currentPassword": "Contraseña actual", + "enterCurrentPassword": "Ingrese su contraseña actual", + "newPassword": "Nueva contraseña", + "enterNewPassword": "Ingrese su nueva contraseña", + "confirmNewPassword": "Confirmar nueva contraseña", + "enterConfirmNewPassword": "Ingrese nuevamente su nueva contraseña", + "forgotPassword": "¿Olvidó su contraseña?", + "createNewPassword": "Cree una nueva contraseña", + "enterPasswordAgain": "Ingrese la contraseña nuevamente", + "passwordRequirements": "La contraseña debe contener:", + "minCharacters": "Al menos 8 caracteres", + "uppercaseLetter": "Una letra mayúscula", + "lowercaseLetter": "Una letra minúscula", + "digit": "Un número", + "specialCharacter": "Un carácter especial (!@#$%^&*)", + "updatePassword": "Actualizar contraseña", + "currentPlan": "Plan actual", + "freePlan": "Plan gratuito", + "subscribe": "Suscribirse", + "startFreeTrial": "Iniciar prueba gratuita", + "cancelPlan": "Cancelar plan", + "planChange": "Cambio de plan", + "planChangeInstructions": "Para cambiar su plan, contáctenos:", + "contactUs": "Contáctenos", + "changeUsername": "Cambiar nombre de usuario", + "newUsername": "Nuevo nombre de usuario", + "confirmDeleteAccount": "¿Está seguro de que desea eliminar su cuenta?", + "deleteAccountWarning": "Esta acción no se puede deshacer. Esto eliminará permanentemente su cuenta y eliminará todos sus datos de nuestros servidores.", + "confirmDeleteInstructions": "Escriba 'eliminar cuenta' para confirmar", + "cancel": "Cancelar", + "exploreResources": "Explorar recursos", + "payment": "Pago", + "changePlan": "Cambiar plan", + "annualDiscount": "Descuento anual", + "save20": "Ahorre 20%", + "discountCoupon": "Cupón de descuento", + "enterCoupon": "Ingrese el cupón", + "apply": "Aplicar", + "invalidCoupon": "Cupón inválido", + "trialPeriod": "Tendrá 7 días de prueba gratuita antes de que se le cobre.", + "subtotal": "Subtotal", + "couponEffect": "A partir del {{couponDuration}}º {{planInterval}}{{trialDay}}, se le cobrará {{totalAmount}}/{{planInterval2}}.", + "andTrialDay": " y después del período de prueba,", + "paymentDetails": "Detalles del pago", + "congratulations": "¡Felicidades!", + "paymentSuccessful": "Su pago se ha procesado con éxito. Recibirá un correo electrónico con los detalles de su compra.", + "continueSettings": "Continuar en la configuración", + "goToHomepage": "Ir a la página de inicio", + "paymentFailed": "Fallo en el pago", + "paymentError": "Ocurrió un error al procesar su pago. Por favor, intente nuevamente o contacte al soporte:", + "understood": "Entendido", + "comparePlans": "Comparar planes", + "resources": "Recursos", + "processedTables": "Tablas procesadas", + "integratedData": "Datos integrados", + "integratedDataTooltip": "Nuestra metodología de estandarización y compatibilización de datos le permite cruzar tablas de diferentes instituciones y temas de manera simplificada.", + "updatedLowFrequencyData": "Datos de baja frecuencia actualizados", + "cloudAccess": "Acceso en la nube", + "sqlPythonRAccess": "Acceso vía SQL, Python y R", + "biIntegration": "Integración con herramientas BI", + "downloadLimit": "Descarga directa hasta 100 MB", + "downloadLimitTooltip": "Este límite no se aplica al acceso vía SQL, Python y R.", + "proPlan": "BD Pro", + "allFreePlanResources": "Todos los recursos del plan gratuito, más:", + "highFrequencyTables": "Decenas de bases de alta frecuencia actualizadas", + "companyReferenceTable": "Tabla de referencia de empresas con información actualizada", + "downloadLimitPro": "Descarga directa hasta 1 GB", + "downloadLimitProTooltip": "Las tablas mayores de 1 GB no están disponibles para descarga parcial o completa. Este límite no se aplica al acceso vía SQL, Python y R.", + "passwordChangedSuccessfully": "¡Contraseña cambiada con éxito!", + "useNewPassword": "Use su nueva contraseña para iniciar sesión la próxima vez.", + "settings": "Configuración", + "publicProfile": "Perfil público", + "account": "Cuenta", + "changePassword": "Contraseña", + "plansAndPayment": "Planes y pago", + "accessFor10Accounts": "Acceso para 10 usuarios", + "prioritySupport": "Soporte prioritario por correo electrónico y Discord", + "viewAllAndComparePlans": "Ver todo y comparar planes", + "confirmEmailAddress": "Confirme su dirección de correo electrónico", + "checkInboxAndFollowInstructions": "Revise su bandeja de entrada y siga las instrucciones enviadas en el correo electrónico para completar el cambio.", + "enterNewEmail": "Ingrese su nueva dirección de correo electrónico", + "newEmail": "Nuevo correo electrónico", + "enterEmail": "Ingrese su correo electrónico", + "sendEmail": "Enviar correo electrónico", + "updateUsername": "Actualizar nombre de usuario", + "exportAccountData": "Exportar datos de la cuenta", + "dataStorageInfo": "Conozca cómo se almacenan sus datos en nuestros Términos de Uso y Políticas de Privacidad. Para exportar los datos de su cuenta, contáctenos.", + "exportDataInstructions": "Para exportar sus datos, contáctenos:", + "deleteMyAccount": "Eliminar mi cuenta", + "accountAccessWarning": "Al eliminar su cuenta, perderá acceso a todos sus datos e información.", + "usernameAlreadyExists": "El nombre de usuario ya existe" + }, + "activate": { + "accountActive": "Cuenta activa", + "congratulations": "¡Felicidades! Su cuenta ha sido activada con éxito. Ahora forma parte de nuestra comunidad.", + "thankYou": "Gracias por unirse a nosotros. Estamos aquí para ayudarle en lo que necesite.", + "welcome": "¡Bienvenido/a!", + "loginToAccount": "Iniciar sesión en la cuenta", + "somethingWentWrong": "Algo salió mal", + "activationProblem": "Lamentamos informarle que ocurrió un problema durante la activación de su cuenta. Pedimos disculpas por las molestias.", + "contactUs": "Contactar" + }, + "checkEmail": { + "confirmEmail": "Confirme su dirección de correo electrónico", + "sentConfirmation": "Hemos enviado una confirmación por correo electrónico a", + "checkInbox": "Revise su bandeja de entrada y siga las instrucciones enviadas en el correo electrónico para completar el registro.", + "resendEmail": "Reenviar correo electrónico", + "waitSeconds": "Espere {{count}} segundos..." + }, + "passwordRecovery": { + "title": "Restablezca su contraseña", + "titleConfirmed": "Restablezca su nueva contraseña", + "description": "Ingrese la dirección de correo electrónico que utilizó para registrar su cuenta. Le enviaremos las instrucciones para restablecer su contraseña.", + "emailLabel": "Correo electrónico", + "emailPlaceholder": "Ingrese su correo electrónico", + "invalidEmail": "Dirección de correo electrónico inválida.", + "sendResetEmail": "Enviar correo electrónico de restablecimiento", + "waitSeconds": "Espere {{count}} segundos...", + "needHelp": "Si aún necesita ayuda,", + "contactUs": "contáctenos", + "newPasswordLabel": "Nueva Contraseña", + "newPasswordPlaceholder": "Cree una nueva contraseña", + "confirmPasswordLabel": "Confirme la nueva contraseña", + "confirmPasswordPlaceholder": "Ingrese la contraseña nuevamente", + "updatePassword": "Actualizar contraseña", + "passwordRequirements": "Asegúrese de que la contraseña tenga al menos:", + "passwordRequirementChars": "8 caracteres", + "passwordRequirementUppercase": "Una letra mayúscula", + "passwordRequirementLowercase": "Una letra minúscula", + "passwordRequirementDigit": "Un dígito", + "passwordRequirementSpecial": "Un carácter especial, entre ! @ # ? ! % & *", + "confirmPasswordRequired": "Es necesario confirmar la contraseña", + "passwordNoSpaces": "Las contraseñas ingresadas no pueden contener espacios.", + "passwordMismatch": "La contraseña ingresada no coincide con la contraseña creada en el campo anterior. Por favor, verifique si no hay errores de escritura e intente nuevamente.", + "passwordRequired": "Por favor, ingrese la contraseña." + } +} \ No newline at end of file diff --git a/next/public/locales/pt/aboutUs.json b/next/public/locales/pt/aboutUs.json new file mode 100644 index 00000000..495f1d05 --- /dev/null +++ b/next/public/locales/pt/aboutUs.json @@ -0,0 +1,73 @@ +{ + "pageTitle": "Quem Somos – Base dos Dados", + "pageDescription": "Conheça a Base dos Dados. Nós facilitamos o acesso a dados para que a distância entre você e sua análise seja apenas uma boa pergunta. Saiba mais sobre a história da organização e sobre a equipe por trás do nosso trabalho.", + "heroTitle1": "Facilitamos o acesso a dados", + "heroTitle2": "para que a distância entre você e sua análise", + "heroTitle3": "seja", + "heroTitle4": "apenas uma boa pergunta", + "usersCount": "+114 mil", + "usersText": "usuários na plataforma", + "queriesCount": "+1,3 milhão", + "queriesText": "consultas aos dados", + "aboutTitle": "A Base dos Dados", + "aboutText1": "Somos uma organização não-governamental sem fins lucrativos e open-source que atua para universalizar o acesso a dados de qualidade. Fazemos isso através da criação de ferramentas inovadoras, da produção e difusão do conhecimento e da promoção de uma cultura de transparência e dados abertos.", + "aboutText2": "Ao quebrar barreiras técnicas para quem já faz e quem quer começar a fazer análise de dados, reunimos uma rede altamente engajada que potencializa o impacto do nosso trabalho. Estamos construindo uma comunidade de pessoas que acreditam no uso inteligente de dados como instrumento para o desenvolvimento socioeconômico e que encontram na BD uma grande aliada.", + "aboutText3": "O que queremos é aproximar diferentes setores da sociedade de informações que são de interesse coletivo, mas ainda pouco acessíveis para a maioria das pessoas. Acreditamos que ampliar o acesso e uso de dados abertos favorece o aumento da participação social, a melhoria da gestão pública e o aperfeiçoamento da democracia.", + "recognitionTitle": "Reconhecimentos", + "googleCloudAwardTitle": "Google Cloud Customer Award", + "googleCloudAwardText": "O prêmio reconheceu as implementações mais inovadoras e transformadoras do Google Cloud ao redor do mundo. Fomos a única organização brasileira a receber a premiação na categoria de Impacto Social, que também selecionou outras iniciativas que usam tecnologia para promover mais abertura e transparência.", + "googleCloudAwardLink": "Veja mais detalhes", + "treasuryAwardTitle": "XXVI Prêmio Tesouro Nacional 2021", + "treasuryAwardText": "Conquistamos o 1º lugar na categoria Soluções do prêmio, que tem como objetivo reconhecer o desenvolvimento de aplicações em ciências de dados e inteligência artificial aplicadas a finanças públicas. Fomos selecionados por conta de nosso trabalho compatibilizando informações de despesas e receitas orçamentárias do Setor Público Brasileiro.", + "treasuryAwardLink": "Veja mais detalhes", + "historyTitle": "Nossa história", + "historySubtitle": "Alguns dos marcos que definiram nossa trajetória até aqui", + "historyBox1Title": "Um grande catálogo", + "historyBox1Date": "OUT DE 2019", + "historyBox1Text": "Nosso co-fundador, Ricardo Dahis, enxergou a necessidade de uma plataforma com capacidade de busca e filtragem de diferentes conjuntos de dados e iniciou esse trabalho lançando o mecanismo de busca da BD.", + "historyBox2Title": "O e-mail", + "historyBox2Date": "SET DE 2020", + "historyBox2Text": "Foi já no primeiro contato de João Carabetta, também co-fundador da BD, com Ricardo Dahis que veio a ambiciosa proposta: estruturar um grande datalake público pelo BigQuery e usar o mecanismo de busca para catalogação das bases e de seus metadados.", + "historyBox3Title": "A happy sunday", + "historyBox3Date": "SET DE 2020", + "historyBox3Text": "Nos últimos três minutos de um domingo de setembro, o GitHub testemunhou o commit que mudaria para sempre a vida de quem trabalha com dados públicos. Criamos a estrutura do nosso datalake, uma ferramenta que faria a alegria de muita gente que já passou tantos domingos limpando bases.", + "historyBox4Title": "Nem só de boa vontade...", + "historyBox4Date": "SET DE 2020", + "historyBox4Text": "Começamos a receber apoio financeiro de pessoas que acreditam na importância do nosso trabalho. Isso foi fundamental para escalar nossas atividades, afinal, nem só de esforço e boa vontade se faz um bom projeto.", + "historyBox5Title": "Funcionário do mês", + "historyBox5Date": "NOV DE 2020", + "historyBox5Text": "Abrimos a primeira vaga de Assistente de Dados e contratamos a primeira pessoa remunerada para integrar nossa equipe. Aos poucos, esse time foi crescendo e hoje não é mais tão fácil assim ser funcionário(a) do mês.", + "historyBox6Title": "A primeira de muitas", + "historyBox6Date": "JAN DE 2021", + "historyBox6Text": "A RAIS foi nossa primeira grande base tratada e disponibilizada no datalake público. Subimos seus assombrosos 260 GB de microdados completos, com informações de 1985 até 2019, possibilitando agregações por município e UF.", + "historyBox7Title": "Real oficial", + "historyBox7Date": "JUN DE 2021", + "historyBox7Text": "Nos tornamos oficialmente o Instituto Base dos Dados, uma organização sem fins lucrativos, com equipe formal, CNPJ e tudo que tem direito. Um passo importante para consolidar nosso trabalho.", + "historyBox8Title": "De cara nova", + "historyBox8Date": "SET DE 2021", + "historyBox8Text": "Desenvolver o novo site foi um dos maiores e desafiadores projetos que assumimos. Apesar dos momentos de caos e peças mirabolantes, aos poucos tudo foi se encaixando e tomando a forma de uma plataforma com a nossa cara. Assim, nasceu a primeira versão do novo site da BD, com interface mais intuitiva, design moderno e uma estrutura que facilita ainda mais a experiência dos usuários.", + "historyBox9Title": "Um prêmio de peso", + "historyBox9Date": "OUT DE 2021", + "historyBox9Text": "Precisamos de muitas mãos para carregar essa conquista. Recebemos o Google Cloud Customer Award na categoria de Impacto Social. O prêmio inédito foi anunciado no evento internacional, Google Cloud Next'21, e tem como objetivo reconhecer as implementações mais inovadoras e transformadoras do Google Cloud ao redor do mundo.", + "historyBox10Title": "Chegamos primeiro no tesouro", + "historyBox10Date": "NOV DE 2021", + "historyBox10Text": "Conquistamos o 1º lugar na categoria Soluções do XXVI Prêmio Tesouro Nacional 2021. O prêmio tem como objetivo expandir as fronteiras do conhecimento em finanças públicas, promovendo a normalização de temas específicos quando tratados consistentemente pela pesquisa científica.", + "historyBox11Title": "Conquistando o mundo", + "historyBox11Date": "Muito em breve", + "historyBox11Text": "A necessidade de ter um repositório que centralize importantes bases de dados já tratadas e padronizadas não é exclusiva do Brasil. Imagina ter um datalake aberto que permite o acesso e cruzamento de dados de diversos países diferentes? Esse é o futuro da BD.", + "teamTitle": "Uma equipe colaborativa", + "teamCategories": [ + "Co-fundadores", + "Associados", + "Administrativo", + "Captação, Parcerias e Projetos", + "Comunicação", + "Dados", + "Plataforma", + "BD Edu", + "Conselho Fiscal" + ], + "joinUsTitle": "Venha colaborar com a transparência", + "joinUsText": "Faça parte de uma organização que está mudando a maneira de acessar dados. Reunimos pessoas de várias partes do Brasil, empenhadas em contribuir e trabalhar por mais transparência pública.", + "joinUsButton": "Veja as vagas abertas" + } \ No newline at end of file diff --git a/next/public/locales/pt/caseStudies.json b/next/public/locales/pt/caseStudies.json new file mode 100644 index 00000000..85a7fa17 --- /dev/null +++ b/next/public/locales/pt/caseStudies.json @@ -0,0 +1,6 @@ +{ + "pageTitle": "{{title}} – Base dos Dados", + "backLink": "<< Voltar", + "contactText": "Queremos ajudar você.", + "contactButton": "Entre em contato" +} \ No newline at end of file diff --git a/next/public/locales/pt/common.json b/next/public/locales/pt/common.json new file mode 100644 index 00000000..a3242021 --- /dev/null +++ b/next/public/locales/pt/common.json @@ -0,0 +1,136 @@ +{ + "search_placeholder": "Encontre os dados que você precisa", + "search_placeholder_mobile": "Encontre os dados", + "popular_terms": "Termos populares:", + "search_by_theme": "Busque por tema", + "noDatasetsFound": ["Nenhum conjunto com todos os temas selecionados foi encontrado.","Tente desmarcar algum dos temas."], + "min": "Mín", + "max": "Máx", + "search": "Buscar", + "products": { + "facilitation_text": "Facilitamos o trabalho para que a distância", + "analysis_distance": "entre você e sua análise seja ", + "good_question": "apenas uma boa pergunta", + "filters": "FILTROS", + "search_as_you_want": "Busque dados como quiser", + "search_description": "São vários filtros para ajudar você a encontrar os dados que necessita. Ao navegar entre centenas de conjuntos de dados disponíveis na plataforma, você pode refinar sua busca por tema, organização, cobertura temporal, nível da observação e mais.", + "start_search": "Comece sua pesquisa", + "processed_tables": "TABELAS TRATADAS", + "access_quality_data": "Acesse dados de qualidade", + "processed_tables_description": "Com as tabelas tratadas do nosso datalake público, você não precisa mais gastar horas limpando bases. Nossa metodologia de padronização permite cruzar facilmente dados de diferentes organizações. Assim, você pode focar no que realmente importa.", + "view_available_data": "Veja os dados disponíveis", + "packages": "PACOTES", + "explore_in_your_favorite_language": "Explore na sua linguagem favorita", + "packages_description": "Desenvolvemos pacotes para acesso aos dados tratados em Python, R e linha de comando. Além disso, você pode consultar e filtrar dados usando SQL no editor do nosso datalake público no Google BigQuery.", + "learn_how_to_access": "Saiba como acessar" + }, + "support": { + "existence_through_effort": "Existimos através do esforço de pessoas que", + "those_who_believe_in_quality_open_data": "acreditam no acesso a dados abertos de qualidade.", + "support_us_too": "Apoie a Base dos Dados você também", + "enthusiast": "Entusiasta", + "tight_pocket": "Bolso apertado? Apenas R$0,50 por", + "enthusiast_description": "dia para nos ajudar a manter a iniciativa.", + "month": "mês", + "databaser": "Databaser", + "donate_1_real_per_day": "Doe R$ 1 real por dia", + "to_make_databasers_happy": "para fazer databasers felizes.", + "master_of_data": "Mestre dos dados", + "master_of_data_description": "Menos de R$2 reais por dia para pouparmos ainda mais seu trabalho.", + "donate_any_amount_via_pix": "Doe qualquer valor via PIX", + "company_name": "Razão Social", + "cnpj": "CNPJ", + "bank": "Banco", + "agency": "Agência", + "account": "Conta", + "pix_key_copied": "Copiada chave PIX", + "copy_pix_key": "Copiar chave PIX", + "follow_the_steps": "Siga o passo a passo", + "step_1": "Abra o app do seu banco;", + "step_2": "Escolha a opção de pagamento com PIX;", + "step_3": "Escaneie o QR Code ou digite a chave ao lado;", + "step_4": "Faça sua doação!", + "want_to_institutionally_support_bd": "Gostaria de apoiar a BD institucionalmente? ", + "contact_us": "Entre em contato conosco." + }, + "edu": { + "learn_from_the_reference": "Venha aprender com quem é referência", + "in_making_public_data_available": "em disponibilizar dados públicos no Brasil", + "with_our_course_you_can_go_further": "Com nosso curso você pode ir mais longe na sua pesquisa, profissão, ou organização.", + "take_advantage_of_the_promotional_price": "Aproveite o preço promocional" + }, + "tooltip": { + "helpAndResources": "Ajuda e recursos", + "faq": "Perguntas frequentes", + "documentation": "Documentação", + "youtubeVideos": "Vídeos no YouTube", + "installPackages": "Instale os nossos pacotes", + "howToCite": "Como citar a BD?", + "whatAreDirectories": "O que são diretórios?", + "discordCommunity": "Fale com nossa comunidade no Discord", + "contactUs": "Entre em contato" + }, + "footer": { + "title": "Base dos Dados", + "copyright": "® {{year}} Base dos Dados", + "termsOfUse": "Termos de uso", + "privacyPolicy": "Política de privacidade", + "contact": "Contato", + "faq": "FAQ", + "newsletter": "Newsletter", + "careers": "Carreiras", + "supportProject": "Apoie o projeto", + "products": { + "title": "PRODUTOS", + "searchEngine": "Mecanismo de busca", + "publicDatalake": "Datalake público", + "dataPackages": "Pacotes", + "bdPro": "BD Pro", + "bdEdu": "BD Edu" + }, + "services": { + "title": "SERVIÇOS", + "dataCapture": "Captura de dados", + "dataAnalytics": "Análise de dados", + "dataConsulting": "Consultoria de dados", + "caseStudies": "Estudos de caso" + }, + "tutorials": { + "title": "TUTORIAIS", + "documentation": "Documentação", + "blog": "Blog", + "youtubeVideos": "Vídeos" + }, + "institutional": { + "title": "INSTITUCIONAL", + "aboutUs": "Quem somos", + "transparency": "Transparência", + "newsletter": "Newsletter", + "careers": "Carreiras", + "faq": "Perguntas frequentes", + "termsAndPrivacy": "Termos e Privacidade", + "contact": "Contato", + "supportProject": "Apoie o projeto" + } + }, + "partners": { + "partnershipsWith": "Parcerias com", + "testimonials": { + "fernando": { + "name": "Fernando Barbalho", + "position": "Cientista de Dados do Tesouro Nacional", + "quote": "O siconfiBD é um pacote que traz de forma rápida e programática os dados da Secretaria do Tesouro Nacional. O código é construído de forma open-source pela equipe do Tesouro e utiliza as tabelas tratadas BD+ para compor funções em R. Qual a despesa de pessoal dos 100 municípios brasileiros mais populosos? Essas e mais de outras 18 perguntas podem ser consultadas diretamente pelo pacote, sem necessidade de SQL." + }, + "marina": { + "name": "Marina Barros", + "position": "Diretora-Executiva do Instituto Alziras", + "quote": "Com o apoio da Base dos Dados realizamos o levantamento das desigualdades de gênero e raça nas eleições 2016-2020 e das distorções de financiamento de campanhas de prefeitas e vereadoras nas últimas eleições, o que resultará no lançamento de uma publicação inédita." + }, + "amanda": { + "name": "Amanda de Albuquerque e Mariana Carvalho", + "position": "Co-fundadoras dA Ponte", + "quote": "Criamos um importante produto nosso, a Fotografia do Município, em parceria com a BD. A Fotografia agrega diversos indicadores socioeconômicos dos municípios brasileiros. A Ponte fez o planejamento e desenho do relatório, enquanto a BD cuidou da parte técnica de visualização e gestão de dados. A parceria foi o que nos permitiu avançar rápido no desenvolvimento da ferramenta, e garantiu a qualidade de dados alta como queríamos desde o início." + } + } + } +} \ No newline at end of file diff --git a/next/public/locales/pt/contact.json b/next/public/locales/pt/contact.json new file mode 100644 index 00000000..980a73dc --- /dev/null +++ b/next/public/locales/pt/contact.json @@ -0,0 +1,22 @@ +{ + "pageTitle": "Contato – Base dos Dados", + "pageDescription": "Entre em contato com nossa equipe.", + "contactTitle": "Entre em contato", + "contactDescription": "Envie sua mensagem no formulário ao lado para falar com nossa equipe.", + "institutionalSupportTitle": "Apoio institucional", + "institutionalSupportDescription": "A Base dos Dados é mantida por meio doações de pessoas que acreditam na transparência e acesso a dados de qualidade. Colabore para o crescimento e fortalecimento da iniciativa.", + "servicesTitle": "Serviços", + "servicesDescription": "Fale diretamente com nossa equipe comercial para marcarmos uma conversa e avaliarmos como nossos ", + "servicesLink": "serviços", + "servicesLinkText": "podem ajudar.", + "projectsPartnershipsTitle": "Projetos e Parcerias", + "projectsPartnershipsDescription": "Desenvolvemos projetos e aplicações com outras organizações afins para promover o acesso a dados públicos de qualidade. Estamos sempre abertos a novas ideias.", + "dataTitle": "Dados", + "dataDescription": "Auxiliamos pessoas e organizações a subirem dados no nosso datalake. Escreva sua proposta para nossa equipe de Dados.", + "questionsText": "Dúvidas? Fale com a nossa comunidade no ", + "discordLink": "Discord", + "consulting": { + "title": "Consultoria – Base dos Dados", + "description": "Entre em contato com nossa equipe." + } +} \ No newline at end of file diff --git a/next/public/locales/pt/dataset.json b/next/public/locales/pt/dataset.json new file mode 100644 index 00000000..d31edec5 --- /dev/null +++ b/next/public/locales/pt/dataset.json @@ -0,0 +1,215 @@ +{ + "dataBasis": "Base dos Dados", + "noName": "Conjunto sem nome", + "noDescription": "Sem descrição", + "notProvided": "Não informado", + "temporalCoverage": "Cobertura temporal", + "noCoverage": "Sem cobertura temporal", + "organization": "Organização", + "noOrganization": "Sem organização", + "none": "Nenhum", + "dataAlt": "dados", + "data": "Dados", + "crossingAlt": "cruzamento", + "crossing": "Cruzamento", + "suggestData": "Fazer uma proposta", + "viewDataRoadmap": "Ver roadmap de dados", + "pageTitle": "Dados – Base dos Dados", + "filter": "Filtrar", + "datasetsWith": "Conjuntos com", + "tables": "Tabelas tratadas", + "rawDataSources": "Fontes originais", + "informationRequests": "Pedidos LAI", + "resources": "Recursos", + "openData": "Grátis", + "closedData": "Pagos", + "theme": "Tema", + "tag": "Etiqueta", + "observationLevel": "Nível da observação", + "datasetsFound": "{{count}} conjunto encontrado", + "datasetsFound_plural": "{{count}} conjuntos encontrados", + "for": "para", + "findingDatasets": "encontrando conjuntos", + "findingDatasets_plural": "encontrando {{count}} conjuntos", + "forQuery": "para \"{{query}}\"", + "forQuery_plural": "para \"{{query}}\"", + "noDatasetsFound": "Não encontramos nenhum conjunto para sua busca.", + "ooops": "Ooops...", + "unfortunatelyNoDatasetsFound": "Infelizmente não encontramos nenhum conjunto para sua busca.", + "tryRelatedTerms": "Tente pesquisar por termos relacionados ou proponha novos dados para adicionarmos na BD.", + "stillNotFound": "Ainda não encontrou o que está procurando?", + "suggestNewData": "Proponha novos dados", + "clearFilters": "Limpar filtros", + "previous": "Anterior", + "next": "Próxima", + "datasetCard": { + "table": "tabela tratada", + "tables": "tabelas tratadas", + "oneTable": "1 tabela tratada", + "multipleTables": "{{count}} tabelas tratadas", + "rawDataSource": "fonte original", + "rawDataSources": "fontes originais", + "informationRequest": "pedido LAI", + "informationRequests": "pedidos LAI", + "oneInformationRequest": "1 pedido LAI", + "multipleInformationRequests": "{{count}} pedidos LAI", + "noInformationRequests": "0 pedidos LAI", + "oneRawDataSource": "1 fonte original", + "multipleRawDataSources": "{{count}} fontes originais", + "noRawDataSources": "0 fontes originais", + "and": "e" + }, + "table": { + "notProvided": "Não informado", + "temporalCoverage": "Cobertura temporal", + "dataAccess": "Acesso aos dados", + "dataUpdateFrequency": "Frequência de atualização dos dados", + "lastUpdateBD": "Última atualização na Base de Dados", + "noUpdateScheduled": "Nenhuma atualização agendada", + "lastUpdateRawDataSource": "Última atualização na fonte de dados brutos", + "lastCheckRawDataSource": "Última verificação da fonte original", + "bigQueryID": "ID do BigQuery", + "partitionsInBigQuery": "Partições no BigQuery", + "partitionsTooltip": "Partições são divisões feitas em uma tabela para facilitar o gerenciamento e a consulta de dados. Ao segmentar uma tabela grande em partições menores, a quantidade de bytes lidos é reduzida, o que ajuda a controlar custos e melhora o desempenho das consultas.", + "observationLevel": "Nível de observação", + "observationLevelTooltip": "Indica a menor granularidade possível de análise com esses dados. Por exemplo, uma tabela com nível de observação estadual nos permite realizar uma análise em nível nacional (por ser mais amplo que o estado), mas não uma análise por município (que seria um detalhamento mais específico).", + "downloadFiles": "Baixar arquivos", + "rawDataSources": "Fontes de dados brutos", + "rawDataSourcesTooltip": "Links para páginas com informações úteis sobre o conjunto de dados. Sempre tentamos fornecer o caminho mais próximo da fonte para baixar os dados originais.", + "auxiliaryFiles": "Arquivos auxiliares", + "auxiliaryFilesTooltip": "Arquivos auxiliares fornecem mais contexto e ajudam a entender melhor os dados. Podem incluir notas técnicas, descrições de coleta e amostragem, etc.", + "additionalInformation": "Informações adicionais", + "publishedBy": "Publicado por", + "dataCleanedBy": "Dados limpos por", + "version": "Versão", + "updateEvery": "Atualização a cada", + "updatePerSecond": "Atualização por segundo", + "updatePerMinute": "Atualização por minuto", + "updatePerHour": "Atualização por hora", + "dailyUpdate": "Atualização diária", + "weeklyUpdate": "Atualização semanal", + "monthlyUpdate": "Atualização mensal", + "bimonthlyUpdate": "Atualização bimestral", + "quarterlyUpdate": "Atualização trimestral", + "semiannualUpdate": "Atualização semestral", + "annualUpdate": "Atualização anual", + "days": "dias", + "weeks": "semanas", + "months": "meses", + "bimonths": "bimestres", + "quarters": "trimestres", + "semesters": "semestres", + "years": "anos", + "updateNotDefined": "Atualização não definida", + "selectColumns": "Selecione as colunas que você deseja acessar:", + "checkColumns": "Confira as colunas da tabela:", + "translateInstitutionalCodes": "Traduzir códigos institucionais", + "translateTooltip": "Por exemplo, traduzir o código \"2927408\" por \"Salvador-BA\"", + "generateQuery": "Gerar consulta", + "downloadTable": "Download da tabela", + "bigQueryInstructions": "No editor de consultas do BigQuery, digite a seguinte instrução:", + "firstTimeBigQuery": "Primeira vez usando o BigQuery?", + "followStepByStep": "Siga o passo a passo.", + "accessBigQuery": "Acessar o BigQuery", + "pythonInstructions": "No terminal do Python, digite a seguinte instrução:", + "firstTimePython": "Primeira vez usando o pacote Python?", + "rInstructions": "No terminal do R, digite a seguinte instrução:", + "firstTimeR": "Primeira vez usando o pacote R?", + "compareThePlans": "Compare os planos", + "warningLargeTable": ["Essa tabela completa, com todas as colunas, tem ",". Cuidado para não ultrapassar o ", "limite de processamento gratuito", "do BigQuery."], + "warningLargeTableOptimize": "Para otimizar a consulta, você pode selecionar menos colunas ou adicionar filtros no BigQuery.", + "errorInsufficientChecks": "Por favor, selecione acima as colunas que você deseja acessar.", + "infoTranslationNotAvailable": ["Essa tabela possui códigos institucionais que variam entre anos. Por isso, ainda estamos trabalhando para automatizar o processo de tradução. Por enquanto, recomendamos acessar o ", "dicionário", "e os", "diretórios", "para entender como traduzir os códigos presentes na tabela."], + "infoDataAvailability": ["Estes dados estão disponíveis porque diversas pessoas colaboram para a sua manutenção. Antes de baixar os dados, apoie você também com uma doação financeira ou ", "saiba como contribuir com seu tempo"], + "warningPaidPlanRequired": ["O download de tabelas com tamanho entre 100 MB e 1 GB está disponível apenas para ", "assinantes dos nossos planos pagos", ". No entanto, você pode acessar a tabela gratuitamente utilizando SQL, Python ou R. Considere atualizar para um plano pago para fazer o download."], + "errorTableTooLarge": "O tamanho da tabela ultrapassou o limite permitido para download, de 1 GB. Você pode acessar os dados em SQL, Python ou R.", + "bigQueryAndPackages": "BigQuery e Pacotes", + "download": "Baixar" + }, + "temporalCoverageBar": { + "title": "Cobertura temporal", + "notProvided": "Não informado", + "noCoverage": "Sem cobertura temporal", + "free": "GRÁTIS", + "paid": "PAGO", + "accessGranted": "Acesso liberado para o período", + "upgradeRequired": "Assine um plano para liberar o período", + "comparePlans": "Compare os planos" + }, + "column": { + "search": "Pesquisar colunas", + "name": "Nome", + "nameTooltip": "Nome da coluna.", + "translationTable": "Tabela de tradução", + "translationTableTooltip": "Para traduzir os códigos institucionais da tabela você precisa utilizar as tabelas de dicionário e diretórios, dependendo de qual coluna você quiser usar.", + "needsTranslation": "Precisa de tradução", + "needsTranslationTooltip": "A coluna possui códigos institucionais a serem traduzidos.", + "description": "Descrição", + "descriptionTooltip": "Descrição dos dados da coluna.", + "bigQueryType": "Tipo No BigQuery", + "bigQueryTypeTooltip": "Tipo de dado no BigQuery — categorias: INTEGER (Inteiro), STRING (Texto), DATE (Data), FLOAT64 (Decimal), GEOGRAPHY (Geográfico).", + "temporalCoverage": "Cobertura Temporal", + "temporalCoverageTooltip": "Data inicial e final de cobertura dos dados. Pode variar entre colunas, de acordo com a disponibilidade nos dados originais.", + "measurementUnit": "Unidade De Medida", + "measurementUnitTooltip": "Unidade de medida da coluna — ex: km, m2, kg.", + "sensitiveData": "Contém Dados Sensíveis (LGPD)", + "sensitiveDataTooltip": "Indica se a coluna possui dados sensíveis — ex: CPF identificado, dados de conta bancária, etc.", + "observations": "Observações", + "observationsTooltip": "Descreve processos de tratamentos realizados na coluna que precisam ser evidenciados.", + "downloadTranslationTable": "Baixar tabela que faz a tradução desta coluna", + "accessTranslationTable": "Acessar tabela que faz a tradução desta coluna", + "dictionary": "Dicionário", + "noTranslationNeeded": "Não precisa de tradução", + "notProvided": "Não informado", + "yes": "Sim", + "no": "Não" + }, + "observationLevelTable": { + "entityHeader": "Entidade", + "columnsHeader": "Colunas Correspondentes", + "notProvided": "Não informado" + }, + "rawDataSource": { + "name": "Nome", + "description": "Descrição", + "url": "URL", + "additionalInfo": "Informações adicionais", + "yes": "Sim", + "no": "Não", + "lastUpdateDate": "Data da última atualização", + "lastCheckDate": "Data da última verificação", + "updateFrequency": "Frequência de atualização", + "coverageStart": "Início da cobertura", + "coverageEnd": "Fim da cobertura", + "observationLevel": "Nível de observação", + "observationLevelTooltip": "Indica a menor granularidade possível de análise com esses dados. Por exemplo, uma tabela com nível de observação estadual nos permite realizar uma análise em nível nacional (por ser mais amplo que o estado), mas não uma análise por município (que seria um detalhamento mais específico).", + "format": "Formato", + "treatment": "Tratamento", + "language": "Língua", + "availability": "Disponibilidade", + "hasStructuredData": "Possui dados estruturados", + "hasAPI": "Tem API", + "requiresIPFromCountry": "Requer IP de algum país", + "requiresRegistration": "Requer registro", + "isFree": "Gratuito", + "rawDataDisclaimer": "Estes dados não passaram pela metodologia de tratamento da Base dos Dados.", + "accessOriginalSource": "Acessar fonte original", + "license": "Licença", + "dataAccessLink": "Link de acesso aos dados", + "dataAccessInstructions": "Instruções de acesso aos dados", + "auxiliaryFiles": "Arquivos auxiliares", + "auxiliaryFilesDescription": "Descrição dos arquivos auxiliares", + "version": "Versão", + "versionDescription": "Descrição da versão" + }, + "informationRequest": { + "requestNumber": "Número do pedido: {{number}}", + "disclaimer": "Estes dados não passaram pela metodologia de tratamento da Base dos Dados.", + "accessData": "Acessar dados", + "accessRequest": "Acessar pedido", + "description": "Descrição", + "notProvided": "Não informado", + "additionalInformation": "Informações adicionais", + "status": "Status" + } +} \ No newline at end of file diff --git a/next/public/locales/pt/faq.json b/next/public/locales/pt/faq.json new file mode 100644 index 00000000..e80f4c8e --- /dev/null +++ b/next/public/locales/pt/faq.json @@ -0,0 +1,292 @@ +{ + "questions": [ + { + "question": "Os dados da BD são públicos ou privados?", + "answer": "

Em sua grande maioria, as bases de dados encontradas em nossa plataforma são públicas. Porém, também estão listadas algumas bases privadas. Nossa organização não possui fins lucrativos, portanto, não comercializamos a listagem de bases em nossa plataforma. Acreditamos ser útil listar conjuntos de dados privados, uma vez que as pessoas podem ter interesse em adquirí-las ao encontrá-las em nosso site.

", + "categories": ["Dados"], + "keywords": "público, privado", + "id": "public-or-private" + }, + { + "question": "Preciso pagar para acessar os dados da BD?", + "answer": "

O acesso à maioria dos dados oferecidos pela BD é grátis. Só em dois casos pode ser necessário pagamento. São esses:

1. Alguns dados fazem parte dos nossos planos avançados, Pro e Empresas, como indicado nas páginas das tabelas. Nesse caso é necessário uma assinatura para acessar os dados.

2. Uma forma de acessar nossos dados é através do BigQuery, no Google Cloud, que oferece até 1 Terabyte gratuito por mês para seus usuários. Ressaltamos que esse limite costuma ser o suficiente, mesmo para análises com bases mais robustas, como a RAIS ou Censo Escolar. Caso você ultrapasse esse limite, o BigQuery cobra 5 dólares por terabyte de dados que sua consulta irá processar.

", + "categories": ["Dados"], + "keywords": "pagar, custo, gratuito, grátis, mensalidade", + "id": "do-i-have-to-pay" + }, + { + "question": "É possível fazer o download dos dados da BD?", + "answer": "

Sim, você pode baixar o arquivo CSV completo das tabelas tratadas direto na plataforma. No entanto, tabelas com mais de 200.000 linhas só podem ser acessados através do nosso data lake no BigQuery ou dos nossos pacotes em Python e R.

", + "categories": ["Dados"], + "keywords": "download, baixar, CSV, arquivo", + "id": "download" + }, + { + "question": "Qual é o limite de download dos dados da BD na plataforma?", + "answer": "

O limite para download dos dados na nossa plataforma é de 200.000 linhas. Para acessar tabelas que ultrapassam esse limite, utilize nosso datalake no BigQuery ou nossos pacotes em Python e R.

", + "categories": ["Dados"], + "keywords": "limite, download, baixar, tamanho, máximo, arquivo", + "id": "download-limit" + }, + { + "question": "Quais tipos de dados encontro na BD?", + "answer": "

Em nossa plataforma, você encontra três tipos de dados: tabelas tratadas, fontes originais e pedidos LAI.

", + "categories": ["Dados"], + "keywords": "tipo, categoria", + "id": "data-resources" + }, + { + "question": "O que são tabelas tratadas?", + "answer": "

São tabelas prontas para análise, disponíveis via SQL, Python e R. O processo de tratamento das tabelas envolve a padronização de nomes de variáveis e compatibilização de códigos, o que permite que o cruzamento de tabelas de diferentes instituições e temas seja tão simples quanto qualquer outra consulta.

", + "categories": ["Dados"], + "keywords": "tratada, tratado, BD+, tabela, datalake, cruzar, cruzamento, padronização, compatibilização", + "id": "tables" + }, + { + "question": "O que são fontes originais?", + "answer": "

São links para páginas externas à plataforma com informações úteis sobre o conjunto de dados. A maioria destes são dados que ainda não disponibilizamos na BD como tabelas tratadas. Tentamos sempre fornecer o caminho mais próximo possível à fonte para baixar os dados originais.

", + "categories": ["Dados"], + "keywords": "fonte original, externo", + "id": "external-links" + }, + { + "question": "O que são pedidos LAI?", + "answer": "

São pedidos feitos através da Lei de Acesso à Informação (LAI). A LAI, lei nº 12.527/2011 regulamenta o direito, previsto na Constituição, de qualquer pessoa solicitar e receber dos órgãos e entidades públicos, de todos os entes e Poderes, informações públicas por eles produzidas ou custodiadas.

", + "categories": ["Dados"], + "keywords": "LAI, acesso à informação, lei", + "id": "information-requests" + }, + { + "question": "Como acessar as tabelas tratadas?", + "answer": "

Você pode consultar as tabelas tratadas BD+ de diferentes maneiras. Além de fazer o download direto na plataforma, é possível explorar os dados com SQL através do BigQuery ou com os pacotes em Python e R.

", + "categories": ["Dados"], + "keywords": "acesso, consulta, tratada, tratado, BD+, download, baixar, pacote, SQL, BigQuery, Python, R", + "id": "access-tables" + }, + { + "question": "Como acessar as fontes originais?", + "answer": "

Você pode acessar as fontes originais dos dados clicando no botão de redirecionamento para o link externo à plataforma.

", + "categories": ["Dados"], + "keywords": "acesso, consulta, fonte original, externo", + "id": "access-external-links" + }, + { + "question": "Como acessar os pedidos LAI?", + "answer": "

Você pode acessar os pedidos LAI clicando no botão de redirecionamento para o link externo à plataforma.

", + "categories": ["Dados"], + "keywords": "acesso, consulta, LAI, acesso à informação, lei", + "id": "access-information-requests" + }, + { + "question": "O que são diretórios?", + "answer": "

São tabelas que ligam diversos códigos institucionais e informações de diferentes entidades brasileiras. Isso é importante porque resolve o problema de não existir um identificador único para entidades – como UF, município, escola, distrito, setor censitário, categorias CID-10 e CID-9, CBO-2002 e CBO-1992, etc – entre instituições ou, ainda, a mudança de identificadores e nomes com typos entre anos e instituições. Para saber mais, confira nosso tutorial sobre Diretórios Brasileiros.

", + "categories": ["Dados"], + "keywords": "diretório, entidade, identificador, chave, primária", + "id": "directories" + }, + { + "question": "Os dados da BD são atualizados automaticamente?", + "answer": "

Alguns dados são atualizados automaticamente e outros não. Temos um compromisso de atualizar automaticamente qualquer base de frequência mensal ou maior. Esses dados de alta frequência estão disponíveis nos nossos planos avançados, Pro e Empresas.

", + "categories": ["Dados"], + "keywords": "atualização, automatização, frequência", + "id": "data-updated" + }, + { + "question": "Como utilizar os pacotes da BD?", + "answer": "

Nossos pacotes permitem o acesso ao datalake público direto do seu computador ou ambiente de desenvolvimento. Para começar a explorar nossos dados em Python ou R, siga os tutoriais de instalação dos pacotes presentes na nossa documentação.

", + "categories": ["Dados"], + "keywords": "pacote, Python, R, instalação, documentação", + "id": "packages" + }, + { + "question": "O que é nível da observação?", + "answer": "

O nível da observação indica o que representa cada linha da tabela. É como se a combinação das colunas que compõem o nível da observação fosse uma chave primária. Essa informação é útil pois indica qual a menor granularidade possível de análise com aquele dado. Por exemplo, uma tabela com nível da observação de estado permite que façamos uma análise no país (por ser mais amplo que estado), mas não uma análise por município (que já seria um recorte mais específico).

", + "categories": ["Dados"], + "keywords": "nível, observação, chave, primária", + "id": "level-of-observation" + }, + { + "question": "Onde eu posso sugerir a inclusão de novos dados na plataforma?", + "answer": "

É muito importante saber quais dados a nossa comunidade precisa para que a equipe adicione os conjuntos solicitados no processo de priorização de dados. Temos um canal no Discord preparado para receber suas propostas e sugestões, basta você seguir os passos indicados lá. Acesse por aqui.

", + "categories": ["Dados"], + "keywords": "inclusão, solicitação, proposta, sugestão", + "id": "data-proposal" + }, + { + "question": "O que são os planos Pro e Empresas?", + "answer": "

Além do plano gratuito, a BD conta com planos avançados: Pro, para usuários individuais, e Empresas, para até 10 usuários de uma mesma organização. Nesses planos estão disponíveis além dos dados já existentes no data lake público da BD, dezenas de conjuntos de dados exclusivos priorizados para solucionar problemas e te ajudar em sua equipe, organização ou pesquisa. Além de conjuntos de dados exclusivos, os planos oferecem acesso à à versão mais atualizada de algumas das nossas principais tabelas, como do CNES, dados de CNPJ, do Brasileirão, dentre muitas outras.

", + "categories": ["Planos Pagos"], + "keywords": "pro, empresas, assinatura, dados exclusivos, pagar, custo, gratuito, grátis, mensalidade", + "id": "subscriptions" + }, + { + "question": "Quais dados tenho acesso com os planos pagos?", + "answer": "

A assinatura dá acesso a dados de alta frequência atualizados. Esses podem às vezes ser um subconjunto de uma tabela tratada maior, ou ser uma tabela tratada inteira. Nosso mecanismo de busca e páginas específicas de conjuntos indicam o que é disponível gratuitamente e o que está coberto pela assinatura dos planos pagos.

", + "categories": ["Planos Pagos"], + "keywords": "pro, empresas, assinatura, dados exclusivos, pagar, custo, gratuito, grátis, mensalidade", + "id": "subscriptions-data" + }, + { + "question": "Como os dados da BD Pro são atualizados?", + "answer": "

Todos os dados disponíveis na BD Pro são atualizados automaticamente via nossa tecnologia de gerência de fluxos. A BD usa o que há de mais moderno em engenharia de dados para garantir a mais alta qualidade e consistência no que disponibilizamos.

", + "categories": ["Planos Pagos"], + "keywords": "pro, empresas, assinatura, dados exclusivos, atualizacao", + "id": "subscriptions-data-update" + }, + { + "question": "Quanto custa uma assinatura BD Pro?", + "answer": "

Atualmente temos dois planos. O plano Pro custa R$47 por mês, dando acesso a todos os dados de alta frequência atualizados para um único usuário. O plano Empresas custa R$350 por mês, incluindo acesso para 10 contas e suporte prioritário com nossa equipe.

", + "categories": ["Planos Pagos"], + "keywords": "pro, empresas, assinatura, preco", + "id": "subscriptions-prices" + }, + { + "question": "O que é o datalake da BD no BigQuery?", + "answer": "

É um banco de dados público hospedado no BigQuery, ferramenta potente de armazenamento e análise de dados do Google Cloud, com todas as tabelas tratadas BD+ para você consultar direto do seu navegador. As vantagens de utilizar nosso datalake no BigQuery estão relacionadas à velocidade do processamento, escalabilidade e economia.

", + "categories": ["BigQuery"], + "keywords": "BigQuery, Google, Cloud, datalake, BD+", + "id": "datalake" + }, + { + "question": "Por que preciso de uma conta no Google Cloud?", + "answer": "

Nosso banco de dados público é hospedado no BigQuery, uma ferramenta potente de armazenamento e análise de dados do Google Cloud. Para esse serviço, o Google Cloud oferece até 1 Terabyte gratuito por mês para seus usuários. Assim, é necessário que você crie uma conta para associar as consultas do banco a você e contabilizar o total de processamento utilizado no mês. A criação da conta não requer nenhum cartão ou forma de pagamento prévio, ou seja, o BigQuery inicia automaticamente no modo Sandbox, que permite que você utilize os recursos sem adicionar um modo de pagamento.

", + "categories": ["BigQuery"], + "keywords": "conta, cadastro, BigQuery, Google, Cloud", + "id": "google-account" + }, + { + "question": "O que acontece se eu exceder o limite mensal de 1 TB gratuito do Google Cloud?", + "answer": "

Caso você exceda o limite, são cobrados 5 dólares por Terabyte de dados que sua consulta irá processar. Mas ressaltamos que o limite de 1 Terabyte do Google costuma ser suficiente, mesmo para análises com bases mais robustas, como a RAIS ou Censo Escolar.

", + "categories": ["BigQuery"], + "keywords": "limite, terabyte, TB, Google, Cloud", + "id": "data-limit" + }, + { + "question": "Como criar um projeto no Google Cloud?", + "answer": "

Para criar um projeto no Google Cloud, basta ter um e-mail cadastrado no Google. É necessário ter um projeto seu, mesmo que vazio, para você fazer consultas em nosso datalake público.

  1. Acesse o Google Cloud.t=\"_blank\">Google Cloud. Caso for a sua primeira vez, aceite os Termos de Serviço.
  2. Clique em Create Project/Criar Projeto. Escolha um nome bacana para o projeto.
  3. Clique em Create/Criar.
", + "categories": ["BigQuery"], + "keywords": "criar, cadastrar, projeto, Google, Cloud", + "id": "google-cloud-project" + }, + { + "question": "Quais as melhores práticas para fazer uma consulta no BigQuery?", + "answer": "

Para verificar uma amostra de todas as variáveis da tabela, use:

SELECT * FROM  dataset.table_name LIMIT 100
  • A primeira dica valiosa é selecionar as colunas que você vai usar. O BigQuery funciona usando um modelo colunar, portanto, quanto menos colunas você usar, melhor vai ser o desempenho da sua consulta. Isso significa evitar o clássico
    SELECT * FROM table_name
    e escolher as colunas de seu interesse. Parece chato, mas ajuda muito!
  • Para tabelas grandes, uma boa prática é filtrar os anos e estados de seu interesse com a cláusula
    WHERE
    . Como utilizamos o sistema de particionamento, isso vai reduzir drasticamente o custo e o tempo de processamento.

Essas são as dicas mais simples e rápidas de executar. Para saber mais sobre boas práticas, acesse o manual completo disponibilizado pelo Google Cloud.

", + "categories": ["BigQuery"], + "keywords": "prática, dica, otimização, desempenho, consulta, BigQuery, selecionar, filtrar", + "id": "best-practices-performance" + }, + { + "question": "O que são os tipos no BigQuery?", + "answer": "

São os tipos de dados do Google Standard SQL. Suas categorias incluem: INTEGER (Inteiro), STRING (Texto), DATE (Data), FLOAT64 (Decimal), GEOGRAPHY (Geográfico), entre outras.

", + "categories": ["BigQuery"], + "keywords": "tipo, categoria, BigQuery, INTEGER, STRING, DATE, FLOAT, GEOGRAPHY", + "id": "bigquery-types" + }, + { + "question": "O que são as partições no BigQuery?", + "answer": "

As partições são divisões feitas em uma tabela para facilitar o gerenciamento e a consulta aos dados. Ao segmentar uma tabela grande em partições menores, a quantidade de bytes lidos é reduzida, o que ajuda a controlar os custos e melhora o desempenho da consulta.

", + "categories": ["BigQuery"], + "keywords": "partição, particionamento, otimização, desempenho, BigQuery", + "id": "bigquery-partitions" + }, + { + "question": "O que é a BD Lab?", + "answer": "

A BD Lab é nosso braço de serviços, parcerias e projetos. É pela BD Lab que interagimos com outras organizações, provendo nossa expertise acumulada em tecnologia e dados. Enxergamos esses projetos como componente indispensável da nossa missão de promover o uso de dados para a promoção do bem-estar social.

", + "categories": ["BD Lab"], + "keywords": "bd lab, consultoria, projeto", + "id": "bd-lab" + }, + { + "question": "Como surgiu a BD Lab?", + "answer": "

A BD Lab foi criada para garantir a sustentabilidade da organização, de forma a manter e expandir nossos produtos de forma gratuita. A prestação de serviços de dados e a realização de projetos com parceiros vêm sendo chave não só na geração de receita, mas também no fortalecimento da nossa posição de referência na disponibilização de dados de qualidade.

", + "categories": ["BD Lab"], + "keywords": "bd lab, consultoria, projeto, origem", + "id": "bd-lab-origin" + }, + { + "question": "O que é a BD Edu?", + "answer": "

A BD Edu é nosso braço de educação, com a missão de capacitar pessoas para resolver problemas com dados. Já prestamos serviços de formação para organizações como Vetor Brasil, Souk Analytics e ProForest, além de nossos cursos abertos ao público. Oferecemos cursos ao vivo e assíncronos e todo o valor arrecadado é revertido em investimento na Base dos Dados.

", + "categories": ["BD Edu"], + "keywords": "bd edu, educacao, formacao, curso", + "id": "bd-edu" + }, + { + "question": "Quais cursos a BD Edu oferece?", + "answer": "

Atualmente oferecemos cursos de análises de dados com ferramentas importantes para o mercado, como SQL, Python, editores de planilhas e Google Cloud. Porém, nossa equipe é capacitada para desenvolver cursos sob demanda e temos trabalhado para lançar novos modelos de formações.

", + "categories": ["BD Edu"], + "keywords": "bd edu, educacao, formacao, curso", + "id": "bd-edu-courses" + }, + { + "question": "Os cursos da BD possuem certificado?", + "answer": "

Sim, sempre que um curso é concluído nós emitimos um certificado oficial da BD constando as informações pessoais do aluno e sobre o curso. O certificado é verificável e pode ser compartilhado nas redes ou anexado ao seu currículo.

", + "categories": ["BD Edu"], + "keywords": "bd edu, educacao, formacao, curso, certificado", + "id": "bd-edu-certificates" + }, + { + "question": "Tenho dúvidas sobre os cursos da BD Edu, existe um canal especializado para contato?", + "answer": "

Sim, você pode tirar suas dúvidas pelo email suporte.bdedu@basedosdados.org. Nossa equipe faz a checagem diária para prestar o melhor suporte possível.

", + "categories": ["BD Edu"], + "keywords": "bd edu, educacao, formacao, curso, certificado", + "id": "bd-edu-contact" + }, + { + "question": "Qual plataforma é utilizada para as atividades dos cursos da BD Edu?", + "answer": "

Utilizamos a plataforma coda.io, que funciona como um editor de documentos que combina recursos de planilhas, apresentações, processadores de texto e aplicativos. Por lá temos nossa Área do Aluno(a), onde é possível encontrar o cronograma, links para as aulas ao vivo, aulas gravadas, página de submissão de exercício, fórum de dúvidas, materiais extras e mais.

", + "categories": ["BD Edu"], + "keywords": "bd edu, educacao, formacao, curso, plataforma", + "id": "bd-edu-platform" + }, + { + "question": "Quem organiza e ministra os cursos da BD Edu?", + "answer": "

Nossos cursos são desenvolvidos e revisados por especialistas que trabalham na equipe da Base dos Dados. Você pode checar o perfil de todos em nossa página institucional.

", + "categories": ["BD Edu"], + "keywords": "bd edu, educacao, formacao, curso, suporte", + "id": "bd-edu-teacher" + }, + { + "question": "A BD é uma empresa?", + "answer": "

Não. A BD é constituída como uma associação sem fins lucrativos chamada \"Instituto Base dos Dados\" com sede no Rio de Janeiro e com CNPJ 42.494.318/0001-16.

", + "categories": ["Institucional"], + "keywords": "natureza legal, empresa, ong, lucro", + "id": "legal-nature" + }, + { + "question": "Como a BD se financia?", + "answer": "

Ao longo dos anos, a BD cresceu com o apoio financeiro de usuários e de pessoas que se identificam com nossa missão. Hoje, contamos também com nossa área de Serviços e Parcerias (BD Lab) e nossos planos de acesso a dados exclusivos de alta frequência atualizados (BD Pro). Confira mais sobre a contabilidade da organização em nossa página de Transparência.

", + "categories": ["Institucional"], + "keywords": "financiamento, sustentabilidade, contabilidade, serviço, parceria", + "id": "financing" + }, + { + "question": "Como citar a BD?", + "answer": "

Você pode referenciar de duas maneiras:

Dahis et al. (2022) Data Basis: Universalizing Access to High-Quality Data. Disponível em: {``}.

", + "categories": ["Institucional"], + "keywords": "citar, citação, referência", + "id": "reference" + }, + { + "question": "Como a BD coleta dados pessoais?", + "answer": "

Coletamos informações pessoais que você nos fornece diretamente ao usar nossos serviços. Isso pode incluir seu nome, endereço de e-mail, informações de pagamento e outras informações que você escolher compartilhar conosco. Também coletamos informações de forma automática, através de cookies, incluindo dados de uso, endereço IP, tipo de navegador, e informações sobre o dispositivo que você usa para acessar nossos serviços.

Utilizamos suas informações pessoais para fornecer e melhorar nossos serviços, incluindo o processamento de pagamentos, o fornecimento de suporte ao cliente e a personalização da experiência do usuário. Não venderemos, alugaremos ou compartilharemos suas informações pessoais com terceiros não afiliados sem o seu consentimento explícito. Para mais informações, acesse nossos Termos de Uso e Políticas de Privacidade aqui.

", + "categories": ["Institucional"], + "keywords": "privacidade, uso, lgpd", + "id": "personal-data" + } + ], + "pageTitle": "Perguntas Frequentes – Base dos Dados", + "pageDescription": "Aqui você pode encontrar respostas para suas perguntas sobre a Base dos Dados. Saiba mais sobre nossos dados, como acessar através do BigQuery usando SQL ou com pacotes Python e R agora.", + "title": "Perguntas Frequentes", + "searchPlaceholder": "Pesquisar", + "categories": { + "data": "Dados", + "paidPlans": "Planos Pagos", + "bigQuery": "BigQuery", + "bdLab": "BD Lab", + "bdEdu": "BD Edu", + "institutional": "Institucional" + }, + "noQuestionsFound": "Infelizmente, não encontramos nenhuma pergunta relacionada à sua busca.", + "contactText": "Não encontrou sua pergunta?", + "contactLink": "Contate a nossa equipe." +} \ No newline at end of file diff --git a/next/public/locales/pt/index.json b/next/public/locales/pt/index.json new file mode 100644 index 00000000..e48a5a7d --- /dev/null +++ b/next/public/locales/pt/index.json @@ -0,0 +1,9 @@ +{ + "search": "Buscar", + "themes": "Temas", + "datasets": "Conjuntos de dados", + "about": "Sobre", + "contact": "Contato", + "login": "Entrar", + "signup": "Cadastrar" +} \ No newline at end of file diff --git a/next/public/locales/pt/menu.json b/next/public/locales/pt/menu.json new file mode 100644 index 00000000..87c1ea74 --- /dev/null +++ b/next/public/locales/pt/menu.json @@ -0,0 +1,28 @@ +{ + "enter": "Entrar", + "register": "Cadastrar", + "public_profile": "Perfil público", + "account": "Conta", + "password": "Senha", + "plans_and_payment": "Planos e pagamento", + "settings": "Configurações", + "exit": "Sair", + "search_data": "Pesquisar dados", + "data": "Dados", + "solutions": "Soluções", + "exclusive_data": "Dados exclusivos", + "data_courses": "Cursos de dados", + "services": "Serviços", + "prices": "Preços", + "tutorials": "Tutoriais", + "documentation": "Documentação", + "youtube_videos": "Videos no Youtube", + "blog": "Blog", + "institutional": "Institucional", + "about_us": "Sobre nós", + "transparency": "Transparência", + "newsletter": "Newsletter", + "jobs": "Carreiras", + "faq": "Perguntas frequentes", + "contact": "Contato" +} \ No newline at end of file diff --git a/next/public/locales/pt/prices.json b/next/public/locales/pt/prices.json new file mode 100644 index 00000000..6401da4d --- /dev/null +++ b/next/public/locales/pt/prices.json @@ -0,0 +1,56 @@ +{ + "pageTitle": "Preços – Base dos Dados", + "ogTitle": "Preço – Base dos Dados", + "ogDescription": "Compare os planos da Base dos Dados: Grátis, Pro e Empresas. Com a BD Pro você conta com recursos avançados da nossa plataforma, dados de alta frequência e conjuntos exclusivos a partir de R$47/mês.", + "comparePlans": "Compare os planos", + "annualDiscount": "Desconto anual", + "save20": "Economize 20%", + "perMonth": "/mês", + "chargedAnnually": "cobrado uma vez no ano", + "annualBillingMessage": "{{price}} cobrado uma vez no ano", + "readThe": "Leia os", + "termsOfService": "Termos de Serviço", + "features": "Recursos:", + "allFeaturesPlus": "Todos os recursos da {{plan}}, mais:", + "currentPlan": "Plano atual", + "subscribe": "Assinar", + "startFreeTrial": "Iniciar teste grátis", + "exploreFeatures": "Explorar recursos", + "plans": { + "free": { + "title": "BD Grátis", + "subtitle": "Para você descobrir o potencial da plataforma de dados", + "features": [ + "Tabelas tratadas", + "Dados integrados", + "Dados de baixa frequência atualizados", + "Acesso em nuvem", + "Acesso via SQL, Python e R", + "Integração com ferramentas BI", + "Download direto até 100 MB" + ] + }, + "pro": { + "title": "BD Pro", + "subtitle": "Para você ter acesso aos dados mais atualizados", + "features": [ + "Dezenas de bases de alta frequência atualizadas", + "Tabela de referência de empresas com informações atualizadas", + "Download direto até 1GB (80% das tabelas da plataforma)" + ] + }, + "enterprise": { + "title": "BD Empresas", + "subtitle": "Para sua empresa ganhar tempo e qualidade em decisões", + "features": [ + "Acesso para 10 contas", + "Suporte prioritário via email e Discord" + ] + } + }, + "tooltips": { + "integratedData": "Nossa metodologia de padronização e compatibilização de dados permite que você cruze tabelas de diferentes instituições e temas de maneira simplificada.", + "downloadLimit": "Esse limite não se aplica ao acesso via SQL, Python e R.", + "downloadLimitPro": "Tabelas maiores que 1 GB não estão disponíveis para download parcial ou completo. Esse limite não se aplica ao acesso via SQL, Python e R." + } + } \ No newline at end of file diff --git a/next/public/locales/pt/services.json b/next/public/locales/pt/services.json new file mode 100644 index 00000000..b4889a12 --- /dev/null +++ b/next/public/locales/pt/services.json @@ -0,0 +1,111 @@ +{ + "pageTitle": "Serviços – Base dos Dados", + "metaTitle": "Serviços – Base dos Dados", + "slogan": { + "title": "Nossos serviços", + "description": "A Base dos Dados é a especialista que ajuda você ou sua equipe a trabalhar e extrair o máximo de valor dos dados.", + "cta": "Vamos fazer um projeto juntos" + }, + "services": { + "dataCapture": "Captura de dados", + "dataAnalysis": "Análise de dados", + "dataConsulting": "Consultoria de dados" + }, + "caseStudies": { + "title": "Nossas soluções", + "subtitle": "Descubra por que as instituições escolhem inovar com a Base dos Dados", + "readMore": "Leia o estudo de caso" + }, + "dataCapture": { + "title": "Captura de dados", + "description": "Capturamos e disponibilizamos dados sob demanda com rapidez, escala e baixo custo.", + "longDescription": "Você não precisa se preocupar em criar e manter uma infraestrutura própria ou escrever códigos - nós cuidamos disso. Tudo é feito seguindo a metodologia de tratamento e padronização da Base dos Dados, e conforme as melhores práticas de engenharia de dados do mercado. As tabelas tratadas podem ser disponibilizadas com exclusividade ou serem públicas.", + "advantages": { + "title": "Principais vantagens", + "speed": "Rapidez", + "speedDescription": "Mesmo queries muito complexas demoram apenas minutos para serem processadas.", + "scale": "Escala", + "scaleDescription": "Nosso datalake escala magicamente para hexabytes se necessário.", + "cost": "Baixo custo", + "costDescription": "Todo usuário possui 1TB gratuito por mês para consulta aos dados." + }, + "work": { + "title": "Nosso trabalho com engenharia de dados", + "technology": { + "title": "Tecnologia de ponta", + "description": "Utilizando da infraestrutura do Google Cloud Platform, uma das maiores plataformas de armazenamento e processamento de dados, garantimos a segurança e a confiabilidade do nosso trabalho." + }, + "flexibility": { + "title": "Flexibilidade", + "description": "Seja envios pontuais, atualizações recorrentes, acesso via API, ou conexão com plataformas de BI, entregamos a solução que você precisa de forma ágil e completa." + }, + "frameworks": { + "title": "Frameworks reconhecidos", + "description": "Com frameworks e sistemas de gestão de dados, garantimos a qualidade e a organização do seu sistema de dados sem gerar qualquer preocupação para sua equipe." + } + } + }, + "dataAnalysis": { + "title": "Análise de dados", + "description": "Construímos análises, relatórios e indicadores essenciais para sua pesquisa ou tomada de decisão.", + "longDescription": "As informações e insights são gerados a partir de diversos conjuntos de dados já tratados no nosso datalake público atrelado à expertise da nossa equipe de Dados. E mais: utilizamos nossa metodologia padrão de tratamento para que você também possa cruzar esses dados com quaisquer outras bases disponíveis no datalake.", + "examples": { + "title": "Exemplos de perguntas que podemos responder", + "example1": "Como vem evoluindo a economia brasileira, com indicadores detalhados mensais por setor?", + "example2": "Quais escolas terão performance acima da média do estado em matemática no ano que vem?", + "example3": "Quantas vezes o Diário Oficial da União publica sobre certo tema a cada dia?" + } + }, + "dataConsulting": { + "title": "Consultoria de dados", + "description": "Orientamos como aplicar a nossa metodologia de limpeza, estruturação e padronização de dados", + "longDescription": "No seu projeto ou organização através de workshops e materiais exclusivos. Reproduzir nosso processo de tratamento em seu próprio banco de dados pode poupar horas de trabalho de sua equipe ao consultar, manipular ou atualizar as informações.", + "advantages": { + "title": "Principais vantagens", + "advantage1": "Experiência em construir infraestruturas capazes de suportar milhares de acessos mensais.", + "advantage2": "Flexibilidade para projetos remotos em qualquer lugar do país.", + "advantage3": "Equipe diversa e com expertise em diferentes áreas do conhecimento e dados." + }, + "areas": { + "title": "Frentes de atuação", + "infrastructure": { + "title": "Infraestrutura", + "description": "Mentoria para equipes de engenharia de dados que buscam estruturar processos de manutenção de dados, seus próprios datalakes ou ainda alavancarem-se utilizando a infraestrutura da Base dos Dados." + }, + "analysis": { + "title": "Análise", + "description": "Workshops práticos, mostrando como funciona o datalake da Base dos Dados e ensinando como explorar dados públicos para matérias jornalísticas ou pesquisas científicas." + }, + "programming": { + "title": "Programação", + "description": "Programas personalizados de ensino para utilizar pacotes de Python e R da Base dos Dados, além de mentoria de SQL para construir análises rápidas e escaláveis direto na nuvem." + } + } + }, + "workflow": { + "title": "Nosso fluxo de trabalho", + "description": "Uma mesma metodologia de trabalho para todos os serviços, pautada na satisfação dos clientes e na primazia pela qualidade.", + "steps": { + "demand": { + "title": "Demanda", + "subtitle": "Identificação de demandas e necessidades do cliente", + "description": "Trabalhamos colaborativamente para compreender as reais necessidades por trás dos pedidos de nossos clientes. O trabalho de descoberta compreende discussões sobre os objetivos do projeto ou o uso dos dados a serem capturados e analisados. É nesta etapa que fica claro para nossa equipe e para os clientes o objetivo final do serviço." + }, + "planning": { + "title": "Planejamento", + "subtitle": "Alinhamento de expectativas de negócio, engenharia ou capacitação", + "description": "O segundo passo é entender qual a melhor forma de entregarmos o valor que você precisa. Não trabalhamos com propostas genéricas. Cada projeto é pensado e orientado 100% para as demandas dos clientes, seja no formato de entrega de dados, análises ou capacitações específicas." + }, + "budget": { + "title": "Orçamento", + "subtitle": "Orçamento transparente e simplificado", + "description": "Uma vez alinhado o escopo, formato e expectativas, entregamos uma proposta de orçamento completamente transparente. Para isso, consideramos fatores como a quantidade e complexidade de datasets, trabalho necessário, tamanho da equipe e urgência. Tudo explícito de forma direta e em conformidade com o que foi determinado até então." + }, + "execution": { + "title": "Execução", + "subtitle": "Execução ágil e entrega de valor", + "description": "Por fim, nossa entrega é comprometida com prazos e, sobretudo, qualidade. A comunicação é constante durante toda execução. Trabalhando de forma lean e com profissionais experientes na área, nossa equipe preza pela satisfação de nossos clientes." + } + } + } +} \ No newline at end of file diff --git a/next/public/locales/pt/terms.json b/next/public/locales/pt/terms.json new file mode 100644 index 00000000..617e7f78 --- /dev/null +++ b/next/public/locales/pt/terms.json @@ -0,0 +1,119 @@ +{ + "pageTitle": "Termos – Base dos Dados", + "ogTitle": "Termos e Privacidade – Base dos Dados", + "mainTitle": "Termos e Privacidade", + "termsOfService": "Termos de Serviço", + "privacyPolicy": "Políticas de Privacidade", + "ToS": { + "term1": { + "title": "1. Aceitação dos Termos", + "content": "Ao acessar ou usar os serviços oferecidos pela Base dos Dados (\"Nós\", \"Nosso\" ou \"Nossos\"), você concorda em cumprir e aceitar estes Termos de Serviço. Se você não concordar com todos os termos e condições deste acordo, não poderá utilizar nossos serviços." + }, + "term2": { + "title": "2. Descrição do Serviço", + "content": "2.1. Nossos serviços consistem em uma assinatura mensal que concede aos seus assinantes o acesso a diversos dados exclusivos, harmonizados e atualizados na plataforma da Base dos Dados. O acesso se dá via os pacotes Python ou R da Base dos Dados, ou via BigQuery, serviço de armazenamento de dados de baixo custo e totalmente gerenciado do Google para análises." + }, + "term3": { + "title": "3. Pagamento e Assinaturas", + "content": "", + "subContent1": "3.1. Ao fazer a assinatura, você concorda em pagar a taxa mensal especificada. O pagamento será processado automaticamente a cada mês, a menos que você cancele sua assinatura antes da data de renovação, devidamente explicita na contratação do serviço.", + "subContent2": "3.2. Ao fazer a assinatura, você concorda que seus dados sejam utilizados na criação e manutenção de usuários na plataforma de pagamentos Stripe.", + "subContent3": "3.3. Os preços e os métodos de pagamento estão sujeitos a alterações a critério exclusivo da Base dos Dados. As alterações de preço ou de métodos de pagamento serão notificadas com antecedência." + }, + "term4": { + "title": "4. Cancelamento e Reembolso", + "content": "4.1. Você pode cancelar sua assinatura a qualquer momento através das opções disponíveis em sua conta. No entanto, não serão fornecidos reembolsos ou créditos por períodos em que a assinatura não foi utilizada." + }, + "term5": { + "title": "5. Uso Responsável", + "content": "5.1. Você concorda em usar nossos serviços de forma responsável e em conformidade com todas as leis e regulamentos aplicáveis." + }, + "term6": { + "title": "6. Propriedade Intelectual", + "content": "6.1. Todos os direitos de propriedade intelectual relacionados aos dados fornecidos são de propriedade de terceiros e estão sujeitos às suas respectivas políticas de uso." + }, + "term7": { + "title": "7. Privacidade", + "content": "7.1. O uso de seus dados pessoais é regido por nossa Política de Privacidade. Ao usar nossos serviços, você concorda com a coleta e o uso de suas informações conforme descrito em nossa Política de Privacidade." + }, + "term8": { + "title": "8. Rescisão", + "content": "8.1. Reservamo-nos o direito de encerrar ou suspender sua conta a qualquer momento, por qualquer motivo, sem aviso prévio." + }, + "term9": { + "title": "9. Limitação de Responsabilidade", + "content": "9.1. Em nenhuma circunstância seremos responsáveis por danos diretos, indiretos, especiais, incidentais ou consequentes decorrentes do uso ou da incapacidade de usar nossos serviços." + }, + "term10": { + "title": "10. Alterações nos Termos de Serviço", + "content": "10.1. Reservamo-nos o direito de modificar estes Termos de Serviço a qualquer momento. As alterações serão efetivas após a publicação das versões atualizadas em nosso site." + }, + "term11": { + "title": "11. Lei Aplicável e Jurisdição", + "content": "11.1. Estes Termos de Serviço serão regidos e interpretados de acordo com as leis do Brasil. Qualquer disputa relacionada a estes termos estará sujeita à jurisdição exclusiva dos tribunais do Rio de Janeiro, RJ, Brasil." + }, + "term12": { + "title": "12. Contato", + "content": "12.1. Para entrar em contato conosco com perguntas ou preocupações relacionadas a estes Termos de Serviço, por favor, envie um e-mail para suporte.bdpro@basedosdados.org." + }, + "finalNote": "Ao utilizar nossos serviços, você concorda com todos os termos e condições estabelecidos neste acordo. Por favor, leia estes termos atentamente antes de prosseguir." + }, + "PP": { + "header": { + "subContent1": "Base dos Dados (\"Nós\", \"Nosso\" ou \"Nossos\"). Comprometemo-nos a proteger e respeitar sua privacidade e cumprir todas as obrigações estabelecidas na Lei Geral de Proteção de Dados (\"LGPD\").", + "subContent2": "Esta Política de Privacidade descreve como coletamos, usamos, compartilhamos e protegemos suas informações pessoais. Ao acessar ou usar nossos serviços, você concorda com os termos e práticas descritos nesta Política de Privacidade." + }, + "term1": { + "title": "1. Informações que Coletamos", + "subContent1": "1.1. Coletamos informações pessoais que você nos fornece diretamente ao usar nossos serviços. Isso pode incluir seu nome, endereço de e-mail, informações de pagamento e outras informações que você escolher compartilhar conosco.", + "subContent2": "1.2. Também coletamos informações de forma automática, incluindo dados de uso, endereço IP, tipo de navegador, e informações sobre o dispositivo que você usa para acessar nossos serviços." + }, + "term2": { + "title": "2. Uso das Informações", + "subContent1": "2.1. Utilizamos suas informações pessoais para fornecer e melhorar nossos serviços, incluindo o processamento de pagamentos, o fornecimento de suporte ao cliente e a personalização da experiência do usuário.", + "subContent2": "2.2. Não venderemos, alugaremos ou compartilharemos suas informações pessoais com terceiros não afiliados sem o seu consentimento explícito." + }, + "term3": { + "title": "3. Cookies e Tecnologias Semelhantes", + "subContent1": "3.1. Cookies são pedaços de dados que ajudam o site a lembrar suas preferências e tornar a navegação mais eficiente.", + "subContent2": "3.2. Esses cookies são necessários para garantir o funcionamento adequado do site, melhorar o desempenho e personalizar a experiência de navegação, como idioma e região.", + "subContent3": { + "title": "3.3. Cookies usados:", + "headers": { + "header1": "Nome do Cookie", + "header2": "Retenção", + "header3": "Finalidade" + }, + "row1": { + "name": "userBD", + "retention": "7 dias", + "purpose": "Ao realizar o login em nosso site, esse cookie especial é criado para armazenar suas informações básicas. Esse cookie é essencial para permitir que você permaneça logado e acesse as áreas protegidas do site. Sem ele, você não conseguirá fazer login." + }, + "row2": { + "name": "token", + "retention": "7 dias", + "purpose": "Ao realizar o login em nosso site, esse cookie especial é criado para armazenar seu token de acesso. Este token não apenas permite que você permaneça logado, mas também atua como um guardião para garantir a integridade de suas configurações e informações pessoais." + } + }, + "subContent4": "3.4. Ao continuar a usar nosso site, você concorda com o uso desses cookies. Se preferir não usá-los, recomendamos que ajuste as configurações do seu navegador. No entanto, isso afetará sua capacidade de fazer login e acessar áreas restritas.", + "subContent5": "Se tiver alguma dúvida sobre esses cookies ou qualquer outra questão de privacidade, entre em contato conosco através do endereço de e-mail contato@basedosdados.org." + }, + "term4": { + "title": "4. Segurança das Informações", + "subContent1": "4.1. Implementamos medidas de segurança técnicas e organizacionais para proteger suas informações pessoais contra acesso não autorizado e uso indevido." + }, + "term5": { + "title": "5. Seus Direitos", + "subContent1": "5.1. De acordo com a LGPD, você tem direito de acessar, retificar, excluir ou portar seus dados pessoais. Se você deseja exercer esses direitos ou tiver alguma dúvida sobre como suas informações estão sendo tratadas, entre em contato conosco através do endereço de e-mail contato@basedosdados.org." + }, + "term6": { + "title": "6. Alterações nesta Política de Privacidade", + "subContent1": "6.1. Reservamo-nos o direito de atualizar esta Política de Privacidade periodicamente. As alterações serão publicadas em nosso site, e a data da última atualização será revisada. Recomendamos que você revise esta Política regularmente para se manter informado sobre nossas práticas de privacidade." + }, + "term7": { + "title": "7. Contato", + "subContent1": "7.1. Para quaisquer perguntas ou preocupações relacionadas à nossa Política de Privacidade, entre em contato conosco através do endereço de e-mail contato@basedosdados.org." + }, + "finalNote": "Esta Política de Privacidade foi elaborada de acordo com as disposições da LGPD e visa garantir que suas informações pessoais sejam tratadas com o devido respeito e cuidado." + } +} \ No newline at end of file diff --git a/next/public/locales/pt/transparency.json b/next/public/locales/pt/transparency.json new file mode 100644 index 00000000..9fedaf8f --- /dev/null +++ b/next/public/locales/pt/transparency.json @@ -0,0 +1,31 @@ +{ + "pageTitle": "Transparência – Base dos Dados", + "ogDescription": "Utilizamos os recursos para facilitar o acesso de milhares de pessoas a dados de qualidade. Nesse espaço, você encontra informações referentes às nossas atividades, receitas e despesas. Acompanhe de perto como garantimos a sustentabilidade da organização e saiba como você também pode nos apoiar.", + "mainTitle1": "Nossas contas são", + "mainTitle2": " transparentes e abertas", + "mainTitle3": " – como todo o resto.", + "mainDescription1": "Somos uma organização não-governamental sem fins lucrativos e open-source. A transparência fundamenta todas as nossas ações, desde o trabalho com dados públicos até a prestação de contas. Utilizamos os recursos para facilitar o acesso de milhares de pessoas a dados de qualidade.", + "mainDescription2": "Nesse espaço, você encontra informações referentes às nossas atividades, receitas e despesas. Acompanhe de perto como garantimos a sustentabilidade da organização.", + "survivalIndicator": "Indicador de sobrevida", + "survivalDescription1": "Esse é nosso indicador de sobrevida. Ele mostra o tempo que nossas atividades poderiam se manter caso a organização arrecadasse só o que já está planejado e se continuasse gastando como na média dos três meses anteriores.", + "survivalDescription2": "Abaixo, você confere os detalhes das fontes e destinações de recursos da organização.", + "accountingData": "Dados da contabilidade", + "accountingDescription1": "Como não poderia deixar de ser, todos os microdados", + "accountingDescription2": " relativos à contabilidade da BD estão disponíveis no datalake público.", + "accessButton": "Acesse", + "accumulatedRevenue": "Receitas acumuladas esse ano", + "accumulatedExpenses": "Despesas acumuladas esse ano", + "fullDashboard": "Veja o painel completo", + "here": "aqui", + "statuteReports": "Estatuto e relatórios", + "statuteDescription": "Em nosso estatuto, estão presentes as diretrizes que regulamentam o funcionamento e o processo de tomada de decisões da organização. O documento inclui também os direitos e deveres dos membros e as competências dos conselhos administrativos e fiscais.", + "reportsDescription": "Nossos relatórios apresentam todas as atividades empenhadas pela equipe. São diversos projetos que colaboram com a promoção da cultura de transparência, o desenvolvimento socioeconômico e a construção de políticas públicas baseadas em dados e evidências.", + "DBStatute": "BD Estatuto Social", + "DBReport2023": "BD Relatório Anual 2023", + "DBReport2022": "BD Relatório Anual 2022", + "DBReport2021": "BD Relatório Anual 2021", + "supportTitle1": "Você também acredita no", + "supportTitle2": " acesso a dados de qualidade?", + "supportDescription": "Tudo o que fazemos só é possível por conta das pessoas que apoiam o nosso trabalho. Ajude a BD a continuar facilitando o acesso a dados públicos. Com qualquer valor, você contribui para a manutenção dos nossos projetos e a sobrevivência da organização.", + "supportButton": "Apoie agora" +} \ No newline at end of file diff --git a/next/public/locales/pt/user.json b/next/public/locales/pt/user.json new file mode 100644 index 00000000..0a12f57a --- /dev/null +++ b/next/public/locales/pt/user.json @@ -0,0 +1,344 @@ +{ + "login": { + "title": "Faça login", + "emailLabel": "E-mail", + "emailPlaceholder": "Insira seu e-mail", + "emailError": "Por favor, insira um endereço de e-mail válido.", + "passwordLabel": "Senha", + "passwordPlaceholder": "Insira sua senha", + "passwordError": "Por favor, insira a senha.", + "forgotPassword": "Esqueceu a senha?", + "loginButton": "Entrar", + "noAccount": "Não tem uma conta?", + "signUp": "Cadastre-se", + "loginError": "E-mail ou senha incorretos.", + "serverError": "Não foi possível conectar ao servidor. Tente novamente mais tarde." + }, + "signup": { + "title": "Cadastre-se", + "firstName": "Nome", + "lastName": "Sobrenome", + "email": "E-mail", + "username": "Nome de usuário", + "password": "Senha", + "confirmPassword": "Confirme a senha", + "register": "Cadastrar", + "alreadyHaveAccount": "Já tem uma conta?", + "login": "Faça login", + "termsAgreement": { + "part1": "Ao clicar em \"Cadastrar\" acima, você confirma que leu, compreendeu e aceita os ", + "termsLink": "Termos de Serviço", + "part2": " e ", + "privacyLink": "Políticas de Privacidade", + "part3": " da Base dos Dados." + }, + "placeholders": { + "firstName": "Insira seu nome", + "lastName": "Insira seu sobrenome (opcional)", + "email": "Insira seu e-mail", + "username": "Insira seu nome de usuário", + "password": "Crie uma senha", + "confirmPassword": "Insira a senha novamente" + }, + "errors": { + "firstName": "Por favor, insira seu nome.", + "username": { + "invalid": "Nome de usuário inválido ou já existe uma conta com este nome de usuário.", + "noSpaces": "Nome de usuário não pode haver espaçamento.", + "exists": "Conta com este nome de usuário já existe." + }, + "email": { + "invalid": "Endereço de e-mail inválido ou já existe uma conta com este e-mail.", + "exists": "Conta com este email já existe." + }, + "password": { + "noSpaces": "As senhas inseridas não podem conter espaçamentos.", + "requirements": "Certifique-se que a senha tenha no mínimo:", + "chars": "8 caracteres", + "uppercase": "Uma letra maiúscula", + "lowercase": "Uma letra minúscula", + "digit": "Um dígito", + "special": "Um caractere especial, dentre ! @ # ? ! % & *" + }, + "confirmPassword": { + "required": "Confirmar a senha é necessário.", + "mismatch": "A senha inserida não coincide com a senha criada no campo acima. Por favor, verifique se não há erros de digitação e tente novamente." + }, + "register": "Error ao tentar se cadastrar, tente novamente mais tarde!" + } + }, + "survey": { + "title": "Pesquisa de perfil", + "skip": "Pular", + "continue": "Continuar", + "back": "Voltar", + "send": "Enviar", + "error": "Por favor, selecione uma das opções abaixo.", + "serverError": "Ocorreu um erro interno no servidor. Por favor, tente novamente mais tarde.", + "questions": [ + { + "question": "Em que área você atua?", + "options": [ + "Tecnologia", + "Saúde", + "Financeiro", + "Educação", + "Varejo", + "Energia", + "Jornalismo", + "Outra" + ] + }, + { + "question": "Qual o seu cargo?", + "options": [ + "CEO/Diretor(a)", + "Gerente", + "Coordenador(a)", + "Analista", + "Consultor(a)", + "Especialista", + "Assistente", + "Estagiário(a)", + "Estudante", + "Professor(a)/Pesquisador(a)", + "Freelancer", + "Empreendedor(a)", + "Outro" + ] + }, + { + "question": "Qual o tamanho da empresa em que você trabalha?", + "options": [ + "1-10 funcionários", + "11-50 funcionários", + "51-200 funcionários", + "201-500 funcionários", + "Mais de 500 funcionários" + ] + }, + { + "question": "Qual a principal ferramenta que você utiliza para realizar análises de dados?", + "options": [ + "SQL", + "Python", + "R", + "Stata", + "Excel", + "Nenhuma", + "Outra" + ] + }, + { + "question": "Qual o seu principal objetivo com a BD?", + "options": [ + "Análise de mercado", + "Monitoramento de concorrência", + "Pesquisa acadêmica", + "Gestão de riscos", + "Desenvolvimento de produto", + "Compliance e regulatório", + "Análise de políticas públicas", + "Outro" + ] + }, + { + "question": "Como você conheceu a BD?", + "options": [ + "Redes sociais", + "Indicação", + "Pesquisa online", + "Eventos", + "Publicidade", + "Outros" + ] + }, + { + "question": "Estamos sempre buscando aprimorar a plataforma e consideramos fundamental ouvir a nossa comunidade nesse processo. Podemos contatar você para futuras pesquisas?", + "options": [ + "Sim", + "Não" + ] + } + ] + }, + "username": { + "settings": "Configurações", + "publicProfile": "Perfil público", + "account": "Conta", + "changePassword": "Senha", + "plansAndPayment": "Planos e pagamento", + "firstName": "Nome", + "enterFirstName": "Digite seu nome", + "lastName": "Sobrenome", + "enterLastName": "Digite seu sobrenome", + "email": "E-mail", + "makeEmailPublic": "Tornar e-mail público", + "url": "URL", + "enterURL": "Digite a URL do seu site", + "socialMedia": "Redes sociais", + "githubProfileLink": "Link do perfil do GitHub", + "twitterProfileLink": "Link do perfil do Twitter", + "linkedinProfileLink": "Link do perfil do LinkedIn", + "shareInfo": "Ao preencher os campos desta página, você nos dá consentimento para compartilhar essas informações onde quer que o seu perfil de usuário apareça.", + "updateProfile": "Atualizar perfil", + "profilePicture": "Foto de perfil", + "edit": "Editar", + "updatePicture": "Atualizar foto", + "removePicture": "Remover foto", + "invalidUsername": "Nome de usuário inválido", + "noSpacesInUsername": "O nome de usuário não pode conter espaços", + "invalidOrExistingUsername": "Nome de usuário inválido ou já existente", + "deleteAccount": "Excluir conta", + "back": "Voltar", + "changeEmail": "Alterar e-mail", + "confirmEmail": "Confirme seu e-mail", + "emailSentTo": "Enviamos um e-mail para:", + "checkInbox": "Verifique sua caixa de entrada e siga as instruções enviadas no e-mail para completar a alteração.", + "username": "Nome de usuário", + "enterUsername": "Digite seu nome de usuário", + "currentPassword": "Senha atual", + "enterCurrentPassword": "Digite sua senha atual", + "newPassword": "Nova senha", + "enterNewPassword": "Digite sua nova senha", + "confirmNewPassword": "Confirmar nova senha", + "enterConfirmNewPassword": "Digite novamente sua nova senha", + "forgotPassword": "Esqueceu sua senha?", + "createNewPassword": "Crie uma nova senha", + "enterPasswordAgain": "Digite a senha novamente", + "passwordRequirements": "A senha deve conter:", + "minCharacters": "Pelo menos 8 caracteres", + "uppercaseLetter": "Uma letra maiúscula", + "lowercaseLetter": "Uma letra minúscula", + "digit": "Um número", + "specialCharacter": "Um caractere especial (!@#$%^&*)", + "updatePassword": "Atualizar senha", + "currentPlan": "Plano atual", + "freePlan": "Plano gratuito", + "subscribe": "Assinar", + "startFreeTrial": "Iniciar teste grátis", + "cancelPlan": "Cancelar plano", + "planChange": "Mudança de plano", + "planChangeInstructions": "Para alterar seu plano, entre em contato conosco:", + "contactUs": "Fale conosco", + "changeUsername": "Alterar nome de usuário", + "newUsername": "Novo nome de usuário", + "confirmDeleteAccount": "Tem certeza que deseja excluir sua conta?", + "deleteAccountWarning": "Essa ação não pode ser desfeita. Isso excluirá permanentemente sua conta e removerá todos os seus dados de nossos servidores.", + "confirmDeleteInstructions": "Digite 'excluir conta' para confirmar", + "cancel": "Cancelar", + "exploreFeatures": "Explorar recursos", + "payment": "Pagamento", + "changePlan": "Trocar plano", + "annualDiscount": "Desconto anual", + "save20": "Economize 20%", + "discountCoupon": "Cupom de desconto", + "enterCoupon": "Digite o cupom", + "apply": "Aplicar", + "invalidCoupon": "Cupom inválido", + "trialPeriod": "Você terá 7 dias de teste grátis antes de ser cobrado.", + "subtotal": "Subtotal", + "couponEffect": "A partir do {{couponDuration}}º {{planInterval}}{{trialDay}}, você será cobrado {{totalAmount}}/{{planInterval2}}.", + "andTrialDay": " e após o período de teste,", + "paymentDetails": "Detalhes do pagamento", + "congratulations": "Parabéns!", + "paymentSuccessful": "Seu pagamento foi processado com sucesso. Você receberá um e-mail com os detalhes da sua compra.", + "continueSettings": "Continuar nas configurações", + "goToHomepage": "Ir para a página inicial", + "paymentFailed": "Falha no pagamento", + "paymentError": "Ocorreu um erro ao processar seu pagamento. Por favor, tente novamente ou entre em contato com o suporte:", + "understood": "Entendi", + "comparePlans": "Comparar planos", + "resources": "Recursos", + "allDBFreeResources": "Todos os recursos do BD Grátis, mais:", + "allDBProResources": "Todos os recursos do BD Pro, mais:", + "active": "Ativo", + "DBFree": "BD Grátis", + "DBFreeSubtitle": "Para você descobrir o potencial da plataforma de dados", + "DBPro": "BD Pro", + "DBProSubtitle": "Para você ter acesso aos dados mais atualizados", + "DBEnterprise": "BD Empresas", + "DBEnterpriseSubtitle": "Para sua empresa ganhar tempo e qualidade em decisões", + "perMonth": "/mês", + "annualBillingMessage": "{{price}} cobrado uma vez no ano", + "includes": "Inclui", + "doesNotInclude": "Não inclui", + "processedTables": "Tabelas tratadas", + "integratedData": "Dados integrados", + "integratedDataTooltip": "Nossa metodologia de padronização e compatibilização de dados permite que você cruze tabelas de diferentes instituições e temas de maneira simplificada.", + "updatedLowFrequencyData": "Dados de baixa frequência atualizados", + "cloudAccess": "Acesso em nuvem", + "sqlPythonRAccess": "Acesso via SQL, Python e R", + "biIntegration": "Integração com ferramentas BI", + "directDownloadLimit": "Download direto até 100 MB", + "downloadLimitTooltip": "Esse limite não se aplica ao acesso via SQL, Python e R.", + "proPlan": "BD Pro", + "allFreePlanResources": "Todos os recursos do plano gratuito, mais:", + "dozensOfHighFrequencyDatasets": "Dezenas de bases de alta frequência atualizadas", + "companyReferenceTable": "Tabela de referência de empresas com informações atualizadas", + "directDownloadLimitPro": "Download direto até 1 GB (~80% das tabelas da plataforma)", + "accessFor10Accounts": "Acesso para 10 usuários", + "prioritySupport": "Suporte prioritário via email e Discord", + "downloadLimitProTooltip": "Tabelas maiores que 1 GB não estão disponíveis para download parcial ou completo. Esse limite não se aplica ao acesso via SQL, Python e R.", + "viewAllAndComparePlans": "Veja tudo e compare os planos", + "passwordChangedSuccessfully": "Senha alterada com sucesso!", + "useNewPassword": "Use sua nova senha para fazer login da próxima vez.", + "confirmEmailAddress": "Confirme seu endereço de e-mail", + "checkInboxAndFollowInstructions": "Verifique sua caixa de entrada e siga as instruções enviadas no e-mail para completar a alteração.", + "enterNewEmail": "Digite seu novo endereço de e-mail", + "newEmail": "Novo e-mail", + "enterEmail": "Digite seu e-mail", + "sendEmail": "Enviar e-mail", + "updateUsername": "Atualizar nome de usuário", + "exportAccountData": "Exportar dados da conta", + "dataStorageInfo": "Saiba como seus dados são armazenados em nossos Termos de Uso e Políticas de Privacidade. Para exportar os dados da sua conta, entre em contato conosco.", + "exportDataInstructions": "Para exportar seus dados, entre em contato conosco:", + "deleteMyAccount": "Excluir minha conta", + "accountAccessWarning": "Ao excluir sua conta, você perderá acesso a todos os seus dados e informações.", + "usernameAlreadyExists": "Nome de usuário já existe" + }, + "activate": { + "accountActive": "Conta ativa", + "congratulations": "Parabéns! Sua conta foi ativada com sucesso. Agora você faz parte da nossa comunidade.", + "thankYou": "Agradecemos por se juntar a nós. Estamos aqui para ajudar no que precisar.", + "welcome": "Bem-vindo(a)!", + "loginToAccount": "Logar na conta", + "somethingWentWrong": "Algo deu errado", + "activationProblem": "Lamentamos informar que ocorreu um problema durante a ativação da sua conta. Pedimos desculpas pela inconveniência.", + "contactUs": "Entrar em contato" + }, + "checkEmail": { + "confirmEmail": "Confirme seu endereço de e-mail", + "sentConfirmation": "Enviamos uma confirmação de e-mail para", + "checkInbox": "Confira sua caixa de entrada e siga as instruções enviadas no e-mail para completar o cadastro.", + "resendEmail": "Reenviar e-mail", + "waitSeconds": "Espere {{count}} segundos..." + }, + "passwordRecovery": { + "title": "Redefina sua senha", + "titleConfirmed": "Redefina sua nova senha", + "description": "Insira o endereço de e-mail que você usou para cadastrar sua conta. Enviaremos as instruções para você redefinir sua senha.", + "emailLabel": "E-mail", + "emailPlaceholder": "Insira seu e-mail", + "invalidEmail": "Endereço de e-mail inválido.", + "sendResetEmail": "Enviar e-mail de redefinição", + "waitSeconds": "Espere {{count}} segundos...", + "needHelp": "Se ainda precisar de ajuda,", + "contactUs": "entre em contato", + "newPasswordLabel": "Nova Senha", + "newPasswordPlaceholder": "Crie uma nova senha", + "confirmPasswordLabel": "Confirme a nova senha", + "confirmPasswordPlaceholder": "Insira a senha novamente", + "updatePassword": "Atualizar senha", + "passwordRequirements": "Certifique-se que a senha tenha no mínimo:", + "passwordRequirementChars": "8 caracteres", + "passwordRequirementUppercase": "Uma letra maiúscula", + "passwordRequirementLowercase": "Uma letra minúscula", + "passwordRequirementDigit": "Um dígito", + "passwordRequirementSpecial": "Um caractere especial, dentre ! @ # ? ! % & *", + "confirmPasswordRequired": "Confirmar a senha é necessário", + "passwordNoSpaces": "As senhas inseridas não podem conter espaçamentos.", + "passwordMismatch": "A senha inserida não coincide com a senha criada no campo acima. Por favor, verifique se não há erros de digitação e tente novamente.", + "passwordRequired": "Por favor, insira a senha." + } +} \ No newline at end of file