Skip to content

Commit

Permalink
Merge pull request umami-software#728 from mikecao/dev
Browse files Browse the repository at this point in the history
v1.19.0
  • Loading branch information
mikecao committed Jul 16, 2021
2 parents 0653570 + 25085cb commit a2fdab6
Show file tree
Hide file tree
Showing 28 changed files with 958 additions and 568 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
/build
/public/umami.js
/public/geo
/public/lang
/lang-compiled

# misc
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ A detailed getting started guide can be found at [https://umami.is/docs/](https:

### Requirements

- A server with Node.js 10.13 or newer
- A server with Node.js 12 or newer
- A database (MySQL or Postgresql)

### Get the source code and install packages
Expand Down
2 changes: 1 addition & 1 deletion components/common/Calendar.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ import styles from './Calendar.module.css';
import Icon from './Icon';

export default function Calendar({ date, minDate, maxDate, onChange }) {
const [locale] = useLocale();
const { locale } = useLocale();
const [selectMonth, setSelectMonth] = useState(false);
const [selectYear, setSelectYear] = useState(false);

Expand Down
4 changes: 2 additions & 2 deletions components/common/DateFilter.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ const filterOptions = [
];

function DateFilter({ value, startDate, endDate, onChange, className }) {
const [locale] = useLocale();
const { locale } = useLocale();
const [showPicker, setShowPicker] = useState(false);
const displayValue =
value === 'custom' ? (
Expand Down Expand Up @@ -102,7 +102,7 @@ function DateFilter({ value, startDate, endDate, onChange, className }) {
}

const CustomRange = ({ startDate, endDate, onClick }) => {
const [locale] = useLocale();
const { locale } = useLocale();

function handleClick(e) {
e.stopPropagation();
Expand Down
2 changes: 1 addition & 1 deletion components/common/RefreshButton.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import useLocale from 'hooks/useLocale';

function RefreshButton({ websiteId }) {
const dispatch = useDispatch();
const [locale] = useLocale();
const { locale } = useLocale();
const [dateRange] = useDateRange(websiteId);
const [loading, setLoading] = useState(false);
const completed = useSelector(state => state.queries[`/api/website/${websiteId}/stats`]);
Expand Down
2 changes: 1 addition & 1 deletion components/common/WorldMap.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ function WorldMap({ data, className }) {
}),
[theme],
);
const [locale] = useLocale();
const { locale } = useLocale();
const countryNames = useCountryNames(locale);

function getFillColor(code) {
Expand Down
2 changes: 1 addition & 1 deletion components/layout/Footer.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import { rtlLocales } from 'lib/lang';

export default function Footer() {
const { current } = useVersion();
const [locale] = useLocale();
const { locale } = useLocale();

return (
<footer className="container" dir={rtlLocales.includes(locale) ? 'rtl' : 'ltr'}>
Expand Down
2 changes: 1 addition & 1 deletion components/layout/Header.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import Bars from 'assets/bars.svg';
export default function Header() {
const user = useSelector(state => state.user);
const [active, setActive] = useState(false);
const [locale] = useLocale();
const { locale } = useLocale();

function handleClick() {
setActive(state => !state);
Expand Down
2 changes: 1 addition & 1 deletion components/layout/Layout.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import useLocale from 'hooks/useLocale';
import { rtlLocales } from 'lib/lang';

export default function Layout({ title, children, header = true, footer = true }) {
const [locale] = useLocale();
const { locale } = useLocale();
const dir = rtlLocales.includes(locale) ? 'rtl' : 'ltr';

return (
Expand Down
2 changes: 1 addition & 1 deletion components/metrics/BarChart.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ export default function BarChart({
const canvas = useRef();
const chart = useRef();
const [tooltip, setTooltip] = useState(null);
const [locale] = useLocale();
const { locale } = useLocale();
const [theme] = useTheme();
const forceUpdate = useForceUpdate();

Expand Down
2 changes: 1 addition & 1 deletion components/metrics/CountriesTable.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import useCountryNames from 'hooks/useCountryNames';
import useLocale from 'hooks/useLocale';

export default function CountriesTable({ websiteId, onDataLoad, ...props }) {
const [locale] = useLocale();
const { locale } = useLocale();
const countryNames = useCountryNames(locale);

function renderLabel({ x }) {
Expand Down
2 changes: 1 addition & 1 deletion components/metrics/Legend.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import styles from './Legend.module.css';
import useForceUpdate from '../../hooks/useForceUpdate';

export default function Legend({ chart }) {
const [locale] = useLocale();
const { locale } = useLocale();
const forceUpdate = useForceUpdate();

function handleClick(index) {
Expand Down
2 changes: 1 addition & 1 deletion components/metrics/RealtimeLog.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ const TYPE_ICONS = {

export default function RealtimeLog({ data, websites, websiteId }) {
const intl = useIntl();
const [locale] = useLocale();
const { locale } = useLocale();
const countryNames = useCountryNames(locale);
const [filter, setFilter] = useState(TYPE_ALL);

Expand Down
2 changes: 1 addition & 1 deletion components/pages/RealtimeDashboard.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ function filterWebsite(data, id) {
}

export default function RealtimeDashboard() {
const [locale] = useLocale();
const { locale } = useLocale();
const countryNames = useCountryNames(locale);
const [data, setData] = useState();
const [websiteId, setWebsiteId] = useState(0);
Expand Down
2 changes: 1 addition & 1 deletion components/settings/DateRangeSetting.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import styles from './DateRangeSetting.module.css';
import useLocale from 'hooks/useLocale';

export default function DateRangeSetting() {
const [locale] = useLocale();
const { locale } = useLocale();
const [dateRange, setDateRange] = useDateRange();
const { startDate, endDate, value } = dateRange;

Expand Down
7 changes: 4 additions & 3 deletions components/settings/LanguageButton.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
import React from 'react';
import { menuOptions } from 'lib/lang';
import { languages } from 'lib/lang';
import useLocale from 'hooks/useLocale';
import MenuButton from 'components/common/MenuButton';
import Globe from 'assets/globe.svg';
import styles from './LanguageButton.module.css';

export default function LanguageButton() {
const [locale, setLocale] = useLocale();
const { locale, saveLocale } = useLocale();
const menuOptions = Object.keys(languages).map(key => ({ ...languages[key], value: key }));

function handleSelect(value) {
setLocale(value);
saveLocale(value);
}

switch (locale) {
Expand Down
2 changes: 2 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ services:
HASH_SALT: replace-me-with-a-random-string
depends_on:
- db
restart: always
db:
image: postgres:12-alpine
environment:
Expand All @@ -20,5 +21,6 @@ services:
volumes:
- ./sql/schema.postgresql.sql:/docker-entrypoint-initdb.d/schema.postgresql.sql:ro
- umami-db-data:/var/lib/postgresql/data
restart: always
volumes:
umami-db-data:
2 changes: 1 addition & 1 deletion hooks/useDateRange.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import useLocale from './useLocale';

export default function useDateRange(websiteId, defaultDateRange = DEFAULT_DATE_RANGE) {
const dispatch = useDispatch();
const [locale] = useLocale();
const { locale } = useLocale();
const dateRange = useSelector(state => state.websites[websiteId]?.dateRange);
const forceUpdate = useForceUpdate();

Expand Down
41 changes: 37 additions & 4 deletions hooks/useLocale.js
Original file line number Diff line number Diff line change
@@ -1,16 +1,49 @@
import { useEffect } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { setLocale } from 'redux/actions/app';
import { setItem } from 'lib/web';
import { useRouter } from 'next/router';
import { get, setItem } from 'lib/web';
import { LOCALE_CONFIG } from 'lib/constants';
import useForceUpdate from 'hooks/useForceUpdate';
import enUS from 'public/lang/en-US.json';

const messages = {
'en-US': enUS,
};

export default function useLocale() {
const locale = useSelector(state => state.app.locale);
const dispatch = useDispatch();
const { basePath } = useRouter();
const forceUpdate = useForceUpdate();

async function loadMessages(locale) {
const { ok, data } = await get(`${basePath}/lang/${locale}.json`);

if (ok) {
messages[locale] = data;
}
}

async function saveLocale(value) {
if (!messages[value]) {
await loadMessages(value);
}

function saveLocale(value) {
setItem(LOCALE_CONFIG, value);
dispatch(setLocale(value));

if (locale !== value) {
dispatch(setLocale(value));
} else {
forceUpdate();
}
}

return [locale, saveLocale];
useEffect(() => {
if (!messages[locale]) {
saveLocale(locale);
}
}, [locale]);

return { locale, saveLocale, messages };
}
100 changes: 100 additions & 0 deletions lang/hu-HU.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
{
"label.accounts": "Fiókok",
"label.add-account": "Fiók hozzáadása",
"label.add-website": "Weboldal hozzáadása",
"label.administrator": "Adminisztrátor",
"label.all": "Összes",
"label.all-websites": "Összes weboldal",
"label.all-events": "Összes esemény",
"label.back": "Vissza",
"label.cancel": "Mégsem",
"label.change-password": "Jelszó módosítása",
"label.confirm-password": "Jelszó megerősítése",
"label.copy-to-clipboard": "Vágólapra másolás",
"label.current-password": "Jelenlegi jelszó",
"label.custom-range": "Egyedi tartomány",
"label.dashboard": "Áttekintés",
"label.date-range": "Időintervallum",
"label.default-date-range": "Alapértelmezett időintervallum",
"label.delete": "Eltávolítás",
"label.delete-account": "Fiók eltávolítása",
"label.delete-website": "Weboldal eltávolítása",
"label.dismiss": "Mellőzés",
"label.domain": "Domain",
"label.edit": "Módosítás",
"label.edit-account": "Fiók módosítása",
"label.edit-website": "Weboldal módosítása",
"label.enable-share-url": "URL-megosztás engedélyezése",
"label.invalid": "Érvénytelen",
"label.invalid-domain": "Érvénytelen domain",
"label.last-days": "Legutóbbi {x} nap",
"label.last-hours": "Legutóbbi {x} óra",
"label.logged-in-as": "Bejelentkezve, mint {username}",
"label.login": "Bejelentkezés",
"label.logout": "Kijelentkezés",
"label.more": "Bővebben",
"label.name": "Név",
"label.new-password": "Új jelszó",
"label.password": "Jelszó",
"label.passwords-dont-match": "A jelszavak nem egyeznek",
"label.profile": "Profil",
"label.realtime": "Valós idejű",
"label.realtime-logs": "Valós idejű napló",
"label.refresh": "Frissítés",
"label.required": "Kötelező",
"label.reset": "Visszaállítás",
"label.save": "Mentés",
"label.settings": "Beállítások",
"label.share-url": "URL megosztása",
"label.single-day": "Egy nap",
"label.this-month": "Ezen hónap",
"label.this-week": "Ezen hét",
"label.this-year": "Ezen év",
"label.timezone": "Időzóna",
"label.today": "Ma",
"label.tracking-code": "Követési kód",
"label.unknown": "Ismeretlen",
"label.username": "Felhasználónév",
"label.view-details": "Részletek",
"label.websites": "Weboldalak",
"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.copied": "Kimásolva!",
"message.delete-warning": "Minden társított adat törlésre kerül.",
"message.failure": "Valami baj történt.",
"message.get-share-url": "Megosztási URL kimásolása",
"message.get-tracking-code": "Követési kód kimásolása",
"message.go-to-settings": "Tovább a beállításokhoz",
"message.incorrect-username-password": "Érvénytelen felhasználónév/jelszó.",
"message.log.visitor": "Látógató {country} területéről, {os} {device} eszközön, {browser} böngészőből.",
"message.new-version-available": "Elérhető az umami {version} új verziója!",
"message.no-data-available": "Nincs rendelkezésre álló adat.",
"message.no-websites-configured": "Még nem állítottál be egyetlen weboldalt sem.",
"message.page-not-found": "Oldal nem található.",
"message.powered-by": "Működteti az {name}",
"message.save-success": "Sikeres mentés.",
"message.share-url": "{target} nyilvánosan megosztott URL címe.",
"message.track-stats": "{target} statisztikáinak nyomon követéséhez, helyezd el az alábbi kódot a weboldalad {head} részébe.",
"message.type-delete": "Megerősítéshez írd be az alábbi mezőbe azt, hogy {delete}.",
"metrics.actions": "Műveletek",
"metrics.average-visit-time": "Átlagos látogatási idő",
"metrics.bounce-rate": "Visszafordulási arány",
"metrics.browsers": "Böngészők",
"metrics.countries": "Országok",
"metrics.device.desktop": "Asztali számítógép",
"metrics.device.laptop": "Laptop",
"metrics.device.mobile": "Telefon",
"metrics.device.tablet": "Táblagép",
"metrics.devices": "Eszközök",
"metrics.events": "Események",
"metrics.filter.combined": "Összevont",
"metrics.filter.domain-only": "Csak domain",
"metrics.filter.raw": "Nyers",
"metrics.operating-systems": "Operációs rendszerek",
"metrics.page-views": "Oldalmegtekintések",
"metrics.pages": "Oldalak",
"metrics.referrers": "Hivatkozók",
"metrics.unique-visitors": "Egyedi látogatók",
"metrics.views": "Megtekintések",
"metrics.visitors": "Látogatók"
}
30 changes: 15 additions & 15 deletions lang/zh-TW.json
Original file line number Diff line number Diff line change
Expand Up @@ -57,29 +57,29 @@
"label.view-details": "查看更多",
"label.websites": "網站",
"message.active-users": "当前線上 {x} 人",
"message.confirm-delete": "你確定要删除{target}嗎?",
"message.copied": "複製成功!",
"message.delete-warning": "所有相關數據將會被删除.",
"message.failure": "出現錯誤.",
"message.confirm-delete": "你確定要删除 {target} 嗎?",
"message.copied": "複製成功",
"message.delete-warning": "所有相關數據將會被删除",
"message.failure": "出現錯誤",
"message.get-share-url": "獲得分享連結",
"message.get-tracking-code": "獲得追蹤代碼",
"message.go-to-settings": "去設定",
"message.incorrect-username-password": "用户名或密碼不正確.",
"message.log.visitor": "自 {country} 的訪客在搭載 {os} 的 {device} 上使用 {browser} 進行訪問.",
"message.incorrect-username-password": "用户名或密碼不正確",
"message.log.visitor": "自 {country} 的訪客在搭載 {os} 的 {device} 上使用 {browser} 進行訪問",
"message.new-version-available": "umami 有新版本 {version} 發佈啦!",
"message.no-data-available": "無可用數據.",
"message.no-websites-configured": "目前無任何網站設定.",
"message.page-not-found": "網頁未找到.",
"message.no-data-available": "無可用數據",
"message.no-websites-configured": "目前無任何網站設定",
"message.page-not-found": "網頁未找到",
"message.powered-by": "運行 {name}",
"message.save-success": "成功保存.",
"message.share-url": "這是 {target} 的分享連結.",
"message.track-stats": "將以下代碼放入被設定網站的{head}部分来收集{target}的資料.",
"message.type-delete": "在下方空格輸入{delete}確認",
"message.save-success": "成功保存",
"message.share-url": "這是 {target} 的分享連結",
"message.track-stats": "將以下代碼放入被設定網站的 {head} 部分来收集 {target} 的資料",
"message.type-delete": "在下方空格輸入 {delete} 確認",
"metrics.actions": "用戶行為",
"metrics.average-visit-time": "平均訪問時間",
"metrics.bounce-rate": "跳出率",
"metrics.browsers": "瀏覽器",
"metrics.countries": "國家",
"metrics.countries": "國家/地區",
"metrics.device.desktop": "桌機",
"metrics.device.laptop": "筆記本",
"metrics.device.mobile": "手機",
Expand All @@ -94,6 +94,6 @@
"metrics.pages": "網頁",
"metrics.referrers": "指入域名",
"metrics.unique-visitors": "獨立訪客",
"metrics.views": "页面流量",
"metrics.views": "頁面流量",
"metrics.visitors": "獨立訪客"
}
Loading

0 comments on commit a2fdab6

Please sign in to comment.