diff --git a/.github/workflows/cd-manual.yml b/.github/workflows/cd-manual.yml index 6b04dd84..f62f3e45 100644 --- a/.github/workflows/cd-manual.yml +++ b/.github/workflows/cd-manual.yml @@ -20,12 +20,14 @@ jobs: steps: - uses: actions/checkout@v2 - - uses: mr-smithers-excellent/docker-build-push@v5 + - uses: mr-smithers-excellent/docker-build-push@v6 name: Build & push Docker image for ${{ matrix.db-type }} with: image: umami tags: ${{ matrix.db-type }}-${{ inputs.version }}, ${{ matrix.db-type }}-latest buildArgs: DATABASE_TYPE=${{ matrix.db-type }} registry: ghcr.io + multiPlatform: true + platform: linux/amd64,linux/arm64 username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 6d8a7f73..824001ef 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -19,12 +19,14 @@ jobs: - name: Set env run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV - - uses: mr-smithers-excellent/docker-build-push@v5 + - uses: mr-smithers-excellent/docker-build-push@v6 name: Build & push Docker image for ${{ matrix.db-type }} with: image: umami tags: ${{ matrix.db-type }}-${{ env.RELEASE_VERSION }}, ${{ matrix.db-type }}-latest buildArgs: DATABASE_TYPE=${{ matrix.db-type }} registry: ghcr.io + multiPlatform: true + platform: linux/amd64,linux/arm64 username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} diff --git a/Dockerfile b/Dockerfile index eb7ebf1a..3fc32e0b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,13 +1,15 @@ # Install dependencies only when needed -FROM node:16-alpine AS deps +FROM node:18-alpine AS deps # Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed. RUN apk add --no-cache libc6-compat WORKDIR /app COPY package.json yarn.lock ./ +# Add yarn timeout to handle slow CPU when Github Actions +RUN yarn config set network-timeout 300000 RUN yarn install --frozen-lockfile # Rebuild the source code only when needed -FROM node:16-alpine AS builder +FROM node:18-alpine AS builder WORKDIR /app COPY --from=deps /app/node_modules ./node_modules COPY . . @@ -23,7 +25,7 @@ ENV NEXT_TELEMETRY_DISABLED 1 RUN yarn build-docker # Production image, copy all the files and run next -FROM node:16-alpine AS runner +FROM node:18-alpine AS runner WORKDIR /app ENV NODE_ENV production diff --git a/README.md b/README.md index 1adfbfb3..19935ed5 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ or change the [port](https://nextjs.org/docs/api-reference/cli#production) to se To build the umami container and start up a Postgres database, run: ```bash -docker compose up +docker compose up -d ``` Alternatively, to pull just the Umami Docker image with PostgreSQL support: diff --git a/components/pages/settings/teams/TeamSettings.js b/components/pages/settings/teams/TeamSettings.js index 3b5c2937..2fbd8d9e 100644 --- a/components/pages/settings/teams/TeamSettings.js +++ b/components/pages/settings/teams/TeamSettings.js @@ -49,7 +49,7 @@ export default function TeamSettings({ teamId }) { title={ - Teams + {formatMessage(labels.teams)} {values?.name} diff --git a/components/pages/settings/users/UsersTable.js b/components/pages/settings/users/UsersTable.js index c60f11ff..66ef96db 100644 --- a/components/pages/settings/users/UsersTable.js +++ b/components/pages/settings/users/UsersTable.js @@ -6,10 +6,12 @@ import UserDeleteForm from './UserDeleteForm'; import { ROLES } from 'lib/constants'; import useMessages from 'hooks/useMessages'; import SettingsTable from 'components/common/SettingsTable'; +import useLocale from 'hooks/useLocale'; export default function UsersTable({ data = [], onDelete }) { const { formatMessage, labels } = useMessages(); const { user } = useUser(); + const { dateLocale } = useLocale(); const columns = [ { name: 'username', label: formatMessage(labels.username), style: { flex: 1.5 } }, @@ -22,6 +24,7 @@ export default function UsersTable({ data = [], onDelete }) { if (key === 'created') { return formatDistance(new Date(row.createdAt), new Date(), { addSuffix: true, + locale: dateLocale, }); } if (key === 'role') { diff --git a/components/pages/settings/websites/WebsiteData.js b/components/pages/settings/websites/WebsiteData.js index 7c558542..bb951628 100644 --- a/components/pages/settings/websites/WebsiteData.js +++ b/components/pages/settings/websites/WebsiteData.js @@ -34,7 +34,7 @@ export default function WebsiteData({ websiteId, onSave }) { description={formatMessage(messages.deleteWebsiteWarning)} > - + {close => ( diff --git a/lang/am-ET.json b/lang/am-ET.json new file mode 100644 index 00000000..f58a25cd --- /dev/null +++ b/lang/am-ET.json @@ -0,0 +1,120 @@ +{ + "label.accounts": "Accounts", + "label.add-account": "Add account", + "label.add-column": "Add column", + "label.add-filter": "Add filter", + "label.add-website": "Add website", + "label.administrator": "Administrator", + "label.all": "All", + "label.all-time": "All time", + "label.all-websites": "All websites", + "label.back": "Back", + "label.cancel": "Cancel", + "label.change-password": "Change password", + "label.confirm-password": "Confirm password", + "label.copy-to-clipboard": "Copy to clipboard", + "label.current-password": "Current password", + "label.custom-range": "Custom range", + "label.dashboard": "Dashboard", + "label.date-range": "Date range", + "label.default-date-range": "Default date range", + "label.delete": "Delete", + "label.delete-account": "Delete account", + "label.delete-website": "Delete website", + "label.dismiss": "Dismiss", + "label.domain": "Domain", + "label.edit": "Edit", + "label.edit-account": "Edit account", + "label.edit-website": "Edit website", + "label.enable-share-url": "Enable share URL", + "label.event-data": "Event Data", + "label.field-name": "Field Name", + "label.invalid": "Invalid", + "label.invalid-domain": "Invalid domain", + "label.language": "Language", + "label.last-days": "Last {x} days", + "label.last-hours": "Last {x} hours", + "label.logged-in-as": "Logged in as {username}", + "label.login": "Login", + "label.logout": "Logout", + "label.more": "More", + "label.name": "Name", + "label.new-password": "New password", + "label.none": "None", + "label.owner": "Owner", + "label.password": "Password", + "label.passwords-dont-match": "Passwords don't match", + "label.profile": "Profile", + "label.realtime": "Realtime", + "label.realtime-logs": "Realtime logs", + "label.refresh": "Refresh", + "label.required": "Required", + "label.reset": "Reset", + "label.reset-website": "Reset statistics", + "label.save": "Save", + "label.search": "Search", + "label.settings": "Settings", + "label.share-url": "Share URL", + "label.single-day": "Single day", + "label.theme": "Theme", + "label.this-month": "This month", + "label.this-week": "This week", + "label.this-year": "This year", + "label.timezone": "Timezone", + "label.today": "Today", + "label.tracking-code": "Tracking code", + "label.type": "Type", + "label.unknown": "Unknown", + "label.username": "Username", + "label.value": "Value", + "label.view-details": "View details", + "label.websites": "Websites", + "label.yesterday": "Yesterday", + "message.active-users": "{x} current {x, plural, one {visitor} other {visitors}}", + "message.confirm-delete": "Are you sure you want to delete {target}?", + "message.confirm-reset": "Are you sure you want to reset {target}'s statistics?", + "message.copied": "Copied!", + "message.delete-warning": "All associated data will be deleted as well.", + "message.edit-dashboard": "Edit dashboard", + "message.failure": "Something went wrong.", + "message.get-share-url": "Get share URL", + "message.get-tracking-code": "Get tracking code", + "message.go-to-settings": "Go to settings", + "message.incorrect-username-password": "Incorrect username/password.", + "message.log.visitor": "Visitor from {country} using {browser} on {os} {device}", + "message.new-version-available": "A new version of umami {version} is available!", + "message.no-data-available": "No data available.", + "message.no-websites-configured": "You don't have any websites configured.", + "message.page-not-found": "Page not found.", + "message.powered-by": "Powered by {name}", + "message.reset-warning": "All statistics for this website will be deleted, but your tracking code will remain intact.", + "message.save-success": "Saved successfully.", + "message.share-url": "This is the publicly shared URL for {target}.", + "message.toggle-charts": "Toggle charts", + "message.track-stats": "To track stats for {target}, place the following code in the {head} section of your website.", + "message.type-delete": "Type {delete} in the box below to confirm.", + "message.type-reset": "Type {reset} in the box below to confirm.", + "metrics.actions": "Actions", + "metrics.average-visit-time": "Average visit time", + "metrics.bounce-rate": "Bounce rate", + "metrics.browsers": "Browsers", + "metrics.countries": "Countries", + "metrics.device.desktop": "Desktop", + "metrics.device.laptop": "Laptop", + "metrics.device.mobile": "Mobile", + "metrics.device.tablet": "Tablet", + "metrics.devices": "Devices", + "metrics.events": "Events", + "metrics.filter.combined": "Combined", + "metrics.filter.raw": "Raw", + "metrics.languages": "Languages", + "metrics.operating-systems": "Operating systems", + "metrics.page-views": "Page views", + "metrics.pages": "Pages", + "metrics.query-parameters": "Query parameters", + "metrics.referrers": "Referrers", + "metrics.screens": "Screens", + "metrics.unique-visitors": "Unique visitors", + "metrics.views": "Views", + "metrics.visitors": "Visitors" +} diff --git a/lang/ar-SA.json b/lang/ar-SA.json index 55bb7734..57cd58ad 100644 --- a/lang/ar-SA.json +++ b/lang/ar-SA.json @@ -1,145 +1,145 @@ { "label.access-code": "Access code", "label.actions": "اجراءات", - "label.activity-log": "Activity log", + "label.activity-log": "سجل الأحداث", "label.add-website": "إضافة موقع", - "label.admin": "مدير عام؟", + "label.admin": "مدير", "label.all": "الكل", - "label.all-time": "All time", - "label.analytics": "Analytics", + "label.all-time": "كل الوقت", + "label.analytics": "تحليلات", "label.average-visit-time": "متوسط وقت الزيارة", "label.back": "للخلف", "label.bounce-rate": "معدل الارتداد", "label.browsers": "المتصفحات", "label.cancel": "إلغاء", "label.change-password": "تغيير كلمة المرور", - "label.cities": "Cities", - "label.clear-all": "Clear all", - "label.confirm": "Confirm", + "label.cities": "المدن", + "label.clear-all": "مسح الكل", + "label.confirm": "تأكيد", "label.confirm-password": "تأكيد كلمة المرور", - "label.continue": "Continue", + "label.continue": "متابعة", "label.countries": "الدول", - "label.create-team": "Create team", - "label.create-user": "Create user", - "label.created": "Created", + "label.create-team": "انشاء مجموعة", + "label.create-user": "انشاء مستخدم", + "label.created": "تم الانشاء", "label.current-password": "كلمة المرور الحالية", "label.custom-range": "فترة مخصصة", "label.dashboard": "الشاشة الرئيسية", - "label.data": "Data", + "label.data": "البيانات", "label.date-range": "فترة مخصصة", "label.default-date-range": "الفترة المخصصة الافتراضية", "label.delete": "حذف", - "label.delete-team": "Delete team", - "label.delete-user": "Delete user", + "label.delete-team": "حذف مجموعة", + "label.delete-user": "جذف مستخدم", "label.delete-website": "حذف الموقع", "label.desktop": "كمبيوتر", - "label.details": "Details", + "label.details": "تفاصيل", "label.devices": "الأجهزة", "label.dismiss": "اخفاء", - "label.domain": "نطاق", + "label.domain": "النطاق", "label.edit": "تعديل", - "label.edit-dashboard": "Edit dashboard", + "label.edit-dashboard": "تعديل لوحة التحكم", "label.enable-share-url": "تفعيل مشاركة الرابط", "label.events": "الأحداث", "label.filter-combined": "مجمعة", "label.filter-raw": "مفصلة", - "label.join": "Join", - "label.join-team": "Join team", - "label.language": "Language", - "label.languages": "Languages", + "label.join": "انضمام", + "label.join-team": "الانضمام للمجموعة", + "label.language": "اللغة", + "label.languages": "اللغات", "label.laptop": "لابتوب", "label.last-days": "اخر {x} يوم/ايام", "label.last-hours": "اخر {x} ساعة/ساعات", - "label.leave": "Leave", - "label.leave-team": "Leave team", + "label.leave": "مغادرة", + "label.leave-team": "مغادرة المجموعة", "label.logout": "تسجيل الخروج", - "label.members": "Members", + "label.members": "الأعضاء", "label.mobile": "جوال", "label.more": "المزيد", "label.name": "الإسم", "label.new-password": "كلمة مرور جديدة", - "label.none": "None", + "label.none": "لا شيء", "label.operating-systems": "نظام التشغيل", - "label.owner": "Owner", + "label.owner": "المالك", "label.page-views": "مشاهدات الصفحة", "label.pages": "الصفحات", "label.password": "كلمة المرور", "label.powered-by": "مشغل بواسطة {name}", "label.profile": "الملف الشخصي", - "label.queries": "Queries", - "label.query-parameters": "Query parameters", + "label.queries": "استعلامات", + "label.query-parameters": "متغيرات الرابط", "label.realtime": "الوقت الفعلي", "label.referrers": "التحويلات", "label.refresh": "تحديث", - "label.regenerate": "Regenerate", - "label.regions": "Regions", - "label.remove": "Remove", + "label.regenerate": "اعادة انشاء", + "label.regions": "المناطق", + "label.remove": "إزالة", "label.required": "اجباري", "label.reset": "اعادة تعيين", "label.reset-website": "اعادة تعيين الإحصائيات", - "label.role": "Role", + "label.role": "الصلاحية", "label.save": "حفظ", - "label.screens": "Screens", - "label.select-website": "Select website", - "label.sessions": "Sessions", + "label.screens": "الشاشات", + "label.select-website": "اختيار موقع", + "label.sessions": "الزيارات", "label.settings": "اعدادات", "label.share-url": "مشاركة الرابط", "label.single-day": "يوم واحد", "label.tablet": "تابلت", - "label.team": "Team", - "label.team-guest": "Team guest", - "label.team-id": "Team ID", - "label.team-member": "Team member", - "label.team-owner": "Team owner", - "label.teams": "Teams", - "label.theme": "Theme", + "label.team": "مجموعة", + "label.team-guest": "زائر للمجموعة", + "label.team-id": "معرف المجموعة", + "label.team-member": "عضو المجموعة", + "label.team-owner": "مدير المجموعة", + "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.toggle-charts": "تغيير الإحصائيات", "label.tracking-code": "كود التتبع", "label.unique-visitors": "زائرون فريدون", "label.unknown": "غير معروف", - "label.user": "User", + "label.user": "مستخدم", "label.username": "اسم المستخدم", - "label.users": "Users", - "label.view": "View", + "label.users": "المستخدمين", + "label.view": "عرض", "label.view-details": "عرض التفاصيل", "label.views": "مشاهدات", "label.visitors": "زوار", - "label.website-id": "Website ID", + "label.website-id": "معرف الموقع", "label.websites": "المواقع", - "label.yesterday": "Yesterday", + "label.yesterday": "الأمس", "message.active-users": "{x} حاليا {x, plural, one {زائر واحد} other {زوار}}", "message.confirm-delete": "هل أنت متأكد من حذف {target}?", - "message.confirm-leave": "Are you sure you want to leave {target}?", + "message.confirm-leave": "هل أنت متأكد من مغادرة {target}?", "message.confirm-reset": "هل أنت متأكد من اعادة تعيين الإحصائيات لـ {target}؟", "message.delete-website": "حذف الموقع", "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.min-password-length": "اقل عدد مسموح به {n} حرف/أحرف", "message.no-data-available": "لا توجد بيانات متاحة.", "message.no-match-password": "كلمة المرور غير متطابقة", - "message.no-teams": "You have not created any teams.", - "message.no-users": "There are no users.", + "message.no-teams": "لم تقم بإنشاء اي مجموعة.", + "message.no-users": "لا يوجد مستخدمين.", "message.page-not-found": "الصفحة غير موجودة.", "message.reset-website": "اعادة تعيين الإحصائيات", "message.reset-website-warning": "سيتم اعادة تعيين كافة الإحصائيات لهذا الموقع، لكن لن يتم تعيير كود التتبع", "message.saved": "تم الحفظ بنجاح.", "message.share-url": "هذا الرابط الذي تم مشاركته بشكل عام لـ {target}.", - "message.team-already-member": "You are already a member of the team.", - "message.team-not-found": "Team not found.", + "message.team-already-member": "أنت عضو في المجموعة", + "message.team-not-found": "لم يتم العثور على المجموعة found.", "message.tracking-code": "كود التتبع", - "message.user-deleted": "User deleted.", + "message.user-deleted": "تم حذف المستخدم.", "message.visitor-log": "زائر من {country} يستخدم {browser} على {os} {device}", - "messages.no-team-websites": "This team does not have any websites.", + "messages.no-team-websites": "هذه المجموعة ليس لديه اي موقع.", "messages.no-websites-configured": "لم تقم بإعداد اي موقع.", - "messages.team-websites-info": "Websites can be viewed by anyone on the team." + "messages.team-websites-info": "يمكن مشاهدة الموقع من اي عضو في المجموعة." } diff --git a/lang/fr-FR.json b/lang/fr-FR.json index 8a8c4b21..bdc11e38 100644 --- a/lang/fr-FR.json +++ b/lang/fr-FR.json @@ -1,7 +1,7 @@ { - "label.access-code": "Access code", + "label.access-code": "Code d'accès", "label.actions": "Actions", - "label.activity-log": "Activity log", + "label.activity-log": "Journal d'activité", "label.add-website": "Ajouter un site", "label.admin": "Administrateur", "label.all": "Tout", @@ -13,27 +13,27 @@ "label.browsers": "Navigateurs", "label.cancel": "Annuler", "label.change-password": "Changer le mot de passe", - "label.cities": "Cities", - "label.clear-all": "Clear all", - "label.confirm": "Confirm", + "label.cities": "Villes", + "label.clear-all": "Réinitialiser", + "label.confirm": "Confirmer", "label.confirm-password": "Confirmation du mot de passe", - "label.continue": "Continue", + "label.continue": "Continuer", "label.countries": "Pays", - "label.create-team": "Create team", - "label.create-user": "Create user", - "label.created": "Created", + "label.create-team": "Créer une équipe", + "label.create-user": "Créer un utilisateur", + "label.created": "Créé", "label.current-password": "Mot de passe actuel", "label.custom-range": "Période personnalisée", "label.dashboard": "Tableau de bord", - "label.data": "Data", + "label.data": "Données", "label.date-range": "Période", "label.default-date-range": "Période par défaut", "label.delete": "Supprimer", - "label.delete-team": "Delete team", - "label.delete-user": "Delete user", + "label.delete-team": "Supprimer l'équipe", + "label.delete-user": "Supprimer l'utilisateur", "label.delete-website": "Supprimer le site", "label.desktop": "Ordinateur", - "label.details": "Details", + "label.details": "Détails", "label.devices": "Appareils", "label.dismiss": "Ignorer", "label.domain": "Domaine", @@ -43,17 +43,17 @@ "label.events": "Événements", "label.filter-combined": "Combiné", "label.filter-raw": "Brut", - "label.join": "Join", - "label.join-team": "Join team", + "label.join": "Rejoindre", + "label.join-team": "Rejoindre une équipe", "label.language": "Langue", "label.languages": "Langues", "label.laptop": "Portable", "label.last-days": "{x} derniers jours", "label.last-hours": "{x} dernières heures", - "label.leave": "Leave", - "label.leave-team": "Leave team", + "label.leave": "Quitter", + "label.leave-team": "Quitter l'équipe", "label.logout": "Déconnexion", - "label.members": "Members", + "label.members": "Membres", "label.mobile": "Téléphone", "label.more": "Plus", "label.name": "Nom", @@ -71,75 +71,75 @@ "label.realtime": "Temps réel", "label.referrers": "Sources", "label.refresh": "Rafraîchir", - "label.regenerate": "Regenerate", - "label.regions": "Regions", - "label.remove": "Remove", + "label.regenerate": "Régénérer", + "label.regions": "Régions", + "label.remove": "Retirer", "label.required": "Requis", "label.reset": "Réinitialiser", "label.reset-website": "Réinitialiser les statistiques", - "label.role": "Role", - "label.save": "Sauvegarder", + "label.role": "Rôle", + "label.save": "Enregistrer", "label.screens": "Résolutions d'écran", - "label.select-website": "Select website", + "label.select-website": "Choisir un site", "label.sessions": "Sessions", "label.settings": "Paramètres", - "label.share-url": "Partager l'URL", + "label.share-url": "URL de partage", "label.single-day": "Journée", "label.tablet": "Tablette", - "label.team": "Team", - "label.team-guest": "Team guest", - "label.team-id": "Team ID", - "label.team-member": "Team member", - "label.team-owner": "Team owner", - "label.teams": "Teams", + "label.team": "Équipe", + "label.team-guest": "Invité dans l'équipe", + "label.team-id": "ID d'équipe", + "label.team-member": "Membre de l'équipe", + "label.team-owner": "Propriétaire de l'équipe", + "label.teams": "Équipes", "label.theme": "Thème", "label.this-month": "Ce mois", "label.this-week": "Cette semaine", "label.this-year": "Cette année", "label.timezone": "Fuseau horaire", - "label.title": "Title", + "label.title": "Titre", "label.today": "Aujourd'hui", "label.toggle-charts": "Afficher/Masquer les graphiques", "label.tracking-code": "Code de suivi", "label.unique-visitors": "Visiteurs uniques", "label.unknown": "Inconnu", - "label.user": "User", + "label.user": "Utilisateur", "label.username": "Nom d'utilisateur", - "label.users": "Users", - "label.view": "View", - "label.view-details": "Voir les details", + "label.users": "Utilisateurs", + "label.view": "Voir", + "label.view-details": "Voir les détails", "label.views": "Vues", "label.visitors": "Visiteurs", - "label.website-id": "Website ID", + "label.website-id": "ID de site", "label.websites": "Sites", "label.yesterday": "Hier", "message.active-users": "{x} {x, plural, one {visiteur} other {visiteurs}} actuellement", "message.confirm-delete": "Êtes-vous sûr de vouloir supprimer {target} ?", - "message.confirm-leave": "Are you sure you want to leave {target}?", + "message.confirm-leave": "Êtes-vous sûr de vouloir quitter {target} ?", "message.confirm-reset": "Êtes-vous sûr de vouloir réinitialiser les statistiques de {target} ?", - "message.delete-website": "Supprimer le site", - "message.delete-website-warning": "Toutes les données associées seront également supprimées.", + "message.delete-website": "Pour supprimer ce site, taper {confirmation} ci-dessous pour confirmer.", + "message.delete-website-warning": "Toutes les données associées seront supprimées.", "message.error": "Un problème est survenu.", - "message.event-log": "{event} on {url}", + "message.event-log": "{event} sur {url}", "message.go-to-settings": "Aller aux paramètres", "message.incorrect-username-password": "Nom d'utilisateur/Mot de passe incorrect.", "message.invalid-domain": "Domaine invalide", - "message.min-password-length": "Minimum length of {n} characters", - "message.no-data-available": "Pas de données disponibles.", + "message.min-password-length": "Taille minimale de {n} caractères", + "message.no-data-available": "Aucune donnée disponible.", "message.no-match-password": "Les mots de passe ne correspondent pas", - "message.no-teams": "You have not created any teams.", - "message.no-users": "There are no users.", + "message.no-teams": "Vous n'avez créé aucune équipe.", + "message.no-users": "Il n'y aucun utilisateur.", "message.page-not-found": "Page non trouvée.", "message.reset-website": "Réinitialiser les statistiques", "message.reset-website-warning": "Toutes les statistiques pour ce site seront supprimées, mais votre code de suivi restera intact.", "message.saved": "Enregistré avec succès.", - "message.share-url": "Ceci est l'URL partagée pour {target}.", - "message.team-already-member": "You are already a member of the team.", - "message.team-not-found": "Team not found.", + "message.share-url": "Les statistiques de votre site sont accessibles publiquement sur cette URL :", + "message.team-already-member": "Vous êtes déjà membre de cette équipe.", + "message.team-not-found": "Équipe non trouvée.", "message.tracking-code": "Code de suivi", - "message.user-deleted": "User deleted.", + "message.user-deleted": "Utilisateur supprimé.", "message.visitor-log": "Visiteur de {country} utilisant {browser} sur {os} {device}", - "messages.no-team-websites": "This team does not have any websites.", + "messages.no-team-websites": "Cette équipe n'a aucun site.", "messages.no-websites-configured": "Vous n'avez configuré aucun site.", - "messages.team-websites-info": "Websites can be viewed by anyone on the team." + "messages.team-websites-info": "Les sites peuvent être vus par tout utilisateur dans l'équipe." } diff --git a/lang/hr-HR.json b/lang/hr-HR.json new file mode 100644 index 00000000..e9072a89 --- /dev/null +++ b/lang/hr-HR.json @@ -0,0 +1,120 @@ +{ + "label.accounts": "Računi", + "label.add-account": "Dodaj račun", + "label.add-column": "Dodaj stupac", + "label.add-filter": "Dodaj filter", + "label.add-website": "Dodaj web stranicu", + "label.administrator": "Administrator", + "label.all": "Sve", + "label.all-time": "Svo vrijeme", + "label.all-websites": "Sve web stranice", + "label.back": "Natrag ", + "label.cancel": "Odustani", + "label.change-password": "Promijeni lozinku", + "label.confirm-password": "Potvrdi lozinku", + "label.copy-to-clipboard": "Kopiraj u međuspremnik", + "label.current-password": "Trenutna lozinka", + "label.custom-range": "Prilagođeni raspon", + "label.dashboard": "Nadzorna ploča", + "label.date-range": "Raspon datuma", + "label.default-date-range": "Zadani datumski raspon", + "label.delete": "Obriši", + "label.delete-account": "Obriši račun", + "label.delete-website": "Obriši web stranicu", + "label.dismiss": "Odbaci", + "label.domain": "Domena", + "label.edit": "Uredi", + "label.edit-account": "Uredi račun", + "label.edit-website": "Uredi web stranicu", + "label.enable-share-url": "Omogući dijeljenje poveznice", + "label.event-data": "Podaci događaja", + "label.field-name": "Naziv polja", + "label.invalid": "Neispravno", + "label.invalid-domain": "Neispravna domena", + "label.language": "Jezik", + "label.last-days": "Zadnjih {x} dana", + "label.last-hours": "Zadnjih {x} sati", + "label.logged-in-as": "Prijavljen kao {username}", + "label.login": "Prijava", + "label.logout": "Odjava", + "label.more": "Više", + "label.name": "Ime", + "label.new-password": "Nova lozinka", + "label.none": "Ništa", + "label.owner": "Vlasnik", + "label.password": "Lozinka", + "label.passwords-dont-match": "Lozinke se ne podudaraju", + "label.profile": "Profil", + "label.realtime": "Stvarno vrijeme", + "label.realtime-logs": "Trenutni zapisi", + "label.refresh": "Osvježi", + "label.required": "Potrebna", + "label.reset": "Resetirati", + "label.reset-website": "Resetirati web stranicu", + "label.save": "Spremi", + "label.search": "Pretraži", + "label.settings": "Postavke", + "label.share-url": "Podijeli poveznicu", + "label.single-day": "Jedan dan", + "label.theme": "Tema", + "label.this-month": "Ovaj mjesec", + "label.this-week": "Ovaj tjedan", + "label.this-year": "Ova godina", + "label.timezone": "Vremenska zona", + "label.today": "Danas", + "label.tracking-code": "Kod za praćenje", + "label.type": "Tip", + "label.unknown": "Nepoznato", + "label.username": "Korisničko ime", + "label.value": "Vrijednost", + "label.view-details": "Pogledaj detalje", + "label.websites": "Web stranice", + "label.yesterday": "Jučer", + "message.active-users": "{x} Trenutno {x, plural, one {posjetitelj} other {posjetitelja}}", + "message.confirm-delete": "Jeste li sigurni da želite obrisati {target}?", + "message.confirm-reset": "Jeste li sigurni da želite resetirati {target}'s statistiku?", + "message.copied": "Kopirano!", + "message.delete-warning": "Izbrisat će se svi povezani podaci.", + "message.edit-dashboard": "Uredi nadzornu ploču", + "message.failure": "Nešto je pošlo po zlu.", + "message.get-share-url": "Dohvati poveznicu za dijeljenje", + "message.get-tracking-code": "Dohvati kod za praćenje", + "message.go-to-settings": "Idi u postavke", + "message.incorrect-username-password": "Neispravno korisničke ime/lozinka.", + "message.log.visitor": "Posjetitelj iz {country} koristi {browser} na {os} {device}", + "message.new-version-available": "Nova verzija umami {version} je dostupna!", + "message.no-data-available": "Nema dostupnih podataka.", + "message.no-websites-configured": "Nemate konfiguriranu nijednu web stranicu.", + "message.page-not-found": "Stranica nije pronađena.", + "message.powered-by": "Pokreće {name}", + "message.reset-warning": "Sve statistike za ovu web stranicu bit će izbrisane, ali će vaš kod za praćenje ostati netaknut.", + "message.save-success": "Uspješno spremljeno.", + "message.share-url": "Ovo je javno dijeljena poveznica za {target}.", + "message.toggle-charts": "Uključi/isključi grafikone", + "message.track-stats": "Da biste pratili statistiku za {target}, postavite sljedeći kod u odjeljak {head} svoje web stranice.", + "message.type-delete": "Upišite {delete} u donji okvir za potvrdu.", + "message.type-reset": " Upišite {reset} u donji okvir za potvrdu. ", + "metrics.actions": "Akcije", + "metrics.average-visit-time": "Prosječno vrijeme posjeta", + "metrics.bounce-rate": "Stopa napuštanja stranice", + "metrics.browsers": "Web preglednici", + "metrics.countries": "Zemlje", + "metrics.device.desktop": "Pc", + "metrics.device.laptop": "Laptop", + "metrics.device.mobile": "Mobitel", + "metrics.device.tablet": "Tablet", + "metrics.devices": "Uređaji", + "metrics.events": "Događaji", + "metrics.filter.combined": "Kombinirano", + "metrics.filter.raw": "Neobrađeni podaci", + "metrics.languages": "Jezici", + "metrics.operating-systems": "Operativni sustavi", + "metrics.page-views": "Pregledi stranice", + "metrics.pages": "Stranice", + "metrics.query-parameters": "Parametri upita", + "metrics.referrers": "Upučivaći", + "metrics.screens": "Zasloni", + "metrics.unique-visitors": "Jedinstveni posjetitelji", + "metrics.views": "Pregledi", + "metrics.visitors": "Posjetitelji" +} diff --git a/lang/si-LK.json b/lang/si-LK.json new file mode 100644 index 00000000..33346087 --- /dev/null +++ b/lang/si-LK.json @@ -0,0 +1,120 @@ +{ + "label.accounts": "ගිණුම්", + "label.add-account": "ගිණුම එකතු කරන්න", + "label.add-column": "තීරුව එක් කරන්න", + "label.add-filter": "පෙරහන එකතු කරන්න", + "label.add-website": "වෙබ් අඩවිය එක් කරන්න", + "label.administrator": "පරිපාලක", + "label.all": "සියල්ල", + "label.all-time": "හැම වෙලාවෙම", + "label.all-websites": "සියලුම වෙබ් අඩවි", + "label.back": "ආපසු", + "label.cancel": "අවලංගු කරන්න", + "label.change-password": "මුරපදය වෙනස් කරන්න", + "label.confirm-password": "මුරපදය සත්‍යාපනය කරන්න", + "label.copy-to-clipboard": "පසුරු පුවරුවට පිටපත් කරන්න", + "label.current-password": "වත්මන් මුරපදය", + "label.custom-range": "අභිරුචි පරාසය", + "label.dashboard": "උපකරණ පුවරුව", + "label.date-range": "දින පරාසය", + "label.default-date-range": "පෙරනිමි දින පරාසය", + "label.delete": "මකන්න", + "label.delete-account": "ගිණුම මකන්න", + "label.delete-website": "වෙබ් අඩවිය මකන්න", + "label.dismiss": "මගහරින්න", + "label.domain": "වසම", + "label.edit": "සංස්කරණය කරන්න", + "label.edit-account": "ගිණුම සංස්කරණය කරන්න", + "label.edit-website": "වෙබ් අඩවිය සංස්කරණය කරන්න", + "label.enable-share-url": "බෙදාගැනීමේ URL සබල කරන්න", + "label.event-data": "සිදුවීම් දත්ත", + "label.field-name": "ක්ෂේත්‍ර නාම", + "label.invalid": "වලංගු නැත", + "label.invalid-domain": "වලංගු නොවන වසමක්", + "label.language": "භාෂාව", + "label.last-days": "අන්තිම {x} දින", + "label.last-hours": "අන්තිම {x} පැය", + "label.logged-in-as": "ලොග් වී ඇත්තේ {username}", + "label.login": "ලොග් වෙන්න", + "label.logout": "පිටවීම", + "label.more": "තවත්", + "label.name": "නම", + "label.new-password": "අලුත් මුරපදය", + "label.none": "කිසිවක් නැත", + "label.owner": "හිමිකරු", + "label.password": "මුරපදය", + "label.passwords-dont-match": "මුරපද නොගැලපේ", + "label.profile": "පැතිකඩ", + "label.realtime": "තත්ය කාල", + "label.realtime-logs": "තත්‍ය කාලීන ලොග්", + "label.refresh": "නැවුම් කරන්න", + "label.required": "අවශ්‍යයි", + "label.reset": "යළි පිහිටුවන්න", + "label.reset-website": "සංඛ්යා ලේඛන නැවත සකසන්න", + "label.save": "සුරකින්න", + "label.search": "සෙවීම", + "label.settings": "සැකසුම්", + "label.share-url": "බෙදාගැනීමේ URL", + "label.single-day": "තනි දවස", + "label.theme": "තේමාව", + "label.this-month": "මෙ මාසය", + "label.this-week": "මේ සතිය", + "label.this-year": "මේ අවුරුද්ද", + "label.timezone": "වේලා කලාපය", + "label.today": "අද", + "label.tracking-code": "ලුහුබැඳීමේ කේතය", + "label.type": "වර්ගය", + "label.unknown": "නොදනී", + "label.username": "පරිශීලක නාමය", + "label.value": "වටිනාකම", + "label.view-details": "තොරතුරු පෙන්වන්න", + "label.websites": "වෙබ් අඩවි", + "label.yesterday": "ඊයේ", + "message.active-users": "{x} දැන් {x, plural, one {අමුත්තා} other {අමුත්තන්}}", + "message.confirm-delete": "{target} මකා දැමීම ගැන විශ්වාසද?", + "message.confirm-reset": "{target} ට අදාල සංඛ්‍යාලේඛන නැවත පිහිටුවීමට අවශ්‍යද?", + "message.copied": "පිටපත් කරගත්තා!", + "message.delete-warning": "සියලුම ආශ්‍රිත දත්ත ද මකා දැමෙනු ඇත.", + "message.edit-dashboard": "උපකරණ පුවරුව සංස්කරණය කරන්න", + "message.failure": "යම් ගැටලුවක් මතු වී ඇත.", + "message.get-share-url": "බෙදාගැනීමේ URL ලබා ගන්න", + "message.get-tracking-code": "ලුහුබැඳීමේ කේතය ලබා ගන්න", + "message.go-to-settings": "සැකසීම් වෙත යන්න", + "message.incorrect-username-password": "වැරදි පරිශීලක නාමය/මුරපදය.", + "message.log.visitor": "{country} වලින් පැමිණි අමුත්තකු {device} එකේ, මේ {os} එකේ, මේ {browser} එකෙන් ඉන්නවා", + "message.new-version-available": "umami අලුත්ම {version} වන අනුවාදය නිකුත් උනා!", + "message.no-data-available": "පෙන්වීමට දත්ත නොමැත.", + "message.no-websites-configured": "ඔබට වින්‍යාස කර ඇති වෙබ් අඩවි කිසිවක් නොමැත.", + "message.page-not-found": "පිටුව හමු නොවීය.", + "message.powered-by": "බල ගැන්වුයේ {name}", + "message.reset-warning": "සියලුම සංඛ්‍යාලේඛන මකා දමනු ඇත. නමුත් ඔබගේ නිරීක්ෂණ කේතය නොවෙනස්ව පවතිනු ඇත.", + "message.save-success": "සාර්තකව සුරැකිණි.", + "message.share-url": "මේ {target} සඳහා ප්‍රසිද්ධියේ බෙදාගත් URL එකයි.", + "message.toggle-charts": "ප්‍රස්ථාර ටොගල් කරන්න", + "message.track-stats": "{target} හි සංඛ්යාලේඛන බැලීම සදහා, පහත කේතය {head} කොටසට ඇතුලත් කරන්න.", + "message.type-delete": "සත්‍යාපනය සදහා {delete} ලෙස පහල කොටුවේ ටයිප් කරන්න", + "message.type-reset": "සත්‍යාපනය සදහා {reset} ලෙස පහල කොටුවේ ටයිප් කරන්න", + "metrics.actions": "ක්රියාවන්", + "metrics.average-visit-time": "සාමාන්‍ය සංචාර කාලය", + "metrics.bounce-rate": "හැරී යන ප්‍රමාණය", + "metrics.browsers": "බ්‍රව්සර්", + "metrics.countries": "රටවල්", + "metrics.device.desktop": "ඩෙස්ක්ටොප්", + "metrics.device.laptop": "ලැප්ටොප්", + "metrics.device.mobile": "ජංගම", + "metrics.device.tablet": "ටැබ්ලට්", + "metrics.devices": "උපකරණ", + "metrics.events": "සිද්ධීන්", + "metrics.filter.combined": "ඒකාබද්ධ", + "metrics.filter.raw": "අමු", + "metrics.languages": "භාෂා", + "metrics.operating-systems": "මෙහෙයුම් පද්ධති", + "metrics.page-views": "පිටු බැලීම්", + "metrics.pages": "පිටු", + "metrics.query-parameters": "විමසුම් පරාමිතීන්", + "metrics.referrers": "යොමු කරන්නන්", + "metrics.screens": "තිර", + "metrics.unique-visitors": "අලුත්ම අමුත්තන්", + "metrics.views": "බැලූ ගණන", + "metrics.visitors": "අමුත්තන්" +} diff --git a/lib/date.js b/lib/date.js index 6907786c..41d01304 100644 --- a/lib/date.js +++ b/lib/date.js @@ -208,6 +208,11 @@ export const customFormats = { p: 'ha', pp: 'h:mm:ss', }, + 'fr-FR': { + 'M/d': 'd/M', + 'MMM d': 'd MMM', + 'EEE M/d': 'EEE d/M', + }, }; export function dateFormat(date, str, locale = 'en-US') { diff --git a/pages/_app.js b/pages/_app.js index fcff10bf..f1a34521 100644 --- a/pages/_app.js +++ b/pages/_app.js @@ -52,6 +52,7 @@ export default function App({ Component, pageProps }) { + {!pathname.includes('/share/') &&