mirror of
https://github.com/kremalicious/umami.git
synced 2025-02-14 21:10:34 +01:00
Merge pull request #660 from atmonshi/add-arabic-lang
add Arabic language (ar-SA) (Arabic Saudi Arabia)
This commit is contained in:
commit
63b04b92f1
@ -4,11 +4,15 @@ import { FormattedMessage } from 'react-intl';
|
|||||||
import Link from 'components/common/Link';
|
import Link from 'components/common/Link';
|
||||||
import styles from './Footer.module.css';
|
import styles from './Footer.module.css';
|
||||||
import useVersion from 'hooks/useVersion';
|
import useVersion from 'hooks/useVersion';
|
||||||
|
import useLocale from 'hooks/useLocale';
|
||||||
|
import { rtlLocales } from 'lib/lang';
|
||||||
|
|
||||||
export default function Footer() {
|
export default function Footer() {
|
||||||
const { current } = useVersion();
|
const { current } = useVersion();
|
||||||
|
const [locale] = useLocale();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<footer className="container">
|
<footer className="container" dir={rtlLocales.includes(locale) ? 'rtl' : 'ltr'}>
|
||||||
<div className={classNames(styles.footer, 'row')}>
|
<div className={classNames(styles.footer, 'row')}>
|
||||||
<div className="col-12 col-md-4" />
|
<div className="col-12 col-md-4" />
|
||||||
<div className="col-12 col-md-4">
|
<div className="col-12 col-md-4">
|
||||||
|
@ -10,17 +10,20 @@ import UpdateNotice from 'components/common/UpdateNotice';
|
|||||||
import UserButton from 'components/settings/UserButton';
|
import UserButton from 'components/settings/UserButton';
|
||||||
import Logo from 'assets/logo.svg';
|
import Logo from 'assets/logo.svg';
|
||||||
import styles from './Header.module.css';
|
import styles from './Header.module.css';
|
||||||
|
import useLocale from 'hooks/useLocale';
|
||||||
|
import { rtlLocales } from 'lib/lang';
|
||||||
|
|
||||||
export default function Header() {
|
export default function Header() {
|
||||||
const user = useSelector(state => state.user);
|
const user = useSelector(state => state.user);
|
||||||
const [active, setActive] = useState(false);
|
const [active, setActive] = useState(false);
|
||||||
|
const [locale] = useLocale();
|
||||||
|
|
||||||
function handleClick() {
|
function handleClick() {
|
||||||
setActive(state => !state);
|
setActive(state => !state);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<nav className="container">
|
<nav className="container" dir={rtlLocales.includes(locale) ? 'rtl' : 'ltr'}>
|
||||||
{user?.is_admin && <UpdateNotice />}
|
{user?.is_admin && <UpdateNotice />}
|
||||||
<div className={classNames(styles.header, 'row align-items-center')}>
|
<div className={classNames(styles.header, 'row align-items-center')}>
|
||||||
<div className={styles.nav}>
|
<div className={styles.nav}>
|
||||||
|
@ -2,15 +2,22 @@ import React from 'react';
|
|||||||
import Head from 'next/head';
|
import Head from 'next/head';
|
||||||
import Header from 'components/layout/Header';
|
import Header from 'components/layout/Header';
|
||||||
import Footer from 'components/layout/Footer';
|
import Footer from 'components/layout/Footer';
|
||||||
|
import useLocale from 'hooks/useLocale';
|
||||||
|
import { rtlLocales } from 'lib/lang';
|
||||||
|
|
||||||
export default function Layout({ title, children, header = true, footer = true }) {
|
export default function Layout({ title, children, header = true, footer = true }) {
|
||||||
|
const [locale] = useLocale();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Head>
|
<Head>
|
||||||
<title>umami{title && ` - ${title}`}</title>
|
<title>umami{title && ` - ${title}`}</title>
|
||||||
</Head>
|
</Head>
|
||||||
|
|
||||||
{header && <Header />}
|
{header && <Header />}
|
||||||
<main className="container">{children}</main>
|
<main className="container" dir={rtlLocales.includes(locale) ? 'rtl' : 'ltr'}>
|
||||||
|
{children}
|
||||||
|
</main>
|
||||||
{footer && <Footer />}
|
{footer && <Footer />}
|
||||||
<div id="__modals" />
|
<div id="__modals" />
|
||||||
</>
|
</>
|
||||||
|
100
lang/ar-SA.json
Normal file
100
lang/ar-SA.json
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
{
|
||||||
|
"label.accounts": "الحسابات",
|
||||||
|
"label.add-account": "إضافة حساب",
|
||||||
|
"label.add-website": "إضافة موقع",
|
||||||
|
"label.administrator": "مدير عام؟",
|
||||||
|
"label.all": "الكل",
|
||||||
|
"label.all-events": "كافة الأحداث",
|
||||||
|
"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": "تفعيل مشاركة الرابط",
|
||||||
|
"label.invalid": "غير صحيح",
|
||||||
|
"label.invalid-domain": "النطاق غير صحيح",
|
||||||
|
"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.password": "كلمة المرور",
|
||||||
|
"label.passwords-dont-match": "كلمة المرور غير متطابقة",
|
||||||
|
"label.profile": "الملف الشخصي",
|
||||||
|
"label.realtime": "الوقت الفعلي",
|
||||||
|
"label.realtime-logs": "سجلات الوقت الفعلي",
|
||||||
|
"label.refresh": "تحديث",
|
||||||
|
"label.required": "اجباري",
|
||||||
|
"label.reset": "اعادة تعيين",
|
||||||
|
"label.save": "حفظ",
|
||||||
|
"label.settings": "اعدادات",
|
||||||
|
"label.share-url": "مشاركة الرابط",
|
||||||
|
"label.single-day": "يوم واحد",
|
||||||
|
"label.this-month": "الشهر الحالي",
|
||||||
|
"label.this-week": "الاسبوع الحالي",
|
||||||
|
"label.this-year": "السنة الحالية",
|
||||||
|
"label.timezone": "المنطقة الزمنية",
|
||||||
|
"label.today": "اليوم",
|
||||||
|
"label.tracking-code": "كود التتبع",
|
||||||
|
"label.unknown": "غير معروف",
|
||||||
|
"label.username": "اسم المستخدم",
|
||||||
|
"label.view-details": "عرض التفاصيل",
|
||||||
|
"label.websites": "المواقع",
|
||||||
|
"message.active-users": "{x} حاليا {x, plural, one {زائر واحد} other {زوار}}",
|
||||||
|
"message.confirm-delete": "هل أنت متأكد من حذف {target}?",
|
||||||
|
"message.copied": "تم النسخ!",
|
||||||
|
"message.delete-warning": "كافة البيانات المرتبطة سيم حذفها ايضا.",
|
||||||
|
"message.failure": "حدث خطأ ما.",
|
||||||
|
"message.get-share-url": "احصل على رابط المشاركة",
|
||||||
|
"message.get-tracking-code": "احصل على كود التتبع",
|
||||||
|
"message.go-to-settings": "الذهاب إلى الإعدادات",
|
||||||
|
"message.incorrect-username-password": "اسم المستخدم او كلمة المرور غير صحيحة.",
|
||||||
|
"message.log.visitor": "زائر من {country} يستخدم {browser} على {os} {device}",
|
||||||
|
"message.new-version-available": "توجد نسخة جديدة من umami رقم {version} سارع بالتحديث!",
|
||||||
|
"message.no-data-available": "لا توجد بيانات متاحة.",
|
||||||
|
"message.no-websites-configured": "لم تقم بإعداد اي موقع.",
|
||||||
|
"message.page-not-found": "الصفحة غير موجودة.",
|
||||||
|
"message.powered-by": "مشغل بواسطة {name}",
|
||||||
|
"message.save-success": "تم الحفظ بنجاح.",
|
||||||
|
"message.share-url": "هذا الرابط الذي تم مشاركته بشكل عام لـ {target}.",
|
||||||
|
"message.track-stats": "لتتبع الاحصاىيات لـ {target}, ضع الكود التالي في منطقة {head} في موقعك.",
|
||||||
|
"message.type-delete": "اكتب {delete} في الحقل التالي لتأكيد الحذف.",
|
||||||
|
"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.domain-only": "نطاق فقط",
|
||||||
|
"metrics.filter.raw": "مفصلة",
|
||||||
|
"metrics.operating-systems": "نظام التشغيل",
|
||||||
|
"metrics.page-views": "مشاهدات الصفحة",
|
||||||
|
"metrics.pages": "الصفحات",
|
||||||
|
"metrics.referrers": "التحويلات",
|
||||||
|
"metrics.unique-visitors": "زائرون فريدون",
|
||||||
|
"metrics.views": "مشاهدات",
|
||||||
|
"metrics.visitors": "زوار"
|
||||||
|
}
|
@ -1,4 +1,5 @@
|
|||||||
import {
|
import {
|
||||||
|
arSA,
|
||||||
cs,
|
cs,
|
||||||
sk,
|
sk,
|
||||||
da,
|
da,
|
||||||
@ -31,6 +32,7 @@ import {
|
|||||||
zhTW,
|
zhTW,
|
||||||
ca,
|
ca,
|
||||||
} from 'date-fns/locale';
|
} from 'date-fns/locale';
|
||||||
|
import arSAMessages from 'lang-compiled/ar-SA.json';
|
||||||
import enMessages from 'lang-compiled/en-US.json';
|
import enMessages from 'lang-compiled/en-US.json';
|
||||||
import nlMessages from 'lang-compiled/nl-NL.json';
|
import nlMessages from 'lang-compiled/nl-NL.json';
|
||||||
import zhCNMessages from 'lang-compiled/zh-CN.json';
|
import zhCNMessages from 'lang-compiled/zh-CN.json';
|
||||||
@ -65,6 +67,7 @@ import msMYMessages from 'lang-compiled/ms-MY.json';
|
|||||||
import caMessages from 'lang-compiled/ca-ES.json';
|
import caMessages from 'lang-compiled/ca-ES.json';
|
||||||
|
|
||||||
export const messages = {
|
export const messages = {
|
||||||
|
'ar-SA': arSAMessages,
|
||||||
'en-US': enMessages,
|
'en-US': enMessages,
|
||||||
'nl-NL': nlMessages,
|
'nl-NL': nlMessages,
|
||||||
'zh-CN': zhCNMessages,
|
'zh-CN': zhCNMessages,
|
||||||
@ -99,7 +102,10 @@ export const messages = {
|
|||||||
'ca-ES': caMessages,
|
'ca-ES': caMessages,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const rtlLocales = ['ar-SA', 'fa-IR'];
|
||||||
|
|
||||||
export const dateLocales = {
|
export const dateLocales = {
|
||||||
|
'ar-SA': arSA,
|
||||||
'en-US': enUS,
|
'en-US': enUS,
|
||||||
'nl-NL': nl,
|
'nl-NL': nl,
|
||||||
'zh-CN': zhCN,
|
'zh-CN': zhCN,
|
||||||
@ -135,6 +141,7 @@ export const dateLocales = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const menuOptions = [
|
export const menuOptions = [
|
||||||
|
{ label: 'العربية', value: 'ar-SA', display: 'ar' },
|
||||||
{ label: '中文', value: 'zh-CN', display: 'cn' },
|
{ label: '中文', value: 'zh-CN', display: 'cn' },
|
||||||
{ label: '中文(繁體)', value: 'zh-TW', display: 'tw' },
|
{ label: '中文(繁體)', value: 'zh-TW', display: 'tw' },
|
||||||
{ label: 'Català', value: 'ca-ES', display: 'ca' },
|
{ label: 'Català', value: 'ca-ES', display: 'ca' },
|
||||||
|
@ -119,6 +119,7 @@
|
|||||||
"postcss-flexbugs-fixes": "^5.0.2",
|
"postcss-flexbugs-fixes": "^5.0.2",
|
||||||
"postcss-import": "^13.0.0",
|
"postcss-import": "^13.0.0",
|
||||||
"postcss-preset-env": "^6.7.0",
|
"postcss-preset-env": "^6.7.0",
|
||||||
|
"postcss-rtlcss": "^3.3.2",
|
||||||
"prettier": "^2.3.0",
|
"prettier": "^2.3.0",
|
||||||
"prettier-eslint": "^12.0.0",
|
"prettier-eslint": "^12.0.0",
|
||||||
"prisma": "2.23.0",
|
"prisma": "2.23.0",
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
plugins: [
|
plugins: [
|
||||||
|
'postcss-rtlcss',
|
||||||
'postcss-flexbugs-fixes',
|
'postcss-flexbugs-fixes',
|
||||||
[
|
[
|
||||||
'postcss-preset-env',
|
'postcss-preset-env',
|
||||||
|
Loading…
x
Reference in New Issue
Block a user