diff --git a/components/common/Table.js b/components/common/Table.js index c169250d..d2c87977 100644 --- a/components/common/Table.js +++ b/components/common/Table.js @@ -1,6 +1,7 @@ import React from 'react'; import classNames from 'classnames'; import styles from './Table.module.css'; +import { FormattedMessage } from 'react-intl'; export default function Table({ columns, rows, empty }) { if (empty && rows.length === 0) { @@ -21,6 +22,11 @@ export default function Table({ columns, rows, empty }) { ))}
+ {rows.length === 0 && ( +
+ +
+ )} {rows.map((row, rowIndex) => (
{columns.map(({ key, render, className, style, cell }) => ( diff --git a/components/common/Table.module.css b/components/common/Table.module.css index 6a069c2e..ada9e195 100644 --- a/components/common/Table.module.css +++ b/components/common/Table.module.css @@ -19,8 +19,7 @@ flex-direction: column; } -.body:empty:before { - content: 'No data available'; +.empty { color: var(--gray500); position: absolute; top: 50%; diff --git a/components/metrics/BarChart.js b/components/metrics/BarChart.js index 9cc5b929..a3a3876f 100644 --- a/components/metrics/BarChart.js +++ b/components/metrics/BarChart.js @@ -151,7 +151,7 @@ export default function BarChart({ updateChart(); } } - }, [datasets, unit, animationDuration]); + }, [datasets, unit, animationDuration, locale]); return ( <> diff --git a/components/metrics/MetricsTable.js b/components/metrics/MetricsTable.js index 67188e9f..81374f86 100644 --- a/components/metrics/MetricsTable.js +++ b/components/metrics/MetricsTable.js @@ -87,6 +87,14 @@ export default function MetricsTable({
+ {data?.length === 0 && ( +
+ +
+ )} {limit ? rankings.map(row => getRow(row)) : data?.length > 0 && ( diff --git a/components/metrics/MetricsTable.module.css b/components/metrics/MetricsTable.module.css index 7e79c078..697c820a 100644 --- a/components/metrics/MetricsTable.module.css +++ b/components/metrics/MetricsTable.module.css @@ -95,8 +95,7 @@ overflow: hidden; } -.body:empty:before { - content: 'No data available'; +.empty { color: var(--gray500); position: absolute; top: 50%; diff --git a/components/metrics/PageviewsChart.js b/components/metrics/PageviewsChart.js index 2f38f5bf..9c112798 100644 --- a/components/metrics/PageviewsChart.js +++ b/components/metrics/PageviewsChart.js @@ -12,7 +12,15 @@ export default function PageviewsChart({ websiteId, data, unit, records, classNa } = chart; datasets[0].data = data.uniques; + datasets[0].label = intl.formatMessage({ + id: 'metrics.unique-visitors', + defaultMessage: 'Unique visitors', + }); datasets[1].data = data.pageviews; + datasets[1].label = intl.formatMessage({ + id: 'metrics.page-views', + defaultMessage: 'Page views', + }); chart.update(); }; diff --git a/lang/en.json b/lang/en.json index fd3a42fa..3084be8a 100644 --- a/lang/en.json +++ b/lang/en.json @@ -47,7 +47,7 @@ "header.nav.settings": { "defaultMessage": "Settings" }, - "label.adminsitrator": { + "label.administrator": { "defaultMessage": "Administrator" }, "label.confirm-password": { @@ -125,6 +125,9 @@ "message.incorrect-username-password": { "defaultMessage": "Incorrect username/password." }, + "message.no-data-available": { + "defaultMessage": "No data available." + }, "message.save-success": { "defaultMessage": "Saved successfully." }, diff --git a/lang/nl-NL.json b/lang/nl-NL.json new file mode 100644 index 00000000..e1b0e948 --- /dev/null +++ b/lang/nl-NL.json @@ -0,0 +1,236 @@ +{ + "active-users.message": { + "defaultMessage": "{x} actieve {x, plural, one {bezoeker} other {bezoekers}}" + }, + "button.add-account": { + "defaultMessage": "Account toevoegen" + }, + "button.add-website": { + "defaultMessage": "Website toevoegen" + }, + "button.back": { + "defaultMessage": "Terug" + }, + "button.cancel": { + "defaultMessage": "Annuleren" + }, + "button.change-password": { + "defaultMessage": "Wachtwoord wijzigen" + }, + "button.copy-to-clipboard": { + "defaultMessage": "Kopiëer naar klembord" + }, + "button.delete": { + "defaultMessage": "Verwijderen" + }, + "button.edit": { + "defaultMessage": "Bewerken" + }, + "button.login": { + "defaultMessage": "Inloggen" + }, + "button.more": { + "defaultMessage": "Toon meer" + }, + "button.save": { + "defaultMessage": "Opslaan" + }, + "button.view-details": { + "defaultMessage": "Meer details" + }, + "footer.powered-by": { + "defaultMessage": "mogelijk gemaakt door" + }, + "header.nav.dashboard": { + "defaultMessage": "Dashboard" + }, + "header.nav.settings": { + "defaultMessage": "Instellingen" + }, + "label.administrator": { + "defaultMessage": "Administrator" + }, + "label.confirm-password": { + "defaultMessage": "Wachtwoord bevestigen" + }, + "label.current-password": { + "defaultMessage": "Huidig wachtwoord" + }, + "label.domain": { + "defaultMessage": "Domein" + }, + "label.enable-share-url": { + "defaultMessage": "Sta delen via openbare URL toe" + }, + "label.invalid": { + "defaultMessage": "Ongeldig" + }, + "label.invalid-domain": { + "defaultMessage": "Ongeldig domein" + }, + "label.last-days": { + "defaultMessage": "Laatste {x} dagen" + }, + "label.last-hours": { + "defaultMessage": "Laatste {x} uur" + }, + "label.logged-in-as": { + "defaultMessage": "Ingelogd als {username}" + }, + "label.logout": { + "defaultMessage": "Uitloggen" + }, + "label.name": { + "defaultMessage": "Naam" + }, + "label.new-password": { + "defaultMessage": "Nieuw wachtwoord" + }, + "label.password": { + "defaultMessage": "Wachtwoord" + }, + "label.passwords-dont-match": { + "defaultMessage": "Wachtwoorden komen niet overeen" + }, + "label.required": { + "defaultMessage": "Verplicht" + }, + "label.this-month": { + "defaultMessage": "Deze maand" + }, + "label.this-week": { + "defaultMessage": "Deze week" + }, + "label.this-year": { + "defaultMessage": "Dit jaar" + }, + "label.today": { + "defaultMessage": "Vandaag" + }, + "label.username": { + "defaultMessage": "Gebruikersnaam" + }, + "message.confirm-delete": { + "defaultMessage": "Weet je zeker dat je {target} wilt verwijderen?" + }, + "message.copied": { + "defaultMessage": "Gekopiëerd!" + }, + "message.delete-warning": { + "defaultMessage": "Alle verwante gegezens zullen ook verwijderd worden." + }, + "message.failure": { + "defaultMessage": "Er is iets misgegaan." + }, + "message.incorrect-username-password": { + "defaultMessage": "Incorrecte gebruikersnaam/wachtwoord." + }, + "message.save-success": { + "defaultMessage": "Opslaan succesvol." + }, + "message.share-url": { + "defaultMessage": "Met deze URL kan {target} openbaar gedeeld worden." + }, + "message.track-stats": { + "defaultMessage": "Om statistieken voor {target} bij te houden, plaats je de volgende code in het {head} gedeelte van je website." + }, + "message.type-delete": { + "defaultMessage": "Type {delete} in onderstaande veld om dit te bevestigen." + }, + "metrics.actions": { + "defaultMessage": "Acties" + }, + "metrics.average-visit-time": { + "defaultMessage": "Gemiddelde bezoektijd" + }, + "metrics.bounce-rate": { + "defaultMessage": "Bouncepercentage" + }, + "metrics.browsers": { + "defaultMessage": "Browsers" + }, + "metrics.countries": { + "defaultMessage": "Landen" + }, + "metrics.devices": { + "defaultMessage": "Apparaten" + }, + "metrics.events": { + "defaultMessage": "Gebeurtenissen" + }, + "metrics.filter.combined": { + "defaultMessage": "Gecombineerd" + }, + "metrics.filter.domain-only": { + "defaultMessage": "Alleen domein" + }, + "metrics.filter.raw": { + "defaultMessage": "Ruw" + }, + "metrics.operating-system": { + "defaultMessage": "Besturingssystem" + }, + "metrics.page-views": { + "defaultMessage": "Paginaweergaven" + }, + "metrics.pages": { + "defaultMessage": "Pagina's" + }, + "metrics.referrers": { + "defaultMessage": "Verwijzers" + }, + "metrics.unique-visitors": { + "defaultMessage": "Unieke bezoekers" + }, + "metrics.views": { + "defaultMessage": "Weergaven" + }, + "metrics.visitors": { + "defaultMessage": "Bezoekers" + }, + "placeholder.message.go-to-settings": { + "defaultMessage": "Naar instellingen" + }, + "placeholder.message.no-websites-configured": { + "defaultMessage": "Je hebt geen websites ingesteld." + }, + "settings.accounts": { + "defaultMessage": "Accounts" + }, + "settings.profile": { + "defaultMessage": "Profiel" + }, + "settings.websites": { + "defaultMessage": "Websites" + }, + "title.add-account": { + "defaultMessage": "Account toevoegen" + }, + "title.add-website": { + "defaultMessage": "Website toevoegen" + }, + "title.delete-account": { + "defaultMessage": "Account verwijderen" + }, + "title.delete-website": { + "defaultMessage": "Website verwijderen" + }, + "title.edit-account": { + "defaultMessage": "Account bewerken" + }, + "title.edit-website": { + "defaultMessage": "Website bewerken" + }, + "title.share-url": { + "defaultMessage": "URL delen" + }, + "title.tracking-code": { + "defaultMessage": "Tracking code" + }, + "tooltip.get-share-url": { + "defaultMessage": "Openbare URL" + }, + "tooltip.get-tracking-code": { + "defaultMessage": "Tracking code" + } +} diff --git a/lang/zh-CN.json b/lang/zh-CN.json index 97726fe3..c5c4a271 100644 --- a/lang/zh-CN.json +++ b/lang/zh-CN.json @@ -47,7 +47,7 @@ "header.nav.settings": { "defaultMessage": "设置" }, - "label.adminsitrator": { + "label.administrator": { "defaultMessage": "管理员" }, "label.confirm-password": { diff --git a/lib/lang.js b/lib/lang.js index da4f98c9..63ea9745 100644 --- a/lib/lang.js +++ b/lib/lang.js @@ -1,20 +1,24 @@ import enMessages from 'lang-compiled/en.json'; +import nlMessages from 'lang-compiled/nl-NL.json'; import zhCNMessages from 'lang-compiled/zh-CN.json'; import { format } from 'date-fns'; -import { enUS, zhCN } from 'date-fns/locale'; +import { enUS, nl, zhCN } from 'date-fns/locale'; export const messages = { en: enMessages, + 'nl-NL': nlMessages, 'zh-CN': zhCNMessages, }; export const dateLocales = { en: enUS, + 'nl-NL': nl, 'zh-CN': zhCN, }; export const menuOptions = [ { label: 'English', value: 'en', display: 'EN' }, + { label: 'Nederlands', value: 'nl-NL', display: 'NL' }, { label: '中文 (Chinese Simplified)', value: 'zh-CN', display: '中文' }, ]; diff --git a/package.json b/package.json index bf0988be..59507fcf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "umami", - "version": "0.24.0", + "version": "0.25.0", "description": "A simple, fast, website analytics alternative to Google Analytics. ", "author": "Mike Cao ", "license": "MIT",