Merge branch 'dev' of https://github.com/umami-software/umami into analytics

This commit is contained in:
Francis Cao 2025-01-02 10:15:48 -08:00
commit be3b5b88f0
3 changed files with 221 additions and 218 deletions

View file

@ -1,279 +1,279 @@
{
"label.access-code": "Access code",
"label.access-code": "کد دسترسی",
"label.actions": "اقدامات",
"label.activity": "Activity log",
"label.add": "Add",
"label.add-description": "Add description",
"label.add-member": "Add member",
"label.add-step": "Add step",
"label.activity": "فعالیت",
"label.add": "افزودن",
"label.add-description": "افزودن توضیحات",
"label.add-member": "افزودن عضو",
"label.add-step": "افزودن قدم",
"label.add-website": "افزودن وب‌سایت",
"label.admin": "مدیر",
"label.after": "After",
"label.after": "بعد",
"label.all": "همه",
"label.all-time": "همه زمان",
"label.analytics": "Analytics",
"label.average": "Average",
"label.back": رگشت",
"label.before": "Before",
"label.bounce-rate": "نرخ Bounce",
"label.breakdown": "Breakdown",
"label.browser": "Browser",
"label.browsers": "مروگرها",
"label.all-time": "تمامی زمان‌ها",
"label.analytics": "تجزیه و تحلیل",
"label.average": "میانگین",
"label.back": ازگشت",
"label.before": "قبل از",
"label.bounce-rate": "نرخ ریزش",
"label.breakdown": "تفکیک",
"label.browser": "مرورگر",
"label.browsers": "مرورگرها",
"label.cancel": "انصراف",
"label.change-password": "تغییر رمز",
"label.cities": "Cities",
"label.city": "City",
"label.clear-all": "Clear all",
"label.compare": "Compare",
"label.confirm": "Confirm",
"label.confirm-password": ایید رمز",
"label.contains": "Contains",
"label.continue": "Continue",
"label.count": "Count",
"label.cities": "شهرها",
"label.city": "شهر",
"label.clear-all": "پاک کردن همه",
"label.compare": "مقایسه",
"label.confirm": "تأیید",
"label.confirm-password": أیید رمز",
"label.contains": "شامل",
"label.continue": "ادامه",
"label.count": "تعداد",
"label.countries": "کشورها",
"label.country": "Country",
"label.create": "Create",
"label.create-report": "Create report",
"label.create-team": "Create team",
"label.create-user": "Create user",
"label.created": "Created",
"label.created-by": "Created By",
"label.current": "Current",
"label.country": "کشور",
"label.create": "ایجاد",
"label.create-report": "ایجاد گزارش",
"label.create-team": "ایجاد تیم",
"label.create-user": "ایجاد کاربر",
"label.created": "ایجاد شد",
"label.created-by": "ایجاد شده توسط",
"label.current": "فعلی",
"label.current-password": "رمز فعلی",
"label.custom-range": "محدوده‌ی دلخواه",
"label.dashboard": "داشبورد",
"label.data": "Data",
"label.date": "Date",
"label.data": "داده",
"label.date": "تاریخ",
"label.date-range": "محدوده‌ی تاریخ",
"label.day": "Day",
"label.default-date-range": "محدوده‌ی پیشفرض تاریخ",
"label.day": "روز",
"label.default-date-range": "محدوده‌ی پیشفرض تاریخ",
"label.delete": "حذف",
"label.delete-report": "Delete report",
"label.delete-team": "Delete team",
"label.delete-user": "Delete user",
"label.delete-report": "حذف گزارش",
"label.delete-team": "حذف تیم",
"label.delete-user": "حذف کاربر",
"label.delete-website": "حذف وب‌سایت",
"label.description": "Description",
"label.description": "توضیحات",
"label.desktop": "دسکتاپ",
"label.details": "Details",
"label.device": "Device",
"label.details": "جزئیات",
"label.device": "دستگاه",
"label.devices": "دستگاه‌ها",
"label.dismiss": "رد کردن",
"label.does-not-contain": "Does not contain",
"label.does-not-contain": "شامل نمی‌شود",
"label.domain": "دامنه",
"label.dropoff": "Dropoff",
"label.dropoff": "رها کردن",
"label.edit": "ویرایش",
"label.edit-dashboard": "Edit dashboard",
"label.edit-member": "Edit member",
"label.enable-share-url": "فعال کردن اشتراک گذاری URL",
"label.end-step": "End Step",
"label.entry": "Entry URL",
"label.event": "Event",
"label.event-data": "Event data",
"label.edit-dashboard": "ویرایش داشبورد",
"label.edit-member": "ویرایش عضو",
"label.enable-share-url": "فعال کردن اشتراک گذاری آدرس اینترنتی",
"label.end-step": "قدم پایانی",
"label.entry": "آدرس اینترنتی ورودی",
"label.event": "رویداد",
"label.event-data": "داده‌های رویداد",
"label.events": "رویدادها",
"label.exit": "Exit URL",
"label.false": "False",
"label.field": "Field",
"label.fields": "Fields",
"label.filter": "Filter",
"label.exit": "آدرس اینترنتی خروجی",
"label.false": "نادرست",
"label.field": "فیلد",
"label.fields": "فیلد‌ها",
"label.filter": "فیلتر",
"label.filter-combined": "ترکیب شده",
"label.filter-raw": "خام",
"label.filters": "Filters",
"label.first-seen": "First seen",
"label.funnel": "Funnel",
"label.funnel-description": "Understand the conversion and drop-off rate of users.",
"label.goal": "Goal",
"label.goals": "Goals",
"label.goals-description": "Track your goals for pageviews and events.",
"label.greater-than": "Greater than",
"label.greater-than-equals": "Greater than or equals",
"label.host": "Host",
"label.hosts": "Hosts",
"label.insights": "Insights",
"label.insights-description": "Dive deeper into your data by using segments and filters.",
"label.is": "Is",
"label.is-not": "Is not",
"label.is-not-set": "Is not set",
"label.is-set": "Is set",
"label.join": "Join",
"label.join-team": "Join team",
"label.journey": "Journey",
"label.journey-description": "Understand how users navigate through your website.",
"label.filters": "فیلترها",
"label.first-seen": "اولین بار دیده شده",
"label.funnel": "فانل",
"label.funnel-description": "نرخ تبدیل و رها کردن کاربران را درک کنید.",
"label.goal": "هدف",
"label.goals": "اهداف",
"label.goals-description": "اهداف خود را برای بازدید از صفحه و رویدادها دنبال کنید.",
"label.greater-than": "بزرگ‌تر از",
"label.greater-than-equals": "بزرگ‌تر یا مساوی",
"label.host": "هاست",
"label.hosts": "هاست‌ها",
"label.insights": "بینش",
"label.insights-description": "با استفاده از بخش‌ها و فیلترها، در داده‌های خود عمیق‌تر شوید.",
"label.is": "برابر است با",
"label.is-not": "برابر نیست با",
"label.is-not-set": "تعیین نشده",
"label.is-set": "تعیین شده",
"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": "Last {x} months",
"label.last-seen": "Last seen",
"label.leave": "Leave",
"label.leave-team": "Leave team",
"label.less-than": "Less than",
"label.less-than-equals": "Less than or equals",
"label.last-days": "{x} روز گذشته",
"label.last-hours": "{x} ساعت گذشته",
"label.last-months": "{x} ماه گذشته",
"label.last-seen": "آخرین بار دیده شده",
"label.leave": "ترک کردن",
"label.leave-team": "ترک تیم",
"label.less-than": "کمتر از",
"label.less-than-equals": "کمتر یا مساوی",
"label.login": "ورود",
"label.logout": "خروج",
"label.manage": "Manage",
"label.manager": "Manager",
"label.max": "Max",
"label.member": "Member",
"label.members": "Members",
"label.min": "Min",
"label.manage": "مدیریت",
"label.manager": "مدیر",
"label.max": "حداکثر",
"label.member": "عضو",
"label.members": "اعضا",
"label.min": "حداقل",
"label.mobile": "موبایل",
"label.more": "بیشتر",
"label.my-account": "My account",
"label.my-websites": "My websites",
"label.my-account": "حساب کاربری من",
"label.my-websites": "وب‌سایت‌های من",
"label.name": "نام",
"label.new-password": "رمز جدید",
"label.none": "None",
"label.none": "هیچ",
"label.number-of-records": "{x} {x, plural, one {record} other {records}}",
"label.ok": "OK",
"label.os": "OS",
"label.overview": "Overview",
"label.owner": "ایجاد شده توسط",
"label.page-of": "Page {current} of {total}",
"label.ok": "تایید",
"label.os": "سیستم عامل",
"label.overview": "بررسی کلی",
"label.owner": "مالک",
"label.page-of": "صفحه {current} از {total}",
"label.page-views": "بازدید صفحه",
"label.pageTitle": "Page title",
"label.pageTitle": "عنوان صفحه",
"label.pages": "صفحه‌ها",
"label.password": "رمز",
"label.path": "Path",
"label.paths": "Paths",
"label.path": "مسیر",
"label.paths": "مسیرها",
"label.powered-by": "قدرت گرفته توسط {name}",
"label.previous": "Previous",
"label.previous-period": "Previous period",
"label.previous-year": "Previous year",
"label.previous": "قبلی",
"label.previous-period": "دوره‌ی قبل",
"label.previous-year": "سال قبل",
"label.profile": "پروفایل",
"label.properties": "Properties",
"label.property": "Property",
"label.queries": "Queries",
"label.query": "Query",
"label.query-parameters": "Query parameters",
"label.properties": "ویژگی‌ها",
"label.property": "ویژگی",
"label.queries": "کوئری‌ها",
"label.query": "کوئری",
"label.query-parameters": "پارامترهای کوئری",
"label.realtime": "آمار زنده",
"label.referrer": "Referrer",
"label.referrer": "ارجاع دهنده",
"label.referrers": "ارجاع دهندگان",
"label.refresh": "به‌روزرسانی",
"label.regenerate": "Regenerate",
"label.region": "Region",
"label.regions": "Regions",
"label.remove": "Remove",
"label.remove-member": "Remove member",
"label.reports": "Reports",
"label.regenerate": "تولید مجدد",
"label.region": "منطقه",
"label.regions": "مناطق",
"label.remove": "حذف",
"label.remove-member": "حذف عضو",
"label.reports": "گزارش‌ها",
"label.required": "ضروری",
"label.reset": "بازنشانی",
"label.reset-website": "بازنشانی آمار",
"label.retention": "Retention",
"label.retention-description": "Measure your website stickiness by tracking how often users return.",
"label.revenue": "Revenue",
"label.revenue-description": "Look into your revenue across time.",
"label.revenue-property": "Revenue Property",
"label.role": "Role",
"label.run-query": "Run query",
"label.reset-website": "بازنشانی وب‌سایت",
"label.retention": "نرخ بازگشت",
"label.retention-description": "چسبندگی وب‌سایت خود را با دنبال کردن تعداد دفعات بازگشت کاربران اندازه‌گیری کنید.",
"label.revenue": "درآمد",
"label.revenue-description": "به درآمد خود در طول زمان نگاه کنید.",
"label.revenue-property": "ویژگی درآمد",
"label.role": "نقش",
"label.run-query": "اجرای کوئری",
"label.save": "ذخیره",
"label.screens": "Screens",
"label.search": "Search",
"label.select": "Select",
"label.select-date": "Select date",
"label.select-role": "Select role",
"label.select-website": "Select website",
"label.session": "Session",
"label.sessions": "Sessions",
"label.screens": "صفحه",
"label.search": "جستجو",
"label.select": "انتخاب",
"label.select-date": "انتخاب تاریخ",
"label.select-role": "انتخاب نقش",
"label.select-website": "انتخاب وب‌سایت",
"label.session": "نشست",
"label.sessions": "نشست‌ها",
"label.settings": "تنظیمات",
"label.share-url": "به اشتراک گذاری URL",
"label.share-url": "به اشتراک گذاری آدرس اینترنتی",
"label.single-day": "یک روز",
"label.start-step": "Start Step",
"label.steps": "Steps",
"label.sum": "Sum",
"label.start-step": "قدم شروع",
"label.steps": "قدم‌ها",
"label.sum": "جمع",
"label.tablet": "تبلت",
"label.team": "Team",
"label.team-id": "Team ID",
"label.team-manager": "Team manager",
"label.team-member": "Team member",
"label.team-name": "Team name",
"label.team-owner": "Team owner",
"label.team-view-only": "Team view only",
"label.team-websites": "Team websites",
"label.teams": "Teams",
"label.team": "تیم",
"label.team-id": "شناسه تیم",
"label.team-manager": "مدیر تیم",
"label.team-member": "عضو تیم",
"label.team-name": "نام تیم",
"label.team-owner": "مالک تیم",
"label.team-view-only": "فقط مشاهده‌ی تیم",
"label.team-websites": "وب‌سایت‌های تیم",
"label.teams": "تیم‌ها",
"label.theme": "تم",
"label.this-month": "این ماه",
"label.this-week": "این هفته",
"label.this-year": "امسال",
"label.timezone": "منطقه‌ی زمانی",
"label.title": "Title",
"label.title": "عنوان",
"label.today": "امروز",
"label.toggle-charts": "Toggle charts",
"label.total": "Total",
"label.total-records": "Total records",
"label.toggle-charts": "نمایش / عدم نمایش نمودارها",
"label.total": "جمع",
"label.total-records": "جمع رکوردها",
"label.tracking-code": "کد رهگیری",
"label.transactions": "Transactions",
"label.transfer": "Transfer",
"label.transfer-website": "Transfer website",
"label.true": "True",
"label.type": "Type",
"label.unique": "Unique",
"label.transactions": "تراکنش‌ها",
"label.transfer": "انتقال",
"label.transfer-website": "انتقال وب‌سایت",
"label.true": "درست",
"label.type": "نوع",
"label.unique": "یکتا",
"label.unique-visitors": "بازدیدکننده‌های یکتا",
"label.uniqueCustomers": "Unique Customers",
"label.uniqueCustomers": "مشتریان یکتا",
"label.unknown": "ناشناخته",
"label.untitled": "Untitled",
"label.update": "Update",
"label.url": "URL",
"label.urls": "URLs",
"label.user": "User",
"label.user-property": "User Property",
"label.untitled": "بدون عنوان",
"label.update": "به‌روزرسانی",
"label.url": "آدرس اینترنتی",
"label.urls": "آدرس‌های اینترنتی",
"label.user": "کاربر",
"label.user-property": "ویژگی کاربر",
"label.username": "نام کاربری",
"label.users": "Users",
"label.users": "کاربران",
"label.utm": "UTM",
"label.utm-description": "Track your campaigns through UTM parameters.",
"label.value": "Value",
"label.view": "View",
"label.utm-description": "با استفاده از پارامترهای UTM، کمپین‌های خود را بررسی کنید.",
"label.value": "مقدار",
"label.view": "مشاهده",
"label.view-details": "مشاهده‌ی جزئیات",
"label.view-only": "View only",
"label.view-only": "فقط مشاهده",
"label.views": "بازدید",
"label.views-per-visit": "Views per visit",
"label.views-per-visit": "نمایش‌ها در هر بازدید",
"label.visit-duration": "میانگین زمان بازدید",
"label.visitors": "بازدیدکننده",
"label.visits": "Visits",
"label.website": "Website",
"label.website-id": "Website ID",
"label.visits": "بازدیدها",
"label.website": "وب‌سایت",
"label.website-id": "شناسه وب‌سایت",
"label.websites": "وب‌سایت‌ها",
"label.window": "Window",
"label.yesterday": "Yesterday",
"message.action-confirmation": "Type {confirmation} in the box below to confirm.",
"message.active-users": "{x} هم اکنون {x, plural, one {یک} other {از میان}}",
"message.collected-data": "Collected data",
"message.confirm-delete": "آیا مطمئن هستید می‌خواهید {target} را حذف کنید?",
"message.confirm-leave": "Are you sure you want to leave {target}?",
"message.confirm-remove": "Are you sure you want to remove {target}?",
"message.confirm-reset": "آیا از بازنشانی آمار {target} مطمئن هستید?",
"message.delete-team-warning": "Deleting a team will also delete all team websites.",
"message.delete-website-warning": "همه‌ی داده‌های مرتبط هم حذف خواهد شد.",
"label.window": "پنجره",
"label.yesterday": "دیروز",
"message.action-confirmation": "برای تأیید این عملیات، لطفاً {confirmation} را تایپ کنید.",
"message.active-users": "{x} فعلی {x, plural, one {یک} other {از میان}}",
"message.collected-data": "داده‌های جمع‌آوری شده",
"message.confirm-delete": "آیا مطمئن هستید می‌خواهید {target} را حذف کنید؟",
"message.confirm-leave": "آیا مطمئن هستید می‌خواهید از {target} خارج شوید؟",
"message.confirm-remove": "آیا مطمئن هستید می‌خواهید {target} را حذف کنید؟",
"message.confirm-reset": "آیا مطمئن هستید می‌خواهید {target} را بازنشانی کنید؟",
"message.delete-team-warning": "با حذف تیم، تمامی وب‌سایت‌های تیم هم حذف خواهند شد.",
"message.delete-website-warning": "همه‌ی داده‌های وب‌سایت هم حذف خواهد شد.",
"message.error": "مشکلی پیش آمده است.",
"message.event-log": "{event} on {url}",
"message.event-log": "{event} در {url}",
"message.go-to-settings": "رفتن به تنظیمات",
"message.incorrect-username-password": "نام کاربری / رمز نادرست است.",
"message.invalid-domain": "دامنه‌ی نامعتبر",
"message.min-password-length": "Minimum length of {n} characters",
"message.new-version-available": "A new version of Umami {version} is available!",
"message.invalid-domain": "دامنه نامعتبر است.",
"message.min-password-length": "حداقل طول {n} کاراکتر است.",
"message.new-version-available": "نسخه‌ی جدیدی از Umami {version} در دسترس است.",
"message.no-data-available": "اطلاعاتی موجود نیست.",
"message.no-event-data": "No event data is available.",
"message.no-event-data": "هیچ داده‌ای برای این رویداد وجود ندارد.",
"message.no-match-password": "رمزها یکسان نیستند",
"message.no-results-found": "No results were found.",
"message.no-team-websites": "This team does not have any websites.",
"message.no-teams": "You have not created any teams.",
"message.no-users": "There are no users.",
"message.no-results-found": "نتیجه‌ای یافت نشد.",
"message.no-team-websites": "هیچ وب‌سایتی برای این تیم وجود ندارد.",
"message.no-teams": "شما هیچ تیمی را ایجاد نکرده‌اید.",
"message.no-users": "هیچ کاربری وجود ندارد.",
"message.no-websites-configured": "شما هیچ وب‌سایتی را پیکربندی نکرده‌اید.",
"message.page-not-found": "صفحه یافت نشد.",
"message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
"message.reset-website-warning": "تمامی آمارهای این وب‌سایت حذف خواهد شد اما tracking code بدون تغییر باقی می‌ماند.",
"message.saved": "با موفقیت ذخیره شد.",
"message.share-url": "این URL به اشتراک گذاشته شده عمومی برای {target} است.",
"message.team-already-member": "You are already a member of the team.",
"message.team-not-found": "Team not found.",
"message.team-websites-info": "Websites can be viewed by anyone on the team.",
"message.reset-website": "برای بازنشانی وب‌سایت، لطفاً {confirmation} را تایپ کنید.",
"message.reset-website-warning": "تمامی آمارهای این وب‌سایت حذف خواهد شد اما کدهای رهگیری بدون تغییر باقی می‌ماند.",
"message.saved": "ذخیره شد.",
"message.share-url": "آمار وب‌سایت شما به صورت عمومی در آدرس زیر قابل مشاهده است.",
"message.team-already-member": "شما از قبل عضو این تیم هستید.",
"message.team-not-found": "تیم یافت نشد.",
"message.team-websites-info": "وب‌سایت‌ها توسط تمامی اعضای تیم قابل مشاهده هستند.",
"message.tracking-code": "کد رهگیری",
"message.transfer-team-website-to-user": "Transfer this website to your account?",
"message.transfer-user-website-to-team": "Select the team to transfer this website to.",
"message.transfer-website": "Transfer website ownership to your account or another team.",
"message.triggered-event": "Triggered event",
"message.user-deleted": "User deleted.",
"message.viewed-page": "Viewed page",
"message.transfer-team-website-to-user": "آیا می‌خواهید این وب‌سایت را به حساب خود منتقل کنید؟",
"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": "Visitors dropped off"
"message.visitors-dropped-off": "ریزش بازدیدکننده‌ها"
}

View file

@ -7,7 +7,6 @@ import {
methodNotAllowed,
ok,
safeDecodeURI,
send,
} from 'next-basics';
import { COLLECTION_TYPE, HOSTNAME_REGEX, IP_REGEX } from 'lib/constants';
import { secret, visitSalt, uuid } from 'lib/crypto';
@ -103,8 +102,8 @@ export default async (req: NextApiRequestCollect, res: NextApiResponse) => {
const session = req.session;
if (!session?.id) {
return;
if (!session?.id || !session?.websiteId) {
return ok(res, {});
}
const iat = Math.floor(new Date().getTime() / 1000);
@ -162,9 +161,9 @@ export default async (req: NextApiRequestCollect, res: NextApiResponse) => {
});
}
const token = createToken(session, secret());
const cache = createToken(session, secret());
return send(res, token);
return ok(res, { cache });
}
return methodNotAllowed(res);

View file

@ -21,6 +21,7 @@
const tag = attr(_data + 'tag');
const autoTrack = attr(_data + 'auto-track') !== _false;
const excludeSearch = attr(_data + 'exclude-search') === _true;
const excludeHash = attr(_data + 'exclude-hash') === _true;
const domain = attr(_data + 'domains') || '';
const domains = domain.split(',').map(n => n.trim());
const host =
@ -53,13 +54,12 @@
const parseURL = url => {
try {
// use location.origin as the base to handle cases where the url is a relative path
const { pathname, search, hash } = new URL(url, location.href);
url = pathname + search + hash;
return pathname + (excludeSearch ? '' : search) + (excludeHash ? '' : hash);
} catch (e) {
/* empty */
return url;
}
return excludeSearch ? url.split('?')[0] : url;
};
const getPayload = () => ({
@ -194,6 +194,7 @@
/* Tracking functions */
const trackingDisabled = () =>
disabled ||
!website ||
(localStorage && localStorage.getItem('umami.disabled')) ||
(domain && !domains.includes(hostname));
@ -215,9 +216,11 @@
body: JSON.stringify({ type, payload }),
headers,
});
const text = await res.text();
return (cache = text);
const data = await res.json();
disabled = res.status === 429;
cache = data?.cache;
} catch (e) {
/* empty */
}
@ -264,6 +267,7 @@
let title = document.title;
let cache;
let initialized;
let disabled = false;
if (autoTrack && !trackingDisabled()) {
if (document.readyState === 'complete') {