Merge remote-tracking branch 'upstream/master'

This commit is contained in:
vaunblu 2024-10-22 09:48:09 -07:00
commit 4641efb350
564 changed files with 7301 additions and 3437 deletions

View file

@ -19,22 +19,21 @@
"plugin:@typescript-eslint/recommended",
"next"
],
"plugins": ["@typescript-eslint", "prettier"],
"settings": {
"import/resolver": {
"alias": {
"map": [
["assets", "./assets"],
["components", "./components"],
["assets", "./src/assets"],
["components", "./src/components"],
["db", "./db"],
["hooks", "./hooks"],
["lang", "./lang"],
["lib", "./lib"],
["hooks", "./src/components/hooks"],
["lang", "./src/lang"],
["lib", "./src/lib"],
["public", "./public"],
["queries", "./queries"],
["store", "./store"],
["styles", "./styles"]
["queries", "./src/queries"],
["store", "./src/store"],
["styles", "./src/styles"]
],
"extensions": [".ts", ".tsx", ".js", ".jsx", ".json"]
}
@ -51,7 +50,8 @@
"@typescript-eslint/no-empty-function": "off",
"@typescript-eslint/no-explicit-any": "off",
"@typescript-eslint/no-var-requires": "off",
"@typescript-eslint/no-empty-interface": "off"
"@typescript-eslint/no-empty-interface": "off",
"@typescript-eslint/no-unused-vars": ["error", { "ignoreRestSiblings": true }]
},
"globals": {
"React": "writable"

4
.gitignore vendored
View file

@ -34,9 +34,7 @@ yarn-error.log*
# local env files
.env
.env.development.local
.env.test.local
.env.production.local
.env.*
*.dev.yml

View file

@ -12,8 +12,8 @@ RUN yarn install --frozen-lockfile
FROM node:18-alpine AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY docker/middleware.js .
COPY . .
COPY docker/middleware.js ./src
ARG DATABASE_TYPE
ARG BASE_PATH
@ -53,6 +53,7 @@ USER nextjs
EXPOSE 3000
ENV HOSTNAME 0.0.0.0
ENV PORT 3000
CMD ["yarn", "start-docker"]

View file

@ -10,7 +10,7 @@ A detailed getting started guide can be found at [https://umami.is/docs/](https:
### Requirements
- A server with Node.js version 12 or newer
- A server with Node.js version 16.13 or newer
- A database. Umami supports [MySQL](https://www.mysql.com/) and [Postgresql](https://www.postgresql.org/) databases.
### Install Yarn

View file

@ -1,23 +0,0 @@
import useDateRange from 'hooks/useDateRange';
import DateFilter from './DateFilter';
import styles from './WebsiteDateFilter.module.css';
export default function WebsiteDateFilter({ websiteId }) {
const [dateRange, setDateRange] = useDateRange(websiteId);
const { value, startDate, endDate } = dateRange;
const handleChange = async value => {
setDateRange(value);
};
return (
<DateFilter
className={styles.dropdown}
value={value}
startDate={startDate}
endDate={endDate}
onChange={handleChange}
showAllTime={true}
/>
);
}

View file

@ -1,3 +0,0 @@
.dropdown {
min-width: 200px;
}

View file

@ -1,32 +0,0 @@
import MetricsTable from './MetricsTable';
import { emptyFilter } from 'lib/filters';
import FilterLink from 'components/common/FilterLink';
import useLocale from 'hooks/useLocale';
import useMessages from 'hooks/useMessages';
export function CitiesTable({ websiteId, ...props }) {
const { locale } = useLocale();
const { formatMessage, labels } = useMessages();
function renderLink({ x }) {
return (
<div className={locale}>
<FilterLink id="city" value={x} />
</div>
);
}
return (
<MetricsTable
{...props}
title={formatMessage(labels.cities)}
type="city"
metric={formatMessage(labels.visitors)}
websiteId={websiteId}
dataFilter={emptyFilter}
renderLabel={renderLink}
/>
);
}
export default CitiesTable;

View file

@ -1,26 +0,0 @@
import { Loading } from 'react-basics';
import useApi from 'hooks/useApi';
import WebsitesTable from 'components/pages/settings/websites/WebsitesTable';
import useMessages from 'hooks/useMessages';
export function UserWebsites({ userId }) {
const { formatMessage, messages } = useMessages();
const { get, useQuery } = useApi();
const { data, isLoading } = useQuery(['user:websites', userId], () =>
get(`/users/${userId}/websites`),
);
const hasData = data && data.length !== 0;
if (isLoading) {
return <Loading icon="dots" style={{ minHeight: 300 }} />;
}
return (
<div>
{hasData && <WebsitesTable data={data} />}
{!hasData && formatMessage(messages.noDataAvailable)}
</div>
);
}
export default UserWebsites;

View file

@ -1,24 +0,0 @@
import { TextArea } from 'react-basics';
import useMessages from 'hooks/useMessages';
import useConfig from 'hooks/useConfig';
export function TrackingCode({ websiteId }) {
const { formatMessage, messages } = useMessages();
const { basePath, trackerScriptName } = useConfig();
const url = trackerScriptName?.startsWith('http')
? trackerScriptName
: `${location.origin}${basePath}/${
trackerScriptName?.split(',')?.map(n => n.trim())?.[0] || 'script.js'
}`;
const code = `<script async src="${url}" data-website-id="${websiteId}"></script>`;
return (
<>
<p>{formatMessage(messages.trackingCode)}</p>
<TextArea rows={4} value={code} readOnly allowCopy />
</>
);
}
export default TrackingCode;

View file

@ -66,7 +66,7 @@ CREATE TABLE umami.website_event_queue (
)
ENGINE = Kafka
SETTINGS kafka_broker_list = 'domain:9092,domain:9093,domain:9094', -- input broker list
kafka_topic_list = 'events',
kafka_topic_list = 'event',
kafka_group_name = 'event_consumer_group',
kafka_format = 'JSONEachRow',
kafka_max_block_size = 1048576,

View file

@ -1,30 +0,0 @@
import { useEffect } from 'react';
import { useRouter } from 'next/router';
import useApi from 'hooks/useApi';
import useUser from 'hooks/useUser';
export function useRequireLogin() {
const router = useRouter();
const { get } = useApi();
const { user, setUser } = useUser();
useEffect(() => {
async function loadUser() {
try {
const { user } = await get('/auth/verify');
setUser(user);
} catch {
await router.push('/login');
}
}
if (!user) {
loadUser();
}
}, [user]);
return { user };
}
export default useRequireLogin;

View file

@ -1,5 +1,5 @@
{
"compilerOptions": {
"baseUrl": "."
"baseUrl": "./src"
}
}

View file

@ -1,211 +0,0 @@
{
"label.access-code": "Access code",
"label.actions": "アクション",
"label.activity-log": "Activity log",
"label.add": "Add",
"label.add-description": "Add description",
"label.add-website": "Webサイトの追加",
"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",
"label.current-password": "現在のパスワード",
"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": "Webサイトの削除",
"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": "編集",
"label.edit-dashboard": "Edit dashboard",
"label.enable-share-url": "共有リンクを有効にする",
"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",
"label.languages": "Languages",
"label.laptop": "ートPC",
"label.last-days": "過去{x}日間",
"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.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} で実行されています。",
"label.profile": "プロファイル",
"label.queries": "Queries",
"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": "保存",
"label.screens": "Screens",
"label.select-date": "Select date",
"label.select-website": "Select website",
"label.sessions": "Sessions",
"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": "今月",
"label.this-week": "今週",
"label.this-year": "今年",
"label.timezone": "タイムゾーン",
"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",
"label.views": "閲覧数",
"label.visitors": "訪問者数",
"label.website": "Website",
"label.website-id": "Website ID",
"label.websites": "Webサイト",
"label.window": "Window",
"label.yesterday": "Yesterday",
"message.active-users": "{x}人が閲覧中です。",
"message.confirm-delete": "{target}を削除してもよろしいですか?",
"message.confirm-leave": "Are you sure you want to leave {target}?",
"message.confirm-reset": "Are your sure you want to reset {target}'s statistics?",
"message.delete-account": "To delete this account, type {confirmation} in the box below to confirm.",
"message.delete-website": "To delete this website, type {confirmation} in the box below to confirm.",
"message.delete-website-warning": "関連するすべてのデータも削除されます。",
"message.error": "問題が発生しました。",
"message.event-log": "{event} on {url}",
"message.go-to-settings": "設定する",
"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": "Webサイトが設定されていません。",
"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.",
"message.saved": "正常に保存されました。",
"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": "{os}{device})で{browser}を使用している{country}からの訪問者"
}

View file

@ -1,211 +0,0 @@
{
"label.access-code": "Access code",
"label.actions": "Dejanja",
"label.activity-log": "Activity log",
"label.add": "Add",
"label.add-description": "Add description",
"label.add-website": "Dodaj spletno mesto",
"label.admin": "Administrator",
"label.after": "After",
"label.all": "Vse",
"label.all-time": "All time",
"label.analytics": "Analytics",
"label.average": "Average",
"label.average-visit-time": "Povprečni čas obiska",
"label.back": "Nazaj",
"label.before": "Before",
"label.bounce-rate": "Zapustna stopnja",
"label.breakdown": "Breakdown",
"label.browser": "Browser",
"label.browsers": "Brskalniki",
"label.cancel": "Prekliči",
"label.change-password": "Zamenjaj geslo",
"label.cities": "Cities",
"label.city": "City",
"label.clear-all": "Clear all",
"label.confirm": "Confirm",
"label.confirm-password": "Potrditev gesla",
"label.contains": "Contains",
"label.continue": "Continue",
"label.countries": "Države",
"label.country": "Country",
"label.create-report": "Create report",
"label.create-team": "Create team",
"label.create-user": "Create user",
"label.created": "Created",
"label.current-password": "Trenutno geslo",
"label.custom-range": "Razpon po meri",
"label.dashboard": "Nadzorna plošča",
"label.data": "Data",
"label.date": "Date",
"label.date-range": "Časovni razpon",
"label.day": "Day",
"label.default-date-range": "Privzeti časovni razpon",
"label.delete": "Izbriši",
"label.delete-team": "Delete team",
"label.delete-user": "Delete user",
"label.delete-website": "Izbriši spletno mesto",
"label.description": "Description",
"label.desktop": "Namizni računalnik",
"label.details": "Details",
"label.device": "Device",
"label.devices": "Naprave",
"label.dismiss": "Opusti",
"label.does-not-contain": "Does not contain",
"label.domain": "Domena",
"label.dropoff": "Dropoff",
"label.edit": "Uredi",
"label.edit-dashboard": "Edit dashboard",
"label.enable-share-url": "Omogoči URL za skupno rabo",
"label.event": "Event",
"label.event-data": "Event data",
"label.events": "Dogodki",
"label.false": "False",
"label.field": "Field",
"label.fields": "Fields",
"label.filter-combined": "Skupno",
"label.filter-raw": "Neobdelane meritve",
"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",
"label.languages": "Languages",
"label.laptop": "Prenosni računalnik",
"label.last-days": "Zadnjih {x} dni",
"label.last-hours": "Zadnjih {x} ur",
"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": "Mobilni telefon",
"label.more": "Več",
"label.my-websites": "My websites",
"label.name": "Ime",
"label.new-password": "Novo geslo",
"label.none": "None",
"label.os": "OS",
"label.overview": "Overview",
"label.owner": "Owner",
"label.page-of": "Page {current} of {total}",
"label.page-views": "Ogledi strani",
"label.pageTitle": "Page title",
"label.pages": "Strani",
"label.password": "Geslo",
"label.powered-by": "Zagotavlja {name}",
"label.profile": "Profil",
"label.queries": "Queries",
"label.query": "Query",
"label.query-parameters": "Query parameters",
"label.realtime": "V realnem času",
"label.referrer": "Referrer",
"label.referrers": "Viri",
"label.refresh": "Osveži",
"label.regenerate": "Regenerate",
"label.region": "Region",
"label.regions": "Regions",
"label.remove": "Remove",
"label.reports": "Reports",
"label.required": "Zahtevano",
"label.reset": "Ponastavi",
"label.reset-website": "Reset statistics",
"label.retention": "Retention",
"label.role": "Role",
"label.run-query": "Run query",
"label.save": "Shrani",
"label.screens": "Screens",
"label.select-date": "Select date",
"label.select-website": "Select website",
"label.sessions": "Sessions",
"label.settings": "Nastavitve",
"label.share-url": "Deli URL",
"label.single-day": "En dan",
"label.sum": "Sum",
"label.tablet": "Tablični računalnik",
"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": "Ta mesec",
"label.this-week": "Ta teden",
"label.this-year": "Letos",
"label.timezone": "Časovni pas",
"label.title": "Title",
"label.today": "Danes",
"label.toggle-charts": "Toggle charts",
"label.total": "Total",
"label.total-records": "Total records",
"label.tracking-code": "Koda za sledenje",
"label.true": "True",
"label.type": "Type",
"label.unique": "Unique",
"label.unique-visitors": "Unikatni obiskovalci",
"label.unknown": "Neznano",
"label.untitled": "Untitled",
"label.url": "URL",
"label.urls": "URLs",
"label.user": "User",
"label.username": "Uporabniško ime",
"label.users": "Users",
"label.value": "Value",
"label.view": "View",
"label.view-details": "Prikaži podrobnosti",
"label.view-only": "View only",
"label.views": "Ogledi",
"label.visitors": "Obiskovalci",
"label.website": "Website",
"label.website-id": "Website ID",
"label.websites": "Spletna mesta",
"label.window": "Window",
"label.yesterday": "Yesterday",
"message.active-users": "{x} trenutni {x, plural, one {obiskovalec} other {obiskovalcev}}",
"message.confirm-delete": "Ste prepričani, da želite izbrisati {target}?",
"message.confirm-leave": "Are you sure you want to leave {target}?",
"message.confirm-reset": "Are your sure you want to reset {target}'s statistics?",
"message.delete-account": "To delete this account, type {confirmation} in the box below to confirm.",
"message.delete-website": "To delete this website, type {confirmation} in the box below to confirm.",
"message.delete-website-warning": "Izbrisani bodo tudi vsi povezani podatki.",
"message.error": "Prišlo je do napake.",
"message.event-log": "{event} on {url}",
"message.go-to-settings": "Pojdi v nastavitve",
"message.incorrect-username-password": "Nepravilno uporabniško ime/geslo",
"message.invalid-domain": "Neveljavna domena",
"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": "Podatki niso na voljo.",
"message.no-event-data": "No event data is available.",
"message.no-match-password": "Gesli se ne ujemata",
"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": "Ni nastavljenih spletnih mest.",
"message.page-not-found": "Stran ni bila najdena.",
"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.",
"message.saved": "Uspešno shranjeno.",
"message.share-url": "To je javno dostopen naslov URL 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": "Koda za sledenje",
"message.user-deleted": "User deleted.",
"message.visitor-log": "Obiskovalec iz {country} uporablja {browser} na {os} {device}"
}

View file

@ -1,211 +0,0 @@
{
"label.access-code": "Access code",
"label.actions": "用戶行為",
"label.activity-log": "Activity log",
"label.add": "Add",
"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",
"label.current-password": "目前密碼",
"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": "編輯",
"label.edit-dashboard": "編輯管理面板",
"label.enable-share-url": "啟用分享連結",
"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": "語言",
"label.languages": "語言",
"label.laptop": "筆記本",
"label.last-days": "最近 {x} 天",
"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.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}",
"label.profile": "個人資料",
"label.queries": "Queries",
"label.query": "Query",
"label.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": "保存",
"label.screens": "屏幕尺寸",
"label.select-date": "Select date",
"label.select-website": "Select website",
"label.sessions": "Sessions",
"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": "本月",
"label.this-week": "本週",
"label.this-year": "今年",
"label.timezone": "時區",
"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",
"label.views": "頁面流量",
"label.visitors": "獨立訪客",
"label.website": "Website",
"label.website-id": "Website ID",
"label.websites": "網站",
"label.window": "Window",
"label.yesterday": "Yesterday",
"message.active-users": "當前線上 {x} 人",
"message.confirm-delete": "你確定要刪除 {target} 嗎?",
"message.confirm-leave": "Are you sure you want to leave {target}?",
"message.confirm-reset": "您確定要重置 {target} 的數據嗎?",
"message.delete-account": "To delete this account, type {confirmation} in the box below to confirm.",
"message.delete-website": "To delete this website, type {confirmation} in the box below to confirm.",
"message.delete-website-warning": "所有相關數據將會被刪除。",
"message.error": "出現錯誤。",
"message.event-log": "{event} on {url}",
"message.go-to-settings": "去設定",
"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": "本網站的所有統計數據將被刪除,但您的跟蹤代碼將保持不變。",
"message.saved": "成功保存。",
"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}上使用 {browser} 進行訪問。"
}

View file

@ -1,5 +1,6 @@
/* eslint-disable @typescript-eslint/no-var-requires */
require('dotenv').config();
const path = require('path');
const pkg = require('./package.json');
const contentSecurityPolicy = `
@ -58,7 +59,9 @@ if (process.env.TRACKER_SCRIPT_NAME) {
const redirects = [
{
source: '/settings',
destination: process.env.CLOUD_MODE ? '/settings/profile' : '/settings/websites',
destination: process.env.CLOUD_MODE
? `${process.env.CLOUD_URL}/settings/websites`
: '/settings/websites',
permanent: true,
},
];
@ -73,6 +76,9 @@ if (process.env.CLOUD_MODE && process.env.CLOUD_URL && process.env.DISABLE_LOGIN
const config = {
env: {
cloudMode: process.env.CLOUD_MODE,
cloudUrl: process.env.CLOUD_URL,
configUrl: '/config',
currentVersion: pkg.version,
defaultLocale: process.env.DEFAULT_LOCALE,
isProduction: process.env.NODE_ENV === 'production',
@ -92,6 +98,8 @@ const config = {
use: ['@svgr/webpack'],
});
config.resolve.alias['public'] = path.resolve('./public');
return config;
},
async headers() {

23
package.components.json Normal file
View file

@ -0,0 +1,23 @@
{
"name": "@umami/components",
"version": "0.1.0",
"description": "Umami React components.",
"author": "Mike Cao <mike@mikecao.com>",
"license": "MIT",
"type": "module",
"main": "./index.js",
"types": "./index.d.ts",
"peerDependencies": {
"@tanstack/react-query": "^4.33.0",
"classnames": "^2.3.1",
"colord": "^2.9.2",
"immer": "^9.0.12",
"moment-timezone": "^0.5.35",
"next": "^13.4.0",
"next-basics": "^0.36.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-intl": "^5.24.7",
"zustand": "^4.3.8"
}
}

View file

@ -1,6 +1,6 @@
{
"name": "umami",
"version": "2.5.0",
"version": "2.7.0",
"description": "A simple, fast, privacy-focused alternative to Google Analytics.",
"author": "Mike Cao <mike@mikecao.com>",
"license": "MIT",
@ -18,9 +18,10 @@
"start-env": "node scripts/start-env.js",
"start-server": "node server.js",
"build-app": "next build",
"build-tracker": "rollup -c rollup.tracker.config.js",
"build-components": "rollup -c rollup.components.config.mjs",
"build-tracker": "rollup -c rollup.tracker.config.mjs",
"build-db": "npm-run-all copy-db-files build-db-client",
"build-lang": "npm-run-all format-lang compile-lang download-country-names download-language-names",
"build-lang": "npm-run-all format-lang compile-lang clean-lang download-country-names download-language-names",
"build-geo": "node scripts/build-geo.js",
"build-db-schema": "prisma db pull",
"build-db-client": "prisma generate",
@ -29,11 +30,12 @@
"check-db": "node scripts/check-db.js",
"check-env": "node scripts/check-env.js",
"copy-db-files": "node scripts/copy-db-files.js",
"extract-messages": "formatjs extract \"{pages,components}/**/*.js\" --out-file build/messages.json",
"extract-messages": "formatjs extract \"src/{pages,components}/**/*.js\" --out-file build/messages.json",
"merge-messages": "node scripts/merge-messages.js",
"generate-lang": "npm-run-all extract-messages merge-messages",
"format-lang": "node scripts/format-lang.js",
"compile-lang": "formatjs compile-folder --ast build/messages public/intl/messages",
"clean-lang": "prettier --write ./public/intl/messages/*.json",
"check-lang": "node scripts/check-lang.js",
"download-country-names": "node scripts/download-country-names.js",
"download-language-names": "node scripts/download-language-names.js",
@ -60,12 +62,12 @@
],
"dependencies": {
"@fontsource/inter": "^4.5.15",
"@prisma/client": "5.0.0",
"@prisma/client": "5.3.1",
"@tanstack/react-query": "^4.33.0",
"@umami/prisma-client": "^0.2.0",
"@umami/redis-client": "^0.5.0",
"chalk": "^4.1.2",
"chart.js": "^4.3.3",
"@umami/redis-client": "^0.15.0",
"chalk": "^4.1.1",
"chart.js": "^4.2.1",
"chartjs-adapter-date-fns": "^3.0.0",
"classnames": "^2.3.2",
"clickhouse": "^2.6.0",
@ -85,17 +87,17 @@
"is-ci": "^3.0.1",
"is-docker": "^3.0.0",
"is-localhost-ip": "^1.4.0",
"isbot": "^3.6.13",
"kafkajs": "^2.2.4",
"maxmind": "^4.3.11",
"moment-timezone": "^0.5.43",
"next": "13.3.1",
"isbot": "^3.4.5",
"kafkajs": "^2.1.0",
"maxmind": "^4.3.6",
"moment-timezone": "^0.5.35",
"next": "13.5.2",
"next-basics": "^0.36.0",
"node-fetch": "^3.3.2",
"npm-run-all": "^4.1.5",
"react": "^18.2.0",
"react-basics": "^0.98.0",
"react-beautiful-dnd": "^13.1.1",
"react-basics": "^0.100.0",
"react-beautiful-dnd": "^13.1.0",
"react-dom": "^18.2.0",
"react-error-boundary": "^4.0.11",
"react-intl": "^5.25.1",
@ -115,15 +117,18 @@
"@formatjs/cli": "^4.8.4",
"@netlify/plugin-nextjs": "^4.40.0",
"@rollup/plugin-alias": "^5.0.0",
"@rollup/plugin-buble": "^0.21.3",
"@rollup/plugin-commonjs": "^24.1.0",
"@rollup/plugin-buble": "^1.0.2",
"@rollup/plugin-commonjs": "^25.0.4",
"@rollup/plugin-json": "^6.0.0",
"@rollup/plugin-node-resolve": "^15.2.0",
"@rollup/plugin-replace": "^4.0.0",
"@svgr/rollup": "^7.0.0",
"@svgr/webpack": "^6.5.1",
"@typescript-eslint/eslint-plugin": "^5.62.0",
"@typescript-eslint/parser": "^5.62.0",
"@rollup/plugin-replace": "^5.0.2",
"@svgr/rollup": "^8.1.0",
"@svgr/webpack": "^6.2.1",
"@types/node": "^18.11.9",
"@types/react": "^18.0.25",
"@types/react-dom": "^18.0.8",
"@typescript-eslint/eslint-plugin": "^5.50.0",
"@typescript-eslint/parser": "^5.50.0",
"cross-env": "^7.0.3",
"esbuild": "^0.17.19",
"eslint": "^8.47.0",
@ -139,15 +144,16 @@
"postcss-flexbugs-fixes": "^5.0.2",
"postcss-import": "^15.1.0",
"postcss-preset-env": "7.8.3",
"postcss-rtlcss": "^4.0.7",
"prettier": "^2.8.8",
"prisma": "5.0.0",
"postcss-rtlcss": "^4.0.1",
"prettier": "^2.6.2",
"prisma": "5.3.1",
"prompts": "2.4.2",
"rollup": "^2.79.1",
"rollup": "^3.28.0",
"rollup-plugin-copy": "^3.4.0",
"rollup-plugin-delete": "^2.0.0",
"rollup-plugin-dts": "^5.3.1",
"rollup-plugin-esbuild": "^5.0.0",
"rollup-plugin-node-externals": "^5.1.3",
"rollup-plugin-node-externals": "^6.1.1",
"rollup-plugin-postcss": "^4.0.2",
"rollup-plugin-terser": "^7.0.2",
"stylelint": "^15.10.3",
@ -156,6 +162,6 @@
"stylelint-config-recommended": "^9.0.0",
"tar": "^6.1.15",
"ts-node": "^10.9.1",
"typescript": "^4.9.5"
"typescript": "^5.1.6"
}
}

View file

@ -1,56 +0,0 @@
import { canViewWebsite } from 'lib/auth';
import { useCors, useAuth } from 'lib/middleware';
import { NextApiRequestQueryBody } from 'lib/types';
import { NextApiResponse } from 'next';
import { ok, methodNotAllowed, unauthorized } from 'next-basics';
import { getInsights } from 'queries';
export interface InsightsRequestBody {
websiteId: string;
dateRange: {
startDate: string;
endDate: string;
};
fields: { name: string; type: string; value: string }[];
filters: string[];
groups: { name: string; type: string }[];
}
function convertFilters(filters) {
return filters.reduce((obj, { name, ...value }) => {
obj[name] = value;
return obj;
}, {});
}
export default async (
req: NextApiRequestQueryBody<any, InsightsRequestBody>,
res: NextApiResponse,
) => {
await useCors(req, res);
await useAuth(req, res);
if (req.method === 'POST') {
const {
websiteId,
dateRange: { startDate, endDate },
fields,
filters,
} = req.body;
if (!(await canViewWebsite(req.auth, websiteId))) {
return unauthorized(res);
}
const data = await getInsights(websiteId, fields, {
...convertFilters(filters),
startDate: new Date(startDate),
endDate: new Date(endDate),
});
return ok(res, data);
}
return methodNotAllowed(res);
};

View file

@ -1,175 +0,0 @@
import isbot from 'isbot';
import ipaddr from 'ipaddr.js';
import { createToken, ok, send, badRequest, forbidden } from 'next-basics';
import { saveEvent, saveSessionData } from 'queries';
import { useCors, useSession } from 'lib/middleware';
import { getJsonBody, getIpAddress } from 'lib/detect';
import { secret } from 'lib/crypto';
import { NextApiRequest, NextApiResponse } from 'next';
import { Resolver } from 'dns/promises';
import { CollectionType } from 'lib/types';
import { COLLECTION_TYPE } from 'lib/constants';
export interface CollectRequestBody {
payload: {
data: { [key: string]: any };
hostname: string;
language: string;
referrer: string;
screen: string;
title: string;
url: string;
website: string;
name: string;
};
type: CollectionType;
}
export interface NextApiRequestCollect extends NextApiRequest {
body: CollectRequestBody;
session: {
id: string;
websiteId: string;
ownerId: string;
hostname: string;
browser: string;
os: string;
device: string;
screen: string;
language: string;
country: string;
subdivision1: string;
subdivision2: string;
city: string;
};
headers: { [key: string]: any };
}
export default async (req: NextApiRequestCollect, res: NextApiResponse) => {
await useCors(req, res);
if (isbot(req.headers['user-agent']) && !process.env.DISABLE_BOT_CHECK) {
return ok(res);
}
const { type, payload } = getJsonBody<CollectRequestBody>(req);
const error = validateBody({ type, payload });
if (error) {
return badRequest(res, error);
}
if (await hasBlockedIp(req)) {
return forbidden(res);
}
const { url, referrer, name: eventName, data: eventData, title: pageTitle } = payload;
await useSession(req, res);
const session = req.session;
if (type === COLLECTION_TYPE.event) {
// eslint-disable-next-line prefer-const
let [urlPath, urlQuery] = url?.split('?') || [];
let [referrerPath, referrerQuery] = referrer?.split('?') || [];
let referrerDomain;
if (!urlPath) {
urlPath = '/';
}
if (referrerPath?.startsWith('http')) {
const refUrl = new URL(referrer);
referrerPath = refUrl.pathname;
referrerQuery = refUrl.search.substring(1);
referrerDomain = refUrl.hostname.replace(/www\./, '');
}
if (process.env.REMOVE_TRAILING_SLASH) {
urlPath = urlPath.replace(/.+\/$/, '');
}
await saveEvent({
urlPath,
urlQuery,
referrerPath,
referrerQuery,
referrerDomain,
pageTitle,
eventName,
eventData,
...session,
sessionId: session.id,
});
}
if (type === COLLECTION_TYPE.identify) {
if (!eventData) {
return badRequest(res, 'Data required.');
}
await saveSessionData({ ...session, sessionData: eventData, sessionId: session.id });
}
const token = createToken(session, secret());
return send(res, token);
};
function validateBody({ type, payload }: CollectRequestBody) {
if (!type || !payload) {
return 'Invalid payload.';
}
if (type !== COLLECTION_TYPE.event && type !== COLLECTION_TYPE.identify) {
return 'Wrong payload type.';
}
const { data } = payload;
if (data && !(typeof data === 'object' && !Array.isArray(data))) {
return 'Invalid event data.';
}
}
async function hasBlockedIp(req: NextApiRequestCollect) {
const ignoreIps = process.env.IGNORE_IP;
const ignoreHostnames = process.env.IGNORE_HOSTNAME;
if (ignoreIps || ignoreHostnames) {
const ips = [];
if (ignoreIps) {
ips.push(...ignoreIps.split(',').map(n => n.trim()));
}
if (ignoreHostnames) {
const resolver = new Resolver();
const promises = ignoreHostnames
.split(',')
.map(n => resolver.resolve4(n.trim()).catch(() => {}));
await Promise.all(promises).then(resolvedIps => {
ips.push(...resolvedIps.filter(n => n).flatMap(n => n as string[]));
});
}
const clientIp = getIpAddress(req);
return ips.find(ip => {
if (ip === clientIp) return true;
// CIDR notation
if (ip.indexOf('/') > 0) {
const addr = ipaddr.parse(clientIp);
const range = ipaddr.parseCIDR(ip);
if (addr.kind() === range[0].kind() && addr.match(range)) return true;
}
return false;
});
}
}

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Fields"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Funnel"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -769,6 +793,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -793,6 +823,12 @@
"value": "Screens"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Fields"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Funnel"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -769,6 +793,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -793,6 +823,12 @@
"value": "الشاشات"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Fields"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Funnel"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -769,6 +793,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -793,6 +823,12 @@
"value": "Экраны"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Fields"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Funnel"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -769,6 +793,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -793,6 +823,12 @@
"value": "স্ক্রিনগুলি"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Fields"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Funnel"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -769,6 +793,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -793,6 +823,12 @@
"value": "Screens"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Fields"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Funnel"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -769,6 +793,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -793,6 +823,12 @@
"value": "Screens"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Fields"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Funnel"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -769,6 +793,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -793,6 +823,12 @@
"value": "Screens"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Fields"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Funnel"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -769,6 +793,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -793,6 +823,12 @@
"value": "Bildschirmuflösige"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

View file

@ -20,7 +20,7 @@
"label.add": [
{
"type": 0,
"value": "Add"
"value": "Hinzufügen"
}
],
"label.add-description": [
@ -32,7 +32,7 @@
"label.add-website": [
{
"type": 0,
"value": "Webseite hinzufügen"
"value": "Website hinzufügen"
}
],
"label.admin": [
@ -44,7 +44,7 @@
"label.after": [
{
"type": 0,
"value": "After"
"value": "Nach"
}
],
"label.all": [
@ -86,7 +86,7 @@
"label.before": [
{
"type": 0,
"value": "Before"
"value": "Vor"
}
],
"label.bounce-rate": [
@ -134,7 +134,7 @@
"label.city": [
{
"type": 0,
"value": "City"
"value": "Stadt"
}
],
"label.clear-all": [
@ -158,7 +158,7 @@
"label.contains": [
{
"type": 0,
"value": "Contains"
"value": "Enthält"
}
],
"label.continue": [
@ -176,13 +176,19 @@
"label.country": [
{
"type": 0,
"value": "Country"
"value": "Land"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
"value": "Report erstellen"
"value": "Bericht erstellen"
}
],
"label.create-team": [
@ -230,7 +236,7 @@
"label.date": [
{
"type": 0,
"value": "Date"
"value": "Datum"
}
],
"label.date-range": [
@ -242,7 +248,7 @@
"label.day": [
{
"type": 0,
"value": "Day"
"value": "Tag"
}
],
"label.default-date-range": [
@ -272,7 +278,7 @@
"label.delete-website": [
{
"type": 0,
"value": "Webseite löschen"
"value": "Website löschen"
}
],
"label.description": [
@ -296,7 +302,7 @@
"label.device": [
{
"type": 0,
"value": "Device"
"value": "Gerät"
}
],
"label.devices": [
@ -314,7 +320,7 @@
"label.does-not-contain": [
{
"type": 0,
"value": "Does not contain"
"value": "Enthält nicht"
}
],
"label.domain": [
@ -356,7 +362,7 @@
"label.event-data": [
{
"type": 0,
"value": "Event daten"
"value": "Eventdaten"
}
],
"label.events": [
@ -368,19 +374,25 @@
"label.false": [
{
"type": 0,
"value": "False"
"value": "Falsch"
}
],
"label.field": [
{
"type": 0,
"value": "Field"
"value": "Feld"
}
],
"label.fields": [
{
"type": 0,
"value": "Fields"
"value": "Felder"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
@ -398,7 +410,7 @@
"label.filters": [
{
"type": 0,
"value": "Filters"
"value": "Filter"
}
],
"label.funnel": [
@ -407,6 +419,12 @@
"value": "Funnel"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,28 +443,34 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
"value": "Is"
"value": "Ist"
}
],
"label.is-not": [
{
"type": 0,
"value": "Is not"
"value": "Ist nicht"
}
],
"label.is-not-set": [
{
"type": 0,
"value": "Is not set"
"value": "Ist nicht gesetzt"
}
],
"label.is-set": [
{
"type": 0,
"value": "Is set"
"value": "Ist gesetzt"
}
],
"label.join": [
@ -576,7 +600,7 @@
"label.my-websites": [
{
"type": 0,
"value": "My websites"
"value": "Meine Websites"
}
],
"label.name": [
@ -618,7 +642,7 @@
"label.page-of": [
{
"type": 0,
"value": "Page "
"value": "Seite "
},
{
"type": 1,
@ -626,7 +650,7 @@
},
{
"type": 0,
"value": " of "
"value": " von "
},
{
"type": 1,
@ -642,7 +666,7 @@
"label.pageTitle": [
{
"type": 0,
"value": "Page title"
"value": "Seitentitel"
}
],
"label.pages": [
@ -742,7 +766,7 @@
"label.reports": [
{
"type": 0,
"value": "Reporte"
"value": "Berichte"
}
],
"label.required": [
@ -769,6 +793,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -793,6 +823,12 @@
"value": "Bildschirmauflösungen"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,
@ -808,7 +844,7 @@
"label.sessions": [
{
"type": 0,
"value": "Sessions"
"value": "Sitzungen"
}
],
"label.settings": [
@ -850,37 +886,37 @@
"label.team-guest": [
{
"type": 0,
"value": "Team Gast"
"value": "Gast des Teams"
}
],
"label.team-id": [
{
"type": 0,
"value": "Team ID"
"value": "Team-ID"
}
],
"label.team-member": [
{
"type": 0,
"value": "Team Mitglied"
"value": "Team-Mitglied"
}
],
"label.team-name": [
{
"type": 0,
"value": "Team name"
"value": "Name des Teams"
}
],
"label.team-owner": [
{
"type": 0,
"value": "Team Eigentümer"
"value": "Team-Eigentümer"
}
],
"label.team-websites": [
{
"type": 0,
"value": "Team websites"
"value": "Team-Websites"
}
],
"label.teams": [
@ -940,13 +976,13 @@
"label.total": [
{
"type": 0,
"value": "Total"
"value": "Gesamt"
}
],
"label.total-records": [
{
"type": 0,
"value": "Total records"
"value": "Datensätze insgesamt"
}
],
"label.tracking-code": [
@ -958,19 +994,19 @@
"label.true": [
{
"type": 0,
"value": "True"
"value": "Wahr"
}
],
"label.type": [
{
"type": 0,
"value": "Type"
"value": "Typ"
}
],
"label.unique": [
{
"type": 0,
"value": "Unique"
"value": "Eindeutig"
}
],
"label.unique-visitors": [
@ -988,7 +1024,7 @@
"label.untitled": [
{
"type": 0,
"value": "Untitled"
"value": "Unbenannt"
}
],
"label.url": [
@ -1024,7 +1060,7 @@
"label.value": [
{
"type": 0,
"value": "Value"
"value": "Wert"
}
],
"label.view": [
@ -1042,7 +1078,7 @@
"label.view-only": [
{
"type": 0,
"value": "View only"
"value": "Nur ansehen"
}
],
"label.views": [
@ -1060,25 +1096,25 @@
"label.website": [
{
"type": 0,
"value": "Webseite"
"value": "Website"
}
],
"label.website-id": [
{
"type": 0,
"value": "Webseite ID"
"value": "Website ID"
}
],
"label.websites": [
{
"type": 0,
"value": "Webseiten"
"value": "Websites"
}
],
"label.window": [
{
"type": 0,
"value": "Window"
"value": "Fenster"
}
],
"label.yesterday": [
@ -1166,7 +1202,7 @@
"message.delete-account": [
{
"type": 0,
"value": "To delete this account, type "
"value": "Um dieses Konto zu löschen, geben Sie zur Bestätigung "
},
{
"type": 1,
@ -1174,13 +1210,13 @@
},
{
"type": 0,
"value": " in the box below to confirm."
"value": " in das Feld unten ein."
}
],
"message.delete-website": [
{
"type": 0,
"value": "To delete this website, type "
"value": "Um diese Website zu löschen, geben Sie zur Bestätigung "
},
{
"type": 1,
@ -1188,7 +1224,7 @@
},
{
"type": 0,
"value": " in the box below to confirm."
"value": " in das Feld unten ein."
}
],
"message.delete-website-warning": [
@ -1238,7 +1274,7 @@
"message.min-password-length": [
{
"type": 0,
"value": "Minimale länge von "
"value": "Minimale Länge von "
},
{
"type": 1,
@ -1252,15 +1288,11 @@
"message.new-version-available": [
{
"type": 0,
"value": "A new version of Umami "
"value": "Eine neue Version von Umami ist verfügbar: "
},
{
"type": 1,
"value": "version"
},
{
"type": 0,
"value": " is available!"
}
],
"message.no-data-available": [
@ -1272,7 +1304,7 @@
"message.no-event-data": [
{
"type": 0,
"value": "No event data is available."
"value": "Es sind keine Ereignisdaten verfügbar."
}
],
"message.no-match-password": [
@ -1308,7 +1340,7 @@
"message.no-websites-configured": [
{
"type": 0,
"value": "Es ist keine Webseite vorhanden."
"value": "Es ist keine Website vorhanden."
}
],
"message.page-not-found": [
@ -1320,7 +1352,7 @@
"message.reset-website": [
{
"type": 0,
"value": "To reset this website, type "
"value": "Um diese Website zurückzusetzen, geben Sie zur Bestätigung "
},
{
"type": 1,
@ -1328,13 +1360,13 @@
},
{
"type": 0,
"value": " in the box below to confirm."
"value": " in das Feld unten ein."
}
],
"message.reset-website-warning": [
{
"type": 0,
"value": "Alle Daten für diese Webseite werden gelöscht, jedoch bleibt der Tracking Code bestehen."
"value": "Alle Daten für diese Website werden gelöscht, jedoch bleibt der Tracking Code bestehen."
}
],
"message.saved": [
@ -1346,7 +1378,7 @@
"message.share-url": [
{
"type": 0,
"value": "Ihre Webseitenstatistik ist unter der folgenden URL öffentlich zugänglich:"
"value": "Die Statistiken Ihrer Website sind unter folgender URL öffentlich zugänglich:"
}
],
"message.team-already-member": [
@ -1364,7 +1396,7 @@
"message.team-websites-info": [
{
"type": 0,
"value": "Webseiten können von jedem im Team eingesehen werden."
"value": "Websites können von jedem im Team eingesehen werden."
}
],
"message.tracking-code": [

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Fields"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Funnel"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -769,6 +793,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -793,6 +823,12 @@
"value": "Screens"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Fields"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Funnel"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -769,6 +793,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -793,6 +823,12 @@
"value": "Screens"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Fields"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Funnel"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -769,6 +793,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -793,6 +823,12 @@
"value": "Screens"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Campos"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Funnel"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -769,6 +793,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -793,6 +823,12 @@
"value": "Pantallas"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Fields"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Funnel"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -769,6 +793,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -793,6 +823,12 @@
"value": "Pantallas"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Fields"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Funnel"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -769,6 +793,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -793,6 +823,12 @@
"value": "Screens"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Fields"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Funnel"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -769,6 +793,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -793,6 +823,12 @@
"value": "Screens"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Fields"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Funnel"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -769,6 +793,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -793,6 +823,12 @@
"value": "Screens"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

View file

@ -104,7 +104,7 @@
"label.browser": [
{
"type": 0,
"value": "Browser"
"value": "Navigateur"
}
],
"label.browsers": [
@ -134,7 +134,7 @@
"label.city": [
{
"type": 0,
"value": "City"
"value": "Ville"
}
],
"label.clear-all": [
@ -176,7 +176,13 @@
"label.country": [
{
"type": 0,
"value": "Country"
"value": "Pays"
}
],
"label.create": [
{
"type": 0,
"value": "Créer"
}
],
"label.create-report": [
@ -242,7 +248,7 @@
"label.day": [
{
"type": 0,
"value": "Day"
"value": "Jour"
}
],
"label.default-date-range": [
@ -296,7 +302,7 @@
"label.device": [
{
"type": 0,
"value": "Device"
"value": "Appareil"
}
],
"label.devices": [
@ -326,7 +332,7 @@
"label.dropoff": [
{
"type": 0,
"value": "Dropoff"
"value": "Abandons"
}
],
"label.edit": [
@ -350,19 +356,19 @@
"label.event": [
{
"type": 0,
"value": "Event"
"value": "Évènement"
}
],
"label.event-data": [
{
"type": 0,
"value": "Données d'événements"
"value": "Données d'évènements"
}
],
"label.events": [
{
"type": 0,
"value": "Événements"
"value": "Évènements"
}
],
"label.false": [
@ -383,6 +389,12 @@
"value": "Champs"
}
],
"label.filter": [
{
"type": 0,
"value": "Filtrer"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Entonnoir"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Suivi des conversions et des taux d'abandons."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,28 +443,34 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Analyse précise des données en utilisant des segments et des filtres."
}
],
"label.is": [
{
"type": 0,
"value": "Est égal"
"value": "Est"
}
],
"label.is-not": [
{
"type": 0,
"value": "N'est pas égal"
"value": "N'est pas"
}
],
"label.is-not-set": [
{
"type": 0,
"value": "Is not set"
"value": "N'est pas défini"
}
],
"label.is-set": [
{
"type": 0,
"value": "Is set"
"value": "Est défini"
}
],
"label.join": [
@ -568,7 +592,7 @@
"label.my-websites": [
{
"type": 0,
"value": "My websites"
"value": "Mes sites"
}
],
"label.name": [
@ -618,7 +642,7 @@
},
{
"type": 0,
"value": " of "
"value": " sur "
},
{
"type": 1,
@ -634,7 +658,7 @@
"label.pageTitle": [
{
"type": 0,
"value": "Page title"
"value": "Titre de page"
}
],
"label.pages": [
@ -680,7 +704,7 @@
"label.query-parameters": [
{
"type": 0,
"value": "Paramètres d'URL"
"value": "Paramètres de requête"
}
],
"label.realtime": [
@ -692,7 +716,7 @@
"label.referrer": [
{
"type": 0,
"value": "Referrer"
"value": "Site référent"
}
],
"label.referrers": [
@ -716,7 +740,7 @@
"label.region": [
{
"type": 0,
"value": "Region"
"value": "Région"
}
],
"label.regions": [
@ -758,7 +782,13 @@
"label.retention": [
{
"type": 0,
"value": "Retention"
"value": "Rétention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Mesure de l'atractivité du site en visualisant les taux d'utilisateurs qui reviennent."
}
],
"label.role": [
@ -785,6 +815,12 @@
"value": "Résolutions d'écran"
}
],
"label.search": [
{
"type": 0,
"value": "Rechercher"
}
],
"label.select-date": [
{
"type": 0,
@ -860,7 +896,7 @@
"label.team-name": [
{
"type": 0,
"value": "Team name"
"value": "Nom de l'équipe"
}
],
"label.team-owner": [
@ -872,7 +908,7 @@
"label.team-websites": [
{
"type": 0,
"value": "Team websites"
"value": "Sites d'équipes"
}
],
"label.teams": [
@ -1052,7 +1088,7 @@
"label.website": [
{
"type": 0,
"value": "Website"
"value": "Site"
}
],
"label.website-id": [
@ -1248,7 +1284,7 @@
"message.new-version-available": [
{
"type": 0,
"value": "A new version of Umami "
"value": "Une nouvelle version d'Umami "
},
{
"type": 1,
@ -1256,7 +1292,7 @@
},
{
"type": 0,
"value": " is available!"
"value": " est disponible !"
}
],
"message.no-data-available": [
@ -1336,7 +1372,7 @@
"message.saved": [
{
"type": 0,
"value": "Enregistré avec succès."
"value": "Enregistré."
}
],
"message.share-url": [

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Fields"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Funnel"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -777,6 +801,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -801,6 +831,12 @@
"value": "Screens"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Fields"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Funnel"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -761,6 +785,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -785,6 +815,12 @@
"value": "Screens"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Fields"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Funnel"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -769,6 +793,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -793,6 +823,12 @@
"value": "Screens"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Fields"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Funnel"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -769,6 +793,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -793,6 +823,12 @@
"value": "Screens"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Fields"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Funnel"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -769,6 +793,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -793,6 +823,12 @@
"value": "Screens"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Fields"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Funnel"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -761,6 +785,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -785,6 +815,12 @@
"value": "Layar"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Fields"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Funnel"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -769,6 +793,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -793,6 +823,12 @@
"value": "Screens"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

File diff suppressed because it is too large Load diff

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Fields"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Funnel"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -761,6 +785,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -785,6 +815,12 @@
"value": "ប្រភេទឧបករណ៍"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Fields"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Funnel"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -773,6 +797,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -797,6 +827,12 @@
"value": "Screens"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Fields"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Funnel"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -874,6 +898,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -898,6 +928,12 @@
"value": "Screens"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Fields"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Funnel"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -769,6 +793,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -793,6 +823,12 @@
"value": "Дэлгэц"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Fields"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Funnel"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -761,6 +785,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -785,6 +815,12 @@
"value": "Screens"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

View file

@ -41,6 +41,12 @@
"value": "အက်ဒမင်"
}
],
"label.after": [
{
"type": 0,
"value": "ပြီးနောက်"
}
],
"label.all": [
{
"type": 0,
@ -59,6 +65,12 @@
"value": "အန်နလစ်တစ်"
}
],
"label.average": [
{
"type": 0,
"value": "ပျမ်းမျှ"
}
],
"label.average-visit-time": [
{
"type": 0,
@ -71,12 +83,30 @@
"value": "နောက်သို့"
}
],
"label.before": [
{
"type": 0,
"value": "မတိုင်မီ"
}
],
"label.bounce-rate": [
{
"type": 0,
"value": "Bounce နှုန်း"
}
],
"label.breakdown": [
{
"type": 0,
"value": "ခွဲခြမ်းစိတ်ဖြာမှု"
}
],
"label.browser": [
{
"type": 0,
"value": "Browser"
}
],
"label.browsers": [
{
"type": 0,
@ -101,6 +131,12 @@
"value": "မြို့များ"
}
],
"label.city": [
{
"type": 0,
"value": "City"
}
],
"label.clear-all": [
{
"type": 0,
@ -119,6 +155,12 @@
"value": "စကားဝှက်အတည်ပြုသည်"
}
],
"label.contains": [
{
"type": 0,
"value": "ပါဝင်သည်"
}
],
"label.continue": [
{
"type": 0,
@ -131,6 +173,24 @@
"value": "နိုင်ငံများ"
}
],
"label.country": [
{
"type": 0,
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
"value": "ရီပို့လုပ်မည်"
}
],
"label.create-team": [
{
"type": 0,
@ -173,12 +233,24 @@
"value": "ဒေတာ"
}
],
"label.date": [
{
"type": 0,
"value": "Date"
}
],
"label.date-range": [
{
"type": 0,
"value": "ရက်အပိုင်းအခြား"
}
],
"label.day": [
{
"type": 0,
"value": "Day"
}
],
"label.default-date-range": [
{
"type": 0,
@ -209,6 +281,12 @@
"value": "ဝက်ဘ်ဆိုဒ်ကိုဖျက်မည်"
}
],
"label.description": [
{
"type": 0,
"value": "ရှင်းပြချက်"
}
],
"label.desktop": [
{
"type": 0,
@ -221,6 +299,12 @@
"value": "အသေးစိတ်"
}
],
"label.device": [
{
"type": 0,
"value": "Device"
}
],
"label.devices": [
{
"type": 0,
@ -233,6 +317,12 @@
"value": "ပိတ်ပါ"
}
],
"label.does-not-contain": [
{
"type": 0,
"value": "မပါဝင်ပါ"
}
],
"label.domain": [
{
"type": 0,
@ -281,6 +371,12 @@
"value": "အဖြစ်အပျက်များ"
}
],
"label.false": [
{
"type": 0,
"value": "မှားသည်"
}
],
"label.field": [
{
"type": 0,
@ -293,6 +389,12 @@
"value": "Field အမည်များ"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -305,18 +407,72 @@
"value": "အရှိအတိုင်း"
}
],
"label.filters": [
{
"type": 0,
"value": "Filter များ"
}
],
"label.funnel": [
{
"type": 0,
"value": "ဖန်နယ်"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
"value": "ထက်ပို၍ကြီးသည်"
}
],
"label.greater-than-equals": [
{
"type": 0,
"value": "ထက်ပို၍ကြီးသည်သို့မဟုတ်တူသည်"
}
],
"label.insights": [
{
"type": 0,
"value": "အသေးစိတ်သိမြင်နိုင်ရန်"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
"value": "Is"
}
],
"label.is-not": [
{
"type": 0,
"value": "Is not"
}
],
"label.is-not-set": [
{
"type": 0,
"value": "Is not set"
}
],
"label.is-set": [
{
"type": 0,
"value": "Is set"
}
],
"label.join": [
{
"type": 0,
@ -387,6 +543,18 @@
"value": "အသင်းမှထွက်မည်"
}
],
"label.less-than": [
{
"type": 0,
"value": "ထက်ပို၍ငယ်သည်"
}
],
"label.less-than-equals": [
{
"type": 0,
"value": "ထက်ပို၍ငယ်သည်သို့မဟုတ်တူသည်"
}
],
"label.login": [
{
"type": 0,
@ -399,12 +567,24 @@
"value": "လော့ဂ်အောက်လုပ်မည်"
}
],
"label.max": [
{
"type": 0,
"value": "အများဆုံး"
}
],
"label.members": [
{
"type": 0,
"value": "အဖွဲ့ဝင်များ"
}
],
"label.min": [
{
"type": 0,
"value": "အနည်းဆုံး"
}
],
"label.mobile": [
{
"type": 0,
@ -417,6 +597,12 @@
"value": "နောက်ထပ်"
}
],
"label.my-websites": [
{
"type": 0,
"value": "My websites"
}
],
"label.name": [
{
"type": 0,
@ -435,24 +621,54 @@
"value": "မရှိပါ"
}
],
"label.operating-systems": [
"label.os": [
{
"type": 0,
"value": "ကွန်ပျူတာလည်ပတ်မှုစနစ်"
}
],
"label.overview": [
{
"type": 0,
"value": "အပေါ်ယံမြင်ကွင်း"
}
],
"label.owner": [
{
"type": 0,
"value": "ပိုင်ဆိုင်သူ"
}
],
"label.page-of": [
{
"type": 0,
"value": "Page "
},
{
"type": 1,
"value": "current"
},
{
"type": 0,
"value": " of "
},
{
"type": 1,
"value": "total"
}
],
"label.page-views": [
{
"type": 0,
"value": "ဝင်ရောက်ကြည့်ရှုသူ"
}
],
"label.pageTitle": [
{
"type": 0,
"value": "Page title"
}
],
"label.pages": [
{
"type": 0,
@ -505,6 +721,12 @@
"value": "အချိန်နှင့်တပြေးညီ"
}
],
"label.referrer": [
{
"type": 0,
"value": "Referrer"
}
],
"label.referrers": [
{
"type": 0,
@ -523,6 +745,12 @@
"value": "ပြန်ထုတ်မည်"
}
],
"label.region": [
{
"type": 0,
"value": "Region"
}
],
"label.regions": [
{
"type": 0,
@ -559,6 +787,18 @@
"value": "ဝက်ဘ်ဆိုဒ်ဒေတာကိုဖျက်မည်"
}
],
"label.retention": [
{
"type": 0,
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -583,6 +823,12 @@
"value": "မြင်ကွင်းများ"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,
@ -619,6 +865,12 @@
"value": "တစ်ရက်အတွင်း"
}
],
"label.sum": [
{
"type": 0,
"value": "ပေါင်းလဒ်"
}
],
"label.tablet": [
{
"type": 0,
@ -649,12 +901,24 @@
"value": "အသင်းဝင်"
}
],
"label.team-name": [
{
"type": 0,
"value": "Team name"
}
],
"label.team-owner": [
{
"type": 0,
"value": "အသင်းကိုပိုင်ဆိုင်သူ"
}
],
"label.team-websites": [
{
"type": 0,
"value": "Team websites"
}
],
"label.teams": [
{
"type": 0,
@ -709,12 +973,42 @@
"value": "ဇယားများကို အဖွင့်အပိတ်လုပ်မည်"
}
],
"label.total": [
{
"type": 0,
"value": "စုစုပေါင်း"
}
],
"label.total-records": [
{
"type": 0,
"value": "မှတ်တမ်းစုစုပေါင်း"
}
],
"label.tracking-code": [
{
"type": 0,
"value": "ထရက်လုပ်သည့် ကုဒ်"
}
],
"label.true": [
{
"type": 0,
"value": "မှန်သည်"
}
],
"label.type": [
{
"type": 0,
"value": "အမျိုးအစား"
}
],
"label.unique": [
{
"type": 0,
"value": "Unique"
}
],
"label.unique-visitors": [
{
"type": 0,
@ -727,6 +1021,12 @@
"value": "မသိသော"
}
],
"label.untitled": [
{
"type": 0,
"value": "ခေါင်းစဉ်မရှိ"
}
],
"label.url": [
{
"type": 0,
@ -757,6 +1057,12 @@
"value": "အသုံးပြုသူများ"
}
],
"label.value": [
{
"type": 0,
"value": "တန်ဖိုး"
}
],
"label.view": [
{
"type": 0,
@ -817,168 +1123,6 @@
"value": "မနေ့က"
}
],
"labels.after": [
{
"type": 0,
"value": "ပြီးနောက်"
}
],
"labels.average": [
{
"type": 0,
"value": "ပျမ်းမျှ"
}
],
"labels.before": [
{
"type": 0,
"value": "မတိုင်မီ"
}
],
"labels.breakdown": [
{
"type": 0,
"value": "ခွဲခြမ်းစိတ်ဖြာမှု"
}
],
"labels.contains": [
{
"type": 0,
"value": "ပါဝင်သည်"
}
],
"labels.create-report": [
{
"type": 0,
"value": "ရီပို့လုပ်မည်"
}
],
"labels.description": [
{
"type": 0,
"value": "ရှင်းပြချက်"
}
],
"labels.does-not-contain": [
{
"type": 0,
"value": "မပါဝင်ပါ"
}
],
"labels.does-not-equal": [
{
"type": 0,
"value": "မတူညီပါ"
}
],
"labels.equals": [
{
"type": 0,
"value": "တူညီသည်"
}
],
"labels.false": [
{
"type": 0,
"value": "မှားသည်"
}
],
"labels.filters": [
{
"type": 0,
"value": "Filter များ"
}
],
"labels.greater-than": [
{
"type": 0,
"value": "ထက်ပို၍ကြီးသည်"
}
],
"labels.greater-than-equals": [
{
"type": 0,
"value": "ထက်ပို၍ကြီးသည်သို့မဟုတ်တူသည်"
}
],
"labels.less-than": [
{
"type": 0,
"value": "ထက်ပို၍ငယ်သည်"
}
],
"labels.less-than-equals": [
{
"type": 0,
"value": "ထက်ပို၍ငယ်သည်သို့မဟုတ်တူသည်"
}
],
"labels.max": [
{
"type": 0,
"value": "အများဆုံး"
}
],
"labels.min": [
{
"type": 0,
"value": "အနည်းဆုံး"
}
],
"labels.overview": [
{
"type": 0,
"value": "အပေါ်ယံမြင်ကွင်း"
}
],
"labels.sum": [
{
"type": 0,
"value": "ပေါင်းလဒ်"
}
],
"labels.total": [
{
"type": 0,
"value": "စုစုပေါင်း"
}
],
"labels.total-records": [
{
"type": 0,
"value": "မှတ်တမ်းစုစုပေါင်း"
}
],
"labels.true": [
{
"type": 0,
"value": "မှန်သည်"
}
],
"labels.type": [
{
"type": 0,
"value": "အမျိုးအစား"
}
],
"labels.unique": [
{
"type": 0,
"value": "Unique"
}
],
"labels.untitled": [
{
"type": 0,
"value": "ခေါင်းစဉ်မရှိ"
}
],
"labels.value": [
{
"type": 0,
"value": "တန်ဖိုး"
}
],
"message.active-users": [
{
"type": 1,

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Fields"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Funnel"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -769,6 +793,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -793,6 +823,12 @@
"value": "Screens"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Fields"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Funnel"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -769,6 +793,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -793,6 +823,12 @@
"value": "Schermen"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Pola"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Lejek"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -769,6 +793,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -793,6 +823,12 @@
"value": "Ekrany"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Campos"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Funil"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -769,6 +793,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -793,6 +823,12 @@
"value": "Telas"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Fields"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Funnel"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -769,6 +793,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -793,6 +823,12 @@
"value": "Screens"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Fields"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Funnel"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -769,6 +793,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -793,6 +823,12 @@
"value": "Screens"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Fields"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Funnel"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -769,6 +793,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -793,6 +823,12 @@
"value": "Экраны"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Fields"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Funnel"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -769,6 +793,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -793,6 +823,12 @@
"value": "Screens"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Fields"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Funnel"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -769,6 +793,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -793,6 +823,12 @@
"value": "Screens"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

File diff suppressed because it is too large Load diff

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Fields"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Funnel"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -769,6 +793,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -793,6 +823,12 @@
"value": "Upplösning"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Fields"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Funnel"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -769,6 +793,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -793,6 +823,12 @@
"value": "Screens"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Fields"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Funnel"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -761,6 +785,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -785,6 +815,12 @@
"value": "ขนาดหน้าจอ"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Fields"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Funnel"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -769,6 +793,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -793,6 +823,12 @@
"value": "Ekranlar"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Fields"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Funnel"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -769,6 +793,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -793,6 +823,12 @@
"value": "Screens"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Fields"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Funnel"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -769,6 +793,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -793,6 +823,12 @@
"value": "Screens"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

View file

@ -179,6 +179,12 @@
"value": "Country"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
{
"type": 0,
@ -383,6 +389,12 @@
"value": "Fields"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "Funnel"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "Insights"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -761,6 +785,12 @@
"value": "Retention"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
{
"type": 0,
@ -785,6 +815,12 @@
"value": "Screens"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,

View file

@ -104,7 +104,7 @@
"label.browser": [
{
"type": 0,
"value": "Browser"
"value": "浏览器"
}
],
"label.browsers": [
@ -134,7 +134,7 @@
"label.city": [
{
"type": 0,
"value": "City"
"value": "市/县"
}
],
"label.clear-all": [
@ -176,7 +176,13 @@
"label.country": [
{
"type": 0,
"value": "Country"
"value": "国家/地区"
}
],
"label.create": [
{
"type": 0,
"value": "Create"
}
],
"label.create-report": [
@ -230,7 +236,7 @@
"label.date": [
{
"type": 0,
"value": "Date"
"value": "日期"
}
],
"label.date-range": [
@ -242,7 +248,7 @@
"label.day": [
{
"type": 0,
"value": "Day"
"value": ""
}
],
"label.default-date-range": [
@ -296,7 +302,7 @@
"label.device": [
{
"type": 0,
"value": "Device"
"value": "设备"
}
],
"label.devices": [
@ -383,6 +389,12 @@
"value": "Fields"
}
],
"label.filter": [
{
"type": 0,
"value": "Filter"
}
],
"label.filter-combined": [
{
"type": 0,
@ -407,6 +419,12 @@
"value": "分析"
}
],
"label.funnel-description": [
{
"type": 0,
"value": "Understand the conversion and drop-off rate of users."
}
],
"label.greater-than": [
{
"type": 0,
@ -425,6 +443,12 @@
"value": "见解"
}
],
"label.insights-description": [
{
"type": 0,
"value": "Dive deeper into your data by using segments and filters."
}
],
"label.is": [
{
"type": 0,
@ -440,13 +464,13 @@
"label.is-not-set": [
{
"type": 0,
"value": "Is not set"
"value": "未设置"
}
],
"label.is-set": [
{
"type": 0,
"value": "Is set"
"value": "已设置"
}
],
"label.join": [
@ -576,7 +600,7 @@
"label.my-websites": [
{
"type": 0,
"value": "My websites"
"value": "我的网站"
}
],
"label.name": [
@ -618,7 +642,15 @@
"label.page-of": [
{
"type": 0,
"value": "Page "
"value": "总"
},
{
"type": 1,
"value": "total"
},
{
"type": 0,
"value": "中的第"
},
{
"type": 1,
@ -626,11 +658,7 @@
},
{
"type": 0,
"value": " of "
},
{
"type": 1,
"value": "total"
"value": "页"
}
],
"label.page-views": [
@ -642,7 +670,7 @@
"label.pageTitle": [
{
"type": 0,
"value": "Page title"
"value": "标题"
}
],
"label.pages": [
@ -704,7 +732,7 @@
"label.referrer": [
{
"type": 0,
"value": "Referrer"
"value": "来源"
}
],
"label.referrers": [
@ -728,7 +756,7 @@
"label.region": [
{
"type": 0,
"value": "Region"
"value": "州/省"
}
],
"label.regions": [
@ -770,7 +798,13 @@
"label.retention": [
{
"type": 0,
"value": "Retention"
"value": "保留"
}
],
"label.retention-description": [
{
"type": 0,
"value": "Measure your website stickiness by tracking how often users return."
}
],
"label.role": [
@ -797,6 +831,12 @@
"value": "屏幕尺寸"
}
],
"label.search": [
{
"type": 0,
"value": "Search"
}
],
"label.select-date": [
{
"type": 0,
@ -872,7 +912,7 @@
"label.team-name": [
{
"type": 0,
"value": "Team name"
"value": "团队名称"
}
],
"label.team-owner": [
@ -884,7 +924,7 @@
"label.team-websites": [
{
"type": 0,
"value": "Team websites"
"value": "团队网站"
}
],
"label.teams": [
@ -974,7 +1014,7 @@
"label.unique": [
{
"type": 0,
"value": "Unique"
"value": "独立"
}
],
"label.unique-visitors": [
@ -998,13 +1038,13 @@
"label.url": [
{
"type": 0,
"value": "URL"
"value": "网址"
}
],
"label.urls": [
{
"type": 0,
"value": "URLs"
"value": "网址"
}
],
"label.user": [
@ -1046,7 +1086,7 @@
"label.view-only": [
{
"type": 0,
"value": "View only"
"value": "仅浏览量"
}
],
"label.views": [
@ -1190,15 +1230,15 @@
"message.event-log": [
{
"type": 1,
"value": "event"
"value": "url"
},
{
"type": 0,
"value": " on "
"value": "上的"
},
{
"type": 1,
"value": "url"
"value": "event"
}
],
"message.go-to-settings": [

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,84 @@
import path from 'path';
import crypto from 'crypto';
import resolve from '@rollup/plugin-node-resolve';
import alias from '@rollup/plugin-alias';
import json from '@rollup/plugin-json';
import postcss from 'rollup-plugin-postcss';
import copy from 'rollup-plugin-copy';
import del from 'rollup-plugin-delete';
import nodeExternals from 'rollup-plugin-node-externals';
import esbuild from 'rollup-plugin-esbuild';
import dts from 'rollup-plugin-dts';
import svgr from '@svgr/rollup';
const md5 = str => crypto.createHash('md5').update(str).digest('hex');
const customResolver = resolve({
extensions: ['.js', '.jsx', '.ts', '.tsx'],
});
const aliasConfig = {
entries: [
{ find: /^components/, replacement: path.resolve('./src/components') },
{ find: /^hooks/, replacement: path.resolve('./src/hooks') },
{ find: /^lib/, replacement: path.resolve('./src/lib') },
{ find: /^store/, replacement: path.resolve('./src/store') },
{ find: /^public/, replacement: path.resolve('./public') },
{ find: /^assets/, replacement: path.resolve('./src/assets') },
],
customResolver,
};
const jsBundle = {
input: 'src/index.ts',
output: [
{
file: 'dist/index.js',
format: 'es',
sourcemap: true,
},
],
plugins: [
del({ targets: 'dist/*', runOnce: true }),
copy({ targets: [{ src: './package.components.json', dest: 'dist', rename: 'package.json' }] }),
postcss({
config: false,
extract: 'styles.css',
sourceMap: true,
minimize: true,
modules: {
generateScopedName: function (name, filename, css) {
const file = path.basename(filename, '.css').replace('.module', '');
const hash = Buffer.from(md5(`${name}:${filename}:${css}`))
.toString('base64')
.substring(0, 5);
return `${file}-${name}--${hash}`;
},
},
}),
svgr({ icon: true }),
nodeExternals(),
json(),
alias(aliasConfig),
esbuild({
target: 'es6',
jsx: 'automatic',
loaders: {
'.js': 'jsx',
},
}),
],
};
const dtsBundle = {
input: 'src/index.ts',
output: {
file: 'dist/index.d.ts',
format: 'es',
},
plugins: [alias(aliasConfig), nodeExternals(), json(), dts()],
external: [/\.css/],
};
export default [jsBundle, dtsBundle];

View file

@ -4,7 +4,7 @@ import replace from '@rollup/plugin-replace';
import { terser } from 'rollup-plugin-terser';
export default {
input: 'tracker/index.js',
input: 'src/tracker/index.js',
output: {
file: 'public/script.js',
format: 'iife',

View file

@ -66,12 +66,16 @@ async function checkDatabaseVersion() {
async function checkV1Tables() {
try {
await prisma.$queryRaw`select * from account limit 1`;
// check for v1 migrations before v2 release date
const record =
await prisma.$queryRaw`select * from _prisma_migrations where started_at < '2023-04-17'`;
error(
'Umami v1 tables detected. For how to upgrade from v1 to v2 go to https://umami.is/docs/migrate-v1-v2.',
);
process.exit(1);
if (record.length > 0) {
error(
'Umami v1 tables detected. For how to upgrade from v1 to v2 go to https://umami.is/docs/migrate-v1-v2.',
);
process.exit(1);
}
} catch (e) {
// Ignore
}

View file

@ -2,7 +2,7 @@
const fs = require('fs');
const path = require('path');
const chalk = require('chalk');
const messages = require('../lang/en-US.json');
const messages = require('../src/lang/en-US.json');
const ignore = require('../lang-ignore.json');
const dir = path.resolve(__dirname, '../lang');

View file

@ -4,7 +4,7 @@ const path = require('path');
const https = require('https');
const chalk = require('chalk');
const src = path.resolve(__dirname, '../lang');
const src = path.resolve(__dirname, '../src/lang');
const dest = path.resolve(__dirname, '../public/intl/country');
const files = fs.readdirSync(src);

View file

@ -4,7 +4,7 @@ const path = require('path');
const https = require('https');
const chalk = require('chalk');
const src = path.resolve(__dirname, '../lang');
const src = path.resolve(__dirname, '../src/lang');
const dest = path.resolve(__dirname, '../public/intl/language');
const files = fs.readdirSync(src);

View file

@ -3,7 +3,7 @@ const path = require('path');
const del = require('del');
const prettier = require('prettier');
const src = path.resolve(__dirname, '../lang');
const src = path.resolve(__dirname, '../src/lang');
const dest = path.resolve(__dirname, '../build/messages');
const files = fs.readdirSync(src);
@ -17,7 +17,7 @@ async function run() {
await fs.ensureDir(dest);
files.forEach(file => {
const lang = require(`../lang/${file}`);
const lang = require(`../src/lang/${file}`);
const keys = Object.keys(lang).sort();
const formatted = keys.reduce((obj, key) => {

View file

@ -4,7 +4,7 @@ const path = require('path');
const prettier = require('prettier');
const messages = require('../build/messages.json');
const dest = path.resolve(__dirname, '../lang');
const dest = path.resolve(__dirname, '../src/lang');
const files = fs.readdirSync(dest);
const keys = Object.keys(messages).sort();
@ -14,7 +14,7 @@ with the existing files under `lang`. Any newly added
keys will be printed to the console.
*/
files.forEach(file => {
const lang = require(`../lang/${file}`);
const lang = require(`../src/lang/${file}`);
console.log(`Merging ${file}`);

View file

Before

Width:  |  Height:  |  Size: 451 B

After

Width:  |  Height:  |  Size: 451 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 328 B

After

Width:  |  Height:  |  Size: 328 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 338 B

After

Width:  |  Height:  |  Size: 338 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 289 B

After

Width:  |  Height:  |  Size: 289 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 1,002 B

After

Width:  |  Height:  |  Size: 1,002 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 400 B

After

Width:  |  Height:  |  Size: 400 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 547 B

After

Width:  |  Height:  |  Size: 547 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 509 B

After

Width:  |  Height:  |  Size: 509 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 487 B

After

Width:  |  Height:  |  Size: 487 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 874 B

After

Width:  |  Height:  |  Size: 874 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 438 B

After

Width:  |  Height:  |  Size: 438 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 433 B

After

Width:  |  Height:  |  Size: 433 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 390 B

After

Width:  |  Height:  |  Size: 390 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 298 B

After

Width:  |  Height:  |  Size: 298 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 636 B

After

Width:  |  Height:  |  Size: 636 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 371 B

After

Width:  |  Height:  |  Size: 371 B

Before After
Before After

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