memi-board 0.55.2 → 0.56.1

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 (41) hide show
  1. package/dist/{ar-ChyOgoxJ.js → ar-CQhBdHu3.js} +6 -1
  2. package/dist/ar-CQhBdHu3.js.map +1 -0
  3. package/dist/{commentImages-Dm5Jv2vB.js → commentImages-DsW2yCqu.js} +15 -10
  4. package/dist/commentImages-DsW2yCqu.js.map +1 -0
  5. package/dist/{de-XlC1wNZE.js → de-B4GZqxQj.js} +6 -1
  6. package/dist/de-B4GZqxQj.js.map +1 -0
  7. package/dist/{en-XIVIrnU-.js → en-BDkfivhc.js} +6 -1
  8. package/dist/en-BDkfivhc.js.map +1 -0
  9. package/dist/{es-DYbCTY9F.js → es-DzFDaLwo.js} +6 -1
  10. package/dist/es-DzFDaLwo.js.map +1 -0
  11. package/dist/{fr-C0cdV-Mk.js → fr-Zf5mcs8m.js} +6 -1
  12. package/dist/fr-Zf5mcs8m.js.map +1 -0
  13. package/dist/{id-DfP8Pyvn.js → id-CaWN8212.js} +6 -1
  14. package/dist/id-CaWN8212.js.map +1 -0
  15. package/dist/index.js +39 -19
  16. package/dist/index.js.map +1 -1
  17. package/dist/{ja-DOu3AaTV.js → ja-xDttH9CE.js} +6 -1
  18. package/dist/ja-xDttH9CE.js.map +1 -0
  19. package/dist/{pt-CTeIsQdM.js → pt-WIfxYYWQ.js} +6 -1
  20. package/dist/pt-WIfxYYWQ.js.map +1 -0
  21. package/dist/runtime/components/BoardInfo.vue +104 -0
  22. package/dist/runtime/components/BoardInfoPerson.vue +19 -0
  23. package/dist/runtime/components/CommentForm.vue +2 -0
  24. package/dist/runtime/components/CommentItem.vue +2 -0
  25. package/dist/runtime/components/List.vue +7 -16
  26. package/dist/storage.js +1 -1
  27. package/dist/types.d.ts +4 -0
  28. package/dist/utils/saveBoardVisibility.d.ts +2 -1
  29. package/dist/{zh-rDhjLmNl.js → zh-CI6Sd8PD.js} +6 -1
  30. package/dist/zh-CI6Sd8PD.js.map +1 -0
  31. package/package.json +1 -1
  32. package/dist/ar-ChyOgoxJ.js.map +0 -1
  33. package/dist/commentImages-Dm5Jv2vB.js.map +0 -1
  34. package/dist/de-XlC1wNZE.js.map +0 -1
  35. package/dist/en-XIVIrnU-.js.map +0 -1
  36. package/dist/es-DYbCTY9F.js.map +0 -1
  37. package/dist/fr-C0cdV-Mk.js.map +0 -1
  38. package/dist/id-DfP8Pyvn.js.map +0 -1
  39. package/dist/ja-DOu3AaTV.js.map +0 -1
  40. package/dist/pt-CTeIsQdM.js.map +0 -1
  41. package/dist/zh-rDhjLmNl.js.map +0 -1
@@ -348,6 +348,11 @@ var e = {
348
348
  commentNotFound: "لم يتم العثور على التعليق."
349
349
  },
350
350
  list: {
351
+ boardInfo: {
352
+ creator: "أنشأه",
353
+ managers: "المديرون",
354
+ staff: "الموظفون"
355
+ },
351
356
  commentCount: "{count} تعليقات",
352
357
  settings: "الإعدادات",
353
358
  loadFailed: "تعذّر تحميل القائمة: {error}",
@@ -754,4 +759,4 @@ var e = {
754
759
  //#endregion
755
760
  export { e as default };
756
761
 
757
- //# sourceMappingURL=ar-ChyOgoxJ.js.map
762
+ //# sourceMappingURL=ar-CQhBdHu3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ar-CQhBdHu3.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 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 },\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 },\n common: {\n action: {\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 anonymous: 'مجهول',\n user: 'مستخدم',\n image: 'صورة',\n draft: 'مسودة',\n loading: 'جارٍ التحميل…',\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 draftNotice: 'لم يُنشر هذا المنشور بعد. لا يمكن لأحد غيرك رؤيته حتى تنشره.',\n publish: 'نشر',\n notice: 'إعلان',\n pin: 'تثبيت كإعلان',\n unpin: 'إلغاء الإعلان',\n backToList: 'العودة إلى القائمة',\n postNav: 'التنقل بين المنشورات',\n list: 'القائمة',\n comments: 'التعليقات',\n },\n editor: {\n titleOptionalPlaceholder: 'العنوان (اتركه فارغًا ليكتب الذكاء الاصطناعي عنوانًا)',\n titleAiNotice: 'كتب الذكاء الاصطناعي عنوانًا من نصك. احفظه إن أعجبك أو عدّله أولًا.',\n translateView: {\n title: 'معاينة الترجمة: {language}',\n notSaved: 'لم يتم الحفظ. هذه معاينة فقط.',\n },\n titlePlaceholder: 'العنوان',\n contentPlaceholder: 'اكتب شيئًا… اكتب / لفتح قائمة الكتل.',\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 },\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 failed: 'تعذّر إرسال البلاغ.',\n reported: 'تم الإبلاغ',\n title: 'الإبلاغ عن المنشور',\n done: 'تم استلام البلاغ. سيراجعه فريق العمل.',\n reason: 'السبب',\n detailPlaceholder: 'التفاصيل (اختياري)',\n submit: 'إبلاغ',\n },\n reportList: {\n staffOnly: 'يمكن لفريق العمل فقط عرض البلاغات.',\n loadFailed: 'تعذّر تحميل القائمة: {error}',\n empty: 'لا توجد بلاغات معلّقة.',\n untitled: 'منشور بلا عنوان',\n author: 'بواسطة {name}',\n dismiss: 'رفض',\n confirm: 'معالجة',\n },\n reports: {\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 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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"}
@@ -599,6 +599,11 @@ var _e = {
599
599
  commentCount: "댓글 {count}개",
600
600
  photo: "사진",
601
601
  likeCount: "추천 {count}",
602
+ boardInfo: {
603
+ creator: "만든 사람",
604
+ managers: "담당 매니저",
605
+ staff: "담당 스태프"
606
+ },
602
607
  info: {
603
608
  title: "게시판 정보",
604
609
  about: "이 게시판은",
@@ -1064,15 +1069,15 @@ var _e = {
1064
1069
  }
1065
1070
  }
1066
1071
  }, ve = {
1067
- en: () => import("./en-XIVIrnU-.js"),
1068
- ja: () => import("./ja-DOu3AaTV.js"),
1069
- de: () => import("./de-XlC1wNZE.js"),
1070
- fr: () => import("./fr-C0cdV-Mk.js"),
1071
- es: () => import("./es-DYbCTY9F.js"),
1072
- pt: () => import("./pt-CTeIsQdM.js"),
1073
- zh: () => import("./zh-rDhjLmNl.js"),
1074
- ar: () => import("./ar-ChyOgoxJ.js"),
1075
- id: () => import("./id-DfP8Pyvn.js")
1072
+ en: () => import("./en-BDkfivhc.js"),
1073
+ ja: () => import("./ja-xDttH9CE.js"),
1074
+ de: () => import("./de-B4GZqxQj.js"),
1075
+ fr: () => import("./fr-Zf5mcs8m.js"),
1076
+ es: () => import("./es-DzFDaLwo.js"),
1077
+ pt: () => import("./pt-WIfxYYWQ.js"),
1078
+ zh: () => import("./zh-CI6Sd8PD.js"),
1079
+ ar: () => import("./ar-CQhBdHu3.js"),
1080
+ id: () => import("./id-CaWN8212.js")
1076
1081
  }, B = "__MEMI_BOARD_I18N__";
1077
1082
  function V() {
1078
1083
  let e = globalThis;
@@ -1226,4 +1231,4 @@ function Ae(e, t) {
1226
1231
  //#endregion
1227
1232
  export { f as $, b as A, se as B, R as C, v as D, N as E, k as F, de as G, oe as H, A as I, D as J, ne as K, O as L, S as M, ue as N, y as O, fe as P, te as Q, ae as R, I as S, ge as T, re as U, E as V, T as W, C as X, ce as Y, w as Z, me as _, Ee as a, P as b, Ce as c, Y as d, p as et, Z as f, z as g, G as h, we as i, x as j, _ as k, q as l, U as m, Oe as n, g as nt, Te as o, ye as p, le as q, ke as r, h as rt, Q as s, Ae as t, d as tt, X as u, he as v, L as w, F as x, pe as y, ie as z };
1228
1233
 
1229
- //# sourceMappingURL=commentImages-Dm5Jv2vB.js.map
1234
+ //# sourceMappingURL=commentImages-DsW2yCqu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commentImages-DsW2yCqu.js","names":[],"sources":["../src/i18n/locales.ts","../src/utils/boardPaths.ts","../src/config.ts","../src/i18n/messages/ko/attachments.ts","../src/i18n/messages/ko/auth.ts","../src/i18n/messages/ko/authorMemo.ts","../src/i18n/messages/ko/authorMenu.ts","../src/i18n/messages/ko/avatarCropModal.ts","../src/i18n/messages/ko/boardSettings.ts","../src/i18n/messages/ko/boardUsers.ts","../src/i18n/messages/ko/commentFeed.ts","../src/i18n/messages/ko/commentForm.ts","../src/i18n/messages/ko/commentItem.ts","../src/i18n/messages/ko/commentList.ts","../src/i18n/messages/ko/commentThread.ts","../src/i18n/messages/ko/comments.ts","../src/i18n/messages/ko/common.ts","../src/i18n/messages/ko/detail.ts","../src/i18n/messages/ko/editor.ts","../src/i18n/messages/ko/footer.ts","../src/i18n/messages/ko/likes.ts","../src/i18n/messages/ko/list.ts","../src/i18n/messages/ko/listViewSwitch.ts","../src/i18n/messages/ko/miniComments.ts","../src/i18n/messages/ko/miniList.ts","../src/i18n/messages/ko/miniPicker.ts","../src/i18n/messages/ko/miniPost.ts","../src/i18n/messages/ko/moderation.ts","../src/i18n/messages/ko/moderationPrompt.ts","../src/i18n/messages/ko/moderationStrike.ts","../src/i18n/messages/ko/posts.ts","../src/i18n/messages/ko/profile.ts","../src/i18n/messages/ko/profileEditModal.ts","../src/i18n/messages/ko/reportButton.ts","../src/i18n/messages/ko/reportList.ts","../src/i18n/messages/ko/reports.ts","../src/i18n/messages/ko/sectionUtil.ts","../src/i18n/messages/ko/sections.ts","../src/i18n/messages/ko/seo.ts","../src/i18n/messages/ko/settings.ts","../src/i18n/messages/ko/shareButton.ts","../src/i18n/messages/ko/signIn.ts","../src/i18n/messages/ko/storage.ts","../src/i18n/messages/ko/swipeHint.ts","../src/i18n/messages/ko/userCommentList.ts","../src/i18n/messages/ko/userPostList.ts","../src/i18n/messages/ko/users.ts","../src/i18n/messages/ko/writingAssistant.ts","../src/i18n/messages/ko/index.ts","../src/i18n/translate.ts","../src/utils/formatDate.ts","../src/i18n/useMemiBoardI18n.ts","../src/utils/slugify.ts","../src/utils/commentImages.ts"],"sourcesContent":["/** 게시판 UI 지원 언어. 코드는 @nuxtjs/i18n 호스트의 locale code 와 맞춘다. */\nexport const MEMI_BOARD_LOCALES = [\n { code: 'ko', name: '한국어', intl: 'ko-KR', dir: 'ltr' },\n { code: 'en', name: 'English', intl: 'en-US', dir: 'ltr' },\n { code: 'ja', name: '日本語', intl: 'ja-JP', dir: 'ltr' },\n { code: 'de', name: 'Deutsch', intl: 'de-DE', dir: 'ltr' },\n { code: 'fr', name: 'Français', intl: 'fr-FR', dir: 'ltr' },\n { code: 'es', name: 'Español', intl: 'es-419', dir: 'ltr' },\n { code: 'pt', name: 'Português', intl: 'pt-BR', dir: 'ltr' },\n { code: 'zh', name: '中文', intl: 'zh-CN', dir: 'ltr' },\n { code: 'ar', name: 'العربية', intl: 'ar', dir: 'rtl' },\n { code: 'id', name: 'Indonesia', intl: 'id-ID', dir: 'ltr' },\n] as const\n\nexport type MemiBoardLocale = typeof MEMI_BOARD_LOCALES[number]['code']\nexport type MemiBoardLocaleInfo = typeof MEMI_BOARD_LOCALES[number]\n\nexport const DEFAULT_MEMI_BOARD_LOCALE: MemiBoardLocale = 'ko'\n/** 번역이 빠진 키(긴 안내문 등)를 채우는 언어. ko 는 원문이라 모든 키가 있다. */\nexport const FALLBACK_MEMI_BOARD_LOCALE: MemiBoardLocale = 'en'\n\nconst CODES = new Set<string>(MEMI_BOARD_LOCALES.map(item => item.code))\n\n/** 'en-US', 'pt_BR', 'zh-Hans' 같은 값을 지원 언어 코드로 맞춘다. 지원하지 않으면 undefined. */\nexport function normalizeMemiBoardLocale(value: unknown): MemiBoardLocale | undefined {\n if (typeof value !== 'string') return undefined\n const code = value.trim().toLowerCase().split(/[-_]/)[0]\n return code && CODES.has(code) ? code as MemiBoardLocale : undefined\n}\n\nexport function memiBoardLocaleInfo(locale: MemiBoardLocale): MemiBoardLocaleInfo {\n return MEMI_BOARD_LOCALES.find(item => item.code === locale) ?? MEMI_BOARD_LOCALES[0]\n}\n","/**\n * Firestore / Storage 경로\n *\n * ```\n * memiBoardUsers/{uid}\n * memiBoardSettings/{boardId} // 보드 설정 (구 memiBoards/{id} stub + settings/config 통합)\n * memiBoardPosts/{postId} // boardId 는 문서 필드\n * memiBoardPosts/{postId}/body/main\n * memiBoardComments/{commentId} // postId, boardId 는 문서 필드\n * memiBoardLikes/{targetId}_{uid} // 글: postId_uid / 댓글: commentId_uid\n * memiBoardReports/{postId}_{uid} // 글 신고. 유저당 글당 1건\n * ```\n *\n * Storage: `memiBoardPosts/{postId}/...` (postId 가 전역 고유이므로 boardId 불필요)\n *\n * 카테고리 개념 없음 — 예전 category id 가 곧 boardId. boardId/postId 는 경로가\n * 아니라 문서 필드이므로, 보드/글 단위로 좁혀야 하는 쿼리는 항상 where 필터로\n * 스코핑한다 (컬렉션 자체는 항상 최상위 flat 컬렉션).\n */\nimport {\n collection,\n doc,\n type CollectionReference,\n type DocumentReference,\n type Firestore,\n} from 'firebase/firestore'\n\nexport const DEFAULT_POSTS_COLLECTION = 'memiBoardPosts'\nexport const DEFAULT_COMMENTS_COLLECTION = 'memiBoardComments'\nexport const DEFAULT_LIKES_COLLECTION = 'memiBoardLikes'\nexport const DEFAULT_REPORTS_COLLECTION = 'memiBoardReports'\nexport const DEFAULT_SETTINGS_COLLECTION = 'memiBoardSettings'\nexport const DEFAULT_USERS_COLLECTION = 'memiBoardUsers'\n\nexport interface BoardPathConfig {\n postsCollection: string\n commentsCollection: string\n likesCollection: string\n reportsCollection: string\n settingsCollection: string\n usersCollection: string\n}\n\nexport function resolveBoardPathConfig(input: {\n postsCollection?: string\n commentsCollection?: string\n likesCollection?: string\n reportsCollection?: string\n settingsCollection?: string\n usersCollection?: string\n}): BoardPathConfig {\n return {\n postsCollection: input.postsCollection?.trim() || DEFAULT_POSTS_COLLECTION,\n commentsCollection: input.commentsCollection?.trim() || DEFAULT_COMMENTS_COLLECTION,\n likesCollection: input.likesCollection?.trim() || DEFAULT_LIKES_COLLECTION,\n reportsCollection: input.reportsCollection?.trim() || DEFAULT_REPORTS_COLLECTION,\n settingsCollection: input.settingsCollection?.trim() || DEFAULT_SETTINGS_COLLECTION,\n usersCollection: input.usersCollection?.trim() || DEFAULT_USERS_COLLECTION,\n }\n}\n\n/** 보드 설정 목록/문서 — 구 memiBoards/{boardId} stub + settings/config 통합 */\nexport function settingsCol(db: Firestore, cfg: BoardPathConfig): CollectionReference {\n return collection(db, cfg.settingsCollection)\n}\n\nexport function settingsDoc(\n db: Firestore,\n cfg: BoardPathConfig,\n boardId: string,\n): DocumentReference {\n return doc(db, cfg.settingsCollection, boardId)\n}\n\nexport function postsCol(db: Firestore, cfg: BoardPathConfig): CollectionReference {\n return collection(db, cfg.postsCollection)\n}\n\nexport function postDoc(db: Firestore, cfg: BoardPathConfig, postId: string): DocumentReference {\n return doc(db, cfg.postsCollection, postId)\n}\n\nexport function postBodyDoc(\n db: Firestore,\n cfg: BoardPathConfig,\n postId: string,\n): DocumentReference {\n return doc(db, cfg.postsCollection, postId, 'body', 'main')\n}\n\nexport function commentsCol(db: Firestore, cfg: BoardPathConfig): CollectionReference {\n return collection(db, cfg.commentsCollection)\n}\n\nexport function commentDoc(\n db: Firestore,\n cfg: BoardPathConfig,\n commentId: string,\n): DocumentReference {\n return doc(db, cfg.commentsCollection, commentId)\n}\n\nexport function likesCol(db: Firestore, cfg: BoardPathConfig): CollectionReference {\n return collection(db, cfg.likesCollection)\n}\n\n/** 좋아요 문서ID 관례: `${targetId}_{uid}` — targetId 는 postId 또는 commentId. 토글은 create-or-delete */\nexport function likeDocId(targetId: string, uid: string): string {\n return `${targetId}_${uid}`\n}\n\nexport function likeDoc(\n db: Firestore,\n cfg: BoardPathConfig,\n targetId: string,\n uid: string,\n): DocumentReference {\n return doc(db, cfg.likesCollection, likeDocId(targetId, uid))\n}\n\nexport function reportsCol(db: Firestore, cfg: BoardPathConfig): CollectionReference {\n return collection(db, cfg.reportsCollection)\n}\n\n/** 신고 문서ID: `${postId}_{uid}` — 유저당 글당 1건 */\nexport function reportDocId(postId: string, uid: string): string {\n return `${postId}_${uid}`\n}\n\nexport function reportDoc(\n db: Firestore,\n cfg: BoardPathConfig,\n postId: string,\n uid: string,\n): DocumentReference {\n return doc(db, cfg.reportsCollection, reportDocId(postId, uid))\n}\n\nexport function boardUsersCol(db: Firestore, cfg: BoardPathConfig): CollectionReference {\n return collection(db, cfg.usersCollection)\n}\n\nexport function boardUserDoc(\n db: Firestore,\n cfg: BoardPathConfig,\n uid: string,\n): DocumentReference {\n return doc(db, cfg.usersCollection, uid)\n}\n\n/** 이메일만 담는 비공개 문서 — memiBoardUsers/{uid}는 공개 프로필이라 이메일만 분리한다. */\nexport function boardUserPrivateDoc(\n db: Firestore,\n cfg: BoardPathConfig,\n uid: string,\n): DocumentReference {\n return doc(db, cfg.usersCollection, uid, 'private', 'info')\n}\n\n/** 본인만 보는 작성자 메모 — 문서 ID 자체가 targetUid라 대상당 메모가 하나로 고정된다. */\nexport function authorMemoDoc(\n db: Firestore,\n cfg: BoardPathConfig,\n viewerUid: string,\n targetUid: string,\n): DocumentReference {\n return doc(db, cfg.usersCollection, viewerUid, 'memos', targetUid)\n}\n\n/** postId 가 전역 고유이므로 boardId 프리픽스 불필요 */\nexport function postStorageFolder(cfg: BoardPathConfig, postId: string): string {\n return `${cfg.postsCollection}/${postId}`\n}\n\nexport function boardSsrKey(cfg: BoardPathConfig, suffix: string): string {\n return `${cfg.postsCollection}/${cfg.usersCollection}/${suffix}`\n}\n","import { reactive } from 'vue'\nimport { MEMI_BOARD_LOCALES, normalizeMemiBoardLocale, type MemiBoardLocale } from './i18n/locales'\nimport type { BoardUserRole } from './types'\nimport {\n DEFAULT_COMMENTS_COLLECTION,\n DEFAULT_LIKES_COLLECTION,\n DEFAULT_REPORTS_COLLECTION,\n DEFAULT_POSTS_COLLECTION,\n DEFAULT_SETTINGS_COLLECTION,\n DEFAULT_USERS_COLLECTION,\n resolveBoardPathConfig,\n type BoardPathConfig,\n} from './utils/boardPaths'\n\nexport interface MemiBoardAuthOptions {\n providers?: Array<'google' | 'apple' | 'emailPassword'>\n /** Login route for comment prompts; the host receives the return URL as `next`. */\n loginPath?: string\n}\n\nexport interface MemiBoardI18nOptions {\n /** false이면 호스트·게시판 언어 대신 locale로 UI를 고정하고 번역 기능도 끈다. 기본 true. */\n enabled?: boolean\n}\n\nexport interface MemiBoardTranslationOptions {\n /** false이면 콘텐츠 번역 생성과 번역문 표시를 끈다. UI 언어 설정은 유지한다. 기본 true. */\n enabled?: boolean\n}\n\nexport interface MemiBoardModerationOptions {\n enabled?: boolean\n model?: string\n localBlocklist?: string[]\n onError?: 'allow' | 'block'\n moderateImages?: boolean\n useLimitedUseAppCheckTokens?: boolean\n blockBanThreshold?: number\n blockBanDecayMs?: number\n}\n\nexport interface MemiBoardSeoOptions {\n enabled?: boolean\n siteName?: string\n siteUrl?: string\n defaultOgImage?: string\n /**\n * 호스트 게시판 base path (trailing slash 없음). 기본 '/board'\n * canonical: {base}, {base}/{boardId}, {base}/{boardId}/{slug}\n */\n basePath?: string\n}\n\n/**\n * 관리자가 보드 전체 설정 화면에서 바꾸는 값(Firestore `memiBoardSettings/__app` 문서).\n * 호스트 `nuxt.config` 설정 위에 덧씌우며, 비어 있으면 호스트 설정을 그대로 따른다.\n */\nexport interface MemiBoardSiteSettings {\n /** true 이면 AI 기능(검열·번역·글쓰기 도우미·AI 제목)을 모두 끈다. */\n disableAi?: boolean\n /** true 이면 국제화를 끄고 `locale` 한 언어로 고정한다. */\n disableI18n?: boolean\n /** 기본 언어(국제화를 끄면 고정 언어). */\n locale?: string\n /** 쓸 수 있는 언어(MEMI_BOARD_LOCALES 코드). 비어 있으면 지원 언어 전체. */\n locales?: string[]\n}\n\nexport interface MemiBoardConfig {\n /** 글 컬렉션. 기본 `memiBoardPosts` */\n postsCollection: string\n /** 댓글 컬렉션. 기본 `memiBoardComments` */\n commentsCollection: string\n /** 좋아요 컬렉션. 기본 `memiBoardLikes` */\n likesCollection: string\n /** 신고 컬렉션. 기본 `memiBoardReports` */\n reportsCollection: string\n /** 보드 설정 컬렉션. 기본 `memiBoardSettings` */\n settingsCollection: string\n /** 역할 문서 컬렉션. 기본 `memiBoardUsers` */\n usersCollection: string\n auth: MemiBoardAuthOptions\n moderation: MemiBoardModerationOptions\n seo: MemiBoardSeoOptions\n i18n?: MemiBoardI18nOptions\n translation?: MemiBoardTranslationOptions\n /** 관리자 화면에서 바꾸는 사이트 전체 설정. 런타임에 Firestore 값으로 채운다. */\n site?: MemiBoardSiteSettings\n /**\n * 기본 언어. 호스트에 @nuxtjs/i18n 이 있으면 그 언어를 따르고,\n * 보드 설정에서 언어를 고르면 그 보드는 그 언어로 고정된다. 기본 'ko'.\n */\n roleLabels?: Partial<Record<BoardUserRole, string>>\n locale?: string\n}\n\nconst GLOBAL_KEY = '__MEMI_BOARD_CONFIG__' as const\n\nfunction getSharedConfig(): MemiBoardConfig {\n const g = globalThis as typeof globalThis & {\n [GLOBAL_KEY]?: MemiBoardConfig\n }\n if (!g[GLOBAL_KEY]) {\n g[GLOBAL_KEY] = reactive<MemiBoardConfig>({\n postsCollection: DEFAULT_POSTS_COLLECTION,\n commentsCollection: DEFAULT_COMMENTS_COLLECTION,\n likesCollection: DEFAULT_LIKES_COLLECTION,\n reportsCollection: DEFAULT_REPORTS_COLLECTION,\n settingsCollection: DEFAULT_SETTINGS_COLLECTION,\n usersCollection: DEFAULT_USERS_COLLECTION,\n auth: { providers: ['google', 'apple'] },\n moderation: {\n enabled: true,\n model: 'gemini-3.5-flash-lite',\n onError: 'allow',\n moderateImages: false,\n localBlocklist: [],\n blockBanThreshold: 10,\n blockBanDecayMs: 24 * 60 * 60 * 1000,\n },\n seo: {\n enabled: true,\n siteName: 'Board',\n siteUrl: '',\n defaultOgImage: '',\n basePath: '/board',\n },\n })\n }\n return g[GLOBAL_KEY]\n}\n\nexport function configureMemiBoard(options: Partial<MemiBoardConfig>): void {\n const config = getSharedConfig()\n if (options.postsCollection != null && options.postsCollection !== '') {\n config.postsCollection = options.postsCollection.trim()\n }\n if (options.commentsCollection != null && options.commentsCollection !== '') {\n config.commentsCollection = options.commentsCollection.trim()\n }\n if (options.likesCollection != null && options.likesCollection !== '') {\n config.likesCollection = options.likesCollection.trim()\n }\n if (options.reportsCollection != null && options.reportsCollection !== '') {\n config.reportsCollection = options.reportsCollection.trim()\n }\n if (options.settingsCollection != null && options.settingsCollection !== '') {\n config.settingsCollection = options.settingsCollection.trim()\n }\n if (options.usersCollection != null && options.usersCollection !== '') {\n config.usersCollection = options.usersCollection.trim()\n }\n if (options.auth) Object.assign(config.auth, options.auth)\n if (options.moderation) Object.assign(config.moderation, options.moderation)\n if (options.seo) Object.assign(config.seo, options.seo)\n if (options.i18n) config.i18n = { ...config.i18n, ...options.i18n }\n if (options.translation) config.translation = { ...config.translation, ...options.translation }\n if (options.roleLabels) config.roleLabels = { ...options.roleLabels }\n if (options.locale) config.locale = options.locale\n}\n\nexport function useMemiBoardConfig(): MemiBoardConfig {\n return getSharedConfig()\n}\n\n/** 관리자가 AI 기능을 끄지 않았는지. 검열·번역·글쓰기 도우미·AI 제목이 모두 이 값을 따른다. */\nexport function isMemiBoardAiEnabled(): boolean {\n return useMemiBoardConfig().site?.disableAi !== true\n}\n\n/** UI를 거치지 않는 호출도 AI 요청 전에 차단한다. */\nexport function assertMemiBoardAiEnabled(): void {\n if (!isMemiBoardAiEnabled()) {\n throw Object.assign(new Error('AI features are disabled for this board service.'), {\n code: 'memi-board/ai-disabled',\n })\n }\n}\n\nexport function isMemiBoardI18nEnabled(): boolean {\n const config = useMemiBoardConfig()\n return config.site?.disableI18n !== true && config.i18n?.enabled !== false\n}\n\nexport function isMemiBoardTranslationEnabled(): boolean {\n return isMemiBoardAiEnabled() && isMemiBoardI18nEnabled() && useMemiBoardConfig().translation?.enabled !== false\n}\n\n/**\n * 관리자가 사용하도록 고른 언어. 국제화가 꺼져 있거나 고른 언어가 없으면 지원 언어 전체.\n * 번역 대상, 보드 언어 선택, 호스트의 언어 메뉴가 이 목록을 따른다.\n */\nexport function memiBoardEnabledLocales(): MemiBoardLocale[] {\n const all = MEMI_BOARD_LOCALES.map(item => item.code)\n const picked = useMemiBoardConfig().site?.locales\n if (!isMemiBoardI18nEnabled() || !picked?.length) return all\n const chosen = new Set(picked.map(code => normalizeMemiBoardLocale(code)).filter(Boolean))\n const enabled = all.filter(code => chosen.has(code))\n return enabled.length ? enabled : all\n}\n\n/** 기본(또는 고정) 언어. 관리자가 고른 값이 호스트 설정보다 우선하고, 사용 언어 목록 안에 있어야 한다. */\nexport function memiBoardDefaultLocale(): string | undefined {\n const config = useMemiBoardConfig()\n const wanted = config.site?.locale || config.locale\n const enabled = memiBoardEnabledLocales()\n const normalized = normalizeMemiBoardLocale(wanted)\n if (enabled.length === MEMI_BOARD_LOCALES.length || (normalized && enabled.includes(normalized))) return wanted\n return enabled[0]\n}\n\n/** Firestore 의 사이트 설정 문서 값을 런타임 설정에 반영한다. 문서가 없으면 호스트 설정으로 돌아간다. */\nexport function applyMemiBoardSiteSettings(data: Record<string, unknown> | undefined): void {\n useMemiBoardConfig().site = {\n disableAi: data?.disableAi === true,\n disableI18n: data?.disableI18n === true,\n locale: typeof data?.locale === 'string' && data.locale ? data.locale : undefined,\n locales: Array.isArray(data?.locales) ? data.locales.filter((code): code is string => typeof code === 'string') : undefined,\n }\n}\n\n/** UI를 거치지 않는 호출도 AI 요청·이용 횟수 갱신 전에 차단한다. */\nexport function assertMemiBoardTranslationEnabled(): void {\n if (!isMemiBoardTranslationEnabled()) {\n throw Object.assign(new Error('Content translation is disabled for this board service.'), {\n code: 'memi-board/translation-disabled',\n })\n }\n}\n\nexport function useBoardPathConfig(): BoardPathConfig {\n return resolveBoardPathConfig(useMemiBoardConfig())\n}\n","export default {\n attach: '파일 첨부 ({count} / {max})',\n dropOrClick: '파일을 놓거나 클릭해서 추가',\n uploading: '파일 업로드 중…',\n maxFiles: '최대 {max}개까지 첨부할 수 있습니다.',\n}\n","export default {\n writeRestricted: '콘텐츠 경고가 누적되어 글·댓글 작성이 잠시 제한됐어요.',\n writeRestrictedUntil: '콘텐츠 경고가 누적되어 글·댓글 작성이 잠시 제한됐어요. ({until})',\n strikeSuffix: ' (경고 {count}/{threshold})',\n strikeRestrictedUntil: ' 경고 {count}회가 되어 글·댓글 작성이 제한됩니다 ({until}).',\n strikeRestricted: ' 경고 {count}회가 되어 글·댓글 작성이 제한됩니다.',\n notInitialized: '[memi-board] Firebase Auth가 초기화되지 않았습니다.',\n}\n","export default {\n tooLong: '메모는 {max}자까지 작성할 수 있습니다.',\n}\n","export default {\n viewProfile: '프로필 보기',\n viewPosts: '작성글 보기',\n viewComments: '작성한 댓글 보기',\n memoAriaLabel: '이 작성자에 대한 메모',\n memoTitle: '나만 보는 메모',\n memoPlaceholder: '이 작성자에 대해 적어두기…',\n bad: '나쁨',\n good: '좋음',\n}\n","export default {\n title: '프로필 사진 자르기',\n description: '정사각형(1:1)으로 보여집니다. 영역을 맞춰 주세요.',\n hint: '드래그로 위치·확대 조절 · {size}×{size} 정사각 JPEG로 저장됩니다',\n confirm: '자르고 업로드',\n}\n","export default {\n signInRequired: '로그인이 필요합니다.',\n idAndNameRequired: '보드 ID와 이름을 입력해 주세요.',\n deleteIdRequired: '삭제할 게시판 ID가 필요합니다.',\n nameRequired: '보드 이름을 입력해 주세요.',\n}\n","export default {\n unsupportedRole: '지원하지 않는 역할입니다.',\n roleDescription: {\n owner: '관리자 지정과 서비스 전체를 관리합니다.',\n manager: '담당 게시판의 설정과 스태프 배정을 관리합니다.',\n admin: '사용자 역할, 게시판 설정과 모든 콘텐츠를 관리합니다.',\n staff: '담당 게시판의 게시글과 댓글을 관리합니다. 설정과 담당자 배정은 바꿀 수 없습니다.',\n user: '글과 댓글을 작성하고 본인이 작성한 콘텐츠만 수정·삭제할 수 있습니다.',\n },\n}\n","export default {\n empty: '아직 댓글이 없습니다.',\n emptyLiked: '좋아요를 받은 댓글이 아직 없습니다.',\n loadFailed: '목록을 불러오지 못했습니다: {error}',\n blinded: '관리자에 의해 블라인드된 댓글입니다.',\n}\n","export default {\n confirmLeave: '작성 중인 댓글이 있습니다. 저장하지 않고 나가시겠습니까?',\n translationPending: '{count}개 언어 번역을 준비했습니다. 댓글을 저장하면 함께 기록됩니다.',\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","export default {\n editRestricted: '댓글 수정이 잠시 제한됐어요.',\n moderationBlocked: '작성할 수 없는 내용이 포함되어 있습니다.',\n editFailed: '댓글을 수정하지 못했습니다.',\n blindConfirm: '이 댓글을 블라인드하면 모든 사용자에게 본문 대신 블라인드 안내가 표시됩니다. 원문은 삭제되지 않으며 나중에 다시 해제할 수 있습니다.\\n\\n블라인드하시겠습니까?',\n unblindConfirm: '블라인드를 해제하면 댓글 원문이 모든 사용자에게 다시 표시됩니다.\\n\\n블라인드를 해제하시겠습니까?',\n blindFailed: '블라인드 상태를 변경하지 못했습니다.',\n likeFailed: '좋아요를 처리하지 못했습니다.',\n blinded: '관리자에 의해 블라인드된 댓글입니다.',\n attachedImage: '댓글에 첨부된 이미지',\n edit: '댓글 수정',\n blind: '댓글 블라인드',\n unblind: '댓글 블라인드 해제',\n delete: '댓글 삭제',\n}\n","export default {\n loading: '댓글을 불러오고 있습니다',\n empty: '아직 댓글이 없습니다.',\n loadMore: '댓글 더보기',\n loadingMore: '댓글을 더 불러오고 있습니다',\n}\n","export default {\n deleteConfirm: '이 댓글을 삭제하시겠습니까?',\n deleteFailed: '댓글을 삭제하지 못했습니다.',\n hideReplies: '답글 숨기기',\n showReplies: '답글 {count}개',\n loadMoreReplies: '답글 더보기',\n}\n","export default {\n bodyRequired: '댓글 내용을 입력해 주세요.',\n bodyTooLong: '댓글은 {max}자까지 작성할 수 있습니다.',\n replyTargetNotFound: '답글 대상 댓글을 찾을 수 없습니다.',\n threadNotFound: '댓글 스레드를 찾을 수 없습니다.',\n hasRepliesCannotDelete: '답글이 있는 댓글은 현재 삭제할 수 없습니다.',\n}\n","/** 여러 화면이 함께 쓰는 짧은 문구. */\nexport default {\n action: {\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 anonymous: '익명',\n user: '사용자',\n image: '이미지',\n draft: '초안',\n loading: '불러오는 중…',\n },\n role: {\n owner: '최고 관리자',\n manager: '매니저',\n admin: '관리자',\n staff: '스태프',\n user: '사용자',\n },\n date: {\n justNow: '방금 전',\n fewSecondsAgo: '몇 초 전',\n checking: '시간 확인 중',\n createdAt: '생성시간: {time}',\n updatedAt: '수정시간: {time}',\n },\n}\n","export default {\n deleteConfirm: '이 게시글을 삭제하시겠습니까? 되돌릴 수 없습니다.',\n notFound: '게시글을 찾을 수 없습니다.',\n draftPreview: '미공개 미리보기',\n draftNotice: '아직 게시되지 않았습니다. 게시하기 전까지는 작성자만 볼 수 있어요.',\n publish: '게시하기',\n notice: '공지',\n pin: '공지로 지정',\n unpin: '공지 해제',\n backToList: '목록으로 돌아가기',\n postNav: '게시글 이동',\n list: '목록',\n comments: '댓글',\n}\n","export default {\n confirmLeave: '저장하지 않은 내용이 있습니다. 이 페이지를 나가시겠습니까?',\n titlePlaceholder: '제목',\n contentPlaceholder: '본문을 입력하세요… / 를 입력하면 블록 메뉴가 열립니다.',\n imageContentPlaceholder: '내용을 입력하세요…',\n tagsPlaceholder: '태그 입력 후 Enter',\n pinNotice: '공지로 등록',\n submitEdit: '수정 완료',\n submitNext: '다음: 미리보기',\n apply: '적용',\n imageOptimizing: '이미지 최적화 및 업로드 중…',\n cover: {\n hint: '사진 {count}/{max} · 대표사진 선택 · 끌어 순서 변경 · 파일 드롭/붙여넣기로 추가',\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: 'AI 글쓰기 도우미',\n insertBlock: '블록 삽입',\n blockMenu: '블록 메뉴',\n imageDialog: {\n title: '이미지 추가',\n chooseFile: '내 기기에서 이미지 선택',\n orLink: '또는 이미지 링크',\n urlLabel: '이미지 URL',\n urlHelp: 'HTTPS 주소만 사용할 수 있으며 원본 사이트에서 삭제되면 이미지도 표시되지 않습니다.',\n previewAlt: '외부 이미지 미리보기',\n addLink: '링크 추가',\n },\n customDialog: {\n title: '커스텀 스타일로 바꾸기',\n label: '어떻게 바꿀까요?',\n help: '예: 경상도 사투리 스타일로 / 정중한 문어체로 / 간결한 개조식으로',\n placeholder: '경상도 사투리 스타일로',\n },\n translateView: {\n title: '{language} 번역 미리 보기',\n notSaved: '저장되지 않았습니다. 미리 보기일 뿐입니다.',\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 proofread: '맞춤법 검사',\n polish: '문장 다듬기',\n continue: '자연스럽게 이어쓰기',\n summarize: '짧게 요약하기',\n translateEn: '영어로 번역',\n translateKo: '한국어로 번역',\n translateView: '번역해서 보기',\n translateAll: '{count}개 언어로 번역해 저장',\n translateEmpty: '번역할 제목이나 본문을 먼저 입력해 주세요.',\n title: '본문에서 제목 만들기',\n custom: '커스텀 스타일로 바꾸기…',\n failed: 'AI 작업에 실패했습니다. 다시 시도해 주세요.',\n },\n youtubePrompt: 'YouTube 링크를 입력하세요.',\n errors: {\n coverMax: '사진은 최대 {max}장까지 올릴 수 있어요.',\n imageUrlRequired: '이미지 주소를 입력해 주세요.',\n imageUrlInvalid: '올바른 이미지 주소를 입력해 주세요.',\n imageUrlHttps: 'HTTPS 이미지 주소만 사용할 수 있습니다.',\n imageUrlCredentials: '로그인 정보가 포함된 주소는 사용할 수 없습니다.',\n imageTimeout: '이미지를 불러오는 데 시간이 너무 오래 걸립니다.',\n imageNotDisplayable: '표시할 수 없는 이미지입니다.',\n imageLoadFailed: '이미지를 불러올 수 없습니다. 주소나 외부 링크 허용 여부를 확인해 주세요.',\n editorNotReady: '에디터를 준비하지 못했습니다. 다시 시도해 주세요.',\n imageLinkFailed: '이미지 링크를 추가하지 못했습니다.',\n imageOnly: '이미지 파일만 업로드할 수 있습니다.',\n imageTooLarge: '원본 이미지는 {mb}MB 이하여야 합니다.',\n imageUploadFailed: '이미지 업로드에 실패했습니다.',\n pasteAsFile: '사진은 위 영역에 파일로 붙여넣거나 드래그해 주세요.',\n postNotFound: '게시글을 찾을 수 없습니다.',\n loadPermission: '글을 불러올 권한이 없습니다. 로그인 상태를 확인해 주세요.',\n loadFailed: '글을 불러오지 못했습니다: {message}',\n editPermission: '수정 권한이 없습니다. 본인이 작성한 글인지, 로그인이 유지되는지 확인해 주세요.',\n titleRequired: '제목을 입력해 주세요.',\n photoRequired: '사진을 한 장 이상 올려 주세요.',\n bodyRequired: '본문에 글자를 입력하거나 이미지를 첨부해 주세요.',\n signInRequired: '로그인이 필요합니다.',\n boardMissing: '게시판(보드)이 지정되지 않았습니다.',\n writeRestricted: '콘텐츠 경고가 누적되어 글·댓글 작성이 잠시 제한됐어요.',\n moderationBlocked: '게시할 수 없는 내용이 포함되어 있습니다.',\n },\n titleOptionalPlaceholder: '제목 (비워 두면 AI가 만들어 드려요)',\n titleAiNotice: 'AI가 글 내용으로 제목을 만들었어요. 마음에 들면 저장하고, 아니면 고쳐 주세요.',\n hint: {\n titling: '제목을 만드는 중…',\n translating: '글을 {count}개 언어로 번역하는 중…',\n reviewing: '내용을 검토하는 중…',\n saving: '저장하는 중…',\n },\n}\n","export default {\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","export default {\n signInRequired: '로그인이 필요합니다.',\n commentNotFound: '댓글을 찾을 수 없습니다.',\n}\n","export default {\n introduction: '이 게시판은 Nuxt 4와 Vue 3, TypeScript를 바탕으로 만들었어요. Nuxt UI와 Tailwind CSS로 편안한 화면을 구성하고, Firebase Firestore·Auth·Storage와 nuxt-vuefire로 글과 댓글을 자연스럽게 이어갑니다.',\n settings: '설정',\n loadFailed: '목록을 불러오지 못했습니다: {error}',\n empty: '아직 게시글이 없습니다.',\n notice: '공지',\n commentCount: '댓글 {count}개',\n photo: '사진',\n likeCount: '추천 {count}',\n boardInfo: {\n creator: '만든 사람',\n managers: '담당 매니저',\n staff: '담당 스태프',\n },\n info: {\n title: '게시판 정보',\n about: '이 게시판은',\n history: '버전 히스토리',\n },\n stack: {\n framework: '프레임워크 & 언어',\n ui: 'UI & 스타일',\n backend: '백엔드 & 데이터',\n },\n tech: {\n nuxt: 'Vue 기반 SSR 프레임워크',\n vue: 'Composition API · script setup',\n typescript: '안전한 데이터와 컴포넌트 타입',\n nuxtUi: '게시판·폼·모달 UI',\n tailwind: '반응형 · 라이트/다크 스타일',\n lucide: '가볍고 일관된 아이콘',\n dayjs: '읽기 편한 날짜와 상대 시각',\n firestore: '게시글과 댓글을 위한 실시간 DB',\n auth: '안전한 사용자 로그인과 권한',\n storage: '이미지와 첨부파일 보관',\n vuefire: 'Nuxt와 Firebase 실시간 연결',\n },\n}\n","export default {\n default: '일반',\n card: '카드',\n dense: '조밀',\n video: '영상',\n}\n","export default {\n empty: '아직 댓글이 없습니다.',\n blinded: '관리자에 의해 블라인드된 댓글입니다.',\n}\n","export default {\n empty: '아직 글이 없습니다.',\n}\n","export default {\n selectedCount: '고른 글 {count} / {max}',\n layoutHint: '2개부터 캐러셀, 4개는 그리드',\n searchPlaceholder: '제목 검색',\n loading: '글을 불러오는 중…',\n noMore: '더 고를 글이 없습니다.',\n}\n","export default {\n empty: '고른 게시물이 없습니다.',\n}\n","export default {\n reviewFailed: '내용 검토에 실패해 글을 등록할 수 없습니다. 잠시 후 다시 시도해 주세요.',\n writeRestricted: '콘텐츠 경고가 누적되어 글·댓글 작성이 잠시 제한됐어요.',\n}\n","export default {\n localHit: '「{hit}」 같은 표현은 사용할 수 없습니다. 다른 말로 바꿔 주세요.',\n localGeneric: '욕설·비속어가 포함되어 게시할 수 없습니다. 표현을 바꿔 주세요.',\n categoryBlocked: '{category}이(가) 포함되어 게시할 수 없습니다. 내용을 수정해 주세요.',\n genericBlocked: '게시할 수 없는 내용이 포함되어 있습니다. 내용을 수정해 주세요.',\n categories: {\n abuse: '욕설·비속어·모욕',\n spam: '스팸·광고',\n adult: '선정적·성인 내용',\n violence: '폭력·위협',\n other: '부적절한 내용',\n },\n}\n","export default {\n liftSoon: '곧 해제',\n liftInHours: '약 {hours}시간 후 해제',\n liftInDays: '약 {days}일 후 해제',\n liftInDaysHours: '약 {days}일 {hours}시간 후 해제',\n}\n","export default {\n boardIdRequired: '[memi-board] boardId 가 필요합니다.',\n photoRequired: '사진을 올려 주세요.',\n bodyRequired: '본문에 글자를 입력하거나 이미지를 첨부해 주세요.',\n titleRequired: '제목을 입력해 주세요.',\n}\n","export default {\n notFound: '사용자를 찾을 수 없습니다.',\n noName: '이름 없음',\n joined: '가입 {time}',\n lastVisit: '최근 방문 {time}',\n stats: {\n posts: '글 {count}',\n comments: '댓글 {count}',\n aiUsage: 'AI 사용 {used} / {limit}',\n aiUsageResets: 'AI 사용 {used} / {limit} · {hours}시간 후 초기화',\n warnings: '경고 {count}회',\n },\n}\n","export default {\n imageOnly: '이미지 파일만 선택할 수 있습니다.',\n nameRequired: '이름을 입력해 주세요.',\n saveFailed: '프로필을 저장하지 못했습니다.',\n title: '프로필 수정',\n changePhoto: '사진 변경',\n name: '이름',\n bio: '자기소개',\n bioPlaceholder: '나를 소개해 보세요',\n}\n","export default {\n failed: '신고하지 못했습니다.',\n reported: '신고함',\n title: '게시물 신고',\n done: '신고를 접수했습니다. 스태프가 내용을 확인합니다.',\n reason: '사유',\n detailPlaceholder: '자세한 내용 (선택)',\n submit: '신고하기',\n}\n","export default {\n staffOnly: '스태프만 신고 목록을 볼 수 있습니다.',\n loadFailed: '목록을 불러오지 못했습니다: {error}',\n empty: '대기 중인 신고가 없습니다.',\n untitled: '제목 없는 글',\n author: '작성 {name}',\n dismiss: '기각',\n confirm: '확인',\n}\n","export default {\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","export default {\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","export default {\n defaultTitle: '섹션 {n}',\n}\n","export default {\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","export default {\n managers: '담당 매니저',\n loading: '설정을 불러오고 있습니다.',\n noAccess: '접근 권한이 없습니다',\n notFound: {\n title: '없는 게시판입니다',\n checkAddress: '주소를 다시 확인해 주세요.',\n checkBoardAddress: '게시판 주소를 다시 확인해 주세요.',\n },\n newBoard: {\n title: '아직 없는 게시판입니다',\n description: '아래 정보를 입력하고 저장하면 이 ID로 새로 만들어집니다.',\n },\n noLabel: '라벨 없음',\n option: {\n default: '일반',\n },\n id: {\n label: '카테고리 ID',\n help: '주소와 데이터 기준값',\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 hiddenHelp: '숨김 게시판은 댓글이 공개 피드에 안 나오고, 담당 스태프만 작성할 수 있습니다',\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 list: {\n filterAll: '전체',\n filterPlaceholder: '이름 또는 주소',\n sort: '정렬',\n sortName: '이름',\n sortDescription: '설명',\n sortId: '주소',\n empty: '해당하는 게시판이 없습니다.',\n none: '없음',\n fieldCount: '{count}개',\n localeAuto: '자동',\n },\n visibility: {\n pending: '공개 범위 변경이 아직 끝나지 않았습니다. 같은 설정으로 다시 저장하면 이어서 처리합니다.',\n label: '공개 범위',\n help: '숨김이면 전체 필터에 안 나오고, 글은 관리자·담당 스태프·작성자만 읽을 수 있습니다. 댓글은 담당 스태프만 쓸 수 있습니다',\n options: {\n public: { label: '보임', description: '전체 목록·필터에 표시' },\n hidden: { label: '숨김', description: '일기장·비공개. 댓글은 담당 스태프만' },\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 customFields: {\n label: '커스텀 필드',\n help: '글에 추가로 저장할 항목입니다. 키는 나중에 그 값으로 검색할 때 쓰고, 이름은 입력한 그대로 보이며 번역하지 않습니다.',\n key: '키',\n keyPlaceholder: 'channel',\n name: '이름',\n namePlaceholder: '채널',\n placeholder: '플레이스홀더',\n inputPlaceholder: '글쓰기 칸에 흐리게 보일 문구',\n add: '필드 추가',\n limit: '커스텀 필드는 8개까지입니다.',\n invalidKey: '키는 영문 소문자로 시작하고, 영문·숫자·밑줄만 32자 이내로 쓸 수 있습니다.',\n duplicateKey: '키 {key}가 중복입니다.',\n labelRequired: '키 {key}의 이름을 입력해 주세요.',\n },\n locale: {\n label: '게시판 언어',\n help: '비우면 사이트 언어를 따릅니다. 고르면 이 게시판은 항상 그 언어로 보입니다.',\n auto: '자동 (사이트 언어 따름)',\n },\n bulk: {\n title: '모든 게시판에 적용',\n help: '체크한 항목만 모든 게시판에 덮어씁니다. 게시판별로 편집 중인 다른 값은 저장하지 않습니다.',\n apply: '게시판 {count}개에 적용',\n applyShort: '적용',\n confirmTitle: '모든 게시판에 적용',\n confirm: '체크한 항목을 게시판 {count}개에 적용할까요?',\n applied: '게시판 {count}개에 적용했습니다.',\n translateUntranslated: '번역 안 된 게시판 번역 ({count})',\n translated: '게시판 {count}개의 이름·설명을 번역해 저장했습니다.',\n translateFailed: '게시판 {count}개는 번역하지 못했습니다. 다시 시도해 주세요.',\n },\n translationLocales: {\n label: '번역 언어',\n help: '이름·설명과 글을 이 언어들로 번역합니다. 글을 쓴 언어는 번역하지 않습니다. 모두 고르면 나중에 추가되는 언어도 포함됩니다.',\n },\n autoTranslatePosts: {\n label: '글·댓글 작성 시 자동 번역',\n help: '켜 두면 새 글의 제목·요약·본문과 댓글·답글을 {count}개 언어로 번역해 함께 저장합니다. 기본값은 꺼짐입니다.',\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 newCategoryHelp: '입력한 이름이 게시판 주소가 됩니다. 40자까지이고, 공백은 - 가 되며, 영문·숫자·한글만 남습니다.',\n newCategoryUrl: '주소: {path}',\n deleteConfirm: '‘{label}’ 게시판을 삭제하시겠습니까?\\n\\n이 게시판의 모든 게시물, 댓글, 대댓글, 본문 이미지, 댓글 이미지와 첨부파일이 영구 삭제됩니다. 이 작업은 되돌릴 수 없습니다.',\n savedCategory: '‘{label}’ 카테고리를 저장했습니다.',\n savedSettings: '게시판 설정을 저장했습니다.',\n created: '게시판을 만들었습니다.',\n error: {\n orderFailed: '카테고리 순서를 저장하지 못했습니다.',\n deleteFailed: '게시판과 연결 데이터를 삭제하지 못했습니다.',\n saveFailed: '게시판 설정을 저장하지 못했습니다.',\n deleteAllFailed: '게시판 데이터를 삭제하지 못했습니다.',\n },\n aiTitle: {\n label: 'AI 제목 자동 만들기',\n help: '새 글의 제목을 비우면 AI가 글(글이 없으면 첫 사진)로 제목을 만들어 줍니다. 사진은 제목을 만들 때만 Google AI로 전송됩니다. 끄면 제목을 직접 써야 하고 사진도 전송되지 않습니다.',\n },\n site: {\n apply: '적용',\n applied: '적용했습니다.',\n title: '전체 설정',\n help: '사이트 전체에 적용됩니다. 호스트 앱의 설정 위에 덧씌워지고, 바꾸면 바로 반영됩니다.',\n ai: { label: 'AI 기능 사용', help: '비용 등으로 AI를 쓰지 않을 때 끄세요. 끄면 번역, 글쓰기 도우미, AI 제목, AI 검열이 모두 꺼지고 사진도 AI로 전송되지 않습니다. 금칙어 검사는 그대로 동작합니다.' },\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: '번역이 없거나 원문과 달라진 글을 찾아 한꺼번에 번역하고 저장합니다. 자동 번역을 끈 게시판이나, 번역이 빠진 글을 채울 때 쓰세요. AI 사용 횟수는 차감하지 않습니다.',\n scan: '번역할 글 찾기',\n run: '{count}개 글 번역하기',\n confirm: '{count}개 글을 번역해 저장합니다. 글 수만큼 AI 호출이 일어납니다. 계속할까요?',\n progress: '번역 중… 완료 {done}, 실패 {failed}',\n allDone: '게시된 글 {total}개 모두 번역이 최신입니다.',\n found: '게시된 글 {total}개 중 {count}개를 번역해야 합니다.',\n failed: '{count}개 글은 번역하지 못했습니다. 다시 찾아서 시도해 주세요.',\n },\n cleanup: {\n contextChanged: '조회 이후 계정이나 게시판 설정이 변경되었습니다. 다시 조회해 주세요.',\n title: '고아 파일·문서 정리',\n description: '전체 게시판에서 부모 글이 없는 파일·댓글, 삭제된 댓글의 이미지, 대상이 없는 좋아요를 조회합니다. 최근 24시간 내 파일과 사용 중인 파일, 신고 기록은 보존합니다.',\n scan: '고아 항목 조회',\n empty: '조회된 고아 항목이 없습니다.',\n selectAll: '전체 선택 ({count}개)',\n delete: '선택 삭제 ({count}개)',\n confirm: '선택한 고아 항목 {count}개를 영구 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.',\n failed: '정리 작업에 실패했습니다. 관리자용 Firestore·Storage 규칙을 확인해 주세요.',\n result: '{deleted}개 삭제, {skipped}개 연결 복구로 제외, {failed}개 실패. 실패한 항목은 다시 시도할 수 있습니다.',\n kinds: { file: '파일', comment: '댓글 문서', like: '좋아요 문서' },\n },\n danger: {\n title: '위험 영역',\n description: '모든 게시글, 댓글, 댓글 이미지, 첨부파일과 카테고리 설정을 영구 삭제합니다. 게시판 사용자와 관리자 권한은 유지합니다.',\n confirmLabel: '확인을 위해 ‘{phrase}’를 입력하세요',\n phrase: '게시판 데이터 삭제',\n button: '모든 데이터 삭제',\n done: '게시판 데이터를 모두 삭제했습니다.',\n },\n}\n","export default {\n copied: '링크 복사됨',\n}\n","export default {\n withGoogle: 'Google로 로그인',\n withApple: 'Apple로 로그인',\n or: '또는',\n name: '이름',\n email: '이메일',\n password: '비밀번호',\n signUp: '회원가입',\n toSignUp: '계정이 없으신가요? 회원가입',\n toSignIn: '이미 계정이 있으신가요? 로그인',\n}\n","export default {\n tooLargeAfterCompress: '압축 후에도 이미지가 5MB를 초과합니다. 더 작은 이미지를 선택해 주세요.',\n sourceTooLarge: '원본 이미지는 {max}MB 이하여야 합니다.',\n heicUnsupported: 'HEIC 사진은 바로 올릴 수 없습니다. 사진 앱에서 선택하거나 JPG, PNG 또는 WebP로 변환해 주세요.',\n cannotOptimize: '이 이미지 형식은 브라우저에서 최적화할 수 없습니다. JPG, PNG 또는 WebP로 변환해 주세요.',\n imageOnly: '이미지 파일만 업로드할 수 있습니다.',\n canvasUnavailable: 'Canvas를 사용할 수 없습니다',\n compressFailed: '압축 실패',\n loadFailed: '이미지 로드 실패',\n}\n","export default {\n title: '좌우로 스와이프해 보세요',\n description: '왼쪽으로 밀면 다음 글, 오른쪽으로 밀면 이전 글로 이동해요.',\n}\n","export default {\n loadFailed: '목록을 불러오지 못했습니다: {error}',\n empty: '작성한 댓글이 없습니다.',\n blinded: '관리자에 의해 블라인드된 댓글입니다.',\n likes: '좋아요 {count}',\n}\n","export default {\n loadFailed: '목록을 불러오지 못했습니다: {error}',\n empty: '작성한 글이 없습니다.',\n}\n","export default {\n changeRoleFailed: '역할을 변경하지 못했습니다.',\n loading: '사용자 목록을 불러오고 있습니다.',\n noPermission: {\n title: '권한이 없습니다',\n description: '게시판 관리자만 사용자 역할을 관리할 수 있습니다.',\n },\n empty: '게시판에 로그인한 사용자가 없습니다.',\n noName: '이름 없음',\n moderationWarnings: '콘텐츠 경고 {count}회',\n}\n","export default {\n loginRequired: 'AI 글쓰기 도우미는 로그인 후 사용할 수 있습니다.',\n userMissing: '사용자 정보를 확인한 뒤 다시 시도해 주세요.',\n dailyLimit: 'AI 글쓰기 도우미는 하루 {limit}회까지 사용할 수 있습니다. 약 {hours}시간 후 다시 이용해 주세요.',\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 title: '본문에서 제목 만들기',\n custom: '커스텀 스타일로 바꾸기…',\n },\n}\n","// 자동 생성 — scripts/gen-i18n-index.mjs\nimport attachments from './attachments'\nimport auth from './auth'\nimport authorMemo from './authorMemo'\nimport authorMenu from './authorMenu'\nimport avatarCropModal from './avatarCropModal'\nimport boardSettings from './boardSettings'\nimport boardUsers from './boardUsers'\nimport commentFeed from './commentFeed'\nimport commentForm from './commentForm'\nimport commentItem from './commentItem'\nimport commentList from './commentList'\nimport commentThread from './commentThread'\nimport comments from './comments'\nimport common from './common'\nimport detail from './detail'\nimport editor from './editor'\nimport footer from './footer'\nimport likes from './likes'\nimport list from './list'\nimport listViewSwitch from './listViewSwitch'\nimport miniComments from './miniComments'\nimport miniList from './miniList'\nimport miniPicker from './miniPicker'\nimport miniPost from './miniPost'\nimport moderation from './moderation'\nimport moderationPrompt from './moderationPrompt'\nimport moderationStrike from './moderationStrike'\nimport posts from './posts'\nimport profile from './profile'\nimport profileEditModal from './profileEditModal'\nimport reportButton from './reportButton'\nimport reportList from './reportList'\nimport reports from './reports'\nimport sectionUtil from './sectionUtil'\nimport sections from './sections'\nimport seo from './seo'\nimport settings from './settings'\nimport shareButton from './shareButton'\nimport signIn from './signIn'\nimport storage from './storage'\nimport swipeHint from './swipeHint'\nimport userCommentList from './userCommentList'\nimport userPostList from './userPostList'\nimport users from './users'\nimport writingAssistant from './writingAssistant'\n\nexport default {\n attachments,\n auth,\n authorMemo,\n authorMenu,\n avatarCropModal,\n boardSettings,\n boardUsers,\n commentFeed,\n commentForm,\n commentItem,\n commentList,\n commentThread,\n comments,\n common,\n detail,\n editor,\n footer,\n likes,\n list,\n listViewSwitch,\n miniComments,\n miniList,\n miniPicker,\n miniPost,\n moderation,\n moderationPrompt,\n moderationStrike,\n posts,\n profile,\n profileEditModal,\n reportButton,\n reportList,\n reports,\n sectionUtil,\n sections,\n seo,\n settings,\n shareButton,\n signIn,\n storage,\n swipeHint,\n userCommentList,\n userPostList,\n users,\n writingAssistant,\n}\n","import { shallowRef, type Ref } from 'vue'\nimport {\n DEFAULT_MEMI_BOARD_LOCALE,\n FALLBACK_MEMI_BOARD_LOCALE,\n type MemiBoardLocale,\n} from './locales'\nimport ko from './messages/ko'\n\nexport interface MemiBoardMessages {\n [key: string]: string | MemiBoardMessages\n}\n\nexport type MemiBoardMessageParams = Record<string, string | number | null | undefined>\n\n/**\n * 언어별 번역은 필요할 때만 받는다(언어당 별도 청크).\n * ko 는 원문이자 최종 폴백이라 코어 번들에 들어간다.\n */\nconst loaders: Record<Exclude<MemiBoardLocale, 'ko'>, () => Promise<{ default: MemiBoardMessages }>> = {\n en: () => import('./messages/en'),\n ja: () => import('./messages/ja'),\n de: () => import('./messages/de'),\n fr: () => import('./messages/fr'),\n es: () => import('./messages/es'),\n pt: () => import('./messages/pt'),\n zh: () => import('./messages/zh'),\n ar: () => import('./messages/ar'),\n id: () => import('./messages/id'),\n}\n\nconst GLOBAL_KEY = '__MEMI_BOARD_I18N__' as const\n\ninterface I18nStore {\n messages: Partial<Record<MemiBoardLocale, MemiBoardMessages>>\n pending: Partial<Record<MemiBoardLocale, Promise<void>>>\n /** 언어 파일이 도착하면 올라가서 t() 를 쓰는 화면을 다시 그린다. */\n version: Ref<number>\n}\n\nfunction store(): I18nStore {\n const g = globalThis as typeof globalThis & { [GLOBAL_KEY]?: I18nStore }\n g[GLOBAL_KEY] ??= { messages: { ko }, pending: {}, version: shallowRef(0) }\n return g[GLOBAL_KEY]\n}\n\nfunction loadOne(locale: MemiBoardLocale): Promise<void> {\n const s = store()\n if (s.messages[locale]) return Promise.resolve()\n if (locale === 'ko') return Promise.resolve()\n s.pending[locale] ??= loaders[locale]()\n .then((mod) => {\n s.messages[locale] = mod.default\n s.version.value++\n })\n .catch((error) => {\n delete s.pending[locale]\n console.warn(`[memi-board] failed to load locale \"${locale}\"`, error)\n })\n return s.pending[locale]!\n}\n\n/** 해당 언어와 폴백(en) 번역을 받아 둔다. 이미 받았으면 바로 끝난다. */\nexport function loadMemiBoardLocale(locale: MemiBoardLocale): Promise<void> {\n if (locale === 'ko') return Promise.resolve()\n return Promise.all([loadOne(locale), loadOne(FALLBACK_MEMI_BOARD_LOCALE)]).then(() => undefined)\n}\n\nexport function isMemiBoardLocaleLoaded(locale: MemiBoardLocale): boolean {\n return !!store().messages[locale]\n}\n\nfunction lookup(tree: MemiBoardMessages | undefined, key: string): string | undefined {\n let node: string | MemiBoardMessages | undefined = tree\n for (const part of key.split('.')) {\n if (!node || typeof node === 'string') return undefined\n node = node[part]\n }\n return typeof node === 'string' ? node : undefined\n}\n\nfunction interpolate(text: string, params?: MemiBoardMessageParams): string {\n if (!params) return text\n return text.replace(/\\{(\\w+)\\}/g, (match, name: string) => {\n const value = params[name]\n return value == null ? match : String(value)\n })\n}\n\n/**\n * 키 하나를 번역한다. 언어 → en → ko 순으로 찾는다.\n * 아직 받지 않은 언어는 건너뛰므로, 파일이 오기 전 잠깐은 폴백 문구가 보일 수 있다.\n * 반응형 의존성을 걸어 두어 파일이 도착하면 다시 계산된다.\n */\nexport function translate(\n locale: MemiBoardLocale | undefined,\n key: string,\n params?: MemiBoardMessageParams,\n): string {\n const s = store()\n void s.version.value\n const code = locale ?? DEFAULT_MEMI_BOARD_LOCALE\n const text = lookup(s.messages[code], key)\n ?? (code === 'ko' ? undefined : lookup(s.messages[FALLBACK_MEMI_BOARD_LOCALE], key))\n ?? lookup(s.messages.ko, key)\n return text == null ? key : interpolate(text, params)\n}\n","import type { Timestamp } from 'firebase/firestore'\nimport { DEFAULT_MEMI_BOARD_LOCALE, memiBoardLocaleInfo, type MemiBoardLocale } from '../i18n/locales'\nimport { translate } from '../i18n/translate'\n\nfunction intl(locale: MemiBoardLocale | undefined): string {\n return memiBoardLocaleInfo(locale ?? DEFAULT_MEMI_BOARD_LOCALE).intl\n}\n\nexport function formatDate(ts: Timestamp | undefined, locale?: MemiBoardLocale): string {\n return ts?.toDate ? ts.toDate().toLocaleDateString(intl(locale)) : ''\n}\n\nconst MINUTE = 60\nconst HOUR = 60 * MINUTE\nconst DAY = 24 * HOUR\n\n/** dayjs relativeTime 기본 구간과 같은 기준으로 반올림한다. */\nexport function formatRelativeDate(ts: Timestamp | undefined, now = Date.now(), locale?: MemiBoardLocale): string {\n if (!ts?.toDate) return translate(locale, 'common.date.justNow')\n const seconds = Math.max(0, Math.round((now - ts.toDate().getTime()) / 1000))\n if (seconds < 45) return translate(locale, 'common.date.fewSecondsAgo')\n const rtf = new Intl.RelativeTimeFormat(intl(locale), { numeric: 'always' })\n const days = seconds / DAY\n if (seconds < 90) return rtf.format(-1, 'minute')\n if (seconds < 45 * MINUTE) return rtf.format(-Math.round(seconds / MINUTE), 'minute')\n if (seconds < 90 * MINUTE) return rtf.format(-1, 'hour')\n if (seconds < 22 * HOUR) return rtf.format(-Math.round(seconds / HOUR), 'hour')\n if (seconds < 36 * HOUR) return rtf.format(-1, 'day')\n if (days < 26) return rtf.format(-Math.round(days), 'day')\n if (days < 46) return rtf.format(-1, 'month')\n if (days < 320) return rtf.format(-Math.round(days / 30.4), 'month')\n if (days < 548) return rtf.format(-1, 'year')\n return rtf.format(-Math.round(days / 365), 'year')\n}\n\nexport function formatFullDate(ts: Timestamp | undefined, locale?: MemiBoardLocale): string {\n if (!ts?.toDate) return translate(locale, 'common.date.checking')\n return new Intl.DateTimeFormat(intl(locale), {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n hourCycle: 'h23',\n }).format(ts.toDate())\n}\n\n/** 생성·수정 시각이 같거나 수정 시각이 없으면 한 줄, 실제 수정됐으면 두 줄. */\nexport function formatTimestampDetails(\n createdAt: Timestamp | undefined,\n updatedAt?: Timestamp,\n locale?: MemiBoardLocale,\n): string[] {\n const created = formatFullDate(createdAt, locale)\n const createdMs = createdAt?.toMillis?.()\n const updatedMs = updatedAt?.toMillis?.()\n if (updatedMs == null || createdMs == null || createdMs === updatedMs) return [created]\n return [\n translate(locale, 'common.date.createdAt', { time: created }),\n translate(locale, 'common.date.updatedAt', { time: formatFullDate(updatedAt, locale) }),\n ]\n}\n","import {\n computed,\n getCurrentInstance,\n hasInjectionContext,\n inject,\n onServerPrefetch,\n provide,\n toValue,\n watch,\n type ComputedRef,\n type InjectionKey,\n type MaybeRefOrGetter,\n} from 'vue'\nimport { isMemiBoardAiEnabled, isMemiBoardI18nEnabled, isMemiBoardTranslationEnabled, memiBoardDefaultLocale, useMemiBoardConfig } from '../config'\nimport {\n DEFAULT_MEMI_BOARD_LOCALE,\n memiBoardLocaleInfo,\n normalizeMemiBoardLocale,\n type MemiBoardLocale,\n} from './locales'\nimport { loadMemiBoardLocale, translate, type MemiBoardMessageParams } from './translate'\nimport {\n formatDate,\n formatFullDate,\n formatRelativeDate,\n formatTimestampDetails,\n} from '../utils/formatDate'\nimport type { Timestamp } from 'firebase/firestore'\n\n/**\n * 호스트 언어. memi-board Nuxt 플러그인이 @nuxtjs/i18n 의 locale 을 앱 단위로 provide 한다.\n * 문자열 키 — dist 번들과 호스트 컴파일 플러그인이 같은 키를 보게 한다.\n */\nexport const memiBoardHostLocaleKey = 'memiBoard:hostLocale' as unknown as InjectionKey<MaybeRefOrGetter<string | undefined | null>>\n/** 보드 단위 언어. 보드 화면(List·Detail·Editor)이 provide 하고 자식(댓글 등)이 따른다. */\nconst boardLocaleKey: InjectionKey<ComputedRef<MemiBoardLocale>> = Symbol('memiBoard:boardLocale')\n\nexport interface UseMemiBoardI18nOptions {\n /**\n * 보드 설정의 언어(`BoardModel.locale`). 비어 있으면 호스트 언어를 따른다.\n * 넘기면 이 컴포넌트 아래 자식들도 같은 언어를 쓴다.\n */\n boardLocale?: MaybeRefOrGetter<string | undefined | null>\n}\n\nexport function useMemiBoardI18n(options: UseMemiBoardI18nOptions = {}) {\n const canInject = hasInjectionContext()\n const parentLocale = canInject ? inject(boardLocaleKey, null) : null\n const hostLocale = canInject ? inject(memiBoardHostLocaleKey, null) : null\n const config = useMemiBoardConfig()\n\n const i18nEnabled = computed(isMemiBoardI18nEnabled)\n const translationEnabled = computed(isMemiBoardTranslationEnabled)\n const aiEnabled = computed(isMemiBoardAiEnabled)\n const locale = computed<MemiBoardLocale>(() => {\n if (!i18nEnabled.value) return normalizeMemiBoardLocale(memiBoardDefaultLocale()) ?? DEFAULT_MEMI_BOARD_LOCALE\n return normalizeMemiBoardLocale(toValue(options.boardLocale))\n ?? parentLocale?.value\n ?? normalizeMemiBoardLocale(toValue(hostLocale))\n ?? normalizeMemiBoardLocale(memiBoardDefaultLocale())\n ?? DEFAULT_MEMI_BOARD_LOCALE\n })\n\n if (options.boardLocale !== undefined && canInject) provide(boardLocaleKey, locale)\n\n watch(locale, value => void loadMemiBoardLocale(value), { immediate: true })\n if (getCurrentInstance()) onServerPrefetch(() => loadMemiBoardLocale(locale.value))\n\n const info = computed(() => memiBoardLocaleInfo(locale.value))\n\n return {\n locale,\n i18nEnabled,\n translationEnabled,\n aiEnabled,\n /** 'ltr' | 'rtl' — 보드 루트 요소의 dir 속성에 쓴다. */\n dir: computed(() => info.value.dir),\n /** Intl 로케일 태그(예: 'ko-KR'). */\n intlLocale: computed(() => info.value.intl),\n t: (key: string, params?: MemiBoardMessageParams) => {\n const role = key.startsWith('common.role.') ? key.slice('common.role.'.length) : ''\n return config.roleLabels?.[role as keyof NonNullable<typeof config.roleLabels>] ?? translate(locale.value, key, params)\n },\n formatDate: (ts: Timestamp | undefined) => formatDate(ts, locale.value),\n formatFullDate: (ts: Timestamp | undefined) => formatFullDate(ts, locale.value),\n formatRelativeDate: (ts: Timestamp | undefined, now?: number) => formatRelativeDate(ts, now, locale.value),\n formatTimestampDetails: (createdAt: Timestamp | undefined, updatedAt?: Timestamp) =>\n formatTimestampDetails(createdAt, updatedAt, locale.value),\n /** 숫자를 현재 언어 형식으로(예: 1,234). */\n formatNumber: (value: number) => value.toLocaleString(info.value.intl),\n }\n}\n\nexport type MemiBoardI18n = ReturnType<typeof useMemiBoardI18n>\n","/** 새 게시판 이름. 이 문자열이 주소가 되므로 메뉴와 주소창에 들어가는 길이로 둔다. */\nexport const BOARD_NAME_MAX = 40\n\n/**\n * 제목 문자열을 URL-friendly slug로 변환\n * e.g. \"게시판 모듈 만들기!!\" → \"게시판-모듈-만들기\"\n */\nexport function slugify(text: string): string {\n return text\n .trim()\n .replace(/\\s+/g, '-') // 공백(연속 포함) → 하이픈\n .replace(/[^a-zA-Z0-9가-힣ㄱ-ㅎㅏ-ㅣ-]/g, '') // 허용 문자 외 제거\n .replace(/-+/g, '-') // 연속 하이픈 → 단일 하이픈\n .replace(/^-+|-+$/g, '') // 앞뒤 하이픈 제거\n}\n\n/** Storage 경로/파일명에 안전한 문자열로 변환 (한글은 유지) */\nexport function safeFileName(name: string, maxLength = 60): string {\n return name.replace(/[^a-zA-Z0-9가-힣ㄱ-ㅎ._-]/g, '-').slice(0, maxLength)\n}\n","import type { Attachment } from '../types'\n\n/** 댓글·답글에 둘 수 있는 이미지 수 */\nexport const COMMENT_IMAGE_LIMIT = 1\n\nconst COMMENT_IMAGE_TYPES = new Set(['image/jpeg', 'image/png', 'image/gif', 'image/webp'])\n\nexport function isCommentImageFile(file: File): boolean {\n const type = (file.type || '').toLowerCase()\n if (COMMENT_IMAGE_TYPES.has(type)) return true\n const name = file.name.toLowerCase()\n return ['.jpg', '.jpeg', '.png', '.gif', '.webp'].some(ext => name.endsWith(ext))\n}\n\nexport function normalizeCommentImages(images: Attachment[] | null | undefined): Attachment[] {\n if (!images?.length) return []\n for (const item of images) {\n if (!item?.name || !item.url?.startsWith('https://') || !item.path) continue\n if (item.path.includes('..') || !item.type?.startsWith('image/')) continue\n if (!Number.isFinite(item.size) || item.size <= 0) continue\n return [{\n name: item.name.slice(0, 200),\n url: item.url,\n path: item.path,\n size: Math.round(item.size),\n type: item.type,\n }]\n }\n return []\n}\n\n/** prefix 아래의 댓글 이미지 객체 경로만 모은다. 다른 글의 파일은 빼 둔다. */\nexport function commentImagePathsUnder(images: unknown, prefix: string): string[] {\n const base = prefix.endsWith('/') ? prefix : `${prefix}/`\n if (!Array.isArray(images)) return []\n const paths = new Set<string>()\n for (const item of images) {\n if (!item || typeof item !== 'object') continue\n const path = (item as { path?: unknown }).path\n if (typeof path !== 'string' || !path.startsWith(base)) continue\n if (path.split('/').includes('..')) continue\n paths.add(path)\n }\n return [...paths]\n}\n"],"mappings":"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"}
@@ -348,6 +348,11 @@ var e = {
348
348
  commentNotFound: "Kommentar nicht gefunden."
349
349
  },
350
350
  list: {
351
+ boardInfo: {
352
+ creator: "Erstellt von",
353
+ managers: "Manager",
354
+ staff: "Team"
355
+ },
351
356
  commentCount: "{count} Kommentare",
352
357
  settings: "Einstellungen",
353
358
  loadFailed: "Liste konnte nicht geladen werden: {error}",
@@ -754,4 +759,4 @@ var e = {
754
759
  //#endregion
755
760
  export { e as default };
756
761
 
757
- //# sourceMappingURL=de-XlC1wNZE.js.map
762
+ //# sourceMappingURL=de-B4GZqxQj.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"de-B4GZqxQj.js","names":[],"sources":["../src/i18n/messages/de.ts"],"sourcesContent":["import type { MemiBoardMessages } from '../translate'\n\n/** 짧은 화면 문구만 번역한다. 빠진 키는 en → ko 순으로 폴백된다. */\nconst messages: MemiBoardMessages = {\n attachments: {\n attach: 'Dateien anhängen ({count} / {max})',\n dropOrClick: 'Dateien ablegen oder klicken',\n uploading: 'Dateien werden hochgeladen…',\n maxFiles: 'Maximal {max} Dateien möglich.',\n },\n auth: {\n writeRestricted: 'Wegen wiederholter Inhaltswarnungen sind Beiträge und Kommentare vorübergehend gesperrt.',\n strikeSuffix: ' (Warnung {count}/{threshold})',\n strikeRestricted: ' Nach {count} Warnungen sind Beiträge und Kommentare gesperrt.',\n notInitialized: '[memi-board] Firebase Auth ist nicht initialisiert.',\n },\n authorMemo: {\n tooLong: 'Notizen dürfen höchstens {max} Zeichen lang sein.',\n },\n authorMenu: {\n viewProfile: 'Profil ansehen',\n viewPosts: 'Beiträge ansehen',\n viewComments: 'Kommentare ansehen',\n memoAriaLabel: 'Notiz zu diesem Autor',\n memoTitle: 'Private Notiz',\n memoPlaceholder: 'Notiz zu diesem Autor…',\n bad: 'Schlecht',\n good: 'Gut',\n },\n avatarCropModal: {\n title: 'Profilbild zuschneiden',\n description: 'Wird quadratisch (1:1) angezeigt. Bereich bitte anpassen.',\n confirm: 'Zuschneiden & hochladen',\n },\n boardSettings: {\n signInRequired: 'Anmeldung erforderlich.',\n idAndNameRequired: 'Bitte Board-ID und Namen eingeben.',\n deleteIdRequired: 'Zum Löschen ist eine Board-ID erforderlich.',\n nameRequired: 'Bitte einen Board-Namen eingeben.',\n },\n boardUsers: {\n unsupportedRole: 'Nicht unterstützte Rolle.',\n roleDescription: {\n admin: 'Verwaltet Benutzerrollen, Board-Einstellungen und alle Inhalte.',\n user: 'Kann Beiträge und Kommentare schreiben und nur eigene Inhalte bearbeiten oder löschen.',\n },\n },\n commentFeed: {\n empty: 'Noch keine Kommentare.',\n emptyLiked: 'Noch keine Kommentare mit Likes.',\n loadFailed: 'Liste konnte nicht geladen werden: {error}',\n blinded: 'Dieser Kommentar wurde von einem Admin ausgeblendet.',\n },\n commentForm: {\n translationSkipped: 'Der Kommentar wurde ohne Übersetzung gespeichert. Du kannst ihn später im Bearbeitungsformular übersetzen.',\n hiddenBoardDenied: 'In ausgeblendeten Boards kann nur das zuständige Team kommentieren.',\n denied: 'Keine Berechtigung, in diesem Board zu kommentieren.',\n signInRequired: 'Anmeldung erforderlich.',\n writeRestricted: 'Wegen wiederholter Inhaltswarnungen sind Beiträge und Kommentare vorübergehend gesperrt.',\n moderationBlocked: 'Enthält Inhalte, die nicht veröffentlicht werden können.',\n replyTo: 'Antwort an {name}',\n placeholder: 'Kommentar schreiben',\n submitReply: 'Antworten',\n submit: 'Kommentieren',\n signInToComment: 'Zum Kommentieren bitte anmelden.',\n attachHint: 'Bild hierher ziehen oder klicken, um eines auszuwählen.',\n attachNote: 'jpg, png, gif, webp. Große Bilder werden auf höchstens 5MB verkleinert.',\n removeImage: 'Angehängtes Bild entfernen',\n imageOnly: 'Nur jpg-, png-, gif- und webp-Bilder können angehängt werden.',\n uploadFailed: 'Bild konnte nicht hochgeladen werden.',\n uploading: 'Bild wird hochgeladen…',\n },\n commentItem: {\n editRestricted: 'Das Bearbeiten von Kommentaren ist vorübergehend gesperrt.',\n moderationBlocked: 'Enthält Inhalte, die nicht veröffentlicht werden können.',\n editFailed: 'Kommentar konnte nicht bearbeitet werden.',\n blindFailed: 'Ausblendestatus konnte nicht geändert werden.',\n likeFailed: 'Like konnte nicht verarbeitet werden.',\n blinded: 'Dieser Kommentar wurde von einem Admin ausgeblendet.',\n attachedImage: 'An den Kommentar angehängtes Bild',\n edit: 'Kommentar bearbeiten',\n blind: 'Kommentar ausblenden',\n unblind: 'Kommentar einblenden',\n delete: 'Kommentar löschen',\n },\n commentList: {\n loading: 'Kommentare werden geladen',\n empty: 'Noch keine Kommentare.',\n loadMore: 'Weitere Kommentare',\n loadingMore: 'Weitere Kommentare werden geladen',\n },\n commentThread: {\n deleteConfirm: 'Diesen Kommentar löschen?',\n deleteFailed: 'Kommentar konnte nicht gelöscht werden.',\n hideReplies: 'Antworten ausblenden',\n showReplies: '{count} Antworten',\n loadMoreReplies: 'Weitere Antworten',\n },\n comments: {\n bodyRequired: 'Bitte einen Kommentar eingeben.',\n bodyTooLong: 'Kommentare dürfen höchstens {max} Zeichen lang sein.',\n replyTargetNotFound: 'Der Kommentar, auf den geantwortet wird, wurde nicht gefunden.',\n threadNotFound: 'Kommentar-Thread nicht gefunden.',\n hasRepliesCannotDelete: 'Kommentare mit Antworten können derzeit nicht gelöscht werden.',\n },\n common: {\n action: {\n cancel: 'Abbrechen',\n save: 'Speichern',\n saved: 'Gespeichert',\n edit: 'Bearbeiten',\n delete: 'Löschen',\n confirm: 'OK',\n close: 'Schließen',\n add: 'Hinzufügen',\n more: 'Mehr',\n prev: 'Zurück',\n next: 'Weiter',\n retry: 'Erneut versuchen',\n reply: 'Antworten',\n like: 'Gefällt mir',\n unlike: 'Gefällt mir nicht mehr',\n share: 'Teilen',\n report: 'Melden',\n signIn: 'Anmelden',\n signOut: 'Abmelden',\n write: 'Schreiben',\n toTop: 'Nach oben',\n },\n label: {\n anonymous: 'Anonym',\n user: 'Benutzer',\n image: 'Bild',\n draft: 'Entwurf',\n loading: 'Wird geladen…',\n },\n role: {\n admin: 'Admin',\n staff: 'Team',\n user: 'Benutzer',\n },\n date: {\n justNow: 'Gerade eben',\n fewSecondsAgo: 'Vor wenigen Sekunden',\n checking: 'Zeit wird geprüft',\n createdAt: 'Erstellt: {time}',\n updatedAt: 'Bearbeitet: {time}',\n },\n },\n detail: {\n deleteConfirm: 'Diesen Beitrag löschen? Das kann nicht rückgängig gemacht werden.',\n notFound: 'Beitrag nicht gefunden.',\n draftPreview: 'Unveröffentlichte Vorschau',\n draftNotice: 'Noch nicht veröffentlicht. Bis zur Veröffentlichung nur für dich sichtbar.',\n publish: 'Veröffentlichen',\n notice: 'Hinweis',\n pin: 'Als Hinweis anheften',\n unpin: 'Hinweis lösen',\n backToList: 'Zurück zur Liste',\n postNav: 'Beitragsnavigation',\n list: 'Liste',\n comments: 'Kommentare',\n },\n editor: {\n titleOptionalPlaceholder: 'Titel (leer lassen, dann schreibt die KI einen)',\n titleAiNotice: 'Die KI hat aus deinem Text einen Titel erstellt. Speichere ihn, wenn er dir gefällt, oder passe ihn vorher an.',\n translateView: {\n title: 'Übersetzungsvorschau: {language}',\n notSaved: 'Nicht gespeichert. Dies ist nur eine Vorschau.',\n },\n titlePlaceholder: 'Titel',\n contentPlaceholder: 'Text eingeben… / öffnet das Blockmenü.',\n imageContentPlaceholder: 'Text eingeben…',\n tagsPlaceholder: 'Tag eingeben, dann Enter',\n pinNotice: 'Als Hinweis anheften',\n submitEdit: 'Änderungen speichern',\n submitNext: 'Weiter: Vorschau',\n apply: 'Übernehmen',\n imageOptimizing: 'Bild wird optimiert und hochgeladen…',\n cover: {\n imageLink: 'Bildlink',\n addPhoto: 'Fotos hinzufügen',\n alt: 'Foto {n}',\n representative: 'Titelbild',\n setRepresentative: 'Als Titelbild',\n setRepresentativeAria: 'Foto {n} als Titelbild festlegen',\n remove: 'Foto entfernen',\n add: 'Hinzufügen',\n uploading: 'Wird hochgeladen…',\n dropOrClick: 'Fotos ablegen oder klicken',\n emptyHint: 'Mehrfachauswahl · Titelbild nach Upload wählen · Ziehen zum Sortieren',\n uploadTitle: 'Hochladen',\n },\n uploadFailed: 'Upload fehlgeschlagen',\n aiAssistant: 'AI-Schreibassistent',\n insertBlock: 'Block einfügen',\n blockMenu: 'Blockmenü',\n imageDialog: {\n title: 'Bild hinzufügen',\n chooseFile: 'Bild vom Gerät auswählen',\n orLink: 'oder Bildlink',\n urlLabel: 'Bild-URL',\n previewAlt: 'Vorschau des externen Bildes',\n addLink: 'Link hinzufügen',\n },\n customDialog: {\n title: 'In eigenem Stil umschreiben',\n label: 'Wie soll umgeschrieben werden?',\n help: 'z. B. locker / förmlich und schriftlich / als knappe Stichpunkte',\n placeholder: 'Locker formuliert',\n },\n aiPreview: {\n title: 'AI-Ergebnis prüfen',\n currentTitle: 'Aktueller Titel',\n newTitle: 'Neuer Titel',\n currentContent: 'Aktueller Inhalt',\n appendedContent: 'Hinzuzufügender Inhalt',\n before: 'Vorher',\n after: 'Nachher',\n },\n menu: {\n ai: 'AI',\n aiContinue: 'Mit AI weiterschreiben',\n style: 'Stil',\n insert: 'Einfügen',\n paragraph: 'Absatz',\n heading1: 'Überschrift 1',\n heading2: 'Überschrift 2',\n heading3: 'Überschrift 3',\n bulletList: 'Aufzählung',\n orderedList: 'Nummerierte Liste',\n blockquote: 'Zitat',\n codeBlock: 'Codeblock',\n horizontalRule: 'Trennlinie',\n image: 'Bild',\n turnInto: 'Umwandeln in',\n resetFormatting: 'Formatierung zurücksetzen',\n duplicate: 'Duplizieren',\n moveUp: 'Nach oben',\n moveDown: 'Nach unten',\n delete: 'Löschen',\n },\n toolbar: {\n link: 'Link',\n image: 'Bild',\n format: 'Format',\n bold: 'Fett',\n italic: 'Kursiv',\n underline: 'Unterstrichen',\n strike: 'Durchgestrichen',\n title: 'Titel',\n heading: 'Überschrift',\n subheading: 'Zwischenüberschrift',\n body: 'Fließtext',\n mono: 'Monospace',\n bulletList: 'Aufzählung',\n orderedList: 'Nummerierte Liste',\n blockquote: 'Blockzitat',\n codeBlock: 'Codeblock',\n horizontalRule: 'Trennlinie',\n clearFormatting: 'Formatierung entfernen',\n undo: 'Rückgängig',\n redo: 'Wiederholen',\n },\n ai: {\n translateView: 'Übersetzt ansehen',\n translateAll: 'In {count} Sprachen übersetzen und speichern',\n proofread: 'Rechtschreibung prüfen',\n polish: 'Text verbessern',\n continue: 'Weiterschreiben',\n summarize: 'Kurz zusammenfassen',\n translateEn: 'Ins Englische übersetzen',\n translateKo: 'Ins Koreanische übersetzen',\n translateEmpty: 'Geben Sie zuerst einen Titel oder Text zum Übersetzen ein.',\n title: 'Titel aus Text erstellen',\n custom: 'In eigenem Stil umschreiben…',\n failed: 'AI-Aufgabe fehlgeschlagen. Bitte erneut versuchen.',\n },\n youtubePrompt: 'YouTube-Link eingeben.',\n errors: {\n coverMax: 'Maximal {max} Fotos möglich.',\n imageUrlRequired: 'Bitte eine Bild-URL eingeben.',\n imageUrlInvalid: 'Bitte eine gültige Bild-URL eingeben.',\n imageUrlHttps: 'Nur HTTPS-Bild-URLs sind erlaubt.',\n imageUrlCredentials: 'URLs mit Anmeldedaten sind nicht erlaubt.',\n imageTimeout: 'Das Bild lädt zu lange.',\n imageNotDisplayable: 'Dieses Bild kann nicht angezeigt werden.',\n editorNotReady: 'Editor ist nicht bereit. Bitte erneut versuchen.',\n imageLinkFailed: 'Bildlink konnte nicht hinzugefügt werden.',\n imageOnly: 'Nur Bilddateien können hochgeladen werden.',\n imageTooLarge: 'Originalbilder dürfen höchstens {mb} MB groß sein.',\n imageUploadFailed: 'Bild-Upload fehlgeschlagen.',\n pasteAsFile: 'Fotos bitte als Dateien in den Bereich oben einfügen oder ziehen.',\n postNotFound: 'Beitrag nicht gefunden.',\n loadPermission: 'Keine Berechtigung, diesen Beitrag zu laden. Bitte Anmeldung prüfen.',\n loadFailed: 'Beitrag konnte nicht geladen werden: {message}',\n titleRequired: 'Bitte einen Titel eingeben.',\n photoRequired: 'Bitte mindestens ein Foto hochladen.',\n bodyRequired: 'Bitte Text eingeben oder ein Bild anhängen.',\n signInRequired: 'Anmeldung erforderlich.',\n boardMissing: 'Kein Board angegeben.',\n writeRestricted: 'Wegen wiederholter Inhaltswarnungen sind Beiträge und Kommentare vorübergehend gesperrt.',\n moderationBlocked: 'Enthält Inhalte, die nicht veröffentlicht werden können.',\n },\n hint: {\n titling: 'Titel wird erstellt…',\n reviewing: 'Inhalt wird geprüft…',\n saving: 'Wird gespeichert…',\n },\n },\n footer: {\n introduction: \"memi-board basiert auf Nuxt 4, Vue 3 und TypeScript. Nuxt UI und Firebase verbinden Beiträge, Kommentare und Gespräche.\",\n eyebrow: \"Ein Ort für Gespräche\",\n tagline: \"Kleine Communitys. Gemeinsame Geschichten.\",\n detail: \"Ausführliche Einführung\",\n links: \"Links & Kontakt\",\n email: \"E-Mail\",\n credit: \"Entwickelt von memi\",\n feedback: \"Feedback senden\",\n feedbackSubject: \"memi-board Feedback\",\n feedbackBody: \"Feedback:\\n\",\n siteEyebrow: \"Mit memi-board entwickelt\",\n changelog: \"Änderungsprotokoll\",\n info: {\n title: \"memi-board\",\n about: \"Über memi-board\",\n sites: \"Referenzen\",\n history: 'Versionsverlauf',\n },\n sites: {\n description: \"Diese Dienste nutzen memi-board für Beiträge und Gespräche.\",\n memi: \"Ein Ort für Entwicklung und Alltagsgeschichten\",\n waiting: \"Ein einfacher Wartelistendienst per QR-Code\",\n track: \"GPS-Tracking zur Aufzeichnung von Routen\",\n loop: \"Fahrtenaufzeichnung und Sensorlösungen\",\n safe: \"Verbindung und Einrichtung eines Geräts gegen Pedalverwechslungen\",\n inviteTitle: \"Nutzen Sie es auch?\",\n invite: \"Schreiben Sie uns Ihre Website-Adresse.\",\n inviteSite: \"Auf memi.dev hinterlassen\",\n inviteOr: \"oder\",\n inviteSubject: \"Wir nutzen memi-board\",\n inviteBody: \"Website-Adresse:\\n\",\n },\n stack: {\n ui: 'Oberfläche & Erlebnis',\n data: 'Daten & Anmeldung',\n writing: 'Schreiben & Komfort',\n },\n },\n likes: {\n signInRequired: 'Anmeldung erforderlich.',\n commentNotFound: 'Kommentar nicht gefunden.',\n },\n list: {\n boardInfo: {\n creator: 'Erstellt von',\n managers: 'Manager',\n staff: 'Team',\n },\n commentCount: '{count} Kommentare',\n settings: 'Einstellungen',\n loadFailed: 'Liste konnte nicht geladen werden: {error}',\n empty: 'Noch keine Beiträge.',\n notice: 'Hinweis',\n photo: 'Foto',\n likeCount: 'Likes {count}',\n info: {\n title: 'Board-Info',\n about: 'Über dieses Board',\n history: 'Versionsverlauf',\n },\n stack: {\n framework: 'Framework & Sprache',\n ui: 'UI & Styling',\n backend: 'Backend & Daten',\n },\n tech: {\n nuxt: 'Vue-basiertes SSR-Framework',\n vue: 'Composition API · script setup',\n typescript: 'Typsichere Daten und Komponenten',\n nuxtUi: 'Board-, Formular- und Modal-UI',\n tailwind: 'Responsiv · helle/dunkle Stile',\n lucide: 'Leichte, einheitliche Icons',\n dayjs: 'Lesbare Datums- und relative Zeitangaben',\n firestore: 'Echtzeit-DB für Beiträge und Kommentare',\n auth: 'Sichere Anmeldung und Berechtigungen',\n storage: 'Speicher für Bilder und Anhänge',\n vuefire: 'Echtzeit-Anbindung von Nuxt und Firebase',\n },\n },\n listViewSwitch: {\n card: 'Karte',\n default: 'Standard',\n dense: 'Kompakt',\n video: 'Video',\n },\n miniComments: {\n empty: 'Noch keine Kommentare.',\n blinded: 'Dieser Kommentar wurde von einem Admin ausgeblendet.',\n },\n miniList: {\n empty: 'Noch keine Beiträge.',\n },\n miniPicker: {\n selectedCount: 'Ausgewählt {count} / {max}',\n layoutHint: 'Ab 2 als Karussell, 4 als Raster',\n searchPlaceholder: 'Titel suchen',\n loading: 'Beiträge werden geladen…',\n noMore: 'Keine weiteren Beiträge zur Auswahl.',\n },\n miniPost: {\n empty: 'Keine Beiträge ausgewählt.',\n },\n moderation: {\n writeRestricted: 'Wegen wiederholter Inhaltswarnungen sind Beiträge und Kommentare vorübergehend gesperrt.',\n },\n moderationPrompt: {\n localHit: 'Ausdrücke wie „{hit}“ sind nicht erlaubt. Bitte anders formulieren.',\n localGeneric: 'Enthält Schimpfwörter und kann nicht veröffentlicht werden. Bitte anders formulieren.',\n genericBlocked: 'Enthält Inhalte, die nicht veröffentlicht werden können. Bitte überarbeiten.',\n categories: {\n abuse: 'Schimpfwörter oder Beleidigungen',\n spam: 'Spam oder Werbung',\n adult: 'sexuelle oder nicht jugendfreie Inhalte',\n violence: 'Gewalt oder Drohungen',\n other: 'unangemessene Inhalte',\n },\n },\n moderationStrike: {\n liftSoon: 'endet bald',\n liftInHours: 'endet in ca. {hours} Std.',\n liftInDays: 'endet in ca. {days} T.',\n liftInDaysHours: 'endet in ca. {days} T. {hours} Std.',\n },\n posts: {\n boardIdRequired: '[memi-board] boardId ist erforderlich.',\n photoRequired: 'Bitte ein Foto hinzufügen.',\n bodyRequired: 'Bitte Text eingeben oder ein Bild anhängen.',\n titleRequired: 'Bitte einen Titel eingeben.',\n },\n profile: {\n stats: {\n posts: '{count} Beiträge',\n comments: '{count} Kommentare',\n aiUsage: 'KI genutzt {used} / {limit}',\n aiUsageResets: 'KI genutzt {used} / {limit} · Zurücksetzung in {hours} Std.',\n warnings: '{count} Verwarnungen',\n },\n notFound: 'Benutzer nicht gefunden.',\n noName: 'Kein Name',\n joined: 'Dabei seit {time}',\n lastVisit: 'Zuletzt aktiv {time}',\n },\n profileEditModal: {\n imageOnly: 'Nur Bilddateien können ausgewählt werden.',\n nameRequired: 'Bitte einen Namen eingeben.',\n saveFailed: 'Profil konnte nicht gespeichert werden.',\n title: 'Profil bearbeiten',\n changePhoto: 'Foto ändern',\n name: 'Name',\n bio: 'Über mich',\n bioPlaceholder: 'Erzähl etwas über dich',\n },\n reportButton: {\n failed: 'Meldung konnte nicht gesendet werden.',\n reported: 'Gemeldet',\n title: 'Beitrag melden',\n done: 'Meldung erhalten. Das Team prüft sie.',\n reason: 'Grund',\n detailPlaceholder: 'Details (optional)',\n submit: 'Melden',\n },\n reportList: {\n staffOnly: 'Nur das Team kann Meldungen einsehen.',\n loadFailed: 'Liste konnte nicht geladen werden: {error}',\n empty: 'Keine offenen Meldungen.',\n untitled: 'Beitrag ohne Titel',\n author: 'von {name}',\n dismiss: 'Ablehnen',\n confirm: 'Erledigt',\n },\n reports: {\n reason: {\n spam: 'Spam / Werbung',\n abuse: 'Beleidigung / Hass / Belästigung',\n adult: 'Sexuelle Inhalte',\n illegal: 'Illegale Inhalte',\n other: 'Sonstiges',\n },\n fallbackLabel: 'Meldung',\n signInRequired: 'Anmeldung erforderlich.',\n cannotReportOwn: 'Eigene Beiträge können nicht gemeldet werden.',\n reasonRequired: 'Bitte einen Grund auswählen.',\n detailTooLong: 'Details dürfen höchstens {max} Zeichen lang sein.',\n },\n sectionUtil: {\n kind: {\n list: 'Beitragsliste',\n post: 'Beiträge',\n comments: 'Kommentare',\n },\n sort: {\n latest: 'Neueste',\n likes: 'Beliebteste',\n },\n untitledPost: 'Beitrag',\n view: {\n media: 'Medien',\n list: 'Liste',\n },\n },\n sections: {\n defaultTitle: 'Abschnitt {n}',\n },\n seo: {\n allCategory: 'Alle',\n boardDescription: 'Board {name}',\n allDescription: 'Board – Ankündigungen und News aus der Community.',\n postFallbackTitle: 'Beitrag | {site}',\n postFallbackDescription: 'Board',\n photo: 'Foto',\n postDescriptionFallback: 'Board-Beitrag',\n listTitle: '{name} | {site}',\n listTitleAll: 'Board | {site}',\n listDescription: '{name} – die neuesten Beiträge.',\n listDescriptionAll: 'Board – Ankündigungen und Geschichten.',\n },\n settings: {\n aiTitle: {\n label: 'Titel mit KI erstellen',\n help: 'Bleibt der Titel eines neuen Beitrags leer, schreibt die KI einen aus dem Text (oder aus dem ersten Foto, wenn kein Text vorhanden ist). Fotos werden nur dafür an Google AI gesendet. Ausschalten verlangt einen eigenen Titel und sendet keine Fotos.',\n },\n site: {\n apply: 'Übernehmen',\n applied: 'Übernommen.',\n title: 'Allgemeine Einstellungen',\n help: 'Gelten für die gesamte Website. Sie überschreiben die Einstellungen der Host-App und wirken sofort.',\n ai: { label: 'KI-Funktionen verwenden', help: 'Ausschalten, wenn KI nicht genutzt werden kann, z. B. wegen der Kosten. Dadurch werden Übersetzung, Schreibassistent, KI-Titel und KI-Moderation abgeschaltet, und Fotos werden nicht mehr an die KI gesendet. Die Sperrwortprüfung funktioniert weiterhin.' },\n i18n: { label: 'Internationalisierung verwenden', help: 'Wenn ausgeschaltet, sind alle Seiten auf die unten gewählte Sprache festgelegt und die Übersetzung ist aus. Gespeicherte Übersetzungen werden nicht gelöscht.' },\n locales: { label: 'Angebotene Sprachen', help: 'Nur die {count} ausgewählten Sprachen werden übersetzt und im Sprachmenü angezeigt. Nicht ausgewählte Sprachen erhalten keine neuen Übersetzungen; gespeicherte Übersetzungen werden nicht gelöscht.' },\n locale: { label: 'Standardsprache', help: 'Die Sprache, die verwendet wird, wenn die Host-App keine festlegt.', fixedLabel: 'Feste Sprache', fixedHelp: 'Alle Seiten werden in dieser Sprache angezeigt.' },\n },\n i18nBoard: {\n label: 'Internationalisierung',\n help: 'Wenn eingeschaltet, werden Boardname, Beschreibung sowie neue Beiträge und Kommentare automatisch in {count} Sprachen übersetzt und gespeichert. Ausgeschaltet wird nur der Originaltext angezeigt.',\n existing: 'Bestehende Beiträge auch übersetzen',\n },\n about: {\n label: 'About memi-board anzeigen',\n help: 'Zeigt den Link und das Popup „About memi-board“ unten auf jeder Board-Seite an. Ausschalten blendet es auf der ganzen Website aus.',\n },\n postTranslations: {\n label: 'Bestehende Beiträge übersetzen',\n help: 'Findet Beiträge, deren Übersetzung fehlt oder nicht mehr zum Original passt, und übersetzt und speichert sie auf einmal. Nützlich für Boards mit ausgeschalteter automatischer Übersetzung oder zum Nachholen übersehener Beiträge. Das tägliche KI-Kontingent wird nicht verbraucht.',\n scan: 'Zu übersetzende Beiträge suchen',\n run: '{count} Beiträge übersetzen',\n confirm: '{count} Beiträge werden übersetzt und gespeichert, dabei erfolgt für jeden ein KI-Aufruf. Fortfahren?',\n progress: 'Übersetzung läuft… {done} fertig, {failed} fehlgeschlagen',\n allDone: 'Alle {total} veröffentlichten Beiträge haben aktuelle Übersetzungen.',\n found: '{count} von {total} veröffentlichten Beiträgen müssen übersetzt werden.',\n failed: '{count} Beiträge konnten nicht übersetzt werden. Suche erneut und versuche es noch einmal.',\n },\n loading: 'Einstellungen werden geladen…',\n noAccess: 'Kein Zugriff',\n notFound: {\n title: 'Board nicht gefunden',\n checkAddress: 'Bitte die Adresse prüfen.',\n checkBoardAddress: 'Bitte die Board-Adresse prüfen.',\n },\n newBoard: {\n title: 'Dieses Board gibt es noch nicht',\n description: 'Unten Angaben ausfüllen und speichern, um es mit dieser ID anzulegen.',\n },\n noLabel: 'Kein Label',\n option: {\n default: 'Standard',\n },\n id: {\n label: 'Kategorie-ID',\n help: 'Wird in URL und Daten verwendet',\n },\n writeRole: {\n label: 'Wer darf posten',\n help: 'Mindestrolle zum Posten in dieser Kategorie',\n helpShort: 'Mindestrolle zum Posten',\n options: {\n user: 'Ab Benutzer',\n staff: 'Ab Team',\n admin: 'Nur Admins',\n },\n },\n commentWriteRole: {\n label: 'Wer darf kommentieren',\n help: 'Mindestrolle zum Kommentieren in dieser Kategorie',\n helpShort: 'Mindestrolle zum Kommentieren',\n hiddenFixed: 'Nur zuständiges Team (fest bei ausgeblendeten Boards)',\n },\n staff: {\n label: 'Zuständiges Team',\n help: 'Nur die ausgewählten Teammitglieder können dieses Board einrichten und verwalten. Leer lassen = nur Admins',\n placeholder: 'Nur Admins (kein Team zugewiesen)',\n },\n label: {\n label: 'Anzeigename',\n help: 'Der für Benutzer sichtbare Name',\n },\n description: {\n label: 'Beschreibung',\n help: 'Wird u. a. oben im Board angezeigt',\n placeholder: 'Kurze Beschreibung dieses Boards (optional)',\n },\n visibility: {\n label: 'Sichtbarkeit',\n options: {\n public: {\n label: 'Sichtbar',\n description: 'In Gesamtliste und Filtern sichtbar',\n },\n hidden: {\n label: 'Ausgeblendet',\n description: 'Tagebuch oder privat. Nur das zuständige Team kann kommentieren',\n },\n },\n },\n listView: {\n label: 'Listenansicht',\n help: 'Darstellung der Beitragsliste',\n options: {\n card: 'Karte',\n dense: 'Kompakt',\n video: 'Video',\n },\n },\n editorType: {\n label: 'Beitragsformular',\n help: 'Art der Beitragserstellung',\n options: {\n default: 'Titel und Text schreiben',\n image: 'Mehrere Fotos und ein Titelbild hinzufügen',\n },\n },\n bulk: {\n title: 'Auf alle Boards anwenden',\n apply: 'Auf {count} Boards anwenden',\n applyShort: 'Anwenden',\n confirmTitle: 'Auf alle Boards anwenden',\n translateUntranslated: 'Unübersetzte Boards übersetzen ({count})',\n },\n translationLocales: {\n label: 'Übersetzungssprachen',\n },\n locale: {\n label: 'Board-Sprache',\n auto: 'Automatisch (Sprache der Website)',\n },\n autoTranslate: {\n action: \"In {count} Sprachen übersetzen\",\n manualHelp: \"Anzeigename und Beschreibung zusammen übersetzen. Danach zum Anwenden speichern.\",\n pending: \"Übersetzungen für {count} Sprachen sind bereit. Zum Anwenden speichern.\",\n manualFailed: \"Übersetzung fehlgeschlagen. Ihr Text bleibt erhalten. Bitte erneut versuchen.\",\n label: 'Beim Speichern in {count} Sprachen übersetzen',\n help: 'Wenn aktiv, werden Name und Beschreibung in {count} Sprachen übersetzt. Wenn aus, wird nicht übersetzt. Unveränderter Text wird nicht erneut übersetzt.',\n failed: 'Die Einstellungen wurden gespeichert, die Übersetzung in {count} Sprachen ist aber fehlgeschlagen. Speichern Sie erneut.',\n ready: 'Name und Beschreibung sind in {count} Sprachen gespeichert.',\n },\n action: {\n moveDown: 'Nach unten',\n goToBoard: 'Zum Board',\n deleteBoard: 'Board löschen',\n create: 'Erstellen',\n },\n newCategoryPlaceholder: 'Name der neuen Kategorie',\n savedCategory: 'Kategorie „{label}“ gespeichert.',\n savedSettings: 'Board-Einstellungen gespeichert.',\n created: 'Board erstellt.',\n error: {\n orderFailed: 'Kategoriereihenfolge konnte nicht gespeichert werden.',\n deleteFailed: 'Board und zugehörige Daten konnten nicht gelöscht werden.',\n saveFailed: 'Board-Einstellungen konnten nicht gespeichert werden.',\n deleteAllFailed: 'Board-Daten konnten nicht gelöscht werden.',\n },\n danger: {\n title: 'Gefahrenbereich',\n confirmLabel: 'Zur Bestätigung „{phrase}“ eingeben',\n phrase: 'Board-Daten löschen',\n button: 'Alle Daten löschen',\n done: 'Alle Board-Daten wurden gelöscht.',\n },\n },\n shareButton: {\n copied: 'Link kopiert',\n },\n signIn: {\n withGoogle: 'Mit Google anmelden',\n withApple: 'Mit Apple anmelden',\n or: 'oder',\n name: 'Name',\n email: 'E-Mail',\n password: 'Passwort',\n signUp: 'Registrieren',\n toSignUp: 'Noch kein Konto? Registrieren',\n toSignIn: 'Bereits ein Konto? Anmelden',\n },\n storage: {\n sourceTooLarge: 'Das Originalbild darf höchstens {max} MB groß sein.',\n imageOnly: 'Nur Bilddateien können hochgeladen werden.',\n canvasUnavailable: 'Canvas ist nicht verfügbar',\n compressFailed: 'Komprimierung fehlgeschlagen',\n loadFailed: 'Bild konnte nicht geladen werden',\n },\n swipeHint: {\n title: 'Nach links oder rechts wischen',\n description: 'Nach links wischen für den nächsten, nach rechts für den vorherigen Beitrag.',\n },\n userCommentList: {\n loadFailed: 'Liste konnte nicht geladen werden: {error}',\n empty: 'Noch keine Kommentare.',\n blinded: 'Dieser Kommentar wurde von einem Admin ausgeblendet.',\n likes: '{count} Likes',\n },\n userPostList: {\n loadFailed: 'Liste konnte nicht geladen werden: {error}',\n empty: 'Noch keine Beiträge.',\n },\n users: {\n changeRoleFailed: 'Rolle konnte nicht geändert werden.',\n loading: 'Benutzer werden geladen…',\n noPermission: {\n title: 'Keine Berechtigung',\n description: 'Nur Board-Admins können Benutzerrollen verwalten.',\n },\n empty: 'Noch keine Benutzer im Board angemeldet.',\n noName: 'Kein Name',\n moderationWarnings: '{count} Inhaltswarnungen',\n },\n writingAssistant: {\n dailyLimit: 'Der KI-Schreibassistent kann bis zu {limit}-mal pro Tag verwendet werden. Versuche es in etwa {hours} Stunde(n) erneut.',\n loginRequired: 'Zum Nutzen des AI-Schreibassistenten bitte anmelden.',\n userMissing: 'Benutzerdaten konnten nicht geprüft werden. Bitte erneut versuchen.',\n contentRequired: 'Bitte zuerst Text für die AI eingeben.',\n customRequired: 'Bitte eine Anweisung zum Umschreiben eingeben.',\n emptyResult: 'Die AI konnte kein Ergebnis erzeugen. Bitte erneut versuchen.',\n translateEmpty: 'Geben Sie zuerst einen Titel oder Text zum Übersetzen ein.',\n translateTooLong: 'Texte über {limit} Zeichen können nicht in {count} Sprachen gespeichert werden. Kürzen Sie den Text und versuchen Sie es erneut.',\n translateIncomplete: 'Einige Sprachen kamen leer zurück. Bitte erneut versuchen.',\n failed: 'AI-Aufgabe fehlgeschlagen. Bitte erneut versuchen.',\n actions: {\n proofread: 'Rechtschreibung prüfen',\n polish: 'Text verbessern',\n continue: 'Weiterschreiben',\n summarize: 'Kurz zusammenfassen',\n translateEn: 'Ins Englische übersetzen',\n translateKo: 'Ins Koreanische übersetzen',\n translateAll: 'In {count} Sprachen übersetzen und speichern',\n translateSaved: 'In {count} Sprachen gespeichert. Leser sehen die Übersetzung ihrer Sprache.',\n translatePending: 'Die Übersetzungen für {count} Sprachen sind bereit. Sie werden mit dem Beitrag gespeichert.',\n translateEmpty: 'Geben Sie zuerst einen Titel oder Text zum Übersetzen ein.',\n title: 'Titel aus Text erstellen',\n custom: 'In eigenem Stil umschreiben…',\n },\n },\n}\n\nexport default messages\n"],"mappings":"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"}
@@ -375,6 +375,11 @@ var e = {
375
375
  commentCount: "{count} comments",
376
376
  photo: "Photo",
377
377
  likeCount: "Likes {count}",
378
+ boardInfo: {
379
+ creator: "Created by",
380
+ managers: "Managers",
381
+ staff: "Staff"
382
+ },
378
383
  info: {
379
384
  title: "Board info",
380
385
  about: "About this board",
@@ -843,4 +848,4 @@ var e = {
843
848
  //#endregion
844
849
  export { e as default };
845
850
 
846
- //# sourceMappingURL=en-XIVIrnU-.js.map
851
+ //# sourceMappingURL=en-BDkfivhc.js.map