Merge pull request #2203 from umami-software/dev

v2.5.0
This commit is contained in:
Mike Cao 2023-08-17 18:54:26 -10:00 committed by GitHub
commit 7be4d56bf7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
277 changed files with 21987 additions and 11267 deletions

View File

@ -50,7 +50,8 @@
"@next/next/no-img-element": "off",
"@typescript-eslint/no-empty-function": "off",
"@typescript-eslint/no-explicit-any": "off",
"@typescript-eslint/no-var-requires": "off"
"@typescript-eslint/no-var-requires": "off",
"@typescript-eslint/no-empty-interface": "off"
},
"globals": {
"React": "writable"

View File

@ -19,4 +19,6 @@ jobs:
close-issue-message: 'This issue was closed because it has been inactive for 7 days since being marked as stale.'
days-before-pr-stale: -1
days-before-pr-close: -1
operations-per-run: 200
ascending: true
repo-token: ${{ secrets.GITHUB_TOKEN }}

1
assets/magnet.svg Normal file
View File

@ -0,0 +1 @@
<svg height="512" viewBox="0 0 508.467 508.467" width="512" xmlns="http://www.w3.org/2000/svg"><g><path d="m426.815 239.006c-11.722-11.724-30.702-11.729-42.427-.001-65.928 65.929 49.291-49.292-116.718 116.718-53.811 53.809-142.478 19.197-140.68-54.511.547-22.415 9.826-43.738 26.129-60.041l116.717-116.717c11.724-11.722 11.728-30.702 0-42.427l-46.668-46.669c-11.725-11.725-30.702-11.726-42.427 0-16.642 16.643-102.078 102.078-120.112 120.112-39.05 39.05-60.582 90.97-60.629 146.195-.093 110.827 88.182 206.288 206.244 206.394 56.778 0 109.204-21.924 148.29-61.01l118.948-118.948c11.724-11.722 11.728-30.702 0-42.427zm-224.861-182.434 46.669 46.669-58.455 58.456-46.669-46.669zm131.367 369.264c-69.043 69.043-182.868 70.02-251.708.933-68.763-69.009-68.66-181.196.229-250.086l40.443-40.443 46.669 46.669-37.049 37.049c-45.115 45.112-46.916 116.85-3.395 160.371 43.279 43.279 115.221 41.756 160.372-3.394l37.049-37.049 46.669 46.669zm60.494-60.493-46.669-46.669 58.456-58.456 46.669 46.669z"/><path d="m379.357 95.099c15.199 3.839 30.418 19.07 34.336 34.192 2.089 8.058 10.303 12.828 18.283 10.758 8.02-2.078 12.836-10.264 10.758-18.283-6.651-25.662-30.176-49.223-56.03-55.753-8.032-2.027-16.188 2.838-18.217 10.869-2.029 8.032 2.837 16.189 10.87 18.217z"/><path d="m507.984 102.124c-12.016-46.375-55.215-89.504-101.745-101.256-8.032-2.027-16.188 2.838-18.217 10.869-2.029 8.032 2.838 16.188 10.87 18.217 35.882 9.063 70.769 43.871 80.051 79.695 2.088 8.058 10.304 12.828 18.283 10.758 8.02-2.078 12.836-10.263 10.758-18.283z"/></g></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1,45 @@
import styles from './Pager.module.css';
import { Button, Flexbox, Icon, Icons } from 'react-basics';
import useMessages from 'hooks/useMessages';
export function Pager({ page, pageSize, count, onPageChange }) {
const { formatMessage, labels } = useMessages();
const maxPage = Math.ceil(count / pageSize);
const lastPage = page === maxPage;
const firstPage = page === 1;
if (count === 0) {
return null;
}
const handlePageChange = value => {
const nextPage = page + value;
if (nextPage > 0 && nextPage <= maxPage) {
onPageChange(nextPage);
}
};
if (maxPage === 1) {
return null;
}
return (
<Flexbox justifyContent="center" className={styles.container}>
<Button onClick={() => handlePageChange(-1)} disabled={firstPage}>
<Icon rotate={90}>
<Icons.ChevronDown />
</Icon>
</Button>
<Flexbox alignItems="center" className={styles.text}>
{formatMessage(labels.pageOf, { current: page, total: maxPage })}
</Flexbox>
<Button onClick={() => handlePageChange(1)} disabled={lastPage}>
<Icon rotate={270}>
<Icons.ChevronDown />
</Icon>
</Button>
</Flexbox>
);
}
export default Pager;

View File

@ -0,0 +1,7 @@
.container {
margin-top: 20px;
}
.text {
margin: 0 16px;
}

View File

@ -1,37 +1,99 @@
import { Table, TableHeader, TableBody, TableRow, TableCell, TableColumn } from 'react-basics';
import EmptyPlaceholder from 'components/common/EmptyPlaceholder';
import useMessages from 'hooks/useMessages';
import { useState } from 'react';
import {
SearchField,
Table,
TableBody,
TableCell,
TableColumn,
TableHeader,
TableRow,
} from 'react-basics';
import styles from './SettingsTable.module.css';
import Pager from 'components/common/Pager';
export function SettingsTable({
columns = [],
data,
children,
cellRender,
showSearch,
showPaging,
onFilterChange,
onPageChange,
onPageSizeChange,
filterValue,
}) {
const { formatMessage, messages } = useMessages();
const [filter, setFilter] = useState(filterValue);
const { data: value, page, count, pageSize } = data;
const handleFilterChange = value => {
setFilter(value);
onFilterChange(value);
};
export function SettingsTable({ columns = [], data = [], children, cellRender }) {
return (
<Table columns={columns} rows={data}>
<TableHeader className={styles.header}>
{(column, index) => {
return (
<TableColumn key={index} className={styles.cell} style={columns[index].style}>
{column.label}
</TableColumn>
);
}}
</TableHeader>
<TableBody className={styles.body}>
{(row, keys, rowIndex) => {
row.action = children(row, keys, rowIndex);
<>
{showSearch && (
<SearchField
onChange={handleFilterChange}
delay={1000}
value={filter}
autoFocus={true}
placeholder="Search"
style={{ maxWidth: '300px', marginBottom: '10px' }}
/>
)}
{value.length === 0 && filterValue && (
<EmptyPlaceholder message={formatMessage(messages.noResultsFound)}></EmptyPlaceholder>
)}
{value.length > 0 && (
<Table columns={columns} rows={value}>
<TableHeader className={styles.header}>
{(column, index) => {
return (
<TableColumn key={index} className={styles.cell} style={columns[index].style}>
{column.label}
</TableColumn>
);
}}
</TableHeader>
<TableBody className={styles.body}>
{(row, keys, rowIndex) => {
row.action = children(row, keys, rowIndex);
return (
<TableRow key={rowIndex} data={row} keys={keys} className={styles.row}>
{(data, key, colIndex) => {
return (
<TableCell key={colIndex} className={styles.cell} style={columns[colIndex].style}>
<label className={styles.label}>{columns[colIndex].label}</label>
{cellRender ? cellRender(row, data, key, colIndex) : data[key]}
</TableCell>
);
}}
</TableRow>
);
}}
</TableBody>
</Table>
return (
<TableRow key={rowIndex} data={row} keys={keys} className={styles.row}>
{(data, key, colIndex) => {
return (
<TableCell
key={colIndex}
className={styles.cell}
style={columns[colIndex].style}
>
<label className={styles.label}>{columns[colIndex].label}</label>
{cellRender ? cellRender(row, data, key, colIndex) : data[key]}
</TableCell>
);
}}
</TableRow>
);
}}
</TableBody>
{showPaging && (
<Pager
page={page}
pageSize={pageSize}
count={count}
onPageChange={onPageChange}
onPageSizeChange={onPageSizeChange}
/>
)}
</Table>
)}
</>
);
}

View File

@ -11,6 +11,7 @@ import Gear from 'assets/gear.svg';
import Globe from 'assets/globe.svg';
import Lock from 'assets/lock.svg';
import Logo from 'assets/logo.svg';
import Magnet from 'assets/magnet.svg';
import Moon from 'assets/moon.svg';
import Nodes from 'assets/nodes.svg';
import Overview from 'assets/overview.svg';
@ -35,6 +36,7 @@ const icons = {
Globe,
Lock,
Logo,
Magnet,
Moon,
Nodes,
Overview,

View File

@ -3,7 +3,7 @@ import { Icon, Modal, Dropdown, Item, Text, Flexbox } from 'react-basics';
import { endOfYear, isSameDay } from 'date-fns';
import DatePickerForm from 'components/metrics/DatePickerForm';
import useLocale from 'hooks/useLocale';
import { dateFormat } from 'lib/date';
import { formatDate } from 'lib/date';
import Icons from 'components/icons';
import useMessages from 'hooks/useMessages';
@ -135,8 +135,8 @@ const CustomRange = ({ startDate, endDate, onClick }) => {
<Icons.Calendar />
</Icon>
<Text>
{dateFormat(startDate, 'd LLL y', locale)}
{!isSameDay(startDate, endDate) && `${dateFormat(endDate, 'd LLL y', locale)}`}
{formatDate(startDate, 'd LLL y', locale)}
{!isSameDay(startDate, endDate) && `${formatDate(endDate, 'd LLL y', locale)}`}
</Text>
</Flexbox>
);

View File

@ -0,0 +1,71 @@
import { useRef } from 'react';
import {
Text,
Icon,
CalendarMonthSelect,
CalendarYearSelect,
Button,
PopupTrigger,
Popup,
} from 'react-basics';
import { startOfMonth, endOfMonth } from 'date-fns';
import Icons from 'components/icons';
import { useLocale } from 'hooks';
import { formatDate } from 'lib/date';
import { getDateLocale } from 'lib/lang';
import styles from './MonthSelect.module.css';
export function MonthSelect({ date = new Date(), onChange }) {
const { locale } = useLocale();
const month = formatDate(date, 'MMMM', locale);
const year = date.getFullYear();
const ref = useRef();
const handleChange = (close, date) => {
onChange(`range:${startOfMonth(date).getTime()}:${endOfMonth(date).getTime()}`);
close();
};
return (
<>
<div ref={ref} className={styles.container}>
<PopupTrigger>
<Button className={styles.input} variant="quiet">
<Text>{month}</Text>
<Icon size="sm">
<Icons.ChevronDown />
</Icon>
</Button>
<Popup className={styles.popup} alignment="start">
{close => (
<CalendarMonthSelect
date={date}
locale={getDateLocale(locale)}
onSelect={handleChange.bind(null, close)}
/>
)}
</Popup>
</PopupTrigger>
<PopupTrigger>
<Button className={styles.input} variant="quiet">
<Text>{year}</Text>
<Icon size="sm">
<Icons.ChevronDown />
</Icon>
</Button>
<Popup className={styles.popup} alignment="start">
{close => (
<CalendarYearSelect
date={date}
locale={getDateLocale(locale)}
onSelect={handleChange.bind(null, close)}
/>
)}
</Popup>
</PopupTrigger>
</div>
</>
);
}
export default MonthSelect;

View File

@ -0,0 +1,22 @@
.container {
display: flex;
align-items: center;
justify-content: center;
border: 1px solid var(--base400);
border-radius: var(--border-radius);
}
.input {
display: flex;
align-items: center;
gap: 10px;
cursor: pointer;
}
.popup {
border: 1px solid var(--base400);
background: var(--base50);
border-radius: var(--border-radius);
padding: 20px;
margin-top: 5px;
}

View File

@ -8,12 +8,12 @@ export function WebsiteSelect({ websiteId, onSelect }) {
const { data } = useQuery(['websites:me'], () => get('/me/websites'));
const renderValue = value => {
return data?.find(({ id }) => id === value)?.name;
return data?.data?.find(({ id }) => id === value)?.name;
};
return (
<Dropdown
items={data}
items={data?.data}
value={websiteId}
renderValue={renderValue}
onChange={onSelect}

View File

@ -2,9 +2,7 @@ import { Container } from 'react-basics';
import Head from 'next/head';
import NavBar from 'components/layout/NavBar';
import UpdateNotice from 'components/common/UpdateNotice';
import useRequireLogin from 'hooks/useRequireLogin';
import useConfig from 'hooks/useConfig';
import { CURRENT_VERSION } from 'lib/constants';
import { useRequireLogin, useConfig } from 'hooks';
import styles from './AppLayout.module.css';
export function AppLayout({ title, children }) {
@ -16,7 +14,7 @@ export function AppLayout({ title, children }) {
}
return (
<div className={styles.layout} data-app-version={CURRENT_VERSION}>
<div className={styles.layout}>
<UpdateNotice user={user} config={config} />
<Head>
<title>{title ? `${title} | umami` : 'umami'}</title>

View File

@ -10,6 +10,7 @@
width: 100vw;
grid-column: 1;
grid-row: 1 / 2;
z-index: 1;
}
.body {

View File

@ -18,6 +18,8 @@ export function NavBar() {
const links = [
{ label: formatMessage(labels.dashboard), url: '/dashboard' },
{ label: formatMessage(labels.websites), url: '/websites' },
{ label: formatMessage(labels.reports), url: '/reports' },
!cloudMode && { label: formatMessage(labels.settings), url: '/settings' },
].filter(n => n);

View File

@ -2,6 +2,7 @@
display: flex;
flex-direction: column;
padding-top: 40px;
padding-right: 20px;
}
.content {

View File

@ -21,6 +21,8 @@ export const labels = defineMessages({
details: { id: 'label.details', defaultMessage: 'Details' },
website: { id: 'label.website', defaultMessage: 'Website' },
websites: { id: 'label.websites', defaultMessage: 'Websites' },
myWebsites: { id: 'label.my-websites', defaultMessage: 'My websites' },
teamWebsites: { id: 'label.team-websites', defaultMessage: 'Team websites' },
created: { id: 'label.created', defaultMessage: 'Created' },
edit: { id: 'label.edit', defaultMessage: 'Edit' },
name: { id: 'label.name', defaultMessage: 'Name' },
@ -28,6 +30,7 @@ export const labels = defineMessages({
accessCode: { id: 'label.access-code', defaultMessage: 'Access code' },
teamId: { id: 'label.team-id', defaultMessage: 'Team ID' },
team: { id: 'label.team', defaultMessage: 'Team' },
teamName: { id: 'label.team-name', defaultMessage: 'Team name' },
regenerate: { id: 'label.regenerate', defaultMessage: 'Regenerate' },
remove: { id: 'label.remove', defaultMessage: 'Remove' },
join: { id: 'label.join', defaultMessage: 'Join' },
@ -77,7 +80,7 @@ export const labels = defineMessages({
referrers: { id: 'label.referrers', defaultMessage: 'Referrers' },
screens: { id: 'label.screens', defaultMessage: 'Screens' },
browsers: { id: 'label.browsers', defaultMessage: 'Browsers' },
os: { id: 'label.operating-systems', defaultMessage: 'Operating systems' },
os: { id: 'label.os', defaultMessage: 'OS' },
devices: { id: 'label.devices', defaultMessage: 'Devices' },
countries: { id: 'label.countries', defaultMessage: 'Countries' },
languages: { id: 'label.languages', defaultMessage: 'Languages' },
@ -133,35 +136,48 @@ export const labels = defineMessages({
runQuery: { id: 'label.run-query', defaultMessage: 'Run query' },
field: { id: 'label.field', defaultMessage: 'Field' },
fields: { id: 'label.fields', defaultMessage: 'Fields' },
createReport: { id: 'labels.create-report', defaultMessage: 'Create report' },
description: { id: 'labels.description', defaultMessage: 'Description' },
untitled: { id: 'labels.untitled', defaultMessage: 'Untitled' },
type: { id: 'labels.type', defaultMessage: 'Type' },
filters: { id: 'labels.filters', defaultMessage: 'Filters' },
breakdown: { id: 'labels.breakdown', defaultMessage: 'Breakdown' },
true: { id: 'labels.true', defaultMessage: 'True' },
false: { id: 'labels.false', defaultMessage: 'False' },
equals: { id: 'labels.equals', defaultMessage: 'Equals' },
doesNotEqual: { id: 'labels.does-not-equal', defaultMessage: 'Does not equal' },
greaterThan: { id: 'labels.greater-than', defaultMessage: 'Greater than' },
lessThan: { id: 'labels.less-than', defaultMessage: 'Less than' },
greaterThanEquals: { id: 'labels.greater-than-equals', defaultMessage: 'Greater than or equals' },
lessThanEquals: { id: 'labels.less-than-equals', defaultMessage: 'Less than or equals' },
contains: { id: 'labels.contains', defaultMessage: 'Contains' },
doesNotContain: { id: 'labels.does-not-contain', defaultMessage: 'Does not contain' },
before: { id: 'labels.before', defaultMessage: 'Before' },
after: { id: 'labels.after', defaultMessage: 'After' },
total: { id: 'labels.total', defaultMessage: 'Total' },
sum: { id: 'labels.sum', defaultMessage: 'Sum' },
average: { id: 'labels.average', defaultMessage: 'Average' },
min: { id: 'labels.min', defaultMessage: 'Min' },
max: { id: 'labels.max', defaultMessage: 'Max' },
unique: { id: 'labels.unique', defaultMessage: 'Unique' },
value: { id: 'labels.value', defaultMessage: 'Value' },
overview: { id: 'labels.overview', defaultMessage: 'Overview' },
totalRecords: { id: 'labels.total-records', defaultMessage: 'Total records' },
createReport: { id: 'label.create-report', defaultMessage: 'Create report' },
description: { id: 'label.description', defaultMessage: 'Description' },
untitled: { id: 'label.untitled', defaultMessage: 'Untitled' },
type: { id: 'label.type', defaultMessage: 'Type' },
filters: { id: 'label.filters', defaultMessage: 'Filters' },
breakdown: { id: 'label.breakdown', defaultMessage: 'Breakdown' },
true: { id: 'label.true', defaultMessage: 'True' },
false: { id: 'label.false', defaultMessage: 'False' },
is: { id: 'label.is', defaultMessage: 'Is' },
isNot: { id: 'label.is-not', defaultMessage: 'Is not' },
isSet: { id: 'label.is-set', defaultMessage: 'Is set' },
isNotSet: { id: 'label.is-not-set', defaultMessage: 'Is not set' },
greaterThan: { id: 'label.greater-than', defaultMessage: 'Greater than' },
lessThan: { id: 'label.less-than', defaultMessage: 'Less than' },
greaterThanEquals: { id: 'label.greater-than-equals', defaultMessage: 'Greater than or equals' },
lessThanEquals: { id: 'label.less-than-equals', defaultMessage: 'Less than or equals' },
contains: { id: 'label.contains', defaultMessage: 'Contains' },
doesNotContain: { id: 'label.does-not-contain', defaultMessage: 'Does not contain' },
before: { id: 'label.before', defaultMessage: 'Before' },
after: { id: 'label.after', defaultMessage: 'After' },
total: { id: 'label.total', defaultMessage: 'Total' },
sum: { id: 'label.sum', defaultMessage: 'Sum' },
average: { id: 'label.average', defaultMessage: 'Average' },
min: { id: 'label.min', defaultMessage: 'Min' },
max: { id: 'label.max', defaultMessage: 'Max' },
unique: { id: 'label.unique', defaultMessage: 'Unique' },
value: { id: 'label.value', defaultMessage: 'Value' },
overview: { id: 'label.overview', defaultMessage: 'Overview' },
totalRecords: { id: 'label.total-records', defaultMessage: 'Total records' },
insights: { id: 'label.insights', defaultMessage: 'Insights' },
retention: { id: 'label.retention', defaultMessage: 'Retention' },
dropoff: { id: 'label.dropoff', defaultMessage: 'Dropoff' },
referrer: { id: 'label.referrer', defaultMessage: 'Referrer' },
country: { id: 'label.country', defaultMessage: 'Country' },
region: { id: 'label.region', defaultMessage: 'Region' },
city: { id: 'label.city', defaultMessage: 'City' },
browser: { id: 'label.browser', defaultMessage: 'Browser' },
device: { id: 'label.device', defaultMessage: 'Device' },
pageTitle: { id: 'label.pageTitle', defaultMessage: 'Page title' },
day: { id: 'label.day', defaultMessage: 'Day' },
date: { id: 'label.date', defaultMessage: 'Date' },
pageOf: { id: 'label.page-of', defaultMessage: 'Page {current} of {total}' },
});
export const messages = defineMessages({
@ -230,7 +246,7 @@ export const messages = defineMessages({
},
noResultsFound: {
id: 'message.no-results-found',
defaultMessage: 'No results were found.',
defaultMessage: 'No results found.',
},
noWebsitesConfigured: {
id: 'message.no-websites-configured',

View File

@ -1,16 +1,17 @@
import { useRouter } from 'next/router';
import FilterLink from 'components/common/FilterLink';
import MetricsTable from 'components/metrics/MetricsTable';
import { BROWSERS } from 'lib/constants';
import useMessages from 'hooks/useMessages';
import { useRouter } from 'next/router';
import useFormat from 'hooks/useFormat';
export function BrowsersTable({ websiteId, ...props }) {
const { formatMessage, labels } = useMessages();
const { basePath } = useRouter();
const { formatBrowser } = useFormat();
function renderLink({ x: browser }) {
return (
<FilterLink id="browser" value={browser} label={BROWSERS[browser] || browser}>
<FilterLink id="browser" value={browser} label={formatBrowser(browser)}>
<img
src={`${basePath}/images/browsers/${browser || 'unknown'}.png`}
alt={browser}

View File

@ -1,8 +1,7 @@
import { useRouter } from 'next/router';
import FilterLink from 'components/common/FilterLink';
import useCountryNames from 'hooks/useCountryNames';
import useLocale from 'hooks/useLocale';
import useMessages from 'hooks/useMessages';
import { useLocale, useMessages, useFormat } from 'hooks';
import MetricsTable from './MetricsTable';
export function CountriesTable({ websiteId, ...props }) {
@ -10,6 +9,7 @@ export function CountriesTable({ websiteId, ...props }) {
const countryNames = useCountryNames(locale);
const { formatMessage, labels } = useMessages();
const { basePath } = useRouter();
const { formatCountry } = useFormat();
function renderLink({ x: code }) {
return (
@ -17,7 +17,7 @@ export function CountriesTable({ websiteId, ...props }) {
id="country"
className={locale}
value={countryNames[code] && code}
label={countryNames[code]}
label={formatCountry(code)}
>
<img src={`${basePath}/images/flags/${code?.toLowerCase() || 'xx'}.png`} alt={code} />
</FilterLink>

View File

@ -2,18 +2,16 @@ import MetricsTable from './MetricsTable';
import FilterLink from 'components/common/FilterLink';
import useMessages from 'hooks/useMessages';
import { useRouter } from 'next/router';
import { useFormat } from 'hooks';
export function DevicesTable({ websiteId, ...props }) {
const { formatMessage, labels } = useMessages();
const { basePath } = useRouter();
const { formatDevice } = useFormat();
function renderLink({ x: device }) {
return (
<FilterLink
id="device"
value={labels[device] && device}
label={formatMessage(labels[device] || labels.unknown)}
>
<FilterLink id="device" value={labels[device] && device} label={formatDevice(device)}>
<img
src={`${basePath}/images/device/${device?.toLowerCase() || 'unknown'}.png`}
alt={device}

View File

@ -72,7 +72,7 @@ export function TestConsole() {
}
const [websiteId] = id || [];
const website = data.find(({ id }) => websiteId === id);
const website = data?.data.find(({ id }) => websiteId === id);
return (
<Page loading={isLoading} error={error}>

View File

@ -12,16 +12,17 @@ import useDashboard from 'store/dashboard';
import useMessages from 'hooks/useMessages';
import useLocale from 'hooks/useLocale';
export function Dashboard({ userId }) {
export function Dashboard() {
const { formatMessage, labels, messages } = useMessages();
const dashboard = useDashboard();
const { showCharts, limit, editing } = dashboard;
const [max, setMax] = useState(limit);
const { get, useQuery } = useApi();
const { data, isLoading, error } = useQuery(['websites'], () =>
get('/websites', { userId, includeTeams: 1 }),
get('/websites', { includeTeams: 1 }),
);
const hasData = data && data.length !== 0;
const hasData = data && data?.data.length !== 0;
const { dir } = useLocale();
function handleMore() {
@ -47,8 +48,10 @@ export function Dashboard({ userId }) {
)}
{hasData && (
<>
{editing && <DashboardEdit websites={data} />}
{!editing && <WebsiteChartList websites={data} showCharts={showCharts} limit={max} />}
{editing && <DashboardEdit websites={data?.data} />}
{!editing && (
<WebsiteChartList websites={data?.data} showCharts={showCharts} limit={max} />
)}
{max < data.length && (
<Flexbox justifyContent="center">
<Button onClick={handleMore}>

View File

@ -28,6 +28,11 @@ export function EventDataMetricsBar({ websiteId }) {
<MetricsBar isLoading={isLoading} isFetched={isFetched} error={error}>
{!error && isFetched && (
<>
<MetricCard
className={styles.card}
label={formatMessage(labels.events)}
value={data?.events}
/>
<MetricCard
className={styles.card}
label={formatMessage(labels.fields)}

View File

@ -2,6 +2,7 @@ import Link from 'next/link';
import { GridTable, GridColumn } from 'react-basics';
import { useMessages, usePageQuery } from 'hooks';
import Empty from 'components/common/Empty';
import { DATA_TYPES } from 'lib/constants';
export function EventDataTable({ data = [] }) {
const { formatMessage, labels } = useMessages();
@ -13,15 +14,18 @@ export function EventDataTable({ data = [] }) {
return (
<GridTable data={data}>
<GridColumn name="event" label={formatMessage(labels.event)}>
<GridColumn name="eventName" label={formatMessage(labels.event)}>
{row => (
<Link href={resolveUrl({ event: row.event })} shallow={true}>
{row.event}
<Link href={resolveUrl({ event: row.eventName })} shallow={true}>
{row.eventName}
</Link>
)}
</GridColumn>
<GridColumn name="field" label={formatMessage(labels.field)}>
{row => row.field}
<GridColumn name="fieldName" label={formatMessage(labels.field)}>
{row => row.fieldName}
</GridColumn>
<GridColumn name="dataType" label={formatMessage(labels.type)}>
{row => DATA_TYPES[row.dataType]}
</GridColumn>
<GridColumn name="total" label={formatMessage(labels.totalRecords)}>
{({ total }) => total.toLocaleString()}

View File

@ -1,9 +1,10 @@
import { GridTable, GridColumn, Button, Icon, Text, Flexbox } from 'react-basics';
import { GridTable, GridColumn, Button, Icon, Text } from 'react-basics';
import { useMessages, usePageQuery } from 'hooks';
import Link from 'next/link';
import Icons from 'components/icons';
import PageHeader from 'components/layout/PageHeader';
import Empty from 'components/common/Empty';
import { DATA_TYPES } from 'lib/constants';
export function EventDataValueTable({ data = [], event }) {
const { formatMessage, labels } = useMessages();
@ -31,8 +32,11 @@ export function EventDataValueTable({ data = [], event }) {
{data.length <= 0 && <Empty />}
{data.length > 0 && (
<GridTable data={data}>
<GridColumn name="field" label={formatMessage(labels.field)} />
<GridColumn name="value" label={formatMessage(labels.value)} />
<GridColumn name="fieldName" label={formatMessage(labels.field)} />
<GridColumn name="dataType" label={formatMessage(labels.type)}>
{row => DATA_TYPES[row.dataType]}
</GridColumn>
<GridColumn name="fieldValue" label={formatMessage(labels.value)} />
<GridColumn name="total" label={formatMessage(labels.totalRecords)} width="200px">
{({ total }) => total.toLocaleString()}
</GridColumn>

View File

@ -8,7 +8,7 @@ import useLocale from 'hooks/useLocale';
import useCountryNames from 'hooks/useCountryNames';
import { BROWSERS } from 'lib/constants';
import { stringToColor } from 'lib/format';
import { dateFormat } from 'lib/date';
import { formatDate } from 'lib/date';
import { safeDecodeURI } from 'next-basics';
import Icons from 'components/icons';
import styles from './RealtimeLog.module.css';
@ -50,7 +50,7 @@ export function RealtimeLog({ data, websiteDomain }) {
},
];
const getTime = ({ createdAt }) => dateFormat(new Date(createdAt), 'pp', locale);
const getTime = ({ createdAt }) => formatDate(new Date(createdAt), 'pp', locale);
const getColor = ({ id, sessionId }) => stringToColor(sessionId || id);

View File

@ -6,7 +6,12 @@ import { useContext } from 'react';
import { ReportContext } from './Report';
import { useMessages } from 'hooks';
export function BaseParameters() {
export function BaseParameters({
showWebsiteSelect = true,
allowWebsiteSelect = true,
showDateSelect = true,
allowDateSelect = true,
}) {
const { report, updateReport } = useContext(ReportContext);
const { formatMessage, labels } = useMessages();
@ -24,17 +29,25 @@ export function BaseParameters() {
return (
<>
<FormRow label={formatMessage(labels.website)}>
<WebsiteSelect websiteId={websiteId} onSelect={handleWebsiteSelect} />
</FormRow>
<FormRow label={formatMessage(labels.dateRange)}>
<DateFilter
value={value}
startDate={startDate}
endDate={endDate}
onChange={handleDateChange}
/>
</FormRow>
{showWebsiteSelect && (
<FormRow label={formatMessage(labels.website)}>
{allowWebsiteSelect && (
<WebsiteSelect websiteId={websiteId} onSelect={handleWebsiteSelect} />
)}
</FormRow>
)}
{showDateSelect && (
<FormRow label={formatMessage(labels.dateRange)}>
{allowDateSelect && (
<DateFilter
value={value}
startDate={startDate}
endDate={endDate}
onChange={handleDateChange}
/>
)}
</FormRow>
)}
</>
);
}

View File

@ -1,55 +1,58 @@
import { useState } from 'react';
import { Form, FormRow, Menu, Item, Flexbox, Dropdown, TextField, Button } from 'react-basics';
import { useFilters } from 'hooks';
import { Form, FormRow, Item, Flexbox, Dropdown, Button } from 'react-basics';
import { useMessages, useFilters, useFormat } from 'hooks';
import styles from './FieldFilterForm.module.css';
export default function FieldFilterForm({ name, type, onSelect }) {
const [filter, setFilter] = useState('');
const [value, setValue] = useState('');
const { filters, types } = useFilters();
const items = types[type];
export default function FieldFilterForm({ name, label, type, values, onSelect }) {
const { formatMessage, labels } = useMessages();
const [filter, setFilter] = useState('eq');
const [value, setValue] = useState();
const { getFilters } = useFilters();
const { formatValue } = useFormat();
const filters = getFilters(type);
const renderValue = value => {
return filters[value];
const renderFilterValue = value => {
return filters.find(f => f.value === value)?.label;
};
if (type === 'boolean') {
return (
<Form>
<FormRow label={name}>
<Menu onSelect={value => onSelect({ name, type, value: ['eq', value] })}>
{items.map(value => {
return <Item key={value}>{filters[value]}</Item>;
})}
</Menu>
</FormRow>
</Form>
);
}
const renderValue = value => {
return formatValue(value, name);
};
const handleAdd = () => {
onSelect({ name, type, filter, value });
};
return (
<Form>
<FormRow label={name} className={styles.filter}>
<FormRow label={label} className={styles.filter}>
<Flexbox gap={10}>
<Dropdown
className={styles.dropdown}
items={items}
items={filters}
value={filter}
renderValue={renderValue}
renderValue={renderFilterValue}
onChange={setFilter}
>
{value => {
return <Item key={value}>{filters[value]}</Item>;
{({ value, label }) => {
return <Item key={value}>{label}</Item>;
}}
</Dropdown>
<Dropdown
className={styles.dropdown}
menuProps={{ className: styles.menu }}
items={values}
value={value}
renderValue={renderValue}
onChange={setValue}
>
{value => {
return <Item key={value}>{formatValue(value, name)}</Item>;
}}
</Dropdown>
<TextField value={value} onChange={e => setValue(e.target.value)} autoFocus={true} />
</Flexbox>
<Button
variant="primary"
onClick={() => onSelect({ name, type, value: [filter, value] })}
disabled={!filter || !value}
>
Add
<Button variant="primary" onClick={handleAdd} disabled={!filter || !value}>
{formatMessage(labels.add)}
</Button>
</FormRow>
</Form>

View File

@ -15,3 +15,8 @@
.dropdown {
min-width: 180px;
}
.menu {
min-width: 360px;
max-height: 300px;
}

View File

@ -2,18 +2,18 @@ import { Menu, Item, Form, FormRow } from 'react-basics';
import { useMessages } from 'hooks';
import styles from './FieldSelectForm.module.css';
export default function FieldSelectForm({ fields, onSelect }) {
export default function FieldSelectForm({ items, onSelect, showType = true }) {
const { formatMessage, labels } = useMessages();
return (
<Form>
<FormRow label={formatMessage(labels.fields)}>
<Menu className={styles.menu} onSelect={key => onSelect(fields[key])}>
{fields.map(({ label, name, type }, index) => {
<Menu className={styles.menu} onSelect={key => onSelect(items[key])}>
{items.map(({ name, label, type }, index) => {
return (
<Item key={index} className={styles.item}>
<div>{label || name}</div>
<div className={styles.type}>{type}</div>
{showType && type && <div className={styles.type}>{type}</div>}
</Item>
);
})}

View File

@ -0,0 +1,42 @@
import { useState } from 'react';
import FieldSelectForm from './FieldSelectForm';
import FieldFilterForm from './FieldFilterForm';
import { useApi } from 'hooks';
import { Loading } from 'react-basics';
function useValues(websiteId, type) {
const { get, useQuery } = useApi();
const { data, error, isLoading } = useQuery(
['websites:values', websiteId, type],
() =>
get(`/websites/${websiteId}/values`, {
type,
}),
{ enabled: !!(websiteId && type) },
);
return { data, error, isLoading };
}
export default function FilterSelectForm({ websiteId, items, onSelect }) {
const [field, setField] = useState();
const { data, isLoading } = useValues(websiteId, field?.name);
if (!field) {
return <FieldSelectForm items={items} onSelect={setField} showType={false} />;
}
if (isLoading) {
return <Loading position="center" icon="dots" />;
}
return (
<FieldFilterForm
name={field?.name}
label={field?.label}
type={field?.type}
values={data}
onSelect={onSelect}
/>
);
}

View File

@ -1,29 +1,15 @@
import { createPortal } from 'react-dom';
import { useDocumentClick, useKeyDown } from 'react-basics';
import classNames from 'classnames';
import styles from './PopupForm.module.css';
export function PopupForm({ element, className, children, onClose }) {
const { right, top } = element.getBoundingClientRect();
const style = { position: 'absolute', left: right, top };
useKeyDown('Escape', onClose);
useDocumentClick(e => {
if (e.target !== element && !element?.parentElement?.contains(e.target)) {
onClose();
}
});
const handleClick = e => {
e.stopPropagation();
};
return createPortal(
<div className={classNames(styles.form, className)} style={style} onClick={handleClick}>
export function PopupForm({ className, style, children }) {
return (
<div
className={classNames(styles.form, className)}
style={style}
onClick={e => e.stopPropagation()}
>
{children}
</div>,
document.body,
</div>
);
}

View File

@ -3,8 +3,8 @@
background: var(--base50);
min-width: 300px;
padding: 20px;
margin-left: 30px;
border: 1px solid var(--base400);
border-radius: var(--border-radius);
box-shadow: 0 0 0 5px rgba(0, 0, 0, 0.1);
z-index: 1000;
}

View File

@ -8,6 +8,8 @@ export const ReportContext = createContext(null);
export function Report({ reportId, defaultParameters, children, ...props }) {
const report = useReport(reportId, defaultParameters);
//console.log({ report });
return (
<ReportContext.Provider value={{ ...report }}>
<Page {...props} className={styles.container}>

View File

@ -1,9 +1,13 @@
import FunnelReport from './funnel/FunnelReport';
import EventDataReport from './event-data/EventDataReport';
import InsightsReport from './insights/InsightsReport';
import RetentionReport from './retention/RetentionReport';
const reports = {
funnel: FunnelReport,
'event-data': EventDataReport,
insights: InsightsReport,
retention: RetentionReport,
};
export default function ReportDetails({ reportId, reportType }) {

View File

@ -4,6 +4,7 @@ import Page from 'components/layout/Page';
import PageHeader from 'components/layout/PageHeader';
import Funnel from 'assets/funnel.svg';
import Lightbulb from 'assets/lightbulb.svg';
import Magnet from 'assets/magnet.svg';
import styles from './ReportTemplates.module.css';
import { useMessages } from 'hooks';
@ -33,20 +34,24 @@ export function ReportTemplates() {
const { formatMessage, labels } = useMessages();
const reports = [
/*
{
title: formatMessage(labels.insights),
description: 'Dive deeper into your data by using segments and filters.',
url: '/reports/insights',
icon: <Lightbulb />,
},
*/
{
title: formatMessage(labels.funnel),
description: 'Understand the conversion and drop-off rate of users.',
url: '/reports/funnel',
icon: <Funnel />,
},
{
title: formatMessage(labels.retention),
description: 'Measure you website stickiness by tracking how often users return.',
url: '/reports/retention',
icon: <Magnet />,
},
];
return (

View File

@ -2,7 +2,6 @@
display: grid;
grid-template-columns: repeat(auto-fit, minmax(360px, 1fr));
gap: 20px;
width: 360px;
}
.report {

View File

@ -1,13 +1,25 @@
import EmptyPlaceholder from 'components/common/EmptyPlaceholder';
import Page from 'components/layout/Page';
import PageHeader from 'components/layout/PageHeader';
import { useMessages, useReports } from 'hooks';
import Link from 'next/link';
import { Button, Icon, Icons, Text } from 'react-basics';
import { useMessages, useReports } from 'hooks';
import ReportsTable from './ReportsTable';
export function ReportsPage() {
const { formatMessage, labels } = useMessages();
const { reports, error, isLoading } = useReports();
const { formatMessage, labels, messages } = useMessages();
const {
reports,
error,
isLoading,
deleteReport,
filter,
handleFilterChange,
handlePageChange,
handlePageSizeChange,
} = useReports();
const hasData = (reports && reports?.data.length !== 0) || filter;
return (
<Page loading={isLoading} error={error}>
@ -21,7 +33,23 @@ export function ReportsPage() {
</Button>
</Link>
</PageHeader>
<ReportsTable data={reports} />
{hasData && (
<ReportsTable
data={reports}
showSearch={true}
showPaging={true}
onFilterChange={handleFilterChange}
onPageChange={handlePageChange}
onPageSizeChange={handlePageSizeChange}
onDelete={deleteReport}
filterValue={filter}
showDomain={true}
/>
)}
{!hasData && (
<EmptyPlaceholder message={formatMessage(messages.noDataAvailable)}></EmptyPlaceholder>
)}
</Page>
);
}

View File

@ -1,18 +1,36 @@
import { useState } from 'react';
import { Flexbox, Icon, Icons, Text, Button, Modal } from 'react-basics';
import ConfirmDeleteForm from 'components/common/ConfirmDeleteForm';
import LinkButton from 'components/common/LinkButton';
import SettingsTable from 'components/common/SettingsTable';
import ConfirmDeleteForm from 'components/common/ConfirmDeleteForm';
import { useMessages } from 'hooks';
import useUser from 'hooks/useUser';
import { useState } from 'react';
import { Button, Flexbox, Icon, Icons, Modal, Text } from 'react-basics';
export function ReportsTable({ data = [], onDelete = () => {} }) {
export function ReportsTable({
data = [],
onDelete = () => {},
filterValue,
onFilterChange,
onPageChange,
onPageSizeChange,
showDomain,
}) {
const [report, setReport] = useState(null);
const { formatMessage, labels } = useMessages();
const { user } = useUser();
const domainColumn = [
{
name: 'domain',
label: formatMessage(labels.domain),
},
];
const columns = [
{ name: 'name', label: formatMessage(labels.name) },
{ name: 'description', label: formatMessage(labels.description) },
{ name: 'type', label: formatMessage(labels.type) },
...(showDomain ? domainColumn : []),
{ name: 'action', label: ' ' },
];
@ -22,13 +40,26 @@ export function ReportsTable({ data = [], onDelete = () => {} }) {
return (
<>
<SettingsTable columns={columns} data={data}>
<SettingsTable
columns={columns}
data={data}
showSearch={true}
showPaging={true}
onFilterChange={onFilterChange}
onPageChange={onPageChange}
onPageSizeChange={onPageSizeChange}
filterValue={filterValue}
>
{row => {
const { id } = row;
const { id, userId: reportOwnerId, website } = row;
if (showDomain) {
row.domain = website.domain;
}
return (
<Flexbox gap={10}>
<LinkButton href={`/reports/${id}`}>{formatMessage(labels.view)}</LinkButton>
{!showDomain || user.id === reportOwnerId || user.id === website?.userId}
<Button onClick={() => setReport(row)}>
<Icon>
<Icons.Trash />

View File

@ -1,5 +1,5 @@
import { useCallback, useContext, useMemo } from 'react';
import { Loading } from 'react-basics';
import { Loading, StatusLight } from 'react-basics';
import useMessages from 'hooks/useMessages';
import useTheme from 'hooks/useTheme';
import BarChart from 'components/metrics/BarChart';
@ -22,14 +22,25 @@ export function FunnelChart({ className, loading }) {
);
const renderTooltipPopup = useCallback((setTooltipPopup, model) => {
const { opacity, dataPoints } = model.tooltip;
const { opacity, labelColors, dataPoints } = model.tooltip;
if (!dataPoints?.length || !opacity) {
setTooltipPopup(null);
return;
}
setTooltipPopup(`${formatLongNumber(dataPoints[0].raw.y)} ${formatMessage(labels.visitors)}`);
setTooltipPopup(
<>
<div>
{formatLongNumber(dataPoints[0].raw.y)} {formatMessage(labels.visitors)}
</div>
<div>
<StatusLight color={labelColors?.[0]?.backgroundColor}>
{formatLongNumber(dataPoints[0].raw.z)}% {formatMessage(labels.dropoff)}
</StatusLight>
</div>
</>,
);
}, []);
const datasets = useMemo(() => {

View File

@ -16,6 +16,7 @@ import UrlAddForm from './UrlAddForm';
import { ReportContext } from 'components/pages/reports/Report';
import BaseParameters from '../BaseParameters';
import ParameterList from '../ParameterList';
import PopupForm from '../PopupForm';
export function FunnelParameters() {
const { report, runReport, updateReport, isRunning } = useContext(ReportContext);
@ -53,7 +54,11 @@ export function FunnelParameters() {
</Icon>
<Popup position="bottom" alignment="start">
{(close, element) => {
return <UrlAddForm element={element} onAdd={handleAddUrl} onClose={close} />;
return (
<PopupForm element={element} onClose={close}>
<UrlAddForm onAdd={handleAddUrl} />
</PopupForm>
);
}}
</Popup>
</PopupTrigger>

View File

@ -6,9 +6,10 @@ import ReportHeader from '../ReportHeader';
import ReportMenu from '../ReportMenu';
import ReportBody from '../ReportBody';
import Funnel from 'assets/funnel.svg';
import { REPORT_TYPES } from 'lib/constants';
const defaultParameters = {
type: 'funnel',
type: REPORT_TYPES.funnel,
parameters: { window: 60, urls: [] },
};

View File

@ -2,16 +2,14 @@ import { useState } from 'react';
import { useMessages } from 'hooks';
import { Button, Form, FormRow, TextField, Flexbox } from 'react-basics';
import styles from './UrlAddForm.module.css';
import PopupForm from '../PopupForm';
export function UrlAddForm({ defaultValue = '', element, onAdd, onClose }) {
export function UrlAddForm({ defaultValue = '', onAdd }) {
const [url, setUrl] = useState(defaultValue);
const { formatMessage, labels } = useMessages();
const handleSave = () => {
onAdd(url);
setUrl('');
onClose();
};
const handleChange = e => {
@ -26,25 +24,23 @@ export function UrlAddForm({ defaultValue = '', element, onAdd, onClose }) {
};
return (
<PopupForm element={element}>
<Form>
<FormRow label={formatMessage(labels.url)}>
<Flexbox gap={10}>
<TextField
className={styles.input}
value={url}
onChange={handleChange}
autoFocus={true}
autoComplete="off"
onKeyDown={handleKeyDown}
/>
<Button variant="primary" onClick={handleSave}>
{formatMessage(labels.add)}
</Button>
</Flexbox>
</FormRow>
</Form>
</PopupForm>
<Form>
<FormRow label={formatMessage(labels.url)}>
<Flexbox gap={10}>
<TextField
className={styles.input}
value={url}
onChange={handleChange}
autoFocus={true}
autoComplete="off"
onKeyDown={handleKeyDown}
/>
<Button variant="primary" onClick={handleSave}>
{formatMessage(labels.add)}
</Button>
</Flexbox>
</FormRow>
</Form>
);
}

View File

@ -1,69 +1,104 @@
import { useContext, useRef } from 'react';
import { useMessages } from 'hooks';
import { Form, FormRow, FormButtons, SubmitButton, PopupTrigger, Icon, Popup } from 'react-basics';
import { useFormat, useMessages, useFilters } from 'hooks';
import {
Form,
FormRow,
FormButtons,
SubmitButton,
PopupTrigger,
Icon,
Popup,
TooltipPopup,
} from 'react-basics';
import { ReportContext } from 'components/pages/reports/Report';
import { REPORT_PARAMETERS, WEBSITE_EVENT_FIELDS } from 'lib/constants';
import Icons from 'components/icons';
import BaseParameters from '../BaseParameters';
import FieldAddForm from '../FieldAddForm';
import ParameterList from '../ParameterList';
import styles from './InsightsParameters.module.css';
import PopupForm from '../PopupForm';
import FilterSelectForm from '../FilterSelectForm';
import FieldSelectForm from '../FieldSelectForm';
export function InsightsParameters() {
const { report, runReport, updateReport, isRunning } = useContext(ReportContext);
const { formatMessage, labels } = useMessages();
const { formatValue } = useFormat();
const { filterLabels } = useFilters();
const ref = useRef(null);
const { parameters } = report || {};
const { websiteId, dateRange, fields, filters, groups } = parameters || {};
const queryEnabled = websiteId && dateRange && fields?.length;
const fieldOptions = Object.keys(WEBSITE_EVENT_FIELDS).map(key => WEBSITE_EVENT_FIELDS[key]);
const { websiteId, dateRange, fields, filters } = parameters || {};
const { startDate, endDate } = dateRange || {};
const parametersSelected = websiteId && startDate && endDate;
const queryEnabled = websiteId && dateRange && (fields?.length || filters?.length);
const fieldOptions = [
{ name: 'url', type: 'string', label: formatMessage(labels.url) },
{ name: 'title', type: 'string', label: formatMessage(labels.pageTitle) },
{ name: 'referrer', type: 'string', label: formatMessage(labels.referrer) },
{ name: 'query', type: 'string', label: formatMessage(labels.query) },
{ name: 'browser', type: 'string', label: formatMessage(labels.browser) },
{ name: 'os', type: 'string', label: formatMessage(labels.os) },
{ name: 'device', type: 'string', label: formatMessage(labels.device) },
{ name: 'country', type: 'string', label: formatMessage(labels.country) },
{ name: 'region', type: 'string', label: formatMessage(labels.region) },
{ name: 'city', type: 'string', label: formatMessage(labels.city) },
];
const parameterGroups = [
{ label: formatMessage(labels.fields), group: REPORT_PARAMETERS.fields },
{ label: formatMessage(labels.filters), group: REPORT_PARAMETERS.filters },
{ label: formatMessage(labels.breakdown), group: REPORT_PARAMETERS.groups },
{ id: 'fields', label: formatMessage(labels.fields) },
{ id: 'filters', label: formatMessage(labels.filters) },
];
const parameterData = {
fields,
filters,
groups,
};
const handleSubmit = values => {
runReport(values);
};
const handleAdd = (group, value) => {
const data = parameterData[group];
const handleAdd = (id, value) => {
const data = parameterData[id];
if (!data.find(({ name }) => name === value.name)) {
updateReport({ parameters: { [group]: data.concat(value) } });
updateReport({ parameters: { [id]: data.concat(value) } });
}
};
const handleRemove = (group, index) => {
const data = [...parameterData[group]];
const handleRemove = (id, index) => {
const data = [...parameterData[id]];
data.splice(index, 1);
updateReport({ parameters: { [group]: data } });
updateReport({ parameters: { [id]: data } });
};
const AddButton = ({ group }) => {
const AddButton = ({ id }) => {
return (
<PopupTrigger>
<Icon>
<Icons.Plus />
</Icon>
<Popup position="bottom" alignment="start">
{(close, element) => {
<TooltipPopup label={formatMessage(labels.add)} position="top">
<Icon>
<Icons.Plus />
</Icon>
</TooltipPopup>
<Popup position="bottom" alignment="start" className={styles.popup}>
{close => {
return (
<FieldAddForm
fields={fieldOptions}
group={group}
element={element}
onAdd={handleAdd}
onClose={close}
/>
<PopupForm onClose={close}>
{id === 'fields' && (
<FieldSelectForm
items={fieldOptions}
onSelect={handleAdd.bind(null, id)}
showType={false}
/>
)}
{id === 'filters' && (
<FilterSelectForm
websiteId={websiteId}
items={fieldOptions}
onSelect={handleAdd.bind(null, id)}
/>
)}
</PopupForm>
);
}}
</Popup>
@ -74,41 +109,33 @@ export function InsightsParameters() {
return (
<Form ref={ref} values={parameters} onSubmit={handleSubmit}>
<BaseParameters />
{parameterGroups.map(({ label, group }) => {
return (
<FormRow key={label} label={label} action={<AddButton group={group} onAdd={handleAdd} />}>
<ParameterList
items={parameterData[group]}
onRemove={index => handleRemove(group, index)}
>
{({ name, value }) => {
return (
<div className={styles.parameter}>
{group === REPORT_PARAMETERS.fields && (
<>
<div>{name}</div>
<div className={styles.op}>{value}</div>
</>
)}
{group === REPORT_PARAMETERS.filters && (
<>
<div>{name}</div>
<div className={styles.op}>{value[0]}</div>
<div>{value[1]}</div>
</>
)}
{group === REPORT_PARAMETERS.groups && (
<>
<div>{name}</div>
</>
)}
</div>
);
}}
</ParameterList>
</FormRow>
);
})}
{parametersSelected &&
parameterGroups.map(({ id, label }) => {
return (
<FormRow key={label} label={label} action={<AddButton id={id} onAdd={handleAdd} />}>
<ParameterList items={parameterData[id]} onRemove={index => handleRemove(id, index)}>
{({ name, filter, value }) => {
return (
<div className={styles.parameter}>
{id === 'fields' && (
<>
<div>{fieldOptions.find(f => f.name === name)?.label}</div>
</>
)}
{id === 'filters' && (
<>
<div>{fieldOptions.find(f => f.name === name)?.label}</div>
<div className={styles.op}>{filterLabels[filter]}</div>
<div>{formatValue(value, name)}</div>
</>
)}
</div>
);
}}
</ParameterList>
</FormRow>
);
})}
<FormButtons>
<SubmitButton variant="primary" disabled={!queryEnabled} loading={isRunning}>
{formatMessage(labels.runQuery)}

View File

@ -10,3 +10,8 @@
.op {
font-weight: bold;
}
.popup {
margin-top: -10px;
margin-left: 30px;
}

View File

@ -5,10 +5,11 @@ import ReportBody from '../ReportBody';
import InsightsParameters from './InsightsParameters';
import InsightsTable from './InsightsTable';
import Lightbulb from 'assets/lightbulb.svg';
import { REPORT_TYPES } from 'lib/constants';
const defaultParameters = {
type: 'insights',
parameters: { fields: [], filters: [], groups: [] },
type: REPORT_TYPES.insights,
parameters: { fields: [], filters: [] },
};
export default function InsightsReport({ reportId }) {

View File

@ -1,17 +1,47 @@
import { useContext } from 'react';
import { useContext, useEffect, useState } from 'react';
import { GridTable, GridColumn } from 'react-basics';
import { useMessages } from 'hooks';
import { useFormat, useMessages } from 'hooks';
import { ReportContext } from '../Report';
import EmptyPlaceholder from 'components/common/EmptyPlaceholder';
export function InsightsTable() {
const [fields, setFields] = useState();
const { report } = useContext(ReportContext);
const { formatMessage, labels } = useMessages();
const { formatValue } = useFormat();
useEffect(
() => {
setFields(report?.parameters?.fields);
},
// eslint-disable-next-line react-hooks/exhaustive-deps
[report?.data],
);
if (!fields || !report?.parameters) {
return <EmptyPlaceholder />;
}
return (
<GridTable data={report?.data || []}>
<GridColumn name="field" label={formatMessage(labels.field)} />
<GridColumn name="value" label={formatMessage(labels.value)} />
<GridColumn name="total" label={formatMessage(labels.total)} />
{fields.map(({ name, label }) => {
return (
<GridColumn key={name} name={name} label={label}>
{row => formatValue(row[name], name)}
</GridColumn>
);
})}
<GridColumn
name="visitors"
label={formatMessage(labels.visitors)}
width="100px"
alignment="end"
>
{row => row.visitors.toLocaleString()}
</GridColumn>
<GridColumn name="views" label={formatMessage(labels.views)} width="100px" alignment="end">
{row => row.views.toLocaleString()}
</GridColumn>
</GridTable>
);
}

View File

@ -0,0 +1,46 @@
import { useContext, useRef } from 'react';
import { useMessages } from 'hooks';
import { Form, FormButtons, FormRow, SubmitButton } from 'react-basics';
import { ReportContext } from 'components/pages/reports/Report';
import { MonthSelect } from 'components/input/MonthSelect';
import BaseParameters from '../BaseParameters';
import { parseDateRange } from 'lib/date';
export function RetentionParameters() {
const { report, runReport, isRunning, updateReport } = useContext(ReportContext);
const { formatMessage, labels } = useMessages();
const ref = useRef(null);
const { parameters } = report || {};
const { websiteId, dateRange } = parameters || {};
const { startDate } = dateRange || {};
const queryDisabled = !websiteId || !dateRange;
const handleSubmit = (data, e) => {
e.stopPropagation();
e.preventDefault();
if (!queryDisabled) {
runReport(data);
}
};
const handleDateChange = value => {
updateReport({ parameters: { dateRange: { ...parseDateRange(value) } } });
};
return (
<Form ref={ref} values={parameters} onSubmit={handleSubmit} preventSubmit={true}>
<BaseParameters showDateSelect={false} />
<FormRow label={formatMessage(labels.date)}>
<MonthSelect date={startDate} onChange={handleDateChange} />
</FormRow>
<FormButtons>
<SubmitButton variant="primary" disabled={queryDisabled} loading={isRunning}>
{formatMessage(labels.runQuery)}
</SubmitButton>
</FormButtons>
</Form>
);
}
export default RetentionParameters;

View File

@ -0,0 +1,33 @@
import RetentionTable from './RetentionTable';
import RetentionParameters from './RetentionParameters';
import Report from '../Report';
import ReportHeader from '../ReportHeader';
import ReportMenu from '../ReportMenu';
import ReportBody from '../ReportBody';
import Magnet from 'assets/magnet.svg';
import { REPORT_TYPES } from 'lib/constants';
import { parseDateRange } from 'lib/date';
import { endOfMonth, startOfMonth } from 'date-fns';
const defaultParameters = {
type: REPORT_TYPES.retention,
parameters: {
dateRange: parseDateRange(
`range:${startOfMonth(new Date()).getTime()}:${endOfMonth(new Date()).getTime()}`,
),
},
};
export default function RetentionReport({ reportId }) {
return (
<Report reportId={reportId} defaultParameters={defaultParameters}>
<ReportHeader icon={<Magnet />} />
<ReportMenu>
<RetentionParameters />
</ReportMenu>
<ReportBody>
<RetentionTable />
</ReportBody>
</Report>
);
}

View File

@ -0,0 +1,10 @@
.filters {
display: flex;
flex-direction: column;
justify-content: space-between;
border: 1px solid var(--base400);
border-radius: var(--border-radius);
line-height: 32px;
padding: 10px;
overflow: hidden;
}

View File

@ -0,0 +1,78 @@
import { useContext } from 'react';
import classNames from 'classnames';
import { ReportContext } from '../Report';
import EmptyPlaceholder from 'components/common/EmptyPlaceholder';
import { useMessages } from 'hooks';
import { formatDate } from 'lib/date';
import styles from './RetentionTable.module.css';
export function RetentionTable() {
const { formatMessage, labels } = useMessages();
const { report } = useContext(ReportContext);
const { data } = report || {};
if (!data) {
return <EmptyPlaceholder />;
}
const days = [1, 2, 3, 4, 5, 6, 7, 14, 21, 28];
const rows = data.reduce((arr, row) => {
const { date, visitors, day } = row;
if (day === 0) {
return arr.concat({
date,
visitors,
records: days
.reduce((arr, day) => {
arr[day] = data.find(x => x.date === date && x.day === day);
return arr;
}, [])
.filter(n => n),
});
}
return arr;
}, []);
const totalDays = rows.length;
return (
<>
<div className={styles.table}>
<div className={classNames(styles.row, styles.header)}>
<div className={styles.date}>{formatMessage(labels.date)}</div>
<div className={styles.visitors}>{formatMessage(labels.visitors)}</div>
{days.map(n => (
<div key={n} className={styles.day}>
{formatMessage(labels.day)} {n}
</div>
))}
</div>
{rows.map(({ date, visitors, records }, rowIndex) => {
return (
<div key={rowIndex} className={styles.row}>
<div className={styles.date}>{formatDate(`${date} 00:00:00`, 'PP')}</div>
<div className={styles.visitors}>{visitors}</div>
{days.map(day => {
if (totalDays - rowIndex < day) {
return null;
}
const percentage = records[day]?.percentage;
return (
<div
key={day}
className={classNames(styles.cell, { [styles.empty]: !percentage })}
>
{percentage ? `${percentage.toFixed(2)}%` : ''}
</div>
);
})}
</div>
);
})}
</div>
</>
);
}
export default RetentionTable;

View File

@ -0,0 +1,52 @@
.table {
display: flex;
flex-direction: column;
}
.header {
font-weight: 700;
}
.row {
display: flex;
flex-direction: row;
gap: 1px;
margin-bottom: 1px;
}
.cell {
display: flex;
align-items: center;
justify-content: center;
width: 60px;
height: 60px;
background: var(--blue200);
border-radius: var(--border-radius);
}
.date {
display: flex;
align-items: center;
min-width: 160px;
}
.visitors {
display: flex;
align-items: center;
min-width: 80px;
}
.day {
display: flex;
align-items: center;
justify-content: center;
width: 60px;
height: 60px;
text-align: center;
font-size: var(--font-size-sm);
font-weight: 400;
}
.empty {
background: var(--blue100);
}

View File

@ -12,6 +12,8 @@ export function TeamAddWebsiteForm({ teamId, onSave, onClose }) {
const [newWebsites, setNewWebsites] = useState([]);
const formRef = useRef();
const hasData = websites && websites.data.length > 0;
const handleSubmit = () => {
mutate(
{ websiteIds: newWebsites },
@ -42,20 +44,22 @@ export function TeamAddWebsiteForm({ teamId, onSave, onClose }) {
return (
<>
<Form onSubmit={handleSubmit} error={error} ref={formRef}>
<FormRow label={formatMessage(labels.websites)}>
<Dropdown items={websites} onChange={handleAddWebsite} style={{ width: 300 }}>
{({ id, name }) => <Item key={id}>{name}</Item>}
</Dropdown>
</FormRow>
<WebsiteTags items={websites} websites={newWebsites} onClick={handleRemoveWebsite} />
<FormButtons flex>
<SubmitButton disabled={newWebsites && newWebsites.length === 0}>
{formatMessage(labels.addWebsite)}
</SubmitButton>
<Button onClick={onClose}>{formatMessage(labels.cancel)}</Button>
</FormButtons>
</Form>
{hasData && (
<Form onSubmit={handleSubmit} error={error} ref={formRef}>
<FormRow label={formatMessage(labels.websites)}>
<Dropdown items={websites.data} onChange={handleAddWebsite} style={{ width: 300 }}>
{({ id, name }) => <Item key={id}>{name}</Item>}
</Dropdown>
</FormRow>
<WebsiteTags items={websites.data} websites={newWebsites} onClick={handleRemoveWebsite} />
<FormButtons flex>
<SubmitButton disabled={newWebsites && newWebsites.length === 0}>
{formatMessage(labels.addWebsite)}
</SubmitButton>
<Button onClick={onClose}>{formatMessage(labels.cancel)}</Button>
</FormButtons>
</Form>
)}
</>
);
}

View File

@ -2,13 +2,22 @@ import { Loading, useToasts } from 'react-basics';
import TeamMembersTable from 'components/pages/settings/teams/TeamMembersTable';
import useApi from 'hooks/useApi';
import useMessages from 'hooks/useMessages';
import useApiFilter from 'hooks/useApiFilter';
export function TeamMembers({ teamId, readOnly }) {
const { showToast } = useToasts();
const { get, useQuery } = useApi();
const { formatMessage, messages } = useMessages();
const { data, isLoading, refetch } = useQuery(['teams:users', teamId], () =>
get(`/teams/${teamId}/users`),
const { filter, page, pageSize, handleFilterChange, handlePageChange, handlePageSizeChange } =
useApiFilter();
const { get, useQuery } = useApi();
const { data, isLoading, refetch } = useQuery(
['teams:users', teamId, filter, page, pageSize],
() =>
get(`/teams/${teamId}/users`, {
filter,
page,
pageSize,
}),
);
if (isLoading) {
@ -22,7 +31,15 @@ export function TeamMembers({ teamId, readOnly }) {
return (
<>
<TeamMembersTable onSave={handleSave} data={data} readOnly={readOnly} />
<TeamMembersTable
onSave={handleSave}
data={data}
readOnly={readOnly}
onFilterChange={handleFilterChange}
onPageChange={handlePageChange}
onPageSizeChange={handlePageSizeChange}
filterValue={filter}
/>
</>
);
}

View File

@ -4,7 +4,15 @@ import { ROLES } from 'lib/constants';
import TeamMemberRemoveButton from './TeamMemberRemoveButton';
import SettingsTable from 'components/common/SettingsTable';
export function TeamMembersTable({ data = [], onSave, readOnly }) {
export function TeamMembersTable({
data = [],
onSave,
readOnly,
filterValue,
onFilterChange,
onPageChange,
onPageSizeChange,
}) {
const { formatMessage, labels } = useMessages();
const { user } = useUser();
@ -16,7 +24,7 @@ export function TeamMembersTable({ data = [], onSave, readOnly }) {
const cellRender = (row, data, key) => {
if (key === 'username') {
return row?.user?.username;
return row?.username;
}
if (key === 'role') {
return formatMessage(
@ -27,13 +35,23 @@ export function TeamMembersTable({ data = [], onSave, readOnly }) {
};
return (
<SettingsTable data={data} columns={columns} cellRender={cellRender}>
<SettingsTable
data={data}
columns={columns}
cellRender={cellRender}
showSearch={true}
showPaging={true}
onFilterChange={onFilterChange}
onPageChange={onPageChange}
onPageSizeChange={onPageSizeChange}
filterValue={filterValue}
>
{row => {
return (
!readOnly && (
<TeamMemberRemoveButton
teamId={row.teamId}
userId={row.userId}
userId={row.id}
disabled={user.id === row?.user?.id || row.role === ROLES.teamOwner}
onSave={onSave}
/>

View File

@ -13,13 +13,22 @@ import TeamWebsitesTable from 'components/pages/settings/teams/TeamWebsitesTable
import TeamAddWebsiteForm from 'components/pages/settings/teams/TeamAddWebsiteForm';
import useApi from 'hooks/useApi';
import useMessages from 'hooks/useMessages';
import useApiFilter from 'hooks/useApiFilter';
export function TeamWebsites({ teamId }) {
const { showToast } = useToasts();
const { formatMessage, labels, messages } = useMessages();
const { filter, page, pageSize, handleFilterChange, handlePageChange, handlePageSizeChange } =
useApiFilter();
const { get, useQuery } = useApi();
const { data, isLoading, refetch } = useQuery(['teams:websites', teamId], () =>
get(`/teams/${teamId}/websites`),
const { data, isLoading, refetch } = useQuery(
['teams:websites', teamId, filter, page, pageSize],
() =>
get(`/teams/${teamId}/websites`, {
filter,
page,
pageSize,
}),
);
const hasData = data && data.length !== 0;
@ -49,7 +58,17 @@ export function TeamWebsites({ teamId }) {
return (
<div>
<ActionForm description={formatMessage(messages.teamWebsitesInfo)}>{addButton}</ActionForm>
{hasData && <TeamWebsitesTable teamId={teamId} data={data} onSave={handleSave} />}
{hasData && (
<TeamWebsitesTable
teamId={teamId}
data={data}
onSave={handleSave}
onFilterChange={handleFilterChange}
onPageChange={handlePageChange}
onPageSizeChange={handlePageSizeChange}
filterValue={filter}
/>
)}
</div>
);
}

View File

@ -6,9 +6,17 @@ import TeamWebsiteRemoveButton from './TeamWebsiteRemoveButton';
import SettingsTable from 'components/common/SettingsTable';
import useConfig from 'hooks/useConfig';
export function TeamWebsitesTable({ data = [], onSave }) {
export function TeamWebsitesTable({
data = [],
onSave,
filterValue,
onFilterChange,
onPageChange,
onPageSizeChange,
}) {
const { formatMessage, labels } = useMessages();
const { openExternal } = useConfig();
const { user } = useUser();
const columns = [
{ name: 'name', label: formatMessage(labels.name) },
@ -17,11 +25,19 @@ export function TeamWebsitesTable({ data = [], onSave }) {
];
return (
<SettingsTable columns={columns} data={data}>
<SettingsTable
columns={columns}
data={data}
showSearch={true}
showPaging={true}
onFilterChange={onFilterChange}
onPageChange={onPageChange}
onPageSizeChange={onPageSizeChange}
filterValue={filterValue}
>
{row => {
const { teamId } = row;
const { id: websiteId, name, domain, userId } = row.website;
const { teamUser } = row.team;
const { id: teamId, teamUser } = row.teamWebsite[0].team;
const { id: websiteId, name, domain, userId } = row;
const owner = teamUser[0];
const canRemove = user.id === userId || user.id === owner.userId;

View File

@ -1,24 +1,37 @@
import { useState } from 'react';
import { Button, Icon, Modal, ModalTrigger, useToasts, Text, Flexbox } from 'react-basics';
import EmptyPlaceholder from 'components/common/EmptyPlaceholder';
import TeamAddForm from 'components/pages/settings/teams/TeamAddForm';
import PageHeader from 'components/layout/PageHeader';
import TeamsTable from 'components/pages/settings/teams/TeamsTable';
import Page from 'components/layout/Page';
import Icons from 'components/icons';
import TeamJoinForm from './TeamJoinForm';
import Page from 'components/layout/Page';
import PageHeader from 'components/layout/PageHeader';
import TeamAddForm from 'components/pages/settings/teams/TeamAddForm';
import TeamsTable from 'components/pages/settings/teams/TeamsTable';
import useApi from 'hooks/useApi';
import useMessages from 'hooks/useMessages';
import { ROLES } from 'lib/constants';
import useUser from 'hooks/useUser';
import { ROLES } from 'lib/constants';
import { useState } from 'react';
import { Button, Flexbox, Icon, Modal, ModalTrigger, Text, useToasts } from 'react-basics';
import TeamJoinForm from './TeamJoinForm';
import useApiFilter from 'hooks/useApiFilter';
export default function TeamsList() {
const { user } = useUser();
const { formatMessage, labels, messages } = useMessages();
const { filter, page, pageSize, handleFilterChange, handlePageChange, handlePageSizeChange } =
useApiFilter();
const [update, setUpdate] = useState(0);
const { get, useQuery } = useApi();
const { data, isLoading, error } = useQuery(['teams', update], () => get(`/teams`));
const hasData = data && data.length !== 0;
const { data, isLoading, error } = useQuery(['teams', update, filter, page, pageSize], () => {
return get(`/teams`, {
filter,
page,
pageSize,
});
});
const hasData = data && data?.data.length !== 0;
const isFiltered = filter;
const { showToast } = useToasts();
const handleSave = () => {
@ -71,15 +84,26 @@ export default function TeamsList() {
return (
<Page loading={isLoading} error={error}>
<PageHeader title={formatMessage(labels.teams)}>
{hasData && (
{(hasData || isFiltered) && (
<Flexbox gap={10}>
{joinButton}
{createButton}
</Flexbox>
)}
</PageHeader>
{hasData && <TeamsTable data={data} onDelete={handleDelete} />}
{!hasData && (
{(hasData || isFiltered) && (
<TeamsTable
data={data}
onDelete={handleDelete}
onFilterChange={handleFilterChange}
onPageChange={handlePageChange}
onPageSizeChange={handlePageSizeChange}
filterValue={filter}
/>
)}
{!hasData && !isFiltered && (
<EmptyPlaceholder message={formatMessage(messages.noTeams)}>
<Flexbox gap={10}>
{joinButton}

View File

@ -1,14 +1,21 @@
import SettingsTable from 'components/common/SettingsTable';
import useLocale from 'hooks/useLocale';
import useMessages from 'hooks/useMessages';
import useUser from 'hooks/useUser';
import { ROLES } from 'lib/constants';
import Link from 'next/link';
import { Button, Icon, Icons, Modal, ModalTrigger, Text } from 'react-basics';
import TeamDeleteForm from './TeamDeleteForm';
import TeamLeaveForm from './TeamLeaveForm';
import useMessages from 'hooks/useMessages';
import useUser from 'hooks/useUser';
import { ROLES } from 'lib/constants';
import SettingsTable from 'components/common/SettingsTable';
import useLocale from 'hooks/useLocale';
export function TeamsTable({ data = [], onDelete }) {
export function TeamsTable({
data = { data: [] },
onDelete,
filterValue,
onFilterChange,
onPageChange,
onPageSizeChange,
}) {
const { formatMessage, labels } = useMessages();
const { user } = useUser();
const { dir } = useLocale();
@ -27,7 +34,17 @@ export function TeamsTable({ data = [], onDelete }) {
};
return (
<SettingsTable data={data} columns={columns} cellRender={cellRender}>
<SettingsTable
data={data}
columns={columns}
cellRender={cellRender}
showSearch={true}
showPaging={true}
onFilterChange={onFilterChange}
onPageChange={onPageChange}
onPageSizeChange={onPageSizeChange}
filterValue={filterValue}
>
{row => {
const { id, teamUser } = row;
const owner = teamUser.find(({ role }) => role === ROLES.teamOwner);

View File

@ -7,14 +7,27 @@ import UserAddButton from './UserAddButton';
import useApi from 'hooks/useApi';
import useUser from 'hooks/useUser';
import useMessages from 'hooks/useMessages';
import useApiFilter from 'hooks/useApiFilter';
export function UsersList() {
const { formatMessage, labels, messages } = useMessages();
const { user } = useUser();
const { filter, page, pageSize, handleFilterChange, handlePageChange, handlePageSizeChange } =
useApiFilter();
const { get, useQuery } = useApi();
const { data, isLoading, error, refetch } = useQuery(['user'], () => get(`/users`), {
enabled: !!user,
});
const { data, isLoading, error, refetch } = useQuery(
['user', filter, page, pageSize],
() =>
get(`/users`, {
filter,
page,
pageSize,
}),
{
enabled: !!user,
},
);
const { showToast } = useToasts();
const hasData = data && data.length !== 0;
@ -33,8 +46,17 @@ export function UsersList() {
<PageHeader title={formatMessage(labels.users)}>
<UserAddButton onSave={handleSave} />
</PageHeader>
{hasData && <UsersTable data={data} onDelete={handleDelete} />}
{!hasData && (
{(hasData || filter) && (
<UsersTable
data={data}
onDelete={handleDelete}
onFilterChange={handleFilterChange}
onPageChange={handlePageChange}
onPageSizeChange={handlePageSizeChange}
filterValue={filter}
/>
)}
{!hasData && !filter && (
<EmptyPlaceholder message={formatMessage(messages.noUsers)}>
<UserAddButton onSave={handleSave} />
</EmptyPlaceholder>

View File

@ -8,7 +8,14 @@ import useMessages from 'hooks/useMessages';
import SettingsTable from 'components/common/SettingsTable';
import useLocale from 'hooks/useLocale';
export function UsersTable({ data = [], onDelete }) {
export function UsersTable({
data = { data: [] },
onDelete,
filterValue,
onFilterChange,
onPageChange,
onPageSizeChange,
}) {
const { formatMessage, labels } = useMessages();
const { user } = useUser();
const { dateLocale } = useLocale();
@ -36,7 +43,17 @@ export function UsersTable({ data = [], onDelete }) {
};
return (
<SettingsTable data={data} columns={columns} cellRender={cellRender}>
<SettingsTable
data={data}
columns={columns}
cellRender={cellRender}
showSearch={true}
showPaging={true}
onFilterChange={onFilterChange}
onPageChange={onPageChange}
onPageSizeChange={onPageSizeChange}
filterValue={filterValue}
>
{(row, keys, rowIndex) => {
return (
<>

View File

@ -1,25 +1,41 @@
import { Button, Icon, Text, Modal, ModalTrigger, useToasts, Icons } from 'react-basics';
import Page from 'components/layout/Page';
import PageHeader from 'components/layout/PageHeader';
import EmptyPlaceholder from 'components/common/EmptyPlaceholder';
import WebsiteAddForm from 'components/pages/settings/websites/WebsiteAddForm';
import WebsitesTable from 'components/pages/settings/websites/WebsitesTable';
import useApi from 'hooks/useApi';
import useUser from 'hooks/useUser';
import useApiFilter from 'hooks/useApiFilter';
import useMessages from 'hooks/useMessages';
import useUser from 'hooks/useUser';
import { ROLES } from 'lib/constants';
import { Button, Icon, Icons, Modal, ModalTrigger, Text, useToasts } from 'react-basics';
export function WebsitesList() {
export function WebsitesList({
showTeam,
showEditButton = true,
showHeader = true,
includeTeams,
onlyTeams,
fetch,
}) {
const { formatMessage, labels, messages } = useMessages();
const { user } = useUser();
const { filter, page, pageSize, handleFilterChange, handlePageChange, handlePageSizeChange } =
useApiFilter();
const { get, useQuery } = useApi();
const { data, isLoading, error, refetch } = useQuery(
['websites', user?.id],
() => get(`/users/${user?.id}/websites`),
['websites', fetch, user?.id, filter, page, pageSize, includeTeams, onlyTeams],
() =>
get(`/users/${user?.id}/websites`, {
filter,
page,
pageSize,
includeTeams,
onlyTeams,
}),
{ enabled: !!user },
);
const { showToast } = useToasts();
const hasData = data && data.length !== 0;
const handleSave = async () => {
await refetch();
@ -46,13 +62,16 @@ export function WebsitesList() {
return (
<Page loading={isLoading} error={error}>
<PageHeader title={formatMessage(labels.websites)}>{addButton}</PageHeader>
{hasData && <WebsitesTable data={data} />}
{!hasData && (
<EmptyPlaceholder message={formatMessage(messages.noWebsitesConfigured)}>
{addButton}
</EmptyPlaceholder>
)}
{showHeader && <PageHeader title={formatMessage(labels.websites)}>{addButton}</PageHeader>}
<WebsitesTable
data={data}
showTeam={showTeam}
showEditButton={showEditButton}
onFilterChange={handleFilterChange}
onPageChange={handlePageChange}
onPageSizeChange={handlePageSizeChange}
filterValue={filter}
/>
</Page>
);
}

View File

@ -1,46 +1,89 @@
import EmptyPlaceholder from 'components/common/EmptyPlaceholder';
import Link from 'next/link';
import { Button, Text, Icon, Icons } from 'react-basics';
import SettingsTable from 'components/common/SettingsTable';
import useMessages from 'hooks/useMessages';
import useConfig from 'hooks/useConfig';
import useUser from 'hooks/useUser';
export function WebsitesTable({ data = [] }) {
const { formatMessage, labels } = useMessages();
export function WebsitesTable({
data = [],
filterValue,
onFilterChange,
onPageChange,
onPageSizeChange,
showTeam,
showEditButton,
}) {
const { formatMessage, labels, messages } = useMessages();
const { openExternal } = useConfig();
const { user } = useUser();
const showTable = data && (filterValue || data?.data.length !== 0);
const teamColumns = [
{ name: 'teamName', label: formatMessage(labels.teamName) },
{ name: 'owner', label: formatMessage(labels.owner) },
];
const columns = [
{ name: 'name', label: formatMessage(labels.name) },
{ name: 'domain', label: formatMessage(labels.domain) },
...(showTeam ? teamColumns : []),
{ name: 'action', label: ' ' },
];
return (
<SettingsTable columns={columns} data={data}>
{row => {
const { id } = row;
<>
{showTable && (
<SettingsTable
columns={columns}
data={data}
showSearch={true}
showPaging={true}
onFilterChange={onFilterChange}
onPageChange={onPageChange}
onPageSizeChange={onPageSizeChange}
filterValue={filterValue}
>
{row => {
const {
id,
teamWebsite,
user: { username, id: ownerId },
} = row;
if (showTeam) {
row.teamName = teamWebsite[0]?.team.name;
row.owner = username;
}
return (
<>
<Link href={`/settings/websites/${id}`}>
<Button>
<Icon>
<Icons.Edit />
</Icon>
<Text>{formatMessage(labels.edit)}</Text>
</Button>
</Link>
<Link href={`/websites/${id}`} target={openExternal ? '_blank' : null}>
<Button>
<Icon>
<Icons.External />
</Icon>
<Text>{formatMessage(labels.view)}</Text>
</Button>
</Link>
</>
);
}}
</SettingsTable>
return (
<>
{showEditButton && (!showTeam || ownerId === user.id) && (
<Link href={`/settings/websites/${id}`}>
<Button>
<Icon>
<Icons.Edit />
</Icon>
<Text>{formatMessage(labels.edit)}</Text>
</Button>
</Link>
)}
<Link href={`/websites/${id}`} target={openExternal ? '_blank' : null}>
<Button>
<Icon>
<Icons.External />
</Icon>
<Text>{formatMessage(labels.view)}</Text>
</Button>
</Link>
</>
);
}}
</SettingsTable>
)}
{!showTable && <EmptyPlaceholder message={formatMessage(messages.noDataAvailable)} />}
</>
);
}

View File

@ -1,13 +1,25 @@
import EmptyPlaceholder from 'components/common/EmptyPlaceholder';
import Page from 'components/layout/Page';
import Link from 'next/link';
import { Button, Icon, Icons, Text, Flexbox } from 'react-basics';
import { useMessages, useReports } from 'hooks';
import ReportsTable from 'components/pages/reports/ReportsTable';
import { useMessages, useWebsiteReports } from 'hooks';
import Link from 'next/link';
import { Button, Flexbox, Icon, Icons, Text } from 'react-basics';
import WebsiteHeader from './WebsiteHeader';
export function WebsiteReportsPage({ websiteId }) {
const { formatMessage, labels } = useMessages();
const { reports, error, isLoading, deleteReport } = useReports(websiteId);
const { formatMessage, labels, messages } = useMessages();
const {
reports,
error,
isLoading,
deleteReport,
filter,
handleFilterChange,
handlePageChange,
handlePageSizeChange,
} = useWebsiteReports(websiteId);
const hasData = (reports && reports.data.length !== 0) || filter;
const handleDelete = async id => {
await deleteReport(id);
@ -26,7 +38,17 @@ export function WebsiteReportsPage({ websiteId }) {
</Button>
</Link>
</Flexbox>
<ReportsTable data={reports} onDelete={handleDelete} />
{hasData && (
<ReportsTable
data={reports}
onDelete={handleDelete}
onFilterChange={handleFilterChange}
onPageChange={handlePageChange}
onPageSizeChange={handlePageSizeChange}
filterValue={filter}
/>
)}
{!hasData && <EmptyPlaceholder message={formatMessage(messages.noDataAvailable)} />}
</Page>
);
}

View File

@ -0,0 +1,77 @@
import Page from 'components/layout/Page';
import PageHeader from 'components/layout/PageHeader';
import WebsiteAddForm from 'components/pages/settings/websites/WebsiteAddForm';
import WebsiteList from 'components/pages/settings/websites/WebsitesList';
import { useMessages } from 'hooks';
import useUser from 'hooks/useUser';
import useConfig from 'hooks/useConfig';
import { ROLES } from 'lib/constants';
import { useState } from 'react';
import {
Button,
Icon,
Icons,
Item,
Modal,
ModalTrigger,
Tabs,
Text,
useToasts,
} from 'react-basics';
export function WebsitesPage() {
const { formatMessage, labels, messages } = useMessages();
const [tab, setTab] = useState('my-websites');
const [fetch, setFetch] = useState(1);
const { user } = useUser();
const { cloudMode } = useConfig();
const { showToast } = useToasts();
const handleSave = async () => {
setFetch(fetch + 1);
showToast({ message: formatMessage(messages.saved), variant: 'success' });
};
const addButton = (
<>
{user.role !== ROLES.viewOnly && (
<ModalTrigger>
<Button variant="primary">
<Icon>
<Icons.Plus />
</Icon>
<Text>{formatMessage(labels.addWebsite)}</Text>
</Button>
<Modal title={formatMessage(labels.addWebsite)}>
{close => <WebsiteAddForm onSave={handleSave} onClose={close} />}
</Modal>
</ModalTrigger>
)}
</>
);
return (
<Page>
<PageHeader title={formatMessage(labels.websites)}>{!cloudMode && addButton}</PageHeader>
<Tabs selectedKey={tab} onSelect={setTab} style={{ marginBottom: 30 }}>
<Item key="my-websites">{formatMessage(labels.myWebsites)}</Item>
<Item key="team-webaites">{formatMessage(labels.teamWebsites)}</Item>
</Tabs>
{tab === 'my-websites' && (
<WebsiteList showEditButton={!cloudMode} showHeader={false} fetch={fetch} />
)}
{tab === 'team-webaites' && (
<WebsiteList
showEditButton={!cloudMode}
showHeader={false}
fetch={fetch}
showTeam={true}
onlyTeams={true}
/>
)}
</Page>
);
}
export default WebsitesPage;

View File

@ -0,0 +1,50 @@
-- CreateIndex
CREATE INDEX `event_data_website_id_created_at_idx` ON `event_data`(`website_id`, `created_at`);
-- CreateIndex
CREATE INDEX `event_data_website_id_created_at_event_key_idx` ON `event_data`(`website_id`, `created_at`, `event_key`);
-- CreateIndex
CREATE INDEX `session_website_id_created_at_idx` ON `session`(`website_id`, `created_at`);
-- CreateIndex
CREATE INDEX `session_website_id_created_at_hostname_idx` ON `session`(`website_id`, `created_at`, `hostname`);
-- CreateIndex
CREATE INDEX `session_website_id_created_at_browser_idx` ON `session`(`website_id`, `created_at`, `browser`);
-- CreateIndex
CREATE INDEX `session_website_id_created_at_os_idx` ON `session`(`website_id`, `created_at`, `os`);
-- CreateIndex
CREATE INDEX `session_website_id_created_at_device_idx` ON `session`(`website_id`, `created_at`, `device`);
-- CreateIndex
CREATE INDEX `session_website_id_created_at_screen_idx` ON `session`(`website_id`, `created_at`, `screen`);
-- CreateIndex
CREATE INDEX `session_website_id_created_at_language_idx` ON `session`(`website_id`, `created_at`, `language`);
-- CreateIndex
CREATE INDEX `session_website_id_created_at_country_idx` ON `session`(`website_id`, `created_at`, `country`);
-- CreateIndex
CREATE INDEX `session_website_id_created_at_subdivision1_idx` ON `session`(`website_id`, `created_at`, `subdivision1`);
-- CreateIndex
CREATE INDEX `session_website_id_created_at_city_idx` ON `session`(`website_id`, `created_at`, `city`);
-- CreateIndex
CREATE INDEX `website_event_website_id_created_at_url_path_idx` ON `website_event`(`website_id`, `created_at`, `url_path`);
-- CreateIndex
CREATE INDEX `website_event_website_id_created_at_url_query_idx` ON `website_event`(`website_id`, `created_at`, `url_query`);
-- CreateIndex
CREATE INDEX `website_event_website_id_created_at_referrer_domain_idx` ON `website_event`(`website_id`, `created_at`, `referrer_domain`);
-- CreateIndex
CREATE INDEX `website_event_website_id_created_at_page_title_idx` ON `website_event`(`website_id`, `created_at`, `page_title`);
-- CreateIndex
CREATE INDEX `website_event_website_id_created_at_event_name_idx` ON `website_event`(`website_id`, `created_at`, `event_name`);

View File

@ -44,6 +44,16 @@ model Session {
@@index([createdAt])
@@index([websiteId])
@@index([websiteId, createdAt])
@@index([websiteId, createdAt, hostname])
@@index([websiteId, createdAt, browser])
@@index([websiteId, createdAt, os])
@@index([websiteId, createdAt, device])
@@index([websiteId, createdAt, screen])
@@index([websiteId, createdAt, language])
@@index([websiteId, createdAt, country])
@@index([websiteId, createdAt, subdivision1])
@@index([websiteId, createdAt, city])
@@map("session")
}
@ -91,6 +101,11 @@ model WebsiteEvent {
@@index([sessionId])
@@index([websiteId])
@@index([websiteId, createdAt])
@@index([websiteId, createdAt, urlPath])
@@index([websiteId, createdAt, urlQuery])
@@index([websiteId, createdAt, referrerDomain])
@@index([websiteId, createdAt, pageTitle])
@@index([websiteId, createdAt, eventName])
@@index([websiteId, sessionId, createdAt])
@@map("website_event")
}
@ -113,6 +128,8 @@ model EventData {
@@index([websiteId])
@@index([websiteEventId])
@@index([websiteId, websiteEventId, createdAt])
@@index([websiteId, createdAt])
@@index([websiteId, createdAt, eventKey])
@@map("event_data")
}

View File

@ -0,0 +1,50 @@
-- CreateIndex
CREATE INDEX "event_data_website_id_created_at_idx" ON "event_data"("website_id", "created_at");
-- CreateIndex
CREATE INDEX "event_data_website_id_created_at_event_key_idx" ON "event_data"("website_id", "created_at", "event_key");
-- CreateIndex
CREATE INDEX "session_website_id_created_at_idx" ON "session"("website_id", "created_at");
-- CreateIndex
CREATE INDEX "session_website_id_created_at_hostname_idx" ON "session"("website_id", "created_at", "hostname");
-- CreateIndex
CREATE INDEX "session_website_id_created_at_browser_idx" ON "session"("website_id", "created_at", "browser");
-- CreateIndex
CREATE INDEX "session_website_id_created_at_os_idx" ON "session"("website_id", "created_at", "os");
-- CreateIndex
CREATE INDEX "session_website_id_created_at_device_idx" ON "session"("website_id", "created_at", "device");
-- CreateIndex
CREATE INDEX "session_website_id_created_at_screen_idx" ON "session"("website_id", "created_at", "screen");
-- CreateIndex
CREATE INDEX "session_website_id_created_at_language_idx" ON "session"("website_id", "created_at", "language");
-- CreateIndex
CREATE INDEX "session_website_id_created_at_country_idx" ON "session"("website_id", "created_at", "country");
-- CreateIndex
CREATE INDEX "session_website_id_created_at_subdivision1_idx" ON "session"("website_id", "created_at", "subdivision1");
-- CreateIndex
CREATE INDEX "session_website_id_created_at_city_idx" ON "session"("website_id", "created_at", "city");
-- CreateIndex
CREATE INDEX "website_event_website_id_created_at_url_path_idx" ON "website_event"("website_id", "created_at", "url_path");
-- CreateIndex
CREATE INDEX "website_event_website_id_created_at_url_query_idx" ON "website_event"("website_id", "created_at", "url_query");
-- CreateIndex
CREATE INDEX "website_event_website_id_created_at_referrer_domain_idx" ON "website_event"("website_id", "created_at", "referrer_domain");
-- CreateIndex
CREATE INDEX "website_event_website_id_created_at_page_title_idx" ON "website_event"("website_id", "created_at", "page_title");
-- CreateIndex
CREATE INDEX "website_event_website_id_created_at_event_name_idx" ON "website_event"("website_id", "created_at", "event_name");

View File

@ -44,6 +44,16 @@ model Session {
@@index([createdAt])
@@index([websiteId])
@@index([websiteId, createdAt])
@@index([websiteId, createdAt, hostname])
@@index([websiteId, createdAt, browser])
@@index([websiteId, createdAt, os])
@@index([websiteId, createdAt, device])
@@index([websiteId, createdAt, screen])
@@index([websiteId, createdAt, language])
@@index([websiteId, createdAt, country])
@@index([websiteId, createdAt, subdivision1])
@@index([websiteId, createdAt, city])
@@map("session")
}
@ -91,6 +101,11 @@ model WebsiteEvent {
@@index([sessionId])
@@index([websiteId])
@@index([websiteId, createdAt])
@@index([websiteId, createdAt, urlPath])
@@index([websiteId, createdAt, urlQuery])
@@index([websiteId, createdAt, referrerDomain])
@@index([websiteId, createdAt, pageTitle])
@@index([websiteId, createdAt, eventName])
@@index([websiteId, sessionId, createdAt])
@@map("website_event")
}
@ -112,6 +127,8 @@ model EventData {
@@index([createdAt])
@@index([websiteId])
@@index([websiteEventId])
@@index([websiteId, createdAt])
@@index([websiteId, createdAt, eventKey])
@@map("event_data")
}

View File

@ -6,6 +6,7 @@ export * from './useDocumentClick';
export * from './useEscapeKey';
export * from './useFilters';
export * from './useForceUpdate';
export * from './useFormat';
export * from './useLanguageNames';
export * from './useLocale';
export * from './useMessages';
@ -19,3 +20,4 @@ export * from './useTheme';
export * from './useTimezone';
export * from './useUser';
export * from './useWebsite';
export * from './useWebsiteReports';

28
hooks/useApiFilter.ts Normal file
View File

@ -0,0 +1,28 @@
import { useState } from 'react';
export function useApiFilter() {
const [filter, setFilter] = useState();
const [filterType, setFilterType] = useState('All');
const [page, setPage] = useState(1);
const [pageSize, setPageSize] = useState(10);
const handleFilterChange = value => setFilter(value);
const handlePageChange = value => setPage(value);
const handlePageSizeChange = value => setPageSize(value);
return {
filter,
setFilter,
filterType,
setFilterType,
page,
setPage,
pageSize,
setPageSize,
handleFilterChange,
handlePageChange,
handlePageSizeChange,
};
}
export default useApiFilter;

View File

@ -1,33 +1,47 @@
import { useMessages } from 'hooks';
import { OPERATORS } from 'lib/constants';
export function useFilters() {
const { formatMessage, labels } = useMessages();
const filters = {
eq: formatMessage(labels.equals),
neq: formatMessage(labels.doesNotEqual),
c: formatMessage(labels.contains),
dnc: formatMessage(labels.doesNotContain),
t: formatMessage(labels.true),
f: formatMessage(labels.false),
gt: formatMessage(labels.greaterThan),
lt: formatMessage(labels.lessThan),
gte: formatMessage(labels.greaterThanEquals),
lte: formatMessage(labels.lessThanEquals),
be: formatMessage(labels.before),
af: formatMessage(labels.after),
const filterLabels = {
[OPERATORS.equals]: formatMessage(labels.is),
[OPERATORS.notEquals]: formatMessage(labels.isNot),
[OPERATORS.set]: formatMessage(labels.isSet),
[OPERATORS.notSet]: formatMessage(labels.isNotSet),
[OPERATORS.contains]: formatMessage(labels.contains),
[OPERATORS.doesNotContain]: formatMessage(labels.doesNotContain),
[OPERATORS.true]: formatMessage(labels.true),
[OPERATORS.false]: formatMessage(labels.false),
[OPERATORS.greaterThan]: formatMessage(labels.greaterThan),
[OPERATORS.lessThan]: formatMessage(labels.lessThan),
[OPERATORS.greaterThanEquals]: formatMessage(labels.greaterThanEquals),
[OPERATORS.lessThanEquals]: formatMessage(labels.lessThanEquals),
[OPERATORS.before]: formatMessage(labels.before),
[OPERATORS.after]: formatMessage(labels.after),
};
const types = {
string: ['eq', 'neq'],
array: ['c', 'dnc'],
boolean: ['t', 'f'],
number: ['eq', 'neq', 'gt', 'lt', 'gte', 'lte'],
date: ['be', 'af'],
uuid: ['eq'],
const typeFilters = {
string: [OPERATORS.equals, OPERATORS.notEquals],
array: [OPERATORS.contains, OPERATORS.doesNotContain],
boolean: [OPERATORS.true, OPERATORS.false],
number: [
OPERATORS.equals,
OPERATORS.notEquals,
OPERATORS.greaterThan,
OPERATORS.lessThan,
OPERATORS.greaterThanEquals,
OPERATORS.lessThanEquals,
],
date: [OPERATORS.before, OPERATORS.after],
uuid: [OPERATORS.equals],
};
return { filters, types };
const getFilters = type => {
return typeFilters[type]?.map(key => ({ type, value: key, label: filterLabels[key] })) ?? [];
};
return { getFilters, filterLabels, typeFilters };
}
export default useFilters;

39
hooks/useFormat.js Normal file
View File

@ -0,0 +1,39 @@
import useMessages from './useMessages';
import { BROWSERS } from 'lib/constants';
import useLocale from './useLocale';
import useCountryNames from './useCountryNames';
export function useFormat() {
const { formatMessage, labels } = useMessages();
const { locale } = useLocale();
const countryNames = useCountryNames(locale);
const formatBrowser = value => {
return BROWSERS[value] || value;
};
const formatCountry = value => {
return countryNames[value] || value;
};
const formatDevice = value => {
return formatMessage(labels[value] || labels.unknown);
};
const formatValue = (value, type) => {
switch (type) {
case 'browser':
return formatBrowser(value);
case 'country':
return formatCountry(value);
case 'device':
return formatDevice(value);
default:
return value;
}
};
return { formatBrowser, formatCountry, formatDevice, formatValue };
}
export default useFormat;

View File

@ -2,13 +2,17 @@ import { useIntl, FormattedMessage } from 'react-intl';
import { messages, labels } from 'components/messages';
export function useMessages() {
const { formatMessage } = useIntl();
const intl = useIntl();
function getMessage(id) {
const getMessage = id => {
const message = Object.values(messages).find(value => value.id === id);
return message ? formatMessage(message) : id;
}
};
const formatMessage = (descriptor, values, opts) => {
return descriptor ? intl.formatMessage(descriptor, values, opts) : null;
};
return { formatMessage, FormattedMessage, messages, labels, getMessage };
}

View File

@ -1,5 +1,6 @@
import { produce } from 'immer';
import { useCallback, useEffect, useState } from 'react';
import { useTimezone } from './useTimezone';
import useApi from './useApi';
const baseParameters = {
@ -12,6 +13,7 @@ export function useReport(reportId, defaultParameters) {
const [report, setReport] = useState(null);
const [isRunning, setIsRunning] = useState(false);
const { get, post } = useApi();
const [timezone] = useTimezone();
const loadReport = async id => {
const data = await get(`/reports/${id}`);
@ -33,7 +35,7 @@ export function useReport(reportId, defaultParameters) {
const { type } = report;
const data = await post(`/reports/${type}`, parameters);
const data = await post(`/reports/${type}`, { ...parameters, timezone });
setReport(
produce(state => {

View File

@ -1,12 +1,16 @@
import { useState } from 'react';
import useApi from './useApi';
import useApiFilter from 'hooks/useApiFilter';
export function useReports(websiteId) {
export function useReports() {
const [modified, setModified] = useState(Date.now());
const { get, useQuery, del, useMutation } = useApi();
const { mutate } = useMutation(reportId => del(`/reports/${reportId}`));
const { data, error, isLoading } = useQuery(['reports:website', { websiteId, modified }], () =>
get(`/reports`, { websiteId }),
const { filter, page, pageSize, handleFilterChange, handlePageChange, handlePageSizeChange } =
useApiFilter();
const { data, error, isLoading } = useQuery(
['reports', { modified, filter, page, pageSize }],
() => get(`/reports`, { filter, page, pageSize }),
);
const deleteReport = id => {
@ -17,7 +21,18 @@ export function useReports(websiteId) {
});
};
return { reports: data, error, isLoading, deleteReport };
return {
reports: data,
error,
isLoading,
deleteReport,
filter,
page,
pageSize,
handleFilterChange,
handlePageChange,
handlePageSizeChange,
};
}
export default useReports;

View File

@ -0,0 +1,38 @@
import { useState } from 'react';
import useApi from './useApi';
import useApiFilter from 'hooks/useApiFilter';
export function useWebsiteReports(websiteId) {
const [modified, setModified] = useState(Date.now());
const { get, useQuery, del, useMutation } = useApi();
const { mutate } = useMutation(reportId => del(`/reports/${reportId}`));
const { filter, page, pageSize, handleFilterChange, handlePageChange, handlePageSizeChange } =
useApiFilter();
const { data, error, isLoading } = useQuery(
['reports:website', { websiteId, modified, filter, page, pageSize }],
() => get(`/websites/${websiteId}/reports`, { websiteId, filter, page, pageSize }),
);
const deleteReport = id => {
mutate(id, {
onSuccess: () => {
setModified(Date.now());
},
});
};
return {
reports: data,
error,
isLoading,
deleteReport,
filter,
page,
pageSize,
handleFilterChange,
handlePageChange,
handlePageSizeChange,
};
}
export default useWebsiteReports;

View File

@ -6,21 +6,30 @@
"label.add-description": "Add description",
"label.add-website": "Add website",
"label.admin": "Administrator",
"label.after": "After",
"label.all": "All",
"label.all-time": "All time",
"label.analytics": "Analytics",
"label.average": "Average",
"label.average-visit-time": "Average visit time",
"label.back": "Back",
"label.before": "Before",
"label.bounce-rate": "Bounce rate",
"label.breakdown": "Breakdown",
"label.browser": "Browser",
"label.browsers": "Browsers",
"label.cancel": "Cancel",
"label.change-password": "Change password",
"label.cities": "Cities",
"label.city": "City",
"label.clear-all": "Clear all",
"label.confirm": "Confirm",
"label.confirm-password": "Confirm password",
"label.contains": "Contains",
"label.continue": "Continue",
"label.countries": "Countries",
"label.country": "Country",
"label.create-report": "Create report",
"label.create-team": "Create team",
"label.create-user": "Create user",
"label.created": "Created",
@ -28,16 +37,21 @@
"label.custom-range": "Custom range",
"label.dashboard": "Dashboard",
"label.data": "Data",
"label.date": "Date",
"label.date-range": "Date range",
"label.day": "Day",
"label.default-date-range": "Default date range",
"label.delete": "Delete",
"label.delete-team": "Delete team",
"label.delete-user": "Delete user",
"label.delete-website": "Delete website",
"label.description": "Description",
"label.desktop": "Desktop",
"label.details": "Details",
"label.device": "Device",
"label.devices": "Devices",
"label.dismiss": "Dismiss",
"label.does-not-contain": "Does not contain",
"label.domain": "Domain",
"label.dropoff": "Dropoff",
"label.edit": "Edit",
@ -46,12 +60,20 @@
"label.event": "Event",
"label.event-data": "Event Data",
"label.events": "Events",
"label.false": "False",
"label.field": "Field",
"label.fields": "Fields",
"label.filter-combined": "Combined",
"label.filter-raw": "Raw",
"label.filters": "Filters",
"label.funnel": "Funnel",
"label.greater-than": "Greater than",
"label.greater-than-equals": "Greater than or equals",
"label.insights": "Insights",
"label.is": "Is",
"label.is-not": "Is not",
"label.is-not-set": "Is not set",
"label.is-set": "Is set",
"label.join": "Join",
"label.join-team": "Join team",
"label.language": "Language",
@ -61,17 +83,25 @@
"label.last-hours": "Last {x} hours",
"label.leave": "Leave",
"label.leave-team": "Leave team",
"label.less-than": "Less than",
"label.less-than-equals": "Less than or equals",
"label.login": "Login",
"label.logout": "Logout",
"label.max": "Max",
"label.members": "Members",
"label.min": "Min",
"label.mobile": "Mobile",
"label.more": "More",
"label.my-websites": "My websites",
"label.name": "Name",
"label.new-password": "New password",
"label.none": "None",
"label.operating-systems": "Operating systems",
"label.os": "OS",
"label.overview": "Overview",
"label.owner": "Owner",
"label.page-of": "Page {current} of {total}",
"label.page-views": "Page views",
"label.pageTitle": "Page title",
"label.pages": "Pages",
"label.password": "Password",
"label.powered-by": "Powered by {name}",
@ -80,15 +110,18 @@
"label.query": "Query",
"label.query-parameters": "Query parameters",
"label.realtime": "Realtime",
"label.referrer": "Referrer",
"label.referrers": "Referrers",
"label.refresh": "Refresh",
"label.regenerate": "Regenerate",
"label.region": "Region",
"label.regions": "Regions",
"label.remove": "Remove",
"label.reports": "Reports",
"label.required": "Required",
"label.reset": "Reset",
"label.reset-website": "Reset statistics",
"label.retention": "Retention",
"label.role": "Role",
"label.run-query": "Run query",
"label.save": "Save",
@ -99,12 +132,15 @@
"label.settings": "Settings",
"label.share-url": "Share URL",
"label.single-day": "Single day",
"label.sum": "Sum",
"label.tablet": "Tablet",
"label.team": "Team",
"label.team-guest": "Team guest",
"label.team-id": "Team ID",
"label.team-member": "Team member",
"label.team-name": "Team name",
"label.team-owner": "Team owner",
"label.team-websites": "Team websites",
"label.teams": "Teams",
"label.theme": "Theme",
"label.this-month": "This month",
@ -114,14 +150,21 @@
"label.title": "Title",
"label.today": "Today",
"label.toggle-charts": "Toggle charts",
"label.total": "Total",
"label.total-records": "Total records",
"label.tracking-code": "Tracking code",
"label.true": "True",
"label.type": "Type",
"label.unique": "Unique",
"label.unique-visitors": "Unique visitors",
"label.unknown": "Unknown",
"label.untitled": "Untitled",
"label.url": "URL",
"label.urls": "URLs",
"label.user": "User",
"label.username": "Username",
"label.users": "Users",
"label.value": "Value",
"label.view": "View",
"label.view-details": "View details",
"label.view-only": "View only",
@ -132,33 +175,6 @@
"label.websites": "Websites",
"label.window": "Window",
"label.yesterday": "Yesterday",
"labels.after": "After",
"labels.average": "Average",
"labels.before": "Before",
"labels.breakdown": "Breakdown",
"labels.contains": "Contains",
"labels.create-report": "Create report",
"labels.description": "Description",
"labels.does-not-contain": "Does not contain",
"labels.does-not-equal": "Does not equal",
"labels.equals": "Equals",
"labels.false": "False",
"labels.filters": "Filters",
"labels.greater-than": "Greater than",
"labels.greater-than-equals": "Greater than or equals",
"labels.less-than": "Less than",
"labels.less-than-equals": "Less than or equals",
"labels.max": "Max",
"labels.min": "Min",
"labels.overview": "Overview",
"labels.sum": "Sum",
"labels.total": "Total",
"labels.total-records": "Total records",
"labels.true": "True",
"labels.type": "Type",
"labels.unique": "Unique",
"labels.untitled": "Untitled",
"labels.value": "Value",
"message.active-users": "{x} current {x, plural, one {visitor} other {visitors}}",
"message.confirm-delete": "Are you sure you want to delete {target}?",
"message.confirm-leave": "Are you sure you want to leave {target}?",
@ -172,11 +188,15 @@
"message.incorrect-username-password": "Incorrect username/password.",
"message.invalid-domain": "Invalid domain. Do not include http/https.",
"message.min-password-length": "Minimum length of {n} characters",
"message.new-version-available": "A new version of Umami {version} is available!",
"message.no-data-available": "No data available.",
"message.no-event-data": "No event data is available.",
"message.no-match-password": "Passwords do not match.",
"message.no-results-found": "No results were found.",
"message.no-team-websites": "This team does not have any websites.",
"message.no-teams": "You have not created any teams.",
"message.no-users": "There are no users.",
"message.no-websites-configured": "You do not have any websites configured.",
"message.page-not-found": "Page not found.",
"message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
"message.reset-website-warning": "All statistics for this website will be deleted, but your settings will remain intact.",
@ -184,12 +204,8 @@
"message.share-url": "This is the publicly shared URL for {target}.",
"message.team-already-member": "You are already a member of the team.",
"message.team-not-found": "Team not found.",
"message.team-websites-info": "Websites can be viewed by anyone on the team.",
"message.tracking-code": "To track stats for this website, place the following code in the <head>...</head> section of your HTML.",
"message.user-deleted": "User deleted.",
"message.visitor-log": "Visitor from {country} using {browser} on {os} {device}",
"message.no-results-found": "No results were found.",
"message.no-team-websites": "This team does not have any websites.",
"message.no-websites-configured": "You do not have any websites configured.",
"message.team-websites-info": "Websites can be viewed by anyone on the team.",
"message.new-version-available": "A new version of Umami {version} is available!"
"message.visitor-log": "Visitor from {country} using {browser} on {os} {device}"
}

View File

@ -6,21 +6,30 @@
"label.add-description": "Add description",
"label.add-website": "إضافة موقع",
"label.admin": "مدير",
"label.after": "After",
"label.all": "الكل",
"label.all-time": "كل الوقت",
"label.analytics": "تحليلات",
"label.average": "Average",
"label.average-visit-time": "متوسط وقت الزيارة",
"label.back": "للخلف",
"label.before": "Before",
"label.bounce-rate": "معدل الارتداد",
"label.breakdown": "Breakdown",
"label.browser": "Browser",
"label.browsers": "المتصفحات",
"label.cancel": "إلغاء",
"label.change-password": "تغيير كلمة المرور",
"label.cities": "المدن",
"label.city": "City",
"label.clear-all": "مسح الكل",
"label.confirm": "تأكيد",
"label.confirm-password": "تأكيد كلمة المرور",
"label.contains": "Contains",
"label.continue": "متابعة",
"label.countries": "الدول",
"label.country": "Country",
"label.create-report": "Create report",
"label.create-team": "انشاء مجموعة",
"label.create-user": "انشاء مستخدم",
"label.created": "تم الانشاء",
@ -28,16 +37,21 @@
"label.custom-range": "فترة مخصصة",
"label.dashboard": "الشاشة الرئيسية",
"label.data": "البيانات",
"label.date": "Date",
"label.date-range": "فترة مخصصة",
"label.day": "Day",
"label.default-date-range": "الفترة المخصصة الافتراضية",
"label.delete": "حذف",
"label.delete-team": "حذف مجموعة",
"label.delete-user": "جذف مستخدم",
"label.delete-website": "حذف الموقع",
"label.description": "Description",
"label.desktop": "كمبيوتر",
"label.details": "تفاصيل",
"label.device": "Device",
"label.devices": "الأجهزة",
"label.dismiss": "اخفاء",
"label.does-not-contain": "Does not contain",
"label.domain": "النطاق",
"label.dropoff": "Dropoff",
"label.edit": "تعديل",
@ -46,12 +60,20 @@
"label.event": "Event",
"label.event-data": "Event data",
"label.events": "الأحداث",
"label.false": "False",
"label.field": "Field",
"label.fields": "Fields",
"label.filter-combined": "مجمعة",
"label.filter-raw": "مفصلة",
"label.filters": "Filters",
"label.funnel": "Funnel",
"label.greater-than": "Greater than",
"label.greater-than-equals": "Greater than or equals",
"label.insights": "Insights",
"label.is": "Is",
"label.is-not": "Is not",
"label.is-not-set": "Is not set",
"label.is-set": "Is set",
"label.join": "انضمام",
"label.join-team": "الانضمام للمجموعة",
"label.language": "اللغة",
@ -61,17 +83,25 @@
"label.last-hours": "اخر {x} ساعة/ساعات",
"label.leave": "مغادرة",
"label.leave-team": "مغادرة المجموعة",
"label.less-than": "Less than",
"label.less-than-equals": "Less than or equals",
"label.login": "تسجيل الدخول",
"label.logout": "تسجيل الخروج",
"label.max": "Max",
"label.members": "الأعضاء",
"label.min": "Min",
"label.mobile": "جوال",
"label.more": "المزيد",
"label.my-websites": "My websites",
"label.name": "الإسم",
"label.new-password": "كلمة مرور جديدة",
"label.none": "غير معرف",
"label.operating-systems": "نظام التشغيل",
"label.os": "OS",
"label.overview": "Overview",
"label.owner": "المالك",
"label.page-of": "Page {current} of {total}",
"label.page-views": "مشاهدات الصفحة",
"label.pageTitle": "Page title",
"label.pages": "الصفحات",
"label.password": "كلمة المرور",
"label.powered-by": "مشغل بواسطة {name}",
@ -80,15 +110,18 @@
"label.query": "Query",
"label.query-parameters": "متغيرات الرابط",
"label.realtime": "الوقت الفعلي",
"label.referrer": "Referrer",
"label.referrers": "التحويلات",
"label.refresh": "تحديث",
"label.regenerate": "اعادة انشاء",
"label.region": "Region",
"label.regions": "المناطق",
"label.remove": "إزالة",
"label.reports": "Reports",
"label.required": "اجباري",
"label.reset": "اعادة تعيين",
"label.reset-website": "اعادة تعيين الإحصائيات",
"label.retention": "Retention",
"label.role": "الصلاحية",
"label.run-query": "Run query",
"label.save": "حفظ",
@ -99,12 +132,15 @@
"label.settings": "اعدادات",
"label.share-url": "مشاركة الرابط",
"label.single-day": "يوم واحد",
"label.sum": "Sum",
"label.tablet": "تابلت",
"label.team": "مجموعة",
"label.team-guest": "زائر للمجموعة",
"label.team-id": "معرف المجموعة",
"label.team-member": "عضو المجموعة",
"label.team-name": "Team name",
"label.team-owner": "مدير المجموعة",
"label.team-websites": "Team websites",
"label.teams": "المجموعات",
"label.theme": "المظهر",
"label.this-month": "الشهر الحالي",
@ -114,14 +150,21 @@
"label.title": "العنوان",
"label.today": "اليوم",
"label.toggle-charts": "تغيير الإحصائيات",
"label.total": "Total",
"label.total-records": "Total records",
"label.tracking-code": "كود التتبع",
"label.true": "True",
"label.type": "Type",
"label.unique": "Unique",
"label.unique-visitors": "زائرون فريدون",
"label.unknown": "غير معروف",
"label.untitled": "Untitled",
"label.url": "URL",
"label.urls": "URLs",
"label.user": "مستخدم",
"label.username": "اسم المستخدم",
"label.users": "المستخدمين",
"label.value": "Value",
"label.view": "عرض",
"label.view-details": "عرض التفاصيل",
"label.view-only": "View only",
@ -132,33 +175,6 @@
"label.websites": "المواقع",
"label.window": "Window",
"label.yesterday": "الأمس",
"labels.after": "After",
"labels.average": "Average",
"labels.before": "Before",
"labels.breakdown": "Breakdown",
"labels.contains": "Contains",
"labels.create-report": "Create report",
"labels.description": "Description",
"labels.does-not-contain": "Does not contain",
"labels.does-not-equal": "Does not equal",
"labels.equals": "Equals",
"labels.false": "False",
"labels.filters": "Filters",
"labels.greater-than": "Greater than",
"labels.greater-than-equals": "Greater than or equals",
"labels.less-than": "Less than",
"labels.less-than-equals": "Less than or equals",
"labels.max": "Max",
"labels.min": "Min",
"labels.overview": "Overview",
"labels.sum": "Sum",
"labels.total": "Total",
"labels.total-records": "Total records",
"labels.true": "True",
"labels.type": "Type",
"labels.unique": "Unique",
"labels.untitled": "Untitled",
"labels.value": "Value",
"message.active-users": "{x} حاليا {x, plural, one {زائر واحد} other {زوار}}",
"message.confirm-delete": "هل أنت متأكد من حذف {target}?",
"message.confirm-leave": "هل أنت متأكد من مغادرة {target}?",
@ -172,11 +188,15 @@
"message.incorrect-username-password": "اسم المستخدم او كلمة المرور غير صحيحة.",
"message.invalid-domain": "النطاق غير صحيح",
"message.min-password-length": "اقل عدد مسموح به {n} حرف/أحرف",
"message.new-version-available": "A new version of Umami {version} is available!",
"message.no-data-available": "لا توجد بيانات متاحة.",
"message.no-event-data": "No event data is available.",
"message.no-match-password": "كلمة المرور غير متطابقة",
"message.no-results-found": "No results were found.",
"message.no-team-websites": "هذه المجموعة ليس لديه اي موقع.",
"message.no-teams": "لم تقم بإنشاء اي مجموعة.",
"message.no-users": "لا يوجد مستخدمين.",
"message.no-websites-configured": "لم تقم بإعداد اي موقع.",
"message.page-not-found": "الصفحة غير موجودة.",
"message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
"message.reset-website-warning": "سيتم اعادة تعيين كافة الإحصائيات لهذا الموقع، لكن لن يتم تعيير كود التتبع",
@ -184,12 +204,8 @@
"message.share-url": "هذا الرابط الذي تم مشاركته بشكل عام لـ {target}.",
"message.team-already-member": "أنت عضو في المجموعة",
"message.team-not-found": "لم يتم العثور على المجموعة",
"message.team-websites-info": "يمكن مشاهدة الموقع من اي عضو في المجموعة.",
"message.tracking-code": "كود التتبع",
"message.user-deleted": "تم حذف المستخدم.",
"message.visitor-log": "زائر من {country} يستخدم {browser} على {os} {device}",
"message.no-results-found": "No results were found.",
"message.no-team-websites": "هذه المجموعة ليس لديه اي موقع.",
"message.no-websites-configured": "لم تقم بإعداد اي موقع.",
"message.team-websites-info": "يمكن مشاهدة الموقع من اي عضو في المجموعة.",
"message.new-version-available": "A new version of Umami {version} is available!"
"message.visitor-log": "زائر من {country} يستخدم {browser} على {os} {device}"
}

View File

@ -6,21 +6,30 @@
"label.add-description": "Add description",
"label.add-website": "Дадаць сайт",
"label.admin": "Адміністратар",
"label.after": "After",
"label.all": "Усё",
"label.all-time": "Увесь час",
"label.analytics": "Analytics",
"label.average": "Average",
"label.average-visit-time": "Сярэдняя даўжыня наведвання",
"label.back": "Назад",
"label.before": "Before",
"label.bounce-rate": "Паказчык адмоваў",
"label.breakdown": "Breakdown",
"label.browser": "Browser",
"label.browsers": "Браўзеры",
"label.cancel": "Адмена",
"label.change-password": "Змяніць пароль",
"label.cities": "Cities",
"label.city": "City",
"label.clear-all": "Clear all",
"label.confirm": "Confirm",
"label.confirm-password": "Падцвердзіць пароль",
"label.contains": "Contains",
"label.continue": "Continue",
"label.countries": "Краіны",
"label.country": "Country",
"label.create-report": "Create report",
"label.create-team": "Create team",
"label.create-user": "Create user",
"label.created": "Created",
@ -28,16 +37,21 @@
"label.custom-range": "Карыстацкі дыяпазон",
"label.dashboard": "Інфармацыйная панэль",
"label.data": "Data",
"label.date": "Date",
"label.date-range": "Дыяпазон дат",
"label.day": "Day",
"label.default-date-range": "Дыяпазон дат па змаўчанню",
"label.delete": "Выдаліць",
"label.delete-team": "Delete team",
"label.delete-user": "Delete user",
"label.delete-website": "Выдаліць сайт",
"label.description": "Description",
"label.desktop": "Настольны ПК",
"label.details": "Details",
"label.device": "Device",
"label.devices": "Прылады",
"label.dismiss": "Адмена",
"label.does-not-contain": "Does not contain",
"label.domain": "Дамен",
"label.dropoff": "Dropoff",
"label.edit": "Змяніць",
@ -46,12 +60,20 @@
"label.event": "Event",
"label.event-data": "Event data",
"label.events": "Падзеі",
"label.false": "False",
"label.field": "Field",
"label.fields": "Fields",
"label.filter-combined": "Камбініаваны",
"label.filter-raw": "Сырыя",
"label.filters": "Filters",
"label.funnel": "Funnel",
"label.greater-than": "Greater than",
"label.greater-than-equals": "Greater than or equals",
"label.insights": "Insights",
"label.is": "Is",
"label.is-not": "Is not",
"label.is-not-set": "Is not set",
"label.is-set": "Is set",
"label.join": "Join",
"label.join-team": "Join team",
"label.language": "Мова",
@ -61,17 +83,25 @@
"label.last-hours": "Апошнія {x} гадзіны",
"label.leave": "Leave",
"label.leave-team": "Leave team",
"label.less-than": "Less than",
"label.less-than-equals": "Less than or equals",
"label.login": "Login",
"label.logout": "Выйсці",
"label.max": "Max",
"label.members": "Members",
"label.min": "Min",
"label.mobile": "Мабільны",
"label.more": "Болей",
"label.my-websites": "My websites",
"label.name": "Імя",
"label.new-password": "Новы пароль",
"label.none": "Няма",
"label.operating-systems": "Аперацыонныя сістэмы",
"label.os": "OS",
"label.overview": "Overview",
"label.owner": "Уласнік",
"label.page-of": "Page {current} of {total}",
"label.page-views": "Прагляды старонкі",
"label.pageTitle": "Page title",
"label.pages": "Старонкі",
"label.password": "Пароль",
"label.powered-by": "Зроблена {name}",
@ -80,15 +110,18 @@
"label.query": "Query",
"label.query-parameters": "Query parameters",
"label.realtime": "У рэяльным часе",
"label.referrer": "Referrer",
"label.referrers": "Referrers",
"label.refresh": "Аднавіць",
"label.regenerate": "Regenerate",
"label.region": "Region",
"label.regions": "Regions",
"label.remove": "Remove",
"label.reports": "Reports",
"label.required": "Абавязкова",
"label.reset": "Скінуць",
"label.reset-website": "Скінуць статыстыку",
"label.retention": "Retention",
"label.role": "Role",
"label.run-query": "Run query",
"label.save": "Захаваць",
@ -99,12 +132,15 @@
"label.settings": "Налады",
"label.share-url": "Падзяліцца спасылкай",
"label.single-day": "Адзін дзень",
"label.sum": "Sum",
"label.tablet": "Планшэт",
"label.team": "Team",
"label.team-guest": "Team guest",
"label.team-id": "Team ID",
"label.team-member": "Team member",
"label.team-name": "Team name",
"label.team-owner": "Team owner",
"label.team-websites": "Team websites",
"label.teams": "Teams",
"label.theme": "Тэма",
"label.this-month": "Гэты месяц",
@ -114,14 +150,21 @@
"label.title": "Title",
"label.today": "Сёння",
"label.toggle-charts": "Пераключыць графікі",
"label.total": "Total",
"label.total-records": "Total records",
"label.tracking-code": "Код адсочвання",
"label.true": "True",
"label.type": "Type",
"label.unique": "Unique",
"label.unique-visitors": "Унікальныя наведвальнікі",
"label.unknown": "Невядома",
"label.untitled": "Untitled",
"label.url": "URL",
"label.urls": "URLs",
"label.user": "User",
"label.username": "Імя карыстальніка",
"label.users": "Users",
"label.value": "Value",
"label.view": "View",
"label.view-details": "Пабачыць дэталі",
"label.view-only": "View only",
@ -132,33 +175,6 @@
"label.websites": "Сайты",
"label.window": "Window",
"label.yesterday": "Учора",
"labels.after": "After",
"labels.average": "Average",
"labels.before": "Before",
"labels.breakdown": "Breakdown",
"labels.contains": "Contains",
"labels.create-report": "Create report",
"labels.description": "Description",
"labels.does-not-contain": "Does not contain",
"labels.does-not-equal": "Does not equal",
"labels.equals": "Equals",
"labels.false": "False",
"labels.filters": "Filters",
"labels.greater-than": "Greater than",
"labels.greater-than-equals": "Greater than or equals",
"labels.less-than": "Less than",
"labels.less-than-equals": "Less than or equals",
"labels.max": "Max",
"labels.min": "Min",
"labels.overview": "Overview",
"labels.sum": "Sum",
"labels.total": "Total",
"labels.total-records": "Total records",
"labels.true": "True",
"labels.type": "Type",
"labels.unique": "Unique",
"labels.untitled": "Untitled",
"labels.value": "Value",
"message.active-users": "{x} тякучых {x, plural, one {наведвальнік} other {наведвальнікаў}}",
"message.confirm-delete": "Вы дакладна хочаце выдаліць {target}?",
"message.confirm-leave": "Are you sure you want to leave {target}?",
@ -172,11 +188,15 @@
"message.incorrect-username-password": "Некарэктны username/password.",
"message.invalid-domain": "Некарэктны дамен",
"message.min-password-length": "Minimum length of {n} characters",
"message.new-version-available": "A new version of Umami {version} is available!",
"message.no-data-available": "Няма дадзеных.",
"message.no-event-data": "No event data is available.",
"message.no-match-password": "Паролі не супадаюць",
"message.no-results-found": "No results were found.",
"message.no-team-websites": "This team does not have any websites.",
"message.no-teams": "You have not created any teams.",
"message.no-users": "There are no users.",
"message.no-websites-configured": "Вы не наладзілі ніводнага сайту.",
"message.page-not-found": "Старонка не знойдзена.",
"message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
"message.reset-website-warning": "Уся статыстыка для гэтага сайту будзе выдалена, але код адсочвання будзе працягваць працаваць.",
@ -184,12 +204,8 @@
"message.share-url": "Гэта публічная спасылка для {target}.",
"message.team-already-member": "You are already a member of the team.",
"message.team-not-found": "Team not found.",
"message.team-websites-info": "Websites can be viewed by anyone on the team.",
"message.tracking-code": "Код адсочвання",
"message.user-deleted": "User deleted.",
"message.visitor-log": "Наведвальнік з {country} праз {browser} на {os} {device}",
"message.no-results-found": "No results were found.",
"message.no-team-websites": "This team does not have any websites.",
"message.no-websites-configured": "Вы не наладзілі ніводнага сайту.",
"message.team-websites-info": "Websites can be viewed by anyone on the team.",
"message.new-version-available": "A new version of Umami {version} is available!"
"message.visitor-log": "Наведвальнік з {country} праз {browser} на {os} {device}"
}

View File

@ -6,21 +6,30 @@
"label.add-description": "Add description",
"label.add-website": "ওয়েবসাইট যুক্ত করুন",
"label.admin": "অ্যাডমিন",
"label.after": "After",
"label.all": "সবগুলো",
"label.all-time": "সব সময়",
"label.analytics": "Analytics",
"label.average": "Average",
"label.average-visit-time": "গড় পরিদর্শনের সময়",
"label.back": "পেছনে",
"label.before": "Before",
"label.bounce-rate": "বহিষ্কারের হার",
"label.breakdown": "Breakdown",
"label.browser": "Browser",
"label.browsers": "ব্রাউজার",
"label.cancel": "বাতিল",
"label.change-password": "পাসওয়ার্ড পরিবর্তন করুন",
"label.cities": "Cities",
"label.city": "City",
"label.clear-all": "Clear all",
"label.confirm": "Confirm",
"label.confirm-password": "পাসওয়ার্ড নিশ্চিত করুন",
"label.contains": "Contains",
"label.continue": "Continue",
"label.countries": "দেশ",
"label.country": "Country",
"label.create-report": "Create report",
"label.create-team": "Create team",
"label.create-user": "Create user",
"label.created": "Created",
@ -28,16 +37,21 @@
"label.custom-range": "কাস্টম রেঞ্জ",
"label.dashboard": "ড্যাশবোর্ড",
"label.data": "Data",
"label.date": "Date",
"label.date-range": "তারিখের পরিসীমা",
"label.day": "Day",
"label.default-date-range": "ডিফল্ট তারিখের পরিসীমা",
"label.delete": "মুছে ফেলুন",
"label.delete-team": "Delete team",
"label.delete-user": "Delete user",
"label.delete-website": "ওয়েবসাইট মুছুন",
"label.description": "Description",
"label.desktop": "ডেস্কটপ",
"label.details": "Details",
"label.device": "Device",
"label.devices": "ডিভাইস গুলো",
"label.dismiss": "বাতিল",
"label.does-not-contain": "Does not contain",
"label.domain": "ডোমেইন",
"label.dropoff": "Dropoff",
"label.edit": "সম্পাদনা করুন",
@ -46,12 +60,20 @@
"label.event": "Event",
"label.event-data": "Event data",
"label.events": "ঘটনা",
"label.false": "False",
"label.field": "Field",
"label.fields": "Fields",
"label.filter-combined": "সম্মিলিত",
"label.filter-raw": "অপরিশোধিত",
"label.filters": "Filters",
"label.funnel": "Funnel",
"label.greater-than": "Greater than",
"label.greater-than-equals": "Greater than or equals",
"label.insights": "Insights",
"label.is": "Is",
"label.is-not": "Is not",
"label.is-not-set": "Is not set",
"label.is-set": "Is set",
"label.join": "Join",
"label.join-team": "Join team",
"label.language": "ভাষা",
@ -61,17 +83,25 @@
"label.last-hours": "শেষ {x} ঘন্টা",
"label.leave": "Leave",
"label.leave-team": "Leave team",
"label.less-than": "Less than",
"label.less-than-equals": "Less than or equals",
"label.login": "লগিন",
"label.logout": "লগ আউট",
"label.max": "Max",
"label.members": "Members",
"label.min": "Min",
"label.mobile": "মুঠোফোন",
"label.more": "আরও",
"label.my-websites": "My websites",
"label.name": "নাম",
"label.new-password": "নতুন পাসওয়ার্ড",
"label.none": "কিছুই না",
"label.operating-systems": "অপারেটিং সিস্টেম গুলো",
"label.os": "OS",
"label.overview": "Overview",
"label.owner": "মালিক",
"label.page-of": "Page {current} of {total}",
"label.page-views": "পৃষ্ঠা পরিদর্শন গুলো",
"label.pageTitle": "Page title",
"label.pages": "পৃষ্ঠাগুলি",
"label.password": "পাসওয়ার্ড",
"label.powered-by": "{name} দ্বারা চালিত",
@ -80,15 +110,18 @@
"label.query": "Query",
"label.query-parameters": "Query parameters",
"label.realtime": "সরাসরি",
"label.referrer": "Referrer",
"label.referrers": "রেফারার্স",
"label.refresh": "রিফ্রেশ",
"label.regenerate": "Regenerate",
"label.region": "Region",
"label.regions": "Regions",
"label.remove": "Remove",
"label.reports": "Reports",
"label.required": "প্রয়োজনীয়",
"label.reset": "রিসেট",
"label.reset-website": "ওয়েবসাইট রিসেট করুন",
"label.retention": "Retention",
"label.role": "Role",
"label.run-query": "Run query",
"label.save": "সংরক্ষণ",
@ -99,12 +132,15 @@
"label.settings": "সেটিংস",
"label.share-url": "ইউআরএল শেয়ার করুন",
"label.single-day": "একদিন",
"label.sum": "Sum",
"label.tablet": "ট্যাবলেট",
"label.team": "Team",
"label.team-guest": "Team guest",
"label.team-id": "Team ID",
"label.team-member": "Team member",
"label.team-name": "Team name",
"label.team-owner": "Team owner",
"label.team-websites": "Team websites",
"label.teams": "Teams",
"label.theme": "থিম",
"label.this-month": "এই মাস",
@ -114,14 +150,21 @@
"label.title": "Title",
"label.today": "আজ",
"label.toggle-charts": "চার্ট পরিবর্তন করুন",
"label.total": "Total",
"label.total-records": "Total records",
"label.tracking-code": "ট্র্যাকিং কোড",
"label.true": "True",
"label.type": "Type",
"label.unique": "Unique",
"label.unique-visitors": "অনন্য ভিজিটর",
"label.unknown": "অজানা",
"label.untitled": "Untitled",
"label.url": "URL",
"label.urls": "URLs",
"label.user": "User",
"label.username": "ব্যবহারকারীর নাম",
"label.users": "Users",
"label.value": "Value",
"label.view": "View",
"label.view-details": "বিস্তারিত দেখুন",
"label.view-only": "View only",
@ -132,33 +175,6 @@
"label.websites": "সবগুলো ওয়েবসাইট",
"label.window": "Window",
"label.yesterday": "Yesterday",
"labels.after": "After",
"labels.average": "Average",
"labels.before": "Before",
"labels.breakdown": "Breakdown",
"labels.contains": "Contains",
"labels.create-report": "Create report",
"labels.description": "Description",
"labels.does-not-contain": "Does not contain",
"labels.does-not-equal": "Does not equal",
"labels.equals": "Equals",
"labels.false": "False",
"labels.filters": "Filters",
"labels.greater-than": "Greater than",
"labels.greater-than-equals": "Greater than or equals",
"labels.less-than": "Less than",
"labels.less-than-equals": "Less than or equals",
"labels.max": "Max",
"labels.min": "Min",
"labels.overview": "Overview",
"labels.sum": "Sum",
"labels.total": "Total",
"labels.total-records": "Total records",
"labels.true": "True",
"labels.type": "Type",
"labels.unique": "Unique",
"labels.untitled": "Untitled",
"labels.value": "Value",
"message.active-users": "{x} বর্তমান {x, plural, one {visitor} other {visitors}}",
"message.confirm-delete": "আপনি কি নিশ্চিত যে আপনি {target} মুছতে চান?",
"message.confirm-leave": "Are you sure you want to leave {target}?",
@ -172,11 +188,15 @@
"message.incorrect-username-password": "ভুল ব্যবহারকারীর নাম/পাসওয়ার্ড।",
"message.invalid-domain": "ভুল ডোমেন",
"message.min-password-length": "Minimum length of {n} characters",
"message.new-version-available": "A new version of Umami {version} is available!",
"message.no-data-available": "কোন তথ্য নেই।",
"message.no-event-data": "No event data is available.",
"message.no-match-password": "পাসওয়ার্ড মেলে না",
"message.no-results-found": "No results were found.",
"message.no-team-websites": "This team does not have any websites.",
"message.no-teams": "You have not created any teams.",
"message.no-users": "There are no users.",
"message.no-websites-configured": "কোনও ওয়েবসাইট কনফিগার করা নেই।",
"message.page-not-found": "পৃষ্ঠা খুঁজে পাওয়া যায়নি।",
"message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
"message.reset-website-warning": "এই ওয়েবসাইটের সমস্ত পরিসংখ্যান মুছে ফেলা হবে, তবে আপনার ট্র্যাকিং কোডটি অক্ষত থাকবে।",
@ -184,12 +204,8 @@
"message.share-url": "এটি {target} এর জন্য প্রকাশ্যে শেয়ার করার ইউআরএল।",
"message.team-already-member": "You are already a member of the team.",
"message.team-not-found": "Team not found.",
"message.team-websites-info": "Websites can be viewed by anyone on the team.",
"message.tracking-code": "ট্র্যাকিং কোড",
"message.user-deleted": "User deleted.",
"message.visitor-log": "{country} থেকে একজন ভিসিটর {ব্রাউজার}, ব্যবহার করছেন {os} {device} এর মধ্যে।",
"message.no-results-found": "No results were found.",
"message.no-team-websites": "This team does not have any websites.",
"message.no-websites-configured": "কোনও ওয়েবসাইট কনফিগার করা নেই।",
"message.team-websites-info": "Websites can be viewed by anyone on the team.",
"message.new-version-available": "A new version of Umami {version} is available!"
"message.visitor-log": "{country} থেকে একজন ভিসিটর {ব্রাউজার}, ব্যবহার করছেন {os} {device} এর মধ্যে।"
}

View File

@ -6,21 +6,30 @@
"label.add-description": "Add description",
"label.add-website": "Afegeix lloc web",
"label.admin": "Administrador",
"label.after": "After",
"label.all": "Tots",
"label.all-time": "Sempre",
"label.analytics": "Analytics",
"label.average": "Average",
"label.average-visit-time": "Temps mitjà de visita",
"label.back": "Enrere",
"label.before": "Before",
"label.bounce-rate": "Percentatge de rebot",
"label.breakdown": "Breakdown",
"label.browser": "Browser",
"label.browsers": "Navegadors",
"label.cancel": "Cancel·la",
"label.change-password": "Canvia la contrasenya",
"label.cities": "Cities",
"label.city": "City",
"label.clear-all": "Clear all",
"label.confirm": "Confirm",
"label.confirm-password": "Confirma la contrasenya",
"label.contains": "Contains",
"label.continue": "Continue",
"label.countries": "Països",
"label.country": "Country",
"label.create-report": "Create report",
"label.create-team": "Create team",
"label.create-user": "Create user",
"label.created": "Created",
@ -28,16 +37,21 @@
"label.custom-range": "Rang personalitzat",
"label.dashboard": "Panell",
"label.data": "Data",
"label.date": "Date",
"label.date-range": "Interval de dates",
"label.day": "Day",
"label.default-date-range": "Interval de dates per defecte",
"label.delete": "Esborra",
"label.delete-team": "Delete team",
"label.delete-user": "Delete user",
"label.delete-website": "Esborra el lloc web",
"label.description": "Description",
"label.desktop": "Escriptori",
"label.details": "Details",
"label.device": "Device",
"label.devices": "Dispositius",
"label.dismiss": "Descarta",
"label.does-not-contain": "Does not contain",
"label.domain": "Domini",
"label.dropoff": "Dropoff",
"label.edit": "Edita",
@ -46,12 +60,20 @@
"label.event": "Event",
"label.event-data": "Event data",
"label.events": "Esdeveniments",
"label.false": "False",
"label.field": "Field",
"label.fields": "Fields",
"label.filter-combined": "Combinat",
"label.filter-raw": "En cru",
"label.filters": "Filters",
"label.funnel": "Funnel",
"label.greater-than": "Greater than",
"label.greater-than-equals": "Greater than or equals",
"label.insights": "Insights",
"label.is": "Is",
"label.is-not": "Is not",
"label.is-not-set": "Is not set",
"label.is-set": "Is set",
"label.join": "Join",
"label.join-team": "Join team",
"label.language": "Language",
@ -61,17 +83,25 @@
"label.last-hours": "Últimes {x} hores",
"label.leave": "Leave",
"label.leave-team": "Leave team",
"label.less-than": "Less than",
"label.less-than-equals": "Less than or equals",
"label.login": "Connecta't",
"label.logout": "Desconnecta't",
"label.max": "Max",
"label.members": "Members",
"label.min": "Min",
"label.mobile": "Mòbil",
"label.more": "Més",
"label.my-websites": "My websites",
"label.name": "Nom",
"label.new-password": "Contrasenya nova",
"label.none": "None",
"label.operating-systems": "Sistemes operatius",
"label.os": "OS",
"label.overview": "Overview",
"label.owner": "Propietari",
"label.page-of": "Page {current} of {total}",
"label.page-views": "Pàgines vistes",
"label.pageTitle": "Page title",
"label.pages": "Pàgines",
"label.password": "Contrasenya",
"label.powered-by": "Funciona amb {name}",
@ -80,15 +110,18 @@
"label.query": "Query",
"label.query-parameters": "Query parameters",
"label.realtime": "Temps real",
"label.referrer": "Referrer",
"label.referrers": "Referents",
"label.refresh": "Refresca",
"label.regenerate": "Regenerate",
"label.region": "Region",
"label.regions": "Regions",
"label.remove": "Remove",
"label.reports": "Reports",
"label.required": "Obligatori",
"label.reset": "Restableix",
"label.reset-website": "Restableix estadístiques",
"label.retention": "Retention",
"label.role": "Role",
"label.run-query": "Run query",
"label.save": "Desa",
@ -99,12 +132,15 @@
"label.settings": "Configuració",
"label.share-url": "Enllaç per compartir",
"label.single-day": "Un sol dia",
"label.sum": "Sum",
"label.tablet": "Tauleta",
"label.team": "Team",
"label.team-guest": "Team guest",
"label.team-id": "Team ID",
"label.team-member": "Team member",
"label.team-name": "Team name",
"label.team-owner": "Team owner",
"label.team-websites": "Team websites",
"label.teams": "Teams",
"label.theme": "Theme",
"label.this-month": "Aquest mes",
@ -114,14 +150,21 @@
"label.title": "Title",
"label.today": "Avui",
"label.toggle-charts": "Mostra/amaga gràfics",
"label.total": "Total",
"label.total-records": "Total records",
"label.tracking-code": "Codi de seguiment",
"label.true": "True",
"label.type": "Type",
"label.unique": "Unique",
"label.unique-visitors": "Visitants únics",
"label.unknown": "Desconegut",
"label.untitled": "Untitled",
"label.url": "URL",
"label.urls": "URLs",
"label.user": "User",
"label.username": "Nom d'usuari",
"label.users": "Users",
"label.value": "Value",
"label.view": "View",
"label.view-details": "Veure els detalls",
"label.view-only": "View only",
@ -132,33 +175,6 @@
"label.websites": "Llocs web",
"label.window": "Window",
"label.yesterday": "Ahir",
"labels.after": "After",
"labels.average": "Average",
"labels.before": "Before",
"labels.breakdown": "Breakdown",
"labels.contains": "Contains",
"labels.create-report": "Create report",
"labels.description": "Description",
"labels.does-not-contain": "Does not contain",
"labels.does-not-equal": "Does not equal",
"labels.equals": "Equals",
"labels.false": "False",
"labels.filters": "Filters",
"labels.greater-than": "Greater than",
"labels.greater-than-equals": "Greater than or equals",
"labels.less-than": "Less than",
"labels.less-than-equals": "Less than or equals",
"labels.max": "Max",
"labels.min": "Min",
"labels.overview": "Overview",
"labels.sum": "Sum",
"labels.total": "Total",
"labels.total-records": "Total records",
"labels.true": "True",
"labels.type": "Type",
"labels.unique": "Unique",
"labels.untitled": "Untitled",
"labels.value": "Value",
"message.active-users": "{x} {x, plural, one {visitant actual} other {visitants actuals}}",
"message.confirm-delete": "Segur que vols esborrar {target}?",
"message.confirm-leave": "Are you sure you want to leave {target}?",
@ -172,11 +188,15 @@
"message.incorrect-username-password": "Nom d'usuari o contrasenya incorrectes.",
"message.invalid-domain": "Domini invàlid",
"message.min-password-length": "Minimum length of {n} characters",
"message.new-version-available": "A new version of Umami {version} is available!",
"message.no-data-available": "No hi ha dades disponibles.",
"message.no-event-data": "No event data is available.",
"message.no-match-password": "Les contrasenyes no coincideixen",
"message.no-results-found": "No results were found.",
"message.no-team-websites": "This team does not have any websites.",
"message.no-teams": "You have not created any teams.",
"message.no-users": "There are no users.",
"message.no-websites-configured": "No hi ha cap lloc web configurat.",
"message.page-not-found": "No s'ha trobat la pàgina.",
"message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
"message.reset-website-warning": "S'esborraran totes les estadístiques per aquest lloc web, però el codi de seguiment es mantindrà.",
@ -184,12 +204,8 @@
"message.share-url": "Aquest és l'enllaç públic per compartir de {target}.",
"message.team-already-member": "You are already a member of the team.",
"message.team-not-found": "Team not found.",
"message.team-websites-info": "Websites can be viewed by anyone on the team.",
"message.tracking-code": "Codi de seguiment",
"message.user-deleted": "User deleted.",
"message.visitor-log": "Visitant de {country} usant {browser} a {os} {device}",
"message.no-results-found": "No results were found.",
"message.no-team-websites": "This team does not have any websites.",
"message.no-websites-configured": "No hi ha cap lloc web configurat.",
"message.team-websites-info": "Websites can be viewed by anyone on the team.",
"message.new-version-available": "A new version of Umami {version} is available!"
"message.visitor-log": "Visitant de {country} usant {browser} a {os} {device}"
}

View File

@ -6,21 +6,30 @@
"label.add-description": "Add description",
"label.add-website": "Přidat web",
"label.admin": "Administrátor",
"label.after": "After",
"label.all": "Vše",
"label.all-time": "All time",
"label.analytics": "Analytics",
"label.average": "Average",
"label.average-visit-time": "Průměrný čas návštěvy",
"label.back": "Zpět",
"label.before": "Before",
"label.bounce-rate": "Okamžité opuštění",
"label.breakdown": "Breakdown",
"label.browser": "Browser",
"label.browsers": "Prohlížeč",
"label.cancel": "Zrušit",
"label.change-password": "Změnit heslo",
"label.cities": "Cities",
"label.city": "City",
"label.clear-all": "Clear all",
"label.confirm": "Confirm",
"label.confirm-password": "Potvrdit heslo",
"label.contains": "Contains",
"label.continue": "Continue",
"label.countries": "Země",
"label.country": "Country",
"label.create-report": "Create report",
"label.create-team": "Create team",
"label.create-user": "Create user",
"label.created": "Created",
@ -28,16 +37,21 @@
"label.custom-range": "Vlastní rozsah",
"label.dashboard": "Přehled",
"label.data": "Data",
"label.date": "Date",
"label.date-range": "Období",
"label.day": "Day",
"label.default-date-range": "Výchozí období",
"label.delete": "Smazat",
"label.delete-team": "Delete team",
"label.delete-user": "Delete user",
"label.delete-website": "Smazat web",
"label.description": "Description",
"label.desktop": "Stolní počítač",
"label.details": "Details",
"label.device": "Device",
"label.devices": "Zařízení",
"label.dismiss": "Odejít",
"label.does-not-contain": "Does not contain",
"label.domain": "Doména",
"label.dropoff": "Dropoff",
"label.edit": "Upravit",
@ -46,12 +60,20 @@
"label.event": "Event",
"label.event-data": "Event data",
"label.events": "Události",
"label.false": "False",
"label.field": "Field",
"label.fields": "Fields",
"label.filter-combined": "Kombinace",
"label.filter-raw": "Nezpracované",
"label.filters": "Filters",
"label.funnel": "Funnel",
"label.greater-than": "Greater than",
"label.greater-than-equals": "Greater than or equals",
"label.insights": "Insights",
"label.is": "Is",
"label.is-not": "Is not",
"label.is-not-set": "Is not set",
"label.is-set": "Is set",
"label.join": "Join",
"label.join-team": "Join team",
"label.language": "Language",
@ -61,17 +83,25 @@
"label.last-hours": "Posledních {x} hodin",
"label.leave": "Leave",
"label.leave-team": "Leave team",
"label.less-than": "Less than",
"label.less-than-equals": "Less than or equals",
"label.login": "Přihlásit",
"label.logout": "Odhlásit",
"label.max": "Max",
"label.members": "Members",
"label.min": "Min",
"label.mobile": "Mobilní telefon",
"label.more": "Více",
"label.my-websites": "My websites",
"label.name": "Jméno",
"label.new-password": "Nové heslo",
"label.none": "None",
"label.operating-systems": "Operační systém",
"label.os": "OS",
"label.overview": "Overview",
"label.owner": "Owner",
"label.page-of": "Page {current} of {total}",
"label.page-views": "Zobrazení stránek",
"label.pageTitle": "Page title",
"label.pages": "Stránky",
"label.password": "Heslo",
"label.powered-by": "Běží na {name}",
@ -80,15 +110,18 @@
"label.query": "Query",
"label.query-parameters": "Query parameters",
"label.realtime": "Aktuálně",
"label.referrer": "Referrer",
"label.referrers": "Odkazy",
"label.refresh": "Obnovit",
"label.regenerate": "Regenerate",
"label.region": "Region",
"label.regions": "Regions",
"label.remove": "Remove",
"label.reports": "Reports",
"label.required": "Vyžadováno",
"label.reset": "Reset",
"label.reset-website": "Reset statistics",
"label.retention": "Retention",
"label.role": "Role",
"label.run-query": "Run query",
"label.save": "Uložit",
@ -99,12 +132,15 @@
"label.settings": "Nastavení",
"label.share-url": "Sdílet URL",
"label.single-day": "Jeden den",
"label.sum": "Sum",
"label.tablet": "Tablet",
"label.team": "Team",
"label.team-guest": "Team guest",
"label.team-id": "Team ID",
"label.team-member": "Team member",
"label.team-name": "Team name",
"label.team-owner": "Team owner",
"label.team-websites": "Team websites",
"label.teams": "Teams",
"label.theme": "Theme",
"label.this-month": "Tento měsíc",
@ -114,14 +150,21 @@
"label.title": "Title",
"label.today": "Dnes",
"label.toggle-charts": "Toggle charts",
"label.total": "Total",
"label.total-records": "Total records",
"label.tracking-code": "Sledovací kód",
"label.true": "True",
"label.type": "Type",
"label.unique": "Unique",
"label.unique-visitors": "Jedinečné návštěvy",
"label.unknown": "Neznámý",
"label.untitled": "Untitled",
"label.url": "URL",
"label.urls": "URLs",
"label.user": "User",
"label.username": "Uživatelské jméno",
"label.users": "Users",
"label.value": "Value",
"label.view": "View",
"label.view-details": "Zobrazit detaily",
"label.view-only": "View only",
@ -132,33 +175,6 @@
"label.websites": "Weby",
"label.window": "Window",
"label.yesterday": "Yesterday",
"labels.after": "After",
"labels.average": "Average",
"labels.before": "Before",
"labels.breakdown": "Breakdown",
"labels.contains": "Contains",
"labels.create-report": "Create report",
"labels.description": "Description",
"labels.does-not-contain": "Does not contain",
"labels.does-not-equal": "Does not equal",
"labels.equals": "Equals",
"labels.false": "False",
"labels.filters": "Filters",
"labels.greater-than": "Greater than",
"labels.greater-than-equals": "Greater than or equals",
"labels.less-than": "Less than",
"labels.less-than-equals": "Less than or equals",
"labels.max": "Max",
"labels.min": "Min",
"labels.overview": "Overview",
"labels.sum": "Sum",
"labels.total": "Total",
"labels.total-records": "Total records",
"labels.true": "True",
"labels.type": "Type",
"labels.unique": "Unique",
"labels.untitled": "Untitled",
"labels.value": "Value",
"message.active-users": "{x} aktuálně {x, plural, one {návštěvník} other {návštěvníci}}",
"message.confirm-delete": "Opravdu smazat {target}?",
"message.confirm-leave": "Are you sure you want to leave {target}?",
@ -172,11 +188,15 @@
"message.incorrect-username-password": "Nesprávné jméno/heslo.",
"message.invalid-domain": "Neplatná doména",
"message.min-password-length": "Minimum length of {n} characters",
"message.new-version-available": "A new version of Umami {version} is available!",
"message.no-data-available": "Žádná data.",
"message.no-event-data": "No event data is available.",
"message.no-match-password": "Hesla se neschodují",
"message.no-results-found": "No results were found.",
"message.no-team-websites": "This team does not have any websites.",
"message.no-teams": "You have not created any teams.",
"message.no-users": "There are no users.",
"message.no-websites-configured": "Nemáte nastavený žádný web.",
"message.page-not-found": "Stránka nenalezena.",
"message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
"message.reset-website-warning": "All statistics for this website will be deleted, but your tracking code will remain intact.",
@ -184,12 +204,8 @@
"message.share-url": "Toto je sdílené URL pro {target}.",
"message.team-already-member": "You are already a member of the team.",
"message.team-not-found": "Team not found.",
"message.team-websites-info": "Websites can be viewed by anyone on the team.",
"message.tracking-code": "Sledovací kód",
"message.user-deleted": "User deleted.",
"message.visitor-log": "Návštěvník z {country} s prohlížečem {browser} na {os} {device}",
"message.no-results-found": "No results were found.",
"message.no-team-websites": "This team does not have any websites.",
"message.no-websites-configured": "Nemáte nastavený žádný web.",
"message.team-websites-info": "Websites can be viewed by anyone on the team.",
"message.new-version-available": "A new version of Umami {version} is available!"
"message.visitor-log": "Návštěvník z {country} s prohlížečem {browser} na {os} {device}"
}

View File

@ -6,21 +6,30 @@
"label.add-description": "Add description",
"label.add-website": "Tilføj hjemmeside",
"label.admin": "Administrator",
"label.after": "After",
"label.all": "Alle",
"label.all-time": "Altid",
"label.analytics": "Analytics",
"label.average": "Average",
"label.average-visit-time": "Gennemsnitlig besøgstid",
"label.back": "Tilbage",
"label.before": "Before",
"label.bounce-rate": "Afvisningsprocent",
"label.breakdown": "Breakdown",
"label.browser": "Browser",
"label.browsers": "Browsere",
"label.cancel": "Afvis",
"label.change-password": "Skift adgangskode",
"label.cities": "Cities",
"label.city": "City",
"label.clear-all": "Clear all",
"label.confirm": "Confirm",
"label.confirm-password": "Godkendt adgangskode",
"label.contains": "Contains",
"label.continue": "Continue",
"label.countries": "Lande",
"label.country": "Country",
"label.create-report": "Create report",
"label.create-team": "Create team",
"label.create-user": "Create user",
"label.created": "Created",
@ -28,16 +37,21 @@
"label.custom-range": "Tilpasset interval",
"label.dashboard": "Betjeningspanel",
"label.data": "Data",
"label.date": "Date",
"label.date-range": "Datointerval",
"label.day": "Day",
"label.default-date-range": "Standard datointerval",
"label.delete": "Slet",
"label.delete-team": "Delete team",
"label.delete-user": "Delete user",
"label.delete-website": "Slet hjemmeside",
"label.description": "Description",
"label.desktop": "Desktop",
"label.details": "Details",
"label.device": "Device",
"label.devices": "Enheder",
"label.dismiss": "Afvis",
"label.does-not-contain": "Does not contain",
"label.domain": "Domæne",
"label.dropoff": "Dropoff",
"label.edit": "Rediger",
@ -46,12 +60,20 @@
"label.event": "Event",
"label.event-data": "Event data",
"label.events": "Hændelser",
"label.false": "False",
"label.field": "Field",
"label.fields": "Fields",
"label.filter-combined": "Kombineret",
"label.filter-raw": "Rå",
"label.filters": "Filters",
"label.funnel": "Funnel",
"label.greater-than": "Greater than",
"label.greater-than-equals": "Greater than or equals",
"label.insights": "Insights",
"label.is": "Is",
"label.is-not": "Is not",
"label.is-not-set": "Is not set",
"label.is-set": "Is set",
"label.join": "Join",
"label.join-team": "Join team",
"label.language": "Sprog",
@ -61,17 +83,25 @@
"label.last-hours": "Sidste {x} timer",
"label.leave": "Leave",
"label.leave-team": "Leave team",
"label.less-than": "Less than",
"label.less-than-equals": "Less than or equals",
"label.login": "Log ind",
"label.logout": "Log ud",
"label.max": "Max",
"label.members": "Members",
"label.min": "Min",
"label.mobile": "Mobil",
"label.more": "Mere",
"label.my-websites": "My websites",
"label.name": "Navn",
"label.new-password": "Ny adgangskode",
"label.none": "None",
"label.operating-systems": "Operativsystemer",
"label.os": "OS",
"label.overview": "Overview",
"label.owner": "Ejer",
"label.page-of": "Page {current} of {total}",
"label.page-views": "Sidevisninger",
"label.pageTitle": "Page title",
"label.pages": "Sider",
"label.password": "Adgangskode",
"label.powered-by": "Drevet af {name}",
@ -80,15 +110,18 @@
"label.query": "Query",
"label.query-parameters": "Query parameters",
"label.realtime": "Realtid",
"label.referrer": "Referrer",
"label.referrers": "Henvisninger",
"label.refresh": "Opdater",
"label.regenerate": "Regenerate",
"label.region": "Region",
"label.regions": "Regions",
"label.remove": "Remove",
"label.reports": "Reports",
"label.required": "Påkrævet",
"label.reset": "Nulstil",
"label.reset-website": "Nulstil statistikker",
"label.retention": "Retention",
"label.role": "Role",
"label.run-query": "Run query",
"label.save": "Gem",
@ -99,12 +132,15 @@
"label.settings": "Indstillinger",
"label.share-url": "Del URL",
"label.single-day": "Enkelt dag",
"label.sum": "Sum",
"label.tablet": "Tablet",
"label.team": "Team",
"label.team-guest": "Team guest",
"label.team-id": "Team ID",
"label.team-member": "Team member",
"label.team-name": "Team name",
"label.team-owner": "Team owner",
"label.team-websites": "Team websites",
"label.teams": "Teams",
"label.theme": "Tema",
"label.this-month": "Denne måned",
@ -114,14 +150,21 @@
"label.title": "Title",
"label.today": "Idag",
"label.toggle-charts": "Ændre graf",
"label.total": "Total",
"label.total-records": "Total records",
"label.tracking-code": "Sporingskode",
"label.true": "True",
"label.type": "Type",
"label.unique": "Unique",
"label.unique-visitors": "Unikke besøgende",
"label.unknown": "Ukendt",
"label.untitled": "Untitled",
"label.url": "URL",
"label.urls": "URLs",
"label.user": "User",
"label.username": "Brugernavn",
"label.users": "Users",
"label.value": "Value",
"label.view": "View",
"label.view-details": "Vis detajler",
"label.view-only": "View only",
@ -132,33 +175,6 @@
"label.websites": "Hjemmesider",
"label.window": "Window",
"label.yesterday": "Yesterday",
"labels.after": "After",
"labels.average": "Average",
"labels.before": "Before",
"labels.breakdown": "Breakdown",
"labels.contains": "Contains",
"labels.create-report": "Create report",
"labels.description": "Description",
"labels.does-not-contain": "Does not contain",
"labels.does-not-equal": "Does not equal",
"labels.equals": "Equals",
"labels.false": "False",
"labels.filters": "Filters",
"labels.greater-than": "Greater than",
"labels.greater-than-equals": "Greater than or equals",
"labels.less-than": "Less than",
"labels.less-than-equals": "Less than or equals",
"labels.max": "Max",
"labels.min": "Min",
"labels.overview": "Overview",
"labels.sum": "Sum",
"labels.total": "Total",
"labels.total-records": "Total records",
"labels.true": "True",
"labels.type": "Type",
"labels.unique": "Unique",
"labels.untitled": "Untitled",
"labels.value": "Value",
"message.active-users": "{x} nuværende {x, plural, one {bruger} other {brugere}}",
"message.confirm-delete": "Er du sikker på at du vil slette {target}?",
"message.confirm-leave": "Are you sure you want to leave {target}?",
@ -172,11 +188,15 @@
"message.incorrect-username-password": "Ugyldigt brugernavn/adgangskode.",
"message.invalid-domain": "Ugyldigt domæne",
"message.min-password-length": "Minimum length of {n} characters",
"message.new-version-available": "A new version of Umami {version} is available!",
"message.no-data-available": "Ingen data tilgængelig.",
"message.no-event-data": "No event data is available.",
"message.no-match-password": "Adgangskoderne matcher ikke",
"message.no-results-found": "No results were found.",
"message.no-team-websites": "This team does not have any websites.",
"message.no-teams": "You have not created any teams.",
"message.no-users": "There are no users.",
"message.no-websites-configured": "Du har ikke konfigureret nogen hjemmesider.",
"message.page-not-found": "Side ikke fundet.",
"message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
"message.reset-website-warning": "Alle statistikker for denne hjemmeside ville blive slettet, men sporingskode ville forblive intakt.",
@ -184,12 +204,8 @@
"message.share-url": "Dette er den offentlige delings-URL til {target}.",
"message.team-already-member": "You are already a member of the team.",
"message.team-not-found": "Team not found.",
"message.team-websites-info": "Websites can be viewed by anyone on the team.",
"message.tracking-code": "Sporingskode",
"message.user-deleted": "User deleted.",
"message.visitor-log": "Besøgende fra {country} bruger {browser} på {os} {device}",
"message.no-results-found": "No results were found.",
"message.no-team-websites": "This team does not have any websites.",
"message.no-websites-configured": "Du har ikke konfigureret nogen hjemmesider.",
"message.team-websites-info": "Websites can be viewed by anyone on the team.",
"message.new-version-available": "A new version of Umami {version} is available!"
"message.visitor-log": "Besøgende fra {country} bruger {browser} på {os} {device}"
}

View File

@ -6,21 +6,30 @@
"label.add-description": "Add description",
"label.add-website": "Websiite hinzuefüege",
"label.admin": "Administrator",
"label.after": "After",
"label.all": "Alli",
"label.all-time": "Gesamte Zitruum",
"label.analytics": "Analytics",
"label.average": "Average",
"label.average-visit-time": "Durchschn. Bsuechsziit",
"label.back": "Zrugg",
"label.before": "Before",
"label.bounce-rate": "Absprungsrate",
"label.breakdown": "Breakdown",
"label.browser": "Browser",
"label.browsers": "Browser",
"label.cancel": "Abbreche",
"label.change-password": "Passwort ändere",
"label.cities": "Städt",
"label.city": "City",
"label.clear-all": "Alles lösche",
"label.confirm": "Bestätige",
"label.confirm-password": "Passwort widerhole",
"label.contains": "Contains",
"label.continue": "Wiiter",
"label.countries": "Länder",
"label.country": "Country",
"label.create-report": "Create report",
"label.create-team": "Team erstelle",
"label.create-user": "Benutzer erstelle",
"label.created": "Erstellt",
@ -28,16 +37,21 @@
"label.custom-range": "Benutzerdefinierte Bereich",
"label.dashboard": "Übersicht",
"label.data": "Datä",
"label.date": "Date",
"label.date-range": "Datumsbereich",
"label.day": "Day",
"label.default-date-range": "Vorigstellte Datumsbereich",
"label.delete": "Lösche",
"label.delete-team": "Team lösche",
"label.delete-user": "Benutzer lösche",
"label.delete-website": "Websiite lösche",
"label.description": "Description",
"label.desktop": "Desktop",
"label.details": "Details",
"label.device": "Device",
"label.devices": "Grät",
"label.dismiss": "Verwerfe",
"label.does-not-contain": "Does not contain",
"label.domain": "Domain",
"label.dropoff": "Dropoff",
"label.edit": "Bearbeite",
@ -46,12 +60,20 @@
"label.event": "Event",
"label.event-data": "Event data",
"label.events": "Ereigniss",
"label.false": "False",
"label.field": "Field",
"label.fields": "Fields",
"label.filter-combined": "Kombiniert",
"label.filter-raw": "Rohdate",
"label.filters": "Filters",
"label.funnel": "Funnel",
"label.greater-than": "Greater than",
"label.greater-than-equals": "Greater than or equals",
"label.insights": "Insights",
"label.is": "Is",
"label.is-not": "Is not",
"label.is-not-set": "Is not set",
"label.is-set": "Is set",
"label.join": "Biträte",
"label.join-team": "Team biträte",
"label.language": "Sprach",
@ -61,17 +83,25 @@
"label.last-hours": "Letzti {x} Stunde",
"label.leave": "Verlah",
"label.leave-team": "Team verlah",
"label.less-than": "Less than",
"label.less-than-equals": "Less than or equals",
"label.login": "Aamelde",
"label.logout": "Abmelde",
"label.max": "Max",
"label.members": "Mitglieder",
"label.min": "Min",
"label.mobile": "Handy",
"label.more": "Meh",
"label.my-websites": "My websites",
"label.name": "Name",
"label.new-password": "Neus Passwort",
"label.none": "Keis",
"label.operating-systems": "Betriibssystem",
"label.os": "OS",
"label.overview": "Overview",
"label.owner": "Bsitzer",
"label.page-of": "Page {current} of {total}",
"label.page-views": "Siitenufrüef",
"label.pageTitle": "Page title",
"label.pages": "Siite",
"label.password": "Passwort",
"label.powered-by": "Betribe dur {name}",
@ -80,15 +110,18 @@
"label.query": "Query",
"label.query-parameters": "Abfragparameter",
"label.realtime": "Echtzit",
"label.referrer": "Referrer",
"label.referrers": "Referrer",
"label.refresh": "Aktualisiere",
"label.regenerate": "Erneuere",
"label.region": "Region",
"label.regions": "Regionä",
"label.remove": "Entferne",
"label.reports": "Reports",
"label.required": "Erforderlich",
"label.reset": "Zruggsetze",
"label.reset-website": "Statistik zruggsetze",
"label.retention": "Retention",
"label.role": "Rollä",
"label.run-query": "Run query",
"label.save": "Speichere",
@ -99,12 +132,15 @@
"label.settings": "Istellige",
"label.share-url": "Freigab-URL",
"label.single-day": "Ein Tag",
"label.sum": "Sum",
"label.tablet": "Tablet",
"label.team": "Team",
"label.team-guest": "Team Gast",
"label.team-id": "Team ID",
"label.team-member": "Team Mitglied",
"label.team-name": "Team name",
"label.team-owner": "Team Bsitzer",
"label.team-websites": "Team websites",
"label.teams": "Teams",
"label.theme": "Thema",
"label.this-month": "De Monet",
@ -114,14 +150,21 @@
"label.title": "Titel",
"label.today": "Hüt",
"label.toggle-charts": "Schaubilder umschalte",
"label.total": "Total",
"label.total-records": "Total records",
"label.tracking-code": "Tracking Code",
"label.true": "True",
"label.type": "Type",
"label.unique": "Unique",
"label.unique-visitors": "Eidütigi Bsuecher",
"label.unknown": "Unbekannt",
"label.untitled": "Untitled",
"label.url": "URL",
"label.urls": "URLs",
"label.user": "Benutzer",
"label.username": "Benutzername",
"label.users": "Benutzer",
"label.value": "Value",
"label.view": "Azeige",
"label.view-details": "Details azeige",
"label.view-only": "View only",
@ -132,33 +175,6 @@
"label.websites": "Websiite",
"label.window": "Window",
"label.yesterday": "Gester",
"labels.after": "After",
"labels.average": "Average",
"labels.before": "Before",
"labels.breakdown": "Breakdown",
"labels.contains": "Contains",
"labels.create-report": "Create report",
"labels.description": "Description",
"labels.does-not-contain": "Does not contain",
"labels.does-not-equal": "Does not equal",
"labels.equals": "Equals",
"labels.false": "False",
"labels.filters": "Filters",
"labels.greater-than": "Greater than",
"labels.greater-than-equals": "Greater than or equals",
"labels.less-than": "Less than",
"labels.less-than-equals": "Less than or equals",
"labels.max": "Max",
"labels.min": "Min",
"labels.overview": "Overview",
"labels.sum": "Sum",
"labels.total": "Total",
"labels.total-records": "Total records",
"labels.true": "True",
"labels.type": "Type",
"labels.unique": "Unique",
"labels.untitled": "Untitled",
"labels.value": "Value",
"message.active-users": "{x} {x, plural, one {aktive Bsuecher} other {aktivi Bsuecher}}",
"message.confirm-delete": "Sind Sie sich sicher, {target} zlösche?",
"message.confirm-leave": "Sind Sie sich sicher, {target} zverlah?",
@ -172,11 +188,15 @@
"message.incorrect-username-password": "Falschs Passwort oder Benutzername.",
"message.invalid-domain": "Ungültigi Domain",
"message.min-password-length": "Miminamli längi vo {n} Zeiche",
"message.new-version-available": "A new version of Umami {version} is available!",
"message.no-data-available": "Kei Date vorhande.",
"message.no-event-data": "No event data is available.",
"message.no-match-password": "Passwörter stimmed ned überi",
"message.no-results-found": "No results were found.",
"message.no-team-websites": "Dem Team sind kei Websiite zuegordnet.",
"message.no-teams": "Bisher sind no kei Teams erstellt worde.",
"message.no-users": "Da gits kei Benutzer",
"message.no-websites-configured": "Es isch kei Websiite vorhande.",
"message.page-not-found": "Siite ned gfunde.",
"message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
"message.reset-website-warning": "Alli Date für die Websiite werdet glöscht, nur de Tracking Code blibt bestah.",
@ -184,12 +204,8 @@
"message.share-url": "Ihri Websiitestatistik isch under de folgende URL öffentlich zuegänglich:",
"message.team-already-member": "Sie sind bereits es Mitglied vo dem Team.",
"message.team-not-found": "Team nöd gfunde.",
"message.team-websites-info": "Websiite chönd vo jedem im Team agluegt werde",
"message.tracking-code": "Tracking Code",
"message.user-deleted": "Benutzer glöscht.",
"message.visitor-log": "Bsuecher us {country} benutzt {browser} uf {os} {device}",
"message.no-results-found": "No results were found.",
"message.no-team-websites": "Dem Team sind kei Websiite zuegordnet.",
"message.no-websites-configured": "Es isch kei Websiite vorhande.",
"message.team-websites-info": "Websiite chönd vo jedem im Team agluegt werde",
"message.new-version-available": "A new version of Umami {version} is available!"
"message.visitor-log": "Bsuecher us {country} benutzt {browser} uf {os} {device}"
}

View File

@ -6,21 +6,30 @@
"label.add-description": "Beschreibung hinzufügen",
"label.add-website": "Webseite hinzufügen",
"label.admin": "Administrator",
"label.after": "After",
"label.all": "Alle",
"label.all-time": "Gesamter Zeitraum",
"label.analytics": "Analytics",
"label.average": "Durchschnitt",
"label.average-visit-time": "Durchschn. Besuchszeit",
"label.back": "Zurück",
"label.before": "Before",
"label.bounce-rate": "Absprungrate",
"label.breakdown": "Breakdown",
"label.browser": "Browser",
"label.browsers": "Browser",
"label.cancel": "Abbrechen",
"label.change-password": "Passwort ändern",
"label.cities": "Städte",
"label.city": "City",
"label.clear-all": "Alles löschen",
"label.confirm": "Bestätigen",
"label.confirm-password": "Passwort wiederholen",
"label.contains": "Contains",
"label.continue": "Weiter",
"label.countries": "Länder",
"label.country": "Country",
"label.create-report": "Report erstellen",
"label.create-team": "Team erstellen",
"label.create-user": "Benutzer erstellen",
"label.created": "Erstellt",
@ -28,16 +37,21 @@
"label.custom-range": "Benutzerdefinierter Bereich",
"label.dashboard": "Übersicht",
"label.data": "Daten",
"label.date": "Date",
"label.date-range": "Datumsbereich",
"label.day": "Day",
"label.default-date-range": "Voreingestellter Datumsbereich",
"label.delete": "Löschen",
"label.delete-team": "Team löschen",
"label.delete-user": "Benutzer löschen",
"label.delete-website": "Webseite löschen",
"label.description": "Beschreibung",
"label.desktop": "Desktop",
"label.details": "Details",
"label.device": "Device",
"label.devices": "Geräte",
"label.dismiss": "Verwerfen",
"label.does-not-contain": "Does not contain",
"label.domain": "Domain",
"label.dropoff": "Dropoff",
"label.edit": "Bearbeiten",
@ -46,12 +60,20 @@
"label.event": "Event",
"label.event-data": "Event daten",
"label.events": "Ereignisse",
"label.false": "False",
"label.field": "Field",
"label.fields": "Fields",
"label.filter-combined": "Kombiniert",
"label.filter-raw": "Rohdaten",
"label.filters": "Filters",
"label.funnel": "Funnel",
"label.greater-than": "Größer als",
"label.greater-than-equals": "Größer oder gleich",
"label.insights": "Insights",
"label.is": "Is",
"label.is-not": "Is not",
"label.is-not-set": "Is not set",
"label.is-set": "Is set",
"label.join": "Beitreten",
"label.join-team": "Team beitreten",
"label.language": "Sprache",
@ -61,17 +83,25 @@
"label.last-hours": "Letzte {x} Stunden",
"label.leave": "Verlassen",
"label.leave-team": "Team verlassen",
"label.less-than": "Kleiner als",
"label.less-than-equals": "Kleiner oder gleich",
"label.login": "Anmelden",
"label.logout": "Abmelden",
"label.max": "Max",
"label.members": "Mitglieder",
"label.min": "Min",
"label.mobile": "Handy",
"label.more": "Mehr",
"label.my-websites": "My websites",
"label.name": "Name",
"label.new-password": "Neues Passwort",
"label.none": "Keine",
"label.operating-systems": "Betriebssysteme",
"label.os": "OS",
"label.overview": "Übersicht",
"label.owner": "Besitzer",
"label.page-of": "Page {current} of {total}",
"label.page-views": "Seitenaufrufe",
"label.pageTitle": "Page title",
"label.pages": "Seiten",
"label.password": "Passwort",
"label.powered-by": "Betrieben durch {name}",
@ -80,15 +110,18 @@
"label.query": "Abfrage",
"label.query-parameters": "Abfrageparameter",
"label.realtime": "Echtzeit",
"label.referrer": "Referrer",
"label.referrers": "Referrer",
"label.refresh": "Aktualisieren",
"label.regenerate": "Erneuern",
"label.region": "Region",
"label.regions": "Regionen",
"label.remove": "Entfernen",
"label.reports": "Reporte",
"label.required": "Erforderlich",
"label.reset": "Zurücksetzen",
"label.reset-website": "Statistik zurücksetzen",
"label.retention": "Retention",
"label.role": "Rolle",
"label.run-query": "Abfrage starten",
"label.save": "Speichern",
@ -99,12 +132,15 @@
"label.settings": "Einstellungen",
"label.share-url": "Freigabe-URL",
"label.single-day": "Ein Tag",
"label.sum": "Summe",
"label.tablet": "Tablet",
"label.team": "Team",
"label.team-guest": "Team Gast",
"label.team-id": "Team ID",
"label.team-member": "Team Mitglied",
"label.team-name": "Team name",
"label.team-owner": "Team Eigentümer",
"label.team-websites": "Team websites",
"label.teams": "Teams",
"label.theme": "Thema",
"label.this-month": "Diesen Monat",
@ -114,14 +150,21 @@
"label.title": "Titel",
"label.today": "Heute",
"label.toggle-charts": "Schaubilder umschalten",
"label.total": "Total",
"label.total-records": "Total records",
"label.tracking-code": "Tracking Code",
"label.true": "True",
"label.type": "Type",
"label.unique": "Unique",
"label.unique-visitors": "Eindeutige Besucher",
"label.unknown": "Unbekannt",
"label.untitled": "Untitled",
"label.url": "URL",
"label.urls": "URLs",
"label.user": "Benutzer",
"label.username": "Benutzername",
"label.users": "Benutzer",
"label.value": "Value",
"label.view": "Anzeigen",
"label.view-details": "Details anzeigen",
"label.view-only": "View only",
@ -132,33 +175,6 @@
"label.websites": "Webseiten",
"label.window": "Window",
"label.yesterday": "Gestern",
"labels.after": "After",
"labels.average": "Durchschnitt",
"labels.before": "Before",
"labels.breakdown": "Breakdown",
"labels.contains": "Contains",
"labels.create-report": "Report erstellen",
"labels.description": "Beschreibung",
"labels.does-not-contain": "Does not contain",
"labels.does-not-equal": "Does not equal",
"labels.equals": "Equals",
"labels.false": "False",
"labels.filters": "Filters",
"labels.greater-than": "Größer als",
"labels.greater-than-equals": "Größer oder gleich",
"labels.less-than": "Kleiner als",
"labels.less-than-equals": "Kleiner oder gleich",
"labels.max": "Max",
"labels.min": "Min",
"labels.overview": "Übersicht",
"labels.sum": "Summe",
"labels.total": "Total",
"labels.total-records": "Total records",
"labels.true": "True",
"labels.type": "Type",
"labels.unique": "Unique",
"labels.untitled": "Untitled",
"labels.value": "Value",
"message.active-users": "{x} {x, plural, one {aktiver Besucher} other {aktive Besucher}}",
"message.confirm-delete": "Sind Sie sich sicher, {target} zu löschen?",
"message.confirm-leave": "Sind Sie sicher, dass die {target} verlassen möchten?",
@ -172,11 +188,15 @@
"message.incorrect-username-password": "Falsches Passwort oder Benutzername.",
"message.invalid-domain": "Ungültige Domain",
"message.min-password-length": "Minimale länge von {n} Zeichen",
"message.new-version-available": "A new version of Umami {version} is available!",
"message.no-data-available": "Keine Daten vorhanden.",
"message.no-event-data": "No event data is available.",
"message.no-match-password": "Passwörter stimmen nicht überein",
"message.no-results-found": "Keine Ergebnisse gefunden.",
"message.no-team-websites": "Diesem Team sind keine Websites zugeordnet.",
"message.no-teams": "Bisher wurden keine Teams erstellt.",
"message.no-users": "Hier gibt es keine Benutzer.",
"message.no-websites-configured": "Es ist keine Webseite vorhanden.",
"message.page-not-found": "Seite nicht gefunden.",
"message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
"message.reset-website-warning": "Alle Daten für diese Webseite werden gelöscht, jedoch bleibt der Tracking Code bestehen.",
@ -184,12 +204,8 @@
"message.share-url": "Ihre Webseitenstatistik ist unter der folgenden URL öffentlich zugänglich:",
"message.team-already-member": "Sie sind bereits Mitglied des Teams.",
"message.team-not-found": "Team nicht gefunden.",
"message.team-websites-info": "Webseiten können von jedem im Team eingesehen werden.",
"message.tracking-code": "Tracking Code",
"message.user-deleted": "Benutzer gelöscht.",
"message.visitor-log": "Besucher aus {country} benutzt {browser} auf {os} {device}",
"message.no-results-found": "Keine Ergebnisse gefunden.",
"message.no-team-websites": "Diesem Team sind keine Websites zugeordnet.",
"message.no-websites-configured": "Es ist keine Webseite vorhanden.",
"message.team-websites-info": "Webseiten können von jedem im Team eingesehen werden.",
"message.new-version-available": "A new version of Umami {version} is available!"
"message.visitor-log": "Besucher aus {country} benutzt {browser} auf {os} {device}"
}

View File

@ -6,21 +6,30 @@
"label.add-description": "Add description",
"label.add-website": "Προσθήκη ιστότοπου",
"label.admin": "Διαχειριστής",
"label.after": "After",
"label.all": "All",
"label.all-time": "All time",
"label.analytics": "Analytics",
"label.average": "Average",
"label.average-visit-time": "Μέσος χρόνος επίσκεψης",
"label.back": "Πίσω",
"label.before": "Before",
"label.bounce-rate": "Ποσοστό αναπήδησης",
"label.breakdown": "Breakdown",
"label.browser": "Browser",
"label.browsers": "Προγράμματα περιήγησης",
"label.cancel": "Ακύρωση",
"label.change-password": "Αλλαγή κωδικού",
"label.cities": "Cities",
"label.city": "City",
"label.clear-all": "Clear all",
"label.confirm": "Confirm",
"label.confirm-password": "Επιβεβαίωση κωδικού",
"label.contains": "Contains",
"label.continue": "Continue",
"label.countries": "Χώρες",
"label.country": "Country",
"label.create-report": "Create report",
"label.create-team": "Create team",
"label.create-user": "Create user",
"label.created": "Created",
@ -28,16 +37,21 @@
"label.custom-range": "Προσαρμοσμένο εύρος",
"label.dashboard": "Πίνακας",
"label.data": "Data",
"label.date": "Date",
"label.date-range": "Εύρος ημερομηνιών",
"label.day": "Day",
"label.default-date-range": "Προεπιλεγμένο εύρος ημερομηνιών",
"label.delete": "Διαγραφή",
"label.delete-team": "Delete team",
"label.delete-user": "Delete user",
"label.delete-website": "Διαγραφή ιστότοπου",
"label.description": "Description",
"label.desktop": "Σταθερός υπολογιστής",
"label.details": "Details",
"label.device": "Device",
"label.devices": "Συσκευές",
"label.dismiss": "Dismiss",
"label.does-not-contain": "Does not contain",
"label.domain": "Τομέας",
"label.dropoff": "Dropoff",
"label.edit": "Επεξεργασία",
@ -46,12 +60,20 @@
"label.event": "Event",
"label.event-data": "Event data",
"label.events": "Γεγονότα",
"label.false": "False",
"label.field": "Field",
"label.fields": "Fields",
"label.filter-combined": "Σε συνδυασμό",
"label.filter-raw": "Ακατέργαστο",
"label.filters": "Filters",
"label.funnel": "Funnel",
"label.greater-than": "Greater than",
"label.greater-than-equals": "Greater than or equals",
"label.insights": "Insights",
"label.is": "Is",
"label.is-not": "Is not",
"label.is-not-set": "Is not set",
"label.is-set": "Is set",
"label.join": "Join",
"label.join-team": "Join team",
"label.language": "Language",
@ -61,17 +83,25 @@
"label.last-hours": "Τελευταίες {x} ώρες",
"label.leave": "Leave",
"label.leave-team": "Leave team",
"label.less-than": "Less than",
"label.less-than-equals": "Less than or equals",
"label.login": "Είσοδος",
"label.logout": "Αποσύνδεση",
"label.max": "Max",
"label.members": "Members",
"label.min": "Min",
"label.mobile": "Κινητό",
"label.more": "Περισσότερα",
"label.my-websites": "My websites",
"label.name": "Όνομα",
"label.new-password": "Νέος κωδικός",
"label.none": "None",
"label.operating-systems": "Λειτουργικά συστήματα",
"label.os": "OS",
"label.overview": "Overview",
"label.owner": "Owner",
"label.page-of": "Page {current} of {total}",
"label.page-views": "Προβολές σελίδας",
"label.pageTitle": "Page title",
"label.pages": "Σελίδες",
"label.password": "Κωδικός",
"label.powered-by": "Με την υποστήριξη του {name}",
@ -80,15 +110,18 @@
"label.query": "Query",
"label.query-parameters": "Query parameters",
"label.realtime": "Realtime",
"label.referrer": "Referrer",
"label.referrers": "Παραπομπές",
"label.refresh": "Ανανέωση",
"label.regenerate": "Regenerate",
"label.region": "Region",
"label.regions": "Regions",
"label.remove": "Remove",
"label.reports": "Reports",
"label.required": "Απαιτείται",
"label.reset": "Επαναφορά",
"label.reset-website": "Reset statistics",
"label.retention": "Retention",
"label.role": "Role",
"label.run-query": "Run query",
"label.save": "Αποθήκευση",
@ -99,12 +132,15 @@
"label.settings": "Ρυθμίσεις",
"label.share-url": "Κοινοποίηση διεύθυνσης URL",
"label.single-day": "Ημερήσια",
"label.sum": "Sum",
"label.tablet": "Τάμπλετ",
"label.team": "Team",
"label.team-guest": "Team guest",
"label.team-id": "Team ID",
"label.team-member": "Team member",
"label.team-name": "Team name",
"label.team-owner": "Team owner",
"label.team-websites": "Team websites",
"label.teams": "Teams",
"label.theme": "Theme",
"label.this-month": "Αυτο το μήνα",
@ -114,14 +150,21 @@
"label.title": "Title",
"label.today": "Σήμερα",
"label.toggle-charts": "Toggle charts",
"label.total": "Total",
"label.total-records": "Total records",
"label.tracking-code": "Κωδικός παρακολούθησης",
"label.true": "True",
"label.type": "Type",
"label.unique": "Unique",
"label.unique-visitors": "Μοναδικοί επισκέπτες",
"label.unknown": "Άγνωστο",
"label.untitled": "Untitled",
"label.url": "URL",
"label.urls": "URLs",
"label.user": "User",
"label.username": "Όνομα χρήστη",
"label.users": "Users",
"label.value": "Value",
"label.view": "View",
"label.view-details": "Λεπτομέρειες",
"label.view-only": "View only",
@ -132,33 +175,6 @@
"label.websites": "Ιστότοποι",
"label.window": "Window",
"label.yesterday": "Yesterday",
"labels.after": "After",
"labels.average": "Average",
"labels.before": "Before",
"labels.breakdown": "Breakdown",
"labels.contains": "Contains",
"labels.create-report": "Create report",
"labels.description": "Description",
"labels.does-not-contain": "Does not contain",
"labels.does-not-equal": "Does not equal",
"labels.equals": "Equals",
"labels.false": "False",
"labels.filters": "Filters",
"labels.greater-than": "Greater than",
"labels.greater-than-equals": "Greater than or equals",
"labels.less-than": "Less than",
"labels.less-than-equals": "Less than or equals",
"labels.max": "Max",
"labels.min": "Min",
"labels.overview": "Overview",
"labels.sum": "Sum",
"labels.total": "Total",
"labels.total-records": "Total records",
"labels.true": "True",
"labels.type": "Type",
"labels.unique": "Unique",
"labels.untitled": "Untitled",
"labels.value": "Value",
"message.active-users": "{x} ενεργοί {x, plural, one {επισκέπτης} other {επισκέπτες}}",
"message.confirm-delete": "Είστε βέβαιοι ότι θέλετε να διαγράψετε το {target};",
"message.confirm-leave": "Are you sure you want to leave {target}?",
@ -172,11 +188,15 @@
"message.incorrect-username-password": "Εσφαλμένο όνομα χρήστη / κωδικός πρόσβασης.",
"message.invalid-domain": "Μη έγκυρος τομέας",
"message.min-password-length": "Minimum length of {n} characters",
"message.new-version-available": "A new version of Umami {version} is available!",
"message.no-data-available": "Δεν υπάρχουν διαθέσιμα δεδομένα.",
"message.no-event-data": "No event data is available.",
"message.no-match-password": "Οι κωδικοί πρόσβασης δεν ταιριάζουν",
"message.no-results-found": "No results were found.",
"message.no-team-websites": "This team does not have any websites.",
"message.no-teams": "You have not created any teams.",
"message.no-users": "There are no users.",
"message.no-websites-configured": "Δεν έχετε ρυθμίσει κανένα ιστότοπο.",
"message.page-not-found": "Η σελίδα δεν βρέθηκε.",
"message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
"message.reset-website-warning": "All statistics for this website will be deleted, but your tracking code will remain intact.",
@ -184,12 +204,8 @@
"message.share-url": "Αυτό είναι το κοινόχρηστο URL για το {target}.",
"message.team-already-member": "You are already a member of the team.",
"message.team-not-found": "Team not found.",
"message.team-websites-info": "Websites can be viewed by anyone on the team.",
"message.tracking-code": "Κωδικός παρακολούθησης",
"message.user-deleted": "User deleted.",
"message.visitor-log": "Visitor from {country} using {browser} on {os} {device}",
"message.no-results-found": "No results were found.",
"message.no-team-websites": "This team does not have any websites.",
"message.no-websites-configured": "Δεν έχετε ρυθμίσει κανένα ιστότοπο.",
"message.team-websites-info": "Websites can be viewed by anyone on the team.",
"message.new-version-available": "A new version of Umami {version} is available!"
"message.visitor-log": "Visitor from {country} using {browser} on {os} {device}"
}

View File

@ -6,21 +6,30 @@
"label.add-description": "Add description",
"label.add-website": "Add website",
"label.admin": "Administrator",
"label.after": "After",
"label.all": "All",
"label.all-time": "All time",
"label.analytics": "Analytics",
"label.average": "Average",
"label.average-visit-time": "Average visit time",
"label.back": "Back",
"label.before": "Before",
"label.bounce-rate": "Bounce rate",
"label.breakdown": "Breakdown",
"label.browser": "Browser",
"label.browsers": "Browsers",
"label.cancel": "Cancel",
"label.change-password": "Change password",
"label.cities": "Cities",
"label.city": "City",
"label.clear-all": "Clear all",
"label.confirm": "Confirm",
"label.confirm-password": "Confirm password",
"label.contains": "Contains",
"label.continue": "Continue",
"label.countries": "Countries",
"label.country": "Country",
"label.create-report": "Create report",
"label.create-team": "Create team",
"label.create-user": "Create user",
"label.created": "Created",
@ -28,16 +37,21 @@
"label.custom-range": "Custom range",
"label.dashboard": "Dashboard",
"label.data": "Data",
"label.date": "Date",
"label.date-range": "Date range",
"label.day": "Day",
"label.default-date-range": "Default date range",
"label.delete": "Delete",
"label.delete-team": "Delete team",
"label.delete-user": "Delete user",
"label.delete-website": "Delete website",
"label.description": "Description",
"label.desktop": "Desktop",
"label.details": "Details",
"label.device": "Device",
"label.devices": "Devices",
"label.dismiss": "Dismiss",
"label.does-not-contain": "Does not contain",
"label.domain": "Domain",
"label.dropoff": "Dropoff",
"label.edit": "Edit",
@ -46,12 +60,20 @@
"label.event": "Event",
"label.event-data": "Event data",
"label.events": "Events",
"label.false": "False",
"label.field": "Field",
"label.fields": "Fields",
"label.filter-combined": "Combined",
"label.filter-raw": "Raw",
"label.filters": "Filters",
"label.funnel": "Funnel",
"label.greater-than": "Greater than",
"label.greater-than-equals": "Greater than or equals",
"label.insights": "Insights",
"label.is": "Is",
"label.is-not": "Is not",
"label.is-not-set": "Is not set",
"label.is-set": "Is set",
"label.join": "Join",
"label.join-team": "Join team",
"label.language": "Language",
@ -61,17 +83,25 @@
"label.last-hours": "Last {x} hours",
"label.leave": "Leave",
"label.leave-team": "Leave team",
"label.less-than": "Less than",
"label.less-than-equals": "Less than or equals",
"label.login": "Login",
"label.logout": "Logout",
"label.max": "Max",
"label.members": "Members",
"label.min": "Min",
"label.mobile": "Mobile",
"label.more": "More",
"label.my-websites": "My websites",
"label.name": "Name",
"label.new-password": "New password",
"label.none": "None",
"label.operating-systems": "Operating systems",
"label.os": "OS",
"label.overview": "Overview",
"label.owner": "Owner",
"label.page-of": "Page {current} of {total}",
"label.page-views": "Page views",
"label.pageTitle": "Page title",
"label.pages": "Pages",
"label.password": "Password",
"label.powered-by": "Powered by {name}",
@ -80,15 +110,18 @@
"label.query": "Query",
"label.query-parameters": "Query parameters",
"label.realtime": "Realtime",
"label.referrer": "Referrer",
"label.referrers": "Referrers",
"label.refresh": "Refresh",
"label.regenerate": "Regenerate",
"label.region": "Region",
"label.regions": "Regions",
"label.remove": "Remove",
"label.reports": "Reports",
"label.required": "Required",
"label.reset": "Reset",
"label.reset-website": "Reset statistics",
"label.retention": "Retention",
"label.role": "Role",
"label.run-query": "Run query",
"label.save": "Save",
@ -99,12 +132,15 @@
"label.settings": "Settings",
"label.share-url": "Share URL",
"label.single-day": "Single day",
"label.sum": "Sum",
"label.tablet": "Tablet",
"label.team": "Team",
"label.team-guest": "Team guest",
"label.team-id": "Team ID",
"label.team-member": "Team member",
"label.team-name": "Team name",
"label.team-owner": "Team owner",
"label.team-websites": "Team websites",
"label.teams": "Teams",
"label.theme": "Theme",
"label.this-month": "This month",
@ -114,14 +150,21 @@
"label.title": "Title",
"label.today": "Today",
"label.toggle-charts": "Toggle charts",
"label.total": "Total",
"label.total-records": "Total records",
"label.tracking-code": "Tracking code",
"label.true": "True",
"label.type": "Type",
"label.unique": "Unique",
"label.unique-visitors": "Unique visitors",
"label.unknown": "Unknown",
"label.untitled": "Untitled",
"label.url": "URL",
"label.urls": "URLs",
"label.user": "User",
"label.username": "Username",
"label.users": "Users",
"label.value": "Value",
"label.view": "View",
"label.view-details": "View details",
"label.view-only": "View only",
@ -132,33 +175,6 @@
"label.websites": "Websites",
"label.window": "Window",
"label.yesterday": "Yesterday",
"labels.after": "After",
"labels.average": "Average",
"labels.before": "Before",
"labels.breakdown": "Breakdown",
"labels.contains": "Contains",
"labels.create-report": "Create report",
"labels.description": "Description",
"labels.does-not-contain": "Does not contain",
"labels.does-not-equal": "Does not equal",
"labels.equals": "Equals",
"labels.false": "False",
"labels.filters": "Filters",
"labels.greater-than": "Greater than",
"labels.greater-than-equals": "Greater than or equals",
"labels.less-than": "Less than",
"labels.less-than-equals": "Less than or equals",
"labels.max": "Max",
"labels.min": "Min",
"labels.overview": "Overview",
"labels.sum": "Sum",
"labels.total": "Total",
"labels.total-records": "Total records",
"labels.true": "True",
"labels.type": "Type",
"labels.unique": "Unique",
"labels.untitled": "Untitled",
"labels.value": "Value",
"message.active-users": "{x} current {x, plural, one {visitor} other {visitors}}",
"message.confirm-delete": "Are you sure you want to delete {target}?",
"message.confirm-leave": "Are you sure you want to leave {target}?",
@ -172,11 +188,15 @@
"message.incorrect-username-password": "Incorrect username/password.",
"message.invalid-domain": "Invalid domain",
"message.min-password-length": "Minimum length of {n} characters",
"message.new-version-available": "A new version of Umami {version} is available!",
"message.no-data-available": "No data available.",
"message.no-event-data": "No event data is available.",
"message.no-match-password": "Passwords don't match",
"message.no-results-found": "No results were found.",
"message.no-team-websites": "This team does not have any websites.",
"message.no-teams": "You have not created any teams.",
"message.no-users": "There are no users.",
"message.no-websites-configured": "You don't have any websites configured.",
"message.page-not-found": "Page not found.",
"message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
"message.reset-website-warning": "All statistics for this website will be deleted, but your tracking code will remain intact.",
@ -184,12 +204,8 @@
"message.share-url": "This is the publicly shared URL for {target}.",
"message.team-already-member": "You are already a member of the team.",
"message.team-not-found": "Team not found.",
"message.team-websites-info": "Websites can be viewed by anyone on the team.",
"message.tracking-code": "Tracking code",
"message.user-deleted": "User deleted.",
"message.visitor-log": "Visitor from {country} using {browser} on {os} {device}",
"message.no-results-found": "No results were found.",
"message.no-team-websites": "This team does not have any websites.",
"message.no-websites-configured": "You don't have any websites configured.",
"message.team-websites-info": "Websites can be viewed by anyone on the team.",
"message.new-version-available": "A new version of Umami {version} is available!"
"message.visitor-log": "Visitor from {country} using {browser} on {os} {device}"
}

View File

@ -6,21 +6,30 @@
"label.add-description": "Add description",
"label.add-website": "Add website",
"label.admin": "Administrator",
"label.after": "After",
"label.all": "All",
"label.all-time": "All time",
"label.analytics": "Analytics",
"label.average": "Average",
"label.average-visit-time": "Average visit time",
"label.back": "Back",
"label.before": "Before",
"label.bounce-rate": "Bounce rate",
"label.breakdown": "Breakdown",
"label.browser": "Browser",
"label.browsers": "Browsers",
"label.cancel": "Cancel",
"label.change-password": "Change password",
"label.cities": "Cities",
"label.city": "City",
"label.clear-all": "Clear all",
"label.confirm": "Confirm",
"label.confirm-password": "Confirm password",
"label.contains": "Contains",
"label.continue": "Continue",
"label.countries": "Countries",
"label.country": "Country",
"label.create-report": "Create report",
"label.create-team": "Create team",
"label.create-user": "Create user",
"label.created": "Created",
@ -28,16 +37,21 @@
"label.custom-range": "Custom range",
"label.dashboard": "Dashboard",
"label.data": "Data",
"label.date": "Date",
"label.date-range": "Date range",
"label.day": "Day",
"label.default-date-range": "Default date range",
"label.delete": "Delete",
"label.delete-team": "Delete team",
"label.delete-user": "Delete user",
"label.delete-website": "Delete website",
"label.description": "Description",
"label.desktop": "Desktop",
"label.details": "Details",
"label.device": "Device",
"label.devices": "Devices",
"label.dismiss": "Dismiss",
"label.does-not-contain": "Does not contain",
"label.domain": "Domain",
"label.dropoff": "Dropoff",
"label.edit": "Edit",
@ -46,12 +60,20 @@
"label.event": "Event",
"label.event-data": "Event data",
"label.events": "Events",
"label.false": "False",
"label.field": "Field",
"label.fields": "Fields",
"label.filter-combined": "Combined",
"label.filter-raw": "Raw",
"label.filters": "Filters",
"label.funnel": "Funnel",
"label.greater-than": "Greater than",
"label.greater-than-equals": "Greater than or equals",
"label.insights": "Insights",
"label.is": "Is",
"label.is-not": "Is not",
"label.is-not-set": "Is not set",
"label.is-set": "Is set",
"label.join": "Join",
"label.join-team": "Join team",
"label.language": "Language",
@ -61,17 +83,25 @@
"label.last-hours": "Last {x} hours",
"label.leave": "Leave",
"label.leave-team": "Leave team",
"label.less-than": "Less than",
"label.less-than-equals": "Less than or equals",
"label.login": "Login",
"label.logout": "Logout",
"label.max": "Max",
"label.members": "Members",
"label.min": "Min",
"label.mobile": "Mobile",
"label.more": "More",
"label.my-websites": "My websites",
"label.name": "Name",
"label.new-password": "New password",
"label.none": "None",
"label.operating-systems": "Operating systems",
"label.os": "OS",
"label.overview": "Overview",
"label.owner": "Owner",
"label.page-of": "Page {current} of {total}",
"label.page-views": "Page views",
"label.pageTitle": "Page title",
"label.pages": "Pages",
"label.password": "Password",
"label.powered-by": "Powered by {name}",
@ -80,15 +110,18 @@
"label.query": "Query",
"label.query-parameters": "Query parameters",
"label.realtime": "Realtime",
"label.referrer": "Referrer",
"label.referrers": "Referrers",
"label.refresh": "Refresh",
"label.regenerate": "Regenerate",
"label.region": "Region",
"label.regions": "Regions",
"label.remove": "Remove",
"label.reports": "Reports",
"label.required": "Required",
"label.reset": "Reset",
"label.reset-website": "Reset website",
"label.retention": "Retention",
"label.role": "Role",
"label.run-query": "Run query",
"label.save": "Save",
@ -99,12 +132,15 @@
"label.settings": "Settings",
"label.share-url": "Share URL",
"label.single-day": "Single day",
"label.sum": "Sum",
"label.tablet": "Tablet",
"label.team": "Team",
"label.team-guest": "Team guest",
"label.team-id": "Team ID",
"label.team-member": "Team member",
"label.team-name": "Team name",
"label.team-owner": "Team owner",
"label.team-websites": "Team websites",
"label.teams": "Teams",
"label.theme": "Theme",
"label.this-month": "This month",
@ -114,14 +150,21 @@
"label.title": "Title",
"label.today": "Today",
"label.toggle-charts": "Toggle charts",
"label.total": "Total",
"label.total-records": "Total records",
"label.tracking-code": "Tracking code",
"label.true": "True",
"label.type": "Type",
"label.unique": "Unique",
"label.unique-visitors": "Unique visitors",
"label.unknown": "Unknown",
"label.untitled": "Untitled",
"label.url": "URL",
"label.urls": "URLs",
"label.user": "User",
"label.username": "Username",
"label.users": "Users",
"label.value": "Value",
"label.view": "View",
"label.view-details": "View details",
"label.view-only": "View only",
@ -132,33 +175,6 @@
"label.websites": "Websites",
"label.window": "Window",
"label.yesterday": "Yesterday",
"labels.after": "After",
"labels.average": "Average",
"labels.before": "Before",
"labels.breakdown": "Breakdown",
"labels.contains": "Contains",
"labels.create-report": "Create report",
"labels.description": "Description",
"labels.does-not-contain": "Does not contain",
"labels.does-not-equal": "Does not equal",
"labels.equals": "Equals",
"labels.false": "False",
"labels.filters": "Filters",
"labels.greater-than": "Greater than",
"labels.greater-than-equals": "Greater than or equals",
"labels.less-than": "Less than",
"labels.less-than-equals": "Less than or equals",
"labels.max": "Max",
"labels.min": "Min",
"labels.overview": "Overview",
"labels.sum": "Sum",
"labels.total": "Total",
"labels.total-records": "Total records",
"labels.true": "True",
"labels.type": "Type",
"labels.unique": "Unique",
"labels.untitled": "Untitled",
"labels.value": "Value",
"message.active-users": "{x} current {x, plural, one {visitor} other {visitors}}",
"message.confirm-delete": "Are you sure you want to delete {target}?",
"message.confirm-leave": "Are you sure you want to leave {target}?",
@ -172,11 +188,15 @@
"message.incorrect-username-password": "Incorrect username and/or password.",
"message.invalid-domain": "Invalid domain. Do not include http/https.",
"message.min-password-length": "Minimum length of {n} characters",
"message.new-version-available": "A new version of Umami {version} is available!",
"message.no-data-available": "No data available.",
"message.no-event-data": "No event data is available.",
"message.no-match-password": "Passwords do not match.",
"message.no-results-found": "No results found.",
"message.no-team-websites": "This team does not have any websites.",
"message.no-teams": "You have not created any teams.",
"message.no-users": "There are no users.",
"message.no-websites-configured": "You do not have any websites configured.",
"message.page-not-found": "Page not found",
"message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
"message.reset-website-warning": "All statistics for this website will be deleted, but your settings will remain intact.",
@ -184,12 +204,8 @@
"message.share-url": "Your website stats are publically available at the following URL:",
"message.team-already-member": "You are already a member of the team.",
"message.team-not-found": "Team not found.",
"message.team-websites-info": "Websites can be viewed by anyone on the team.",
"message.tracking-code": "To track stats for this website, place the following code in the <head>...</head> section of your HTML.",
"message.user-deleted": "User deleted.",
"message.visitor-log": "Visitor from {country} using {browser} on {os} {device}",
"message.no-results-found": "No results were found.",
"message.no-team-websites": "This team does not have any websites.",
"message.no-websites-configured": "You do not have any websites configured.",
"message.team-websites-info": "Websites can be viewed by anyone on the team.",
"message.new-version-available": "A new version of Umami {version} is available!"
"message.visitor-log": "Visitor from {country} using {browser} on {os} {device}"
}

View File

@ -6,21 +6,30 @@
"label.add-description": "Añadir descripción",
"label.add-website": "Nuevo sitio web",
"label.admin": "Administrador",
"label.after": "Después",
"label.all": "Todos",
"label.all-time": "Todos los tiempos",
"label.analytics": "Analíticas",
"label.average": "Media",
"label.average-visit-time": "Tiempo promedio de visita",
"label.back": "Atrás",
"label.before": "Antes",
"label.bounce-rate": "Porcentaje de rebote",
"label.breakdown": "Desglose",
"label.browser": "Browser",
"label.browsers": "Navegadores",
"label.cancel": "Cancelar",
"label.change-password": "Cambiar contraseña",
"label.cities": "Ciudades",
"label.city": "City",
"label.clear-all": "Limpiar todo",
"label.confirm": "Confirmar",
"label.confirm-password": "Confirmar contraseña",
"label.contains": "Contiene",
"label.continue": "Continuar",
"label.countries": "Países",
"label.country": "Country",
"label.create-report": "Crear reporte",
"label.create-team": "Crear equipo",
"label.create-user": "Crear usuario",
"label.created": "Creado",
@ -28,16 +37,21 @@
"label.custom-range": "Intervalo personalizado",
"label.dashboard": "Panel de control",
"label.data": "Datos",
"label.date": "Date",
"label.date-range": "Intervalo de fechas",
"label.day": "Day",
"label.default-date-range": "Intervalo por defecto",
"label.delete": "Eliminar",
"label.delete-team": "Eliminar equipo",
"label.delete-user": "Eliminar usuario",
"label.delete-website": "Eliminar sitio",
"label.description": "Descripciones",
"label.desktop": "Escritorio",
"label.details": "Detalles",
"label.device": "Device",
"label.devices": "Dispositivos",
"label.dismiss": "Ignorar",
"label.does-not-contain": "No contiene",
"label.domain": "Dominio",
"label.dropoff": "Dropoff",
"label.edit": "Editar",
@ -46,12 +60,20 @@
"label.event": "Evento",
"label.event-data": "Datos de evento",
"label.events": "Eventos",
"label.false": "False",
"label.field": "Campo",
"label.fields": "Campos",
"label.filter-combined": "Combinado",
"label.filter-raw": "En crudo",
"label.filters": "Filtros",
"label.funnel": "Funnel",
"label.greater-than": "Mayor que",
"label.greater-than-equals": "Mayor que o igual a",
"label.insights": "Insights",
"label.is": "Es igual a",
"label.is-not": "No es igual a",
"label.is-not-set": "Is not set",
"label.is-set": "Is set",
"label.join": "Unir",
"label.join-team": "Unirse al equipo",
"label.language": "Idioma",
@ -61,17 +83,25 @@
"label.last-hours": "Últimas {x} horas",
"label.leave": "Abandonar",
"label.leave-team": "Abandonar equipo",
"label.less-than": "Menor que",
"label.less-than-equals": "Menor que o igual a",
"label.login": "Iniciar sesión",
"label.logout": "Cerrar sesión",
"label.max": "Máx",
"label.members": "Miembros",
"label.min": "Mín",
"label.mobile": "Móvil",
"label.more": "Más",
"label.my-websites": "My websites",
"label.name": "Nombre",
"label.new-password": "Nueva contraseña",
"label.none": "Ninguno",
"label.operating-systems": "Sistemas operativos",
"label.os": "OS",
"label.overview": "Resumen",
"label.owner": "Propietario",
"label.page-of": "Page {current} of {total}",
"label.page-views": "Vistas",
"label.pageTitle": "Page title",
"label.pages": "Páginas",
"label.password": "Contraseña",
"label.powered-by": "Con la ayuda de {name}",
@ -80,15 +110,18 @@
"label.query": "Query",
"label.query-parameters": "Parámetros de petición",
"label.realtime": "Tiempo real",
"label.referrer": "Referrer",
"label.referrers": "Referido desde",
"label.refresh": "Actualizar",
"label.regenerate": "Regenerar",
"label.region": "Region",
"label.regions": "Regiones",
"label.remove": "Quitar",
"label.reports": "Reportes",
"label.required": "Obligatorio",
"label.reset": "Reiniciar",
"label.reset-website": "Reiniciar estadísticas",
"label.retention": "Retention",
"label.role": "Rol",
"label.run-query": "Ejecutar consulta",
"label.save": "Guardar",
@ -99,12 +132,15 @@
"label.settings": "Configuraciones",
"label.share-url": "Compartir URL",
"label.single-day": "Un solo día",
"label.sum": "Suma",
"label.tablet": "Tableta",
"label.team": "Equipo",
"label.team-guest": "Invitado al equipo",
"label.team-id": "ID de equipo",
"label.team-member": "Miembro del equipo",
"label.team-name": "Team name",
"label.team-owner": "Admin. del equipo",
"label.team-websites": "Team websites",
"label.teams": "Equipos",
"label.theme": "Tema",
"label.this-month": "Este mes",
@ -114,14 +150,21 @@
"label.title": "Título",
"label.today": "Hoy",
"label.toggle-charts": "Alternar gráficas",
"label.total": "Total",
"label.total-records": "Total de registros",
"label.tracking-code": "Código de rastreo",
"label.true": "Verdadero",
"label.type": "Tipo",
"label.unique": "Único",
"label.unique-visitors": "Visitantes únicos",
"label.unknown": "Desconocida",
"label.untitled": "Sin título",
"label.url": "URL",
"label.urls": "URLs",
"label.user": "Usuario",
"label.username": "Nombre de usuario",
"label.users": "Usuarios",
"label.value": "Valor",
"label.view": "Visualizar",
"label.view-details": "Ver detalles",
"label.view-only": "Ver sólo",
@ -132,33 +175,6 @@
"label.websites": "Sitios web",
"label.window": "Ventana",
"label.yesterday": "Ayer",
"labels.after": "Después",
"labels.average": "Media",
"labels.before": "Antes",
"labels.breakdown": "Desglose",
"labels.contains": "Contiene",
"labels.create-report": "Crear reporte",
"labels.description": "Descripciones",
"labels.does-not-contain": "No contiene",
"labels.does-not-equal": "No es igual a",
"labels.equals": "Es igual a",
"labels.false": "False",
"labels.filters": "Filtros",
"labels.greater-than": "Mayor que",
"labels.greater-than-equals": "Mayor que o igual a",
"labels.less-than": "Menor que",
"labels.less-than-equals": "Menor que o igual a",
"labels.max": "Máx",
"labels.min": "Mín",
"labels.overview": "Resumen",
"labels.sum": "Suma",
"labels.total": "Total",
"labels.total-records": "Total de registros",
"labels.true": "Verdadero",
"labels.type": "Tipo",
"labels.unique": "Único",
"labels.untitled": "Sin título",
"labels.value": "Valor",
"message.active-users": "{x} {x, plural, one {activo} other {activos}}",
"message.confirm-delete": "¿Seguro que quieres eliminar {target}?",
"message.confirm-leave": "¿Seguro que quieres abandonar {target}?",
@ -172,11 +188,15 @@
"message.incorrect-username-password": "Nombre de usuario o contraseña incorrectos.",
"message.invalid-domain": "Dominio inválido",
"message.min-password-length": "Longitud mínima de {n} caracteres",
"message.new-version-available": "A new version of Umami {version} is available!",
"message.no-data-available": "No hay información disponible.",
"message.no-event-data": "No hay datos de eventos disponibles.",
"message.no-match-password": "Las contraseñas no coinciden",
"message.no-results-found": "No se encontraron resultados.",
"message.no-team-websites": "Este equipo no tiene ningún sitio web configurado.",
"message.no-teams": "No has creado ningún equipo.",
"message.no-users": "No hay usuarios.",
"message.no-websites-configured": "No tienes ningún sitio web configurado.",
"message.page-not-found": "Página no encontrada",
"message.reset-website": "Para reiniciar este sitio web, escribe {confirmation} a continuación para confirmar.",
"message.reset-website-warning": "Todas las estadísticas de esta página serán eliminadas, pero el código de rastreo permanecerá intacto.",
@ -184,12 +204,8 @@
"message.share-url": "Esta es la URL pública para {target}.",
"message.team-already-member": "Ya eres miembro de este equipo.",
"message.team-not-found": "Equipo no encontrado.",
"message.team-websites-info": "Las analíticas de tus sitios web pueden ser vistas por cualquier miembro del equipo.",
"message.tracking-code": "Código de rastreo",
"message.user-deleted": "Usuario eliminado.",
"message.visitor-log": "Visitante desde {country} usando {browser} en {os} {device}",
"message.no-results-found": "No se encontraron resultados.",
"message.no-team-websites": "Este equipo no tiene ningún sitio web configurado.",
"message.no-websites-configured": "No tienes ningún sitio web configurado.",
"message.team-websites-info": "Las analíticas de tus sitios web pueden ser vistas por cualquier miembro del equipo.",
"message.new-version-available": "A new version of Umami {version} is available!"
"message.visitor-log": "Visitante desde {country} usando {browser} en {os} {device}"
}

View File

@ -6,21 +6,30 @@
"label.add-description": "Add description",
"label.add-website": "Nuevo sitio web",
"label.admin": "Administrador",
"label.after": "After",
"label.all": "Todos",
"label.all-time": "Todos los tiempos",
"label.analytics": "Analíticas",
"label.average": "Average",
"label.average-visit-time": "Tiempo promedio de visita",
"label.back": "Atrás",
"label.before": "Before",
"label.bounce-rate": "Porcentaje de rebote",
"label.breakdown": "Breakdown",
"label.browser": "Browser",
"label.browsers": "Navegadores",
"label.cancel": "Cancelar",
"label.change-password": "Cambiar contraseña",
"label.cities": "Ciudades",
"label.city": "City",
"label.clear-all": "Limpiar todo",
"label.confirm": "Confirmar",
"label.confirm-password": "Confirmar contraseña",
"label.contains": "Contains",
"label.continue": "Continuar",
"label.countries": "Países",
"label.country": "Country",
"label.create-report": "Create report",
"label.create-team": "Crear equipo",
"label.create-user": "Crear usuario",
"label.created": "Creado",
@ -28,16 +37,21 @@
"label.custom-range": "Intervalo personalizado",
"label.dashboard": "Panel de control",
"label.data": "Datos",
"label.date": "Date",
"label.date-range": "Intervalo de fechas",
"label.day": "Day",
"label.default-date-range": "Intervalo por defecto",
"label.delete": "Eliminar",
"label.delete-team": "Eliminar team",
"label.delete-user": "Eliminar usuario",
"label.delete-website": "Eliminar sitio",
"label.description": "Description",
"label.desktop": "Escritorio",
"label.details": "Detalles",
"label.device": "Device",
"label.devices": "Dispositivos",
"label.dismiss": "Ignorar",
"label.does-not-contain": "Does not contain",
"label.domain": "Dominio",
"label.dropoff": "Dropoff",
"label.edit": "Editar",
@ -46,12 +60,20 @@
"label.event": "Evento",
"label.event-data": "Event data",
"label.events": "Eventos",
"label.false": "False",
"label.field": "Field",
"label.fields": "Fields",
"label.filter-combined": "Combinado",
"label.filter-raw": "Personalizado",
"label.filters": "Filters",
"label.funnel": "Funnel",
"label.greater-than": "Greater than",
"label.greater-than-equals": "Greater than or equals",
"label.insights": "Insights",
"label.is": "Is",
"label.is-not": "Is not",
"label.is-not-set": "Is not set",
"label.is-set": "Is set",
"label.join": "Unir",
"label.join-team": "Unir a equipo",
"label.language": "Idioma",
@ -61,17 +83,25 @@
"label.last-hours": "Últimas {x} horas",
"label.leave": "Abandonar",
"label.leave-team": "Abandonar equipo",
"label.less-than": "Less than",
"label.less-than-equals": "Less than or equals",
"label.login": "Iniciar sesión",
"label.logout": "Cerrar sesión",
"label.max": "Max",
"label.members": "Miembros",
"label.min": "Min",
"label.mobile": "Móvil",
"label.more": "Más",
"label.my-websites": "My websites",
"label.name": "Nombre",
"label.new-password": "Nueva contraseña",
"label.none": "Ninguno",
"label.operating-systems": "Sistemas operativos",
"label.os": "OS",
"label.overview": "Overview",
"label.owner": "Propietario",
"label.page-of": "Page {current} of {total}",
"label.page-views": "Vistas",
"label.pageTitle": "Page title",
"label.pages": "Páginas",
"label.password": "Contraseña",
"label.powered-by": "Analíticas de {name}",
@ -80,15 +110,18 @@
"label.query": "Query",
"label.query-parameters": "Parámetros de petición",
"label.realtime": "Tiempo real",
"label.referrer": "Referrer",
"label.referrers": "Referido desde",
"label.refresh": "Actualizar",
"label.regenerate": "Regenerar",
"label.region": "Region",
"label.regions": "Regiones",
"label.remove": "Quitar",
"label.reports": "Reports",
"label.required": "Obligatorio",
"label.reset": "Reiniciar",
"label.reset-website": "Reiniciar estadísticas",
"label.retention": "Retention",
"label.role": "Rol",
"label.run-query": "Run query",
"label.save": "Guardar",
@ -99,12 +132,15 @@
"label.settings": "Configuraciones",
"label.share-url": "Compartir URL",
"label.single-day": "Día",
"label.sum": "Sum",
"label.tablet": "Tableta",
"label.team": "Equipo",
"label.team-guest": "Invitado de equipo",
"label.team-id": "ID de equipo",
"label.team-member": "Miembro de equipo",
"label.team-name": "Team name",
"label.team-owner": "Admin. del equipo",
"label.team-websites": "Team websites",
"label.teams": "Equipos",
"label.theme": "Tema",
"label.this-month": "Este mes",
@ -114,14 +150,21 @@
"label.title": "Título",
"label.today": "Hoy",
"label.toggle-charts": "Alternar gráficas",
"label.total": "Total",
"label.total-records": "Total records",
"label.tracking-code": "Código de rastreo",
"label.true": "True",
"label.type": "Type",
"label.unique": "Unique",
"label.unique-visitors": "Visitantes únicos",
"label.unknown": "Desconocida",
"label.untitled": "Untitled",
"label.url": "URL",
"label.urls": "URLs",
"label.user": "Usuario",
"label.username": "Nombre de usuario",
"label.users": "Usuarios",
"label.value": "Value",
"label.view": "Visualizar",
"label.view-details": "Ver detalles",
"label.view-only": "View only",
@ -132,33 +175,6 @@
"label.websites": "Sitios",
"label.window": "Window",
"label.yesterday": "Ayer",
"labels.after": "After",
"labels.average": "Average",
"labels.before": "Before",
"labels.breakdown": "Breakdown",
"labels.contains": "Contains",
"labels.create-report": "Create report",
"labels.description": "Description",
"labels.does-not-contain": "Does not contain",
"labels.does-not-equal": "Does not equal",
"labels.equals": "Equals",
"labels.false": "False",
"labels.filters": "Filters",
"labels.greater-than": "Greater than",
"labels.greater-than-equals": "Greater than or equals",
"labels.less-than": "Less than",
"labels.less-than-equals": "Less than or equals",
"labels.max": "Max",
"labels.min": "Min",
"labels.overview": "Overview",
"labels.sum": "Sum",
"labels.total": "Total",
"labels.total-records": "Total records",
"labels.true": "True",
"labels.type": "Type",
"labels.unique": "Unique",
"labels.untitled": "Untitled",
"labels.value": "Value",
"message.active-users": "{x} {x, plural, one {activo} other {activos}}",
"message.confirm-delete": "¿Seguro que quieres eliminar {target}?",
"message.confirm-leave": "¿Seguro que quieres abandonar {target}?",
@ -172,11 +188,15 @@
"message.incorrect-username-password": "Nombre de usuario o contraseña incorrectos.",
"message.invalid-domain": "Dominio inválido",
"message.min-password-length": "Longitud mínima de {n} caracteres",
"message.new-version-available": "A new version of Umami {version} is available!",
"message.no-data-available": "No hay información disponible.",
"message.no-event-data": "No event data is available.",
"message.no-match-password": "Las contraseñas no coinciden",
"message.no-results-found": "No results were found.",
"message.no-team-websites": "Este equipo no tiene ningún sitio web configurado.",
"message.no-teams": "No has creado ningún equipo.",
"message.no-users": "No hay usuarios.",
"message.no-websites-configured": "No tienes ningún sitio configurado.",
"message.page-not-found": "Página no encontrada",
"message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
"message.reset-website-warning": "Todas las estadísticas de esta página serán eliminadas, pero el código de rastreo permanecerá intacto.",
@ -184,12 +204,8 @@
"message.share-url": "Esta es la URL compartida públicamente para {target}.",
"message.team-already-member": "Ya eres miembro de este equipo.",
"message.team-not-found": "Equipo no encontrado.",
"message.team-websites-info": "Las analíticas de tus sitios pueden verse por cualquier miembro del equipo.",
"message.tracking-code": "Código de rastreo",
"message.user-deleted": "Usuario eliminado.",
"message.visitor-log": "Visitante desde {country} usando {browser} en {os} {device}",
"message.no-results-found": "No results were found.",
"message.no-team-websites": "Este equipo no tiene ningún sitio web configurado.",
"message.no-websites-configured": "No tienes ningún sitio configurado.",
"message.team-websites-info": "Las analíticas de tus sitios pueden verse por cualquier miembro del equipo.",
"message.new-version-available": "A new version of Umami {version} is available!"
"message.visitor-log": "Visitante desde {country} usando {browser} en {os} {device}"
}

View File

@ -6,21 +6,30 @@
"label.add-description": "Add description",
"label.add-website": "افزودن وب‌سایت",
"label.admin": "مدیر",
"label.after": "After",
"label.all": "همه",
"label.all-time": "همه زمان",
"label.analytics": "Analytics",
"label.average": "Average",
"label.average-visit-time": "میانگین زمان بازدید",
"label.back": "برگشت",
"label.before": "Before",
"label.bounce-rate": "نرخ Bounce",
"label.breakdown": "Breakdown",
"label.browser": "Browser",
"label.browsers": "مروگرها",
"label.cancel": "انصراف",
"label.change-password": "تغییر رمز",
"label.cities": "Cities",
"label.city": "City",
"label.clear-all": "Clear all",
"label.confirm": "Confirm",
"label.confirm-password": "تایید رمز",
"label.contains": "Contains",
"label.continue": "Continue",
"label.countries": "کشورها",
"label.country": "Country",
"label.create-report": "Create report",
"label.create-team": "Create team",
"label.create-user": "Create user",
"label.created": "Created",
@ -28,16 +37,21 @@
"label.custom-range": "محدوده‌ی دلخواه",
"label.dashboard": "داشبورد",
"label.data": "Data",
"label.date": "Date",
"label.date-range": "محدوده‌ی تاریخ",
"label.day": "Day",
"label.default-date-range": "محدوده‌ی پیشفرض تاریخ",
"label.delete": "حذف",
"label.delete-team": "Delete team",
"label.delete-user": "Delete user",
"label.delete-website": "حذف وب‌سایت",
"label.description": "Description",
"label.desktop": "دسکتاپ",
"label.details": "Details",
"label.device": "Device",
"label.devices": "دستگاه‌ها",
"label.dismiss": "رد کردن",
"label.does-not-contain": "Does not contain",
"label.domain": "دامنه",
"label.dropoff": "Dropoff",
"label.edit": "ویرایش",
@ -46,12 +60,20 @@
"label.event": "Event",
"label.event-data": "Event data",
"label.events": "رویدادها",
"label.false": "False",
"label.field": "Field",
"label.fields": "Fields",
"label.filter-combined": "ترکیب شده",
"label.filter-raw": "خام",
"label.filters": "Filters",
"label.funnel": "Funnel",
"label.greater-than": "Greater than",
"label.greater-than-equals": "Greater than or equals",
"label.insights": "Insights",
"label.is": "Is",
"label.is-not": "Is not",
"label.is-not-set": "Is not set",
"label.is-set": "Is set",
"label.join": "Join",
"label.join-team": "Join team",
"label.language": "زبان",
@ -61,17 +83,25 @@
"label.last-hours": "لیست {x} ساعت گذشته",
"label.leave": "Leave",
"label.leave-team": "Leave team",
"label.less-than": "Less than",
"label.less-than-equals": "Less than or equals",
"label.login": "ورود",
"label.logout": "خروج",
"label.max": "Max",
"label.members": "Members",
"label.min": "Min",
"label.mobile": "موبایل",
"label.more": "بیشتر",
"label.my-websites": "My websites",
"label.name": "نام",
"label.new-password": "رمز جدید",
"label.none": "None",
"label.operating-systems": "سیستم‌عامل‌ها",
"label.os": "OS",
"label.overview": "Overview",
"label.owner": "ایجاد شده توسط",
"label.page-of": "Page {current} of {total}",
"label.page-views": "بازدید صفحه",
"label.pageTitle": "Page title",
"label.pages": "صفحه‌ها",
"label.password": "رمز",
"label.powered-by": "قدرت گرفته توسط {name}",
@ -80,15 +110,18 @@
"label.query": "Query",
"label.query-parameters": "Query parameters",
"label.realtime": "آمار زنده",
"label.referrer": "Referrer",
"label.referrers": "ارجاع دهندگان",
"label.refresh": "به‌روزرسانی",
"label.regenerate": "Regenerate",
"label.region": "Region",
"label.regions": "Regions",
"label.remove": "Remove",
"label.reports": "Reports",
"label.required": "ضروری",
"label.reset": "بازنشانی",
"label.reset-website": "بازنشانی آمار",
"label.retention": "Retention",
"label.role": "Role",
"label.run-query": "Run query",
"label.save": "ذخیره",
@ -99,12 +132,15 @@
"label.settings": "تنظیمات",
"label.share-url": "به اشتراک گذاری URL",
"label.single-day": "یک روز",
"label.sum": "Sum",
"label.tablet": "تبلت",
"label.team": "Team",
"label.team-guest": "Team guest",
"label.team-id": "Team ID",
"label.team-member": "Team member",
"label.team-name": "Team name",
"label.team-owner": "Team owner",
"label.team-websites": "Team websites",
"label.teams": "Teams",
"label.theme": "تم",
"label.this-month": "این ماه",
@ -114,14 +150,21 @@
"label.title": "Title",
"label.today": "امروز",
"label.toggle-charts": "Toggle charts",
"label.total": "Total",
"label.total-records": "Total records",
"label.tracking-code": "کد رهگیری",
"label.true": "True",
"label.type": "Type",
"label.unique": "Unique",
"label.unique-visitors": "بازدیدکننده‌های یکتا",
"label.unknown": "ناشناخته",
"label.untitled": "Untitled",
"label.url": "URL",
"label.urls": "URLs",
"label.user": "User",
"label.username": "نام کاربری",
"label.users": "Users",
"label.value": "Value",
"label.view": "View",
"label.view-details": "مشاهده‌ی جزئیات",
"label.view-only": "View only",
@ -132,33 +175,6 @@
"label.websites": "وب‌سایت‌ها",
"label.window": "Window",
"label.yesterday": "Yesterday",
"labels.after": "After",
"labels.average": "Average",
"labels.before": "Before",
"labels.breakdown": "Breakdown",
"labels.contains": "Contains",
"labels.create-report": "Create report",
"labels.description": "Description",
"labels.does-not-contain": "Does not contain",
"labels.does-not-equal": "Does not equal",
"labels.equals": "Equals",
"labels.false": "False",
"labels.filters": "Filters",
"labels.greater-than": "Greater than",
"labels.greater-than-equals": "Greater than or equals",
"labels.less-than": "Less than",
"labels.less-than-equals": "Less than or equals",
"labels.max": "Max",
"labels.min": "Min",
"labels.overview": "Overview",
"labels.sum": "Sum",
"labels.total": "Total",
"labels.total-records": "Total records",
"labels.true": "True",
"labels.type": "Type",
"labels.unique": "Unique",
"labels.untitled": "Untitled",
"labels.value": "Value",
"message.active-users": "{x} هم اکنون {x, plural, one {یک} other {از میان}}",
"message.confirm-delete": "آیا مطمئن هستید می‌خواهید {target} را حذف کنید?",
"message.confirm-leave": "Are you sure you want to leave {target}?",
@ -172,11 +188,15 @@
"message.incorrect-username-password": "نام کاربری / رمز نادرست است.",
"message.invalid-domain": "دامنه‌ی نامعتبر",
"message.min-password-length": "Minimum length of {n} characters",
"message.new-version-available": "A new version of Umami {version} is available!",
"message.no-data-available": "اطلاعاتی موجود نیست.",
"message.no-event-data": "No event data is available.",
"message.no-match-password": "رمزها یکسان نیستند",
"message.no-results-found": "No results were found.",
"message.no-team-websites": "This team does not have any websites.",
"message.no-teams": "You have not created any teams.",
"message.no-users": "There are no users.",
"message.no-websites-configured": "شما هیچ وب‌سایتی را پیکربندی نکرده‌اید.",
"message.page-not-found": "صفحه یافت نشد.",
"message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
"message.reset-website-warning": "تمامی آمارهای این وب‌سایت حذف خواهد شد اما tracking code بدون تغییر باقی می‌ماند.",
@ -184,12 +204,8 @@
"message.share-url": "این URL به اشتراک گذاشته شده عمومی برای {target} است.",
"message.team-already-member": "You are already a member of the team.",
"message.team-not-found": "Team not found.",
"message.team-websites-info": "Websites can be viewed by anyone on the team.",
"message.tracking-code": "کد رهگیری",
"message.user-deleted": "User deleted.",
"message.visitor-log": "بازدیدکننده از کشور {country} با مروگر {browser} در {os} {device}",
"message.no-results-found": "No results were found.",
"message.no-team-websites": "This team does not have any websites.",
"message.no-websites-configured": "شما هیچ وب‌سایتی را پیکربندی نکرده‌اید.",
"message.team-websites-info": "Websites can be viewed by anyone on the team.",
"message.new-version-available": "A new version of Umami {version} is available!"
"message.visitor-log": "بازدیدکننده از کشور {country} با مروگر {browser} در {os} {device}"
}

View File

@ -6,21 +6,30 @@
"label.add-description": "Add description",
"label.add-website": "Lisää verkkosivu",
"label.admin": "Järjestelmänvalvoja",
"label.after": "After",
"label.all": "Kaikki",
"label.all-time": "Alusta lähtien",
"label.analytics": "Analytics",
"label.average": "Average",
"label.average-visit-time": "Keskimääräinen vierailuaika",
"label.back": "Takaisin",
"label.before": "Before",
"label.bounce-rate": "Välitön poistuminen",
"label.breakdown": "Breakdown",
"label.browser": "Browser",
"label.browsers": "Selaimet",
"label.cancel": "Peruuta",
"label.change-password": "Vaihda salasana",
"label.cities": "Cities",
"label.city": "City",
"label.clear-all": "Clear all",
"label.confirm": "Confirm",
"label.confirm-password": "Vahvista salasana",
"label.contains": "Contains",
"label.continue": "Continue",
"label.countries": "Maat",
"label.country": "Country",
"label.create-report": "Create report",
"label.create-team": "Create team",
"label.create-user": "Create user",
"label.created": "Created",
@ -28,16 +37,21 @@
"label.custom-range": "Mukautettu ajanjakso",
"label.dashboard": "Ohjauspaneeli",
"label.data": "Data",
"label.date": "Date",
"label.date-range": "Ajanjakso",
"label.day": "Day",
"label.default-date-range": "Oletusajanjakso",
"label.delete": "Poista",
"label.delete-team": "Delete team",
"label.delete-user": "Delete user",
"label.delete-website": "Poista verkkosivu",
"label.description": "Description",
"label.desktop": "Pöytäkone",
"label.details": "Details",
"label.device": "Device",
"label.devices": "Laitteet",
"label.dismiss": "Hylkää",
"label.does-not-contain": "Does not contain",
"label.domain": "Verkkotunnus",
"label.dropoff": "Dropoff",
"label.edit": "Muokkaa",
@ -46,12 +60,20 @@
"label.event": "Event",
"label.event-data": "Event data",
"label.events": "Tapahtumat",
"label.false": "False",
"label.field": "Field",
"label.fields": "Fields",
"label.filter-combined": "Yhdistetty",
"label.filter-raw": "Käsittelemätön",
"label.filters": "Filters",
"label.funnel": "Funnel",
"label.greater-than": "Greater than",
"label.greater-than-equals": "Greater than or equals",
"label.insights": "Insights",
"label.is": "Is",
"label.is-not": "Is not",
"label.is-not-set": "Is not set",
"label.is-set": "Is set",
"label.join": "Join",
"label.join-team": "Join team",
"label.language": "Kieli",
@ -61,17 +83,25 @@
"label.last-hours": "Viimeisimmät {x} tuntia",
"label.leave": "Leave",
"label.leave-team": "Leave team",
"label.less-than": "Less than",
"label.less-than-equals": "Less than or equals",
"label.login": "Kirjaudu sisään",
"label.logout": "Kirjaudu ulos",
"label.max": "Max",
"label.members": "Members",
"label.min": "Min",
"label.mobile": "Puhelin",
"label.more": "Lisää",
"label.my-websites": "My websites",
"label.name": "Nimi",
"label.new-password": "Uusi salasana",
"label.none": "None",
"label.operating-systems": "Käyttöjärjestelmät",
"label.os": "OS",
"label.overview": "Overview",
"label.owner": "Omistaja",
"label.page-of": "Page {current} of {total}",
"label.page-views": "Sivun näyttökerrat",
"label.pageTitle": "Page title",
"label.pages": "Sivut",
"label.password": "Salasana",
"label.powered-by": "Voimanlähteenä {name}",
@ -80,15 +110,18 @@
"label.query": "Query",
"label.query-parameters": "Query parameters",
"label.realtime": "Juuri nyt",
"label.referrer": "Referrer",
"label.referrers": "Viittaajat",
"label.refresh": "Päivitä",
"label.regenerate": "Regenerate",
"label.region": "Region",
"label.regions": "Regions",
"label.remove": "Remove",
"label.reports": "Reports",
"label.required": "Vaaditaan",
"label.reset": "Nollaa",
"label.reset-website": "Nollaa tilastot",
"label.retention": "Retention",
"label.role": "Role",
"label.run-query": "Run query",
"label.save": "Tallenna",
@ -99,12 +132,15 @@
"label.settings": "Asetukset",
"label.share-url": "Jaa URL",
"label.single-day": "Yksi päivä",
"label.sum": "Sum",
"label.tablet": "Tabletti",
"label.team": "Team",
"label.team-guest": "Team guest",
"label.team-id": "Team ID",
"label.team-member": "Team member",
"label.team-name": "Team name",
"label.team-owner": "Team owner",
"label.team-websites": "Team websites",
"label.teams": "Teams",
"label.theme": "Teema",
"label.this-month": "Tämä kuukausi",
@ -114,14 +150,21 @@
"label.title": "Title",
"label.today": "Tänään",
"label.toggle-charts": "Kytke kaaviot päälle/pois",
"label.total": "Total",
"label.total-records": "Total records",
"label.tracking-code": "Seurantakoodi",
"label.true": "True",
"label.type": "Type",
"label.unique": "Unique",
"label.unique-visitors": "Yksittäiset kävijät",
"label.unknown": "Tuntematon",
"label.untitled": "Untitled",
"label.url": "URL",
"label.urls": "URLs",
"label.user": "User",
"label.username": "Käyttäjänimi",
"label.users": "Users",
"label.value": "Value",
"label.view": "View",
"label.view-details": "Katso tiedot",
"label.view-only": "View only",
@ -132,33 +175,6 @@
"label.websites": "Verkkosivut",
"label.window": "Window",
"label.yesterday": "Yesterday",
"labels.after": "After",
"labels.average": "Average",
"labels.before": "Before",
"labels.breakdown": "Breakdown",
"labels.contains": "Contains",
"labels.create-report": "Create report",
"labels.description": "Description",
"labels.does-not-contain": "Does not contain",
"labels.does-not-equal": "Does not equal",
"labels.equals": "Equals",
"labels.false": "False",
"labels.filters": "Filters",
"labels.greater-than": "Greater than",
"labels.greater-than-equals": "Greater than or equals",
"labels.less-than": "Less than",
"labels.less-than-equals": "Less than or equals",
"labels.max": "Max",
"labels.min": "Min",
"labels.overview": "Overview",
"labels.sum": "Sum",
"labels.total": "Total",
"labels.total-records": "Total records",
"labels.true": "True",
"labels.type": "Type",
"labels.unique": "Unique",
"labels.untitled": "Untitled",
"labels.value": "Value",
"message.active-users": "{x} {x, plural, one {vierailija} other {vierailijaa}}",
"message.confirm-delete": "Haluatko varmasti poistaa sivuston {target}?",
"message.confirm-leave": "Are you sure you want to leave {target}?",
@ -172,11 +188,15 @@
"message.incorrect-username-password": "Väärä käyttäjänimi/salasana.",
"message.invalid-domain": "Virheellinen verkkotunnus",
"message.min-password-length": "Minimum length of {n} characters",
"message.new-version-available": "A new version of Umami {version} is available!",
"message.no-data-available": "Tietoja ei ole käytettävissä.",
"message.no-event-data": "No event data is available.",
"message.no-match-password": "Salasanat eivät täsmää",
"message.no-results-found": "No results were found.",
"message.no-team-websites": "This team does not have any websites.",
"message.no-teams": "You have not created any teams.",
"message.no-users": "There are no users.",
"message.no-websites-configured": "Sinulla ei ole määritettyjä verkkosivustoja.",
"message.page-not-found": "Sivua ei löydetty.",
"message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
"message.reset-website-warning": "Kaikki sivuston tilastot poistetaan, mutta seurantakoodi pysyy muuttumattomana.",
@ -184,12 +204,8 @@
"message.share-url": "Tämä on julkisesti jaettu URL sivustolle {target}.",
"message.team-already-member": "You are already a member of the team.",
"message.team-not-found": "Team not found.",
"message.team-websites-info": "Websites can be viewed by anyone on the team.",
"message.tracking-code": "Seurantakoodi",
"message.user-deleted": "User deleted.",
"message.visitor-log": "Vierailija maasta {country} selaimella {browser} laitteella {os} {device}",
"message.no-results-found": "No results were found.",
"message.no-team-websites": "This team does not have any websites.",
"message.no-websites-configured": "Sinulla ei ole määritettyjä verkkosivustoja.",
"message.team-websites-info": "Websites can be viewed by anyone on the team.",
"message.new-version-available": "A new version of Umami {version} is available!"
"message.visitor-log": "Vierailija maasta {country} selaimella {browser} laitteella {os} {device}"
}

View File

@ -6,21 +6,30 @@
"label.add-description": "Add description",
"label.add-website": "Legg heimasíðu afturat",
"label.admin": "Fyrisitari",
"label.after": "After",
"label.all": "Alt",
"label.all-time": "All time",
"label.analytics": "Analytics",
"label.average": "Average",
"label.average-visit-time": "Miðal vitjurnartíð ",
"label.back": "Aftur",
"label.before": "Before",
"label.bounce-rate": "Bounce prosenttal",
"label.breakdown": "Breakdown",
"label.browser": "Browser",
"label.browsers": "Kagar",
"label.cancel": "Strika",
"label.change-password": "Skift loyniorð",
"label.cities": "Cities",
"label.city": "City",
"label.clear-all": "Clear all",
"label.confirm": "Confirm",
"label.confirm-password": "Vátta loyniorð",
"label.contains": "Contains",
"label.continue": "Continue",
"label.countries": "Lond",
"label.country": "Country",
"label.create-report": "Create report",
"label.create-team": "Create team",
"label.create-user": "Create user",
"label.created": "Created",
@ -28,16 +37,21 @@
"label.custom-range": "Tillaga spenni",
"label.dashboard": "Yvirlitsskíggi",
"label.data": "Data",
"label.date": "Date",
"label.date-range": "Vel dato",
"label.day": "Day",
"label.default-date-range": "Forsett dato",
"label.delete": "Sletta",
"label.delete-team": "Delete team",
"label.delete-user": "Delete user",
"label.delete-website": "Sletta heimasíðu",
"label.description": "Description",
"label.desktop": "Borðtelda",
"label.details": "Details",
"label.device": "Device",
"label.devices": "Tóleindir",
"label.dismiss": "Lat fara",
"label.does-not-contain": "Does not contain",
"label.domain": "Økisnavn",
"label.dropoff": "Dropoff",
"label.edit": "Ger broyting",
@ -46,12 +60,20 @@
"label.event": "Event",
"label.event-data": "Event data",
"label.events": "Hendingar/tiltøk",
"label.false": "False",
"label.field": "Field",
"label.fields": "Fields",
"label.filter-combined": "Samansett",
"label.filter-raw": "Óviðgjørt",
"label.filters": "Filters",
"label.funnel": "Funnel",
"label.greater-than": "Greater than",
"label.greater-than-equals": "Greater than or equals",
"label.insights": "Insights",
"label.is": "Is",
"label.is-not": "Is not",
"label.is-not-set": "Is not set",
"label.is-set": "Is set",
"label.join": "Join",
"label.join-team": "Join team",
"label.language": "Language",
@ -61,17 +83,25 @@
"label.last-hours": "Seinastu {x} tímarnar",
"label.leave": "Leave",
"label.leave-team": "Leave team",
"label.less-than": "Less than",
"label.less-than-equals": "Less than or equals",
"label.login": "Rita inn",
"label.logout": "Rita út",
"label.max": "Max",
"label.members": "Members",
"label.min": "Min",
"label.mobile": "Telefon",
"label.more": "Meira",
"label.my-websites": "My websites",
"label.name": "Navn",
"label.new-password": "Nýtt loyniorð",
"label.none": "None",
"label.operating-systems": "Stýrikervir",
"label.os": "OS",
"label.overview": "Overview",
"label.owner": "Owner",
"label.page-of": "Page {current} of {total}",
"label.page-views": "Opnaðar síðir",
"label.pageTitle": "Page title",
"label.pages": "Síðir",
"label.password": "Loyniorð",
"label.powered-by": "Powered by {name}",
@ -80,15 +110,18 @@
"label.query": "Query",
"label.query-parameters": "Query parameters",
"label.realtime": "Beinleiðis",
"label.referrer": "Referrer",
"label.referrers": "Framsendingar",
"label.refresh": "Endurskapa",
"label.regenerate": "Regenerate",
"label.region": "Region",
"label.regions": "Regions",
"label.remove": "Remove",
"label.reports": "Reports",
"label.required": "Kravt",
"label.reset": "Nulstilla",
"label.reset-website": "Reset statistics",
"label.retention": "Retention",
"label.role": "Role",
"label.run-query": "Run query",
"label.save": "Goym",
@ -99,12 +132,15 @@
"label.settings": "Stillingar",
"label.share-url": "Deil leinku",
"label.single-day": "Einkultur dagur",
"label.sum": "Sum",
"label.tablet": "Teldil",
"label.team": "Team",
"label.team-guest": "Team guest",
"label.team-id": "Team ID",
"label.team-member": "Team member",
"label.team-name": "Team name",
"label.team-owner": "Team owner",
"label.team-websites": "Team websites",
"label.teams": "Teams",
"label.theme": "Theme",
"label.this-month": "Hendan mánan",
@ -114,14 +150,21 @@
"label.title": "Title",
"label.today": "Í dag",
"label.toggle-charts": "Toggle charts",
"label.total": "Total",
"label.total-records": "Total records",
"label.tracking-code": "Spori kota",
"label.true": "True",
"label.type": "Type",
"label.unique": "Unique",
"label.unique-visitors": "Einsýna vitjanir",
"label.unknown": "Ókent",
"label.untitled": "Untitled",
"label.url": "URL",
"label.urls": "URLs",
"label.user": "User",
"label.username": "Brúkaranavn",
"label.users": "Users",
"label.value": "Value",
"label.view": "View",
"label.view-details": "Vís frágreiðing",
"label.view-only": "View only",
@ -132,33 +175,6 @@
"label.websites": "Heimasíður",
"label.window": "Window",
"label.yesterday": "Yesterday",
"labels.after": "After",
"labels.average": "Average",
"labels.before": "Before",
"labels.breakdown": "Breakdown",
"labels.contains": "Contains",
"labels.create-report": "Create report",
"labels.description": "Description",
"labels.does-not-contain": "Does not contain",
"labels.does-not-equal": "Does not equal",
"labels.equals": "Equals",
"labels.false": "False",
"labels.filters": "Filters",
"labels.greater-than": "Greater than",
"labels.greater-than-equals": "Greater than or equals",
"labels.less-than": "Less than",
"labels.less-than-equals": "Less than or equals",
"labels.max": "Max",
"labels.min": "Min",
"labels.overview": "Overview",
"labels.sum": "Sum",
"labels.total": "Total",
"labels.total-records": "Total records",
"labels.true": "True",
"labels.type": "Type",
"labels.unique": "Unique",
"labels.untitled": "Untitled",
"labels.value": "Value",
"message.active-users": "{x} í løtuni {x, plural, one {vitjandi} other { vitjandi }}",
"message.confirm-delete": "Ert tú sikkur at tú ynskir at strika {target}?",
"message.confirm-leave": "Are you sure you want to leave {target}?",
@ -172,11 +188,15 @@
"message.incorrect-username-password": "Skeivt brúkaranavn/loyniorð.",
"message.invalid-domain": "Ógilt økisnavn",
"message.min-password-length": "Minimum length of {n} characters",
"message.new-version-available": "A new version of Umami {version} is available!",
"message.no-data-available": "Einki data tøk.",
"message.no-event-data": "No event data is available.",
"message.no-match-password": "Loyniorðini eru ikki eins",
"message.no-results-found": "No results were found.",
"message.no-team-websites": "This team does not have any websites.",
"message.no-teams": "You have not created any teams.",
"message.no-users": "There are no users.",
"message.no-websites-configured": "Tú hevur ongar heimasíður stillaða til.",
"message.page-not-found": "Síðan bleiv ikki funnin.",
"message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
"message.reset-website-warning": "All statistics for this website will be deleted, but your tracking code will remain intact.",
@ -184,12 +204,8 @@
"message.share-url": "Hettar er tann almenna leinkan av {target}.",
"message.team-already-member": "You are already a member of the team.",
"message.team-not-found": "Team not found.",
"message.team-websites-info": "Websites can be viewed by anyone on the team.",
"message.tracking-code": "Spori kota",
"message.user-deleted": "User deleted.",
"message.visitor-log": "Vitjandi frá {country} brúkar {browser} á {os} {device}",
"message.no-results-found": "No results were found.",
"message.no-team-websites": "This team does not have any websites.",
"message.no-websites-configured": "Tú hevur ongar heimasíður stillaða til.",
"message.team-websites-info": "Websites can be viewed by anyone on the team.",
"message.new-version-available": "A new version of Umami {version} is available!"
"message.visitor-log": "Vitjandi frá {country} brúkar {browser} á {os} {device}"
}

View File

@ -6,21 +6,30 @@
"label.add-description": "Ajouter une description",
"label.add-website": "Ajouter un site",
"label.admin": "Administrateur",
"label.after": "Après",
"label.all": "Tout",
"label.all-time": "Toutes les données",
"label.analytics": "Analytics",
"label.average": "Moyenne",
"label.average-visit-time": "Temps de visite moyen",
"label.back": "Retour",
"label.before": "Avant",
"label.bounce-rate": "Taux de rebond",
"label.breakdown": "Répartition",
"label.browser": "Browser",
"label.browsers": "Navigateurs",
"label.cancel": "Annuler",
"label.change-password": "Changer le mot de passe",
"label.cities": "Villes",
"label.city": "City",
"label.clear-all": "Réinitialiser",
"label.confirm": "Confirmer",
"label.confirm-password": "Confirmation du mot de passe",
"label.contains": "Contient",
"label.continue": "Continuer",
"label.countries": "Pays",
"label.country": "Country",
"label.create-report": "Créer un rapport",
"label.create-team": "Créer une équipe",
"label.create-user": "Créer un utilisateur",
"label.created": "Créé",
@ -28,16 +37,21 @@
"label.custom-range": "Période personnalisée",
"label.dashboard": "Tableau de bord",
"label.data": "Données",
"label.date": "Date",
"label.date-range": "Période",
"label.day": "Day",
"label.default-date-range": "Période par défaut",
"label.delete": "Supprimer",
"label.delete-team": "Supprimer l'équipe",
"label.delete-user": "Supprimer l'utilisateur",
"label.delete-website": "Supprimer le site",
"label.description": "Description",
"label.desktop": "Ordinateur",
"label.details": "Détails",
"label.device": "Device",
"label.devices": "Appareils",
"label.dismiss": "Ignorer",
"label.does-not-contain": "Ne contient pas",
"label.domain": "Domaine",
"label.dropoff": "Dropoff",
"label.edit": "Modifier",
@ -46,12 +60,20 @@
"label.event": "Event",
"label.event-data": "Données d'événements",
"label.events": "Événements",
"label.false": "Faux",
"label.field": "Champ",
"label.fields": "Champs",
"label.filter-combined": "Combiné",
"label.filter-raw": "Brut",
"label.filters": "Filtres",
"label.funnel": "Entonnoir",
"label.greater-than": "Supérieur à",
"label.greater-than-equals": "Supérieur ou égal à",
"label.insights": "Insights",
"label.is": "Est égal",
"label.is-not": "N'est pas égal",
"label.is-not-set": "Is not set",
"label.is-set": "Is set",
"label.join": "Rejoindre",
"label.join-team": "Rejoindre une équipe",
"label.language": "Langue",
@ -61,17 +83,25 @@
"label.last-hours": "{x} dernières heures",
"label.leave": "Quitter",
"label.leave-team": "Quitter l'équipe",
"label.less-than": "Inférieur à",
"label.less-than-equals": "Inférieur ou égal à",
"label.login": "Connexion",
"label.logout": "Déconnexion",
"label.max": "Max",
"label.members": "Membres",
"label.min": "Min",
"label.mobile": "Téléphone",
"label.more": "Plus",
"label.my-websites": "My websites",
"label.name": "Nom",
"label.new-password": "Nouveau mot de passe",
"label.none": "Aucun·e",
"label.operating-systems": "Systèmes d'exploitation",
"label.os": "OS",
"label.overview": "Vue d'ensemble",
"label.owner": "Propriétaire",
"label.page-of": "Page {current} of {total}",
"label.page-views": "Pages vues",
"label.pageTitle": "Page title",
"label.pages": "Pages",
"label.password": "Mot de passe",
"label.powered-by": "Propulsé par {name}",
@ -80,15 +110,18 @@
"label.query": "Requête",
"label.query-parameters": "Paramètres d'URL",
"label.realtime": "Temps réel",
"label.referrer": "Referrer",
"label.referrers": "Sites référents",
"label.refresh": "Rafraîchir",
"label.regenerate": "Régénérer",
"label.region": "Region",
"label.regions": "Régions",
"label.remove": "Retirer",
"label.reports": "Rapports",
"label.required": "Requis",
"label.reset": "Réinitialiser",
"label.reset-website": "Réinitialiser les statistiques",
"label.retention": "Retention",
"label.role": "Rôle",
"label.run-query": "Éxécuter la requête",
"label.save": "Enregistrer",
@ -99,12 +132,15 @@
"label.settings": "Paramètres",
"label.share-url": "URL de partage",
"label.single-day": "Journée",
"label.sum": "Somme",
"label.tablet": "Tablette",
"label.team": "Équipe",
"label.team-guest": "Invité dans l'équipe",
"label.team-id": "ID d'équipe",
"label.team-member": "Membre de l'équipe",
"label.team-name": "Team name",
"label.team-owner": "Propriétaire de l'équipe",
"label.team-websites": "Team websites",
"label.teams": "Équipes",
"label.theme": "Thème",
"label.this-month": "Ce mois",
@ -114,14 +150,21 @@
"label.title": "Titre",
"label.today": "Aujourd'hui",
"label.toggle-charts": "Afficher/Masquer les graphiques",
"label.total": "Total",
"label.total-records": "Nombre d'enregistrements",
"label.tracking-code": "Code de suivi",
"label.true": "Vrai",
"label.type": "Type",
"label.unique": "Unique",
"label.unique-visitors": "Visiteurs uniques",
"label.unknown": "Inconnu",
"label.untitled": "Sans titre",
"label.url": "URL",
"label.urls": "URLs",
"label.user": "Utilisateur",
"label.username": "Nom d'utilisateur",
"label.users": "Utilisateurs",
"label.value": "Valeur",
"label.view": "Voir",
"label.view-details": "Voir les détails",
"label.view-only": "Consultation",
@ -132,33 +175,6 @@
"label.websites": "Sites",
"label.window": "Fenêtre",
"label.yesterday": "Hier",
"labels.after": "Après",
"labels.average": "Moyenne",
"labels.before": "Avant",
"labels.breakdown": "Répartition",
"labels.contains": "Contient",
"labels.create-report": "Créer un rapport",
"labels.description": "Description",
"labels.does-not-contain": "Ne contient pas",
"labels.does-not-equal": "N'est pas égal",
"labels.equals": "Est égal",
"labels.false": "Faux",
"labels.filters": "Filtres",
"labels.greater-than": "Supérieur à",
"labels.greater-than-equals": "Supérieur ou égal à",
"labels.less-than": "Inférieur à",
"labels.less-than-equals": "Inférieur ou égal à",
"labels.max": "Max",
"labels.min": "Min",
"labels.overview": "Vue d'ensemble",
"labels.sum": "Somme",
"labels.total": "Total",
"labels.total-records": "Nombre d'enregistrements",
"labels.true": "Vrai",
"labels.type": "Type",
"labels.unique": "Unique",
"labels.untitled": "Sans titre",
"labels.value": "Valeur",
"message.active-users": "{x} {x, plural, one {visiteur} other {visiteurs}} actuellement",
"message.confirm-delete": "Êtes-vous sûr de vouloir supprimer {target} ?",
"message.confirm-leave": "Êtes-vous sûr de vouloir quitter {target} ?",
@ -172,11 +188,15 @@
"message.incorrect-username-password": "Nom d'utilisateur/Mot de passe incorrect.",
"message.invalid-domain": "Domaine invalide",
"message.min-password-length": "Taille minimale de {n} caractères",
"message.new-version-available": "A new version of Umami {version} is available!",
"message.no-data-available": "Aucune donnée disponible.",
"message.no-event-data": "Aucune donnée d'événement disponible.",
"message.no-match-password": "Les mots de passe ne correspondent pas",
"message.no-results-found": "Aucun résultat n'a été trouvé.",
"message.no-team-websites": "Cette équipe n'a aucun site.",
"message.no-teams": "Vous n'avez pas créé d'équipe.",
"message.no-users": "Aucun utilisateur.",
"message.no-websites-configured": "Vous n'avez pas configuré de site.",
"message.page-not-found": "Page non trouvée.",
"message.reset-website": "Pour réinitialiser ce site, taper {confirmation} ci-dessous pour confirmer.",
"message.reset-website-warning": "Toutes les statistiques pour ce site seront supprimées, mais votre code de suivi restera intact.",
@ -184,12 +204,8 @@
"message.share-url": "Les statistiques de votre site sont accessibles publiquement sur cette URL :",
"message.team-already-member": "Vous êtes déjà membre de cette équipe.",
"message.team-not-found": "Équipe non trouvée.",
"message.team-websites-info": "Les sites peuvent être vus par tout utilisateur dans l'équipe.",
"message.tracking-code": "Code de suivi",
"message.user-deleted": "Utilisateur supprimé.",
"message.visitor-log": "Visiteur de {country} utilisant {browser} sur {os} {device}",
"message.no-results-found": "Aucun résultat n'a été trouvé.",
"message.no-team-websites": "Cette équipe n'a aucun site.",
"message.no-websites-configured": "Vous n'avez pas configuré de site.",
"message.team-websites-info": "Les sites peuvent être vus par tout utilisateur dans l'équipe.",
"message.new-version-available": "A new version of Umami {version} is available!"
"message.visitor-log": "Visiteur de {country} utilisant {browser} sur {os} {device}"
}

View File

@ -6,21 +6,30 @@
"label.add-description": "Add description",
"label.add-website": "Engadir sitio web",
"label.admin": "Administradora",
"label.after": "After",
"label.all": "Todo",
"label.all-time": "Sempre",
"label.analytics": "Analytics",
"label.average": "Average",
"label.average-visit-time": "Tempo medio de visita",
"label.back": "Atrás",
"label.before": "Before",
"label.bounce-rate": "Proporción de rebote",
"label.breakdown": "Breakdown",
"label.browser": "Browser",
"label.browsers": "Navegadores",
"label.cancel": "Cancelar",
"label.change-password": "Mudar contrasinal",
"label.cities": "Cities",
"label.city": "City",
"label.clear-all": "Clear all",
"label.confirm": "Confirm",
"label.confirm-password": "Confirmar contrasinal",
"label.contains": "Contains",
"label.continue": "Continue",
"label.countries": "Países",
"label.country": "Country",
"label.create-report": "Create report",
"label.create-team": "Create team",
"label.create-user": "Create user",
"label.created": "Created",
@ -28,16 +37,21 @@
"label.custom-range": "Rango personalizado",
"label.dashboard": "Taboleiro",
"label.data": "Data",
"label.date": "Date",
"label.date-range": "Rango temporal",
"label.day": "Day",
"label.default-date-range": "Rango temporal por defecto",
"label.delete": "Eliminar",
"label.delete-team": "Delete team",
"label.delete-user": "Delete user",
"label.delete-website": "Eliminar sitio web",
"label.description": "Description",
"label.desktop": "Escritorio",
"label.details": "Details",
"label.device": "Device",
"label.devices": "Dispositivos",
"label.dismiss": "Desbotar",
"label.does-not-contain": "Does not contain",
"label.domain": "Dominio",
"label.dropoff": "Dropoff",
"label.edit": "Editar",
@ -46,12 +60,20 @@
"label.event": "Event",
"label.event-data": "Event data",
"label.events": "Eventos",
"label.false": "False",
"label.field": "Field",
"label.fields": "Fields",
"label.filter-combined": "Combinado",
"label.filter-raw": "Raw",
"label.filters": "Filters",
"label.funnel": "Funnel",
"label.greater-than": "Greater than",
"label.greater-than-equals": "Greater than or equals",
"label.insights": "Insights",
"label.is": "Is",
"label.is-not": "Is not",
"label.is-not-set": "Is not set",
"label.is-set": "Is set",
"label.join": "Join",
"label.join-team": "Join team",
"label.language": "Idioma",
@ -61,17 +83,25 @@
"label.last-hours": "Últimas {x} horas",
"label.leave": "Leave",
"label.leave-team": "Leave team",
"label.less-than": "Less than",
"label.less-than-equals": "Less than or equals",
"label.login": "Acceder",
"label.logout": "Pechar sesión",
"label.max": "Max",
"label.members": "Members",
"label.min": "Min",
"label.mobile": "Móbil",
"label.more": "Máis",
"label.my-websites": "My websites",
"label.name": "Nome",
"label.new-password": "Novo contrasinal",
"label.none": "None",
"label.operating-systems": "Sistemas operativos",
"label.os": "OS",
"label.overview": "Overview",
"label.owner": "Dona",
"label.page-of": "Page {current} of {total}",
"label.page-views": "Vistas de páxinas",
"label.pageTitle": "Page title",
"label.pages": "Páxinas",
"label.password": "Contrasinal",
"label.powered-by": "Funciona grazas a {name}",
@ -80,15 +110,18 @@
"label.query": "Query",
"label.query-parameters": "Query parameters",
"label.realtime": "Agora mesmo",
"label.referrer": "Referrer",
"label.referrers": "Orixes",
"label.refresh": "Actualizar",
"label.regenerate": "Regenerate",
"label.region": "Region",
"label.regions": "Regions",
"label.remove": "Remove",
"label.reports": "Reports",
"label.required": "Requerido",
"label.reset": "Restablecer",
"label.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
"label.retention": "Retention",
"label.role": "Role",
"label.run-query": "Run query",
"label.save": "Gardar",
@ -99,12 +132,15 @@
"label.settings": "Axustes",
"label.share-url": "Compartir URL",
"label.single-day": "Un só día",
"label.sum": "Sum",
"label.tablet": "Tableta",
"label.team": "Team",
"label.team-guest": "Team guest",
"label.team-id": "Team ID",
"label.team-member": "Team member",
"label.team-name": "Team name",
"label.team-owner": "Team owner",
"label.team-websites": "Team websites",
"label.teams": "Teams",
"label.theme": "Decorado",
"label.this-month": "Este mes",
@ -114,14 +150,21 @@
"label.title": "Title",
"label.today": "Hoxe",
"label.toggle-charts": "Activación das gráficas",
"label.total": "Total",
"label.total-records": "Total records",
"label.tracking-code": "Código de seguimento",
"label.true": "True",
"label.type": "Type",
"label.unique": "Unique",
"label.unique-visitors": "Visitas únicas",
"label.unknown": "Descoñecido",
"label.untitled": "Untitled",
"label.url": "URL",
"label.urls": "URLs",
"label.user": "User",
"label.username": "Identificador",
"label.users": "Users",
"label.value": "Value",
"label.view": "View",
"label.view-details": "Ver detalles",
"label.view-only": "View only",
@ -132,33 +175,6 @@
"label.websites": "Sitios web",
"label.window": "Window",
"label.yesterday": "Yesterday",
"labels.after": "After",
"labels.average": "Average",
"labels.before": "Before",
"labels.breakdown": "Breakdown",
"labels.contains": "Contains",
"labels.create-report": "Create report",
"labels.description": "Description",
"labels.does-not-contain": "Does not contain",
"labels.does-not-equal": "Does not equal",
"labels.equals": "Equals",
"labels.false": "False",
"labels.filters": "Filters",
"labels.greater-than": "Greater than",
"labels.greater-than-equals": "Greater than or equals",
"labels.less-than": "Less than",
"labels.less-than-equals": "Less than or equals",
"labels.max": "Max",
"labels.min": "Min",
"labels.overview": "Overview",
"labels.sum": "Sum",
"labels.total": "Total",
"labels.total-records": "Total records",
"labels.true": "True",
"labels.type": "Type",
"labels.unique": "Unique",
"labels.untitled": "Untitled",
"labels.value": "Value",
"message.active-users": "{x} actual {x, plural, one {visitante} other {visitantes}}",
"message.confirm-delete": "Tes a certeza de querer eliminar {target}?",
"message.confirm-leave": "Are you sure you want to leave {target}?",
@ -172,11 +188,15 @@
"message.incorrect-username-password": "Credenciais incorrectas.",
"message.invalid-domain": "Dominio non válido",
"message.min-password-length": "Minimum length of {n} characters",
"message.new-version-available": "A new version of Umami {version} is available!",
"message.no-data-available": "Sen datos dispoñibles.",
"message.no-event-data": "No event data is available.",
"message.no-match-password": "Non concordan os contrasinais",
"message.no-results-found": "No results were found.",
"message.no-team-websites": "This team does not have any websites.",
"message.no-teams": "You have not created any teams.",
"message.no-users": "There are no users.",
"message.no-websites-configured": "Non tes sitios web configurados.",
"message.page-not-found": "Páxina non atopada.",
"message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
"message.reset-website-warning": "Vanse eliminar tódalas estatísticas deste sitio web, pero o código de seguimento permanecerá sen cambios.",
@ -184,12 +204,8 @@
"message.share-url": "Este é o URL da compartición pública de {target}.",
"message.team-already-member": "You are already a member of the team.",
"message.team-not-found": "Team not found.",
"message.team-websites-info": "Websites can be viewed by anyone on the team.",
"message.tracking-code": "Código de seguimento",
"message.user-deleted": "User deleted.",
"message.visitor-log": "Visitante desde {country} usando {browser} en {os} {device}",
"message.no-results-found": "No results were found.",
"message.no-team-websites": "This team does not have any websites.",
"message.no-websites-configured": "Non tes sitios web configurados.",
"message.team-websites-info": "Websites can be viewed by anyone on the team.",
"message.new-version-available": "A new version of Umami {version} is available!"
"message.visitor-log": "Visitante desde {country} usando {browser} en {os} {device}"
}

View File

@ -6,21 +6,30 @@
"label.add-description": "Add description",
"label.add-website": "הוספת אתר",
"label.admin": "מנהל",
"label.after": "After",
"label.all": "הכל",
"label.all-time": "All time",
"label.analytics": "Analytics",
"label.average": "Average",
"label.average-visit-time": "זמן ביקור ממוצע",
"label.back": "חזרה",
"label.before": "Before",
"label.bounce-rate": "Bounce rate",
"label.breakdown": "Breakdown",
"label.browser": "Browser",
"label.browsers": "דפדפנים",
"label.cancel": "ביטול",
"label.change-password": "שינוי סיסמה",
"label.cities": "Cities",
"label.city": "City",
"label.clear-all": "Clear all",
"label.confirm": "Confirm",
"label.confirm-password": "אישור סיסמה",
"label.contains": "Contains",
"label.continue": "Continue",
"label.countries": "מדינות",
"label.country": "Country",
"label.create-report": "Create report",
"label.create-team": "Create team",
"label.create-user": "Create user",
"label.created": "Created",
@ -28,16 +37,21 @@
"label.custom-range": "טווח מותאם",
"label.dashboard": "דשבורד",
"label.data": "Data",
"label.date": "Date",
"label.date-range": "טווח תאריכים",
"label.day": "Day",
"label.default-date-range": "טווח תאריכים בברירת מחדל",
"label.delete": "הסרה",
"label.delete-team": "Delete team",
"label.delete-user": "Delete user",
"label.delete-website": "הסרת אתר",
"label.description": "Description",
"label.desktop": "דסקטופ",
"label.details": "Details",
"label.device": "Device",
"label.devices": "מכשירים",
"label.dismiss": "שיחרור",
"label.does-not-contain": "Does not contain",
"label.domain": "דומיין",
"label.dropoff": "Dropoff",
"label.edit": "עריכה",
@ -46,12 +60,20 @@
"label.event": "Event",
"label.event-data": "Event data",
"label.events": "אירועים",
"label.false": "False",
"label.field": "Field",
"label.fields": "Fields",
"label.filter-combined": "משותף",
"label.filter-raw": "גולמי",
"label.filters": "Filters",
"label.funnel": "Funnel",
"label.greater-than": "Greater than",
"label.greater-than-equals": "Greater than or equals",
"label.insights": "Insights",
"label.is": "Is",
"label.is-not": "Is not",
"label.is-not-set": "Is not set",
"label.is-set": "Is set",
"label.join": "Join",
"label.join-team": "Join team",
"label.language": "Language",
@ -61,17 +83,25 @@
"label.last-hours": "{x} שעות אחרונות",
"label.leave": "Leave",
"label.leave-team": "Leave team",
"label.less-than": "Less than",
"label.less-than-equals": "Less than or equals",
"label.login": "התחברות",
"label.logout": "התנתקות",
"label.max": "Max",
"label.members": "Members",
"label.min": "Min",
"label.mobile": "מובייל",
"label.more": "עוד",
"label.my-websites": "My websites",
"label.name": "שם",
"label.new-password": "סיסמה חדשה",
"label.none": "None",
"label.operating-systems": "מערכות הפעלה",
"label.os": "OS",
"label.overview": "Overview",
"label.owner": "Owner",
"label.page-of": "Page {current} of {total}",
"label.page-views": "צפיות בדפים",
"label.pageTitle": "Page title",
"label.pages": "דפים",
"label.password": "סיסמה",
"label.powered-by": "Powered by {name}",
@ -80,15 +110,18 @@
"label.query": "Query",
"label.query-parameters": "Query parameters",
"label.realtime": "זמן אמת",
"label.referrer": "Referrer",
"label.referrers": "מפנים",
"label.refresh": "רענון",
"label.regenerate": "Regenerate",
"label.region": "Region",
"label.regions": "Regions",
"label.remove": "Remove",
"label.reports": "Reports",
"label.required": "נדרש",
"label.reset": "איפוס",
"label.reset-website": "Reset statistics",
"label.retention": "Retention",
"label.role": "Role",
"label.run-query": "Run query",
"label.save": "שמירה",
@ -99,12 +132,15 @@
"label.settings": "הגדרות",
"label.share-url": "שיתוף URL",
"label.single-day": "יום בודד",
"label.sum": "Sum",
"label.tablet": "טאבלט",
"label.team": "Team",
"label.team-guest": "Team guest",
"label.team-id": "Team ID",
"label.team-member": "Team member",
"label.team-name": "Team name",
"label.team-owner": "Team owner",
"label.team-websites": "Team websites",
"label.teams": "Teams",
"label.theme": "Theme",
"label.this-month": "החודש",
@ -114,14 +150,21 @@
"label.title": "Title",
"label.today": "היום",
"label.toggle-charts": "Toggle charts",
"label.total": "Total",
"label.total-records": "Total records",
"label.tracking-code": "קוד מעקב",
"label.true": "True",
"label.type": "Type",
"label.unique": "Unique",
"label.unique-visitors": "מבקרים ייחודיים",
"label.unknown": "לא ידוע",
"label.untitled": "Untitled",
"label.url": "URL",
"label.urls": "URLs",
"label.user": "User",
"label.username": "שם משתמש",
"label.users": "Users",
"label.value": "Value",
"label.view": "View",
"label.view-details": "פרטים נוספים",
"label.view-only": "View only",
@ -132,33 +175,6 @@
"label.websites": "אתרים",
"label.window": "Window",
"label.yesterday": "Yesterday",
"labels.after": "After",
"labels.average": "Average",
"labels.before": "Before",
"labels.breakdown": "Breakdown",
"labels.contains": "Contains",
"labels.create-report": "Create report",
"labels.description": "Description",
"labels.does-not-contain": "Does not contain",
"labels.does-not-equal": "Does not equal",
"labels.equals": "Equals",
"labels.false": "False",
"labels.filters": "Filters",
"labels.greater-than": "Greater than",
"labels.greater-than-equals": "Greater than or equals",
"labels.less-than": "Less than",
"labels.less-than-equals": "Less than or equals",
"labels.max": "Max",
"labels.min": "Min",
"labels.overview": "Overview",
"labels.sum": "Sum",
"labels.total": "Total",
"labels.total-records": "Total records",
"labels.true": "True",
"labels.type": "Type",
"labels.unique": "Unique",
"labels.untitled": "Untitled",
"labels.value": "Value",
"message.active-users": "{x} נוכחיים {x, plural, one {מבקר} other {מבקרים}}",
"message.confirm-delete": "האם באמת למחוק את {target}?",
"message.confirm-leave": "Are you sure you want to leave {target}?",
@ -172,11 +188,15 @@
"message.incorrect-username-password": "שם משתמש או סיסמה לא נכונים",
"message.invalid-domain": "דומיין לא תקין",
"message.min-password-length": "Minimum length of {n} characters",
"message.new-version-available": "A new version of Umami {version} is available!",
"message.no-data-available": "אין מידע זמין",
"message.no-event-data": "No event data is available.",
"message.no-match-password": "סיסמאות לא תואמות",
"message.no-results-found": "No results were found.",
"message.no-team-websites": "This team does not have any websites.",
"message.no-teams": "You have not created any teams.",
"message.no-users": "There are no users.",
"message.no-websites-configured": "לא מוגדרים אתרים",
"message.page-not-found": "דף לא נמצא",
"message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
"message.reset-website-warning": "All statistics for this website will be deleted, but your tracking code will remain intact.",
@ -184,12 +204,8 @@
"message.share-url": "זהו URL ציבורי עבור {target}",
"message.team-already-member": "You are already a member of the team.",
"message.team-not-found": "Team not found.",
"message.team-websites-info": "Websites can be viewed by anyone on the team.",
"message.tracking-code": "קוד מעקב",
"message.user-deleted": "User deleted.",
"message.visitor-log": "מבקר ממדינת {country} משתמבש בדפדפן {browser} ב-{os} {device}",
"message.no-results-found": "No results were found.",
"message.no-team-websites": "This team does not have any websites.",
"message.no-websites-configured": "לא מוגדרים אתרים",
"message.team-websites-info": "Websites can be viewed by anyone on the team.",
"message.new-version-available": "A new version of Umami {version} is available!"
"message.visitor-log": "מבקר ממדינת {country} משתמבש בדפדפן {browser} ב-{os} {device}"
}

View File

@ -6,21 +6,30 @@
"label.add-description": "Add description",
"label.add-website": "वेबसाइट",
"label.admin": "प्रशासक",
"label.after": "After",
"label.all": "सब",
"label.all-time": "All time",
"label.analytics": "Analytics",
"label.average": "Average",
"label.average-visit-time": "औसत दृश्य समय",
"label.back": "पीछे",
"label.before": "Before",
"label.bounce-rate": "उछाल दर",
"label.breakdown": "Breakdown",
"label.browser": "Browser",
"label.browsers": "वेब ब्राउज़र",
"label.cancel": "रद्द करें",
"label.change-password": "पासवर्ड बदलें",
"label.cities": "Cities",
"label.city": "City",
"label.clear-all": "Clear all",
"label.confirm": "Confirm",
"label.confirm-password": "पासवर्ड की पुष्टि कीजिये",
"label.contains": "Contains",
"label.continue": "Continue",
"label.countries": "देश",
"label.country": "Country",
"label.create-report": "Create report",
"label.create-team": "Create team",
"label.create-user": "Create user",
"label.created": "Created",
@ -28,16 +37,21 @@
"label.custom-range": "कस्टम रेंज",
"label.dashboard": "नियंत्रण-पट्ट",
"label.data": "Data",
"label.date": "Date",
"label.date-range": "तिथि सीमा",
"label.day": "Day",
"label.default-date-range": "डिफ़ॉल्ट तिथि सीमा",
"label.delete": "खाता हटाएं",
"label.delete-team": "Delete team",
"label.delete-user": "Delete user",
"label.delete-website": "वेबसाइट हटाएं",
"label.description": "Description",
"label.desktop": "डेस्कटॉप",
"label.details": "Details",
"label.device": "Device",
"label.devices": "उपकरण",
"label.dismiss": "खारिज कीजिये",
"label.does-not-contain": "Does not contain",
"label.domain": "डोमेन",
"label.dropoff": "Dropoff",
"label.edit": "संपादित करें",
@ -46,12 +60,20 @@
"label.event": "Event",
"label.event-data": "Event data",
"label.events": "स्पर्धाएँ",
"label.false": "False",
"label.field": "Field",
"label.fields": "Fields",
"label.filter-combined": "संयुक्त",
"label.filter-raw": "रॉ",
"label.filters": "Filters",
"label.funnel": "Funnel",
"label.greater-than": "Greater than",
"label.greater-than-equals": "Greater than or equals",
"label.insights": "Insights",
"label.is": "Is",
"label.is-not": "Is not",
"label.is-not-set": "Is not set",
"label.is-set": "Is set",
"label.join": "Join",
"label.join-team": "Join team",
"label.language": "Language",
@ -61,17 +83,25 @@
"label.last-hours": "पिछले {x} घंटे",
"label.leave": "Leave",
"label.leave-team": "Leave team",
"label.less-than": "Less than",
"label.less-than-equals": "Less than or equals",
"label.login": "लॉग इन",
"label.logout": "लॉग आउट",
"label.max": "Max",
"label.members": "Members",
"label.min": "Min",
"label.mobile": "मोबाइल फोन",
"label.more": "और",
"label.my-websites": "My websites",
"label.name": "नाम",
"label.new-password": "नया पासवर्ड",
"label.none": "None",
"label.operating-systems": "ऑपरेटिंग सिस्टम",
"label.os": "OS",
"label.overview": "Overview",
"label.owner": "Owner",
"label.page-of": "Page {current} of {total}",
"label.page-views": "पृष्ठ दृश्य",
"label.pageTitle": "Page title",
"label.pages": "पृष्ठों",
"label.password": "पासवर्ड",
"label.powered-by": "{name} द्वारा संचालित",
@ -80,15 +110,18 @@
"label.query": "Query",
"label.query-parameters": "Query parameters",
"label.realtime": "वास्तव काल",
"label.referrer": "Referrer",
"label.referrers": "सन्दर्भदाता",
"label.refresh": "रिफ्रेश",
"label.regenerate": "Regenerate",
"label.region": "Region",
"label.regions": "Regions",
"label.remove": "Remove",
"label.reports": "Reports",
"label.required": "अपेक्षित",
"label.reset": "रीसेट",
"label.reset-website": "Reset statistics",
"label.retention": "Retention",
"label.role": "Role",
"label.run-query": "Run query",
"label.save": "सहेजें",
@ -99,12 +132,15 @@
"label.settings": "समायोजन",
"label.share-url": "यूआरएल साझा करें",
"label.single-day": "एक दिन",
"label.sum": "Sum",
"label.tablet": "टैबलेट",
"label.team": "Team",
"label.team-guest": "Team guest",
"label.team-id": "Team ID",
"label.team-member": "Team member",
"label.team-name": "Team name",
"label.team-owner": "Team owner",
"label.team-websites": "Team websites",
"label.teams": "Teams",
"label.theme": "Theme",
"label.this-month": "इस महीने",
@ -114,14 +150,21 @@
"label.title": "Title",
"label.today": "आज",
"label.toggle-charts": "Toggle charts",
"label.total": "Total",
"label.total-records": "Total records",
"label.tracking-code": "ट्रैकिंग कोड",
"label.true": "True",
"label.type": "Type",
"label.unique": "Unique",
"label.unique-visitors": "अद्वितीय आगंतुकों",
"label.unknown": "अज्ञात",
"label.untitled": "Untitled",
"label.url": "URL",
"label.urls": "URLs",
"label.user": "User",
"label.username": "उपयोगकर्ता नाम",
"label.users": "Users",
"label.value": "Value",
"label.view": "View",
"label.view-details": "विवरण देखें",
"label.view-only": "View only",
@ -132,33 +175,6 @@
"label.websites": "वेबसाइटों",
"label.window": "Window",
"label.yesterday": "Yesterday",
"labels.after": "After",
"labels.average": "Average",
"labels.before": "Before",
"labels.breakdown": "Breakdown",
"labels.contains": "Contains",
"labels.create-report": "Create report",
"labels.description": "Description",
"labels.does-not-contain": "Does not contain",
"labels.does-not-equal": "Does not equal",
"labels.equals": "Equals",
"labels.false": "False",
"labels.filters": "Filters",
"labels.greater-than": "Greater than",
"labels.greater-than-equals": "Greater than or equals",
"labels.less-than": "Less than",
"labels.less-than-equals": "Less than or equals",
"labels.max": "Max",
"labels.min": "Min",
"labels.overview": "Overview",
"labels.sum": "Sum",
"labels.total": "Total",
"labels.total-records": "Total records",
"labels.true": "True",
"labels.type": "Type",
"labels.unique": "Unique",
"labels.untitled": "Untitled",
"labels.value": "Value",
"message.active-users": "{x} मौजूद {x, plural, one {आगंतुक} other {आगंतुकों}}",
"message.confirm-delete": "क्या आप वाकई में {target} हटाना चाहते हैं?",
"message.confirm-leave": "Are you sure you want to leave {target}?",
@ -172,11 +188,15 @@
"message.incorrect-username-password": "ग़लत उपयोगकर्ता नाम / पासवर्ड।",
"message.invalid-domain": "अमान्य डोमेन",
"message.min-password-length": "Minimum length of {n} characters",
"message.new-version-available": "A new version of Umami {version} is available!",
"message.no-data-available": "कोई डेटा उपलब्ध नहीं है।",
"message.no-event-data": "No event data is available.",
"message.no-match-password": "पासवर्ड मेल नहीं खाते",
"message.no-results-found": "No results were found.",
"message.no-team-websites": "This team does not have any websites.",
"message.no-teams": "You have not created any teams.",
"message.no-users": "There are no users.",
"message.no-websites-configured": "आपके पास कोई वेबसाइट कॉन्फ़िगर नहीं है।",
"message.page-not-found": "पृष्ठ नहीं मिला।",
"message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
"message.reset-website-warning": "All statistics for this website will be deleted, but your tracking code will remain intact.",
@ -184,12 +204,8 @@
"message.share-url": "यह {target} के लिए सार्वजनिक रूप से साझा किया गया URL है।",
"message.team-already-member": "You are already a member of the team.",
"message.team-not-found": "Team not found.",
"message.team-websites-info": "Websites can be viewed by anyone on the team.",
"message.tracking-code": "ट्रैकिंग कोड",
"message.user-deleted": "User deleted.",
"message.visitor-log": "{country} का आगंतुक, जो {browser} का उपयोग करता है, {os} यन्त्र पर",
"message.no-results-found": "No results were found.",
"message.no-team-websites": "This team does not have any websites.",
"message.no-websites-configured": "आपके पास कोई वेबसाइट कॉन्फ़िगर नहीं है।",
"message.team-websites-info": "Websites can be viewed by anyone on the team.",
"message.new-version-available": "A new version of Umami {version} is available!"
"message.visitor-log": "{country} का आगंतुक, जो {browser} का उपयोग करता है, {os} यन्त्र पर"
}

View File

@ -6,21 +6,30 @@
"label.add-description": "Add description",
"label.add-website": "Dodaj web stranicu",
"label.admin": "Administrator",
"label.after": "After",
"label.all": "Sve",
"label.all-time": "Svo vrijeme",
"label.analytics": "Analytics",
"label.average": "Average",
"label.average-visit-time": "Average visit time",
"label.back": "Natrag ",
"label.before": "Before",
"label.bounce-rate": "Bounce rate",
"label.breakdown": "Breakdown",
"label.browser": "Browser",
"label.browsers": "Browsers",
"label.cancel": "Odustani",
"label.change-password": "Promijeni lozinku",
"label.cities": "Cities",
"label.city": "City",
"label.clear-all": "Clear all",
"label.confirm": "Confirm",
"label.confirm-password": "Potvrdi lozinku",
"label.contains": "Contains",
"label.continue": "Continue",
"label.countries": "Countries",
"label.country": "Country",
"label.create-report": "Create report",
"label.create-team": "Create team",
"label.create-user": "Create user",
"label.created": "Created",
@ -28,16 +37,21 @@
"label.custom-range": "Prilagođeni raspon",
"label.dashboard": "Nadzorna ploča",
"label.data": "Data",
"label.date": "Date",
"label.date-range": "Raspon datuma",
"label.day": "Day",
"label.default-date-range": "Zadani datumski raspon",
"label.delete": "Obriši",
"label.delete-team": "Delete team",
"label.delete-user": "Delete user",
"label.delete-website": "Obriši web stranicu",
"label.description": "Description",
"label.desktop": "Desktop",
"label.details": "Details",
"label.device": "Device",
"label.devices": "Devices",
"label.dismiss": "Odbaci",
"label.does-not-contain": "Does not contain",
"label.domain": "Domena",
"label.dropoff": "Dropoff",
"label.edit": "Uredi",
@ -46,12 +60,20 @@
"label.event": "Event",
"label.event-data": "Podaci događaja",
"label.events": "Events",
"label.false": "False",
"label.field": "Field",
"label.fields": "Fields",
"label.filter-combined": "Combined",
"label.filter-raw": "Raw",
"label.filters": "Filters",
"label.funnel": "Funnel",
"label.greater-than": "Greater than",
"label.greater-than-equals": "Greater than or equals",
"label.insights": "Insights",
"label.is": "Is",
"label.is-not": "Is not",
"label.is-not-set": "Is not set",
"label.is-set": "Is set",
"label.join": "Join",
"label.join-team": "Join team",
"label.language": "Jezik",
@ -61,17 +83,25 @@
"label.last-hours": "Zadnjih {x} sati",
"label.leave": "Leave",
"label.leave-team": "Leave team",
"label.less-than": "Less than",
"label.less-than-equals": "Less than or equals",
"label.login": "Prijava",
"label.logout": "Odjava",
"label.max": "Max",
"label.members": "Members",
"label.min": "Min",
"label.mobile": "Mobile",
"label.more": "Više",
"label.my-websites": "My websites",
"label.name": "Ime",
"label.new-password": "Nova lozinka",
"label.none": "Ništa",
"label.operating-systems": "Operating systems",
"label.os": "OS",
"label.overview": "Overview",
"label.owner": "Vlasnik",
"label.page-of": "Page {current} of {total}",
"label.page-views": "Page views",
"label.pageTitle": "Page title",
"label.pages": "Pages",
"label.password": "Lozinka",
"label.powered-by": "Powered by {name}",
@ -80,15 +110,18 @@
"label.query": "Query",
"label.query-parameters": "Query parameters",
"label.realtime": "Stvarno vrijeme",
"label.referrer": "Referrer",
"label.referrers": "Referrers",
"label.refresh": "Osvježi",
"label.regenerate": "Regenerate",
"label.region": "Region",
"label.regions": "Regions",
"label.remove": "Remove",
"label.reports": "Reports",
"label.required": "Potrebna",
"label.reset": "Resetirati",
"label.reset-website": "Resetirati web stranicu",
"label.retention": "Retention",
"label.role": "Role",
"label.run-query": "Run query",
"label.save": "Spremi",
@ -99,12 +132,15 @@
"label.settings": "Postavke",
"label.share-url": "Podijeli poveznicu",
"label.single-day": "Jedan dan",
"label.sum": "Sum",
"label.tablet": "Tablet",
"label.team": "Team",
"label.team-guest": "Team guest",
"label.team-id": "Team ID",
"label.team-member": "Team member",
"label.team-name": "Team name",
"label.team-owner": "Team owner",
"label.team-websites": "Team websites",
"label.teams": "Teams",
"label.theme": "Tema",
"label.this-month": "Ovaj mjesec",
@ -114,14 +150,21 @@
"label.title": "Title",
"label.today": "Danas",
"label.toggle-charts": "Toggle charts",
"label.total": "Total",
"label.total-records": "Total records",
"label.tracking-code": "Kod za praćenje",
"label.true": "True",
"label.type": "Type",
"label.unique": "Unique",
"label.unique-visitors": "Unique visitors",
"label.unknown": "Nepoznato",
"label.untitled": "Untitled",
"label.url": "URL",
"label.urls": "URLs",
"label.user": "User",
"label.username": "Korisničko ime",
"label.users": "Users",
"label.value": "Value",
"label.view": "View",
"label.view-details": "Pogledaj detalje",
"label.view-only": "View only",
@ -132,33 +175,6 @@
"label.websites": "Web stranice",
"label.window": "Window",
"label.yesterday": "Jučer",
"labels.after": "After",
"labels.average": "Average",
"labels.before": "Before",
"labels.breakdown": "Breakdown",
"labels.contains": "Contains",
"labels.create-report": "Create report",
"labels.description": "Description",
"labels.does-not-contain": "Does not contain",
"labels.does-not-equal": "Does not equal",
"labels.equals": "Equals",
"labels.false": "False",
"labels.filters": "Filters",
"labels.greater-than": "Greater than",
"labels.greater-than-equals": "Greater than or equals",
"labels.less-than": "Less than",
"labels.less-than-equals": "Less than or equals",
"labels.max": "Max",
"labels.min": "Min",
"labels.overview": "Overview",
"labels.sum": "Sum",
"labels.total": "Total",
"labels.total-records": "Total records",
"labels.true": "True",
"labels.type": "Type",
"labels.unique": "Unique",
"labels.untitled": "Untitled",
"labels.value": "Value",
"message.active-users": "{x} Trenutno {x, plural, one {posjetitelj} other {posjetitelja}}",
"message.confirm-delete": "Jeste li sigurni da želite obrisati {target}?",
"message.confirm-leave": "Are you sure you want to leave {target}?",
@ -172,11 +188,15 @@
"message.incorrect-username-password": "Neispravno korisničke ime/lozinka.",
"message.invalid-domain": "Invalid domain. Do not include http/https.",
"message.min-password-length": "Minimum length of {n} characters",
"message.new-version-available": "A new version of Umami {version} is available!",
"message.no-data-available": "Nema dostupnih podataka.",
"message.no-event-data": "No event data is available.",
"message.no-match-password": "Passwords do not match.",
"message.no-results-found": "No results were found.",
"message.no-team-websites": "This team does not have any websites.",
"message.no-teams": "You have not created any teams.",
"message.no-users": "There are no users.",
"message.no-websites-configured": "You do not have any websites configured.",
"message.page-not-found": "Stranica nije pronađena.",
"message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
"message.reset-website-warning": "All statistics for this website will be deleted, but your settings will remain intact.",
@ -184,12 +204,8 @@
"message.share-url": "Ovo je javno dijeljena poveznica za {target}.",
"message.team-already-member": "You are already a member of the team.",
"message.team-not-found": "Team not found.",
"message.team-websites-info": "Websites can be viewed by anyone on the team.",
"message.tracking-code": "To track stats for this website, place the following code in the <head>...</head> section of your HTML.",
"message.user-deleted": "User deleted.",
"message.visitor-log": "Visitor from {country} using {browser} on {os} {device}",
"message.no-results-found": "No results were found.",
"message.no-team-websites": "This team does not have any websites.",
"message.no-websites-configured": "You do not have any websites configured.",
"message.team-websites-info": "Websites can be viewed by anyone on the team.",
"message.new-version-available": "A new version of Umami {version} is available!"
"message.visitor-log": "Visitor from {country} using {browser} on {os} {device}"
}

View File

@ -6,21 +6,30 @@
"label.add-description": "Add description",
"label.add-website": "Weboldal hozzáadása",
"label.admin": "Adminisztrátor",
"label.after": "After",
"label.all": "Összes",
"label.all-time": "All time",
"label.analytics": "Analytics",
"label.average": "Average",
"label.average-visit-time": "Átlagos látogatási idő",
"label.back": "Vissza",
"label.before": "Before",
"label.bounce-rate": "Visszafordulási arány",
"label.breakdown": "Breakdown",
"label.browser": "Browser",
"label.browsers": "Böngészők",
"label.cancel": "Mégsem",
"label.change-password": "Jelszó módosítása",
"label.cities": "Cities",
"label.city": "City",
"label.clear-all": "Clear all",
"label.confirm": "Confirm",
"label.confirm-password": "Jelszó megerősítése",
"label.contains": "Contains",
"label.continue": "Continue",
"label.countries": "Országok",
"label.country": "Country",
"label.create-report": "Create report",
"label.create-team": "Create team",
"label.create-user": "Create user",
"label.created": "Created",
@ -28,16 +37,21 @@
"label.custom-range": "Egyedi tartomány",
"label.dashboard": "Áttekintés",
"label.data": "Data",
"label.date": "Date",
"label.date-range": "Időintervallum",
"label.day": "Day",
"label.default-date-range": "Alapértelmezett időintervallum",
"label.delete": "Eltávolítás",
"label.delete-team": "Delete team",
"label.delete-user": "Delete user",
"label.delete-website": "Weboldal eltávolítása",
"label.description": "Description",
"label.desktop": "Asztali számítógép",
"label.details": "Details",
"label.device": "Device",
"label.devices": "Eszközök",
"label.dismiss": "Mellőzés",
"label.does-not-contain": "Does not contain",
"label.domain": "Domain",
"label.dropoff": "Dropoff",
"label.edit": "Módosítás",
@ -46,12 +60,20 @@
"label.event": "Event",
"label.event-data": "Event data",
"label.events": "Események",
"label.false": "False",
"label.field": "Field",
"label.fields": "Fields",
"label.filter-combined": "Összevont",
"label.filter-raw": "Nyers",
"label.filters": "Filters",
"label.funnel": "Funnel",
"label.greater-than": "Greater than",
"label.greater-than-equals": "Greater than or equals",
"label.insights": "Insights",
"label.is": "Is",
"label.is-not": "Is not",
"label.is-not-set": "Is not set",
"label.is-set": "Is set",
"label.join": "Join",
"label.join-team": "Join team",
"label.language": "Language",
@ -61,17 +83,25 @@
"label.last-hours": "Legutóbbi {x} óra",
"label.leave": "Leave",
"label.leave-team": "Leave team",
"label.less-than": "Less than",
"label.less-than-equals": "Less than or equals",
"label.login": "Bejelentkezés",
"label.logout": "Kijelentkezés",
"label.max": "Max",
"label.members": "Members",
"label.min": "Min",
"label.mobile": "Telefon",
"label.more": "Bővebben",
"label.my-websites": "My websites",
"label.name": "Név",
"label.new-password": "Új jelszó",
"label.none": "None",
"label.operating-systems": "Operációs rendszerek",
"label.os": "OS",
"label.overview": "Overview",
"label.owner": "Owner",
"label.page-of": "Page {current} of {total}",
"label.page-views": "Oldalmegtekintések",
"label.pageTitle": "Page title",
"label.pages": "Oldalak",
"label.password": "Jelszó",
"label.powered-by": "Működteti az {name}",
@ -80,15 +110,18 @@
"label.query": "Query",
"label.query-parameters": "Query parameters",
"label.realtime": "Valós idejű",
"label.referrer": "Referrer",
"label.referrers": "Hivatkozók",
"label.refresh": "Frissítés",
"label.regenerate": "Regenerate",
"label.region": "Region",
"label.regions": "Regions",
"label.remove": "Remove",
"label.reports": "Reports",
"label.required": "Kötelező",
"label.reset": "Visszaállítás",
"label.reset-website": "Reset statistics",
"label.retention": "Retention",
"label.role": "Role",
"label.run-query": "Run query",
"label.save": "Mentés",
@ -99,12 +132,15 @@
"label.settings": "Beállítások",
"label.share-url": "URL megosztása",
"label.single-day": "Egy nap",
"label.sum": "Sum",
"label.tablet": "Táblagép",
"label.team": "Team",
"label.team-guest": "Team guest",
"label.team-id": "Team ID",
"label.team-member": "Team member",
"label.team-name": "Team name",
"label.team-owner": "Team owner",
"label.team-websites": "Team websites",
"label.teams": "Teams",
"label.theme": "Theme",
"label.this-month": "Ezen hónap",
@ -114,14 +150,21 @@
"label.title": "Title",
"label.today": "Ma",
"label.toggle-charts": "Toggle charts",
"label.total": "Total",
"label.total-records": "Total records",
"label.tracking-code": "Követési kód",
"label.true": "True",
"label.type": "Type",
"label.unique": "Unique",
"label.unique-visitors": "Egyedi látogatók",
"label.unknown": "Ismeretlen",
"label.untitled": "Untitled",
"label.url": "URL",
"label.urls": "URLs",
"label.user": "User",
"label.username": "Felhasználónév",
"label.users": "Users",
"label.value": "Value",
"label.view": "View",
"label.view-details": "Részletek",
"label.view-only": "View only",
@ -132,33 +175,6 @@
"label.websites": "Weboldalak",
"label.window": "Window",
"label.yesterday": "Yesterday",
"labels.after": "After",
"labels.average": "Average",
"labels.before": "Before",
"labels.breakdown": "Breakdown",
"labels.contains": "Contains",
"labels.create-report": "Create report",
"labels.description": "Description",
"labels.does-not-contain": "Does not contain",
"labels.does-not-equal": "Does not equal",
"labels.equals": "Equals",
"labels.false": "False",
"labels.filters": "Filters",
"labels.greater-than": "Greater than",
"labels.greater-than-equals": "Greater than or equals",
"labels.less-than": "Less than",
"labels.less-than-equals": "Less than or equals",
"labels.max": "Max",
"labels.min": "Min",
"labels.overview": "Overview",
"labels.sum": "Sum",
"labels.total": "Total",
"labels.total-records": "Total records",
"labels.true": "True",
"labels.type": "Type",
"labels.unique": "Unique",
"labels.untitled": "Untitled",
"labels.value": "Value",
"message.active-users": "{x} {x, plural, one {látogató} other {latógató}} jelenleg",
"message.confirm-delete": "Biztos, hogy törölni szeretnéd {target} elemet?",
"message.confirm-leave": "Are you sure you want to leave {target}?",
@ -172,11 +188,15 @@
"message.incorrect-username-password": "Érvénytelen felhasználónév/jelszó.",
"message.invalid-domain": "Érvénytelen domain",
"message.min-password-length": "Minimum length of {n} characters",
"message.new-version-available": "A new version of Umami {version} is available!",
"message.no-data-available": "Nincs rendelkezésre álló adat.",
"message.no-event-data": "No event data is available.",
"message.no-match-password": "A jelszavak nem egyeznek",
"message.no-results-found": "No results were found.",
"message.no-team-websites": "This team does not have any websites.",
"message.no-teams": "You have not created any teams.",
"message.no-users": "There are no users.",
"message.no-websites-configured": "Még nem állítottál be egyetlen weboldalt sem.",
"message.page-not-found": "Oldal nem található.",
"message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
"message.reset-website-warning": "All statistics for this website will be deleted, but your tracking code will remain intact.",
@ -184,12 +204,8 @@
"message.share-url": "{target} nyilvánosan megosztott URL címe.",
"message.team-already-member": "You are already a member of the team.",
"message.team-not-found": "Team not found.",
"message.team-websites-info": "Websites can be viewed by anyone on the team.",
"message.tracking-code": "Követési kód",
"message.user-deleted": "User deleted.",
"message.visitor-log": "Látógató {country} területéről, {os} {device} eszközön, {browser} böngészőből.",
"message.no-results-found": "No results were found.",
"message.no-team-websites": "This team does not have any websites.",
"message.no-websites-configured": "Még nem állítottál be egyetlen weboldalt sem.",
"message.team-websites-info": "Websites can be viewed by anyone on the team.",
"message.new-version-available": "A new version of Umami {version} is available!"
"message.visitor-log": "Látógató {country} területéről, {os} {device} eszközön, {browser} böngészőből."
}

View File

@ -6,21 +6,30 @@
"label.add-description": "Add description",
"label.add-website": "Tambah situs web",
"label.admin": "Pengelola",
"label.after": "After",
"label.all": "Semua",
"label.all-time": "Semua waktu",
"label.analytics": "Analytics",
"label.average": "Average",
"label.average-visit-time": "Waktu kunjungan rata-rata",
"label.back": "Kembali",
"label.before": "Before",
"label.bounce-rate": "Rasio pentalan",
"label.breakdown": "Breakdown",
"label.browser": "Browser",
"label.browsers": "Peramban",
"label.cancel": "Batal",
"label.change-password": "Ganti kata sandi",
"label.cities": "Cities",
"label.city": "City",
"label.clear-all": "Clear all",
"label.confirm": "Confirm",
"label.confirm-password": "Konfirmasi kata sandi",
"label.contains": "Contains",
"label.continue": "Continue",
"label.countries": "Negara",
"label.country": "Country",
"label.create-report": "Create report",
"label.create-team": "Create team",
"label.create-user": "Create user",
"label.created": "Created",
@ -28,16 +37,21 @@
"label.custom-range": "Rentang khusus",
"label.dashboard": "Dasbor",
"label.data": "Data",
"label.date": "Date",
"label.date-range": "Rentang tanggal",
"label.day": "Day",
"label.default-date-range": "Rentang tanggal bawaan",
"label.delete": "Hapus",
"label.delete-team": "Delete team",
"label.delete-user": "Delete user",
"label.delete-website": "Hapus situs web",
"label.description": "Description",
"label.desktop": "Desktop",
"label.details": "Details",
"label.device": "Device",
"label.devices": "Perangkat",
"label.dismiss": "Tutup",
"label.does-not-contain": "Does not contain",
"label.domain": "Domain",
"label.dropoff": "Dropoff",
"label.edit": "Sunting",
@ -46,12 +60,20 @@
"label.event": "Event",
"label.event-data": "Event data",
"label.events": "Perihal",
"label.false": "False",
"label.field": "Field",
"label.fields": "Fields",
"label.filter-combined": "Gabungan",
"label.filter-raw": "Mentah",
"label.filters": "Filters",
"label.funnel": "Funnel",
"label.greater-than": "Greater than",
"label.greater-than-equals": "Greater than or equals",
"label.insights": "Insights",
"label.is": "Is",
"label.is-not": "Is not",
"label.is-not-set": "Is not set",
"label.is-set": "Is set",
"label.join": "Join",
"label.join-team": "Join team",
"label.language": "Bahasa",
@ -61,17 +83,25 @@
"label.last-hours": "{x} jam terakhir",
"label.leave": "Leave",
"label.leave-team": "Leave team",
"label.less-than": "Less than",
"label.less-than-equals": "Less than or equals",
"label.login": "Masuk",
"label.logout": "Keluar",
"label.max": "Max",
"label.members": "Members",
"label.min": "Min",
"label.mobile": "Ponsel",
"label.more": "Lebih banyak",
"label.my-websites": "My websites",
"label.name": "Nama",
"label.new-password": "Kata sandi baru",
"label.none": "None",
"label.operating-systems": "Sistem Operasi",
"label.os": "OS",
"label.overview": "Overview",
"label.owner": "Pemilik",
"label.page-of": "Page {current} of {total}",
"label.page-views": "Tampilan halaman",
"label.pageTitle": "Page title",
"label.pages": "Halaman",
"label.password": "Kata sandi",
"label.powered-by": "Didukung oleh {name}",
@ -80,15 +110,18 @@
"label.query": "Query",
"label.query-parameters": "Query parameters",
"label.realtime": "Waktu nyata",
"label.referrer": "Referrer",
"label.referrers": "Perujuk",
"label.refresh": "Segarkan",
"label.regenerate": "Regenerate",
"label.region": "Region",
"label.regions": "Regions",
"label.remove": "Remove",
"label.reports": "Reports",
"label.required": "Wajib",
"label.reset": "Atur ulang",
"label.reset-website": "Atur ulang statistik",
"label.retention": "Retention",
"label.role": "Role",
"label.run-query": "Run query",
"label.save": "Simpan",
@ -99,12 +132,15 @@
"label.settings": "Pengaturan",
"label.share-url": "Bagikan URL",
"label.single-day": "Sehari",
"label.sum": "Sum",
"label.tablet": "Tablet",
"label.team": "Team",
"label.team-guest": "Team guest",
"label.team-id": "Team ID",
"label.team-member": "Team member",
"label.team-name": "Team name",
"label.team-owner": "Team owner",
"label.team-websites": "Team websites",
"label.teams": "Teams",
"label.theme": "Tema",
"label.this-month": "Bulan ini",
@ -114,14 +150,21 @@
"label.title": "Title",
"label.today": "Hari ini",
"label.toggle-charts": "Buka grafik",
"label.total": "Total",
"label.total-records": "Total records",
"label.tracking-code": "Kode lacak",
"label.true": "True",
"label.type": "Type",
"label.unique": "Unique",
"label.unique-visitors": "Pengunjung unik",
"label.unknown": "Tidak diketahui",
"label.untitled": "Untitled",
"label.url": "URL",
"label.urls": "URLs",
"label.user": "User",
"label.username": "Nama pengguna",
"label.users": "Users",
"label.value": "Value",
"label.view": "View",
"label.view-details": "Lihat Detil",
"label.view-only": "View only",
@ -132,33 +175,6 @@
"label.websites": "Situs web",
"label.window": "Window",
"label.yesterday": "Yesterday",
"labels.after": "After",
"labels.average": "Average",
"labels.before": "Before",
"labels.breakdown": "Breakdown",
"labels.contains": "Contains",
"labels.create-report": "Create report",
"labels.description": "Description",
"labels.does-not-contain": "Does not contain",
"labels.does-not-equal": "Does not equal",
"labels.equals": "Equals",
"labels.false": "False",
"labels.filters": "Filters",
"labels.greater-than": "Greater than",
"labels.greater-than-equals": "Greater than or equals",
"labels.less-than": "Less than",
"labels.less-than-equals": "Less than or equals",
"labels.max": "Max",
"labels.min": "Min",
"labels.overview": "Overview",
"labels.sum": "Sum",
"labels.total": "Total",
"labels.total-records": "Total records",
"labels.true": "True",
"labels.type": "Type",
"labels.unique": "Unique",
"labels.untitled": "Untitled",
"labels.value": "Value",
"message.active-users": "{x} pengunjung saat ini",
"message.confirm-delete": "Apakah kamu yakin ingin menghapus {target}?",
"message.confirm-leave": "Are you sure you want to leave {target}?",
@ -172,11 +188,15 @@
"message.incorrect-username-password": "Nama pengguna/kata sandi salah.",
"message.invalid-domain": "Domain tidak valid",
"message.min-password-length": "Minimum length of {n} characters",
"message.new-version-available": "A new version of Umami {version} is available!",
"message.no-data-available": "Tidak ada data.",
"message.no-event-data": "No event data is available.",
"message.no-match-password": "Kata sandi tidak cocok",
"message.no-results-found": "No results were found.",
"message.no-team-websites": "This team does not have any websites.",
"message.no-teams": "You have not created any teams.",
"message.no-users": "There are no users.",
"message.no-websites-configured": "Anda tidak memiliki situs web yang dikonfigurasi.",
"message.page-not-found": "Halaman tidak ditemukan.",
"message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
"message.reset-website-warning": "Semua statistik pada website ini akan dihapus, tetapi kode lacak akan tetap terpasang",
@ -184,12 +204,8 @@
"message.share-url": "Ini adalah URL yang dibagikan secara publik untuk {target}.",
"message.team-already-member": "You are already a member of the team.",
"message.team-not-found": "Team not found.",
"message.team-websites-info": "Websites can be viewed by anyone on the team.",
"message.tracking-code": "Kode lacak",
"message.user-deleted": "User deleted.",
"message.visitor-log": "Pengunjung dari {country} dengan {browser} di {device} {os}",
"message.no-results-found": "No results were found.",
"message.no-team-websites": "This team does not have any websites.",
"message.no-websites-configured": "Anda tidak memiliki situs web yang dikonfigurasi.",
"message.team-websites-info": "Websites can be viewed by anyone on the team.",
"message.new-version-available": "A new version of Umami {version} is available!"
"message.visitor-log": "Pengunjung dari {country} dengan {browser} di {device} {os}"
}

Some files were not shown because too many files have changed in this diff Show More