From c480a971d313a20952a264f487c67f63f528a21f Mon Sep 17 00:00:00 2001 From: Konstantin Tutsch Date: Sat, 24 Aug 2024 08:58:38 +0200 Subject: [PATCH 01/16] Update German translation Improvements to previous translation New translations for 8ee37d124656f16ac94835e7151d01c5e2566540 --- src/lang/de-DE.json | 54 ++++++++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/src/lang/de-DE.json b/src/lang/de-DE.json index 5151910533..e9a726eb43 100644 --- a/src/lang/de-DE.json +++ b/src/lang/de-DE.json @@ -67,8 +67,8 @@ "label.enable-share-url": "Freigabe-URL aktivieren", "label.end-step": "Schlussschritt", "label.entry": "Eintrags-URL", - "label.event": "Event", - "label.event-data": "Eventdaten", + "label.event": "Ereigniss", + "label.event-data": "Ereignissdaten", "label.events": "Ereignisse", "label.exit": "Ausgangs-URL", "label.false": "Falsch", @@ -78,9 +78,9 @@ "label.filter-combined": "Kombiniert", "label.filter-raw": "Rohdaten", "label.filters": "Filter", - "label.first-seen": "First seen", - "label.funnel": "Funnel", - "label.funnel-description": "Verstehe die Konversions- und Abbruchrate der Nutzer.", + "label.first-seen": "Erstmalig gesehen", + "label.funnel": "Trichter", + "label.funnel-description": "Verstehen Sie die Konversions- und Absprungrate Ihrer Nutzer.", "label.goal": "Ziel", "label.goals": "Ziele", "label.goals-description": "Verfolgen Sie Ihre Ziele für Seitenaufrufe und Ereignisse.", @@ -89,7 +89,7 @@ "label.host": "Host", "label.hosts": "Hosts", "label.insights": "Einblicke", - "label.insights-description": "Vertiefen Sie Ihre Daten mit Hilfe von Segmenten und Filtern.", + "label.insights-description": "Vertiefen Sie sich mit Hilfe von Segmenten und Filtern in Ihre Daten.", "label.is": "Ist", "label.is-not": "Ist nicht", "label.is-not-set": "Ist nicht gesetzt", @@ -97,14 +97,14 @@ "label.join": "Beitreten", "label.join-team": "Team beitreten", "label.journey": "Reise", - "label.journey-description": "Verstehe, wie Nutzer auf der Webseite navigieren", + "label.journey-description": "Verstehen Sie, wie Nutzer auf Ihrer Webseite navigieren.", "label.language": "Sprache", "label.languages": "Sprachen", "label.laptop": "Laptop", "label.last-days": "Letzten {x} Tage", "label.last-hours": "Letzten {x} Stunden", "label.last-months": "Letzten {x} Monate", - "label.last-seen": "Last seen", + "label.last-seen": "Zuletzt gesehen", "label.leave": "Verlassen", "label.leave-team": "Team verlassen", "label.less-than": "Kleiner als", @@ -134,21 +134,21 @@ "label.pageTitle": "Seitentitel", "label.pages": "Seiten", "label.password": "Passwort", - "label.path": "Path", - "label.paths": "Paths", + "label.path": "Pfad", + "label.paths": "Pfade", "label.powered-by": "Betrieben durch {name}", - "label.previous": "Vorheriges", + "label.previous": "Vorherig", "label.previous-period": "Vorherige Periode", "label.previous-year": "Vorheriges Jahr", "label.profile": "Profil", - "label.properties": "Properties", + "label.properties": "Eigenschaften", "label.property": "Eigentum", "label.queries": "Abfragen", "label.query": "Abfrage", "label.query-parameters": "Abfrageparameter", "label.realtime": "Echtzeit", - "label.referrer": "Referrer", - "label.referrers": "Referrer", + "label.referrer": "Übermittler", + "label.referrers": "Übermittler", "label.refresh": "Aktualisieren", "label.regenerate": "Erneuern", "label.region": "Region", @@ -159,11 +159,11 @@ "label.required": "Erforderlich", "label.reset": "Zurücksetzen", "label.reset-website": "Statistik zurücksetzen", - "label.retention": "Bewahrung", + "label.retention": "Erhalt", "label.retention-description": "Messen Sie die Verweildauer auf Ihrer Website, indem Sie verfolgen, wie oft die Nutzer zurückkehren.", - "label.revenue": "Revenue", - "label.revenue-description": "Look into your revenue across time.", - "label.revenue-property": "Revenue Property", + "label.revenue": "Umsatz", + "label.revenue-description": "Haben Sie einen Blick auf Ihre Umsätze im Laufe der Zeit.", + "label.revenue-property": "Umsatzeigenschaften", "label.role": "Rolle", "label.run-query": "Abfrage starten", "label.save": "Speichern", @@ -173,7 +173,7 @@ "label.select-date": "Datum auswählen", "label.select-role": "Rolle auswählen", "label.select-website": "Webseite auswählen", - "label.session": "Session", + "label.session": "Sitzung", "label.sessions": "Sitzungen", "label.settings": "Einstellungen", "label.share-url": "Freigabe-URL", @@ -202,25 +202,25 @@ "label.total": "Gesamt", "label.total-records": "Datensätze insgesamt", "label.tracking-code": "Tracking Code", - "label.transactions": "Transactions", + "label.transactions": "Transaktionen", "label.transfer": "Übertragung", "label.transfer-website": "Website übertragen", "label.true": "Wahr", "label.type": "Typ", - "label.unique": "Eindeutig", - "label.unique-visitors": "Eindeutige Besucher", - "label.uniqueCustomers": "Unique Customers", + "label.unique": "Einzigartig", + "label.unique-visitors": "Einzigartige Besucher", + "label.uniqueCustomers": "Einzigartige Kunden", "label.unknown": "Unbekannt", "label.untitled": "Unbenannt", "label.update": "Update", "label.url": "URL", "label.urls": "URLs", "label.user": "Benutzer", - "label.user-property": "User Property", + "label.user-property": "Benutzereigenschaften", "label.username": "Benutzername", "label.users": "Benutzer", "label.utm": "UTM", - "label.utm-description": "Tracke deine Kampagnen mit UTM parameterns.", + "label.utm-description": "Tracken Sie Ihre Kampagnen mit UTM Parametern.", "label.value": "Wert", "label.view": "Anzeigen", "label.view-details": "Details anzeigen", @@ -271,9 +271,9 @@ "message.transfer-team-website-to-user": "Diese Webseite zu deinem Account transferieren?", "message.transfer-user-website-to-team": "Wähle ein Team aus, zu dem die Webseite transferiert werden soll.", "message.transfer-website": "Übertrage die Eigentümerrechte zu deinem Account oder einem anderen Team.", - "message.triggered-event": "Ausgelöstes Event", + "message.triggered-event": "Ausgelöstes Ereigniss", "message.user-deleted": "Benutzer gelöscht.", - "message.viewed-page": "Besuchte Seite", + "message.viewed-page": "Seite besucht", "message.visitor-log": "Besucher aus {country} benutzt {browser} auf {os} {device}", "message.visitors-dropped-off": "Besucherverlust" } From 633b26315ee39a4c390002110c7d7e64985f32a6 Mon Sep 17 00:00:00 2001 From: Konstantin Tutsch Date: Sat, 24 Aug 2024 09:05:30 +0200 Subject: [PATCH 02/16] Fix use of Website and Webseite in German translation See https://www.duden.de/sprachwissen/sprachratgeber/website-oder-webseite for further details. --- src/lang/de-DE.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/lang/de-DE.json b/src/lang/de-DE.json index e9a726eb43..33d6578d6e 100644 --- a/src/lang/de-DE.json +++ b/src/lang/de-DE.json @@ -97,7 +97,7 @@ "label.join": "Beitreten", "label.join-team": "Team beitreten", "label.journey": "Reise", - "label.journey-description": "Verstehen Sie, wie Nutzer auf Ihrer Webseite navigieren.", + "label.journey-description": "Verstehen Sie, wie Nutzer auf Ihrer Website navigieren.", "label.language": "Sprache", "label.languages": "Sprachen", "label.laptop": "Laptop", @@ -120,7 +120,7 @@ "label.mobile": "Handy", "label.more": "Mehr", "label.my-account": "Mein Account", - "label.my-websites": "Meine Webseiten", + "label.my-websites": "Meine Websites", "label.name": "Name", "label.new-password": "Neues Passwort", "label.none": "Keine", @@ -172,7 +172,7 @@ "label.select": "Auswählen", "label.select-date": "Datum auswählen", "label.select-role": "Rolle auswählen", - "label.select-website": "Webseite auswählen", + "label.select-website": "Website auswählen", "label.session": "Sitzung", "label.sessions": "Sitzungen", "label.settings": "Einstellungen", @@ -230,9 +230,9 @@ "label.visit-duration": "Durchschn. Besuchszeit", "label.visitors": "Besucher", "label.visits": "Besuche", - "label.website": "Webseite", - "label.website-id": "Webseiten-ID", - "label.websites": "Webseiten", + "label.website": "Website", + "label.website-id": "Website-ID", + "label.websites": "Websites", "label.window": "Fenster", "label.yesterday": "Gestern", "message.action-confirmation": "Schreibe {confirmation} in die Box zur bestätigung.", @@ -242,7 +242,7 @@ "message.confirm-leave": "Sind Sie sicher, dass die {target} verlassen möchten?", "message.confirm-remove": "Sind Sie sicher, {target} zu entfernen?", "message.confirm-reset": "Sind Sie sicher, dass Sie die Statistiken von {target} zurücksetzen wollen?", - "message.delete-team-warning": "Ein Team zu löschen, wird auch alle Team-Webseiten löschen.", + "message.delete-team-warning": "Ein Team zu löschen, wird auch alle Team-Websiten löschen.", "message.delete-website-warning": "Alle zugehörigen Daten werden ebenfalls gelöscht.", "message.error": "Es ist ein Fehler aufgetreten.", "message.event-log": "{event} auf {url}", @@ -268,8 +268,8 @@ "message.team-not-found": "Team nicht gefunden.", "message.team-websites-info": "Websites können von jedem im Team eingesehen werden.", "message.tracking-code": "Tracking Code", - "message.transfer-team-website-to-user": "Diese Webseite zu deinem Account transferieren?", - "message.transfer-user-website-to-team": "Wähle ein Team aus, zu dem die Webseite transferiert werden soll.", + "message.transfer-team-website-to-user": "Diese Website zu deinem Account transferieren?", + "message.transfer-user-website-to-team": "Wähle ein Team aus, zu dem die Website transferiert werden soll.", "message.transfer-website": "Übertrage die Eigentümerrechte zu deinem Account oder einem anderen Team.", "message.triggered-event": "Ausgelöstes Ereigniss", "message.user-deleted": "Benutzer gelöscht.", From 50bdc234257a6196ac09184835117a80caf17709 Mon Sep 17 00:00:00 2001 From: Konstantin Tutsch Date: Sat, 24 Aug 2024 09:12:53 +0200 Subject: [PATCH 03/16] Remove occasional informal address from German translation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Consistent use of “Siezen” (addressing the use formally/polite) --- src/lang/de-DE.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lang/de-DE.json b/src/lang/de-DE.json index 33d6578d6e..9946bbec43 100644 --- a/src/lang/de-DE.json +++ b/src/lang/de-DE.json @@ -242,7 +242,7 @@ "message.confirm-leave": "Sind Sie sicher, dass die {target} verlassen möchten?", "message.confirm-remove": "Sind Sie sicher, {target} zu entfernen?", "message.confirm-reset": "Sind Sie sicher, dass Sie die Statistiken von {target} zurücksetzen wollen?", - "message.delete-team-warning": "Ein Team zu löschen, wird auch alle Team-Websiten löschen.", + "message.delete-team-warning": "Ein Team zu löschen, wird auch alle Team-Websites löschen.", "message.delete-website-warning": "Alle zugehörigen Daten werden ebenfalls gelöscht.", "message.error": "Es ist ein Fehler aufgetreten.", "message.event-log": "{event} auf {url}", @@ -268,9 +268,9 @@ "message.team-not-found": "Team nicht gefunden.", "message.team-websites-info": "Websites können von jedem im Team eingesehen werden.", "message.tracking-code": "Tracking Code", - "message.transfer-team-website-to-user": "Diese Website zu deinem Account transferieren?", - "message.transfer-user-website-to-team": "Wähle ein Team aus, zu dem die Website transferiert werden soll.", - "message.transfer-website": "Übertrage die Eigentümerrechte zu deinem Account oder einem anderen Team.", + "message.transfer-team-website-to-user": "Diese Website zu Ihrem Account transferieren?", + "message.transfer-user-website-to-team": "Wählen Sie ein Team aus, zu dem die Website transferiert werden soll.", + "message.transfer-website": "Übertragen Sie die Eigentümerrechte zu Ihrem Account oder einem anderen Team.", "message.triggered-event": "Ausgelöstes Ereigniss", "message.user-deleted": "Benutzer gelöscht.", "message.viewed-page": "Seite besucht", From e0334380237fb77571b518dfade6cfcac6396eea Mon Sep 17 00:00:00 2001 From: Konstantin Tutsch Date: Sat, 24 Aug 2024 09:16:04 +0200 Subject: [PATCH 04/16] Fix various errors in German translation --- src/lang/de-DE.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lang/de-DE.json b/src/lang/de-DE.json index 9946bbec43..dfbb9a47e0 100644 --- a/src/lang/de-DE.json +++ b/src/lang/de-DE.json @@ -66,7 +66,7 @@ "label.edit-member": "Mitglied bearbeiten", "label.enable-share-url": "Freigabe-URL aktivieren", "label.end-step": "Schlussschritt", - "label.entry": "Eintrags-URL", + "label.entry": "Eingangs-URL", "label.event": "Ereigniss", "label.event-data": "Ereignissdaten", "label.events": "Ereignisse", @@ -188,7 +188,7 @@ "label.team-member": "Team-Mitglied", "label.team-name": "Name des Teams", "label.team-owner": "Team-Eigentümer", - "label.team-view-only": "Nur für Team sichtbar", + "label.team-view-only": "Nur für Team-Mitglieder sichtbar", "label.team-websites": "Team-Websites", "label.teams": "Teams", "label.theme": "Thema", From 83cfc659dfd5a04673b0e502abcd3f701aed6207 Mon Sep 17 00:00:00 2001 From: Gerard Nesta Date: Sat, 24 Aug 2024 09:27:32 +0200 Subject: [PATCH 05/16] Update ca-ES.json --- src/lang/ca-ES.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lang/ca-ES.json b/src/lang/ca-ES.json index dd249d4a92..3b6333379a 100644 --- a/src/lang/ca-ES.json +++ b/src/lang/ca-ES.json @@ -184,7 +184,7 @@ "label.tablet": "Tauleta", "label.team": "Equip", "label.team-id": "ID del equip", - "label.team-manager": "Responsable d'Equip", + "label.team-manager": "Responsable d'equip", "label.team-member": "Membre de l'equip", "label.team-name": "Nom de l'equip", "label.team-owner": "Propietari de l'equip", From a219f5dbe3cea44a29ba96c0a4fb2314cb66128b Mon Sep 17 00:00:00 2001 From: Francis Cao Date: Mon, 26 Aug 2024 10:36:07 -0700 Subject: [PATCH 06/16] pass timezone in stats CH query --- src/queries/analytics/pageviews/getPageviewStats.ts | 6 +++--- src/queries/analytics/sessions/getSessionStats.ts | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/queries/analytics/pageviews/getPageviewStats.ts b/src/queries/analytics/pageviews/getPageviewStats.ts index 96e9f1e131..2230da91d5 100644 --- a/src/queries/analytics/pageviews/getPageviewStats.ts +++ b/src/queries/analytics/pageviews/getPageviewStats.ts @@ -41,7 +41,7 @@ async function clickhouseQuery( websiteId: string, filters: QueryFilters, ): Promise<{ x: string; y: number }[]> { - const { unit = 'day' } = filters; + const { timezone = 'utc', unit = 'day' } = filters; const { parseFilters, rawQuery } = clickhouse; const { filterQuery, params } = await parseFilters(websiteId, { ...filters, @@ -57,7 +57,7 @@ async function clickhouseQuery( g.y as y from ( select - date_trunc('${unit}', created_at) as t, + date_trunc('${unit}', created_at, '${timezone}') as t, count(*) as y from website_event where website_id = {websiteId:UUID} @@ -75,7 +75,7 @@ async function clickhouseQuery( g.y as y from ( select - date_trunc('${unit}', created_at) as t, + date_trunc('${unit}', created_at, '${timezone}') as t, sum(views)as y from website_event_stats_hourly website_event where website_id = {websiteId:UUID} diff --git a/src/queries/analytics/sessions/getSessionStats.ts b/src/queries/analytics/sessions/getSessionStats.ts index 8fde94f379..bddebcec10 100644 --- a/src/queries/analytics/sessions/getSessionStats.ts +++ b/src/queries/analytics/sessions/getSessionStats.ts @@ -41,7 +41,7 @@ async function clickhouseQuery( websiteId: string, filters: QueryFilters, ): Promise<{ x: string; y: number }[]> { - const { unit = 'day' } = filters; + const { timezone = 'utc', unit = 'day' } = filters; const { parseFilters, rawQuery } = clickhouse; const { filterQuery, params } = await parseFilters(websiteId, { ...filters, @@ -57,7 +57,7 @@ async function clickhouseQuery( g.y as y from ( select - date_trunc('${unit}', created_at) as t, + date_trunc('${unit}', created_at, '${timezone}') as t, count(distinct session_id) as y from website_event where website_id = {websiteId:UUID} @@ -75,7 +75,7 @@ async function clickhouseQuery( g.y as y from ( select - date_trunc('${unit}', created_at) as t, + date_trunc('${unit}', created_at, '${timezone}') as t, uniq(session_id) as y from website_event_stats_hourly website_event where website_id = {websiteId:UUID} From 0f93f183642c0daae5ad97ff009c8406886b29ca Mon Sep 17 00:00:00 2001 From: Minseo Lee Date: Mon, 26 Aug 2024 21:45:35 +0900 Subject: [PATCH 07/16] Update ko-KR.json --- src/lang/ko-KR.json | 142 ++++++++++++++++++++++---------------------- 1 file changed, 71 insertions(+), 71 deletions(-) diff --git a/src/lang/ko-KR.json b/src/lang/ko-KR.json index 8a2de47b14..07494d93f9 100644 --- a/src/lang/ko-KR.json +++ b/src/lang/ko-KR.json @@ -1,7 +1,7 @@ { "label.access-code": "액세스 코드", - "label.actions": "액션", - "label.activity": "활동 기록", + "label.actions": "동작", + "label.activity": "활동", "label.add": "추가", "label.add-description": "설명 추가", "label.add-member": "멤버 추가", @@ -20,7 +20,7 @@ "label.browser": "브라우저", "label.browsers": "브라우저", "label.cancel": "취소", - "label.change-password": "비밀번호 변경하기", + "label.change-password": "비밀번호 변경", "label.cities": "도시", "label.city": "도시", "label.clear-all": "모두 지우기", @@ -32,10 +32,10 @@ "label.count": "수", "label.countries": "국가", "label.country": "국가", - "label.create": "생성", - "label.create-report": "리포트 생성", - "label.create-team": "팀 생성", - "label.create-user": "사용자 생성", + "label.create": "만들기", + "label.create-report": "보고서 만들기", + "label.create-team": "팀 만들기", + "label.create-user": "사용자 만들기", "label.created": "생성됨", "label.created-by": "작성자", "label.current": "현재", @@ -48,13 +48,13 @@ "label.day": "일", "label.default-date-range": "기본 날짜 범위", "label.delete": "삭제", - "label.delete-report": "리포트 삭제", + "label.delete-report": "보고서 삭제", "label.delete-team": "팀 삭제", "label.delete-user": "사용자 삭제", "label.delete-website": "웹사이트 삭제", "label.description": "설명", - "label.desktop": "데스크탑", - "label.details": "세부 사항", + "label.desktop": "데스크톱", + "label.details": "세부 정보", "label.device": "기기", "label.devices": "기기", "label.dismiss": "무시하기", @@ -63,9 +63,9 @@ "label.dropoff": "이탈", "label.edit": "편집", "label.edit-dashboard": "대시보드 편집", - "label.edit-member": "회원 편집", + "label.edit-member": "멤버 편집", "label.enable-share-url": "URL 공유 활성화", - "label.end-step": "종료 단계", + "label.end-step": "마지막 단계", "label.entry": "입장 URL", "label.event": "이벤트", "label.event-data": "이벤트 데이터", @@ -75,15 +75,15 @@ "label.field": "필드", "label.fields": "필드", "label.filter": "필터", - "label.filter-combined": "합쳐서 보기", + "label.filter-combined": "합쳐 보기", "label.filter-raw": "전체 보기", "label.filters": "필터", - "label.first-seen": "First seen", + "label.first-seen": "첫 접속", "label.funnel": "퍼널", "label.funnel-description": "사용자 전환율 및 이탈률을 살펴보세요.", "label.goal": "목표", "label.goals": "목표", - "label.goals-description": "페이지뷰 및 이벤트 목표를 추적합니다.", + "label.goals-description": "페이지 조회 및 이벤트 목표를 추적합니다.", "label.greater-than": "이상", "label.greater-than-equals": "이상", "label.host": "호스트", @@ -94,17 +94,17 @@ "label.is-not": "해당하지 않음", "label.is-not-set": "설정되지 않음", "label.is-set": "설정됨", - "label.join": "가입", - "label.join-team": "팀 가입", + "label.join": "가입하기", + "label.join-team": "팀 가입하기", "label.journey": "여정", "label.journey-description": "사용자가 웹사이트를 탐색하는 경로를 살펴보세요.", "label.language": "언어", "label.languages": "언어", "label.laptop": "노트북", - "label.last-days": "최근 {x} 일", - "label.last-hours": "최근 {x} 시간", - "label.last-months": "최근 {x} 개월", - "label.last-seen": "Last seen", + "label.last-days": "지난 {x}일", + "label.last-hours": "지난 {x}시간", + "label.last-months": "지난 {x}개월", + "label.last-seen": "마지막 접속", "label.leave": "떠나기", "label.leave-team": "팀 떠나기", "label.less-than": "미만", @@ -124,56 +124,56 @@ "label.name": "이름", "label.new-password": "새 비밀번호", "label.none": "없음", - "label.number-of-records": "{x} {x, plural, one {record} other {레코드}}", + "label.number-of-records": "{x}개 레코드", "label.ok": "확인", - "label.os": "운영체제", + "label.os": "운영 체제", "label.overview": "개요", "label.owner": "소유자", - "label.page-of": "{total} 중 {current} 페이지", - "label.page-views": "페이지 뷰", + "label.page-of": "페이지 {current}/{total}", + "label.page-views": "페이지 조회", "label.pageTitle": "페이지 제목", "label.pages": "페이지", "label.password": "비밀번호", - "label.path": "Path", - "label.paths": "Paths", - "label.powered-by": "이 시스템은 {name}에서 구동되고 있습니다.", + "label.path": "패스", + "label.paths": "패스", + "label.powered-by": "Powered by {name}", "label.previous": "이전", "label.previous-period": "이전 기간", "label.previous-year": "이전 연도", "label.profile": "프로필", - "label.properties": "Properties", + "label.properties": "속성", "label.property": "속성", "label.queries": "쿼리", "label.query": "쿼리", - "label.query-parameters": "쿼리 매개변수", + "label.query-parameters": "쿼리 매개 변수", "label.realtime": "실시간", "label.referrer": "리퍼러", "label.referrers": "리퍼러", - "label.refresh": "새로고침", + "label.refresh": "새로 고침", "label.regenerate": "다시 생성", "label.region": "지역", "label.regions": "지역", "label.remove": "제거", "label.remove-member": "멤버 제거", - "label.reports": "리포트", + "label.reports": "보고서", "label.required": "필수", - "label.reset": "리셋", + "label.reset": "초기화", "label.reset-website": "웹사이트 초기화", "label.retention": "리텐션", "label.retention-description": "사용자가 얼마나 자주 돌아오는지를 추적하여 웹사이트의 리텐션을 측정하십시오.", - "label.revenue": "Revenue", - "label.revenue-description": "Look into your revenue across time.", - "label.revenue-property": "Revenue Property", + "label.revenue": "수익", + "label.revenue-description": "시간대별 수익을 살펴보세요.", + "label.revenue-property": "수익 속성", "label.role": "역할", "label.run-query": "쿼리 실행", "label.save": "저장", - "label.screens": "스크린", + "label.screens": "화면", "label.search": "검색", "label.select": "선택", "label.select-date": "날짜 선택", "label.select-role": "역할 선택", "label.select-website": "웹사이트 선택", - "label.session": "Session", + "label.session": "세션", "label.sessions": "세션", "label.settings": "설정", "label.share-url": "공유 URL", @@ -200,43 +200,43 @@ "label.today": "오늘", "label.toggle-charts": "차트 전환", "label.total": "합계", - "label.total-records": "총 레코드", + "label.total-records": "전체 레코드", "label.tracking-code": "추적 코드", - "label.transactions": "Transactions", + "label.transactions": "거래", "label.transfer": "전송", "label.transfer-website": "웹사이트 전송", "label.true": "참", "label.type": "유형", "label.unique": "고유", - "label.unique-visitors": "순방문자(UV)", - "label.uniqueCustomers": "Unique Customers", + "label.unique-visitors": "고유 방문자", + "label.uniqueCustomers": "고유 고객", "label.unknown": "알 수 없음", "label.untitled": "제목 없음", "label.update": "업데이트", "label.url": "URL", "label.urls": "URL", "label.user": "사용자", - "label.user-property": "User Property", - "label.username": "사용자명", + "label.user-property": "사용자 속성", + "label.username": "사용자 이름", "label.users": "사용자", "label.utm": "UTM", "label.utm-description": "UTM 매개변수를 통해 캠페인을 추적합니다.", "label.value": "값", "label.view": "보기", - "label.view-details": "상세보기", + "label.view-details": "자세히 보기", "label.view-only": "보기 전용", - "label.views": "조회수", - "label.views-per-visit": "방문당 조회수", + "label.views": "조회", + "label.views-per-visit": "방문당 조회", "label.visit-duration": "평균 방문 시간", - "label.visitors": "방문객", + "label.visitors": "방문자", "label.visits": "방문", "label.website": "웹사이트", "label.website-id": "웹사이트 ID", "label.websites": "웹사이트", "label.window": "창", "label.yesterday": "어제", - "message.action-confirmation": "확인을 위해 아래 상자에 {confirmation}을(를) 입력하십시오.", - "message.active-users": "{x}명의 사용자가 보는 중입니다.", + "message.action-confirmation": "확인을 위해 아래 상자에 {confirmation}을(를) 입력하세요.", + "message.active-users": "현재 방문자 {x}명", "message.collected-data": "수집된 데이터", "message.confirm-delete": "{target}을(를) 삭제하시겠습니까?", "message.confirm-leave": "{target}을(를) 떠나시겠습니까?", @@ -244,36 +244,36 @@ "message.confirm-reset": "{target}을(를) 초기화하시겠습니까?", "message.delete-team-warning": "팀을 삭제하면 팀에 등록된 모든 웹사이트도 삭제됩니다.", "message.delete-website-warning": "관련된 모든 데이터가 삭제됩니다.", - "message.error": "오류가 발생하였습니다.", + "message.error": "오류가 발생했습니다.", "message.event-log": "{event} - {url}", "message.go-to-settings": "설정으로 이동", - "message.incorrect-username-password": "사용자 이름/비밀번호가 잘못되었습니다.", - "message.invalid-domain": "잘못된 도메인", - "message.min-password-length": "최소 길이는 {n}자입니다", - "message.new-version-available": "새 버전이 사용 가능합니다! - Umami {version}", - "message.no-data-available": "사용 가능한 데이터가 없습니다.", - "message.no-event-data": "사용 가능한 이벤트 데이터가 없습니다.", - "message.no-match-password": "비밀번호가 일치하지 않음", + "message.incorrect-username-password": "사용자 이름 또는 비밀번호를 잘못 입력했습니다.", + "message.invalid-domain": "잘못된 도메인입니다. http/https를 포함하지 마세요.", + "message.min-password-length": "최소 {n}자여야 합니다", + "message.new-version-available": "Umami의 새 버전 {version}을(를) 사용할 수 있습니다!", + "message.no-data-available": "사용할 수 있는 데이터가 없습니다.", + "message.no-event-data": "사용할 수 있는 이벤트 데이터가 없습니다.", + "message.no-match-password": "비밀번호가 일치하지 않습니다.", "message.no-results-found": "결과를 찾을 수 없습니다.", - "message.no-team-websites": "이 팀에는 웹사이트가 없습니다.", - "message.no-teams": "생성된 팀이 없습니다.", + "message.no-team-websites": "팀에 웹사이트가 없습니다.", + "message.no-teams": "만든 팀이 없습니다.", "message.no-users": "사용자가 없습니다.", "message.no-websites-configured": "설정된 웹사이트가 없습니다.", - "message.page-not-found": "페이지를 찾을 수 없습니다.", - "message.reset-website": "이 웹사이트를 초기화하려면, 아래 상자에 {confirmation}을(를) 입력하십시오.", + "message.page-not-found": "페이지를 찾을 수 없음", + "message.reset-website": "이 웹사이트를 초기화하려면 아래 상자에 {confirmation}을(를) 입력하세요.", "message.reset-website-warning": "이 웹사이트의 모든 통계가 삭제되지만 설정은 그대로 유지됩니다.", - "message.saved": "성공적으로 저장되었습니다.", + "message.saved": "저장했습니다.", "message.share-url": "아래 링크를 통해 웹사이트의 통계를 누구나 볼 수 있습니다.", - "message.team-already-member": "이미 팀의 회원입니다.", + "message.team-already-member": "이미 팀 멤버입니다.", "message.team-not-found": "팀을 찾을 수 없습니다.", - "message.team-websites-info": "웹사이트는 팀의 누구나 볼 수 있습니다.", - "message.tracking-code": "이 웹사이트의 통계를 추적하려면, 다음 코드를 HTML의 ... 섹션에 추가하십시오.", + "message.team-websites-info": "웹사이트는 팀 멤버 누구나 볼 수 있습니다.", + "message.tracking-code": "이 웹사이트의 통계를 추적하려면 다음 코드를 HTML의 ... 부분에 추가하세요.", "message.transfer-team-website-to-user": "이 웹사이트를 당신의 계정으로 전송하시겠습니까?", - "message.transfer-user-website-to-team": "이 웹사이트를 전송받을 팀을 선택하십시오.", + "message.transfer-user-website-to-team": "이 웹사이트를 전송받을 팀을 선택하세요.", "message.transfer-website": "웹사이트 소유권을 계정이나 다른 팀으로 전송합니다.", "message.triggered-event": "트리거된 이벤트", - "message.user-deleted": "사용자가 삭제되었습니다.", - "message.viewed-page": "페이지 조회", - "message.visitor-log": "{country}의 {browser} 브라우저를 사용하는 {os} {device} 방문자", - "message.visitors-dropped-off": "방문자가 이탈했습니다" + "message.user-deleted": "사용자를 삭제했습니다.", + "message.viewed-page": "조회한 페이지", + "message.visitor-log": "{os} {device}에서 {browser}을(를) 사용하는 {country}의 방문자", + "message.visitors-dropped-off": "방문자 이탈함" } From b1caf6edb702f227220e0f2e1742963b282be746 Mon Sep 17 00:00:00 2001 From: Francis Cao Date: Tue, 27 Aug 2024 12:02:23 -0700 Subject: [PATCH 08/16] fix monthly and all time charts --- src/components/charts/BarChart.tsx | 2 +- src/lib/clickhouse.ts | 4 ++-- src/queries/analytics/pageviews/getPageviewStats.ts | 6 +++--- src/queries/analytics/sessions/getSessionStats.ts | 10 +++++----- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/components/charts/BarChart.tsx b/src/components/charts/BarChart.tsx index b96812210e..7a8dcbed84 100644 --- a/src/components/charts/BarChart.tsx +++ b/src/components/charts/BarChart.tsx @@ -36,7 +36,7 @@ export function BarChart(props: BarChartProps) { x: { type: XAxisType, stacked: true, - min: minDate, + min: unit === 'minute' ? minDate : '', max: maxDate, time: { unit, diff --git a/src/lib/clickhouse.ts b/src/lib/clickhouse.ts index 332d07275c..5502b5babf 100644 --- a/src/lib/clickhouse.ts +++ b/src/lib/clickhouse.ts @@ -63,9 +63,9 @@ function getDateStringSQL(data: any, unit: string = 'utc', timezone?: string) { function getDateSQL(field: string, unit: string, timezone?: string) { if (timezone) { - return `date_trunc('${unit}', ${field}, '${timezone}')`; + return `toDateTime(date_trunc('${unit}', ${field}, '${timezone}'), '${timezone}')`; } - return `date_trunc('${unit}', ${field})`; + return `toDateTime(date_trunc('${unit}', ${field}))`; } function mapFilter(column: string, operator: string, name: string, type: string = 'String') { diff --git a/src/queries/analytics/pageviews/getPageviewStats.ts b/src/queries/analytics/pageviews/getPageviewStats.ts index 2230da91d5..48b82000aa 100644 --- a/src/queries/analytics/pageviews/getPageviewStats.ts +++ b/src/queries/analytics/pageviews/getPageviewStats.ts @@ -42,7 +42,7 @@ async function clickhouseQuery( filters: QueryFilters, ): Promise<{ x: string; y: number }[]> { const { timezone = 'utc', unit = 'day' } = filters; - const { parseFilters, rawQuery } = clickhouse; + const { parseFilters, rawQuery, getDateSQL } = clickhouse; const { filterQuery, params } = await parseFilters(websiteId, { ...filters, eventType: EVENT_TYPE.pageView, @@ -57,7 +57,7 @@ async function clickhouseQuery( g.y as y from ( select - date_trunc('${unit}', created_at, '${timezone}') as t, + ${getDateSQL('website_event.created_at', unit, timezone)} as t, count(*) as y from website_event where website_id = {websiteId:UUID} @@ -75,7 +75,7 @@ async function clickhouseQuery( g.y as y from ( select - date_trunc('${unit}', created_at, '${timezone}') as t, + ${getDateSQL('website_event.created_at', unit, timezone)} as t, sum(views)as y from website_event_stats_hourly website_event where website_id = {websiteId:UUID} diff --git a/src/queries/analytics/sessions/getSessionStats.ts b/src/queries/analytics/sessions/getSessionStats.ts index bddebcec10..212f15e9bd 100644 --- a/src/queries/analytics/sessions/getSessionStats.ts +++ b/src/queries/analytics/sessions/getSessionStats.ts @@ -42,7 +42,7 @@ async function clickhouseQuery( filters: QueryFilters, ): Promise<{ x: string; y: number }[]> { const { timezone = 'utc', unit = 'day' } = filters; - const { parseFilters, rawQuery } = clickhouse; + const { parseFilters, rawQuery, getDateSQL } = clickhouse; const { filterQuery, params } = await parseFilters(websiteId, { ...filters, eventType: EVENT_TYPE.pageView, @@ -53,11 +53,11 @@ async function clickhouseQuery( if (EVENT_COLUMNS.some(item => Object.keys(filters).includes(item)) || unit === 'minute') { sql = ` select - g.t as x, + g.t as x, g.y as y from ( select - date_trunc('${unit}', created_at, '${timezone}') as t, + ${getDateSQL('website_event.created_at', unit, timezone)} as t, count(distinct session_id) as y from website_event where website_id = {websiteId:UUID} @@ -71,11 +71,11 @@ async function clickhouseQuery( } else { sql = ` select - g.t as x, + g.t as x, g.y as y from ( select - date_trunc('${unit}', created_at, '${timezone}') as t, + ${getDateSQL('website_event.created_at', unit, timezone)} as t, uniq(session_id) as y from website_event_stats_hourly website_event where website_id = {websiteId:UUID} From 291c64f7b0b5c46667f4e80e0580c6b00b65a607 Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Tue, 27 Aug 2024 14:01:29 -0700 Subject: [PATCH 09/16] Updated initialization process. --- src/tracker/index.js | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/src/tracker/index.js b/src/tracker/index.js index 90a73c432b..707594cf40 100644 --- a/src/tracker/index.js +++ b/src/tracker/index.js @@ -222,6 +222,16 @@ } }; + const init = () => { + if (!initialized) { + track(); + handlePathChanges(); + handleTitleChanges(); + handleClicks(); + initialized = true; + } + }; + const track = (obj, data) => { if (typeof obj === 'string') { return send({ @@ -255,19 +265,10 @@ let initialized; if (autoTrack && !trackingDisabled()) { - handlePathChanges(); - handleTitleChanges(); - handleClicks(); - - const init = () => { - if (document.readyState === 'complete' && !initialized) { - track(); - initialized = true; - } - }; - - document.addEventListener('readystatechange', init, true); - - init(); + if (document.readyState === 'complete') { + init(); + } else { + document.addEventListener('readystatechange', init, true); + } } })(window); From 981a6556548762f797acab96bd4589c27dd9e459 Mon Sep 17 00:00:00 2001 From: Francis Cao Date: Tue, 27 Aug 2024 14:17:42 -0700 Subject: [PATCH 10/16] fix mindate logic --- src/components/charts/BarChart.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/charts/BarChart.tsx b/src/components/charts/BarChart.tsx index 7a8dcbed84..de7690468c 100644 --- a/src/components/charts/BarChart.tsx +++ b/src/components/charts/BarChart.tsx @@ -36,7 +36,7 @@ export function BarChart(props: BarChartProps) { x: { type: XAxisType, stacked: true, - min: unit === 'minute' ? minDate : '', + min: unit === 'year' ? '' : minDate, max: maxDate, time: { unit, From ab050e51c590fd4f814e91cd0c4d4e4e365ca577 Mon Sep 17 00:00:00 2001 From: Francis Cao Date: Tue, 27 Aug 2024 16:02:43 -0700 Subject: [PATCH 11/16] Fix tooltip label, retention report for mysql, pass minDate into eventsChart --- src/app/(main)/reports/retention/RetentionTable.tsx | 2 +- src/components/charts/BarChart.tsx | 9 ++++----- src/components/metrics/EventsChart.tsx | 2 ++ src/lib/prisma.ts | 12 ++++++------ 4 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/app/(main)/reports/retention/RetentionTable.tsx b/src/app/(main)/reports/retention/RetentionTable.tsx index 1770a76468..acc9c052b8 100644 --- a/src/app/(main)/reports/retention/RetentionTable.tsx +++ b/src/app/(main)/reports/retention/RetentionTable.tsx @@ -64,7 +64,7 @@ export function RetentionTable({ days = DAYS }) { key={day} className={classNames(styles.cell, { [styles.empty]: !percentage })} > - {percentage ? `${percentage.toFixed(2)}%` : ''} + {percentage ? `${Number(percentage).toFixed(2)}%` : ''} ); })} diff --git a/src/components/charts/BarChart.tsx b/src/components/charts/BarChart.tsx index de7690468c..7624ba1c43 100644 --- a/src/components/charts/BarChart.tsx +++ b/src/components/charts/BarChart.tsx @@ -1,9 +1,8 @@ -import { useMemo } from 'react'; -import { useTheme } from 'components/hooks'; +import BarChartTooltip from 'components/charts/BarChartTooltip'; import Chart, { ChartProps } from 'components/charts/Chart'; +import { useTheme } from 'components/hooks'; import { renderNumberLabels } from 'lib/charts'; -import { useState } from 'react'; -import BarChartTooltip from 'components/charts/BarChartTooltip'; +import { useMemo, useState } from 'react'; export interface BarChartProps extends ChartProps { unit: string; @@ -36,7 +35,7 @@ export function BarChart(props: BarChartProps) { x: { type: XAxisType, stacked: true, - min: unit === 'year' ? '' : minDate, + min: minDate && new Date(minDate).getSeconds() === 0 ? minDate : '', max: maxDate, time: { unit, diff --git a/src/components/metrics/EventsChart.tsx b/src/components/metrics/EventsChart.tsx index ee7f866cb3..f5b283449b 100644 --- a/src/components/metrics/EventsChart.tsx +++ b/src/components/metrics/EventsChart.tsx @@ -47,6 +47,8 @@ export function EventsChart({ websiteId, className }: EventsChartProps) { return ( Date: Tue, 27 Aug 2024 16:21:31 -0700 Subject: [PATCH 12/16] Show stats changes on dashboard page. Closes #2840 --- src/app/(main)/websites/[websiteId]/WebsiteChartList.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/(main)/websites/[websiteId]/WebsiteChartList.tsx b/src/app/(main)/websites/[websiteId]/WebsiteChartList.tsx index b4a02db799..398fbf8fde 100644 --- a/src/app/(main)/websites/[websiteId]/WebsiteChartList.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsiteChartList.tsx @@ -47,7 +47,7 @@ export default function WebsiteChartList({ - + {showCharts && } ) : null; From 178f9dc1a706322121f4ae688f2885cc1bdbbe3e Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Tue, 27 Aug 2024 16:23:34 -0700 Subject: [PATCH 13/16] Updated lang files. --- public/intl/messages/ca-ES.json | 2 +- public/intl/messages/de-DE.json | 76 ++++++------ public/intl/messages/ko-KR.json | 214 +++++++++++++++----------------- 3 files changed, 136 insertions(+), 156 deletions(-) diff --git a/public/intl/messages/ca-ES.json b/public/intl/messages/ca-ES.json index ccc4988908..69b69e4354 100644 --- a/public/intl/messages/ca-ES.json +++ b/public/intl/messages/ca-ES.json @@ -1180,7 +1180,7 @@ "label.team-manager": [ { "type": 0, - "value": "Responsable d'Equip" + "value": "Responsable d'equip" } ], "label.team-member": [ diff --git a/public/intl/messages/de-DE.json b/public/intl/messages/de-DE.json index 84bc60e136..84e7364c53 100644 --- a/public/intl/messages/de-DE.json +++ b/public/intl/messages/de-DE.json @@ -404,19 +404,19 @@ "label.entry": [ { "type": 0, - "value": "Eintrags-URL" + "value": "Eingangs-URL" } ], "label.event": [ { "type": 0, - "value": "Event" + "value": "Ereigniss" } ], "label.event-data": [ { "type": 0, - "value": "Eventdaten" + "value": "Ereignissdaten" } ], "label.events": [ @@ -476,19 +476,19 @@ "label.first-seen": [ { "type": 0, - "value": "First seen" + "value": "Erstmalig gesehen" } ], "label.funnel": [ { "type": 0, - "value": "Funnel" + "value": "Trichter" } ], "label.funnel-description": [ { "type": 0, - "value": "Verstehe die Konversions- und Abbruchrate der Nutzer." + "value": "Verstehen Sie die Konversions- und Absprungrate Ihrer Nutzer." } ], "label.goal": [ @@ -542,7 +542,7 @@ "label.insights-description": [ { "type": 0, - "value": "Vertiefen Sie Ihre Daten mit Hilfe von Segmenten und Filtern." + "value": "Vertiefen Sie sich mit Hilfe von Segmenten und Filtern in Ihre Daten." } ], "label.is": [ @@ -590,7 +590,7 @@ "label.journey-description": [ { "type": 0, - "value": "Verstehe, wie Nutzer auf der Webseite navigieren" + "value": "Verstehen Sie, wie Nutzer auf Ihrer Website navigieren." } ], "label.language": [ @@ -656,7 +656,7 @@ "label.last-seen": [ { "type": 0, - "value": "Last seen" + "value": "Zuletzt gesehen" } ], "label.leave": [ @@ -752,7 +752,7 @@ "label.my-websites": [ { "type": 0, - "value": "Meine Webseiten" + "value": "Meine Websites" } ], "label.name": [ @@ -876,13 +876,13 @@ "label.path": [ { "type": 0, - "value": "Path" + "value": "Pfad" } ], "label.paths": [ { "type": 0, - "value": "Paths" + "value": "Pfade" } ], "label.powered-by": [ @@ -898,7 +898,7 @@ "label.previous": [ { "type": 0, - "value": "Vorheriges" + "value": "Vorherig" } ], "label.previous-period": [ @@ -922,7 +922,7 @@ "label.properties": [ { "type": 0, - "value": "Properties" + "value": "Eigenschaften" } ], "label.property": [ @@ -958,13 +958,13 @@ "label.referrer": [ { "type": 0, - "value": "Referrer" + "value": "Übermittler" } ], "label.referrers": [ { "type": 0, - "value": "Referrer" + "value": "Übermittler" } ], "label.refresh": [ @@ -1030,7 +1030,7 @@ "label.retention": [ { "type": 0, - "value": "Bewahrung" + "value": "Erhalt" } ], "label.retention-description": [ @@ -1042,19 +1042,19 @@ "label.revenue": [ { "type": 0, - "value": "Revenue" + "value": "Umsatz" } ], "label.revenue-description": [ { "type": 0, - "value": "Look into your revenue across time." + "value": "Haben Sie einen Blick auf Ihre Umsätze im Laufe der Zeit." } ], "label.revenue-property": [ { "type": 0, - "value": "Revenue Property" + "value": "Umsatzeigenschaften" } ], "label.role": [ @@ -1108,13 +1108,13 @@ "label.select-website": [ { "type": 0, - "value": "Webseite auswählen" + "value": "Website auswählen" } ], "label.session": [ { "type": 0, - "value": "Session" + "value": "Sitzung" } ], "label.sessions": [ @@ -1204,7 +1204,7 @@ "label.team-view-only": [ { "type": 0, - "value": "Nur für Team sichtbar" + "value": "Nur für Team-Mitglieder sichtbar" } ], "label.team-websites": [ @@ -1288,7 +1288,7 @@ "label.transactions": [ { "type": 0, - "value": "Transactions" + "value": "Transaktionen" } ], "label.transfer": [ @@ -1318,19 +1318,19 @@ "label.unique": [ { "type": 0, - "value": "Eindeutig" + "value": "Einzigartig" } ], "label.unique-visitors": [ { "type": 0, - "value": "Eindeutige Besucher" + "value": "Einzigartige Besucher" } ], "label.uniqueCustomers": [ { "type": 0, - "value": "Unique Customers" + "value": "Einzigartige Kunden" } ], "label.unknown": [ @@ -1372,7 +1372,7 @@ "label.user-property": [ { "type": 0, - "value": "User Property" + "value": "Benutzereigenschaften" } ], "label.username": [ @@ -1396,7 +1396,7 @@ "label.utm-description": [ { "type": 0, - "value": "Tracke deine Kampagnen mit UTM parameterns." + "value": "Tracken Sie Ihre Kampagnen mit UTM Parametern." } ], "label.value": [ @@ -1456,19 +1456,19 @@ "label.website": [ { "type": 0, - "value": "Webseite" + "value": "Website" } ], "label.website-id": [ { "type": 0, - "value": "Webseiten-ID" + "value": "Website-ID" } ], "label.websites": [ { "type": 0, - "value": "Webseiten" + "value": "Websites" } ], "label.window": [ @@ -1596,7 +1596,7 @@ "message.delete-team-warning": [ { "type": 0, - "value": "Ein Team zu löschen, wird auch alle Team-Webseiten löschen." + "value": "Ein Team zu löschen, wird auch alle Team-Websites löschen." } ], "message.delete-website-warning": [ @@ -1780,25 +1780,25 @@ "message.transfer-team-website-to-user": [ { "type": 0, - "value": "Diese Webseite zu deinem Account transferieren?" + "value": "Diese Website zu Ihrem Account transferieren?" } ], "message.transfer-user-website-to-team": [ { "type": 0, - "value": "Wähle ein Team aus, zu dem die Webseite transferiert werden soll." + "value": "Wählen Sie ein Team aus, zu dem die Website transferiert werden soll." } ], "message.transfer-website": [ { "type": 0, - "value": "Übertrage die Eigentümerrechte zu deinem Account oder einem anderen Team." + "value": "Übertragen Sie die Eigentümerrechte zu Ihrem Account oder einem anderen Team." } ], "message.triggered-event": [ { "type": 0, - "value": "Ausgelöstes Event" + "value": "Ausgelöstes Ereigniss" } ], "message.user-deleted": [ @@ -1810,7 +1810,7 @@ "message.viewed-page": [ { "type": 0, - "value": "Besuchte Seite" + "value": "Seite besucht" } ], "message.visitor-log": [ diff --git a/public/intl/messages/ko-KR.json b/public/intl/messages/ko-KR.json index 9f6520ea40..42a984191f 100644 --- a/public/intl/messages/ko-KR.json +++ b/public/intl/messages/ko-KR.json @@ -8,13 +8,13 @@ "label.actions": [ { "type": 0, - "value": "액션" + "value": "동작" } ], "label.activity": [ { "type": 0, - "value": "활동 기록" + "value": "활동" } ], "label.add": [ @@ -128,7 +128,7 @@ "label.change-password": [ { "type": 0, - "value": "비밀번호 변경하기" + "value": "비밀번호 변경" } ], "label.cities": [ @@ -200,25 +200,25 @@ "label.create": [ { "type": 0, - "value": "생성" + "value": "만들기" } ], "label.create-report": [ { "type": 0, - "value": "리포트 생성" + "value": "보고서 만들기" } ], "label.create-team": [ { "type": 0, - "value": "팀 생성" + "value": "팀 만들기" } ], "label.create-user": [ { "type": 0, - "value": "사용자 생성" + "value": "사용자 만들기" } ], "label.created": [ @@ -296,7 +296,7 @@ "label.delete-report": [ { "type": 0, - "value": "리포트 삭제" + "value": "보고서 삭제" } ], "label.delete-team": [ @@ -326,13 +326,13 @@ "label.desktop": [ { "type": 0, - "value": "데스크탑" + "value": "데스크톱" } ], "label.details": [ { "type": 0, - "value": "세부 사항" + "value": "세부 정보" } ], "label.device": [ @@ -386,7 +386,7 @@ "label.edit-member": [ { "type": 0, - "value": "회원 편집" + "value": "멤버 편집" } ], "label.enable-share-url": [ @@ -398,7 +398,7 @@ "label.end-step": [ { "type": 0, - "value": "종료 단계" + "value": "마지막 단계" } ], "label.entry": [ @@ -458,7 +458,7 @@ "label.filter-combined": [ { "type": 0, - "value": "합쳐서 보기" + "value": "합쳐 보기" } ], "label.filter-raw": [ @@ -476,7 +476,7 @@ "label.first-seen": [ { "type": 0, - "value": "First seen" + "value": "첫 접속" } ], "label.funnel": [ @@ -506,7 +506,7 @@ "label.goals-description": [ { "type": 0, - "value": "페이지뷰 및 이벤트 목표를 추적합니다." + "value": "페이지 조회 및 이벤트 목표를 추적합니다." } ], "label.greater-than": [ @@ -572,13 +572,13 @@ "label.join": [ { "type": 0, - "value": "가입" + "value": "가입하기" } ], "label.join-team": [ { "type": 0, - "value": "팀 가입" + "value": "팀 가입하기" } ], "label.journey": [ @@ -614,7 +614,7 @@ "label.last-days": [ { "type": 0, - "value": "최근 " + "value": "지난 " }, { "type": 1, @@ -622,13 +622,13 @@ }, { "type": 0, - "value": " 일" + "value": "일" } ], "label.last-hours": [ { "type": 0, - "value": "최근 " + "value": "지난 " }, { "type": 1, @@ -636,13 +636,13 @@ }, { "type": 0, - "value": " 시간" + "value": "시간" } ], "label.last-months": [ { "type": 0, - "value": "최근 " + "value": "지난 " }, { "type": 1, @@ -650,13 +650,13 @@ }, { "type": 0, - "value": " 개월" + "value": "개월" } ], "label.last-seen": [ { "type": 0, - "value": "Last seen" + "value": "마지막 접속" } ], "label.leave": [ @@ -780,31 +780,7 @@ }, { "type": 0, - "value": " " - }, - { - "offset": 0, - "options": { - "one": { - "value": [ - { - "type": 0, - "value": "record" - } - ] - }, - "other": { - "value": [ - { - "type": 0, - "value": "레코드" - } - ] - } - }, - "pluralType": "cardinal", - "type": 6, - "value": "x" + "value": "개 레코드" } ], "label.ok": [ @@ -816,7 +792,7 @@ "label.os": [ { "type": 0, - "value": "운영체제" + "value": "운영 체제" } ], "label.overview": [ @@ -832,13 +808,9 @@ } ], "label.page-of": [ - { - "type": 1, - "value": "total" - }, { "type": 0, - "value": " 중 " + "value": "페이지 " }, { "type": 1, @@ -846,13 +818,17 @@ }, { "type": 0, - "value": " 페이지" + "value": "/" + }, + { + "type": 1, + "value": "total" } ], "label.page-views": [ { "type": 0, - "value": "페이지 뷰" + "value": "페이지 조회" } ], "label.pageTitle": [ @@ -876,27 +852,23 @@ "label.path": [ { "type": 0, - "value": "Path" + "value": "패스" } ], "label.paths": [ { "type": 0, - "value": "Paths" + "value": "패스" } ], "label.powered-by": [ { "type": 0, - "value": "이 시스템은 " + "value": "Powered by " }, { "type": 1, "value": "name" - }, - { - "type": 0, - "value": "에서 구동되고 있습니다." } ], "label.previous": [ @@ -926,7 +898,7 @@ "label.properties": [ { "type": 0, - "value": "Properties" + "value": "속성" } ], "label.property": [ @@ -950,7 +922,7 @@ "label.query-parameters": [ { "type": 0, - "value": "쿼리 매개변수" + "value": "쿼리 매개 변수" } ], "label.realtime": [ @@ -974,7 +946,7 @@ "label.refresh": [ { "type": 0, - "value": "새로고침" + "value": "새로 고침" } ], "label.regenerate": [ @@ -1010,7 +982,7 @@ "label.reports": [ { "type": 0, - "value": "리포트" + "value": "보고서" } ], "label.required": [ @@ -1022,7 +994,7 @@ "label.reset": [ { "type": 0, - "value": "리셋" + "value": "초기화" } ], "label.reset-website": [ @@ -1046,19 +1018,19 @@ "label.revenue": [ { "type": 0, - "value": "Revenue" + "value": "수익" } ], "label.revenue-description": [ { "type": 0, - "value": "Look into your revenue across time." + "value": "시간대별 수익을 살펴보세요." } ], "label.revenue-property": [ { "type": 0, - "value": "Revenue Property" + "value": "수익 속성" } ], "label.role": [ @@ -1082,7 +1054,7 @@ "label.screens": [ { "type": 0, - "value": "스크린" + "value": "화면" } ], "label.search": [ @@ -1118,7 +1090,7 @@ "label.session": [ { "type": 0, - "value": "Session" + "value": "세션" } ], "label.sessions": [ @@ -1280,7 +1252,7 @@ "label.total-records": [ { "type": 0, - "value": "총 레코드" + "value": "전체 레코드" } ], "label.tracking-code": [ @@ -1292,7 +1264,7 @@ "label.transactions": [ { "type": 0, - "value": "Transactions" + "value": "거래" } ], "label.transfer": [ @@ -1328,13 +1300,13 @@ "label.unique-visitors": [ { "type": 0, - "value": "순방문자(UV)" + "value": "고유 방문자" } ], "label.uniqueCustomers": [ { "type": 0, - "value": "Unique Customers" + "value": "고유 고객" } ], "label.unknown": [ @@ -1376,13 +1348,13 @@ "label.user-property": [ { "type": 0, - "value": "User Property" + "value": "사용자 속성" } ], "label.username": [ { "type": 0, - "value": "사용자명" + "value": "사용자 이름" } ], "label.users": [ @@ -1418,7 +1390,7 @@ "label.view-details": [ { "type": 0, - "value": "상세보기" + "value": "자세히 보기" } ], "label.view-only": [ @@ -1430,13 +1402,13 @@ "label.views": [ { "type": 0, - "value": "조회수" + "value": "조회" } ], "label.views-per-visit": [ { "type": 0, - "value": "방문당 조회수" + "value": "방문당 조회" } ], "label.visit-duration": [ @@ -1448,7 +1420,7 @@ "label.visitors": [ { "type": 0, - "value": "방문객" + "value": "방문자" } ], "label.visits": [ @@ -1498,17 +1470,21 @@ }, { "type": 0, - "value": "을(를) 입력하십시오." + "value": "을(를) 입력하세요." } ], "message.active-users": [ + { + "type": 0, + "value": "현재 방문자 " + }, { "type": 1, "value": "x" }, { "type": 0, - "value": "명의 사용자가 보는 중입니다." + "value": "명" } ], "message.collected-data": [ @@ -1572,7 +1548,7 @@ "message.error": [ { "type": 0, - "value": "오류가 발생하였습니다." + "value": "오류가 발생했습니다." } ], "message.event-log": [ @@ -1598,19 +1574,19 @@ "message.incorrect-username-password": [ { "type": 0, - "value": "사용자 이름/비밀번호가 잘못되었습니다." + "value": "사용자 이름 또는 비밀번호를 잘못 입력했습니다." } ], "message.invalid-domain": [ { "type": 0, - "value": "잘못된 도메인" + "value": "잘못된 도메인입니다. http/https를 포함하지 마세요." } ], "message.min-password-length": [ { "type": 0, - "value": "최소 길이는 " + "value": "최소 " }, { "type": 1, @@ -1618,35 +1594,39 @@ }, { "type": 0, - "value": "자입니다" + "value": "자여야 합니다" } ], "message.new-version-available": [ { "type": 0, - "value": "새 버전이 사용 가능합니다! - Umami " + "value": "Umami의 새 버전 " }, { "type": 1, "value": "version" + }, + { + "type": 0, + "value": "을(를) 사용할 수 있습니다!" } ], "message.no-data-available": [ { "type": 0, - "value": "사용 가능한 데이터가 없습니다." + "value": "사용할 수 있는 데이터가 없습니다." } ], "message.no-event-data": [ { "type": 0, - "value": "사용 가능한 이벤트 데이터가 없습니다." + "value": "사용할 수 있는 이벤트 데이터가 없습니다." } ], "message.no-match-password": [ { "type": 0, - "value": "비밀번호가 일치하지 않음" + "value": "비밀번호가 일치하지 않습니다." } ], "message.no-results-found": [ @@ -1658,13 +1638,13 @@ "message.no-team-websites": [ { "type": 0, - "value": "이 팀에는 웹사이트가 없습니다." + "value": "팀에 웹사이트가 없습니다." } ], "message.no-teams": [ { "type": 0, - "value": "생성된 팀이 없습니다." + "value": "만든 팀이 없습니다." } ], "message.no-users": [ @@ -1682,13 +1662,13 @@ "message.page-not-found": [ { "type": 0, - "value": "페이지를 찾을 수 없습니다." + "value": "페이지를 찾을 수 없음" } ], "message.reset-website": [ { "type": 0, - "value": "이 웹사이트를 초기화하려면, 아래 상자에 " + "value": "이 웹사이트를 초기화하려면 아래 상자에 " }, { "type": 1, @@ -1696,7 +1676,7 @@ }, { "type": 0, - "value": "을(를) 입력하십시오." + "value": "을(를) 입력하세요." } ], "message.reset-website-warning": [ @@ -1708,7 +1688,7 @@ "message.saved": [ { "type": 0, - "value": "성공적으로 저장되었습니다." + "value": "저장했습니다." } ], "message.share-url": [ @@ -1720,7 +1700,7 @@ "message.team-already-member": [ { "type": 0, - "value": "이미 팀의 회원입니다." + "value": "이미 팀 멤버입니다." } ], "message.team-not-found": [ @@ -1732,13 +1712,13 @@ "message.team-websites-info": [ { "type": 0, - "value": "웹사이트는 팀의 누구나 볼 수 있습니다." + "value": "웹사이트는 팀 멤버 누구나 볼 수 있습니다." } ], "message.tracking-code": [ { "type": 0, - "value": "이 웹사이트의 통계를 추적하려면, 다음 코드를 HTML의 " + "value": "이 웹사이트의 통계를 추적하려면 다음 코드를 HTML의 " }, { "children": [ @@ -1752,7 +1732,7 @@ }, { "type": 0, - "value": " 섹션에 추가하십시오." + "value": " 부분에 추가하세요." } ], "message.transfer-team-website-to-user": [ @@ -1764,7 +1744,7 @@ "message.transfer-user-website-to-team": [ { "type": 0, - "value": "이 웹사이트를 전송받을 팀을 선택하십시오." + "value": "이 웹사이트를 전송받을 팀을 선택하세요." } ], "message.transfer-website": [ @@ -1782,53 +1762,53 @@ "message.user-deleted": [ { "type": 0, - "value": "사용자가 삭제되었습니다." + "value": "사용자를 삭제했습니다." } ], "message.viewed-page": [ { "type": 0, - "value": "페이지 조회" + "value": "조회한 페이지" } ], "message.visitor-log": [ { "type": 1, - "value": "country" + "value": "os" }, { "type": 0, - "value": "의 " + "value": " " }, { "type": 1, - "value": "browser" + "value": "device" }, { "type": 0, - "value": " 브라우저를 사용하는 " + "value": "에서 " }, { "type": 1, - "value": "os" + "value": "browser" }, { "type": 0, - "value": " " + "value": "을(를) 사용하는 " }, { "type": 1, - "value": "device" + "value": "country" }, { "type": 0, - "value": " 방문자" + "value": "의 방문자" } ], "message.visitors-dropped-off": [ { "type": 0, - "value": "방문자가 이탈했습니다" + "value": "방문자 이탈함" } ] } From ed5ff81684b971671e4b12365c19e2c4abe90148 Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Tue, 27 Aug 2024 16:24:03 -0700 Subject: [PATCH 14/16] Bump version v2.13.2. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c8ed652193..c1aaf410e7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "umami", - "version": "2.13.1", + "version": "2.13.2", "description": "A simple, fast, privacy-focused alternative to Google Analytics.", "author": "Umami Software, Inc. ", "license": "MIT", From b89fb0a9627455d54964970f4fcef4b3dcb95394 Mon Sep 17 00:00:00 2001 From: Francis Cao Date: Tue, 27 Aug 2024 16:28:03 -0700 Subject: [PATCH 15/16] Fix autofocus on events page --- .../(main)/websites/[websiteId]/events/EventsDataTable.tsx | 2 +- src/components/common/DataTable.tsx | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/app/(main)/websites/[websiteId]/events/EventsDataTable.tsx b/src/app/(main)/websites/[websiteId]/events/EventsDataTable.tsx index 49b31656d3..32eb985c61 100644 --- a/src/app/(main)/websites/[websiteId]/events/EventsDataTable.tsx +++ b/src/app/(main)/websites/[websiteId]/events/EventsDataTable.tsx @@ -13,7 +13,7 @@ export default function EventsDataTable({ const queryResult = useWebsiteEvents(websiteId); return ( - + {({ data }) => } ); diff --git a/src/components/common/DataTable.tsx b/src/components/common/DataTable.tsx index 22373f608e..d2094329b0 100644 --- a/src/components/common/DataTable.tsx +++ b/src/components/common/DataTable.tsx @@ -15,6 +15,7 @@ export interface DataTableProps { searchDelay?: number; allowSearch?: boolean; allowPaging?: boolean; + autoFocus?: boolean; renderEmpty?: () => ReactNode; children: ReactNode | ((data: any) => ReactNode); } @@ -24,6 +25,7 @@ export function DataTable({ searchDelay = 600, allowSearch = true, allowPaging = true, + autoFocus = true, renderEmpty, children, }: DataTableProps) { @@ -57,7 +59,7 @@ export function DataTable({ value={query} onSearch={handleSearch} delay={searchDelay || DEFAULT_SEARCH_DELAY} - autoFocus={true} + autoFocus={autoFocus} placeholder={formatMessage(labels.search)} /> )} From ff0c825a7bca7adaad0bc492ab3d910703b8f3a2 Mon Sep 17 00:00:00 2001 From: Francis Cao Date: Tue, 27 Aug 2024 17:07:43 -0700 Subject: [PATCH 16/16] fix retention report dates and days --- src/app/(main)/reports/retention/RetentionTable.tsx | 2 +- src/queries/analytics/reports/getRetention.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/app/(main)/reports/retention/RetentionTable.tsx b/src/app/(main)/reports/retention/RetentionTable.tsx index acc9c052b8..6d825567d4 100644 --- a/src/app/(main)/reports/retention/RetentionTable.tsx +++ b/src/app/(main)/reports/retention/RetentionTable.tsx @@ -58,7 +58,7 @@ export function RetentionTable({ days = DAYS }) { if (totalDays - rowIndex < day) { return null; } - const percentage = records[day]?.percentage; + const percentage = records.filter(a => a.day === day)[0]?.percentage; return (
{ const { startDate, endDate, timezone = 'UTC' } = filters; - const { getDateSQL, getDateStringSQL, rawQuery } = clickhouse; + const { getDateSQL, rawQuery } = clickhouse; const unit = 'day'; return rawQuery( @@ -152,7 +152,7 @@ async function clickhouseQuery( group by 1, 2 ) select - ${getDateStringSQL('c.cohort_date', unit)} as date, + c.cohort_date as date, c.day_number as day, s.visitors as visitors, c.visitors returnVisitors,