memi-board 0.65.0 → 0.66.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 (57) hide show
  1. package/dist/{ar-Dg9e1ruU.js → ar-vCWN4UgB.js} +4 -1
  2. package/dist/ar-vCWN4UgB.js.map +1 -0
  3. package/dist/{commentImages-DHIuwvex.js → commentImages-Bdy_5GoM.js} +96 -49
  4. package/dist/commentImages-Bdy_5GoM.js.map +1 -0
  5. package/dist/composables/useMemiBoardAutoTranslate.d.ts +1 -1
  6. package/dist/{de-CpGJ3KkZ.js → de-Br2Z_mcP.js} +4 -1
  7. package/dist/de-Br2Z_mcP.js.map +1 -0
  8. package/dist/{en-yS55nNno.js → en-dwiFlzpm.js} +45 -1
  9. package/dist/en-dwiFlzpm.js.map +1 -0
  10. package/dist/{es-tMBUNff2.js → es-E1OXjEpy.js} +4 -1
  11. package/dist/{es-tMBUNff2.js.map → es-E1OXjEpy.js.map} +1 -1
  12. package/dist/{fr-BFXp_PeM.js → fr-BBiQmovr.js} +4 -1
  13. package/dist/fr-BBiQmovr.js.map +1 -0
  14. package/dist/{id-B7lgKUHZ.js → id-D-XLJeg9.js} +4 -1
  15. package/dist/id-D-XLJeg9.js.map +1 -0
  16. package/dist/index.d.ts +6 -1
  17. package/dist/index.js +1678 -1597
  18. package/dist/index.js.map +1 -1
  19. package/dist/{ja-3SXam5Sk.js → ja-DDx8RDwB.js} +4 -1
  20. package/dist/ja-DDx8RDwB.js.map +1 -0
  21. package/dist/{pt-C2_VknPa.js → pt-CmLdTNz1.js} +4 -1
  22. package/dist/pt-CmLdTNz1.js.map +1 -0
  23. package/dist/runtime/components/Attachments.vue +2 -2
  24. package/dist/runtime/components/AuthorMenu.vue +7 -3
  25. package/dist/runtime/components/CommentItem.vue +178 -175
  26. package/dist/runtime/components/Diagnostics.vue +32 -0
  27. package/dist/runtime/components/Editor.vue +94 -8
  28. package/dist/runtime/components/Footer.vue +27 -3
  29. package/dist/runtime/components/GameMemory.vue +78 -0
  30. package/dist/runtime/components/GameSnake.vue +162 -0
  31. package/dist/runtime/components/GameSudoku.vue +118 -0
  32. package/dist/runtime/components/ListCard.vue +9 -5
  33. package/dist/runtime/components/ProfileEditModal.vue +37 -14
  34. package/dist/runtime/components/Settings.vue +2 -0
  35. package/dist/runtime/components/Spec.vue +276 -0
  36. package/dist/runtime/components/WaitingGames.vue +31 -0
  37. package/dist/runtime/components/WaitingOverlay.vue +76 -0
  38. package/dist/storage.js +22 -22
  39. package/dist/utils/localizedFields.d.ts +8 -0
  40. package/dist/utils/postLimits.d.ts +26 -0
  41. package/dist/utils/postSlug.d.ts +3 -1
  42. package/dist/utils/profileLimits.d.ts +5 -0
  43. package/dist/{zh-CuOjIYyr.js → zh-nWOVw2PS.js} +4 -1
  44. package/dist/zh-nWOVw2PS.js.map +1 -0
  45. package/docs/firebase-setup.md +25 -0
  46. package/docs/firestore.rules.example +114 -9
  47. package/docs/storage.rules.example +10 -1
  48. package/package.json +1 -1
  49. package/dist/ar-Dg9e1ruU.js.map +0 -1
  50. package/dist/commentImages-DHIuwvex.js.map +0 -1
  51. package/dist/de-CpGJ3KkZ.js.map +0 -1
  52. package/dist/en-yS55nNno.js.map +0 -1
  53. package/dist/fr-BFXp_PeM.js.map +0 -1
  54. package/dist/id-B7lgKUHZ.js.map +0 -1
  55. package/dist/ja-3SXam5Sk.js.map +0 -1
  56. package/dist/pt-C2_VknPa.js.map +0 -1
  57. package/dist/zh-CuOjIYyr.js.map +0 -1
@@ -203,6 +203,8 @@ var e = {
203
203
  submitNext: "التالي: معاينة",
204
204
  apply: "تطبيق",
205
205
  imageOptimizing: "جارٍ تحسين الصورة ورفعها…",
206
+ bodyUsage: "النص {count} / {max} حرفًا (HTML)",
207
+ bodyUsageTranslated: "الحد محسوب على {languages} لغات ترجمة.",
206
208
  cover: {
207
209
  imageLink: "رابط الصورة",
208
210
  addPhoto: "إضافة صور",
@@ -456,6 +458,7 @@ var e = {
456
458
  boardIdRequired: "[memi-board] boardId مطلوب.",
457
459
  photoRequired: "يُرجى إضافة صورة.",
458
460
  bodyRequired: "يُرجى إدخال نص أو إرفاق صورة.",
461
+ bodyTooLong: "المنشور طويل جدًا. يسمح هذا اللوح بما يصل إلى {max} حرفًا من HTML.",
459
462
  titleRequired: "يُرجى إدخال عنوان.",
460
463
  editLimitReached: "يمكن تعديل المنشور {max} مرات كحد أقصى. اطلب من مدير اللوحة إن احتاج إلى تغييرات أخرى."
461
464
  },
@@ -837,4 +840,4 @@ var e = {
837
840
  //#endregion
838
841
  export { e as default };
839
842
 
840
- //# sourceMappingURL=ar-Dg9e1ruU.js.map
843
+ //# sourceMappingURL=ar-vCWN4UgB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ar-vCWN4UgB.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 bodyUsage: 'النص {count} / {max} حرفًا (HTML)',\n bodyUsageTranslated: 'الحد محسوب على {languages} لغات ترجمة.',\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 bodyTooLong: 'المنشور طويل جدًا. يسمح هذا اللوح بما يصل إلى {max} حرفًا من HTML.',\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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"}
@@ -513,6 +513,8 @@ var Ee = {
513
513
  submitNext: "다음: 미리보기",
514
514
  apply: "적용",
515
515
  imageOptimizing: "이미지 최적화 및 업로드 중…",
516
+ bodyUsage: "본문 {count} / {max}자 (HTML 기준)",
517
+ bodyUsageTranslated: "번역 언어 {languages}개에 맞춘 한도입니다.",
516
518
  cover: {
517
519
  hint: "사진 {count}/{max} · 대표사진 선택 · 끌어 순서 변경 · 파일 드롭/붙여넣기로 추가",
518
520
  imageLink: "이미지 링크",
@@ -792,6 +794,7 @@ var Ee = {
792
794
  boardIdRequired: "[memi-board] boardId 가 필요합니다.",
793
795
  photoRequired: "사진을 올려 주세요.",
794
796
  bodyRequired: "본문에 글자를 입력하거나 이미지를 첨부해 주세요.",
797
+ bodyTooLong: "본문이 너무 깁니다. 이 보드에서는 HTML 기준 {max}자까지 저장할 수 있어요.",
795
798
  titleRequired: "제목을 입력해 주세요.",
796
799
  editLimitReached: "수정은 최대 {max}번까지 할 수 있어요. 더 고쳐야 하면 보드 관리자에게 요청해 주세요."
797
800
  },
@@ -1190,6 +1193,13 @@ var Ee = {
1190
1193
  like: "좋아요 문서"
1191
1194
  }
1192
1195
  },
1196
+ diagnostics: {
1197
+ title: "진단",
1198
+ description: "전체 사용자를 한 번 훑어서, 앱에서만 막고 있는 한도를 넘긴 데이터를 찾습니다. 아직 준비 중입니다.",
1199
+ scan: "진단 실행",
1200
+ comingSoon: "준비 중",
1201
+ checks: { authorMemoCount: "작성자 메모를 {max}개 넘게 저장한 사용자" }
1202
+ },
1193
1203
  danger: {
1194
1204
  title: "위험 영역",
1195
1205
  description: "모든 게시글, 댓글, 댓글 이미지, 첨부파일과 카테고리 설정을 영구 삭제합니다. 보드 사용자와 관리자 권한은 유지합니다.",
@@ -1269,6 +1279,40 @@ var Ee = {
1269
1279
  emailLoadFailed: "이메일을 불러오지 못했습니다.",
1270
1280
  moderationWarnings: "콘텐츠 경고 {count}회"
1271
1281
  },
1282
+ waiting: {
1283
+ title: "글을 번역하고 있어요~",
1284
+ subtitle: "여러 언어로 번역하느라 조금 걸려요. 그동안 미니게임을 즐겨보세요!",
1285
+ demoLink: "번역 대기 화면 시험해 보기",
1286
+ doneTitle: "번역이 끝나 글이 올라갔어요!",
1287
+ doneSubtitle: "게임은 계속 즐기셔도 돼요. 준비되면 글을 보러 가세요.",
1288
+ continue: "글 보러 가기",
1289
+ close: "닫기",
1290
+ restart: "다시 하기",
1291
+ games: {
1292
+ memory: "짝 맞추기",
1293
+ snake: "스네이크",
1294
+ sudoku: "스도쿠"
1295
+ },
1296
+ memory: {
1297
+ moves: "시도 {count}회",
1298
+ cleared: "모두 맞췄어요! ({count}회)"
1299
+ },
1300
+ snake: {
1301
+ score: "점수 {score}",
1302
+ best: "최고 {best}",
1303
+ gameOver: "게임 오버",
1304
+ start: "아무 방향이나 눌러 시작",
1305
+ up: "위",
1306
+ down: "아래",
1307
+ left: "왼쪽",
1308
+ right: "오른쪽"
1309
+ },
1310
+ sudoku: {
1311
+ hint: "칸을 눌러 숫자를 채워 보세요",
1312
+ solved: "완성! 🎉",
1313
+ erase: "지우기"
1314
+ }
1315
+ },
1272
1316
  writingAssistant: {
1273
1317
  loginRequired: "AI 글쓰기 도우미는 로그인 후 사용할 수 있습니다.",
1274
1318
  userMissing: "사용자 정보를 확인한 뒤 다시 시도해 주세요.",
@@ -1292,40 +1336,40 @@ var Ee = {
1292
1336
  custom: "커스텀 스타일로 바꾸기…"
1293
1337
  }
1294
1338
  }
1295
- }, De = {
1296
- en: () => import("./en-yS55nNno.js"),
1297
- ja: () => import("./ja-3SXam5Sk.js"),
1298
- de: () => import("./de-CpGJ3KkZ.js"),
1299
- fr: () => import("./fr-BFXp_PeM.js"),
1300
- es: () => import("./es-tMBUNff2.js"),
1301
- pt: () => import("./pt-C2_VknPa.js"),
1302
- zh: () => import("./zh-CuOjIYyr.js"),
1303
- ar: () => import("./ar-Dg9e1ruU.js"),
1304
- id: () => import("./id-B7lgKUHZ.js")
1305
- }, z = "__MEMI_BOARD_I18N__";
1306
- function B() {
1339
+ }, z = {
1340
+ en: () => import("./en-dwiFlzpm.js"),
1341
+ ja: () => import("./ja-DDx8RDwB.js"),
1342
+ de: () => import("./de-Br2Z_mcP.js"),
1343
+ fr: () => import("./fr-BBiQmovr.js"),
1344
+ es: () => import("./es-E1OXjEpy.js"),
1345
+ pt: () => import("./pt-CmLdTNz1.js"),
1346
+ zh: () => import("./zh-nWOVw2PS.js"),
1347
+ ar: () => import("./ar-vCWN4UgB.js"),
1348
+ id: () => import("./id-D-XLJeg9.js")
1349
+ }, B = "__MEMI_BOARD_I18N__";
1350
+ function V() {
1307
1351
  let e = globalThis;
1308
- return e[z] ??= {
1352
+ return e[B] ??= {
1309
1353
  messages: { ko: Ee },
1310
1354
  pending: {},
1311
1355
  version: s(0)
1312
- }, e[z];
1356
+ }, e[B];
1313
1357
  }
1314
- function V(e) {
1315
- let t = B();
1316
- return t.messages[e] || e === "ko" ? Promise.resolve() : (t.pending[e] ??= De[e]().then((n) => {
1358
+ function H(e) {
1359
+ let t = V();
1360
+ return t.messages[e] || e === "ko" ? Promise.resolve() : (t.pending[e] ??= z[e]().then((n) => {
1317
1361
  t.messages[e] = n.default, t.version.value++;
1318
1362
  }).catch((n) => {
1319
1363
  delete t.pending[e], console.warn(`[memi-board] failed to load locale "${e}"`, n);
1320
1364
  }), t.pending[e]);
1321
1365
  }
1322
- function H(e) {
1323
- return e === "ko" ? Promise.resolve() : Promise.all([V(e), V("en")]).then(() => void 0);
1366
+ function U(e) {
1367
+ return e === "ko" ? Promise.resolve() : Promise.all([H(e), H("en")]).then(() => void 0);
1324
1368
  }
1325
- function Oe(e) {
1326
- return !!B().messages[e];
1369
+ function De(e) {
1370
+ return !!V().messages[e];
1327
1371
  }
1328
- function U(e, t) {
1372
+ function W(e, t) {
1329
1373
  let n = e;
1330
1374
  for (let e of t.split(".")) {
1331
1375
  if (!n || typeof n == "string") return;
@@ -1333,36 +1377,36 @@ function U(e, t) {
1333
1377
  }
1334
1378
  return typeof n == "string" ? n : void 0;
1335
1379
  }
1336
- function ke(e, t) {
1380
+ function Oe(e, t) {
1337
1381
  return t ? e.replace(/\{(\w+)\}/g, (e, n) => {
1338
1382
  let r = t[n];
1339
1383
  return r == null ? e : String(r);
1340
1384
  }) : e;
1341
1385
  }
1342
- function W(e, t, n) {
1343
- let r = B();
1386
+ function G(e, t, n) {
1387
+ let r = V();
1344
1388
  r.version.value;
1345
- let i = e ?? "ko", a = U(r.messages[i], t) ?? (i === "ko" ? void 0 : U(r.messages.en, t)) ?? U(r.messages.ko, t);
1346
- return a == null ? t : ke(a, n);
1389
+ let i = e ?? "ko", a = W(r.messages[i], t) ?? (i === "ko" ? void 0 : W(r.messages.en, t)) ?? W(r.messages.ko, t);
1390
+ return a == null ? t : Oe(a, n);
1347
1391
  }
1348
1392
  //#endregion
1349
1393
  //#region src/utils/formatDate.ts
1350
- function G(e) {
1394
+ function K(e) {
1351
1395
  return g(e ?? "ko").intl;
1352
1396
  }
1353
- function K(e, t) {
1354
- return e?.toDate ? e.toDate().toLocaleDateString(G(t)) : "";
1397
+ function q(e, t) {
1398
+ return e?.toDate ? e.toDate().toLocaleDateString(K(t)) : "";
1355
1399
  }
1356
- var Ae = 60, q = 3600, J = 24 * q;
1400
+ var ke = 60, J = 3600, Ae = 24 * J;
1357
1401
  function Y(e, t = Date.now(), n) {
1358
- if (!e?.toDate) return W(n, "common.date.justNow");
1402
+ if (!e?.toDate) return G(n, "common.date.justNow");
1359
1403
  let r = Math.max(0, Math.round((t - e.toDate().getTime()) / 1e3));
1360
- if (r < 45) return W(n, "common.date.fewSecondsAgo");
1361
- let i = new Intl.RelativeTimeFormat(G(n), { numeric: "always" }), a = r / J;
1362
- return r < 90 ? i.format(-1, "minute") : r < 2700 ? i.format(-Math.round(r / Ae), "minute") : r < 5400 ? i.format(-1, "hour") : r < 22 * q ? i.format(-Math.round(r / q), "hour") : r < 36 * q ? i.format(-1, "day") : a < 26 ? i.format(-Math.round(a), "day") : a < 46 ? i.format(-1, "month") : a < 320 ? i.format(-Math.round(a / 30.4), "month") : a < 548 ? i.format(-1, "year") : i.format(-Math.round(a / 365), "year");
1404
+ if (r < 45) return G(n, "common.date.fewSecondsAgo");
1405
+ let i = new Intl.RelativeTimeFormat(K(n), { numeric: "always" }), a = r / Ae;
1406
+ return r < 90 ? i.format(-1, "minute") : r < 2700 ? i.format(-Math.round(r / ke), "minute") : r < 5400 ? i.format(-1, "hour") : r < 22 * J ? i.format(-Math.round(r / J), "hour") : r < 36 * J ? i.format(-1, "day") : a < 26 ? i.format(-Math.round(a), "day") : a < 46 ? i.format(-1, "month") : a < 320 ? i.format(-Math.round(a / 30.4), "month") : a < 548 ? i.format(-1, "year") : i.format(-Math.round(a / 365), "year");
1363
1407
  }
1364
1408
  function X(e, t) {
1365
- return e?.toDate ? new Intl.DateTimeFormat(G(t), {
1409
+ return e?.toDate ? new Intl.DateTimeFormat(K(t), {
1366
1410
  year: "numeric",
1367
1411
  month: "long",
1368
1412
  day: "numeric",
@@ -1370,18 +1414,18 @@ function X(e, t) {
1370
1414
  minute: "2-digit",
1371
1415
  second: "2-digit",
1372
1416
  hourCycle: "h23"
1373
- }).format(e.toDate()) : W(t, "common.date.checking");
1417
+ }).format(e.toDate()) : G(t, "common.date.checking");
1374
1418
  }
1375
1419
  function Z(e, t, n) {
1376
1420
  let r = X(e, n), i = e?.toMillis?.(), a = t?.toMillis?.();
1377
- return a == null || i == null || i === a ? [r] : [W(n, "common.date.createdAt", { time: r }), W(n, "common.date.updatedAt", { time: X(t, n) })];
1421
+ return a == null || i == null || i === a ? [r] : [G(n, "common.date.createdAt", { time: r }), G(n, "common.date.updatedAt", { time: X(t, n) })];
1378
1422
  }
1379
1423
  //#endregion
1380
1424
  //#region src/i18n/useMemiBoardI18n.ts
1381
1425
  var Q = "memiBoard:hostLocale", $ = Symbol("memiBoard:boardLocale");
1382
1426
  function je(o = {}) {
1383
1427
  let s = n(), l = s ? r($, null) : null, u = s ? r(Q, null) : null, d = N(), f = e(F), p = e(I), m = e(P), _ = e(() => f.value ? h(c(o.boardLocale)) ?? l?.value ?? h(c(u)) ?? h(R()) ?? "ko" : h(R()) ?? "ko");
1384
- o.boardLocale !== void 0 && s && a($, _), ee(_, (e) => void H(e), { immediate: !0 }), t() && i(() => H(_.value));
1428
+ o.boardLocale !== void 0 && s && a($, _), ee(_, (e) => void U(e), { immediate: !0 }), t() && i(() => U(_.value));
1385
1429
  let v = e(() => g(_.value));
1386
1430
  return {
1387
1431
  locale: _,
@@ -1392,9 +1436,9 @@ function je(o = {}) {
1392
1436
  intlLocale: e(() => v.value.intl),
1393
1437
  t: (e, t) => {
1394
1438
  let n = e.startsWith("common.role.") ? e.slice(12) : "";
1395
- return d.roleLabels?.[n] ?? W(_.value, e, t);
1439
+ return d.roleLabels?.[n] ?? G(_.value, e, t);
1396
1440
  },
1397
- formatDate: (e) => K(e, _.value),
1441
+ formatDate: (e) => q(e, _.value),
1398
1442
  formatFullDate: (e) => X(e, _.value),
1399
1443
  formatRelativeDate: (e, t) => Y(e, t, _.value),
1400
1444
  formatTimestampDetails: (e, t) => Z(e, t, _.value),
@@ -1408,19 +1452,22 @@ function Ne(e) {
1408
1452
  return e.trim().replace(/\s+/g, "-").replace(/[^a-zA-Z0-9가-힣ㄱ-ㅎㅏ-ㅣ-]/g, "").replace(/-+/g, "-").replace(/^-+|-+$/g, "");
1409
1453
  }
1410
1454
  function Pe(e, t = 60) {
1411
- return e.replace(/[^a-zA-Z0-9가-힣ㄱ-ㅎ._-]/g, "-").slice(0, t);
1455
+ let n = e.replace(/[^a-zA-Z0-9가-힣ㄱ-ㅎ._-]/g, "-");
1456
+ if (n.length <= t) return n;
1457
+ let r = n.lastIndexOf("."), i = r > 0 && n.length - r <= 10 ? n.slice(r) : "";
1458
+ return n.slice(0, t - i.length) + i;
1412
1459
  }
1413
1460
  //#endregion
1414
1461
  //#region src/utils/commentImages.ts
1415
- var Fe = /* @__PURE__ */ new Set([
1462
+ var Fe = 1, Ie = /* @__PURE__ */ new Set([
1416
1463
  "image/jpeg",
1417
1464
  "image/png",
1418
1465
  "image/gif",
1419
1466
  "image/webp"
1420
1467
  ]);
1421
- function Ie(e) {
1468
+ function Le(e) {
1422
1469
  let t = (e.type || "").toLowerCase();
1423
- if (Fe.has(t)) return !0;
1470
+ if (Ie.has(t)) return !0;
1424
1471
  let n = e.name.toLowerCase();
1425
1472
  return [
1426
1473
  ".jpg",
@@ -1430,7 +1477,7 @@ function Ie(e) {
1430
1477
  ".webp"
1431
1478
  ].some((e) => n.endsWith(e));
1432
1479
  }
1433
- function Le(e) {
1480
+ function Re(e) {
1434
1481
  if (!e?.length) return [];
1435
1482
  for (let t of e) if (t?.name && t.url?.startsWith("https://") && t.path && !t.path.includes("..") && t.type?.startsWith("image/") && !(!Number.isFinite(t.size) || t.size <= 0)) return [{
1436
1483
  name: t.name.slice(0, 200),
@@ -1441,7 +1488,7 @@ function Le(e) {
1441
1488
  }];
1442
1489
  return [];
1443
1490
  }
1444
- function Re(e, t) {
1491
+ function ze(e, t) {
1445
1492
  let n = t.endsWith("/") ? t : `${t}/`;
1446
1493
  if (!Array.isArray(e)) return [];
1447
1494
  let r = /* @__PURE__ */ new Set();
@@ -1453,6 +1500,6 @@ function Re(e, t) {
1453
1500
  return [...r];
1454
1501
  }
1455
1502
  //#endregion
1456
- export { re as $, b as A, me as B, R as C, v as D, N as E, k as F, de as G, w as H, _e as I, ae as J, E as K, ve as L, S as M, ye as N, y as O, be as P, xe as Q, ge as R, I as S, Te as T, ue as U, O as V, ce as W, se as X, ie as Y, oe as Z, Se as _, Pe as a, te as at, P as b, je as c, p as ct, Y as d, h as dt, pe as et, Z as f, Ce as g, W as h, Me as i, C as it, x as j, _ as k, K as l, d as lt, H as m, Ie as n, D as nt, Ne as o, ne as ot, Oe as p, T as q, Le as r, fe as rt, Q as s, f as st, Re as t, he as tt, X as u, g as ut, we as v, L as w, F as x, M as y, le as z };
1503
+ export { xe as $, _ as A, le as B, I as C, N as D, Te as E, be as F, ce as G, O as H, k as I, T as J, de as K, _e as L, x as M, S as N, v as O, ye as P, oe as Q, ve as R, F as S, L as T, w as U, me as V, ue as W, ie as X, ae as Y, se as Z, Ce as _, Me as a, C as at, M as b, Q as c, f as ct, X as d, g as dt, re as et, Y as f, h as ft, G as g, U as h, Re as i, fe as it, b as j, y as k, je as l, p as lt, De as m, ze as n, he as nt, Pe as o, te as ot, Z as p, E as q, Le as r, D as rt, Ne as s, ne as st, Fe as t, pe as tt, q as u, d as ut, Se as v, R as w, P as x, we as y, ge as z };
1457
1504
 
1458
- //# sourceMappingURL=commentImages-DHIuwvex.js.map
1505
+ //# sourceMappingURL=commentImages-Bdy_5GoM.js.map