Merge branch 'dev' into jajaja

This commit is contained in:
Mike Cao 2025-02-21 20:04:04 -08:00
commit 5c988ab5ff
10 changed files with 398 additions and 404 deletions

View file

@ -121,7 +121,7 @@ To update the Docker image, simply pull the new images and rebuild:
```bash ```bash
docker compose pull docker compose pull
docker compose up --force-recreate docker compose up --force-recreate -d
``` ```
--- ---

View file

@ -1,5 +1,4 @@
--- ---
version: '3'
services: services:
umami: umami:
image: ghcr.io/umami-software/umami:postgresql-latest image: ghcr.io/umami-software/umami:postgresql-latest

View file

@ -1,6 +1,6 @@
{ {
"name": "umami", "name": "umami",
"version": "2.16.0", "version": "2.16.1",
"description": "A simple, fast, privacy-focused alternative to Google Analytics.", "description": "A simple, fast, privacy-focused alternative to Google Analytics.",
"author": "Umami Software, Inc. <hello@umami.is>", "author": "Umami Software, Inc. <hello@umami.is>",
"license": "MIT", "license": "MIT",

File diff suppressed because it is too large Load diff

View file

@ -32,13 +32,13 @@
"label.add-member": [ "label.add-member": [
{ {
"type": 0, "type": 0,
"value": "Add member" "value": "Гишүүн нэмэх"
} }
], ],
"label.add-step": [ "label.add-step": [
{ {
"type": 0, "type": 0,
"value": "Add step" "value": "Алхам нэмэх"
} }
], ],
"label.add-website": [ "label.add-website": [
@ -74,7 +74,7 @@
"label.analytics": [ "label.analytics": [
{ {
"type": 0, "type": 0,
"value": "Analytics" "value": "Аналитик"
} }
], ],
"label.average": [ "label.average": [
@ -152,7 +152,7 @@
"label.compare": [ "label.compare": [
{ {
"type": 0, "type": 0,
"value": "Compare" "value": "Харьцуулах"
} }
], ],
"label.confirm": [ "label.confirm": [
@ -182,7 +182,7 @@
"label.count": [ "label.count": [
{ {
"type": 0, "type": 0,
"value": "Count" "value": "Тоо"
} }
], ],
"label.countries": [ "label.countries": [
@ -230,13 +230,13 @@
"label.created-by": [ "label.created-by": [
{ {
"type": 0, "type": 0,
"value": "Created By" "value": "Үүсгэсэн"
} }
], ],
"label.current": [ "label.current": [
{ {
"type": 0, "type": 0,
"value": "Current" "value": "Одоогийн"
} }
], ],
"label.current-password": [ "label.current-password": [
@ -296,7 +296,7 @@
"label.delete-report": [ "label.delete-report": [
{ {
"type": 0, "type": 0,
"value": "Delete report" "value": "Тайлан устгах"
} }
], ],
"label.delete-team": [ "label.delete-team": [
@ -386,7 +386,7 @@
"label.edit-member": [ "label.edit-member": [
{ {
"type": 0, "type": 0,
"value": "Edit member" "value": "Гишүүн засах"
} }
], ],
"label.enable-share-url": [ "label.enable-share-url": [
@ -398,13 +398,13 @@
"label.end-step": [ "label.end-step": [
{ {
"type": 0, "type": 0,
"value": "End Step" "value": "Төгсгөлийн алхам"
} }
], ],
"label.entry": [ "label.entry": [
{ {
"type": 0, "type": 0,
"value": "Entry URL" "value": "Орох зам"
} }
], ],
"label.event": [ "label.event": [
@ -428,7 +428,7 @@
"label.exit": [ "label.exit": [
{ {
"type": 0, "type": 0,
"value": "Exit URL" "value": "Гарах зам"
} }
], ],
"label.false": [ "label.false": [
@ -476,7 +476,7 @@
"label.first-seen": [ "label.first-seen": [
{ {
"type": 0, "type": 0,
"value": "First seen" "value": "Анх харсан"
} }
], ],
"label.funnel": [ "label.funnel": [
@ -494,19 +494,19 @@
"label.goal": [ "label.goal": [
{ {
"type": 0, "type": 0,
"value": "Goal" "value": "Зорилго"
} }
], ],
"label.goals": [ "label.goals": [
{ {
"type": 0, "type": 0,
"value": "Goals" "value": "Зорилго"
} }
], ],
"label.goals-description": [ "label.goals-description": [
{ {
"type": 0, "type": 0,
"value": "Track your goals for pageviews and events." "value": "Хуудас үзсэн болон үйлдлийн зорилгыг мөрдөх."
} }
], ],
"label.greater-than": [ "label.greater-than": [
@ -524,13 +524,13 @@
"label.host": [ "label.host": [
{ {
"type": 0, "type": 0,
"value": "Host" "value": "Хост"
} }
], ],
"label.hosts": [ "label.hosts": [
{ {
"type": 0, "type": 0,
"value": "Hosts" "value": "Хост"
} }
], ],
"label.insights": [ "label.insights": [
@ -584,13 +584,13 @@
"label.journey": [ "label.journey": [
{ {
"type": 0, "type": 0,
"value": "Journey" "value": "Аялал"
} }
], ],
"label.journey-description": [ "label.journey-description": [
{ {
"type": 0, "type": 0,
"value": "Understand how users navigate through your website." "value": "Хэрэглэгчид таны цахим хуудсаар хэрхэн шилжиж явсныг шинжлэх."
} }
], ],
"label.language": [ "label.language": [
@ -642,7 +642,7 @@
"label.last-months": [ "label.last-months": [
{ {
"type": 0, "type": 0,
"value": "Last " "value": "Сүүлийн "
}, },
{ {
"type": 1, "type": 1,
@ -650,13 +650,13 @@
}, },
{ {
"type": 0, "type": 0,
"value": " months" "value": " сар"
} }
], ],
"label.last-seen": [ "label.last-seen": [
{ {
"type": 0, "type": 0,
"value": "Last seen" "value": "Сүүлд харагдсан"
} }
], ],
"label.leave": [ "label.leave": [
@ -698,13 +698,13 @@
"label.manage": [ "label.manage": [
{ {
"type": 0, "type": 0,
"value": "Manage" "value": "Удирдах"
} }
], ],
"label.manager": [ "label.manager": [
{ {
"type": 0, "type": 0,
"value": "Manager" "value": "Удирдагч"
} }
], ],
"label.max": [ "label.max": [
@ -716,7 +716,7 @@
"label.member": [ "label.member": [
{ {
"type": 0, "type": 0,
"value": "Member" "value": "Гишүүн"
} }
], ],
"label.members": [ "label.members": [
@ -746,7 +746,7 @@
"label.my-account": [ "label.my-account": [
{ {
"type": 0, "type": 0,
"value": "My account" "value": "Миний бүртгэл"
} }
], ],
"label.my-websites": [ "label.my-websites": [
@ -789,7 +789,7 @@
"value": [ "value": [
{ {
"type": 0, "type": 0,
"value": "record" "value": "бичлэг"
} }
] ]
}, },
@ -797,7 +797,7 @@
"value": [ "value": [
{ {
"type": 0, "type": 0,
"value": "records" "value": "бичлэг"
} }
] ]
} }
@ -810,7 +810,7 @@
"label.ok": [ "label.ok": [
{ {
"type": 0, "type": 0,
"value": "OK" "value": "ЗА"
} }
], ],
"label.os": [ "label.os": [
@ -876,13 +876,13 @@
"label.path": [ "label.path": [
{ {
"type": 0, "type": 0,
"value": "Path" "value": "Зам"
} }
], ],
"label.paths": [ "label.paths": [
{ {
"type": 0, "type": 0,
"value": "Paths" "value": "Зам"
} }
], ],
"label.powered-by": [ "label.powered-by": [
@ -898,19 +898,19 @@
"label.previous": [ "label.previous": [
{ {
"type": 0, "type": 0,
"value": "Previous" "value": "Өмнөх"
} }
], ],
"label.previous-period": [ "label.previous-period": [
{ {
"type": 0, "type": 0,
"value": "Previous period" "value": "Өмнөх үе"
} }
], ],
"label.previous-year": [ "label.previous-year": [
{ {
"type": 0, "type": 0,
"value": "Previous year" "value": "Өмнөх жил"
} }
], ],
"label.profile": [ "label.profile": [
@ -922,13 +922,13 @@
"label.properties": [ "label.properties": [
{ {
"type": 0, "type": 0,
"value": "Properties" "value": "Шинж чанар"
} }
], ],
"label.property": [ "label.property": [
{ {
"type": 0, "type": 0,
"value": "Property" "value": "Шинж чанар"
} }
], ],
"label.queries": [ "label.queries": [
@ -1000,7 +1000,7 @@
"label.remove-member": [ "label.remove-member": [
{ {
"type": 0, "type": 0,
"value": "Remove member" "value": "Гишүүн хасах"
} }
], ],
"label.reports": [ "label.reports": [
@ -1042,19 +1042,19 @@
"label.revenue": [ "label.revenue": [
{ {
"type": 0, "type": 0,
"value": "Revenue" "value": "Орлого"
} }
], ],
"label.revenue-description": [ "label.revenue-description": [
{ {
"type": 0, "type": 0,
"value": "Look into your revenue across time." "value": "Цаг хугацааны туршид орлогын өөрчлөлтийг харах."
} }
], ],
"label.revenue-property": [ "label.revenue-property": [
{ {
"type": 0, "type": 0,
"value": "Revenue Property" "value": "Орлогын шинж чанар"
} }
], ],
"label.role": [ "label.role": [
@ -1090,7 +1090,7 @@
"label.select": [ "label.select": [
{ {
"type": 0, "type": 0,
"value": "Select" "value": "Сонгох"
} }
], ],
"label.select-date": [ "label.select-date": [
@ -1144,13 +1144,13 @@
"label.start-step": [ "label.start-step": [
{ {
"type": 0, "type": 0,
"value": "Start Step" "value": "Эхлэх алхам"
} }
], ],
"label.steps": [ "label.steps": [
{ {
"type": 0, "type": 0,
"value": "Steps" "value": "Алхам"
} }
], ],
"label.sum": [ "label.sum": [
@ -1180,7 +1180,7 @@
"label.team-manager": [ "label.team-manager": [
{ {
"type": 0, "type": 0,
"value": "Team manager" "value": "Багийн удирдагч"
} }
], ],
"label.team-member": [ "label.team-member": [
@ -1294,13 +1294,13 @@
"label.transfer": [ "label.transfer": [
{ {
"type": 0, "type": 0,
"value": "Transfer" "value": "Шилжүүлэх"
} }
], ],
"label.transfer-website": [ "label.transfer-website": [
{ {
"type": 0, "type": 0,
"value": "Transfer website" "value": "Вебийг шилжүүлэх"
} }
], ],
"label.true": [ "label.true": [
@ -1330,7 +1330,7 @@
"label.uniqueCustomers": [ "label.uniqueCustomers": [
{ {
"type": 0, "type": 0,
"value": "Unique Customers" "value": "Давтагдаагүй зочин"
} }
], ],
"label.unknown": [ "label.unknown": [
@ -1348,7 +1348,7 @@
"label.update": [ "label.update": [
{ {
"type": 0, "type": 0,
"value": "Update" "value": "Шинэчлэх"
} }
], ],
"label.url": [ "label.url": [
@ -1360,7 +1360,7 @@
"label.urls": [ "label.urls": [
{ {
"type": 0, "type": 0,
"value": "URLs" "value": "URL-ууд"
} }
], ],
"label.user": [ "label.user": [
@ -1372,7 +1372,7 @@
"label.user-property": [ "label.user-property": [
{ {
"type": 0, "type": 0,
"value": "User Property" "value": "Хэрэглэгчийн шинж"
} }
], ],
"label.username": [ "label.username": [
@ -1396,7 +1396,7 @@
"label.utm-description": [ "label.utm-description": [
{ {
"type": 0, "type": 0,
"value": "Track your campaigns through UTM parameters." "value": "UTM параметраар кампанит ажлаа мөрдөх."
} }
], ],
"label.value": [ "label.value": [
@ -1432,7 +1432,7 @@
"label.views-per-visit": [ "label.views-per-visit": [
{ {
"type": 0, "type": 0,
"value": "Views per visit" "value": "Зочдын хуудас үзсэн тоо"
} }
], ],
"label.visit-duration": [ "label.visit-duration": [
@ -1450,7 +1450,7 @@
"label.visits": [ "label.visits": [
{ {
"type": 0, "type": 0,
"value": "Visits" "value": "Зочилсон"
} }
], ],
"label.website": [ "label.website": [
@ -1486,7 +1486,7 @@
"message.action-confirmation": [ "message.action-confirmation": [
{ {
"type": 0, "type": 0,
"value": "Type " "value": "Доорх хэсэгт "
}, },
{ {
"type": 1, "type": 1,
@ -1494,7 +1494,7 @@
}, },
{ {
"type": 0, "type": 0,
"value": " in the box below to confirm." "value": " гэж бичин баталгаажуулна уу."
} }
], ],
"message.active-users": [ "message.active-users": [
@ -1542,7 +1542,7 @@
"message.collected-data": [ "message.collected-data": [
{ {
"type": 0, "type": 0,
"value": "Collected data" "value": "Цуглуулсан өгөгдөл"
} }
], ],
"message.confirm-delete": [ "message.confirm-delete": [
@ -1576,7 +1576,7 @@
"message.confirm-remove": [ "message.confirm-remove": [
{ {
"type": 0, "type": 0,
"value": "Are you sure you want to remove " "value": "Та "
}, },
{ {
"type": 1, "type": 1,
@ -1584,7 +1584,7 @@
}, },
{ {
"type": 0, "type": 0,
"value": "?" "value": "-г устгахдаа итгэлтэй байна уу?"
} }
], ],
"message.confirm-reset": [ "message.confirm-reset": [
@ -1604,7 +1604,7 @@
"message.delete-team-warning": [ "message.delete-team-warning": [
{ {
"type": 0, "type": 0,
"value": "Deleting a team will also delete all team websites." "value": "Баг устгах нь мөн түүнд харъяалагдах вебүүдийг устгах болно."
} }
], ],
"message.delete-website-warning": [ "message.delete-website-warning": [
@ -1806,25 +1806,25 @@
"message.transfer-team-website-to-user": [ "message.transfer-team-website-to-user": [
{ {
"type": 0, "type": 0,
"value": "Transfer this website to your account?" "value": "Энэ вебийг өөрийн бүртгэл рүү шилжүүлэх үү?"
} }
], ],
"message.transfer-user-website-to-team": [ "message.transfer-user-website-to-team": [
{ {
"type": 0, "type": 0,
"value": "Select the team to transfer this website to." "value": "Энэ вебийг шилжүүлж авах багийг сонгоно уу."
} }
], ],
"message.transfer-website": [ "message.transfer-website": [
{ {
"type": 0, "type": 0,
"value": "Transfer website ownership to your account or another team." "value": "Энэ вебийг өөрийн бүртгэл рүү эсвэл багт шилжүүлж авах."
} }
], ],
"message.triggered-event": [ "message.triggered-event": [
{ {
"type": 0, "type": 0,
"value": "Triggered event" "value": "Өдөөсөн үйлдэл"
} }
], ],
"message.user-deleted": [ "message.user-deleted": [
@ -1836,7 +1836,7 @@
"message.viewed-page": [ "message.viewed-page": [
{ {
"type": 0, "type": 0,
"value": "Viewed page" "value": "Үзсэн хуудас"
} }
], ],
"message.visitor-log": [ "message.visitor-log": [
@ -1876,7 +1876,7 @@
"message.visitors-dropped-off": [ "message.visitors-dropped-off": [
{ {
"type": 0, "type": 0,
"value": "Visitors dropped off" "value": "Зочдын уналт"
} }
] ]
} }

View file

@ -87,7 +87,7 @@ export async function POST(request: Request) {
return forbidden(); return forbidden();
} }
const sessionId = uuid(websiteId, hostname, ip, userAgent); const sessionId = uuid(websiteId, ip, userAgent);
// Find session // Find session
if (!clickhouse.enabled && !cache?.sessionId) { if (!clickhouse.enabled && !cache?.sessionId) {

View file

@ -10,7 +10,6 @@ export async function POST(request: Request) {
const schema = z.object({ const schema = z.object({
username: z.string().max(255), username: z.string().max(255),
password: z.string(), password: z.string(),
id: z.string().uuid(),
role: z.string().regex(/admin|user|view-only/i), role: z.string().regex(/admin|user|view-only/i),
}); });
@ -24,7 +23,7 @@ export async function POST(request: Request) {
return unauthorized(); return unauthorized();
} }
const { username, password, role, id } = body; const { username, password, role } = body;
const existingUser = await getUserByUsername(username, { showDeleted: true }); const existingUser = await getUserByUsername(username, { showDeleted: true });
@ -33,7 +32,7 @@ export async function POST(request: Request) {
} }
const user = await createUser({ const user = await createUser({
id: id || uuid(), id: uuid(),
username, username,
password: hashPassword(password), password: hashPassword(password),
role: role ?? ROLES.user, role: role ?? ROLES.user,

View file

@ -125,7 +125,7 @@ function getChannels(data: { domain: string; query: string; visitors: number }[]
const match = (value: string) => { const match = (value: string) => {
return (str: string | RegExp) => { return (str: string | RegExp) => {
return typeof str === 'string' ? value.includes(str) : (str as RegExp).test(value); return typeof str === 'string' ? value?.includes(str) : (str as RegExp).test(value);
}; };
}; };

View file

@ -1,145 +1,145 @@
{ {
"label.access-code": "Access code", "label.access-code": "Kode akses",
"label.actions": "Aksi", "label.actions": "Aksi",
"label.activity": "Activity log", "label.activity": "Catatan aktivitas",
"label.add": "Add", "label.add": "Tambah",
"label.add-description": "Add description", "label.add-description": "Tambah deskripsi",
"label.add-member": "Add member", "label.add-member": "Tambah anggota",
"label.add-step": "Add step", "label.add-step": "Tambah langkah",
"label.add-website": "Tambah situs web", "label.add-website": "Tambah situs web",
"label.admin": "Pengelola", "label.admin": "Pengelola",
"label.after": "After", "label.after": "Setelah",
"label.all": "Semua", "label.all": "Semua",
"label.all-time": "Semua waktu", "label.all-time": "Semua waktu",
"label.analytics": "Analytics", "label.analytics": "Analitik",
"label.average": "Average", "label.average": "Rata-rata",
"label.back": "Kembali", "label.back": "Kembali",
"label.before": "Before", "label.before": "Sebelum",
"label.bounce-rate": "Rasio pentalan", "label.bounce-rate": "Rasio pentalan",
"label.breakdown": "Breakdown", "label.breakdown": "Rincian",
"label.browser": "Browser", "label.browser": "Peramban",
"label.browsers": "Peramban", "label.browsers": "Peramban",
"label.cancel": "Batal", "label.cancel": "Batal",
"label.change-password": "Ganti kata sandi", "label.change-password": "Ganti kata sandi",
"label.cities": "Cities", "label.cities": "Kota",
"label.city": "City", "label.city": "Kota",
"label.clear-all": "Clear all", "label.clear-all": "Hapus semua",
"label.compare": "Compare", "label.compare": "Bandingkan",
"label.confirm": "Confirm", "label.confirm": "Konfirmasi",
"label.confirm-password": "Konfirmasi kata sandi", "label.confirm-password": "Konfirmasi kata sandi",
"label.contains": "Contains", "label.contains": "Mengandung",
"label.continue": "Continue", "label.continue": "Lanjutkan",
"label.count": "Count", "label.count": "Jumlah",
"label.countries": "Negara", "label.countries": "Negara",
"label.country": "Country", "label.country": "Negara",
"label.create": "Create", "label.create": "Buat",
"label.create-report": "Create report", "label.create-report": "Buat laporan",
"label.create-team": "Create team", "label.create-team": "Buat tim",
"label.create-user": "Create user", "label.create-user": "Buat pengguna",
"label.created": "Created", "label.created": "Dibuat",
"label.created-by": "Created By", "label.created-by": "Dibuat oleh",
"label.current": "Current", "label.current": "Saat ini",
"label.current-password": "Kata sandi sekarang", "label.current-password": "Kata sandi sekarang",
"label.custom-range": "Rentang khusus", "label.custom-range": "Rentang khusus",
"label.dashboard": "Dasbor", "label.dashboard": "Dasbor",
"label.data": "Data", "label.data": "Data",
"label.date": "Date", "label.date": "Tanggal",
"label.date-range": "Rentang tanggal", "label.date-range": "Rentang tanggal",
"label.day": "Day", "label.day": "Hari",
"label.default-date-range": "Rentang tanggal bawaan", "label.default-date-range": "Rentang tanggal bawaan",
"label.delete": "Hapus", "label.delete": "Hapus",
"label.delete-report": "Delete report", "label.delete-report": "Hapus laporan",
"label.delete-team": "Delete team", "label.delete-team": "Hapus tim",
"label.delete-user": "Delete user", "label.delete-user": "Hapus pengguna",
"label.delete-website": "Hapus situs web", "label.delete-website": "Hapus situs web",
"label.description": "Description", "label.description": "Deskripsi",
"label.desktop": "Desktop", "label.desktop": "Desktop",
"label.details": "Details", "label.details": "Detail",
"label.device": "Device", "label.device": "Perangkat",
"label.devices": "Perangkat", "label.devices": "Perangkat",
"label.dismiss": "Tutup", "label.dismiss": "Tutup",
"label.does-not-contain": "Does not contain", "label.does-not-contain": "Tidak mengandung",
"label.domain": "Domain", "label.domain": "Domain",
"label.dropoff": "Dropoff", "label.dropoff": "Penurunan",
"label.edit": "Sunting", "label.edit": "Sunting",
"label.edit-dashboard": "Edit dashboard", "label.edit-dashboard": "Sunting dasbor",
"label.edit-member": "Edit member", "label.edit-member": "Sunting anggota",
"label.enable-share-url": "Aktifkan URL berbagi", "label.enable-share-url": "Aktifkan URL berbagi",
"label.end-step": "End Step", "label.end-step": "Langkah akhir",
"label.entry": "Entry URL", "label.entry": "URL masuk",
"label.event": "Event", "label.event": "Peristiwa",
"label.event-data": "Event data", "label.event-data": "Data peristiwa",
"label.events": "Perihal", "label.events": "Peristiwa",
"label.exit": "Exit URL", "label.exit": "Exit URL",
"label.false": "False", "label.false": "Salah",
"label.field": "Field", "label.field": "Kolom",
"label.fields": "Fields", "label.fields": "Kolom",
"label.filter": "Filter", "label.filter": "Filter",
"label.filter-combined": "Gabungan", "label.filter-combined": "Gabungan",
"label.filter-raw": "Mentah", "label.filter-raw": "Mentah",
"label.filters": "Filters", "label.filters": "Filters",
"label.first-seen": "First seen", "label.first-seen": "Pertama kali dilihat",
"label.funnel": "Funnel", "label.funnel": "Funnel",
"label.funnel-description": "Understand the conversion and drop-off rate of users.", "label.funnel-description": "Pahami tingkat konversi dan penurunan pengguna.",
"label.goal": "Goal", "label.goal": "Tujuan",
"label.goals": "Goals", "label.goals": "Tujuan",
"label.goals-description": "Track your goals for pageviews and events.", "label.goals-description": "Lacak tujuan Anda untuk tampilan halaman dan peristiwa.",
"label.greater-than": "Greater than", "label.greater-than": "Lebih dari",
"label.greater-than-equals": "Greater than or equals", "label.greater-than-equals": "Lebih dari atau sama dengan",
"label.host": "Host", "label.host": "Host",
"label.hosts": "Hosts", "label.hosts": "Hosts",
"label.insights": "Insights", "label.insights": "Wawasan",
"label.insights-description": "Dive deeper into your data by using segments and filters.", "label.insights-description": "Jelajahi data Anda lebih dalam dengan menggunakan segmen dan filter.",
"label.is": "Is", "label.is": "Adalah",
"label.is-not": "Is not", "label.is-not": "Bukan",
"label.is-not-set": "Is not set", "label.is-not-set": "Tidak diatur",
"label.is-set": "Is set", "label.is-set": "Diatur",
"label.join": "Join", "label.join": "Gabung",
"label.join-team": "Join team", "label.join-team": "Gabung tim",
"label.journey": "Journey", "label.journey": "Perjalanan",
"label.journey-description": "Understand how users navigate through your website.", "label.journey-description": "Pahami bagaimana pengguna menavigasi situs web Anda.",
"label.language": "Bahasa", "label.language": "Bahasa",
"label.languages": "Bahasa", "label.languages": "Bahasa",
"label.laptop": "Laptop", "label.laptop": "Laptop",
"label.last-days": "{x} hari terakhir", "label.last-days": "{x} hari terakhir",
"label.last-hours": "{x} jam terakhir", "label.last-hours": "{x} jam terakhir",
"label.last-months": "Last {x} months", "label.last-months": "{x} bulan terakhir",
"label.last-seen": "Last seen", "label.last-seen": "Terakhir kali dilihat",
"label.leave": "Leave", "label.leave": "Keluar",
"label.leave-team": "Leave team", "label.leave-team": "Keluar dari tim",
"label.less-than": "Less than", "label.less-than": "Kurang dari",
"label.less-than-equals": "Less than or equals", "label.less-than-equals": "Kurang dari atau sama dengan",
"label.login": "Masuk", "label.login": "Masuk",
"label.logout": "Keluar", "label.logout": "Keluar",
"label.manage": "Manage", "label.manage": "Kelola",
"label.manager": "Manager", "label.manager": "Pengelola",
"label.max": "Max", "label.max": "Maks",
"label.member": "Member", "label.member": "Anggota",
"label.members": "Members", "label.members": "Anggota",
"label.min": "Min", "label.min": "Min",
"label.mobile": "Ponsel", "label.mobile": "Ponsel",
"label.more": "Lebih banyak", "label.more": "Lebih banyak",
"label.my-account": "My account", "label.my-account": "Akun saya",
"label.my-websites": "My websites", "label.my-websites": "Situs web saya",
"label.name": "Nama", "label.name": "Nama",
"label.new-password": "Kata sandi baru", "label.new-password": "Kata sandi baru",
"label.none": "None", "label.none": "Tidak ada",
"label.number-of-records": "{x} {x, plural, one {record} other {records}}", "label.number-of-records": "{x} {x, plural, one {record} other {records}}",
"label.ok": "OK", "label.ok": "OK",
"label.os": "OS", "label.os": "OS",
"label.overview": "Overview", "label.overview": "Tinjauan umum",
"label.owner": "Pemilik", "label.owner": "Pemilik",
"label.page-of": "Page {current} of {total}", "label.page-of": "Halaman {current} dari {total}",
"label.page-views": "Tampilan halaman", "label.page-views": "Tampilan halaman",
"label.pageTitle": "Page title", "label.pageTitle": "Judul halaman",
"label.pages": "Halaman", "label.pages": "Halaman",
"label.password": "Kata sandi", "label.password": "Kata sandi",
"label.path": "Path", "label.path": "Path",
"label.paths": "Paths", "label.paths": "Paths",
"label.powered-by": "Didukung oleh {name}", "label.powered-by": "Didukung oleh {name}",
"label.previous": "Previous", "label.previous": "Sebelumnya",
"label.previous-period": "Previous period", "label.previous-period": "Periode sebelumnya",
"label.previous-year": "Previous year", "label.previous-year": "Tahun lalu",
"label.profile": "Profil", "label.profile": "Profil",
"label.properties": "Properties", "label.properties": "Properties",
"label.property": "Property", "label.property": "Property",
@ -147,133 +147,133 @@
"label.query": "Query", "label.query": "Query",
"label.query-parameters": "Query parameters", "label.query-parameters": "Query parameters",
"label.realtime": "Waktu nyata", "label.realtime": "Waktu nyata",
"label.referrer": "Referrer", "label.referrer": "Perujuk",
"label.referrers": "Perujuk", "label.referrers": "Perujuk",
"label.refresh": "Segarkan", "label.refresh": "Segarkan",
"label.regenerate": "Regenerate", "label.regenerate": "Buat ulang",
"label.region": "Region", "label.region": "Wilayah",
"label.regions": "Regions", "label.regions": "Wilayah",
"label.remove": "Remove", "label.remove": "Hapus",
"label.remove-member": "Remove member", "label.remove-member": "Hapus anggota",
"label.reports": "Reports", "label.reports": "Laporan",
"label.required": "Wajib", "label.required": "Wajib",
"label.reset": "Atur ulang", "label.reset": "Atur ulang",
"label.reset-website": "Atur ulang statistik", "label.reset-website": "Atur ulang statistik",
"label.retention": "Retention", "label.retention": "Retensi",
"label.retention-description": "Measure your website stickiness by tracking how often users return.", "label.retention-description": "Ukur daya tarik situs web Anda dengan melacak seberapa sering pengguna kembali.",
"label.revenue": "Revenue", "label.revenue": "Pendapatan",
"label.revenue-description": "Look into your revenue across time.", "label.revenue-description": "Lihat pendapatan Anda seiring waktu.",
"label.revenue-property": "Revenue Property", "label.revenue-property": "Properti pendapatan",
"label.role": "Role", "label.role": "Role",
"label.run-query": "Run query", "label.run-query": "Run query",
"label.save": "Simpan", "label.save": "Simpan",
"label.screens": "Layar", "label.screens": "Layar",
"label.search": "Search", "label.search": "Cari",
"label.select": "Select", "label.select": "Pilih",
"label.select-date": "Select date", "label.select-date": "Pilih tanggal",
"label.select-role": "Select role", "label.select-role": "Pilih role",
"label.select-website": "Select website", "label.select-website": "Pilih situs web",
"label.session": "Session", "label.session": "Sesi",
"label.sessions": "Sessions", "label.sessions": "Sesi",
"label.settings": "Pengaturan", "label.settings": "Pengaturan",
"label.share-url": "Bagikan URL", "label.share-url": "Bagikan URL",
"label.single-day": "Sehari", "label.single-day": "Sehari",
"label.start-step": "Start Step", "label.start-step": "Langkah awal",
"label.steps": "Steps", "label.steps": "Langkah",
"label.sum": "Sum", "label.sum": "Sum",
"label.tablet": "Tablet", "label.tablet": "Tablet",
"label.team": "Team", "label.team": "Tim",
"label.team-id": "Team ID", "label.team-id": "ID tim",
"label.team-manager": "Team manager", "label.team-manager": "Pengelola tim",
"label.team-member": "Team member", "label.team-member": "Anggota tim",
"label.team-name": "Team name", "label.team-name": "Nama tim",
"label.team-owner": "Team owner", "label.team-owner": "Pemilik tim",
"label.team-view-only": "Team view only", "label.team-view-only": "Team view only",
"label.team-websites": "Team websites", "label.team-websites": "Situs web tim",
"label.teams": "Teams", "label.teams": "Tim",
"label.theme": "Tema", "label.theme": "Tema",
"label.this-month": "Bulan ini", "label.this-month": "Bulan ini",
"label.this-week": "Minggu ini", "label.this-week": "Minggu ini",
"label.this-year": "Tahun ini", "label.this-year": "Tahun ini",
"label.timezone": "Zona waktu", "label.timezone": "Zona waktu",
"label.title": "Title", "label.title": "Judul",
"label.today": "Hari ini", "label.today": "Hari ini",
"label.toggle-charts": "Buka grafik", "label.toggle-charts": "Buka grafik",
"label.total": "Total", "label.total": "Total",
"label.total-records": "Total records", "label.total-records": "Total baris",
"label.tracking-code": "Kode lacak", "label.tracking-code": "Kode lacak",
"label.transactions": "Transactions", "label.transactions": "Transaksi",
"label.transfer": "Transfer", "label.transfer": "Transfer",
"label.transfer-website": "Transfer website", "label.transfer-website": "Transfer situs web",
"label.true": "True", "label.true": "Benar",
"label.type": "Type", "label.type": "Tipe",
"label.unique": "Unique", "label.unique": "Unik",
"label.unique-visitors": "Pengunjung unik", "label.unique-visitors": "Pengunjung unik",
"label.uniqueCustomers": "Unique Customers", "label.uniqueCustomers": "Kustomer unik",
"label.unknown": "Tidak diketahui", "label.unknown": "Tidak diketahui",
"label.untitled": "Untitled", "label.untitled": "Tanpa judul",
"label.update": "Update", "label.update": "Perbarui",
"label.url": "URL", "label.url": "URL",
"label.urls": "URLs", "label.urls": "URLs",
"label.user": "User", "label.user": "Pengguna",
"label.user-property": "User Property", "label.user-property": "User Property",
"label.username": "Nama pengguna", "label.username": "Nama pengguna",
"label.users": "Users", "label.users": "Pengguna",
"label.utm": "UTM", "label.utm": "UTM",
"label.utm-description": "Track your campaigns through UTM parameters.", "label.utm-description": "Lacak kampanye Anda melalui parameter UTM.",
"label.value": "Value", "label.value": "Nilai",
"label.view": "View", "label.view": "Lihat",
"label.view-details": "Lihat Detil", "label.view-details": "Lihat Detil",
"label.view-only": "View only", "label.view-only": "Hanya melihat",
"label.views": "Tampilan", "label.views": "Tampilan",
"label.views-per-visit": "Views per visit", "label.views-per-visit": "Tampilan per kunjungan",
"label.visit-duration": "Waktu kunjungan rata-rata", "label.visit-duration": "Waktu kunjungan rata-rata",
"label.visitors": "Pengunjung", "label.visitors": "Pengunjung",
"label.visits": "Visits", "label.visits": "Kunjungan",
"label.website": "Website", "label.website": "Situs web",
"label.website-id": "Website ID", "label.website-id": "ID situs web",
"label.websites": "Situs web", "label.websites": "Situs web",
"label.window": "Window", "label.window": "Window",
"label.yesterday": "Yesterday", "label.yesterday": "Kemarin",
"message.action-confirmation": "Type {confirmation} in the box below to confirm.", "message.action-confirmation": "Ketik {confirmation} pada kotak di bawah untuk mengonfirmasi.",
"message.active-users": "{x} pengunjung saat ini", "message.active-users": "{x} pengunjung saat ini",
"message.collected-data": "Collected data", "message.collected-data": "Data dikumpulkan",
"message.confirm-delete": "Apakah kamu yakin ingin menghapus {target}?", "message.confirm-delete": "Apakah kamu yakin ingin menghapus {target}?",
"message.confirm-leave": "Are you sure you want to leave {target}?", "message.confirm-leave": "Apakah Anda yakin ingin meninggalkan {target}?",
"message.confirm-remove": "Are you sure you want to remove {target}?", "message.confirm-remove": "Apakah Anda yakin ingin menghapus {target}?",
"message.confirm-reset": "Anda yakin ingin mengatur ulang statistik {target}?", "message.confirm-reset": "Anda yakin ingin mengatur ulang statistik {target}?",
"message.delete-team-warning": "Deleting a team will also delete all team websites.", "message.delete-team-warning": "Menghapus tim juga akan menghapus semua situs web yang terkait.",
"message.delete-website-warning": "Semua data terkait juga akan dihapus.", "message.delete-website-warning": "Semua data terkait juga akan dihapus.",
"message.error": "Ada yang salah.", "message.error": "Ada yang salah.",
"message.event-log": "{event} on {url}", "message.event-log": "{event} on {url}",
"message.go-to-settings": "Pergi ke pengaturan", "message.go-to-settings": "Pergi ke pengaturan",
"message.incorrect-username-password": "Nama pengguna/kata sandi salah.", "message.incorrect-username-password": "Nama pengguna/kata sandi salah.",
"message.invalid-domain": "Domain tidak valid", "message.invalid-domain": "Domain tidak valid",
"message.min-password-length": "Minimum length of {n} characters", "message.min-password-length": "Minimal {n} karakter",
"message.new-version-available": "A new version of Umami {version} is available!", "message.new-version-available": "Versi baru dari Umami {version} telah tersedia!",
"message.no-data-available": "Tidak ada data.", "message.no-data-available": "Tidak ada data.",
"message.no-event-data": "No event data is available.", "message.no-event-data": "Tidak ada data peristiwa",
"message.no-match-password": "Kata sandi tidak cocok", "message.no-match-password": "Kata sandi tidak cocok",
"message.no-results-found": "No results were found.", "message.no-results-found": "Tidak ada hasil yang ditemukan.",
"message.no-team-websites": "This team does not have any websites.", "message.no-team-websites": "Tim ini tidak memiliki situs web.",
"message.no-teams": "You have not created any teams.", "message.no-teams": "Anda belum membuat tim.",
"message.no-users": "There are no users.", "message.no-users": "Tidak ada pengguna.",
"message.no-websites-configured": "Anda tidak memiliki situs web yang dikonfigurasi.", "message.no-websites-configured": "Anda tidak memiliki situs web yang dikonfigurasi.",
"message.page-not-found": "Halaman tidak ditemukan.", "message.page-not-found": "Halaman tidak ditemukan.",
"message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.", "message.reset-website": "Untuk mengatur ulang situs web ini, ketik {confirmation} pada kotak di bawah untuk mengonfirmasi.",
"message.reset-website-warning": "Semua statistik pada website ini akan dihapus, tetapi kode lacak akan tetap terpasang", "message.reset-website-warning": "Semua statistik pada situs web ini akan dihapus, tetapi kode lacak akan tetap terpasang",
"message.saved": "Berhasil disimpan.", "message.saved": "Berhasil disimpan.",
"message.share-url": "Ini adalah URL yang dibagikan secara publik untuk {target}.", "message.share-url": "Ini adalah URL yang dibagikan secara publik untuk {target}.",
"message.team-already-member": "You are already a member of the team.", "message.team-already-member": "Anda sudah menjadi anggota tim ini.",
"message.team-not-found": "Team not found.", "message.team-not-found": "Tim tidak ditemukan.",
"message.team-websites-info": "Websites can be viewed by anyone on the team.", "message.team-websites-info": "Situs web dapat dilihat oleh semua anggota tim.",
"message.tracking-code": "Kode lacak", "message.tracking-code": "Kode lacak",
"message.transfer-team-website-to-user": "Transfer this website to your account?", "message.transfer-team-website-to-user": "Transfer situs web ini ke akun Anda?",
"message.transfer-user-website-to-team": "Select the team to transfer this website to.", "message.transfer-user-website-to-team": "Pilih tim tujuan untuk mentransfer situs web ini.",
"message.transfer-website": "Transfer website ownership to your account or another team.", "message.transfer-website": "Transfer kepemilikan situs web ke akun Anda atau tim lain",
"message.triggered-event": "Triggered event", "message.triggered-event": "Peristiwa terjadi",
"message.user-deleted": "User deleted.", "message.user-deleted": "Pengguna telah dihapus.",
"message.viewed-page": "Viewed page", "message.viewed-page": "Halaman dilihat",
"message.visitor-log": "Pengunjung dari {country} dengan {browser} di {device} {os}", "message.visitor-log": "Pengunjung dari {country} dengan {browser} di {device} {os}",
"message.visitors-dropped-off": "Visitors dropped off" "message.visitors-dropped-off": "Pengunjung yang meninggalkan situs web"
} }

View file

@ -86,13 +86,13 @@ function decodeHeader(s: string | undefined | null): string | undefined | null {
return Buffer.from(s, 'latin1').toString('utf-8'); return Buffer.from(s, 'latin1').toString('utf-8');
} }
export async function getLocation(ip: string = '', headers: Headers) { export async function getLocation(ip: string = '', headers: Headers, hasPayloadIP: boolean) {
// Ignore local ips // Ignore local ips
if (await isLocalhost(ip)) { if (await isLocalhost(ip)) {
return; return;
} }
if (!process.env.SKIP_LOCATION_HEADERS) { if (!hasPayloadIP && !process.env.SKIP_LOCATION_HEADERS) {
// Cloudflare headers // Cloudflare headers
if (headers.get('cf-ipcountry')) { if (headers.get('cf-ipcountry')) {
const country = decodeHeader(headers.get('cf-ipcountry')); const country = decodeHeader(headers.get('cf-ipcountry'));
@ -147,7 +147,7 @@ export async function getLocation(ip: string = '', headers: Headers) {
export async function getClientInfo(request: Request, payload: Record<string, any>) { export async function getClientInfo(request: Request, payload: Record<string, any>) {
const userAgent = payload?.userAgent || request.headers.get('user-agent'); const userAgent = payload?.userAgent || request.headers.get('user-agent');
const ip = payload?.ip || getIpAddress(request.headers); const ip = payload?.ip || getIpAddress(request.headers);
const location = await getLocation(ip, request.headers); const location = await getLocation(ip, request.headers, !!payload?.ip);
const country = payload?.userAgent || location?.country; const country = payload?.userAgent || location?.country;
const subdivision1 = location?.subdivision1; const subdivision1 = location?.subdivision1;
const subdivision2 = location?.subdivision2; const subdivision2 = location?.subdivision2;