memi-board 0.61.0 → 0.62.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/README.md +2 -0
  2. package/dist/{ar-B6HWpN6c.js → ar-Dg9e1ruU.js} +27 -5
  3. package/dist/ar-Dg9e1ruU.js.map +1 -0
  4. package/dist/{commentImages-DZBDCMWH.js → commentImages-DVrG0nFm.js} +164 -130
  5. package/dist/commentImages-DVrG0nFm.js.map +1 -0
  6. package/dist/composables/useMemiBoardComments.d.ts +105 -1
  7. package/dist/composables/useMemiBoardPosts.d.ts +109 -1
  8. package/dist/{de-CDaEV4cd.js → de-CpGJ3KkZ.js} +27 -5
  9. package/dist/de-CpGJ3KkZ.js.map +1 -0
  10. package/dist/{en-lbbULqlq.js → en-PEe41L86.js} +27 -5
  11. package/dist/en-PEe41L86.js.map +1 -0
  12. package/dist/{es-D8LzeTe0.js → es-tMBUNff2.js} +27 -5
  13. package/dist/es-tMBUNff2.js.map +1 -0
  14. package/dist/{fr-CQDZqx5d.js → fr-BFXp_PeM.js} +27 -5
  15. package/dist/fr-BFXp_PeM.js.map +1 -0
  16. package/dist/{id-CIaQbTzK.js → id-B7lgKUHZ.js} +27 -5
  17. package/dist/id-B7lgKUHZ.js.map +1 -0
  18. package/dist/index.d.ts +5 -4
  19. package/dist/index.js +1162 -1045
  20. package/dist/index.js.map +1 -1
  21. package/dist/{ja-B2iAAzYv.js → ja-3SXam5Sk.js} +27 -5
  22. package/dist/ja-3SXam5Sk.js.map +1 -0
  23. package/dist/{pt-CXAWS0Km.js → pt-C2_VknPa.js} +27 -5
  24. package/dist/pt-C2_VknPa.js.map +1 -0
  25. package/dist/runtime/components/CommentItem.vue +61 -2
  26. package/dist/runtime/components/CommentRevisions.vue +87 -0
  27. package/dist/runtime/components/Detail.vue +62 -4
  28. package/dist/runtime/components/Editor.vue +5 -1
  29. package/dist/runtime/components/PostRevisions.vue +107 -0
  30. package/dist/storage.js +27 -27
  31. package/dist/types.d.ts +51 -0
  32. package/dist/utils/boardPaths.d.ts +6 -0
  33. package/dist/utils/editLimits.d.ts +6 -0
  34. package/dist/{zh-ByjHExJt.js → zh-CuOjIYyr.js} +27 -5
  35. package/dist/zh-CuOjIYyr.js.map +1 -0
  36. package/docs/firestore.rules.example +133 -2
  37. package/package.json +1 -1
  38. package/dist/ar-B6HWpN6c.js.map +0 -1
  39. package/dist/commentImages-DZBDCMWH.js.map +0 -1
  40. package/dist/de-CDaEV4cd.js.map +0 -1
  41. package/dist/en-lbbULqlq.js.map +0 -1
  42. package/dist/es-D8LzeTe0.js.map +0 -1
  43. package/dist/fr-CQDZqx5d.js.map +0 -1
  44. package/dist/id-CIaQbTzK.js.map +0 -1
  45. package/dist/ja-B2iAAzYv.js.map +0 -1
  46. package/dist/pt-CXAWS0Km.js.map +0 -1
  47. package/dist/zh-ByjHExJt.js.map +0 -1
package/README.md CHANGED
@@ -328,6 +328,8 @@ Because it is the browser's native `:visited`, no server or DB storage is needed
328
328
 
329
329
  New text posts use a title URL within their board; only a conflicting address receives `-2`, `-3`, etc. Unpublished drafts count too. Address reservation, post metadata, and body are saved atomically. Editing or publishing preserves the address, and deleting a post keeps its reservation so an old link cannot point to a different post. Image boards keep ID URLs. See [URL behavior and reservation permissions](docs/host-integration.md#title-only-urls-for-new-posts).
330
330
 
331
+ 8. **Optional, after every host is on 0.62.0+: require edit history.** Add the Boolean field `revisionsRequired: true` to `memiBoardPostsSlugs/__migration`. From then on, Rules deny any post or comment edit that does not archive the previous version, and a post body can only be deleted together with its post. Leave it unset while older packages still write to the project, or their edits are denied.
332
+
331
333
  Hosts updating to 0.45.1 should also check the [procedure for applying the new rules and migrating](docs/firebase-setup.md#0451-rule-changes-and-migrating-existing-hosts). Installing the package or pushing the site does not deploy Firebase rules.
332
334
 
333
335
  **If Rules are only in the file and not deployed**, writing posts fails with `permission-denied` — the most common installation mistake.
@@ -78,7 +78,11 @@ var e = {
78
78
  edit: "تعديل التعليق",
79
79
  blind: "إخفاء التعليق",
80
80
  unblind: "إظهار التعليق",
81
- delete: "حذف التعليق"
81
+ delete: "حذف التعليق",
82
+ edited: "معدّل",
83
+ editedTooltip: "عُدّل {count} مرات · آخر تعديل {time}",
84
+ history: "سجل التعديلات",
85
+ editLimitTitle: "تم بلوغ حد التعديلات"
82
86
  },
83
87
  commentList: {
84
88
  loading: "جارٍ تحميل التعليقات",
@@ -98,7 +102,9 @@ var e = {
98
102
  bodyTooLong: "يمكن أن يصل التعليق إلى {max} حرف كحد أقصى.",
99
103
  replyTargetNotFound: "تعذّر العثور على التعليق الذي تردّ عليه.",
100
104
  threadNotFound: "تعذّر العثور على سلسلة التعليقات.",
101
- hasRepliesCannotDelete: "لا يمكن حذف التعليقات التي لها ردود حاليًا."
105
+ hasRepliesCannotDelete: "لا يمكن حذف التعليقات التي لها ردود حاليًا.",
106
+ commentNotFound: "تعذّر العثور على التعليق.",
107
+ editLimitReached: "يمكن تعديل التعليق {max} مرات كحد أقصى. اطلب من مدير اللوحة إن احتاج إلى تغييرات أخرى."
102
108
  },
103
109
  common: {
104
110
  action: {
@@ -163,7 +169,22 @@ var e = {
163
169
  backToList: "العودة إلى القائمة",
164
170
  postNav: "التنقل بين المنشورات",
165
171
  list: "القائمة",
166
- comments: "التعليقات"
172
+ comments: "التعليقات",
173
+ edited: "معدّل",
174
+ editedCount: "عُدّل {count} مرات",
175
+ editedTooltip: "عُدّل {count} مرات · آخر تعديل {time}",
176
+ revisions: "السجل {count}",
177
+ editLimitTitle: "تم بلوغ حد التعديلات"
178
+ },
179
+ postRevisions: {
180
+ title: "سجل التعديلات",
181
+ description: "النسخ السابقة التي استُبدلت بالتعديلات. لا يمكن تغيير السجل أو حذفه، ولا يراه إلا مديرو اللوحة.",
182
+ original: "الأصل",
183
+ version: "التعديل {version}",
184
+ replacedAt: "استُبدلت في {time}",
185
+ replacedBy: "عدّلها {name}",
186
+ empty: "لا يوجد سجل تعديلات بعد.",
187
+ loadFailed: "تعذّر تحميل سجل التعديلات."
167
188
  },
168
189
  editor: {
169
190
  titleOptionalPlaceholder: "العنوان (اتركه فارغًا ليكتب الذكاء الاصطناعي عنوانًا)",
@@ -435,7 +456,8 @@ var e = {
435
456
  boardIdRequired: "[memi-board] boardId مطلوب.",
436
457
  photoRequired: "يُرجى إضافة صورة.",
437
458
  bodyRequired: "يُرجى إدخال نص أو إرفاق صورة.",
438
- titleRequired: "يُرجى إدخال عنوان."
459
+ titleRequired: "يُرجى إدخال عنوان.",
460
+ editLimitReached: "يمكن تعديل المنشور {max} مرات كحد أقصى. اطلب من مدير اللوحة إن احتاج إلى تغييرات أخرى."
439
461
  },
440
462
  profile: {
441
463
  stats: {
@@ -815,4 +837,4 @@ var e = {
815
837
  //#endregion
816
838
  export { e as default };
817
839
 
818
- //# sourceMappingURL=ar-B6HWpN6c.js.map
840
+ //# sourceMappingURL=ar-Dg9e1ruU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ar-Dg9e1ruU.js","names":[],"sources":["../src/i18n/messages/ar.ts"],"sourcesContent":["import type { MemiBoardMessages } from '../translate'\n\n/** 짧은 화면 문구만 번역한다. 빠진 키는 en → ko 순으로 폴백된다. */\nconst messages: MemiBoardMessages = {\n attachments: {\n attach: 'إرفاق ملفات ({count} / {max})',\n dropOrClick: 'أفلت الملفات هنا أو انقر للإضافة',\n uploading: 'جارٍ رفع الملفات…',\n maxFiles: 'يمكنك إرفاق {max} ملفات كحد أقصى.',\n },\n auth: {\n writeRestricted: 'تم تقييد النشر والتعليق مؤقتًا بسبب تكرار تحذيرات المحتوى.',\n strikeSuffix: ' (تحذير {count}/{threshold})',\n strikeRestricted: ' عند بلوغ {count} تحذيرات سيتم تقييد النشر والتعليق.',\n notInitialized: '[memi-board] لم تتم تهيئة Firebase Auth.',\n },\n authorMemo: {\n tooLong: 'يمكن أن تصل الملاحظة إلى {max} حرف كحد أقصى.',\n },\n authorMenu: {\n menu: 'قائمة الكاتب',\n viewProfile: 'عرض الملف الشخصي',\n viewPosts: 'عرض المنشورات',\n viewComments: 'عرض التعليقات',\n memoAriaLabel: 'ملاحظة عن هذا الكاتب',\n memoTitle: 'ملاحظة خاصة',\n memoPlaceholder: 'دوِّن شيئًا عن هذا الكاتب…',\n bad: 'سيئ',\n good: 'جيد',\n },\n avatarCropModal: {\n title: 'قص صورة الملف الشخصي',\n description: 'تُعرض بشكل مربع (1:1). اضبط المنطقة لتناسبها.',\n confirm: 'قص ورفع',\n },\n boardSettings: {\n signInRequired: 'يُرجى تسجيل الدخول.',\n idAndNameRequired: 'يُرجى إدخال معرّف اللوحة واسمها.',\n deleteIdRequired: 'يلزم معرّف اللوحة لحذفها.',\n nameRequired: 'يُرجى إدخال اسم اللوحة.',\n },\n boardUsers: {\n unsupportedRole: 'دور غير مدعوم.',\n roleDescription: {\n admin: 'يدير أدوار المستخدمين وإعدادات اللوحة وكل المحتوى.',\n user: 'يمكنه كتابة المنشورات والتعليقات، وتعديل أو حذف محتواه فقط.',\n },\n },\n commentFeed: {\n empty: 'لا توجد تعليقات بعد.',\n emptyLiked: 'لا توجد تعليقات حصلت على إعجاب بعد.',\n loadFailed: 'تعذّر تحميل القائمة: {error}',\n blinded: 'أخفى المشرف هذا التعليق.',\n },\n commentForm: {\n translationSkipped: 'تم نشر التعليق دون ترجمة. يمكنك ترجمته لاحقًا من نموذج التعديل.',\n hiddenBoardDenied: 'في اللوحات المخفية، يمكن لفريق العمل المعيَّن فقط التعليق.',\n denied: 'ليس لديك إذن بالتعليق في هذه اللوحة.',\n signInRequired: 'يُرجى تسجيل الدخول.',\n writeRestricted: 'تم تقييد النشر مؤقتًا بسبب تكرار تحذيرات المحتوى.',\n moderationBlocked: 'يحتوي هذا على محتوى لا يمكن نشره.',\n replyTo: 'الرد على {name}',\n placeholder: 'اكتب تعليقًا',\n submitReply: 'رد',\n submit: 'تعليق',\n signInToComment: 'سجّل الدخول لكتابة تعليق.',\n attachHint: 'أسقط صورة هنا أو انقر لاختيار واحدة.',\n attachNote: 'jpg وpng وgif وwebp. يتم تصغير الصور الكبيرة إلى 5MB أو أقل.',\n removeImage: 'إزالة الصورة المرفقة',\n imageOnly: 'يمكن إرفاق صور jpg وpng وgif وwebp فقط.',\n uploadFailed: 'تعذر رفع الصورة.',\n uploading: 'جارٍ رفع الصورة…',\n },\n commentItem: {\n editRestricted: 'تم تقييد تعديل التعليقات مؤقتًا.',\n moderationBlocked: 'يحتوي هذا على محتوى لا يمكن نشره.',\n editFailed: 'تعذّر تعديل التعليق.',\n blindFailed: 'تعذّر تغيير حالة الإخفاء.',\n likeFailed: 'تعذّرت معالجة الإعجاب.',\n blinded: 'أخفى المشرف هذا التعليق.',\n attachedImage: 'صورة مرفقة بالتعليق',\n edit: 'تعديل التعليق',\n blind: 'إخفاء التعليق',\n unblind: 'إظهار التعليق',\n delete: 'حذف التعليق',\n edited: 'معدّل',\n editedTooltip: 'عُدّل {count} مرات · آخر تعديل {time}',\n history: 'سجل التعديلات',\n editLimitTitle: 'تم بلوغ حد التعديلات',\n },\n commentList: {\n loading: 'جارٍ تحميل التعليقات',\n empty: 'لا توجد تعليقات بعد.',\n loadMore: 'المزيد من التعليقات',\n loadingMore: 'جارٍ تحميل المزيد من التعليقات',\n },\n commentThread: {\n deleteConfirm: 'هل تريد حذف هذا التعليق؟',\n deleteFailed: 'تعذّر حذف التعليق.',\n hideReplies: 'إخفاء الردود',\n showReplies: 'الردود ({count})',\n loadMoreReplies: 'المزيد من الردود',\n },\n comments: {\n bodyRequired: 'يُرجى إدخال تعليق.',\n bodyTooLong: 'يمكن أن يصل التعليق إلى {max} حرف كحد أقصى.',\n replyTargetNotFound: 'تعذّر العثور على التعليق الذي تردّ عليه.',\n threadNotFound: 'تعذّر العثور على سلسلة التعليقات.',\n hasRepliesCannotDelete: 'لا يمكن حذف التعليقات التي لها ردود حاليًا.',\n commentNotFound: 'تعذّر العثور على التعليق.',\n editLimitReached: 'يمكن تعديل التعليق {max} مرات كحد أقصى. اطلب من مدير اللوحة إن احتاج إلى تغييرات أخرى.',\n },\n common: {\n action: {\n zoomIn: \"تكبير\",\n zoomOut: \"تصغير\",\n fitImage: \"ملاءمة الشاشة\",\n originalImage: \"الحجم الأصلي (100٪)\",\n cancel: 'إلغاء',\n save: 'حفظ',\n saved: 'تم الحفظ',\n edit: 'تعديل',\n delete: 'حذف',\n confirm: 'موافق',\n close: 'إغلاق',\n add: 'إضافة',\n more: 'المزيد',\n prev: 'السابق',\n next: 'التالي',\n retry: 'إعادة المحاولة',\n reply: 'رد',\n like: 'إعجاب',\n unlike: 'إلغاء الإعجاب',\n share: 'مشاركة',\n report: 'إبلاغ',\n signIn: 'تسجيل الدخول',\n signOut: 'تسجيل الخروج',\n write: 'كتابة',\n toTop: 'للأعلى',\n },\n label: {\n imageControls: \"أدوات تكبير الصورة\",\n anonymous: 'مجهول',\n user: 'مستخدم',\n image: 'صورة',\n draft: 'مسودة',\n loading: 'جارٍ التحميل…',\n viewCount: '{count} مشاهدة',\n },\n role: {\n admin: 'مشرف',\n staff: 'فريق العمل',\n user: 'مستخدم',\n },\n date: {\n justNow: 'الآن',\n fewSecondsAgo: 'قبل بضع ثوانٍ',\n checking: 'جارٍ التحقق من الوقت',\n createdAt: 'تاريخ الإنشاء: {time}',\n updatedAt: 'تاريخ التعديل: {time}',\n },\n },\n detail: {\n deleteConfirm: 'هل تريد حذف هذا المنشور؟ لا يمكن التراجع عن ذلك.',\n notFound: 'لم يتم العثور على المنشور.',\n draftPreview: 'معاينة غير منشورة',\n tag: 'وسم',\n draftNotice: 'لم يُنشر هذا المنشور بعد. لا يمكن لأحد غيرك رؤيته حتى تنشره.',\n publish: 'نشر',\n notice: 'إعلان',\n pin: 'تثبيت كإعلان',\n unpin: 'إلغاء الإعلان',\n backToList: 'العودة إلى القائمة',\n postNav: 'التنقل بين المنشورات',\n list: 'القائمة',\n comments: 'التعليقات',\n edited: 'معدّل',\n editedCount: 'عُدّل {count} مرات',\n editedTooltip: 'عُدّل {count} مرات · آخر تعديل {time}',\n revisions: 'السجل {count}',\n editLimitTitle: 'تم بلوغ حد التعديلات',\n },\n postRevisions: {\n title: 'سجل التعديلات',\n description: 'النسخ السابقة التي استُبدلت بالتعديلات. لا يمكن تغيير السجل أو حذفه، ولا يراه إلا مديرو اللوحة.',\n original: 'الأصل',\n version: 'التعديل {version}',\n replacedAt: 'استُبدلت في {time}',\n replacedBy: 'عدّلها {name}',\n empty: 'لا يوجد سجل تعديلات بعد.',\n loadFailed: 'تعذّر تحميل سجل التعديلات.',\n },\n editor: {\n titleOptionalPlaceholder: 'العنوان (اتركه فارغًا ليكتب الذكاء الاصطناعي عنوانًا)',\n titleAiNotice: 'كتب الذكاء الاصطناعي عنوانًا من نصك. احفظه إن أعجبك أو عدّله أولًا.',\n translateView: {\n title: 'معاينة الترجمة: {language}',\n notSaved: 'لم يتم الحفظ. هذه معاينة فقط.',\n },\n titlePlaceholder: 'العنوان',\n contentPlaceholder: 'اكتب شيئًا… اكتب / لفتح قائمة الكتل.',\n contentGuide: 'اكتب شيئًا…\\n· اسحب ملف صورة وأفلته هنا لرفعه.\\n· الصق صورة منسوخة (Ctrl/⌘+V) لرفعها فورًا.\\n· اكتب / لفتح قائمة الكتل: العناوين والقوائم والاقتباسات وغيرها.\\n· الصق رابط YouTube لتضمين الفيديو.',\n imageContentPlaceholder: 'اكتب شيئًا…',\n tagsPlaceholder: 'اكتب وسمًا واضغط Enter',\n pinNotice: 'تثبيت كإعلان',\n submitEdit: 'حفظ التغييرات',\n submitNext: 'التالي: معاينة',\n apply: 'تطبيق',\n imageOptimizing: 'جارٍ تحسين الصورة ورفعها…',\n cover: {\n imageLink: 'رابط الصورة',\n addPhoto: 'إضافة صور',\n alt: 'صورة {n}',\n representative: 'الغلاف',\n setRepresentative: 'تعيين كغلاف',\n setRepresentativeAria: 'تعيين الصورة {n} كغلاف',\n remove: 'إزالة الصورة',\n add: 'إضافة',\n uploading: 'جارٍ الرفع…',\n dropOrClick: 'أفلت الصور هنا أو انقر للإضافة',\n emptyHint: 'يمكن اختيار عدة صور · اختر الغلاف بعد الرفع · اسحب لإعادة الترتيب',\n uploadTitle: 'رفع',\n },\n uploadFailed: 'فشل الرفع',\n aiAssistant: 'مساعد الكتابة بالذكاء الاصطناعي',\n insertBlock: 'إدراج كتلة',\n blockMenu: 'قائمة الكتل',\n imageDialog: {\n title: 'إضافة صورة',\n chooseFile: 'اختيار صورة من جهازك',\n orLink: 'أو رابط صورة',\n urlLabel: 'URL الصورة',\n previewAlt: 'معاينة صورة خارجية',\n addLink: 'إضافة الرابط',\n },\n customDialog: {\n title: 'إعادة الصياغة بأسلوب مخصص',\n label: 'كيف تريد إعادة صياغته؟',\n help: 'مثال: بأسلوب ودّي / بأسلوب رسمي / كنقاط موجزة',\n placeholder: 'بأسلوب ودّي',\n },\n aiPreview: {\n title: 'مراجعة نتيجة AI',\n currentTitle: 'العنوان الحالي',\n newTitle: 'العنوان الجديد',\n currentContent: 'المحتوى الحالي',\n appendedContent: 'المحتوى المضاف',\n before: 'قبل',\n after: 'بعد',\n },\n menu: {\n ai: 'AI',\n aiContinue: 'المتابعة باستخدام AI',\n style: 'النمط',\n insert: 'إدراج',\n paragraph: 'فقرة',\n heading1: 'عنوان 1',\n heading2: 'عنوان 2',\n heading3: 'عنوان 3',\n bulletList: 'قائمة نقطية',\n orderedList: 'قائمة مرقّمة',\n blockquote: 'اقتباس',\n codeBlock: 'كتلة برمجية',\n horizontalRule: 'فاصل',\n image: 'صورة',\n turnInto: 'تحويل إلى',\n resetFormatting: 'إعادة تعيين التنسيق',\n duplicate: 'تكرار',\n moveUp: 'نقل للأعلى',\n moveDown: 'نقل للأسفل',\n delete: 'حذف',\n },\n toolbar: {\n link: 'رابط',\n image: 'صورة',\n format: 'التنسيق',\n bold: 'غامق',\n italic: 'مائل',\n underline: 'تسطير',\n strike: 'يتوسطه خط',\n title: 'العنوان',\n heading: 'عنوان',\n subheading: 'عنوان فرعي',\n body: 'النص',\n mono: 'أحادي المسافة',\n bulletList: 'قائمة نقطية',\n orderedList: 'قائمة مرقّمة',\n blockquote: 'اقتباس',\n codeBlock: 'كتلة برمجية',\n horizontalRule: 'فاصل',\n clearFormatting: 'مسح التنسيق',\n undo: 'تراجع',\n redo: 'إعادة',\n },\n ai: {\n translateView: 'عرض الترجمة',\n translateAll: 'ترجمة وحفظ بـ {count} لغات',\n proofread: 'تدقيق الإملاء',\n polish: 'تحسين الصياغة',\n continue: 'متابعة الكتابة',\n summarize: 'تلخيص موجز',\n translateEn: 'الترجمة إلى الإنجليزية',\n translateKo: 'الترجمة إلى الكورية',\n translateEmpty: 'أدخل عنوانًا أو نصًا للترجمة أولًا.',\n title: 'إنشاء عنوان من النص',\n custom: 'إعادة الصياغة بأسلوب مخصص…',\n failed: 'فشلت مهمة AI. يُرجى المحاولة مرة أخرى.',\n },\n youtubePrompt: 'أدخل رابط YouTube.',\n errors: {\n coverMax: 'يمكنك رفع {max} صور كحد أقصى.',\n imageUrlRequired: 'أدخل URL الصورة.',\n imageUrlInvalid: 'أدخل URL صالحًا للصورة.',\n imageUrlHttps: 'يُسمح فقط بعناوين URL للصور التي تبدأ بـ HTTPS.',\n imageUrlCredentials: 'لا يُسمح بعناوين URL التي تحتوي على بيانات تسجيل الدخول.',\n imageTimeout: 'يستغرق تحميل الصورة وقتًا طويلًا جدًا.',\n imageNotDisplayable: 'لا يمكن عرض هذه الصورة.',\n editorNotReady: 'المحرر غير جاهز. يُرجى المحاولة مرة أخرى.',\n imageLinkFailed: 'تعذّرت إضافة رابط الصورة.',\n imageOnly: 'يمكن رفع ملفات الصور فقط.',\n imageTooLarge: 'يجب ألا يتجاوز حجم الصورة الأصلية {mb}MB.',\n imageUploadFailed: 'فشل رفع الصورة.',\n pasteAsFile: 'الصق الصور كملفات أو اسحبها إلى المنطقة أعلاه.',\n postNotFound: 'لم يتم العثور على المنشور.',\n loadPermission: 'ليس لديك إذن بتحميل هذا المنشور. تأكد من تسجيل الدخول.',\n loadFailed: 'تعذّر تحميل المنشور: {message}',\n titleRequired: 'أدخل عنوانًا.',\n photoRequired: 'ارفع صورة واحدة على الأقل.',\n bodyRequired: 'اكتب نصًا أو أرفق صورة.',\n signInRequired: 'يلزم تسجيل الدخول.',\n boardMissing: 'لم يتم تحديد لوحة.',\n writeRestricted: 'تم تقييد النشر والتعليق مؤقتًا بسبب تكرار تحذيرات المحتوى.',\n moderationBlocked: 'يحتوي هذا على محتوى لا يمكن نشره.',\n },\n hint: {\n titling: 'جارٍ إنشاء العنوان…',\n reviewing: 'جارٍ مراجعة المحتوى…',\n saving: 'جارٍ الحفظ…',\n },\n },\n footer: {\n introduction: \"يعتمد memi-board على Nuxt 4 وVue 3 وTypeScript. وتجمع Nuxt UI وFirebase المنشورات والتعليقات والمحادثات في مكان واحد.\",\n eyebrow: \"مساحة للحوار\",\n tagline: \"مجتمعات صغيرة. قصص مشتركة.\",\n detail: \"التعريف المفصّل\",\n links: \"الروابط والتواصل\",\n email: \"البريد الإلكتروني\",\n credit: \"من تطوير memi\",\n feedback: \"أرسل ملاحظاتك\",\n feedbackSubject: \"ملاحظات memi-board\",\n feedbackBody: \"الملاحظات:\\n\",\n siteEyebrow: \"خدمات تستخدم memi-board\",\n changelog: \"سجل التغييرات\",\n info: {\n title: \"memi-board\",\n about: \"حول memi-board\",\n sites: \"أمثلة الاستخدام\",\n history: 'سجل الإصدارات',\n },\n sites: {\n description: \"خدمات تستخدم memi-board لمشاركة المنشورات والمحادثات.\",\n memi: \"مساحة للتطوير وقصص الحياة اليومية\",\n waiting: \"خدمة انتظار بسيطة عبر رمز QR\",\n track: \"تتبع GPS لتسجيل مسارات التنقل\",\n loop: \"تسجيل حركة المركبات وحلول المستشعرات\",\n safe: \"توصيل وإعداد جهاز منع الخلط بين الدواسات\",\n inviteTitle: \"هل تستخدمه أنت أيضًا؟\",\n invite: \"أخبرنا بعنوان موقعك.\",\n inviteSite: \"اتركه على memi.dev\",\n inviteOr: \"أو\",\n inviteSubject: \"نستخدم memi-board\",\n inviteBody: \"عنوان الموقع:\\n\",\n },\n stack: {\n ui: 'الواجهة والتجربة',\n data: 'البيانات وتسجيل الدخول',\n writing: 'الكتابة والأدوات المساعدة',\n },\n },\n likes: {\n signInRequired: 'يُرجى تسجيل الدخول.',\n commentNotFound: 'لم يتم العثور على التعليق.',\n },\n list: {\n boardInfo: {\n creator: 'أنشأه',\n managers: 'المديرون',\n staff: 'الموظفون',\n },\n commentCount: '{count} تعليقات',\n settings: 'الإعدادات',\n loadFailed: 'تعذّر تحميل القائمة: {error}',\n empty: 'لا توجد منشورات بعد.',\n notice: 'إعلان',\n photo: 'صورة',\n likeCount: 'الإعجابات {count}',\n info: {\n title: 'معلومات اللوحة',\n about: 'عن هذه اللوحة',\n history: 'سجل الإصدارات',\n },\n stack: {\n framework: 'إطار العمل واللغة',\n ui: 'الواجهة والتنسيق',\n backend: 'الخلفية والبيانات',\n },\n tech: {\n nuxt: 'إطار عمل SSR مبني على Vue',\n vue: 'Composition API · script setup',\n typescript: 'أنواع آمنة للبيانات والمكونات',\n nuxtUi: 'واجهة اللوحة والنماذج والنوافذ المنبثقة',\n tailwind: 'متجاوب · أنماط فاتحة/داكنة',\n lucide: 'أيقونات خفيفة ومتناسقة',\n dayjs: 'تواريخ وأوقات نسبية سهلة القراءة',\n firestore: 'قاعدة بيانات فورية للمنشورات والتعليقات',\n auth: 'تسجيل دخول وأذونات آمنة',\n storage: 'تخزين الصور والمرفقات',\n vuefire: 'ربط فوري بين Nuxt وFirebase',\n },\n },\n listViewSwitch: {\n card: 'بطاقة',\n default: 'افتراضي',\n dense: 'مضغوط',\n video: 'فيديو',\n },\n miniComments: {\n empty: 'لا توجد تعليقات بعد.',\n blinded: 'أخفى المشرف هذا التعليق.',\n },\n miniList: {\n empty: 'لا توجد منشورات بعد.',\n },\n miniPicker: {\n selectedCount: 'المحدد {count} / {max}',\n layoutHint: 'من 2 فأكثر تُعرض كشريط دوّار، و4 كشبكة',\n searchPlaceholder: 'البحث في العناوين',\n loading: 'جارٍ تحميل المنشورات…',\n noMore: 'لا توجد منشورات أخرى للاختيار.',\n },\n miniPost: {\n empty: 'لم يتم اختيار منشورات.',\n },\n moderation: {\n writeRestricted: 'تم تقييد النشر والتعليق مؤقتًا بسبب تكرار تحذيرات المحتوى.',\n },\n moderationPrompt: {\n localHit: 'لا يُسمح بتعبيرات مثل «{hit}». يُرجى إعادة الصياغة.',\n localGeneric: 'يحتوي هذا على ألفاظ نابية، لذا لا يمكن نشره. يُرجى إعادة الصياغة.',\n genericBlocked: 'يحتوي هذا على محتوى لا يمكن نشره. يُرجى تعديله.',\n categories: {\n abuse: 'ألفاظ نابية أو إهانات',\n spam: 'رسائل مزعجة أو إعلانات',\n adult: 'محتوى جنسي أو للبالغين',\n violence: 'عنف أو تهديدات',\n other: 'محتوى غير لائق',\n },\n },\n moderationStrike: {\n liftSoon: 'يُرفع قريبًا',\n liftInHours: 'يُرفع بعد {hours} ساعة تقريبًا',\n liftInDays: 'يُرفع بعد {days} يوم تقريبًا',\n liftInDaysHours: 'يُرفع بعد {days} يوم و{hours} ساعة تقريبًا',\n },\n posts: {\n boardIdRequired: '[memi-board] boardId مطلوب.',\n photoRequired: 'يُرجى إضافة صورة.',\n bodyRequired: 'يُرجى إدخال نص أو إرفاق صورة.',\n titleRequired: 'يُرجى إدخال عنوان.',\n editLimitReached: 'يمكن تعديل المنشور {max} مرات كحد أقصى. اطلب من مدير اللوحة إن احتاج إلى تغييرات أخرى.',\n },\n profile: {\n stats: {\n posts: '{count} منشورات',\n comments: '{count} تعليقات',\n aiUsage: 'استخدام الذكاء الاصطناعي {used} / {limit}',\n aiUsageResets: 'استخدام الذكاء الاصطناعي {used} / {limit} · يُعاد التعيين بعد {hours} ساعة',\n warnings: '{count} تحذيرات',\n },\n notFound: 'لم يتم العثور على المستخدم.',\n noName: 'بلا اسم',\n joined: 'انضم {time}',\n lastVisit: 'آخر ظهور {time}',\n },\n profileEditModal: {\n imageOnly: 'يمكن اختيار ملفات الصور فقط.',\n nameRequired: 'يُرجى إدخال اسم.',\n saveFailed: 'تعذّر حفظ الملف الشخصي.',\n title: 'تعديل الملف الشخصي',\n changePhoto: 'تغيير الصورة',\n name: 'الاسم',\n bio: 'نبذة',\n bioPlaceholder: 'عرّف الآخرين بنفسك',\n },\n reportButton: {\n commentTitle: 'الإبلاغ عن التعليق',\n failed: 'تعذّر إرسال البلاغ.',\n reported: 'تم الإبلاغ',\n title: 'الإبلاغ عن المنشور',\n done: 'تم استلام البلاغ. سيراجعه فريق العمل.',\n reason: 'السبب',\n detailPlaceholder: 'التفاصيل (اختياري)',\n submit: 'إبلاغ',\n\n \"status\": {\n \"open\": \"تم الاستلام\",\n \"dismissed\": \"مرفوض\",\n \"actioned\": \"اكتملت المراجعة\"\n },\n \"resultTitle\": \"حالة البلاغ\",\n \"result\": {\n \"open\": \"تم استلام بلاغك وهو بانتظار المراجعة.\",\n \"dismissed\": \"لم تجد المراجعة مخالفة.\",\n \"actioned\": \"اكتملت المراجعة. راجع السبب أدناه.\"\n },\n \"reviewedAt\": \"وقت المراجعة\",\n \"reviewNote\": \"سبب القرار\",\n \"noNote\": \"لا يوجد سبب مسجل لهذا السجل القديم.\",\n \"detailRequired\": \"التفاصيل (مطلوبة عند اختيار أخرى)\",\n },\n reportList: {\n target: {\n post: 'منشور',\n comment: 'تعليق',\n },\n deletedComment: 'نص التعليق غير متاح',\n blindComment: 'إخفاء هذا التعليق أيضًا',\n blindCommentHint: 'يخفي التعليق عن الجميع. يمكن للفريق استعادته من التعليق.',\n commentActionHint: 'يغيّر حالة البلاغ فقط. لا يخفي التعليق ولا يحذفه.',\n staffOnly: 'يمكن لفريق العمل فقط عرض البلاغات.',\n loadFailed: 'تعذّر تحميل القائمة: {error}',\n empty: 'لا توجد بلاغات معلّقة.',\n untitled: 'منشور بلا عنوان',\n author: 'بواسطة {name}',\n dismiss: 'رفض',\n\n \"tabs\": {\n \"open\": \"قيد الانتظار\",\n \"processed\": \"سجل المراجعات\"\n },\n \"filterLabel\": \"تصفية البلاغات\",\n \"orderHint\": \"الأحدث استلامًا أولًا.\",\n \"historyEmpty\": \"لا يوجد سجل مراجعات.\",\n \"confirm\": \"وضع علامة تمت المراجعة\",\n \"dismissTitle\": \"رفض البلاغ\",\n \"resolveTitle\": \"إكمال المراجعة\",\n \"actionHint\": \"يغير حالة البلاغ فقط، ولا يخفي المنشور أو يحذفه.\",\n \"publicNote\": \"هذا السبب ظاهر أيضًا لمقدّم البلاغ.\",\n \"reviewer\": \"المراجع\",\n \"reviewNote\": \"سبب القرار\",\n \"unknownReviewer\": \"مراجع غير معروف\",\n \"actionFailed\": \"تعذرت المعالجة. حاول مجددًا.\",\n },\n reports: {\n cannotReportOwnComment: 'لا يمكنك الإبلاغ عن تعليقك.',\n alreadyReportedComment: 'لقد أبلغت عن هذا التعليق بالفعل.',\n reason: {\n spam: 'رسائل مزعجة / إعلانات',\n abuse: 'إساءة / كراهية / تحرّش',\n adult: 'محتوى جنسي',\n illegal: 'محتوى غير قانوني',\n other: 'أخرى',\n },\n fallbackLabel: 'بلاغ',\n signInRequired: 'يُرجى تسجيل الدخول.',\n cannotReportOwn: 'لا يمكنك الإبلاغ عن منشورك.',\n reasonRequired: 'يُرجى اختيار سبب.',\n detailTooLong: 'يمكن أن تصل التفاصيل إلى {max} حرف كحد أقصى.',\n\n \"otherDetailRequired\": \"أدخل التفاصيل عند اختيار أخرى.\",\n \"reviewNoteRequired\": \"أدخل سبب القرار.\",\n \"alreadyReviewed\": \"تمت مراجعة هذا البلاغ مسبقًا. راجع القائمة.\",\n \"manageRequired\": \"ليست لديك صلاحية مراجعة هذا البلاغ.\",\n \"alreadyReported\": \"لقد أبلغت عن هذا المنشور مسبقًا.\",\n \"statusLoadFailed\": \"تعذر تحميل الحالة. حدّث الصفحة.\",\n },\n sectionUtil: {\n kind: {\n list: 'قائمة المنشورات',\n post: 'منشورات',\n comments: 'تعليقات',\n },\n sort: {\n latest: 'الأحدث',\n likes: 'الأكثر إعجابًا',\n },\n untitledPost: 'منشور',\n view: {\n media: 'الوسائط',\n list: 'قائمة',\n },\n },\n sections: {\n defaultTitle: 'القسم {n}',\n },\n seo: {\n allCategory: 'الكل',\n boardDescription: 'لوحة {name}',\n allDescription: 'اللوحة — الإعلانات وأخبار المجتمع.',\n postFallbackTitle: 'منشور | {site}',\n postFallbackDescription: 'اللوحة',\n photo: 'صورة',\n postDescriptionFallback: 'منشور في اللوحة',\n listTitle: '{name} | {site}',\n listTitleAll: 'اللوحة | {site}',\n listDescription: '{name} — تابع أحدث المنشورات.',\n listDescriptionAll: 'اللوحة — إعلانات وقصص.',\n },\n settings: {\n aiTitle: {\n label: 'كتابة العناوين بالذكاء الاصطناعي',\n help: 'عند ترك عنوان المنشور الجديد فارغًا، يكتب الذكاء الاصطناعي عنوانًا من النص (أو من أول صورة إن لم يوجد نص). تُرسل الصور إلى Google AI لهذا الغرض فقط. أوقفه لإلزام كتابة العنوان ولإيقاف إرسال الصور.',\n },\n site: {\n apply: 'تطبيق',\n applied: 'تم التطبيق.',\n title: 'الإعدادات العامة',\n help: 'تُطبَّق على الموقع كله، وتتغلّب على إعدادات التطبيق المضيف، وتسري فور تغييرها.',\n ai: { label: 'استخدام ميزات الذكاء الاصطناعي', help: 'أوقفه إذا تعذّر استخدام الذكاء الاصطناعي، مثلًا بسبب التكلفة. يوقف الترجمة ومساعد الكتابة وعناوين الذكاء الاصطناعي والإشراف بالذكاء الاصطناعي، ولن تُرسل الصور إليه. يستمر عمل فحص الكلمات المحظورة.' },\n i18n: { label: 'استخدام التدويل', help: 'عند إيقافه تُثبَّت كل الشاشات على اللغة المختارة أدناه وتتوقف الترجمة. لا تُحذف الترجمات المحفوظة.' },\n locales: { label: 'اللغات المتاحة', help: 'تُترجم اللغات الـ {count} المختارة فقط وتظهر في قائمة اللغات. لا تُنشأ ترجمات جديدة للغات غير المختارة، ولا تُحذف الترجمات المحفوظة.' },\n locale: { label: 'اللغة الافتراضية', help: 'اللغة المستخدمة عندما لا يحدد التطبيق المضيف لغة.', fixedLabel: 'اللغة الثابتة', fixedHelp: 'تُعرض كل الشاشات بهذه اللغة.' },\n },\n i18nBoard: {\n label: 'التدويل',\n help: 'عند التفعيل تُترجم تلقائيًا إلى {count} لغات اسم اللوحة ووصفها والمنشورات والتعليقات الجديدة وتُحفظ معها. عند الإيقاف يُعرض النص الأصلي فقط.',\n existing: 'ترجمة المنشورات الحالية أيضًا',\n },\n about: {\n label: 'إظهار About memi-board',\n help: 'يعرض رابط About memi-board ونافذته في أسفل كل شاشة لوحة. أوقفه لإخفائه في الموقع كله.',\n },\n postTranslations: {\n label: 'ترجمة المنشورات الحالية',\n help: 'يبحث عن المنشورات التي ترجمتها مفقودة أو لم تعد تطابق الأصل، ثم يترجمها ويحفظها دفعة واحدة. استخدمه للوحات التي أُوقفت فيها الترجمة التلقائية أو لاستكمال المنشورات التي فاتتها الترجمة. لا يستهلك حصة الذكاء الاصطناعي اليومية.',\n scan: 'البحث عن منشورات للترجمة',\n run: 'ترجمة {count} منشورات',\n confirm: 'سيتم ترجمة {count} منشورات وحفظها مع استدعاء الذكاء الاصطناعي لكل منها. هل تتابع؟',\n progress: 'جارٍ الترجمة… اكتمل {done}، فشل {failed}',\n allDone: 'جميع المنشورات المنشورة وعددها {total} ترجماتها محدّثة.',\n found: '{count} من أصل {total} منشورات منشورة تحتاج إلى ترجمة.',\n failed: 'تعذّرت ترجمة {count} منشورات. ابحث مرة أخرى وأعد المحاولة.',\n },\n loading: 'جارٍ تحميل الإعدادات…',\n noAccess: 'ليس لديك صلاحية الوصول',\n notFound: {\n title: 'لم يتم العثور على اللوحة',\n checkAddress: 'يُرجى التحقق من العنوان.',\n checkBoardAddress: 'يُرجى التحقق من عنوان اللوحة.',\n },\n newBoard: {\n title: 'هذه اللوحة غير موجودة بعد',\n description: 'املأ البيانات أدناه واحفظها لإنشائها بهذا المعرّف.',\n },\n noLabel: 'بلا تسمية',\n option: {\n default: 'قياسي',\n },\n id: {\n label: 'معرّف الفئة',\n help: 'يُستخدم في URL والبيانات',\n },\n writeRole: {\n label: 'من يمكنه النشر',\n help: 'الحد الأدنى من الدور المطلوب للنشر في هذه الفئة',\n helpShort: 'الحد الأدنى من الدور المطلوب للنشر',\n options: {\n user: 'المستخدمون فما فوق',\n staff: 'فريق العمل فما فوق',\n admin: 'المشرفون فقط',\n },\n },\n commentWriteRole: {\n label: 'من يمكنه التعليق',\n help: 'الحد الأدنى من الدور المطلوب للتعليق في هذه الفئة',\n helpShort: 'الحد الأدنى من الدور المطلوب للتعليق',\n hiddenFixed: 'فريق العمل المعيَّن فقط (ثابت للوحات المخفية)',\n },\n staff: {\n label: 'فريق العمل المعيَّن',\n help: 'يمكن لفريق العمل المحدد فقط إعداد هذه اللوحة وإدارتها. اتركه فارغًا ليقتصر الأمر على المشرفين',\n placeholder: 'المشرفون فقط (دون تعيين فريق عمل)',\n },\n label: {\n label: 'الاسم المعروض',\n help: 'الاسم الذي يراه المستخدمون',\n },\n description: {\n label: 'الوصف',\n help: 'يظهر أعلى اللوحة وفي أماكن أخرى',\n placeholder: 'وصف قصير لهذه اللوحة (اختياري)',\n },\n visibility: {\n label: 'الظهور',\n options: {\n public: {\n label: 'ظاهرة',\n description: 'تظهر في القائمة الكاملة وعوامل التصفية',\n },\n hidden: {\n label: 'مخفية',\n description: 'يوميات أو خاصة. يمكن لفريق العمل المعيَّن فقط التعليق',\n },\n },\n },\n listView: {\n label: 'عرض القائمة',\n help: 'طريقة عرض قائمة المنشورات',\n options: {\n card: 'بطاقة',\n dense: 'مضغوط',\n video: 'فيديو',\n },\n },\n editorType: {\n label: 'نموذج النشر',\n help: 'طريقة كتابة المنشورات',\n options: {\n default: 'كتابة عنوان ونص',\n image: 'إضافة عدة صور وصورة غلاف',\n },\n },\n bulk: {\n title: 'تطبيق على كل اللوحات',\n apply: 'تطبيق على {count} لوحات',\n applyShort: 'تطبيق',\n confirmTitle: 'تطبيق على كل اللوحات',\n translateUntranslated: 'ترجمة اللوحات غير المترجمة ({count})',\n },\n translationLocales: {\n label: 'لغات الترجمة',\n },\n locale: {\n label: 'لغة اللوحة',\n auto: 'تلقائي (حسب لغة الموقع)',\n },\n autoTranslate: {\n action: \"ترجمة إلى {count} لغات\",\n manualHelp: \"ترجم اسم العرض والوصف معًا، ثم اضغط على حفظ للتطبيق.\",\n pending: \"الترجمات إلى {count} لغات جاهزة. اضغط على حفظ للتطبيق.\",\n manualFailed: \"فشلت الترجمة. تم الاحتفاظ بالنص. يرجى المحاولة مرة أخرى.\",\n label: 'الترجمة إلى {count} لغات عند الحفظ',\n help: 'عند التشغيل تُترجم الاسم والوصف إلى {count} لغات. عند الإيقاف لا تُترجم. لا تُعاد ترجمة النص إذا لم يتغير.',\n failed: 'حُفظت الإعدادات، لكن فشلت الترجمة إلى {count} لغات. احفظ مرة أخرى.',\n ready: 'الاسم والوصف محفوظان بـ {count} لغات.',\n },\n action: {\n moveDown: 'للأسفل',\n goToBoard: 'الانتقال إلى اللوحة',\n deleteBoard: 'حذف اللوحة',\n create: 'إنشاء',\n },\n newCategoryPlaceholder: 'اسم الفئة الجديدة',\n savedCategory: 'تم حفظ الفئة «{label}».',\n savedSettings: 'تم حفظ إعدادات اللوحة.',\n created: 'تم إنشاء اللوحة.',\n error: {\n orderFailed: 'تعذّر حفظ ترتيب الفئات.',\n deleteFailed: 'تعذّر حذف اللوحة وبياناتها.',\n saveFailed: 'تعذّر حفظ إعدادات اللوحة.',\n deleteAllFailed: 'تعذّر حذف بيانات اللوحة.',\n },\n danger: {\n title: 'منطقة الخطر',\n confirmLabel: 'اكتب «{phrase}» للتأكيد',\n phrase: 'حذف بيانات اللوحة',\n button: 'حذف كل البيانات',\n done: 'تم حذف كل بيانات اللوحة.',\n },\n },\n shareButton: {\n copied: 'تم نسخ الرابط',\n },\n signIn: {\n withGoogle: 'تسجيل الدخول باستخدام Google',\n withApple: 'تسجيل الدخول باستخدام Apple',\n or: 'أو',\n name: 'الاسم',\n email: 'البريد الإلكتروني',\n password: 'كلمة المرور',\n signUp: 'إنشاء حساب',\n toSignUp: 'ليس لديك حساب؟ أنشئ حسابًا',\n toSignIn: 'لديك حساب بالفعل؟ سجّل الدخول',\n },\n storage: {\n sourceTooLarge: 'يجب ألا يتجاوز حجم الصورة الأصلية {max}MB.',\n imageOnly: 'يمكن رفع ملفات الصور فقط.',\n canvasUnavailable: 'Canvas غير متاح',\n compressFailed: 'فشل الضغط',\n loadFailed: 'فشل تحميل الصورة',\n },\n swipeHint: {\n title: 'جرّب السحب يمينًا أو يسارًا',\n description: 'اسحب لليسار للمنشور التالي، ولليمين للمنشور السابق.',\n },\n userCommentList: {\n loadFailed: 'تعذّر تحميل القائمة: {error}',\n empty: 'لا توجد تعليقات بعد.',\n blinded: 'أخفى المشرف هذا التعليق.',\n likes: 'الإعجابات {count}',\n },\n userPostList: {\n loadFailed: 'تعذّر تحميل القائمة: {error}',\n empty: 'لا توجد منشورات بعد.',\n },\n users: {\n changeRoleFailed: 'تعذّر تغيير الدور.',\n loading: 'جارٍ تحميل المستخدمين…',\n noPermission: {\n title: 'لا توجد صلاحية',\n description: 'يمكن لمشرفي اللوحة فقط إدارة أدوار المستخدمين.',\n },\n empty: 'لم يسجّل أي مستخدم الدخول إلى اللوحة بعد.',\n noName: 'بلا اسم',\n moderationWarnings: 'تحذيرات المحتوى: {count}',\n },\n writingAssistant: {\n dailyLimit: 'يمكن استخدام مساعد الكتابة بالذكاء الاصطناعي حتى {limit} مرة في اليوم. حاول مرة أخرى بعد حوالي {hours} ساعة.',\n loginRequired: 'سجّل الدخول لاستخدام مساعد الكتابة بالذكاء الاصطناعي.',\n userMissing: 'تعذّر التحقق من معلومات المستخدم. يُرجى المحاولة مرة أخرى.',\n contentRequired: 'أدخل أولًا محتوى ليعمل عليه AI.',\n customRequired: 'أدخل تعليمات لطريقة إعادة الصياغة.',\n emptyResult: 'لم يتمكن AI من إنتاج نتيجة. يُرجى المحاولة مرة أخرى.',\n translateEmpty: 'أدخل عنوانًا أو نصًا للترجمة أولًا.',\n translateTooLong: 'لا يمكن حفظ نص أطول من {limit} حرفًا بـ {count} لغات. اختصره ثم أعد المحاولة.',\n translateIncomplete: 'عادت بعض اللغات فارغة. يُرجى المحاولة مرة أخرى.',\n failed: 'فشلت مهمة AI. يُرجى المحاولة مرة أخرى.',\n actions: {\n proofread: 'تدقيق الإملاء',\n polish: 'تحسين الجمل',\n continue: 'متابعة الكتابة',\n summarize: 'تلخيص',\n translateEn: 'الترجمة إلى الإنجليزية',\n translateKo: 'الترجمة إلى الكورية',\n translateAll: 'ترجمة وحفظ بـ {count} لغات',\n translateSaved: 'تم الحفظ بـ {count} لغات. يرى القارئ ترجمة لغته.',\n translatePending: 'ترجمات {count} لغات جاهزة. تُحفظ مع المنشور.',\n translateEmpty: 'أدخل عنوانًا أو نصًا للترجمة أولًا.',\n title: 'إنشاء عنوان من النص',\n custom: 'إعادة الصياغة بأسلوب مخصص…',\n },\n },\n}\n\nexport default messages\n"],"mappings":"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"}