mirror of
https://github.com/kremalicious/umami.git
synced 2024-12-18 15:23:38 +01:00
commit
30ebf7b266
@ -29,7 +29,7 @@ export default function DropDown({
|
|||||||
}
|
}
|
||||||
|
|
||||||
useDocumentClick(e => {
|
useDocumentClick(e => {
|
||||||
if (!ref.current.contains(e.target)) {
|
if (!ref.current?.contains(e.target)) {
|
||||||
setShowMenu(false);
|
setShowMenu(false);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -30,7 +30,7 @@ export default function MenuButton({
|
|||||||
}
|
}
|
||||||
|
|
||||||
useDocumentClick(e => {
|
useDocumentClick(e => {
|
||||||
if (!ref.current.contains(e.target)) {
|
if (!ref.current?.contains(e.target)) {
|
||||||
setShowMenu(false);
|
setShowMenu(false);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -10,12 +10,23 @@ import Arrow from 'assets/arrow-right.svg';
|
|||||||
import styles from './WebsiteHeader.module.css';
|
import styles from './WebsiteHeader.module.css';
|
||||||
|
|
||||||
export default function WebsiteHeader({ websiteId, title, domain, showLink = false }) {
|
export default function WebsiteHeader({ websiteId, title, domain, showLink = false }) {
|
||||||
return (
|
const header = showLink ? (
|
||||||
<PageHeader>
|
<>
|
||||||
<div className={styles.title}>
|
<Favicon domain={domain} />
|
||||||
|
<Link href="/website/[...id]" as={`/website/${websiteId}/${title}`}>
|
||||||
|
{title}
|
||||||
|
</Link>
|
||||||
|
</>
|
||||||
|
) : (
|
||||||
|
<div>
|
||||||
<Favicon domain={domain} />
|
<Favicon domain={domain} />
|
||||||
{title}
|
{title}
|
||||||
</div>
|
</div>
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<PageHeader>
|
||||||
|
<div className={styles.title}>{header}</div>
|
||||||
<ActiveUsers className={styles.active} websiteId={websiteId} />
|
<ActiveUsers className={styles.active} websiteId={websiteId} />
|
||||||
<ButtonLayout align="right">
|
<ButtonLayout align="right">
|
||||||
<RefreshButton websiteId={websiteId} />
|
<RefreshButton websiteId={websiteId} />
|
||||||
|
@ -29,8 +29,7 @@ export default function AccountSettings() {
|
|||||||
|
|
||||||
const Checkmark = ({ is_admin }) => (is_admin ? <Icon icon={<Check />} size="medium" /> : null);
|
const Checkmark = ({ is_admin }) => (is_admin ? <Icon icon={<Check />} size="medium" /> : null);
|
||||||
|
|
||||||
const DashboardLink = row =>
|
const DashboardLink = row => (
|
||||||
row.is_admin ? null : (
|
|
||||||
<Link href={`/dashboard/${row.user_id}/${row.username}`}>
|
<Link href={`/dashboard/${row.user_id}/${row.username}`}>
|
||||||
<a>
|
<a>
|
||||||
<Icon icon={<LinkIcon />} />
|
<Icon icon={<LinkIcon />} />
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
.menu {
|
.menu {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-flow: row wrap;
|
flex-flow: row wrap;
|
||||||
min-width: 500px;
|
min-width: 560px;
|
||||||
max-width: 100vw;
|
max-width: 100vw;
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
}
|
}
|
||||||
|
@ -32,7 +32,7 @@
|
|||||||
"label.login": "Zaloguj sie",
|
"label.login": "Zaloguj sie",
|
||||||
"label.logout": "Wyloguj",
|
"label.logout": "Wyloguj",
|
||||||
"label.more": "Więcej",
|
"label.more": "Więcej",
|
||||||
"label.name": "Name",
|
"label.name": "Nazwa",
|
||||||
"label.new-password": "Nowe hasło",
|
"label.new-password": "Nowe hasło",
|
||||||
"label.password": "Hasło",
|
"label.password": "Hasło",
|
||||||
"label.passwords-dont-match": "Hasła się nie zgadzają",
|
"label.passwords-dont-match": "Hasła się nie zgadzają",
|
||||||
|
99
lang/pt-BR.json
Normal file
99
lang/pt-BR.json
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
{
|
||||||
|
"label.accounts": "Contas",
|
||||||
|
"label.add-account": "Adicionar conta",
|
||||||
|
"label.add-website": "Adicionar site",
|
||||||
|
"label.administrator": "Administrador",
|
||||||
|
"label.all": "Todos",
|
||||||
|
"label.all-websites": "Todos os sites",
|
||||||
|
"label.back": "Voltar",
|
||||||
|
"label.cancel": "Cancelar",
|
||||||
|
"label.change-password": "Alterar a senha",
|
||||||
|
"label.confirm-password": "Confirme a nova senha",
|
||||||
|
"label.copy-to-clipboard": "Copiar para a área de transferência",
|
||||||
|
"label.current-password": "Senha atual",
|
||||||
|
"label.custom-range": "Intervalo personalizado",
|
||||||
|
"label.dashboard": "Painel",
|
||||||
|
"label.date-range": "Intervalo de datas",
|
||||||
|
"label.default-date-range": "Intervalo de datas predefinido",
|
||||||
|
"label.delete": "Remover",
|
||||||
|
"label.delete-account": "Remover conta",
|
||||||
|
"label.delete-website": "Remover site",
|
||||||
|
"label.dismiss": "Dispensar",
|
||||||
|
"label.domain": "Domínio",
|
||||||
|
"label.edit": "Editar",
|
||||||
|
"label.edit-account": "Editar conta",
|
||||||
|
"label.edit-website": "Editar site",
|
||||||
|
"label.enable-share-url": "Ativar link de compartilhamento",
|
||||||
|
"label.invalid": "Inválido",
|
||||||
|
"label.invalid-domain": "Domínio inválido",
|
||||||
|
"label.last-days": "Últimos {x} dias",
|
||||||
|
"label.last-hours": "Últimas {x} horas",
|
||||||
|
"label.logged-in-as": "Sessão iniciada como {username}",
|
||||||
|
"label.login": "Iniciar sessão",
|
||||||
|
"label.logout": "Sair",
|
||||||
|
"label.more": "Mais",
|
||||||
|
"label.name": "Nome",
|
||||||
|
"label.new-password": "Nova senha",
|
||||||
|
"label.password": "Senha",
|
||||||
|
"label.passwords-dont-match": "As senhas não correspondem",
|
||||||
|
"label.profile": "Perfil",
|
||||||
|
"label.realtime": "Tempo real",
|
||||||
|
"label.realtime-logs": "Relatório em tempo real",
|
||||||
|
"label.refresh": "Atualizar",
|
||||||
|
"label.required": "Obrigatório",
|
||||||
|
"label.reset": "Redefinir",
|
||||||
|
"label.save": "Salvar",
|
||||||
|
"label.settings": "Configurações",
|
||||||
|
"label.share-url": "Link de compartilhamento",
|
||||||
|
"label.single-day": "Dia específico",
|
||||||
|
"label.this-month": "Este mês",
|
||||||
|
"label.this-week": "Esta semana",
|
||||||
|
"label.this-year": "Este ano",
|
||||||
|
"label.timezone": "Fuso horário",
|
||||||
|
"label.today": "Hoje",
|
||||||
|
"label.tracking-code": "Código de rastreamento",
|
||||||
|
"label.unknown": "Desconhecido",
|
||||||
|
"label.username": "Nome de usuário",
|
||||||
|
"label.view-details": "Ver detalhes",
|
||||||
|
"label.websites": "Sites",
|
||||||
|
"message.active-users": "{x} {x, plural, one {visitante} other {visitantes}} neste momento",
|
||||||
|
"message.confirm-delete": "Deseja realmente remover {target}?",
|
||||||
|
"message.copied": "Copiado!",
|
||||||
|
"message.delete-warning": "Todos os dados associados também serão eliminados.",
|
||||||
|
"message.failure": "Ocorreu um erro.",
|
||||||
|
"message.get-share-url": "Obter link de compartilhamento",
|
||||||
|
"message.get-tracking-code": "Obter código de rastreamento",
|
||||||
|
"message.go-to-settings": "Ir para as configurações",
|
||||||
|
"message.incorrect-username-password": "O nome de usuário e/ou senha está incorreto.",
|
||||||
|
"message.log.visitor": "Visitante de {country} usando {browser} no {device} {os}",
|
||||||
|
"message.new-version-available": "Uma nova versão de umami {version} está disponível!",
|
||||||
|
"message.no-data-available": "Sem dados disponíveis.",
|
||||||
|
"message.no-websites-configured": "Nenhum site foi configurado ainda.",
|
||||||
|
"message.page-not-found": "Página não encontrada.",
|
||||||
|
"message.powered-by": "Distribuído por {name}",
|
||||||
|
"message.save-success": "Salvo com sucesso.",
|
||||||
|
"message.share-url": "Este é o link público de compartilhamento para {target}.",
|
||||||
|
"message.track-stats": "Para gerar estatística para {target}, coloque o seguinte código no {head} do html do seu site.",
|
||||||
|
"message.type-delete": "Escreva {delete} abaixo para continuar.",
|
||||||
|
"metrics.actions": "Ações",
|
||||||
|
"metrics.average-visit-time": "Tempo médio da visita",
|
||||||
|
"metrics.bounce-rate": "Taxa de rejeição",
|
||||||
|
"metrics.browsers": "Navegadores",
|
||||||
|
"metrics.countries": "Países",
|
||||||
|
"metrics.device.desktop": "Computador",
|
||||||
|
"metrics.device.laptop": "Notebook",
|
||||||
|
"metrics.device.mobile": "Celular",
|
||||||
|
"metrics.device.tablet": "Tablet",
|
||||||
|
"metrics.devices": "Dispositivos",
|
||||||
|
"metrics.events": "Eventos",
|
||||||
|
"metrics.filter.combined": "Combinado",
|
||||||
|
"metrics.filter.domain-only": "Apenas domínio",
|
||||||
|
"metrics.filter.raw": "Dados brutos",
|
||||||
|
"metrics.operating-systems": "Sistemas operacionais",
|
||||||
|
"metrics.page-views": "Visualizações de página",
|
||||||
|
"metrics.pages": "Páginas",
|
||||||
|
"metrics.referrers": "Referências",
|
||||||
|
"metrics.unique-visitors": "Visitantes únicos",
|
||||||
|
"metrics.views": "Visualizações",
|
||||||
|
"metrics.visitors": "Visitantes"
|
||||||
|
}
|
@ -116,7 +116,7 @@ export const BROWSERS = {
|
|||||||
edge: 'Edge',
|
edge: 'Edge',
|
||||||
'edge-ios': 'Edge (iOS)',
|
'edge-ios': 'Edge (iOS)',
|
||||||
yandexbrowser: 'Yandex',
|
yandexbrowser: 'Yandex',
|
||||||
kakaotalk: 'KKaoTalk',
|
kakaotalk: 'KaKaoTalk',
|
||||||
samsung: 'Samsung',
|
samsung: 'Samsung',
|
||||||
silk: 'Silk',
|
silk: 'Silk',
|
||||||
miui: 'MIUI',
|
miui: 'MIUI',
|
||||||
|
@ -17,6 +17,7 @@ import {
|
|||||||
nl,
|
nl,
|
||||||
pl,
|
pl,
|
||||||
pt,
|
pt,
|
||||||
|
ptBR,
|
||||||
ro,
|
ro,
|
||||||
ru,
|
ru,
|
||||||
sv,
|
sv,
|
||||||
@ -42,6 +43,7 @@ import svMessages from 'lang-compiled/sv-SE.json';
|
|||||||
import grMessages from 'lang-compiled/el-GR.json';
|
import grMessages from 'lang-compiled/el-GR.json';
|
||||||
import foMessages from 'lang-compiled/fo-FO.json';
|
import foMessages from 'lang-compiled/fo-FO.json';
|
||||||
import ptMessages from 'lang-compiled/pt-PT.json';
|
import ptMessages from 'lang-compiled/pt-PT.json';
|
||||||
|
import ptBRMessages from 'lang-compiled/pt-BR.json';
|
||||||
import roMessages from 'lang-compiled/ro-RO.json';
|
import roMessages from 'lang-compiled/ro-RO.json';
|
||||||
import nbNOMessages from 'lang-compiled/nb-NO.json';
|
import nbNOMessages from 'lang-compiled/nb-NO.json';
|
||||||
import idMessages from 'lang-compiled/id-ID.json';
|
import idMessages from 'lang-compiled/id-ID.json';
|
||||||
@ -71,6 +73,7 @@ export const messages = {
|
|||||||
'el-GR': grMessages,
|
'el-GR': grMessages,
|
||||||
'fo-FO': foMessages,
|
'fo-FO': foMessages,
|
||||||
'pt-PT': ptMessages,
|
'pt-PT': ptMessages,
|
||||||
|
'pt-BR': ptBRMessages,
|
||||||
'ro-RO': roMessages,
|
'ro-RO': roMessages,
|
||||||
'nb-NO': nbNOMessages,
|
'nb-NO': nbNOMessages,
|
||||||
'id-ID': idMessages,
|
'id-ID': idMessages,
|
||||||
@ -101,6 +104,7 @@ export const dateLocales = {
|
|||||||
'el-GR': el,
|
'el-GR': el,
|
||||||
'fo-FO': da,
|
'fo-FO': da,
|
||||||
'pt-PT': pt,
|
'pt-PT': pt,
|
||||||
|
'pt-BR': ptBR,
|
||||||
'ro-RO': ro,
|
'ro-RO': ro,
|
||||||
'nb-NO': nb,
|
'nb-NO': nb,
|
||||||
'id-ID': id,
|
'id-ID': id,
|
||||||
@ -135,6 +139,7 @@ export const menuOptions = [
|
|||||||
{ label: 'Norsk Bokmål', value: 'nb-NO', display: 'nb' },
|
{ label: 'Norsk Bokmål', value: 'nb-NO', display: 'nb' },
|
||||||
{ label: 'Polski', value: 'pl-PL', display: 'pl' },
|
{ label: 'Polski', value: 'pl-PL', display: 'pl' },
|
||||||
{ label: 'Português', value: 'pt-PT', display: 'pt' },
|
{ label: 'Português', value: 'pt-PT', display: 'pt' },
|
||||||
|
{ label: 'Português do Brasil', value: 'pt-BR', display: 'pt-BR' },
|
||||||
{ label: 'Русский', value: 'ru-RU', display: 'ru' },
|
{ label: 'Русский', value: 'ru-RU', display: 'ru' },
|
||||||
{ label: 'Română', value: 'ro-RO', display: 'ro' },
|
{ label: 'Română', value: 'ro-RO', display: 'ro' },
|
||||||
{ label: 'Suomi', value: 'fi-FI', display: 'fi' },
|
{ label: 'Suomi', value: 'fi-FI', display: 'fi' },
|
||||||
|
24
package.json
24
package.json
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "umami",
|
"name": "umami",
|
||||||
"version": "1.11.0",
|
"version": "1.12.0",
|
||||||
"description": "A simple, fast, website analytics alternative to Google Analytics. ",
|
"description": "A simple, fast, website analytics alternative to Google Analytics. ",
|
||||||
"author": "Mike Cao <mike@mikecao.com>",
|
"author": "Mike Cao <mike@mikecao.com>",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
@ -56,7 +56,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@prisma/client": "2.14.0",
|
"@prisma/client": "2.15.0",
|
||||||
"@reduxjs/toolkit": "^1.5.0",
|
"@reduxjs/toolkit": "^1.5.0",
|
||||||
"bcrypt": "^5.0.0",
|
"bcrypt": "^5.0.0",
|
||||||
"chalk": "^4.1.0",
|
"chalk": "^4.1.0",
|
||||||
@ -69,17 +69,17 @@
|
|||||||
"detect-browser": "^5.2.0",
|
"detect-browser": "^5.2.0",
|
||||||
"dotenv": "^8.2.0",
|
"dotenv": "^8.2.0",
|
||||||
"formik": "^2.2.6",
|
"formik": "^2.2.6",
|
||||||
"immer": "^8.0.0",
|
"immer": "^8.0.1",
|
||||||
"is-localhost-ip": "^1.4.0",
|
"is-localhost-ip": "^1.4.0",
|
||||||
"isbot-fast": "^1.2.0",
|
"isbot-fast": "^1.2.0",
|
||||||
"jose": "2.0.3",
|
"jose": "2.0.3",
|
||||||
"maxmind": "^4.3.1",
|
"maxmind": "^4.3.1",
|
||||||
"moment-timezone": "^0.5.32",
|
"moment-timezone": "^0.5.32",
|
||||||
"next": "^10.0.5",
|
"next": "^10.0.6",
|
||||||
"prompts": "2.4.0",
|
"prompts": "2.4.0",
|
||||||
"react": "^17.0.1",
|
"react": "^17.0.1",
|
||||||
"react-dom": "^17.0.1",
|
"react-dom": "^17.0.1",
|
||||||
"react-intl": "^5.10.16",
|
"react-intl": "^5.12.0",
|
||||||
"react-redux": "^7.2.2",
|
"react-redux": "^7.2.2",
|
||||||
"react-simple-maps": "^2.3.0",
|
"react-simple-maps": "^2.3.0",
|
||||||
"react-spring": "^8.0.27",
|
"react-spring": "^8.0.27",
|
||||||
@ -97,21 +97,21 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@formatjs/cli": "^2.13.16",
|
"@formatjs/cli": "^2.13.16",
|
||||||
"@prisma/cli": "2.14.0",
|
"@prisma/cli": "2.15.0",
|
||||||
"@rollup/plugin-buble": "^0.21.3",
|
"@rollup/plugin-buble": "^0.21.3",
|
||||||
"@rollup/plugin-node-resolve": "^11.0.1",
|
"@rollup/plugin-node-resolve": "^11.1.1",
|
||||||
"@rollup/plugin-replace": "^2.3.4",
|
"@rollup/plugin-replace": "^2.3.4",
|
||||||
"@svgr/webpack": "^5.5.0",
|
"@svgr/webpack": "^5.5.0",
|
||||||
"cross-env": "^7.0.3",
|
"cross-env": "^7.0.3",
|
||||||
"del": "^6.0.0",
|
"del": "^6.0.0",
|
||||||
"dotenv-cli": "^4.0.0",
|
"dotenv-cli": "^4.0.0",
|
||||||
"eslint": "^7.17.0",
|
"eslint": "^7.19.0",
|
||||||
"eslint-config-prettier": "^7.1.0",
|
"eslint-config-prettier": "^7.2.0",
|
||||||
"eslint-plugin-prettier": "^3.3.1",
|
"eslint-plugin-prettier": "^3.3.1",
|
||||||
"eslint-plugin-react": "^7.22.0",
|
"eslint-plugin-react": "^7.22.0",
|
||||||
"eslint-plugin-react-hooks": "^4.2.0",
|
"eslint-plugin-react-hooks": "^4.2.0",
|
||||||
"extract-react-intl-messages": "^4.1.1",
|
"extract-react-intl-messages": "^4.1.1",
|
||||||
"husky": "^4.3.7",
|
"husky": "^4.3.8",
|
||||||
"lint-staged": "^10.5.3",
|
"lint-staged": "^10.5.3",
|
||||||
"loadtest": "5.1.2",
|
"loadtest": "5.1.2",
|
||||||
"npm-run-all": "^4.1.5",
|
"npm-run-all": "^4.1.5",
|
||||||
@ -120,10 +120,10 @@
|
|||||||
"postcss-preset-env": "^6.7.0",
|
"postcss-preset-env": "^6.7.0",
|
||||||
"prettier": "^2.2.1",
|
"prettier": "^2.2.1",
|
||||||
"prettier-eslint": "^12.0.0",
|
"prettier-eslint": "^12.0.0",
|
||||||
"rollup": "^2.36.1",
|
"rollup": "^2.38.3",
|
||||||
"rollup-plugin-hashbang": "^2.2.2",
|
"rollup-plugin-hashbang": "^2.2.2",
|
||||||
"rollup-plugin-terser": "^7.0.2",
|
"rollup-plugin-terser": "^7.0.2",
|
||||||
"stylelint": "^13.8.0",
|
"stylelint": "^13.9.0",
|
||||||
"stylelint-config-css-modules": "^2.2.0",
|
"stylelint-config-css-modules": "^2.2.0",
|
||||||
"stylelint-config-prettier": "^8.0.1",
|
"stylelint-config-prettier": "^8.0.1",
|
||||||
"stylelint-config-recommended": "^3.0.0",
|
"stylelint-config-recommended": "^3.0.0",
|
||||||
|
1
public/country/pt-BR.json
Normal file
1
public/country/pt-BR.json
Normal file
File diff suppressed because one or more lines are too long
@ -51,7 +51,6 @@ const options = {
|
|||||||
const message = JSON.stringify(mockPageView());
|
const message = JSON.stringify(mockPageView());
|
||||||
options.headers['Content-Length'] = message.length;
|
options.headers['Content-Length'] = message.length;
|
||||||
options.headers['Content-Type'] = 'application/json';
|
options.headers['Content-Type'] = 'application/json';
|
||||||
options.headers['user-agent'] = 'User-Agent: Mozilla/5.0 LoadTest';
|
|
||||||
options.body = message;
|
options.body = message;
|
||||||
options.path = '/api/collect';
|
options.path = '/api/collect';
|
||||||
const request = client(options, callback);
|
const request = client(options, callback);
|
||||||
@ -95,7 +94,6 @@ loadtest.loadTest(options, (error, results) => {
|
|||||||
if (results.errorCodes && Object.keys(results.errorCodes).length) {
|
if (results.errorCodes && Object.keys(results.errorCodes).length) {
|
||||||
console.log(chalk.redBright('*'), chalk.red('Error Codes:'), results.errorCodes);
|
console.log(chalk.redBright('*'), chalk.red('Error Codes:'), results.errorCodes);
|
||||||
}
|
}
|
||||||
// console.log(results);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -121,6 +119,9 @@ function mockPageView(
|
|||||||
|
|
||||||
// If you pass in --verbose, this function is called
|
// If you pass in --verbose, this function is called
|
||||||
function statusCallback(error, result, latency) {
|
function statusCallback(error, result, latency) {
|
||||||
|
if (error) {
|
||||||
|
return console.error(chalk.redBright(error));
|
||||||
|
}
|
||||||
console.log(
|
console.log(
|
||||||
chalk.yellowBright(`\n## req #${result.requestIndex + 1} of ${latency.totalRequests}`),
|
chalk.yellowBright(`\n## req #${result.requestIndex + 1} of ${latency.totalRequests}`),
|
||||||
);
|
);
|
||||||
|
@ -133,6 +133,8 @@ import { removeTrailingSlash } from '../lib/url';
|
|||||||
/* Handle history changes */
|
/* Handle history changes */
|
||||||
|
|
||||||
const handlePush = (state, title, url) => {
|
const handlePush = (state, title, url) => {
|
||||||
|
if (!url) return;
|
||||||
|
|
||||||
removeEvents();
|
removeEvents();
|
||||||
|
|
||||||
currentRef = currentUrl;
|
currentRef = currentUrl;
|
||||||
@ -144,7 +146,9 @@ import { removeTrailingSlash } from '../lib/url';
|
|||||||
currentUrl = newUrl;
|
currentUrl = newUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (currentUrl !== currentRef) {
|
||||||
trackView(currentUrl, currentRef);
|
trackView(currentUrl, currentRef);
|
||||||
|
}
|
||||||
|
|
||||||
setTimeout(addEvents, 300);
|
setTimeout(addEvents, 300);
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user