- {{ $t('status.poll.count', [formatHumanReadableNumber(poll.votersCount ?? 0)]) }}
+
+
+
+ {{ votersCountHR }}
+ {{ votersCountNumber }}
+
+ {{ votersCountNumber }}
+
·
diff --git a/components/status/StatusPreviewGitHub.vue b/components/status/StatusPreviewGitHub.vue
index 3c7d90fe..5d0da480 100644
--- a/components/status/StatusPreviewGitHub.vue
+++ b/components/status/StatusPreviewGitHub.vue
@@ -102,10 +102,10 @@ const meta = $computed(() => {
{{ meta.user }}
-
+
#{{ meta.number }}
-
+
PR #{{ meta.number }}
{{ meta.details }}
diff --git a/components/timeline/TimelinePaginator.vue b/components/timeline/TimelinePaginator.vue
index 0a65fbb7..b651ff80 100644
--- a/components/timeline/TimelinePaginator.vue
+++ b/components/timeline/TimelinePaginator.vue
@@ -11,6 +11,7 @@ const { paginator, stream } = defineProps<{
preprocess?: (items: any[]) => any[]
}>()
+const { formatNumber } = useHumanReadableNumber()
const virtualScroller = $(computedEager(() => useFeatureFlags().experimentalVirtualScroll))
@@ -18,7 +19,7 @@ const virtualScroller = $(computedEager(() => useFeatureFlags().experimentalVirt
diff --git a/components/user/UserSignIn.vue b/components/user/UserSignIn.vue
index 0d33c3dc..d0d4ba7d 100644
--- a/components/user/UserSignIn.vue
+++ b/components/user/UserSignIn.vue
@@ -92,7 +92,7 @@ onMounted(async () => {
diff --git a/components/user/UserSwitcher.vue b/components/user/UserSwitcher.vue
index 2cfa4af1..1a806fe9 100644
--- a/components/user/UserSwitcher.vue
+++ b/components/user/UserSwitcher.vue
@@ -53,7 +53,7 @@ const switchUser = (user: UserLogin) => {
diff --git a/composables/i18n.ts b/composables/i18n.ts
index 36470587..0e8f6e15 100644
--- a/composables/i18n.ts
+++ b/composables/i18n.ts
@@ -3,46 +3,30 @@ import type { MaybeComputedRef, UseTimeAgoOptions } from '@vueuse/core'
const formatter = Intl.NumberFormat()
-const humanReadableNumber = (
- num: number,
- { k, m }: { k: string; m: string } = { k: 'K', m: 'M' },
- useFormatter: Intl.NumberFormat = formatter,
-) => {
- if (num < 10000)
- return useFormatter.format(num)
-
- // show 1 decimal: we cannot use toFixed(1), it is a string
- if (num < 1000000)
- return `${useFormatter.format(Math.floor(num / 100) / 10)}${k}`
-
- // show 2 decimals: we cannot use toFixed(2), it is a string
- return `${useFormatter.format(Math.floor(num / 10000) / 100)}${m}`
-}
-
export const formattedNumber = (num: number, useFormatter: Intl.NumberFormat = formatter) => {
return useFormatter.format(num)
}
export const useHumanReadableNumber = () => {
- const i18n = useI18n()
- const numberFormatter = $computed(() => Intl.NumberFormat(i18n.locale.value))
+ const { t, n, locale } = useI18n()
+
+ const fn = (num: number) => {
+ if (num < 10000)
+ return n(num, 'smallCounting', locale.value)
+
+ // show 1 decimal: we cannot use toFixed(1), it is a string
+ if (num < 1000000)
+ return `${n(Math.floor(num / 100) / 10, 'kiloCounting', locale.value)}${t('common.kiloSuffix')}`
+
+ // show 2 decimals: we cannot use toFixed(2), it is a string
+ return `${n(Math.floor(num / 10000) / 100, 'millionCounting', locale.value)}${t('common.megaSuffix')}`
+ }
+
return {
- formatHumanReadableNumber: (num: MaybeRef
) => {
- return humanReadableNumber(
- unref(num),
- { k: i18n.t('common.kiloSuffix'), m: i18n.t('common.megaSuffix') },
- numberFormatter,
- )
- },
- formatNumber: (num: MaybeRef) => {
- return formattedNumber(
- unref(num),
- numberFormatter,
- )
- },
- forSR: (num: MaybeRef) => {
- return unref(num) > 10000
- },
+ formatHumanReadableNumber: (num: MaybeRef) => fn(unref(num)),
+ formatNumber: (num: MaybeRef) => n(unref(num), 'smallCounting', locale.value),
+ formatPercentage: (num: MaybeRef) => n(unref(num), 'percentage', locale.value),
+ forSR: (num: MaybeRef) => unref(num) > 10000,
}
}
@@ -59,9 +43,17 @@ export const useFormattedDateTime = (
}
export const useTimeAgoOptions = (short = false): UseTimeAgoOptions => {
- const { d, t } = useI18n()
+ const { d, t, n: fnf, locale } = useI18n()
const prefix = short ? 'short_' : ''
+ const fn = (n: number, past: boolean, key: string) => {
+ return t(`time_ago_options.${prefix}${key}_${past ? 'past' : 'future'}`, n, {
+ named: {
+ v: fnf(n, 'smallCounting', locale.value),
+ },
+ })
+ }
+
return {
rounding: 'floor',
showSecond: !short,
@@ -72,13 +64,13 @@ export const useTimeAgoOptions = (short = false): UseTimeAgoOptions => {
past: n => n,
// just return the value
future: n => n,
- second: (n, p) => t(`time_ago_options.${prefix}second_${p ? 'past' : 'future'}`, n),
- minute: (n, p) => t(`time_ago_options.${prefix}minute_${p ? 'past' : 'future'}`, n),
- hour: (n, p) => t(`time_ago_options.${prefix}hour_${p ? 'past' : 'future'}`, n),
- day: (n, p) => t(`time_ago_options.${prefix}day_${p ? 'past' : 'future'}`, n),
- week: (n, p) => t(`time_ago_options.${prefix}week_${p ? 'past' : 'future'}`, n),
- month: (n, p) => t(`time_ago_options.${prefix}month_${p ? 'past' : 'future'}`, n),
- year: (n, p) => t(`time_ago_options.${prefix}year_${p ? 'past' : 'future'}`, n),
+ second: (n, p) => fn(n, p, 'second'),
+ minute: (n, p) => fn(n, p, 'minute'),
+ hour: (n, p) => fn(n, p, 'hour'),
+ day: (n, p) => fn(n, p, 'day'),
+ week: (n, p) => fn(n, p, 'week'),
+ month: (n, p) => fn(n, p, 'month'),
+ year: (n, p) => fn(n, p, 'year'),
invalid: '',
},
fullDateFormatter(date) {
diff --git a/config/i18n.ts b/config/i18n.ts
index 66c4aea4..aa1f184f 100644
--- a/config/i18n.ts
+++ b/config/i18n.ts
@@ -1,9 +1,16 @@
import type { NuxtI18nOptions } from '@nuxtjs/i18n'
-import type { DateTimeFormats } from '@intlify/core-base'
+import type { DateTimeFormats, NumberFormats, PluralizationRule, PluralizationRules } from '@intlify/core-base'
+
import type { LocaleObject } from '#i18n'
+interface LocaleObjectData extends LocaleObject {
+ numberFormats?: NumberFormats
+ dateTimeFormats?: DateTimeFormats
+ pluralRule?: PluralizationRule
+}
+
// @ts-expect-error dir is there, ts complaining
-const locales: LocaleObject[] = [
+const locales: LocaleObjectData[] = [
{
code: 'en-US',
file: 'en-US.json',
@@ -50,27 +57,79 @@ const locales: LocaleObject[] = [
name: 'Česky',
},
{
- code: 'ar',
+ code: 'ar-EG',
file: 'ar-EG.json',
name: 'العربية',
dir: 'rtl',
+ pluralRule: (choice: number) => {
+ const name = new Intl.PluralRules('ar-EG').select(choice)
+ return { zero: 0, one: 1, two: 2, few: 3, many: 4, other: 5 }[name]
+ },
},
].sort((a, b) => a.code.localeCompare(b.code))
-const datetimeFormats = Object.keys(locales).reduce((acc, key) => {
- acc[key] = {
- short: {
- dateStyle: 'short',
- timeStyle: 'short',
- },
- long: {
- dateStyle: 'long',
- timeStyle: 'medium',
- },
+const datetimeFormats = Object.values(locales).reduce((acc, data) => {
+ const dateTimeFormats = data.dateTimeFormats
+ if (dateTimeFormats) {
+ acc[data.code] = { ...dateTimeFormats }
+ delete data.dateTimeFormats
}
+ else {
+ acc[data.code] = {
+ short: {
+ dateStyle: 'short',
+ timeStyle: 'short',
+ },
+ long: {
+ dateStyle: 'long',
+ timeStyle: 'medium',
+ },
+ }
+ }
+
return acc
}, {})
+const numberFormats = Object.values(locales).reduce((acc, data) => {
+ const numberFormats = data.numberFormats
+ if (numberFormats) {
+ acc[data.code] = { ...numberFormats }
+ delete data.numberFormats
+ }
+ else {
+ acc[data.code] = {
+ percentage: {
+ style: 'percent',
+ maximumFractionDigits: 1,
+ },
+ smallCounting: {
+ style: 'decimal',
+ maximumFractionDigits: 0,
+ },
+ kiloCounting: {
+ style: 'decimal',
+ maximumFractionDigits: 1,
+ },
+ millionCounting: {
+ style: 'decimal',
+ maximumFractionDigits: 2,
+ },
+ }
+ }
+
+ return acc
+}, {})
+
+const pluralRules = Object.values(locales).reduce((acc, data) => {
+ const pluralRule = data.pluralRule
+ if (pluralRule) {
+ acc[data.code] = pluralRule
+ delete data.pluralRule
+ }
+
+ return acc
+}, {})
+
export const i18n: NuxtI18nOptions = {
locales,
strategy: 'no_prefix',
@@ -82,6 +141,8 @@ export const i18n: NuxtI18nOptions = {
fallbackWarn: false,
missingWarn: false,
datetimeFormats,
+ numberFormats,
+ pluralRules,
},
lazy: true,
}
diff --git a/locales/ar-EG.json b/locales/ar-EG.json
index ea6f33a5..50fc66ec 100644
--- a/locales/ar-EG.json
+++ b/locales/ar-EG.json
@@ -1,4 +1,11 @@
{
+ "a11y": {
+ "loading_page": "الصفحة قيد التحميل، يرجى الانتظار",
+ "loading_titled_page": "الصفحة {0} قيد التحميل ، يرجى الانتظار",
+ "locale_changed": "تم تغيير اللغة إلى {0}",
+ "locale_changing": "يتم تغيير اللغة، يرجى الانتظار",
+ "route_loaded": "تم تحميل الصفحة {0}"
+ },
"account": {
"avatar_description": "صورة حساب {0}",
"blocked_by": "تم حظرك من قبل هذا المستخدم",
@@ -11,9 +18,9 @@
"follow_back": "إعادة متابعة",
"follow_requested": "طلبت المتابعة",
"followers": "متابِعون",
- "followers_count": "{0} متابِعون|{0} متابِع|{0} متابِعون",
+ "followers_count": "لا يوجد متابعون|{0} متابِع|{0} متابِعين|{0} متابِعون|{0} متابِع|{0} متابِع",
"following": "مُتابَع",
- "following_count": "{0} مُتابَع",
+ "following_count": "لا يتبع أحدا|{0} مُتابَع|{0} مُتابَعين|{0} مُتابَعون|{0} مُتابَع|{0} مُتابَع",
"follows_you": "يتابعك",
"go_to_profile": "اعرض الصفحة التعريفية",
"joined": "انضم",
@@ -23,7 +30,7 @@
"mutuals": "المتبادلين",
"pinned": "المثبتة",
"posts": "المنشورات",
- "posts_count": "{0} منشورات|{0} منشور|{0} منشورات",
+ "posts_count": "{0} منشورات|{0} منشور|{0} منشورين|{0} منشورات|{0} منشور|{0} منشور",
"profile_description": "{0} رأسية حساب",
"profile_unavailable": "حساب غير متوفر",
"unblock": "إلغاء حظر",
@@ -31,12 +38,16 @@
"unmute": "إلغاء كتم"
},
"action": {
- "bookmark": "إضافة إلى المرجعية",
- "bookmarked": "مضاف إلى المرجعية",
+ "apply": "تطبيق",
+ "bookmark": "إضافة إلى العلامات المرجعية",
+ "bookmarked": "مضاف إلى العلامات المرجعية",
"boost": "إعادة نشر",
"boosted": "أعيد نشرها",
+ "clear_upload_failed": "مسح أخطاء تحميل الملف",
"close": "أغلق",
"compose": "منشور جديد",
+ "confirm": "أكد",
+ "edit": "تعديل",
"enter_app": "أدخل التطبيق",
"favourite": "إضافة إلى المفضلين",
"favourited": "مضاف إلى المفضلين",
@@ -45,6 +56,7 @@
"prev": "السابق",
"publish": "!نشر",
"reply": "رد",
+ "save": "حفظ",
"save_changes": "حفظ التغييرات",
"sign_in": "تسجيل الدخول",
"switch_account": "تغيير الحساب",
@@ -53,6 +65,10 @@
"app_desc_short": "موقع الكتروني ماستدون رشيق",
"app_logo": "Elk شعار",
"app_name": "Elk",
+ "attachment": {
+ "edit_title": "وصف",
+ "remove_label": "قم بإزالة المرفق"
+ },
"command": {
"activate": "تفعيل",
"complete": "أكمل",
@@ -68,6 +84,7 @@
"common": {
"end_of_list": "نهاية القائمة",
"error": "حدث خطأ",
+ "in": "في",
"kiloSuffix": "ألف",
"megaSuffix": "مليون",
"not_found": "404 غير معثور عليه",
@@ -79,8 +96,10 @@
"error": {
"account_not_found": "حساب {0} غير موجود",
"explore-list-empty": "لا توجد مشاركات شائعة الآن. تحقق مرة أخرى لاحقًا!",
+ "file_size_cannot_exceed_n_mb": "لا يمكن أن يتجاوز حجم الملف {0} ميغابايت",
"sign_in_error": "لا يمكن الاتصال بالموقع",
- "status_not_found": "لا يمكن إيجاد المنشور"
+ "status_not_found": "لا يمكن إيجاد المنشور",
+ "unsupported_file_format": "لا يمكن تحميل هذا النوع من الملفات"
},
"help": {
"desc_highlight": "توقع بعض الأخطاء والميزات المفقودة هنا وهناك.",
@@ -111,23 +130,25 @@
"unblock_account": "رفع الحظر عن {0}",
"unblock_domain": "رفع الحظر عن النطاق {0}",
"unmute_account": "إلغاء كتم الحساب {0}",
- "unmute_conversation": "إعادة الصوت",
+ "unmute_conversation": "إلغاء كتم المحادثة",
"unpin_on_profile": "إلغاء التثبيت من الملف الشخصي"
},
"nav": {
- "bookmarks": "الفواصل المرجعية",
+ "bookmarks": "العلامات المرجعية",
"built_at": "Built {0}",
"conversations": "المحادثات",
"explore": "استكشف",
"favourites": "المفضلة",
"federated": "الفديرالية",
- "home": "الخيط الزمني الرئيسي",
+ "home": "الرئيسيّة",
"local": "المحلي",
- "notifications": "الإشعارات",
+ "notifications": "التنبيهات",
"profile": "الصفحة التعريفية",
"search": "البحث",
"select_feature_flags": "تبديل علامات الميزات",
+ "select_font_size": "حجم الخط",
"select_language": "اختار اللغة",
+ "settings": "الإعدادات",
"show_intro": "عرض المقدمة",
"toggle_theme": "تبديل المظهر",
"zen_mode": "الوضع الهادئ"
@@ -135,7 +156,7 @@
"notification": {
"favourited_post": "أُعجِب بمنشورك",
"followed_you": "بدأ في متابعتك",
- "followed_you_count": "تبعك {followers} أشخاص|تبعك {followers} شخص| تبعك {followers} أشخاص",
+ "followed_you_count": "لم يتبعك أحد|تبعك شخص واحد|تبعك شخصان|تبعك {followers} أشخاص|تبعك {followers} شخص| تبعك {followers} شخص",
"missing_type": "MISSING notification.type:",
"reblogged_post": "اعاد نشر منشورك",
"request_to_follow": "طلب(ت) متابعتك",
@@ -146,31 +167,33 @@
"mention": "المنشورات التي تذكرني",
"poll": "استطلاعات الرأي",
"reblog": "إعادة نشر منشورك",
- "title": "ما هي الإشعارات التي تريد تلقيها؟"
+ "title": "ما هي التنبيهات التي تريد تلقيها؟"
},
- "close_btn": "أغلق إعدادات الإشعارات",
+ "close_btn": "أغلق إعدادات التنبيهات",
"policy": {
"all": "من اي شخص",
"followed": "من الناس الذين أتابعهم",
"follower": "من الناس الذين يتبعونني",
"none": "من لا أحد",
- "title": "من الذي يمكنني تلقي إشعارات منه؟"
+ "title": "من الذي يمكنني تلقي التنبيهات منه؟"
},
"save_settings": "حفظ التغييرات الإعدادات",
- "show_btn": "إظهار إعدادات الإشعارات",
- "title": "إعدادات الإشعارات",
+ "show_btn": "إظهار إعدادات التنبيهات",
+ "title": "إعدادات التنبيهات",
"undo_settings": "تراجع عن تغييرات الإعدادات",
- "unsubscribe": "تعطيل الإشعارات",
- "unsubscribed_with_warning": "مكّن الإشعارات لتلقي الإشعارات من هذا الحساب بالنقر فوق الزر \"@:notification.settings.warning.enable_desktop{'\"'}",
- "unsupported": "متصفحك لا يدعم الإشعارات",
+ "unsubscribe": "تعطيل التنبيهات",
+ "unsubscribed_with_warning": "مكّن الإشعارات لتلقي التنبيهات من هذا الحساب بالنقر فوق الزر \"@:notification.settings.warning.enable_desktop{'\"'}",
+ "unsupported": "متصفحك لا يدعم التنبيهات",
"warning": {
"enable_close": "أغلق",
- "enable_description": "لتلقي إشعارات عندما لا يكون Elk مفتوحًا ، قم بتمكين إشعارات النظام. يمكنك التحكم بدقة في أنواع التفاعلات التي تنشئ إشعارات النظام عبر الزر \"Show Settings\" أعلاه بمجرد تمكينه.",
- "enable_description_short": "لتغيير إعدادات إشعارات النظام عندما لا يكون Elk مفتوحًا ، يجب أولاً تمكين إشعارات النظام.",
- "enable_desktop": "تفعيل إشعارات النظام",
- "enable_title": "لا تفوت أي شيء"
+ "enable_description": "لتلقي التنبيهات عندما لا يكون Elk مفتوحًا، قم بتمكين تنبيهات النظام. يمكنك التحكم بدقة في أنواع التفاعلات التي تنشئ تنبيهات النظام عبر الزر \"Show Settings\" أعلاه.",
+ "enable_description_short": "لتغيير إعدادات تنبيهات النظام عندما لا يكون Elk مفتوحًا، يجب أولاً تمكين تنبيهات النظام.",
+ "enable_desktop": "تفعيل تنبيهات النظام",
+ "enable_title": "لا تفوت عليك أي شيء",
+ "re_auth": "يبدو أن الخادم الخاص بك لا يدعم دفع التنبيهات. حاول تسجيل الخروج ثم تسجيل الدخول مرة أخرى ، إذا استمرت هذه الرسالة في الظهور ، فاتصل بمسؤول الخادم."
}
},
+ "signed_up": "تسجل",
"update_status": "قام(ت) بتحديث حالته(ا)"
},
"placeholder": {
@@ -182,23 +205,65 @@
},
"pwa": {
"dismiss": "تجاهل",
- "title": "يتوفر تحديث Elk الجديد"
+ "title": "يتوفر تحديث Elk الجديد",
+ "update": "تحديث",
+ "update_available_short": "تحديث Elk"
},
"search": {
"search_desc": "ابحث عن الأشخاص والهاشتاج"
},
"settings": {
+ "about": {
+ "label": "بشأن Elk"
+ },
"feature_flags": {
"avatar_on_avatar": "الصورة الرمزية على الصورة الرمزية",
"github_cards": "GitHub بطاقات",
+ "title": "الميزات التجريبية",
"user_picker": "الشريط الجانبي لمبدل المستخدم",
"virtual_scroll": "التمرير الافتراضي"
+ },
+ "interface": {
+ "color_mode": "وضع اللون",
+ "dark_mode": "الوضع الداكن",
+ "default": "(إفتراضي)",
+ "font_size": "حجم الخط",
+ "label": "واجهه المستخدم",
+ "light_mode": "وضع الضوء"
+ },
+ "language": {
+ "display_language": "اللغة المعروضة",
+ "label": "اللغة"
+ },
+ "preferences": {
+ "label": "التفضيلات"
+ },
+ "profile": {
+ "appearance": {
+ "bio": "النبذة التعريفية",
+ "description": "تعديل الصورة الرمزية واسم المستخدم والملف الشخصي...",
+ "display_name": "الاسم المعروض",
+ "label": "المظهر",
+ "title": "تعديل الملف الشخصي"
+ },
+ "featured_tags": {
+ "description": "يمكن للأشخاص تصفح مشاركاتك العامة تحت علامات الهاشتاغ هذه",
+ "label": "الهاشتاغ البارزة"
+ },
+ "label": "الملف الشخصي"
+ },
+ "select_a_settings": "اختر الإعداد",
+ "users": {
+ "export": "Export User Tokens",
+ "import": "Import User Tokens",
+ "label": "المستخدمون المسجلون"
}
},
"state": {
"edited": "(معدل)",
"editing": "تعديل",
"loading": "جاري التحميل ...",
+ "upload_failed": "التحميل فشل",
"uploading": "جاري التحميل ..."
},
"status": {
@@ -211,7 +276,7 @@
"dismiss": "تجاهل"
},
"poll": {
- "count": "{0} أصوات|{0} صوت|{0} أصوات",
+ "count": "لا توجد اصوات|صوت {0}|صوتين|{0} أصوات|{0} صوت|{0} صوت",
"ends": "ينتهي في {0}",
"finished": "انتهى في {0}"
},
@@ -219,7 +284,6 @@
"someone": "شخص ما",
"spoiler_show_less": "عرض أقل",
"spoiler_show_more": "عرض المزيد",
- "thread": "المحادثة",
"try_original_site": "جرب الموقع الأصلي"
},
"status_history": {
@@ -237,38 +301,38 @@
"posts_with_replies": "المنشورات والردود"
},
"time_ago_options": {
- "day_future": "في 0 يوم|غداً|في {n} يوم",
- "day_past": "قبل {n} يوم|البارحة| قبل 0 يوم",
- "hour_future": "في 0 ساعة|في 1 ساعة|في {n} ساعة",
- "hour_past": "قبل 0 ساعة|قبل ساعة واحدة|{n} من الساعات الماضية",
+ "day_future": "في 0 أيام|غدا|في يومين|في {v} أيام|في {v} يوم|في {v} يوم",
+ "day_past": "منذ 0 أيام|البارحة|منذ يومين|منذ {v} أيام|منذ {v} يوم|منذ {v} يوم",
+ "hour_future": "في 0 ساعات|في ساعة|في ساعتين|في {v} ساعات|في {v} ساعة|في {v} ساعة",
+ "hour_past": "منذ 0 ساعات|منذ ساعة واحدة|منذ ساعتين|منذ {v} ساعات|منذ {v} ساعة|منذ {v} ساعة",
"just_now": "الآن",
- "minute_future": "في 0 دقيقة|في دقيقة واحدة|في {n} دقيقة",
- "minute_past": "قبل 0 دقيقة|قبل دقيقة واحدة|قبل {n} دقيقة",
- "month_future": "في 0 شهر|الشهر القادم|في {n} شهر",
- "month_past": "قبل 0 شهر|الشهر الماضي|منذ {n} شهر",
- "second_future": "الآن|في ثانية|في {n} ثواني",
- "second_past": "للتو|منذ ثانية|منذ {n} ثانية",
- "short_day_future": "في {n} ي",
- "short_day_past": "{n}ي",
- "short_hour_future": "في {n} س",
- "short_hour_past": "{n}س",
- "short_minute_future": "في {n} دق",
- "short_minute_past": "{n}دق",
- "short_month_future": "في {n} ش",
- "short_month_past": "{n}ش",
- "short_second_future": "في {n} ",
- "short_second_past": "{n}",
- "short_week_future": "في {n} اسبوع",
- "short_week_past": "{n}اسبوع",
- "short_year_future": "في {n} سنة",
- "short_year_past": "{n}سنة",
- "week_future": "في 0 أسبوع | الأسبوع القادم | في {n} أسبوع",
- "week_past": "قبل 0 أسبوع | الأسبوع الماضي | {n} أسبوع مضى",
- "year_future": "في 0 سنة|العام القادم|في {n} سنة",
- "year_past": "منذ 0 سنة|العام الماضي|منذ {n} سنة"
+ "minute_future": "في 0 دقائق|في دقيقة واحدة|في دقيقتين|في {v} دقائق|في {v} دقيقة|في {v} دقيقة",
+ "minute_past": "منذ 0 دقائق|منذ دقيقة واحدة|منذ دقيقتين|منذ {v} دقائق|منذ {v} دقيقة|منذ {v} دقيقة",
+ "month_future": "في 0 أشهر|الشهر القادم|في شهرين|في {v} أشهر|في {v} شهر|في {v} شهر",
+ "month_past": "منذ 0 أشهر|الشهر الماضي|منذ شهرين|منذ {v} أشهر|منذ {v} شهر|منذ {v} شهر",
+ "second_future": "الآن|في ثانية|في ثانيتين|في {v} ثواني|في {v} ثانية|في {v} ثانية",
+ "second_past": "للتو|منذ ثانية|منذ ثانيتين|منذ {v} ثواني|منذ {v} ثانية|منذ {v} ثانية",
+ "short_day_future": "في 0 أيام|غدا|في يومين|في {v} أيام|في {v} يوم|في {v} يوم",
+ "short_day_past": "منذ 0 أيام|البارحة|منذ يومين|منذ {v} أيام|منذ {v} يوم|منذ {v} يوم",
+ "short_hour_future": "في 0 ساعات|في ساعة|في ساعتين|في {v} ساعات|في {v} ساعة|في {v} ساعة",
+ "short_hour_past": "منذ 0 ساعات|منذ ساعة واحدة|منذ ساعتين|منذ {v} ساعات|منذ {v} ساعة|منذ {v} ساعة",
+ "short_minute_future": "في 0 دقائق|في دقيقة واحدة|في دقيقتين|في {v} دقائق|في {v} دقيقة|في {v} دقيقة",
+ "short_minute_past": "منذ 0 دقائق|منذ دقيقة واحدة|منذ دقيقتين|منذ {v} دقائق|منذ {v} دقيقة|منذ {v} دقيقة",
+ "short_month_future": "في 0 أشهر|الشهر القادم|في شهرين|في {v} أشهر|في {v} شهر|في {v} شهر",
+ "short_month_past": "منذ 0 أشهر|الشهر الماضي|منذ شهرين|منذ {v} أشهر|منذ {v} شهر|منذ {v} شهر",
+ "short_second_future": "الآن|في ثانية|في ثانيتين|في {v} ثواني|في {v} ثانية|في {v} ثانية",
+ "short_second_past": "للتو|منذ ثانية|منذ ثانيتين|منذ {v} ثواني|منذ {v} ثانية|منذ {v} ثانية",
+ "short_week_future": "في 0 أسابيع|الاسبوع القادم|في اسبوعين|في {v} أسابيع|في {v} اسبوع|في {v} اسبوع",
+ "short_week_past": "منذ 0 أسابيع|الاسبوع الماضي|منذ اسبوعين|منذ {v} أسابيع|منذ {v} اسبوع|منذ {v} اسبوع",
+ "short_year_future": "هذا العام|العام القادم|في عامين|في {v} عاما|في {v} عام|في {v} عام",
+ "short_year_past": "هذا العام|العام الماضي|منذ عامين|منذ {v} عاما|منذ {v} عام|منذ {v} عام",
+ "week_future": "في 0 أسابيع|الاسبوع القادم|في اسبوعين|في {v} أسابيع|في {v} اسبوع|في {v} اسبوع",
+ "week_past": "منذ 0 أسابيع|الاسبوع الماضي|منذ اسبوعين|منذ {v} أسابيع|منذ {v} اسبوع|منذ {v} اسبوع",
+ "year_future": "هذا العام|العام القادم|في عامين|في {v} عاما|في {v} عام|في {v} عام",
+ "year_past": "هذا العام|العام الماضي|منذ عامين|منذ {v} عاما|منذ {v} عام|منذ {v} عام"
},
"timeline": {
- "show_new_items": "إظهار {n} عناصر جديدة|إظهار {n} عنصر جديد|إظهار {n} عناصر جديدة"
+ "show_new_items": "لا توجد عناصر جديدة|إظهار {v} عنصر جديد|إظهار {v} عنصرين جديدين|إظهار {v} عناصر جديدة|إظهار {v} عنصر جديد|إظهار {v} عنصر جديد"
},
"title": {
"federated_timeline": "الجدول الزمني الموحد",
@@ -278,15 +342,17 @@
"add_content_warning": "إضافة تحذير المحتوى",
"add_media": "أضف صورًا أو مقطع فيديو أو ملفًا صوتيًا",
"change_content_visibility": "تغيير خصوصية المحتوى",
+ "emoji": "رمز تعبيري",
"explore_links_intro": "يتم التحدث عن هذه القصص الإخبارية من قبل الأشخاص الموجودين على هذه الشبكة وغيرها من الشبكات اللامركزية في الوقت الحالي",
- "explore_posts_intro": "تكتسب هذه المنشورات من هذه الشبكة وغيرها من الشبكات اللامركزية زخمًا على هذه الشبكة في الوقت الحالي",
- "explore_tags_intro": "تكتسب هذه الهاشتاغ زخمًا بين الأشخاص على هذه الشبكة وغيرها من الشبكات اللامركزية في الوقت الحالي",
+ "explore_posts_intro": "تكتسب هذه المنشورات الكثير من النشاط على الشبكة وغيرها من الشبكات اللامركزية في الوقت الحالي",
+ "explore_tags_intro": "تكتسب هذه الهاشتاغ الكثير من النشاط بين الأشخاص على هذه الشبكة وغيرها من الشبكات اللامركزية في الوقت الحالي",
"toggle_code_block": "تبديل كتلة التعليمات البرمجية"
},
"user": {
"add_existing": "إضافة حساب قائم",
"server_address_label": "عنوان خادم ماستودون",
"sign_in_desc": "قم بتسجيل الدخول لمتابعة الملفات الشخصية والمشاركة والرد على المنشورات أو التفاعل من حسابك على خادم مختلف",
+ "sign_in_notice_title": "عرض البيانات العامة من {0}",
"sign_out_account": "تسجيل الخروج من {0}",
"tip_no_account": "إذا ليس لديك حساب ماستودون ، {0}",
"tip_register_account": "اختر خادم ماستودون الخاص بك وقم بتسجيل حساب"
diff --git a/locales/cs-CZ.json b/locales/cs-CZ.json
index a63ecac8..c08d142c 100644
--- a/locales/cs-CZ.json
+++ b/locales/cs-CZ.json
@@ -225,7 +225,7 @@
"year_past": "před 0 roky|minulý rok|před {n} lety "
},
"timeline": {
- "show_new_items": "Ukázat {n} nových položek|Ukázat {n} novou položku|Ukázat {n} nových položek"
+ "show_new_items": "Ukázat {v} nových položek|Ukázat {v} novou položku|Ukázat {v} nových položek"
},
"title": {
"federated_timeline": "Federovaná časová osa",
diff --git a/locales/de-DE.json b/locales/de-DE.json
index 3c2f1e2f..d81c1982 100644
--- a/locales/de-DE.json
+++ b/locales/de-DE.json
@@ -227,7 +227,7 @@
"year_past": "vor 0 Jahren|letztes Jahren|vor {n} Jahren"
},
"timeline": {
- "show_new_items": "Zeige {n} neue Beiträge|Zeige {n} neuen Beitrag|Zeige {n} neue Beiträge"
+ "show_new_items": "Zeige {v} neue Beiträge|Zeige {v} neuen Beitrag|Zeige {v} neue Beiträge"
},
"title": {
"federated_timeline": "Föderierte Timeline",
diff --git a/locales/en-GB.json b/locales/en-GB.json
index 453028e2..847ef80c 100644
--- a/locales/en-GB.json
+++ b/locales/en-GB.json
@@ -333,7 +333,7 @@
"year_past": "0 years ago|last year|{n} years ago"
},
"timeline": {
- "show_new_items": "Show {n} new items|Show {n} new item|Show {n} new items"
+ "show_new_items": "Show {v} new items|Show {v} new item|Show {v} new items"
},
"title": {
"federated_timeline": "Federated Timeline",
diff --git a/locales/en-US.json b/locales/en-US.json
index 25f74bfe..cd10875c 100644
--- a/locales/en-US.json
+++ b/locales/en-US.json
@@ -333,7 +333,7 @@
"year_past": "0 years ago|last year|{n} years ago"
},
"timeline": {
- "show_new_items": "Show {n} new items|Show {n} new item|Show {n} new items"
+ "show_new_items": "Show {v} new items|Show {v} new item|Show {v} new items"
},
"title": {
"federated_timeline": "Federated Timeline",
diff --git a/locales/es-ES.json b/locales/es-ES.json
index fc4b3138..cd148177 100644
--- a/locales/es-ES.json
+++ b/locales/es-ES.json
@@ -324,7 +324,7 @@
"year_past": "hace 0 años|el año pasado|hace {n} años"
},
"timeline": {
- "show_new_items": "Mostrar {n} nuevas publicaciones|Mostrar {n} nueva publicación|Mostrar {n} nuevas publicaciones"
+ "show_new_items": "Mostrar {v} nuevas publicaciones|Mostrar {v} nueva publicación|Mostrar {v} nuevas publicaciones"
},
"title": {
"federated_timeline": "Línea de tiempo federada",
diff --git a/locales/fr-FR.json b/locales/fr-FR.json
index 9f913e44..f251635b 100644
--- a/locales/fr-FR.json
+++ b/locales/fr-FR.json
@@ -285,7 +285,7 @@
"year_past": "il y a 0 année|l'année dernière|il y a {n} années"
},
"timeline": {
- "show_new_items": "Voir le nouveau message|Voir les {n} nouveaux messages"
+ "show_new_items": "Voir le nouveau message|Voir les {v} nouveaux messages"
},
"title": {
"federated_timeline": "Fil d'actualité fédéré",
diff --git a/locales/ja-JP.json b/locales/ja-JP.json
index 11f341a1..3dea7f7c 100644
--- a/locales/ja-JP.json
+++ b/locales/ja-JP.json
@@ -86,7 +86,7 @@
"posts_with_replies": "投稿と返信"
},
"timeline": {
- "show_new_items": "{n}件の新しい投稿"
+ "show_new_items": "{v}件の新しい投稿"
},
"title": {
"federated_timeline": "連合タイムライン",
diff --git a/locales/zh-CN.json b/locales/zh-CN.json
index 77930680..24f29aa1 100644
--- a/locales/zh-CN.json
+++ b/locales/zh-CN.json
@@ -333,7 +333,7 @@
"year_past": "现在|去年|{n}年前"
},
"timeline": {
- "show_new_items": "展示 {n} 条新帖文"
+ "show_new_items": "展示 {v} 条新帖文"
},
"title": {
"federated_timeline": "跨站时间线",
diff --git a/locales/zh-TW.json b/locales/zh-TW.json
index a5f88db8..deb30a39 100644
--- a/locales/zh-TW.json
+++ b/locales/zh-TW.json
@@ -333,7 +333,7 @@
"year_past": "現在|去年|{n}年前"
},
"timeline": {
- "show_new_items": "展示 {n} 條新帖文"
+ "show_new_items": "展示 {v} 條新帖文"
},
"title": {
"federated_timeline": "跨站時間線",
diff --git a/pages/pinned.vue b/pages/pinned.vue
index a88a16e6..0dc5f9dc 100644
--- a/pages/pinned.vue
+++ b/pages/pinned.vue
@@ -14,7 +14,7 @@ useHeadFixed({
-
+
{{ t('account.pinned') }}
diff --git a/pages/search.vue b/pages/search.vue
index fcf944dc..36aa3476 100644
--- a/pages/search.vue
+++ b/pages/search.vue
@@ -11,7 +11,7 @@ useHeadFixed({
-
+
{{ $t('nav.search') }}
diff --git a/pages/settings.vue b/pages/settings.vue
index 26c300fc..eba71bce 100644
--- a/pages/settings.vue
+++ b/pages/settings.vue
@@ -11,7 +11,7 @@ const isRootPath = computedEager(() => route.name === 'settings')
-
+
diff --git a/styles/global.css b/styles/global.css
index ab5b2555..29562a57 100644
--- a/styles/global.css
+++ b/styles/global.css
@@ -188,6 +188,10 @@ body {
stroke-width: 2;
}
+html[dir="rtl"] .rtl-flip {
+ transform: scale(-1, 1)
+}
+
em-emoji-picker {
--border-radius: 0;
}