diff --git a/.eslintrc.json b/.eslintrc.json
index 25e83d5ac..a77ed5bd8 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -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"
diff --git a/.gitignore b/.gitignore
index 99087ab50..050397c90 100644
--- a/.gitignore
+++ b/.gitignore
@@ -34,9 +34,7 @@ yarn-error.log*
# local env files
.env
-.env.development.local
-.env.test.local
-.env.production.local
+.env.*
*.dev.yml
diff --git a/Dockerfile b/Dockerfile
index cefa9fa13..dffdf31c8 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -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"]
diff --git a/README.md b/README.md
index 19935ed59..02a44e1e1 100644
--- a/README.md
+++ b/README.md
@@ -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
diff --git a/components/input/WebsiteDateFilter.js b/components/input/WebsiteDateFilter.js
deleted file mode 100644
index 47e6f0160..000000000
--- a/components/input/WebsiteDateFilter.js
+++ /dev/null
@@ -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 (
-
{formatMessage(messages.trackingCode)}
- - > - ); -} - -export default TrackingCode; diff --git a/db/clickhouse/schema.sql b/db/clickhouse/schema.sql index 94b560c3e..44428e94c 100644 --- a/db/clickhouse/schema.sql +++ b/db/clickhouse/schema.sql @@ -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, diff --git a/hooks/useRequireLogin.js b/hooks/useRequireLogin.js deleted file mode 100644 index 3a95c9888..000000000 --- a/hooks/useRequireLogin.js +++ /dev/null @@ -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; diff --git a/jsconfig.json b/jsconfig.json index b639b0f8f..738e8a465 100644 --- a/jsconfig.json +++ b/jsconfig.json @@ -1,5 +1,5 @@ { "compilerOptions": { - "baseUrl": "." + "baseUrl": "./src" } -} \ No newline at end of file +} diff --git a/lang/ja-JP.json b/lang/ja-JP.json deleted file mode 100644 index 0f4d54504..000000000 --- a/lang/ja-JP.json +++ /dev/null @@ -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}からの訪問者" -} diff --git a/lang/sl-SI.json b/lang/sl-SI.json deleted file mode 100644 index aae7888d8..000000000 --- a/lang/sl-SI.json +++ /dev/null @@ -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}" -} diff --git a/lang/zh-TW.json b/lang/zh-TW.json deleted file mode 100644 index c5761150c..000000000 --- a/lang/zh-TW.json +++ /dev/null @@ -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} 進行訪問。" -} diff --git a/next.config.js b/next.config.js index 2165a6e01..cc3cde7c6 100644 --- a/next.config.js +++ b/next.config.js @@ -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() { diff --git a/package.components.json b/package.components.json new file mode 100644 index 000000000..41e72579f --- /dev/null +++ b/package.components.json @@ -0,0 +1,23 @@ +{ + "name": "@umami/components", + "version": "0.1.0", + "description": "Umami React components.", + "author": "Mike Cao