memi-board 0.51.2 → 0.52.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/{ar-Dzc31QaB.js → ar-BVwpedHS.js} +23 -14
  2. package/dist/ar-BVwpedHS.js.map +1 -0
  3. package/dist/{commentImages-CV0g3ARh.js → commentImages-CzXO42gE.js} +39 -23
  4. package/dist/commentImages-CzXO42gE.js.map +1 -0
  5. package/dist/composables/useMemiBoardWritingAssistant.d.ts +2 -0
  6. package/dist/data/versionHistory.d.ts +5 -0
  7. package/dist/{de-Wci_gqEw.js → de-K2gYwR8U.js} +23 -14
  8. package/dist/de-K2gYwR8U.js.map +1 -0
  9. package/dist/{en-Dhe-tFzi.js → en-CmPLbFcN.js} +30 -14
  10. package/dist/en-CmPLbFcN.js.map +1 -0
  11. package/dist/{es-BHJ1VeX-.js → es-1P1miLJH.js} +23 -14
  12. package/dist/es-1P1miLJH.js.map +1 -0
  13. package/dist/{fr-aSscFSwK.js → fr-cDQCmNSc.js} +23 -14
  14. package/dist/fr-cDQCmNSc.js.map +1 -0
  15. package/dist/{id-BuUIYpdS.js → id-BzDIqeZ4.js} +23 -14
  16. package/dist/id-BzDIqeZ4.js.map +1 -0
  17. package/dist/index.d.ts +1 -1
  18. package/dist/index.js +597 -427
  19. package/dist/index.js.map +1 -1
  20. package/dist/{ja-owJ_AiPl.js → ja-B2wxHGCr.js} +23 -14
  21. package/dist/ja-B2wxHGCr.js.map +1 -0
  22. package/dist/{pt-B3Uxrkz2.js → pt-BCY3OODD.js} +23 -14
  23. package/dist/pt-BCY3OODD.js.map +1 -0
  24. package/dist/runtime/components/CategorySettings.vue +37 -9
  25. package/dist/runtime/components/Editor.vue +9 -4
  26. package/dist/runtime/components/Settings.vue +198 -9
  27. package/dist/runtime/components/VersionHistory.vue +9 -2
  28. package/dist/storage.js +1 -1
  29. package/dist/types.d.ts +5 -0
  30. package/dist/utils/localizedFields.d.ts +12 -2
  31. package/dist/{zh-B49hHRSL.js → zh-Y824rwR6.js} +23 -14
  32. package/dist/zh-Y824rwR6.js.map +1 -0
  33. package/package.json +1 -1
  34. package/dist/ar-Dzc31QaB.js.map +0 -1
  35. package/dist/commentImages-CV0g3ARh.js.map +0 -1
  36. package/dist/de-Wci_gqEw.js.map +0 -1
  37. package/dist/en-Dhe-tFzi.js.map +0 -1
  38. package/dist/es-BHJ1VeX-.js.map +0 -1
  39. package/dist/fr-aSscFSwK.js.map +0 -1
  40. package/dist/id-BuUIYpdS.js.map +0 -1
  41. package/dist/ja-owJ_AiPl.js.map +0 -1
  42. package/dist/pt-B3Uxrkz2.js.map +0 -1
  43. package/dist/zh-B49hHRSL.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"commentImages-CV0g3ARh.js","names":[],"sources":["../src/utils/boardPaths.ts","../src/config.ts","../src/i18n/locales.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":["/**\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 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}\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\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 /**\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\nexport function isMemiBoardI18nEnabled(): boolean {\n return useMemiBoardConfig().i18n?.enabled !== false\n}\n\nexport function isMemiBoardTranslationEnabled(): boolean {\n return isMemiBoardI18nEnabled() && useMemiBoardConfig().translation?.enabled !== false\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","/** 게시판 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","export default {\n attach: '파일 첨부 ({count} / {max})',\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 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 titlePlaceholder: '제목',\n contentPlaceholder: '본문을 입력하세요… / 를 입력하면 블록 메뉴가 열립니다.',\n imageContentPlaceholder: '내용을 입력하세요…',\n tagsPlaceholder: '태그 입력 후 Enter',\n skipModeration: '비속어 필터 무시 (관리자)',\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 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 translateAll: '10개 언어로 번역해 저장',\n translateSaved: '10개 언어로 저장했습니다. 다른 언어로 보면 번역이 보입니다.',\n translatePending: '10개 언어 번역을 준비했습니다. 글을 저장하면 함께 기록됩니다.',\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 hint: {\n translating: '글을 10개 언어로 번역하는 중…',\n reviewing: '내용을 검토하는 중…',\n saving: '저장하는 중…',\n },\n}\n","export default {\n introduction: 'Nuxt 4와 Vue 3, TypeScript를 바탕으로 만들고 Nuxt UI와 Firebase로 글과 댓글을 자연스럽게 이어가는 게시판입니다.',\n info: {\n title: '게시판 정보',\n about: '이 게시판은',\n history: '버전 히스토리',\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 photo: '사진',\n likeCount: '추천 {count}',\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 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}\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 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 dense: '조밀',\n video: '영상',\n },\n },\n editorType: {\n label: '입력 폼',\n help: '글쓰기 화면의 작성 방식',\n options: {\n default: '제목과 본문을 작성',\n image: '여러 사진과 대표사진을 작성',\n },\n },\n locale: {\n label: '게시판 언어',\n help: '비우면 사이트 언어를 따릅니다. 고르면 이 게시판은 항상 그 언어로 보입니다.',\n auto: '자동 (사이트 언어 따름)',\n },\n autoTranslatePosts: {\n label: '글 작성 시 자동 번역',\n help: '켜 두면 새 글의 제목·요약·본문을 10개 언어로 번역해 함께 저장합니다. 기본값은 꺼짐입니다.',\n },\n autoTranslate: {\n action: \"10개 언어로 번역\",\n manualHelp: \"표시 라벨과 설명을 함께 번역합니다. 번역 후 저장 버튼을 눌러 적용하세요.\",\n pending: \"10개 언어 번역이 준비되었습니다. 저장 버튼을 눌러 적용하세요.\",\n manualFailed: \"번역하지 못했습니다. 입력한 내용은 유지됩니다. 다시 시도해 주세요.\",\n label: '저장할 때 10개 언어로 번역',\n help: '켜 두면 이름과 설명을 10개 언어로 번역합니다. 꺼져 있으면 번역하지 않습니다. 문구가 그대로면 다시 번역하지 않습니다.',\n failed: '설정은 저장했지만 10개 언어 번역에 실패했습니다. 다시 저장해 주세요.',\n ready: '이름과 설명이 10개 언어로 저장되어 있습니다.',\n },\n action: {\n moveDown: '아래로',\n goToBoard: '게시판으로 이동',\n deleteBoard: '게시판 삭제',\n create: '만들기',\n },\n newCategoryPlaceholder: '새 카테고리 이름',\n deleteConfirm: '‘{label}’ 게시판을 삭제하시겠습니까?\\n\\n이 게시판의 모든 게시물, 댓글, 대댓글, 본문 이미지, 댓글 이미지와 첨부파일이 영구 삭제됩니다. 이 작업은 되돌릴 수 없습니다.',\n savedCategory: '‘{label}’ 카테고리를 저장했습니다.',\n savedSettings: '게시판 설정을 저장했습니다.',\n created: '게시판을 만들었습니다.',\n error: {\n orderFailed: '카테고리 순서를 저장하지 못했습니다.',\n deleteFailed: '게시판과 연결 데이터를 삭제하지 못했습니다.',\n saveFailed: '게시판 설정을 저장하지 못했습니다.',\n deleteAllFailed: '게시판 데이터를 삭제하지 못했습니다.',\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}자를 넘으면 10개 언어로 저장할 수 없습니다. 줄인 뒤 다시 시도해 주세요.',\n translateIncomplete: '일부 언어 번역이 비었습니다. 다시 시도해 주세요.',\n failed: 'AI 작업에 실패했습니다. 다시 시도해 주세요.',\n actions: {\n proofread: '맞춤법 검사',\n polish: '문장 다듬기',\n continue: '자연스럽게 이어쓰기',\n summarize: '짧게 요약하기',\n translateEn: '영어로 번역',\n translateKo: '한국어로 번역',\n translateAll: '10개 언어로 번역해 저장',\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 { isMemiBoardI18nEnabled, isMemiBoardTranslationEnabled, 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 locale = computed<MemiBoardLocale>(() => {\n if (!i18nEnabled.value) return normalizeMemiBoardLocale(config.locale) ?? DEFAULT_MEMI_BOARD_LOCALE\n return normalizeMemiBoardLocale(toValue(options.boardLocale))\n ?? parentLocale?.value\n ?? normalizeMemiBoardLocale(toValue(hostLocale))\n ?? normalizeMemiBoardLocale(config.locale)\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 /** '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","/**\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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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"de-Wci_gqEw.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 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 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 titlePlaceholder: 'Titel',\n contentPlaceholder: 'Text eingeben… / öffnet das Blockmenü.',\n imageContentPlaceholder: 'Text eingeben…',\n tagsPlaceholder: 'Tag eingeben, dann Enter',\n skipModeration: 'Schimpfwortfilter umgehen (Admin)',\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 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 10 Sprachen übersetzen und speichern',\n translateSaved: 'In 10 Sprachen gespeichert. Leser sehen die Übersetzung ihrer Sprache.',\n translatePending: 'Die Übersetzungen für 10 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 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 reviewing: 'Inhalt wird geprüft…',\n saving: 'Wird gespeichert…',\n },\n },\n footer: {\n info: {\n title: 'Board-Info',\n about: 'Über dieses Board',\n history: 'Versionsverlauf',\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 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 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 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 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 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 locale: {\n label: 'Board-Sprache',\n auto: 'Automatisch (Sprache der Website)',\n },\n autoTranslate: {\n action: \"In 10 Sprachen übersetzen\",\n manualHelp: \"Anzeigename und Beschreibung zusammen übersetzen. Danach zum Anwenden speichern.\",\n pending: \"Übersetzungen für 10 Sprachen sind bereit. Zum Anwenden speichern.\",\n manualFailed: \"Übersetzung fehlgeschlagen. Ihr Text bleibt erhalten. Bitte erneut versuchen.\",\n label: 'Beim Speichern in 10 Sprachen übersetzen',\n help: 'Wenn aktiv, werden Name und Beschreibung in 10 Sprachen übersetzt. Wenn aus, wird nicht übersetzt. Unveränderter Text wird nicht erneut übersetzt.',\n failed: 'Die Einstellungen wurden gespeichert, die Übersetzung in 10 Sprachen ist aber fehlgeschlagen. Speichern Sie erneut.',\n ready: 'Name und Beschreibung sind in 10 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 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 10 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 10 Sprachen übersetzen und speichern',\n translateSaved: 'In 10 Sprachen gespeichert. Leser sehen die Übersetzung ihrer Sprache.',\n translatePending: 'Die Übersetzungen für 10 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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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"en-Dhe-tFzi.js","names":[],"sources":["../src/i18n/messages/en/attachments.ts","../src/i18n/messages/en/auth.ts","../src/i18n/messages/en/authorMemo.ts","../src/i18n/messages/en/authorMenu.ts","../src/i18n/messages/en/avatarCropModal.ts","../src/i18n/messages/en/boardSettings.ts","../src/i18n/messages/en/boardUsers.ts","../src/i18n/messages/en/commentFeed.ts","../src/i18n/messages/en/commentForm.ts","../src/i18n/messages/en/commentItem.ts","../src/i18n/messages/en/commentList.ts","../src/i18n/messages/en/commentThread.ts","../src/i18n/messages/en/comments.ts","../src/i18n/messages/en/common.ts","../src/i18n/messages/en/detail.ts","../src/i18n/messages/en/editor.ts","../src/i18n/messages/en/footer.ts","../src/i18n/messages/en/likes.ts","../src/i18n/messages/en/list.ts","../src/i18n/messages/en/listViewSwitch.ts","../src/i18n/messages/en/miniComments.ts","../src/i18n/messages/en/miniList.ts","../src/i18n/messages/en/miniPicker.ts","../src/i18n/messages/en/miniPost.ts","../src/i18n/messages/en/moderation.ts","../src/i18n/messages/en/moderationPrompt.ts","../src/i18n/messages/en/moderationStrike.ts","../src/i18n/messages/en/posts.ts","../src/i18n/messages/en/profile.ts","../src/i18n/messages/en/profileEditModal.ts","../src/i18n/messages/en/reportButton.ts","../src/i18n/messages/en/reportList.ts","../src/i18n/messages/en/reports.ts","../src/i18n/messages/en/sectionUtil.ts","../src/i18n/messages/en/sections.ts","../src/i18n/messages/en/seo.ts","../src/i18n/messages/en/settings.ts","../src/i18n/messages/en/shareButton.ts","../src/i18n/messages/en/signIn.ts","../src/i18n/messages/en/storage.ts","../src/i18n/messages/en/swipeHint.ts","../src/i18n/messages/en/userCommentList.ts","../src/i18n/messages/en/userPostList.ts","../src/i18n/messages/en/users.ts","../src/i18n/messages/en/writingAssistant.ts","../src/i18n/messages/en/index.ts"],"sourcesContent":["export default {\n attach: 'Attach files ({count} / {max})',\n maxFiles: 'You can attach up to {max} files.',\n}\n","export default {\n writeRestricted: 'Posting and commenting are temporarily restricted due to repeated content warnings.',\n writeRestrictedUntil: 'Posting and commenting are temporarily restricted due to repeated content warnings. ({until})',\n strikeSuffix: ' (Warning {count}/{threshold})',\n strikeRestrictedUntil: ' You have reached {count} warnings, so posting and commenting are restricted ({until}).',\n strikeRestricted: ' You have reached {count} warnings, so posting and commenting are restricted.',\n notInitialized: '[memi-board] Firebase Auth is not initialized.',\n}\n","export default {\n tooLong: 'Memos can be up to {max} characters.',\n}\n","export default {\n viewProfile: 'View profile',\n viewPosts: 'View posts',\n viewComments: 'View comments',\n memoAriaLabel: 'Note about this author',\n memoTitle: 'Private note',\n memoPlaceholder: 'Jot something down about this author…',\n bad: 'Bad',\n good: 'Good',\n}\n","export default {\n title: 'Crop profile photo',\n description: 'Shown as a square (1:1). Adjust the area to fit.',\n hint: 'Drag to move and zoom · Saved as a {size}×{size} square JPEG',\n confirm: 'Crop and upload',\n}\n","export default {\n signInRequired: 'Please sign in.',\n idAndNameRequired: 'Please enter a board ID and name.',\n deleteIdRequired: 'A board ID is required to delete.',\n nameRequired: 'Please enter a board name.',\n}\n","export default {\n unsupportedRole: 'Unsupported role.',\n roleDescription: {\n owner: 'Manages administrators and the entire service.',\n manager: 'Manages settings and staff assignments for assigned boards.',\n admin: 'Manages user roles, board settings, and all content.',\n staff: 'Manages posts and comments in assigned boards, but cannot change settings or assignments.',\n user: 'Can write posts and comments, and edit or delete only their own content.',\n },\n}\n","export default {\n empty: 'No comments yet.',\n emptyLiked: 'No liked comments yet.',\n loadFailed: 'Couldn’t load the list: {error}',\n blinded: 'This comment was hidden by an admin.',\n}\n","export default {\n hiddenBoardDenied: 'Only assigned staff can comment on hidden boards.',\n denied: 'You don’t have permission to comment on this board.',\n signInRequired: 'Please sign in.',\n writeRestricted: 'Posting is temporarily restricted due to repeated content warnings.',\n moderationBlocked: 'This contains content that can’t be posted.',\n replyTo: 'Reply to {name}',\n placeholder: 'Write a comment',\n submitReply: 'Reply',\n submit: 'Comment',\n signInToComment: 'Sign in to leave a comment.',\n attachHint: 'Drop an image here or click to choose one.',\n attachNote: 'jpg, png, gif, webp. Large images are resized to 5MB or less.',\n removeImage: 'Remove attached image',\n imageOnly: 'Only jpg, png, gif, and webp images can be attached.',\n uploadFailed: 'Couldn’t upload the image.',\n uploading: 'Uploading image…',\n}\n","export default {\n editRestricted: 'Editing comments is temporarily restricted.',\n moderationBlocked: 'This contains content that can’t be posted.',\n editFailed: 'Couldn’t update the comment.',\n blindConfirm: 'Hiding this comment shows a notice to everyone instead of its text. The original isn’t deleted and you can unhide it later.\\n\\nHide this comment?',\n unblindConfirm: 'Unhiding shows the original comment to everyone again.\\n\\nUnhide this comment?',\n blindFailed: 'Couldn’t change the hidden state.',\n likeFailed: 'Couldn’t process the like.',\n blinded: 'This comment was hidden by an admin.',\n attachedImage: 'Image attached to the comment',\n edit: 'Edit comment',\n blind: 'Hide comment',\n unblind: 'Unhide comment',\n delete: 'Delete comment',\n}\n","export default {\n loading: 'Loading comments',\n empty: 'No comments yet.',\n loadMore: 'More comments',\n loadingMore: 'Loading more comments',\n}\n","export default {\n deleteConfirm: 'Delete this comment?',\n deleteFailed: 'Couldn’t delete the comment.',\n hideReplies: 'Hide replies',\n showReplies: '{count} replies',\n loadMoreReplies: 'More replies',\n}\n","export default {\n bodyRequired: 'Please enter a comment.',\n bodyTooLong: 'Comments can be up to {max} characters.',\n replyTargetNotFound: 'The comment you are replying to could not be found.',\n threadNotFound: 'The comment thread could not be found.',\n hasRepliesCannotDelete: 'Comments with replies cannot be deleted right now.',\n}\n","export default {\n action: {\n cancel: 'Cancel',\n save: 'Save',\n saved: 'Saved',\n edit: 'Edit',\n delete: 'Delete',\n confirm: 'OK',\n close: 'Close',\n add: 'Add',\n more: 'More',\n prev: 'Previous',\n next: 'Next',\n retry: 'Retry',\n reply: 'Reply',\n like: 'Like',\n unlike: 'Unlike',\n share: 'Share',\n report: 'Report',\n signIn: 'Sign in',\n signOut: 'Sign out',\n write: 'Write',\n toTop: 'Top',\n },\n label: {\n anonymous: 'Anonymous',\n user: 'User',\n image: 'Image',\n draft: 'Draft',\n loading: 'Loading…',\n },\n role: {\n owner: 'Owner',\n manager: 'Manager',\n admin: 'Admin',\n staff: 'Staff',\n user: 'User',\n },\n date: {\n justNow: 'Just now',\n fewSecondsAgo: 'A few seconds ago',\n checking: 'Checking time',\n createdAt: 'Created: {time}',\n updatedAt: 'Updated: {time}',\n },\n}\n","export default {\n deleteConfirm: 'Delete this post? This can’t be undone.',\n notFound: 'Post not found.',\n draftPreview: 'Unpublished preview',\n draftNotice: 'This post isn’t published yet. Only you can see it until you publish.',\n publish: 'Publish',\n notice: 'Notice',\n pin: 'Make notice',\n unpin: 'Remove notice',\n backToList: 'Back to list',\n postNav: 'Post navigation',\n list: 'List',\n comments: 'Comments',\n}\n","export default {\n titlePlaceholder: 'Title',\n contentPlaceholder: 'Write something… Type / to open the block menu.',\n imageContentPlaceholder: 'Write something…',\n tagsPlaceholder: 'Type a tag and press Enter',\n skipModeration: 'Skip profanity filter (admin)',\n pinNotice: 'Pin as notice',\n submitEdit: 'Save changes',\n submitNext: 'Next: Preview',\n apply: 'Apply',\n imageOptimizing: 'Optimizing and uploading image…',\n cover: {\n hint: 'Photos {count}/{max} · Pick a cover · Drag to reorder · Drop or paste files to add',\n imageLink: 'Image link',\n addPhoto: 'Add photos',\n alt: 'Photo {n}',\n representative: 'Cover',\n setRepresentative: 'Set cover',\n setRepresentativeAria: 'Set photo {n} as cover',\n remove: 'Remove photo',\n add: 'Add',\n uploading: 'Uploading…',\n dropOrClick: 'Drop photos or click to add',\n emptyHint: 'Select multiple · Pick a cover after upload · Drag to reorder',\n uploadTitle: 'Upload',\n },\n uploadFailed: 'Upload failed',\n aiAssistant: 'AI writing assistant',\n insertBlock: 'Insert block',\n blockMenu: 'Block menu',\n imageDialog: {\n title: 'Add image',\n chooseFile: 'Choose image from device',\n orLink: 'or image link',\n urlLabel: 'Image URL',\n urlHelp: 'Only HTTPS URLs are allowed. If the image is removed from the source site, it won’t display here either.',\n previewAlt: 'External image preview',\n addLink: 'Add link',\n },\n customDialog: {\n title: 'Rewrite in a custom style',\n label: 'How should it be rewritten?',\n help: 'e.g. in a casual tone / in formal written style / as concise bullet points',\n placeholder: 'In a casual tone',\n },\n aiPreview: {\n title: 'Review AI result',\n currentTitle: 'Current title',\n newTitle: 'New title',\n currentContent: 'Current content',\n appendedContent: 'Content to add',\n before: 'Before',\n after: 'After',\n },\n menu: {\n ai: 'AI',\n aiContinue: 'Continue with AI',\n style: 'Style',\n insert: 'Insert',\n paragraph: 'Paragraph',\n heading1: 'Heading 1',\n heading2: 'Heading 2',\n heading3: 'Heading 3',\n bulletList: 'Bulleted list',\n orderedList: 'Numbered list',\n blockquote: 'Quote',\n codeBlock: 'Code block',\n horizontalRule: 'Divider',\n image: 'Image',\n turnInto: 'Turn into',\n resetFormatting: 'Reset formatting',\n duplicate: 'Duplicate',\n moveUp: 'Move up',\n moveDown: 'Move down',\n delete: 'Delete',\n },\n toolbar: {\n link: 'Link',\n image: 'Image',\n format: 'Format',\n bold: 'Bold',\n italic: 'Italic',\n underline: 'Underline',\n strike: 'Strikethrough',\n title: 'Title',\n heading: 'Heading',\n subheading: 'Subheading',\n body: 'Body',\n mono: 'Monospace',\n bulletList: 'Bulleted list',\n orderedList: 'Numbered list',\n blockquote: 'Block quote',\n codeBlock: 'Code block',\n horizontalRule: 'Divider',\n clearFormatting: 'Clear formatting',\n undo: 'Undo',\n redo: 'Redo',\n },\n ai: {\n proofread: 'Check spelling',\n polish: 'Polish writing',\n continue: 'Continue writing',\n summarize: 'Summarize briefly',\n translateEn: 'Translate to English',\n translateKo: 'Translate to Korean',\n translateAll: 'Translate and save in 10 languages',\n translateSaved: 'Saved in 10 languages. Readers see the translation for their language.',\n translatePending: 'Translations for 10 languages are ready. They are stored when you save the post.',\n translateEmpty: 'Enter a title or body to translate first.',\n title: 'Generate title from body',\n custom: 'Rewrite in a custom style…',\n failed: 'The AI task failed. Please try again.',\n },\n youtubePrompt: 'Enter a YouTube link.',\n errors: {\n coverMax: 'You can upload up to {max} photos.',\n imageUrlRequired: 'Enter an image URL.',\n imageUrlInvalid: 'Enter a valid image URL.',\n imageUrlHttps: 'Only HTTPS image URLs are allowed.',\n imageUrlCredentials: 'URLs containing login credentials aren’t allowed.',\n imageTimeout: 'The image is taking too long to load.',\n imageNotDisplayable: 'This image can’t be displayed.',\n imageLoadFailed: 'Couldn’t load the image. Check the URL or whether the site allows external linking.',\n editorNotReady: 'The editor isn’t ready. Please try again.',\n imageLinkFailed: 'Couldn’t add the image link.',\n imageOnly: 'Only image files can be uploaded.',\n imageTooLarge: 'Original images must be {mb}MB or smaller.',\n imageUploadFailed: 'Image upload failed.',\n pasteAsFile: 'Paste or drag photos as files into the area above.',\n postNotFound: 'Post not found.',\n loadPermission: 'You don’t have permission to load this post. Check that you’re signed in.',\n loadFailed: 'Couldn’t load the post: {message}',\n editPermission: 'You don’t have permission to edit. Make sure it’s your post and you’re still signed in.',\n titleRequired: 'Enter a title.',\n photoRequired: 'Upload at least one photo.',\n bodyRequired: 'Write some text or attach an image.',\n signInRequired: 'Sign-in required.',\n boardMissing: 'No board was specified.',\n writeRestricted: 'Posting and commenting are temporarily restricted due to repeated content warnings.',\n moderationBlocked: 'This contains content that can’t be posted.',\n },\n hint: {\n translating: 'Translating the post into 10 languages…',\n reviewing: 'Reviewing content…',\n saving: 'Saving…',\n },\n}\n","export default {\n introduction: 'A board built on Nuxt 4, Vue 3 and TypeScript, using Nuxt UI and Firebase to keep posts and comments flowing smoothly.',\n info: {\n title: 'Board info',\n about: 'About this board',\n history: 'Version history',\n },\n stack: {\n ui: 'Interface & experience',\n data: 'Data & sign-in',\n writing: 'Writing & convenience',\n },\n}\n","export default {\n signInRequired: 'Please sign in.',\n commentNotFound: 'Comment not found.',\n}\n","export default {\n introduction: 'This board is built on Nuxt 4, Vue 3 and TypeScript. Nuxt UI and Tailwind CSS shape a comfortable interface, while Firebase Firestore, Auth, Storage and nuxt-vuefire keep posts and comments flowing smoothly.',\n settings: 'Settings',\n loadFailed: 'Couldn’t load the list: {error}',\n empty: 'No posts yet.',\n notice: 'Notice',\n photo: 'Photo',\n likeCount: 'Likes {count}',\n info: {\n title: 'Board info',\n about: 'About this board',\n history: 'Version history',\n },\n stack: {\n framework: 'Framework & language',\n ui: 'UI & styling',\n backend: 'Backend & data',\n },\n tech: {\n nuxt: 'Vue-based SSR framework',\n vue: 'Composition API · script setup',\n typescript: 'Type-safe data and components',\n nuxtUi: 'Board, form and modal UI',\n tailwind: 'Responsive · light/dark styles',\n lucide: 'Lightweight, consistent icons',\n dayjs: 'Readable dates and relative times',\n firestore: 'Real-time DB for posts and comments',\n auth: 'Secure sign-in and permissions',\n storage: 'Image and attachment storage',\n vuefire: 'Real-time Nuxt–Firebase binding',\n },\n}\n","export default {\n default: 'Default',\n dense: 'Compact',\n video: 'Video',\n}\n","export default {\n empty: 'No comments yet.',\n blinded: 'This comment was hidden by an admin.',\n}\n","export default {\n empty: 'No posts yet.',\n}\n","export default {\n selectedCount: 'Selected {count} / {max}',\n layoutHint: '2+ show as a carousel, 4 as a grid',\n searchPlaceholder: 'Search titles',\n loading: 'Loading posts…',\n noMore: 'No more posts to pick.',\n}\n","export default {\n empty: 'No posts selected.',\n}\n","export default {\n reviewFailed: 'We could not review your content, so it cannot be posted. Please try again shortly.',\n writeRestricted: 'Posting and commenting are temporarily restricted due to repeated content warnings.',\n}\n","export default {\n localHit: 'Expressions like “{hit}” aren’t allowed. Please rephrase.',\n localGeneric: 'This contains profanity, so it can’t be posted. Please rephrase.',\n categoryBlocked: 'This contains {category}, so it can’t be posted. Please edit it.',\n genericBlocked: 'This contains content that can’t be posted. Please edit it.',\n categories: {\n abuse: 'profanity or insults',\n spam: 'spam or advertising',\n adult: 'sexual or adult content',\n violence: 'violence or threats',\n other: 'inappropriate content',\n },\n}\n","export default {\n liftSoon: 'lifts soon',\n liftInHours: 'lifts in about {hours}h',\n liftInDays: 'lifts in about {days}d',\n liftInDaysHours: 'lifts in about {days}d {hours}h',\n}\n","export default {\n boardIdRequired: '[memi-board] boardId is required.',\n photoRequired: 'Please add a photo.',\n bodyRequired: 'Please enter some text or attach an image.',\n titleRequired: 'Please enter a title.',\n}\n","export default {\n notFound: 'User not found.',\n noName: 'No name',\n joined: 'Joined {time}',\n lastVisit: 'Last seen {time}',\n}\n","export default {\n imageOnly: 'Only image files can be selected.',\n nameRequired: 'Please enter a name.',\n saveFailed: 'Couldn’t save the profile.',\n title: 'Edit profile',\n changePhoto: 'Change photo',\n name: 'Name',\n bio: 'Bio',\n bioPlaceholder: 'Tell people about yourself',\n}\n","export default {\n failed: 'Couldn’t submit the report.',\n reported: 'Reported',\n title: 'Report post',\n done: 'Report received. Staff will review it.',\n reason: 'Reason',\n detailPlaceholder: 'Details (optional)',\n submit: 'Report',\n}\n","export default {\n staffOnly: 'Only staff can view reports.',\n loadFailed: 'Couldn’t load the list: {error}',\n empty: 'No pending reports.',\n untitled: 'Untitled post',\n author: 'by {name}',\n dismiss: 'Dismiss',\n confirm: 'Resolve',\n}\n","export default {\n reason: {\n spam: 'Spam / advertising',\n abuse: 'Abuse / hate / harassment',\n adult: 'Sexual content',\n illegal: 'Illegal content',\n other: 'Other',\n },\n fallbackLabel: 'Report',\n signInRequired: 'Please sign in.',\n cannotReportOwn: 'You cannot report your own post.',\n reasonRequired: 'Please select a reason.',\n detailTooLong: 'Details can be up to {max} characters.',\n}\n","export default {\n kind: {\n list: 'Post list',\n post: 'Posts',\n comments: 'Comments',\n },\n sort: {\n latest: 'Latest',\n likes: 'Most liked',\n },\n untitledPost: 'Post',\n view: {\n media: 'Media',\n list: 'List',\n },\n}\n","export default {\n defaultTitle: 'Section {n}',\n}\n","export default {\n allCategory: 'All',\n boardDescription: '{name} board',\n allDescription: 'Board — announcements and community news.',\n postFallbackTitle: 'Post | {site}',\n postFallbackDescription: 'Board',\n photo: 'Photo',\n postDescriptionFallback: 'Board post',\n listTitle: '{name} | {site}',\n listTitleAll: 'Board | {site}',\n listDescription: '{name} — catch up on the latest posts.',\n listDescriptionAll: 'Board — announcements and stories.',\n}\n","export default {\n managers: 'Assigned managers',\n loading: 'Loading settings…',\n noAccess: 'You don’t have access',\n notFound: {\n title: 'Board not found',\n checkAddress: 'Please check the address.',\n checkBoardAddress: 'Please check the board address.',\n },\n newBoard: {\n title: 'This board doesn’t exist yet',\n description: 'Fill in the details below and save to create it with this ID.',\n },\n noLabel: 'No label',\n option: {\n default: 'Standard',\n },\n id: {\n label: 'Category ID',\n help: 'Used in the URL and data',\n },\n writeRole: {\n label: 'Who can post',\n help: 'Minimum role required to post in this category',\n helpShort: 'Minimum role required to post',\n options: {\n user: 'Users and up',\n staff: 'Staff and up',\n admin: 'Admins only',\n },\n },\n commentWriteRole: {\n label: 'Who can comment',\n help: 'Minimum role required to comment in this category',\n helpShort: 'Minimum role required to comment',\n hiddenHelp: 'Comments on hidden boards don’t appear in the public feed, and only assigned staff can write them',\n hiddenFixed: 'Assigned staff only (fixed for hidden boards)',\n },\n staff: {\n label: 'Assigned staff',\n help: 'Only the selected staff can configure and manage this board. Leave empty for admins only',\n placeholder: 'Admins only (no staff assigned)',\n },\n label: {\n label: 'Display name',\n help: 'The name users see',\n },\n description: {\n label: 'Description',\n help: 'Shown at the top of the board and elsewhere',\n placeholder: 'A short description of this board (optional)',\n },\n visibility: {\n pending: 'Visibility change is incomplete. Save the same setting again to resume.',\n label: 'Visibility',\n help: 'Hidden boards don’t appear in the all-boards filter, and posts can only be read by admins, assigned staff, and their authors. Only assigned staff can comment',\n options: {\n public: { label: 'Visible', description: 'Shown in the full list and filters' },\n hidden: { label: 'Hidden', description: 'Journal or private. Only assigned staff can comment' },\n },\n },\n listView: {\n label: 'List view',\n help: 'How the post list is displayed',\n options: {\n dense: 'Compact',\n video: 'Video',\n },\n },\n editorType: {\n label: 'Post form',\n help: 'How posts are written',\n options: {\n default: 'Write a title and body',\n image: 'Add multiple photos and a cover photo',\n },\n },\n locale: {\n label: 'Board language',\n help: 'Leave empty to follow the site language. If set, this board always appears in that language.',\n auto: 'Auto (follow site language)',\n },\n autoTranslatePosts: {\n label: 'Automatically translate new posts',\n help: 'When on, new post titles, summaries, and content are translated into 10 languages and saved together. Off by default.',\n },\n autoTranslate: {\n action: \"Translate into 10 languages\",\n manualHelp: \"Translate the display label and description together, then click Save to apply.\",\n pending: \"Translations for 10 languages are ready. Click Save to apply.\",\n manualFailed: \"Translation failed. Your text is unchanged. Please try again.\",\n label: 'Translate into 10 languages when saving',\n help: 'When on, the name and description are translated into 10 languages. When off, they are not translated. Unchanged text is not translated again.',\n failed: 'Settings were saved, but translating into 10 languages failed. Save again to retry.',\n ready: 'The name and description are saved in 10 languages.',\n },\n action: {\n moveDown: 'Down',\n goToBoard: 'Go to board',\n deleteBoard: 'Delete board',\n create: 'Create',\n },\n newCategoryPlaceholder: 'New category name',\n deleteConfirm: 'Delete the “{label}” board?\\n\\nAll posts, comments, replies, inline images, comment images, and attachments on this board will be permanently deleted. This can’t be undone.',\n savedCategory: 'Saved the “{label}” category.',\n savedSettings: 'Board settings saved.',\n created: 'Board created.',\n error: {\n orderFailed: 'Couldn’t save the category order.',\n deleteFailed: 'Couldn’t delete the board and its data.',\n saveFailed: 'Couldn’t save the board settings.',\n deleteAllFailed: 'Couldn’t delete the board data.',\n },\n cleanup: {\n contextChanged: 'Your account or board configuration changed after scanning. Scan again before deleting.',\n title: 'Orphan files and documents',\n description: 'Scan all boards for files and comments without a post, images without a comment, and likes without a target. Files updated within 24 hours, referenced files, and report history are retained.',\n scan: 'Scan orphan items',\n empty: 'No orphan items found.',\n selectAll: 'Select all ({count})',\n delete: 'Delete selected ({count})',\n confirm: 'Permanently delete {count} selected orphan items? This cannot be undone.',\n failed: 'Cleanup failed. Check the admin Firestore and Storage rules.',\n result: '{deleted} deleted, {skipped} retained after connections were restored, {failed} failed. Failed items can be retried.',\n kinds: { file: 'File', comment: 'Comment document', like: 'Like document' },\n },\n danger: {\n title: 'Danger zone',\n description: 'Permanently deletes all posts, comments, comment images, attachments, and category settings. Board users and admin roles are kept.',\n confirmLabel: 'Type “{phrase}” to confirm',\n phrase: 'delete board data',\n button: 'Delete all data',\n done: 'All board data has been deleted.',\n },\n}\n","export default {\n copied: 'Link copied',\n}\n","export default {\n withGoogle: 'Sign in with Google',\n withApple: 'Sign in with Apple',\n or: 'or',\n name: 'Name',\n email: 'Email',\n password: 'Password',\n signUp: 'Sign up',\n toSignUp: 'Don’t have an account? Sign up',\n toSignIn: 'Already have an account? Sign in',\n}\n","export default {\n tooLargeAfterCompress: 'The image is still larger than 5MB after compression. Please choose a smaller image.',\n sourceTooLarge: 'The original image must be {max}MB or smaller.',\n heicUnsupported: 'HEIC photos cannot be uploaded directly. Pick it from the Photos app or convert it to JPG, PNG, or WebP.',\n cannotOptimize: 'This image format cannot be optimized in the browser. Please convert it to JPG, PNG, or WebP.',\n imageOnly: 'Only image files can be uploaded.',\n canvasUnavailable: 'Canvas is not available',\n compressFailed: 'Compression failed',\n loadFailed: 'Failed to load image',\n}\n","export default {\n title: 'Try swiping left or right',\n description: 'Swipe left for the next post, right for the previous one.',\n}\n","export default {\n loadFailed: 'Couldn’t load the list: {error}',\n empty: 'No comments yet.',\n blinded: 'This comment was hidden by an admin.',\n likes: '{count} likes',\n}\n","export default {\n loadFailed: 'Couldn’t load the list: {error}',\n empty: 'No posts yet.',\n}\n","export default {\n changeRoleFailed: 'Couldn’t change the role.',\n loading: 'Loading users…',\n noPermission: {\n title: 'No permission',\n description: 'Only board admins can manage user roles.',\n },\n empty: 'No users have signed in to the board yet.',\n noName: 'No name',\n moderationWarnings: '{count} content warnings',\n}\n","export default {\n loginRequired: 'Sign in to use the AI writing assistant.',\n userMissing: 'Couldn’t verify your user info. Please try again.',\n dailyLimit: 'The AI writing assistant can be used up to {limit} times a day. Please try again in about {hours} hour(s).',\n contentRequired: 'Enter some content for the AI to work on first.',\n customRequired: 'Enter an instruction for how to rewrite it.',\n emptyResult: 'The AI couldn’t produce a result. Please try again.',\n translateEmpty: 'Enter a title or body to translate first.',\n translateTooLong: 'Posts longer than {limit} characters can’t be saved in 10 languages. Shorten it and try again.',\n translateIncomplete: 'Some languages came back empty. Please try again.',\n failed: 'The AI task failed. Please try again.',\n actions: {\n proofread: 'Check spelling',\n polish: 'Polish sentences',\n continue: 'Continue writing',\n summarize: 'Summarize',\n translateEn: 'Translate to English',\n translateKo: 'Translate to Korean',\n translateAll: 'Translate and save in 10 languages',\n title: 'Generate title from body',\n custom: 'Rewrite in a custom style…',\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"],"mappings":";;A6C+CA,IAAA,IAAe;CACb,aAAA;E7C/CA,QAAQ;EACR,UAAU;C6C8CV;CACA,MAAA;E5ChDA,iBAAiB;EACjB,sBAAsB;EACtB,cAAc;EACd,uBAAuB;EACvB,kBAAkB;EAClB,gBAAgB;C4C2ChB;CACA,YAAA,E3CjDA,SAAS,uC2CiDT;CACA,YAAA;E1ClDA,aAAa;EACb,WAAW;EACX,cAAc;EACd,eAAe;EACf,WAAW;EACX,iBAAiB;EACjB,KAAK;EACL,MAAM;C0C2CN;CACA,iBAAA;EzCnDA,OAAO;EACP,aAAa;EACb,MAAM;EACN,SAAS;CyCgDT;CACA,eAAA;ExCpDA,gBAAgB;EAChB,mBAAmB;EACnB,kBAAkB;EAClB,cAAc;CwCiDd;CACA,YAAA;EvCrDA,iBAAiB;EACjB,iBAAiB;GACf,OAAO;GACP,SAAS;GACT,OAAO;GACP,OAAO;GACP,MAAM;EACR;CuC8CA;CACA,aAAA;EtCtDA,OAAO;EACP,YAAY;EACZ,YAAY;EACZ,SAAS;CsCmDT;CACA,aAAA;ErCvDA,mBAAmB;EACnB,QAAQ;EACR,gBAAgB;EAChB,iBAAiB;EACjB,mBAAmB;EACnB,SAAS;EACT,aAAa;EACb,aAAa;EACb,QAAQ;EACR,iBAAiB;EACjB,YAAY;EACZ,YAAY;EACZ,aAAa;EACb,WAAW;EACX,cAAc;EACd,WAAW;CqCwCX;CACA,aAAA;EpCxDA,gBAAgB;EAChB,mBAAmB;EACnB,YAAY;EACZ,cAAc;EACd,gBAAgB;EAChB,aAAa;EACb,YAAY;EACZ,SAAS;EACT,eAAe;EACf,MAAM;EACN,OAAO;EACP,SAAS;EACT,QAAQ;CoC4CR;CACA,aAAA;EnCzDA,SAAS;EACT,OAAO;EACP,UAAU;EACV,aAAa;CmCsDb;CACA,eAAA;ElC1DA,eAAe;EACf,cAAc;EACd,aAAa;EACb,aAAa;EACb,iBAAiB;CkCsDjB;CACA,UAAA;EjC3DA,cAAc;EACd,aAAa;EACb,qBAAqB;EACrB,gBAAgB;EAChB,wBAAwB;CiCuDxB;CACA,QAAA;EhC5DA,QAAQ;GACN,QAAQ;GACR,MAAM;GACN,OAAO;GACP,MAAM;GACN,QAAQ;GACR,SAAS;GACT,OAAO;GACP,KAAK;GACL,MAAM;GACN,MAAM;GACN,MAAM;GACN,OAAO;GACP,OAAO;GACP,MAAM;GACN,QAAQ;GACR,OAAO;GACP,QAAQ;GACR,QAAQ;GACR,SAAS;GACT,OAAO;GACP,OAAO;EACT;EACA,OAAO;GACL,WAAW;GACX,MAAM;GACN,OAAO;GACP,OAAO;GACP,SAAS;EACX;EACA,MAAM;GACJ,OAAO;GACP,SAAS;GACT,OAAO;GACP,OAAO;GACP,MAAM;EACR;EACA,MAAM;GACJ,SAAS;GACT,eAAe;GACf,UAAU;GACV,WAAW;GACX,WAAW;EACb;CgCiBA;CACA,QAAA;E/B7DA,eAAe;EACf,UAAU;EACV,cAAc;EACd,aAAa;EACb,SAAS;EACT,QAAQ;EACR,KAAK;EACL,OAAO;EACP,YAAY;EACZ,SAAS;EACT,MAAM;EACN,UAAU;C+BkDV;CACA,QAAA;E9B9DA,kBAAkB;EAClB,oBAAoB;EACpB,yBAAyB;EACzB,iBAAiB;EACjB,gBAAgB;EAChB,WAAW;EACX,YAAY;EACZ,YAAY;EACZ,OAAO;EACP,iBAAiB;EACjB,OAAO;GACL,MAAM;GACN,WAAW;GACX,UAAU;GACV,KAAK;GACL,gBAAgB;GAChB,mBAAmB;GACnB,uBAAuB;GACvB,QAAQ;GACR,KAAK;GACL,WAAW;GACX,aAAa;GACb,WAAW;GACX,aAAa;EACf;EACA,cAAc;EACd,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;GACX,OAAO;GACP,YAAY;GACZ,QAAQ;GACR,UAAU;GACV,SAAS;GACT,YAAY;GACZ,SAAS;EACX;EACA,cAAc;GACZ,OAAO;GACP,OAAO;GACP,MAAM;GACN,aAAa;EACf;EACA,WAAW;GACT,OAAO;GACP,cAAc;GACd,UAAU;GACV,gBAAgB;GAChB,iBAAiB;GACjB,QAAQ;GACR,OAAO;EACT;EACA,MAAM;GACJ,IAAI;GACJ,YAAY;GACZ,OAAO;GACP,QAAQ;GACR,WAAW;GACX,UAAU;GACV,UAAU;GACV,UAAU;GACV,YAAY;GACZ,aAAa;GACb,YAAY;GACZ,WAAW;GACX,gBAAgB;GAChB,OAAO;GACP,UAAU;GACV,iBAAiB;GACjB,WAAW;GACX,QAAQ;GACR,UAAU;GACV,QAAQ;EACV;EACA,SAAS;GACP,MAAM;GACN,OAAO;GACP,QAAQ;GACR,MAAM;GACN,QAAQ;GACR,WAAW;GACX,QAAQ;GACR,OAAO;GACP,SAAS;GACT,YAAY;GACZ,MAAM;GACN,MAAM;GACN,YAAY;GACZ,aAAa;GACb,YAAY;GACZ,WAAW;GACX,gBAAgB;GAChB,iBAAiB;GACjB,MAAM;GACN,MAAM;EACR;EACA,IAAI;GACF,WAAW;GACX,QAAQ;GACR,UAAU;GACV,WAAW;GACX,aAAa;GACb,aAAa;GACb,cAAc;GACd,gBAAgB;GAChB,kBAAkB;GAClB,gBAAgB;GAChB,OAAO;GACP,QAAQ;GACR,QAAQ;EACV;EACA,eAAe;EACf,QAAQ;GACN,UAAU;GACV,kBAAkB;GAClB,iBAAiB;GACjB,eAAe;GACf,qBAAqB;GACrB,cAAc;GACd,qBAAqB;GACrB,iBAAiB;GACjB,gBAAgB;GAChB,iBAAiB;GACjB,WAAW;GACX,eAAe;GACf,mBAAmB;GACnB,aAAa;GACb,cAAc;GACd,gBAAgB;GAChB,YAAY;GACZ,gBAAgB;GAChB,eAAe;GACf,eAAe;GACf,cAAc;GACd,gBAAgB;GAChB,cAAc;GACd,iBAAiB;GACjB,mBAAmB;EACrB;EACA,MAAM;GACJ,aAAa;GACb,WAAW;GACX,QAAQ;EACV;C8BlFA;CACA,QAAA;E7B/DA,cAAc;EACd,MAAM;GACJ,OAAO;GACP,OAAO;GACP,SAAS;EACX;EACA,OAAO;GACL,IAAI;GACJ,MAAM;GACN,SAAS;EACX;C6BqDA;CACA,OAAA;E5BhEA,gBAAgB;EAChB,iBAAiB;C4B+DjB;CACA,MAAA;E3BjEA,cAAc;EACd,UAAU;EACV,YAAY;EACZ,OAAO;EACP,QAAQ;EACR,OAAO;EACP,WAAW;EACX,MAAM;GACJ,OAAO;GACP,OAAO;GACP,SAAS;EACX;EACA,OAAO;GACL,WAAW;GACX,IAAI;GACJ,SAAS;EACX;EACA,MAAM;GACJ,MAAM;GACN,KAAK;GACL,YAAY;GACZ,QAAQ;GACR,UAAU;GACV,QAAQ;GACR,OAAO;GACP,WAAW;GACX,MAAM;GACN,SAAS;GACT,SAAS;EACX;C2BoCA;CACA,gBAAA;E1BlEA,SAAS;EACT,OAAO;EACP,OAAO;C0BgEP;CACA,cAAA;EzBnEA,OAAO;EACP,SAAS;CyBkET;CACA,UAAA,ExBpEA,OAAO,gBwBoEP;CACA,YAAA;EvBrEA,eAAe;EACf,YAAY;EACZ,mBAAmB;EACnB,SAAS;EACT,QAAQ;CuBiER;CACA,UAAA,EtBtEA,OAAO,qBsBsEP;CACA,YAAA;ErBvEA,cAAc;EACd,iBAAiB;CqBsEjB;CACA,kBAAA;EpBxEA,UAAU;EACV,cAAc;EACd,iBAAiB;EACjB,gBAAgB;EAChB,YAAY;GACV,OAAO;GACP,MAAM;GACN,OAAO;GACP,UAAU;GACV,OAAO;EACT;CoB8DA;CACA,kBAAA;EnBzEA,UAAU;EACV,aAAa;EACb,YAAY;EACZ,iBAAiB;CmBsEjB;CACA,OAAA;ElB1EA,iBAAiB;EACjB,eAAe;EACf,cAAc;EACd,eAAe;CkBuEf;CACA,SAAA;EjB3EA,UAAU;EACV,QAAQ;EACR,QAAQ;EACR,WAAW;CiBwEX;CACA,kBAAA;EhB5EA,WAAW;EACX,cAAc;EACd,YAAY;EACZ,OAAO;EACP,aAAa;EACb,MAAM;EACN,KAAK;EACL,gBAAgB;CgBqEhB;CACA,cAAA;Ef7EA,QAAQ;EACR,UAAU;EACV,OAAO;EACP,MAAM;EACN,QAAQ;EACR,mBAAmB;EACnB,QAAQ;CeuER;CACA,YAAA;Ed9EA,WAAW;EACX,YAAY;EACZ,OAAO;EACP,UAAU;EACV,QAAQ;EACR,SAAS;EACT,SAAS;CcwET;CACA,SAAA;Eb/EA,QAAQ;GACN,MAAM;GACN,OAAO;GACP,OAAO;GACP,SAAS;GACT,OAAO;EACT;EACA,eAAe;EACf,gBAAgB;EAChB,iBAAiB;EACjB,gBAAgB;EAChB,eAAe;CaoEf;CACA,aAAA;EZhFA,MAAM;GACJ,MAAM;GACN,MAAM;GACN,UAAU;EACZ;EACA,MAAM;GACJ,QAAQ;GACR,OAAO;EACT;EACA,cAAc;EACd,MAAM;GACJ,OAAO;GACP,MAAM;EACR;CYmEA;CACA,UAAA,EXjFA,cAAc,cWiFd;CACA,KAAA;EVlFA,aAAa;EACb,kBAAkB;EAClB,gBAAgB;EAChB,mBAAmB;EACnB,yBAAyB;EACzB,OAAO;EACP,yBAAyB;EACzB,WAAW;EACX,cAAc;EACd,iBAAiB;EACjB,oBAAoB;CUwEpB;CACA,UAAA;ETnFA,UAAU;EACV,SAAS;EACT,UAAU;EACV,UAAU;GACR,OAAO;GACP,cAAc;GACd,mBAAmB;EACrB;EACA,UAAU;GACR,OAAO;GACP,aAAa;EACf;EACA,SAAS;EACT,QAAQ,EACN,SAAS,WACX;EACA,IAAI;GACF,OAAO;GACP,MAAM;EACR;EACA,WAAW;GACT,OAAO;GACP,MAAM;GACN,WAAW;GACX,SAAS;IACP,MAAM;IACN,OAAO;IACP,OAAO;GACT;EACF;EACA,kBAAkB;GAChB,OAAO;GACP,MAAM;GACN,WAAW;GACX,YAAY;GACZ,aAAa;EACf;EACA,OAAO;GACL,OAAO;GACP,MAAM;GACN,aAAa;EACf;EACA,OAAO;GACL,OAAO;GACP,MAAM;EACR;EACA,aAAa;GACX,OAAO;GACP,MAAM;GACN,aAAa;EACf;EACA,YAAY;GACV,SAAS;GACT,OAAO;GACP,MAAM;GACN,SAAS;IACP,QAAQ;KAAE,OAAO;KAAW,aAAa;IAAqC;IAC9E,QAAQ;KAAE,OAAO;KAAU,aAAa;IAAsD;GAChG;EACF;EACA,UAAU;GACR,OAAO;GACP,MAAM;GACN,SAAS;IACP,OAAO;IACP,OAAO;GACT;EACF;EACA,YAAY;GACV,OAAO;GACP,MAAM;GACN,SAAS;IACP,SAAS;IACT,OAAO;GACT;EACF;EACA,QAAQ;GACN,OAAO;GACP,MAAM;GACN,MAAM;EACR;EACA,oBAAoB;GAClB,OAAO;GACP,MAAM;EACR;EACA,eAAe;GACb,QAAQ;GACR,YAAY;GACZ,SAAS;GACT,cAAc;GACd,OAAO;GACP,MAAM;GACN,QAAQ;GACR,OAAO;EACT;EACA,QAAQ;GACN,UAAU;GACV,WAAW;GACX,aAAa;GACb,QAAQ;EACV;EACA,wBAAwB;EACxB,eAAe;EACf,eAAe;EACf,eAAe;EACf,SAAS;EACT,OAAO;GACL,aAAa;GACb,cAAc;GACd,YAAY;GACZ,iBAAiB;EACnB;EACA,SAAS;GACP,gBAAgB;GAChB,OAAO;GACP,aAAa;GACb,MAAM;GACN,OAAO;GACP,WAAW;GACX,QAAQ;GACR,SAAS;GACT,QAAQ;GACR,QAAQ;GACR,OAAO;IAAE,MAAM;IAAQ,SAAS;IAAoB,MAAM;GAAgB;EAC5E;EACA,QAAQ;GACN,OAAO;GACP,aAAa;GACb,cAAc;GACd,QAAQ;GACR,QAAQ;GACR,MAAM;EACR;CSjDA;CACA,aAAA,ERpFA,QAAQ,cQoFR;CACA,QAAA;EPrFA,YAAY;EACZ,WAAW;EACX,IAAI;EACJ,MAAM;EACN,OAAO;EACP,UAAU;EACV,QAAQ;EACR,UAAU;EACV,UAAU;CO6EV;CACA,SAAA;ENtFA,uBAAuB;EACvB,gBAAgB;EAChB,iBAAiB;EACjB,gBAAgB;EAChB,WAAW;EACX,mBAAmB;EACnB,gBAAgB;EAChB,YAAY;CM+EZ;CACA,WAAA;ELvFA,OAAO;EACP,aAAa;CKsFb;CACA,iBAAA;EJxFA,YAAY;EACZ,OAAO;EACP,SAAS;EACT,OAAO;CIqFP;CACA,cAAA;EHzFA,YAAY;EACZ,OAAO;CGwFP;CACA,OAAA;EF1FA,kBAAkB;EAClB,SAAS;EACT,cAAc;GACZ,OAAO;GACP,aAAa;EACf;EACA,OAAO;EACP,QAAQ;EACR,oBAAoB;CEkFpB;CACA,kBAAA;ED3FA,eAAe;EACf,aAAa;EACb,YAAY;EACZ,iBAAiB;EACjB,gBAAgB;EAChB,aAAa;EACb,gBAAgB;EAChB,kBAAkB;EAClB,qBAAqB;EACrB,QAAQ;EACR,SAAS;GACP,WAAW;GACX,QAAQ;GACR,UAAU;GACV,WAAW;GACX,aAAa;GACb,aAAa;GACb,cAAc;GACd,OAAO;GACP,QAAQ;EACV;CCuEA;AACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"es-BHJ1VeX-.js","names":[],"sources":["../src/i18n/messages/es.ts"],"sourcesContent":["import type { MemiBoardMessages } from '../translate'\n\n/** 짧은 화면 문구만 번역한다. 빠진 키는 en → ko 순으로 폴백된다. */\nconst messages: MemiBoardMessages = {\n attachments: {\n attach: 'Adjuntar archivos ({count} / {max})',\n maxFiles: 'Puedes adjuntar hasta {max} archivos.',\n },\n auth: {\n writeRestricted: 'Publicar y comentar está restringido temporalmente por advertencias de contenido acumuladas.',\n strikeSuffix: ' (Advertencia {count}/{threshold})',\n strikeRestricted: ' Llegaste a {count} advertencias, así que publicar y comentar está restringido.',\n notInitialized: '[memi-board] Firebase Auth no está inicializado.',\n },\n authorMemo: {\n tooLong: 'Las notas pueden tener hasta {max} caracteres.',\n },\n authorMenu: {\n viewProfile: 'Ver perfil',\n viewPosts: 'Ver publicaciones',\n viewComments: 'Ver comentarios',\n memoAriaLabel: 'Nota sobre este autor',\n memoTitle: 'Nota privada',\n memoPlaceholder: 'Anota algo sobre este autor…',\n bad: 'Mal',\n good: 'Bien',\n },\n avatarCropModal: {\n title: 'Recortar foto de perfil',\n description: 'Se muestra en formato cuadrado (1:1). Ajusta el área.',\n confirm: 'Recortar y subir',\n },\n boardSettings: {\n signInRequired: 'Inicia sesión.',\n idAndNameRequired: 'Ingresa un ID y un nombre para el tablero.',\n deleteIdRequired: 'Se necesita el ID del tablero para eliminarlo.',\n nameRequired: 'Ingresa un nombre para el tablero.',\n },\n boardUsers: {\n unsupportedRole: 'Rol no compatible.',\n roleDescription: {\n admin: 'Administra los roles de usuario, la configuración del tablero y todo el contenido.',\n user: 'Puede escribir publicaciones y comentarios, y editar o eliminar solo su propio contenido.',\n },\n },\n commentFeed: {\n empty: 'Aún no hay comentarios.',\n emptyLiked: 'Aún no hay comentarios con Me gusta.',\n loadFailed: 'No se pudo cargar la lista: {error}',\n blinded: 'Un administrador ocultó este comentario.',\n },\n commentForm: {\n hiddenBoardDenied: 'Solo el personal asignado puede comentar en tableros ocultos.',\n denied: 'No tienes permiso para comentar en este tablero.',\n signInRequired: 'Inicia sesión.',\n writeRestricted: 'Publicar está restringido temporalmente por advertencias de contenido acumuladas.',\n moderationBlocked: 'Contiene contenido que no se puede publicar.',\n replyTo: 'Responder a {name}',\n placeholder: 'Escribe un comentario',\n submitReply: 'Responder',\n submit: 'Comentar',\n signInToComment: 'Inicia sesión para dejar un comentario.',\n attachHint: 'Suelta una imagen aquí o haz clic para elegir una.',\n attachNote: 'jpg, png, gif, webp. Las imágenes grandes se reducen a 5MB o menos.',\n removeImage: 'Quitar imagen adjunta',\n imageOnly: 'Solo se pueden adjuntar imágenes jpg, png, gif y webp.',\n uploadFailed: 'No se pudo subir la imagen.',\n uploading: 'Subiendo imagen…',\n },\n commentItem: {\n editRestricted: 'La edición de comentarios está restringida temporalmente.',\n moderationBlocked: 'Contiene contenido que no se puede publicar.',\n editFailed: 'No se pudo actualizar el comentario.',\n blindFailed: 'No se pudo cambiar el estado de ocultación.',\n likeFailed: 'No se pudo procesar el Me gusta.',\n blinded: 'Un administrador ocultó este comentario.',\n attachedImage: 'Imagen adjunta al comentario',\n edit: 'Editar comentario',\n blind: 'Ocultar comentario',\n unblind: 'Mostrar comentario',\n delete: 'Eliminar comentario',\n },\n commentList: {\n loading: 'Cargando comentarios',\n empty: 'Aún no hay comentarios.',\n loadMore: 'Más comentarios',\n loadingMore: 'Cargando más comentarios',\n },\n commentThread: {\n deleteConfirm: '¿Eliminar este comentario?',\n deleteFailed: 'No se pudo eliminar el comentario.',\n hideReplies: 'Ocultar respuestas',\n showReplies: '{count} respuestas',\n loadMoreReplies: 'Más respuestas',\n },\n comments: {\n bodyRequired: 'Escribe un comentario.',\n bodyTooLong: 'Los comentarios pueden tener hasta {max} caracteres.',\n replyTargetNotFound: 'No se encontró el comentario al que respondes.',\n threadNotFound: 'No se encontró el hilo de comentarios.',\n hasRepliesCannotDelete: 'Por ahora no se pueden eliminar comentarios que tienen respuestas.',\n },\n common: {\n action: {\n cancel: 'Cancelar',\n save: 'Guardar',\n saved: 'Guardado',\n edit: 'Editar',\n delete: 'Eliminar',\n confirm: 'Aceptar',\n close: 'Cerrar',\n add: 'Agregar',\n more: 'Ver más',\n prev: 'Anterior',\n next: 'Siguiente',\n retry: 'Reintentar',\n reply: 'Responder',\n like: 'Me gusta',\n unlike: 'Ya no me gusta',\n share: 'Compartir',\n report: 'Reportar',\n signIn: 'Iniciar sesión',\n signOut: 'Cerrar sesión',\n write: 'Escribir',\n toTop: 'Arriba',\n },\n label: {\n anonymous: 'Anónimo',\n user: 'Usuario',\n image: 'Imagen',\n draft: 'Borrador',\n loading: 'Cargando…',\n },\n role: {\n admin: 'Administrador',\n staff: 'Personal',\n user: 'Usuario',\n },\n date: {\n justNow: 'Justo ahora',\n fewSecondsAgo: 'Hace unos segundos',\n checking: 'Verificando la hora',\n createdAt: 'Creado: {time}',\n updatedAt: 'Actualizado: {time}',\n },\n },\n detail: {\n deleteConfirm: '¿Eliminar esta publicación? No se puede deshacer.',\n notFound: 'No se encontró la publicación.',\n draftPreview: 'Vista previa sin publicar',\n draftNotice: 'Esta publicación aún no está publicada. Solo tú puedes verla hasta que la publiques.',\n publish: 'Publicar',\n notice: 'Aviso',\n pin: 'Fijar como aviso',\n unpin: 'Quitar aviso',\n backToList: 'Volver a la lista',\n postNav: 'Navegación de publicaciones',\n list: 'Lista',\n comments: 'Comentarios',\n },\n editor: {\n titlePlaceholder: 'Título',\n contentPlaceholder: 'Escribe algo… Escribe / para abrir el menú de bloques.',\n imageContentPlaceholder: 'Escribe algo…',\n tagsPlaceholder: 'Escribe una etiqueta y presiona Enter',\n skipModeration: 'Omitir filtro de groserías (admin)',\n pinNotice: 'Fijar como aviso',\n submitEdit: 'Guardar cambios',\n submitNext: 'Siguiente: vista previa',\n apply: 'Aplicar',\n imageOptimizing: 'Optimizando y subiendo la imagen…',\n cover: {\n imageLink: 'Enlace de imagen',\n addPhoto: 'Agregar fotos',\n alt: 'Foto {n}',\n representative: 'Portada',\n setRepresentative: 'Usar de portada',\n setRepresentativeAria: 'Usar la foto {n} como portada',\n remove: 'Quitar foto',\n add: 'Agregar',\n uploading: 'Subiendo…',\n dropOrClick: 'Suelta fotos o haz clic para agregar',\n emptyHint: 'Selecciona varias · Elige la portada tras subir · Arrastra para reordenar',\n uploadTitle: 'Subir',\n },\n uploadFailed: 'Error al subir',\n aiAssistant: 'Asistente de escritura con AI',\n insertBlock: 'Insertar bloque',\n blockMenu: 'Menú de bloques',\n imageDialog: {\n title: 'Agregar imagen',\n chooseFile: 'Elegir imagen del dispositivo',\n orLink: 'o enlace de imagen',\n urlLabel: 'URL de la imagen',\n previewAlt: 'Vista previa de imagen externa',\n addLink: 'Agregar enlace',\n },\n customDialog: {\n title: 'Reescribir con un estilo personalizado',\n label: '¿Cómo quieres reescribirlo?',\n help: 'p. ej., en tono casual / en estilo formal / en viñetas concisas',\n placeholder: 'En tono casual',\n },\n aiPreview: {\n title: 'Revisar resultado de AI',\n currentTitle: 'Título actual',\n newTitle: 'Título nuevo',\n currentContent: 'Contenido actual',\n appendedContent: 'Contenido a agregar',\n before: 'Antes',\n after: 'Después',\n },\n menu: {\n ai: 'AI',\n aiContinue: 'Continuar con AI',\n style: 'Estilo',\n insert: 'Insertar',\n paragraph: 'Párrafo',\n heading1: 'Título 1',\n heading2: 'Título 2',\n heading3: 'Título 3',\n bulletList: 'Lista con viñetas',\n orderedList: 'Lista numerada',\n blockquote: 'Cita',\n codeBlock: 'Bloque de código',\n horizontalRule: 'Separador',\n image: 'Imagen',\n turnInto: 'Convertir en',\n resetFormatting: 'Restablecer formato',\n duplicate: 'Duplicar',\n moveUp: 'Subir',\n moveDown: 'Bajar',\n delete: 'Eliminar',\n },\n toolbar: {\n link: 'Enlace',\n image: 'Imagen',\n format: 'Formato',\n bold: 'Negrita',\n italic: 'Cursiva',\n underline: 'Subrayado',\n strike: 'Tachado',\n title: 'Título',\n heading: 'Encabezado',\n subheading: 'Subencabezado',\n body: 'Cuerpo',\n mono: 'Monoespaciado',\n bulletList: 'Lista con viñetas',\n orderedList: 'Lista numerada',\n blockquote: 'Cita en bloque',\n codeBlock: 'Bloque de código',\n horizontalRule: 'Separador',\n clearFormatting: 'Borrar formato',\n undo: 'Deshacer',\n redo: 'Rehacer',\n },\n ai: {\n proofread: 'Revisar ortografía',\n polish: 'Pulir redacción',\n continue: 'Seguir escribiendo',\n summarize: 'Resumir brevemente',\n translateEn: 'Traducir al inglés',\n translateKo: 'Traducir al coreano',\n translateAll: 'Traducir y guardar en 10 idiomas',\n translateSaved: 'Guardado en 10 idiomas. Quien lee ve la traducción de su idioma.',\n translatePending: 'Las traducciones a 10 idiomas están listas. Se guardan con la publicación.',\n translateEmpty: 'Escribe primero un título o un texto para traducir.',\n title: 'Generar título a partir del texto',\n custom: 'Reescribir con un estilo personalizado…',\n failed: 'La tarea de AI falló. Inténtalo de nuevo.',\n },\n youtubePrompt: 'Ingresa un enlace de YouTube.',\n errors: {\n coverMax: 'Puedes subir hasta {max} fotos.',\n imageUrlRequired: 'Ingresa una URL de imagen.',\n imageUrlInvalid: 'Ingresa una URL de imagen válida.',\n imageUrlHttps: 'Solo se permiten URL de imagen HTTPS.',\n imageUrlCredentials: 'No se permiten URL con datos de inicio de sesión.',\n imageTimeout: 'La imagen está tardando demasiado en cargar.',\n imageNotDisplayable: 'No se puede mostrar esta imagen.',\n editorNotReady: 'El editor no está listo. Inténtalo de nuevo.',\n imageLinkFailed: 'No se pudo agregar el enlace de imagen.',\n imageOnly: 'Solo se pueden subir archivos de imagen.',\n imageTooLarge: 'Las imágenes originales deben pesar {mb}MB o menos.',\n imageUploadFailed: 'No se pudo subir la imagen.',\n pasteAsFile: 'Pega o arrastra las fotos como archivos en el área de arriba.',\n postNotFound: 'No se encontró la publicación.',\n loadPermission: 'No tienes permiso para cargar esta publicación. Verifica que hayas iniciado sesión.',\n loadFailed: 'No se pudo cargar la publicación: {message}',\n titleRequired: 'Ingresa un título.',\n photoRequired: 'Sube al menos una foto.',\n bodyRequired: 'Escribe algo de texto o adjunta una imagen.',\n signInRequired: 'Debes iniciar sesión.',\n boardMissing: 'No se especificó ningún tablero.',\n writeRestricted: 'Publicar y comentar está restringido temporalmente por advertencias de contenido acumuladas.',\n moderationBlocked: 'Contiene contenido que no se puede publicar.',\n },\n hint: {\n reviewing: 'Revisando el contenido…',\n saving: 'Guardando…',\n },\n },\n footer: {\n info: {\n title: 'Información del tablero',\n about: 'Acerca de este tablero',\n history: 'Historial de versiones',\n },\n stack: {\n ui: 'Interfaz y experiencia',\n data: 'Datos e inicio de sesión',\n writing: 'Escritura y comodidad',\n },\n },\n likes: {\n signInRequired: 'Inicia sesión.',\n commentNotFound: 'No se encontró el comentario.',\n },\n list: {\n settings: 'Configuración',\n loadFailed: 'No se pudo cargar la lista: {error}',\n empty: 'Aún no hay publicaciones.',\n notice: 'Aviso',\n photo: 'Foto',\n likeCount: 'Me gusta {count}',\n info: {\n title: 'Información del tablero',\n about: 'Acerca de este tablero',\n history: 'Historial de versiones',\n },\n stack: {\n framework: 'Framework y lenguaje',\n ui: 'UI y estilos',\n backend: 'Backend y datos',\n },\n tech: {\n nuxt: 'Framework SSR basado en Vue',\n vue: 'Composition API · script setup',\n typescript: 'Datos y componentes con tipos seguros',\n nuxtUi: 'UI de tablero, formularios y modales',\n tailwind: 'Estilos adaptables · claro/oscuro',\n lucide: 'Íconos ligeros y coherentes',\n dayjs: 'Fechas legibles y tiempos relativos',\n firestore: 'Base de datos en tiempo real para publicaciones y comentarios',\n auth: 'Inicio de sesión y permisos seguros',\n storage: 'Almacenamiento de imágenes y adjuntos',\n vuefire: 'Conexión en tiempo real entre Nuxt y Firebase',\n },\n },\n listViewSwitch: {\n default: 'Normal',\n dense: 'Compacta',\n video: 'Video',\n },\n miniComments: {\n empty: 'Aún no hay comentarios.',\n blinded: 'Un administrador ocultó este comentario.',\n },\n miniList: {\n empty: 'Aún no hay publicaciones.',\n },\n miniPicker: {\n selectedCount: 'Seleccionadas {count} / {max}',\n layoutHint: 'Con 2 o más se muestra como carrusel; con 4, como cuadrícula',\n searchPlaceholder: 'Buscar títulos',\n loading: 'Cargando publicaciones…',\n noMore: 'No hay más publicaciones para elegir.',\n },\n miniPost: {\n empty: 'No hay publicaciones seleccionadas.',\n },\n moderation: {\n writeRestricted: 'Publicar y comentar está restringido temporalmente por advertencias de contenido acumuladas.',\n },\n moderationPrompt: {\n localHit: 'No se permiten expresiones como “{hit}”. Reformula el texto.',\n localGeneric: 'Contiene groserías, así que no se puede publicar. Reformula el texto.',\n genericBlocked: 'Contiene contenido que no se puede publicar. Edítalo.',\n categories: {\n abuse: 'groserías o insultos',\n spam: 'spam o publicidad',\n adult: 'contenido sexual o para adultos',\n violence: 'violencia o amenazas',\n other: 'contenido inapropiado',\n },\n },\n moderationStrike: {\n liftSoon: 'se levanta pronto',\n liftInHours: 'se levanta en unas {hours} h',\n liftInDays: 'se levanta en unos {days} d',\n liftInDaysHours: 'se levanta en unos {days} d {hours} h',\n },\n posts: {\n boardIdRequired: '[memi-board] Se requiere boardId.',\n photoRequired: 'Agrega una foto.',\n bodyRequired: 'Escribe algo de texto o adjunta una imagen.',\n titleRequired: 'Ingresa un título.',\n },\n profile: {\n notFound: 'No se encontró el usuario.',\n noName: 'Sin nombre',\n joined: 'Se unió {time}',\n lastVisit: 'Última visita {time}',\n },\n profileEditModal: {\n imageOnly: 'Solo puedes seleccionar archivos de imagen.',\n nameRequired: 'Ingresa un nombre.',\n saveFailed: 'No se pudo guardar el perfil.',\n title: 'Editar perfil',\n changePhoto: 'Cambiar foto',\n name: 'Nombre',\n bio: 'Biografía',\n bioPlaceholder: 'Cuéntales a los demás sobre ti',\n },\n reportButton: {\n failed: 'No se pudo enviar el reporte.',\n reported: 'Reportado',\n title: 'Reportar publicación',\n done: 'Recibimos tu reporte. El personal lo revisará.',\n reason: 'Motivo',\n detailPlaceholder: 'Detalles (opcional)',\n submit: 'Reportar',\n },\n reportList: {\n staffOnly: 'Solo el personal puede ver los reportes.',\n loadFailed: 'No se pudo cargar la lista: {error}',\n empty: 'No hay reportes pendientes.',\n untitled: 'Publicación sin título',\n author: 'por {name}',\n dismiss: 'Descartar',\n confirm: 'Resolver',\n },\n reports: {\n reason: {\n spam: 'Spam / publicidad',\n abuse: 'Insultos / odio / acoso',\n adult: 'Contenido sexual',\n illegal: 'Contenido ilegal',\n other: 'Otro',\n },\n fallbackLabel: 'Reporte',\n signInRequired: 'Inicia sesión.',\n cannotReportOwn: 'No puedes reportar tu propia publicación.',\n reasonRequired: 'Selecciona un motivo.',\n detailTooLong: 'Los detalles pueden tener hasta {max} caracteres.',\n },\n sectionUtil: {\n kind: {\n list: 'Lista de publicaciones',\n post: 'Publicaciones',\n comments: 'Comentarios',\n },\n sort: {\n latest: 'Más recientes',\n likes: 'Más gustados',\n },\n untitledPost: 'Publicación',\n view: {\n media: 'Multimedia',\n list: 'Lista',\n },\n },\n sections: {\n defaultTitle: 'Sección {n}',\n },\n seo: {\n allCategory: 'Todo',\n boardDescription: 'Tablero {name}',\n allDescription: 'Tablero: anuncios y novedades de la comunidad.',\n postFallbackTitle: 'Publicación | {site}',\n postFallbackDescription: 'Tablero',\n photo: 'Foto',\n postDescriptionFallback: 'Publicación del tablero',\n listTitle: '{name} | {site}',\n listTitleAll: 'Tablero | {site}',\n listDescription: '{name}: ponte al día con las últimas publicaciones.',\n listDescriptionAll: 'Tablero: anuncios e historias.',\n },\n settings: {\n loading: 'Cargando configuración…',\n noAccess: 'No tienes acceso',\n notFound: {\n title: 'No se encontró el tablero',\n checkAddress: 'Verifica la dirección.',\n checkBoardAddress: 'Verifica la dirección del tablero.',\n },\n newBoard: {\n title: 'Este tablero aún no existe',\n description: 'Completa los datos de abajo y guarda para crearlo con este ID.',\n },\n noLabel: 'Sin etiqueta',\n option: {\n default: 'Estándar',\n },\n id: {\n label: 'ID de categoría',\n help: 'Se usa en la URL y en los datos',\n },\n writeRole: {\n label: 'Quién puede publicar',\n help: 'Rol mínimo necesario para publicar en esta categoría',\n helpShort: 'Rol mínimo necesario para publicar',\n options: {\n user: 'Usuarios o superior',\n staff: 'Personal o superior',\n admin: 'Solo administradores',\n },\n },\n commentWriteRole: {\n label: 'Quién puede comentar',\n help: 'Rol mínimo necesario para comentar en esta categoría',\n helpShort: 'Rol mínimo necesario para comentar',\n hiddenFixed: 'Solo personal asignado (fijo en tableros ocultos)',\n },\n staff: {\n label: 'Personal asignado',\n help: 'Solo el personal seleccionado puede configurar y administrar este tablero. Déjalo vacío para que sea solo de administradores',\n placeholder: 'Solo administradores (sin personal asignado)',\n },\n label: {\n label: 'Nombre visible',\n help: 'El nombre que ven los usuarios',\n },\n description: {\n label: 'Descripción',\n help: 'Se muestra en la parte superior del tablero y en otros lugares',\n placeholder: 'Una breve descripción de este tablero (opcional)',\n },\n visibility: {\n label: 'Visibilidad',\n options: {\n public: {\n label: 'Visible',\n description: 'Se muestra en la lista completa y en los filtros',\n },\n hidden: {\n label: 'Oculto',\n description: 'Diario o privado. Solo el personal asignado puede comentar',\n },\n },\n },\n listView: {\n label: 'Vista de lista',\n help: 'Cómo se muestra la lista de publicaciones',\n options: {\n dense: 'Compacta',\n video: 'Video',\n },\n },\n editorType: {\n label: 'Formulario de publicación',\n help: 'Cómo se escriben las publicaciones',\n options: {\n default: 'Escribir un título y un texto',\n image: 'Agregar varias fotos y una foto de portada',\n },\n },\n locale: {\n label: 'Idioma del tablero',\n auto: 'Automático (según el idioma del sitio)',\n },\n autoTranslate: {\n action: \"Traducir a 10 idiomas\",\n manualHelp: \"Traduce el nombre y la descripción juntos y guarda para aplicar los cambios.\",\n pending: \"Las traducciones a 10 idiomas están listas. Guarda para aplicarlas.\",\n manualFailed: \"La traducción falló. Tu texto se conserva. Inténtalo de nuevo.\",\n label: 'Traducir a 10 idiomas al guardar',\n help: 'Si está activado, el nombre y la descripción se traducen a 10 idiomas. Si está desactivado, no se traducen. El texto sin cambios no se vuelve a traducir.',\n failed: 'Los ajustes se guardaron, pero falló la traducción a 10 idiomas. Guarda de nuevo.',\n ready: 'El nombre y la descripción están guardados en 10 idiomas.',\n },\n action: {\n moveDown: 'Bajar',\n goToBoard: 'Ir al tablero',\n deleteBoard: 'Eliminar tablero',\n create: 'Crear',\n },\n newCategoryPlaceholder: 'Nombre de la nueva categoría',\n savedCategory: 'Se guardó la categoría “{label}”.',\n savedSettings: 'Se guardó la configuración del tablero.',\n created: 'Tablero creado.',\n error: {\n orderFailed: 'No se pudo guardar el orden de las categorías.',\n deleteFailed: 'No se pudo eliminar el tablero ni sus datos.',\n saveFailed: 'No se pudo guardar la configuración del tablero.',\n deleteAllFailed: 'No se pudieron eliminar los datos del tablero.',\n },\n danger: {\n title: 'Zona de peligro',\n confirmLabel: 'Escribe “{phrase}” para confirmar',\n phrase: 'eliminar datos del tablero',\n button: 'Eliminar todos los datos',\n done: 'Se eliminaron todos los datos del tablero.',\n },\n },\n shareButton: {\n copied: 'Enlace copiado',\n },\n signIn: {\n withGoogle: 'Iniciar sesión con Google',\n withApple: 'Iniciar sesión con Apple',\n or: 'o',\n name: 'Nombre',\n email: 'Correo electrónico',\n password: 'Contraseña',\n signUp: 'Registrarse',\n toSignUp: '¿No tienes cuenta? Regístrate',\n toSignIn: '¿Ya tienes cuenta? Inicia sesión',\n },\n storage: {\n sourceTooLarge: 'La imagen original debe pesar {max}MB o menos.',\n imageOnly: 'Solo se pueden subir archivos de imagen.',\n canvasUnavailable: 'Canvas no está disponible',\n compressFailed: 'Error de compresión',\n loadFailed: 'No se pudo cargar la imagen',\n },\n swipeHint: {\n title: 'Prueba deslizar a la izquierda o a la derecha',\n description: 'Desliza a la izquierda para ver la siguiente publicación y a la derecha para la anterior.',\n },\n userCommentList: {\n loadFailed: 'No se pudo cargar la lista: {error}',\n empty: 'Aún no hay comentarios.',\n blinded: 'Un administrador ocultó este comentario.',\n likes: '{count} Me gusta',\n },\n userPostList: {\n loadFailed: 'No se pudo cargar la lista: {error}',\n empty: 'Aún no hay publicaciones.',\n },\n users: {\n changeRoleFailed: 'No se pudo cambiar el rol.',\n loading: 'Cargando usuarios…',\n noPermission: {\n title: 'Sin permiso',\n description: 'Solo los administradores del tablero pueden gestionar los roles de usuario.',\n },\n empty: 'Ningún usuario ha iniciado sesión en el tablero todavía.',\n noName: 'Sin nombre',\n moderationWarnings: '{count} advertencias de contenido',\n },\n writingAssistant: {\n loginRequired: 'Inicia sesión para usar el asistente de escritura con AI.',\n userMissing: 'No se pudo verificar tu información de usuario. Inténtalo de nuevo.',\n contentRequired: 'Primero escribe algo de contenido para que la AI trabaje.',\n customRequired: 'Escribe una instrucción sobre cómo reescribirlo.',\n emptyResult: 'La AI no pudo generar un resultado. Inténtalo de nuevo.',\n translateEmpty: 'Escribe primero un título o un texto para traducir.',\n translateTooLong: 'Los textos de más de {limit} caracteres no se pueden guardar en 10 idiomas. Acórtalo e inténtalo de nuevo.',\n translateIncomplete: 'Algunos idiomas volvieron vacíos. Inténtalo de nuevo.',\n failed: 'La tarea de AI falló. Inténtalo de nuevo.',\n actions: {\n proofread: 'Revisar ortografía',\n polish: 'Pulir frases',\n continue: 'Seguir escribiendo',\n summarize: 'Resumir',\n translateEn: 'Traducir al inglés',\n translateKo: 'Traducir al coreano',\n translateAll: 'Traducir y guardar en 10 idiomas',\n translateSaved: 'Guardado en 10 idiomas. Quien lee ve la traducción de su idioma.',\n translatePending: 'Las traducciones a 10 idiomas están listas. Se guardan con la publicación.',\n translateEmpty: 'Escribe primero un título o un texto para traducir.',\n title: 'Generar título a partir del texto',\n custom: 'Reescribir con un estilo personalizado…',\n },\n },\n}\n\nexport default messages\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"fr-aSscFSwK.js","names":[],"sources":["../src/i18n/messages/fr.ts"],"sourcesContent":["import type { MemiBoardMessages } from '../translate'\n\n/** 짧은 화면 문구만 번역한다. 빠진 키는 en → ko 순으로 폴백된다. */\nconst messages: MemiBoardMessages = {\n attachments: {\n attach: 'Joindre des fichiers ({count} / {max})',\n maxFiles: 'Vous pouvez joindre jusqu’à {max} fichiers.',\n },\n auth: {\n writeRestricted: 'En raison d’avertissements répétés, la publication et les commentaires sont temporairement restreints.',\n strikeSuffix: ' (avertissement {count}/{threshold})',\n strikeRestricted: ' Vous avez atteint {count} avertissements : la publication et les commentaires sont restreints.',\n notInitialized: '[memi-board] Firebase Auth n’est pas initialisé.',\n },\n authorMemo: {\n tooLong: 'Les notes sont limitées à {max} caractères.',\n },\n authorMenu: {\n viewProfile: 'Voir le profil',\n viewPosts: 'Voir les publications',\n viewComments: 'Voir les commentaires',\n memoAriaLabel: 'Note sur cet auteur',\n memoTitle: 'Note privée',\n memoPlaceholder: 'Notez quelque chose sur cet auteur…',\n bad: 'Mauvais',\n good: 'Bon',\n },\n avatarCropModal: {\n title: 'Recadrer la photo de profil',\n description: 'Affichée au format carré (1:1). Ajustez la zone.',\n confirm: 'Recadrer et importer',\n },\n boardSettings: {\n signInRequired: 'Veuillez vous connecter.',\n idAndNameRequired: 'Veuillez saisir un ID et un nom de forum.',\n deleteIdRequired: 'Un ID de forum est requis pour la suppression.',\n nameRequired: 'Veuillez saisir un nom de forum.',\n },\n boardUsers: {\n unsupportedRole: 'Rôle non pris en charge.',\n roleDescription: {\n admin: 'Gère les rôles, les paramètres du forum et tout le contenu.',\n user: 'Peut publier et commenter, et modifier ou supprimer uniquement son propre contenu.',\n },\n },\n commentFeed: {\n empty: 'Aucun commentaire pour l’instant.',\n emptyLiked: 'Aucun commentaire aimé pour l’instant.',\n loadFailed: 'Impossible de charger la liste : {error}',\n blinded: 'Ce commentaire a été masqué par un administrateur.',\n },\n commentForm: {\n hiddenBoardDenied: 'Seule l’équipe attitrée peut commenter dans les forums masqués.',\n denied: 'Vous n’avez pas l’autorisation de commenter dans ce forum.',\n signInRequired: 'Veuillez vous connecter.',\n writeRestricted: 'En raison d’avertissements répétés, la publication et les commentaires sont temporairement restreints.',\n moderationBlocked: 'Ce contenu ne peut pas être publié.',\n replyTo: 'Répondre à {name}',\n placeholder: 'Écrire un commentaire',\n submitReply: 'Répondre',\n submit: 'Commenter',\n signInToComment: 'Connectez-vous pour laisser un commentaire.',\n attachHint: 'Déposez une image ici ou cliquez pour en choisir une.',\n attachNote: 'jpg, png, gif, webp. Les grandes images sont réduites à 5 Mo ou moins.',\n removeImage: 'Retirer l’image jointe',\n imageOnly: 'Seules les images jpg, png, gif et webp peuvent être jointes.',\n uploadFailed: 'Impossible d’envoyer l’image.',\n uploading: 'Envoi de l’image…',\n },\n commentItem: {\n editRestricted: 'La modification des commentaires est temporairement restreinte.',\n moderationBlocked: 'Ce contenu ne peut pas être publié.',\n editFailed: 'Impossible de modifier le commentaire.',\n blindFailed: 'Impossible de modifier l’état masqué.',\n likeFailed: 'Impossible de traiter le j’aime.',\n blinded: 'Ce commentaire a été masqué par un administrateur.',\n attachedImage: 'Image jointe au commentaire',\n edit: 'Modifier le commentaire',\n blind: 'Masquer le commentaire',\n unblind: 'Afficher le commentaire',\n delete: 'Supprimer le commentaire',\n },\n commentList: {\n loading: 'Chargement des commentaires',\n empty: 'Aucun commentaire pour l’instant.',\n loadMore: 'Plus de commentaires',\n loadingMore: 'Chargement d’autres commentaires',\n },\n commentThread: {\n deleteConfirm: 'Supprimer ce commentaire ?',\n deleteFailed: 'Impossible de supprimer le commentaire.',\n hideReplies: 'Masquer les réponses',\n showReplies: '{count} réponses',\n loadMoreReplies: 'Plus de réponses',\n },\n comments: {\n bodyRequired: 'Veuillez saisir un commentaire.',\n bodyTooLong: 'Les commentaires sont limités à {max} caractères.',\n replyTargetNotFound: 'Le commentaire auquel vous répondez est introuvable.',\n threadNotFound: 'Fil de commentaires introuvable.',\n hasRepliesCannotDelete: 'Les commentaires ayant des réponses ne peuvent pas être supprimés pour le moment.',\n },\n common: {\n action: {\n cancel: 'Annuler',\n save: 'Enregistrer',\n saved: 'Enregistré',\n edit: 'Modifier',\n delete: 'Supprimer',\n confirm: 'OK',\n close: 'Fermer',\n add: 'Ajouter',\n more: 'Plus',\n prev: 'Précédent',\n next: 'Suivant',\n retry: 'Réessayer',\n reply: 'Répondre',\n like: 'J’aime',\n unlike: 'Je n’aime plus',\n share: 'Partager',\n report: 'Signaler',\n signIn: 'Se connecter',\n signOut: 'Se déconnecter',\n write: 'Écrire',\n toTop: 'Haut',\n },\n label: {\n anonymous: 'Anonyme',\n user: 'Utilisateur',\n image: 'Image',\n draft: 'Brouillon',\n loading: 'Chargement…',\n },\n role: {\n admin: 'Admin',\n staff: 'Équipe',\n user: 'Utilisateur',\n },\n date: {\n justNow: 'À l’instant',\n fewSecondsAgo: 'Il y a quelques secondes',\n checking: 'Vérification de l’heure',\n createdAt: 'Créé : {time}',\n updatedAt: 'Modifié : {time}',\n },\n },\n detail: {\n deleteConfirm: 'Supprimer cette publication ? Cette action est irréversible.',\n notFound: 'Publication introuvable.',\n draftPreview: 'Aperçu non publié',\n draftNotice: 'Pas encore publiée. Vous seul pouvez la voir jusqu’à sa publication.',\n publish: 'Publier',\n notice: 'Annonce',\n pin: 'Épingler en annonce',\n unpin: 'Retirer l’annonce',\n backToList: 'Retour à la liste',\n postNav: 'Navigation entre publications',\n list: 'Liste',\n comments: 'Commentaires',\n },\n editor: {\n titlePlaceholder: 'Titre',\n contentPlaceholder: 'Écrivez quelque chose… Tapez / pour ouvrir le menu des blocs.',\n imageContentPlaceholder: 'Écrivez quelque chose…',\n tagsPlaceholder: 'Saisissez un tag puis Entrée',\n skipModeration: 'Ignorer le filtre de grossièretés (admin)',\n pinNotice: 'Épingler en annonce',\n submitEdit: 'Enregistrer les modifications',\n submitNext: 'Suivant : aperçu',\n apply: 'Appliquer',\n imageOptimizing: 'Optimisation et importation de l’image…',\n cover: {\n imageLink: 'Lien d’image',\n addPhoto: 'Ajouter des photos',\n alt: 'Photo {n}',\n representative: 'Couverture',\n setRepresentative: 'Couverture',\n setRepresentativeAria: 'Définir la photo {n} comme couverture',\n remove: 'Retirer la photo',\n add: 'Ajouter',\n uploading: 'Importation…',\n dropOrClick: 'Déposez des photos ou cliquez pour ajouter',\n emptyHint: 'Sélection multiple · Couverture au choix après import · Glissez pour réordonner',\n uploadTitle: 'Importer',\n },\n uploadFailed: 'Échec de l’importation',\n aiAssistant: 'Assistant d’écriture AI',\n insertBlock: 'Insérer un bloc',\n blockMenu: 'Menu des blocs',\n imageDialog: {\n title: 'Ajouter une image',\n chooseFile: 'Choisir une image sur l’appareil',\n orLink: 'ou lien d’image',\n urlLabel: 'URL de l’image',\n previewAlt: 'Aperçu de l’image externe',\n addLink: 'Ajouter le lien',\n },\n customDialog: {\n title: 'Réécrire dans un style personnalisé',\n label: 'Comment réécrire le texte ?',\n help: 'ex. : sur un ton décontracté / dans un style soutenu / en points concis',\n placeholder: 'Sur un ton décontracté',\n },\n aiPreview: {\n title: 'Vérifier le résultat de l’AI',\n currentTitle: 'Titre actuel',\n newTitle: 'Nouveau titre',\n currentContent: 'Contenu actuel',\n appendedContent: 'Contenu à ajouter',\n before: 'Avant',\n after: 'Après',\n },\n menu: {\n ai: 'AI',\n aiContinue: 'Continuer avec l’AI',\n style: 'Style',\n insert: 'Insérer',\n paragraph: 'Paragraphe',\n heading1: 'Titre 1',\n heading2: 'Titre 2',\n heading3: 'Titre 3',\n bulletList: 'Liste à puces',\n orderedList: 'Liste numérotée',\n blockquote: 'Citation',\n codeBlock: 'Bloc de code',\n horizontalRule: 'Séparateur',\n image: 'Image',\n turnInto: 'Transformer en',\n resetFormatting: 'Réinitialiser la mise en forme',\n duplicate: 'Dupliquer',\n moveUp: 'Monter',\n moveDown: 'Descendre',\n delete: 'Supprimer',\n },\n toolbar: {\n link: 'Lien',\n image: 'Image',\n format: 'Format',\n bold: 'Gras',\n italic: 'Italique',\n underline: 'Souligné',\n strike: 'Barré',\n title: 'Titre',\n heading: 'En-tête',\n subheading: 'Sous-titre',\n body: 'Corps du texte',\n mono: 'Monospace',\n bulletList: 'Liste à puces',\n orderedList: 'Liste numérotée',\n blockquote: 'Citation en bloc',\n codeBlock: 'Bloc de code',\n horizontalRule: 'Séparateur',\n clearFormatting: 'Effacer la mise en forme',\n undo: 'Annuler',\n redo: 'Rétablir',\n },\n ai: {\n proofread: 'Vérifier l’orthographe',\n polish: 'Améliorer le texte',\n continue: 'Continuer l’écriture',\n summarize: 'Résumer brièvement',\n translateEn: 'Traduire en anglais',\n translateKo: 'Traduire en coréen',\n translateAll: 'Traduire et enregistrer en 10 langues',\n translateSaved: 'Enregistré en 10 langues. Les lecteurs voient la traduction de leur langue.',\n translatePending: 'Les traductions en 10 langues sont prêtes. Elles sont enregistrées avec le message.',\n translateEmpty: 'Saisissez d’abord un titre ou un texte à traduire.',\n title: 'Générer un titre à partir du texte',\n custom: 'Réécrire dans un style personnalisé…',\n failed: 'La tâche AI a échoué. Veuillez réessayer.',\n },\n youtubePrompt: 'Saisissez un lien YouTube.',\n errors: {\n coverMax: 'Vous pouvez importer jusqu’à {max} photos.',\n imageUrlRequired: 'Saisissez l’URL d’une image.',\n imageUrlInvalid: 'Saisissez une URL d’image valide.',\n imageUrlHttps: 'Seules les URL d’images en HTTPS sont autorisées.',\n imageUrlCredentials: 'Les URL contenant des identifiants ne sont pas autorisées.',\n imageTimeout: 'Le chargement de l’image prend trop de temps.',\n imageNotDisplayable: 'Cette image ne peut pas être affichée.',\n editorNotReady: 'L’éditeur n’est pas prêt. Veuillez réessayer.',\n imageLinkFailed: 'Impossible d’ajouter le lien d’image.',\n imageOnly: 'Seuls les fichiers image peuvent être importés.',\n imageTooLarge: 'Les images originales ne doivent pas dépasser {mb} Mo.',\n imageUploadFailed: 'Échec de l’importation de l’image.',\n pasteAsFile: 'Collez ou glissez les photos sous forme de fichiers dans la zone ci-dessus.',\n postNotFound: 'Publication introuvable.',\n loadPermission: 'Vous n’avez pas l’autorisation de charger cette publication. Vérifiez que vous êtes connecté.',\n loadFailed: 'Impossible de charger la publication : {message}',\n titleRequired: 'Saisissez un titre.',\n photoRequired: 'Importez au moins une photo.',\n bodyRequired: 'Saisissez du texte ou joignez une image.',\n signInRequired: 'Connexion requise.',\n boardMissing: 'Aucun forum indiqué.',\n writeRestricted: 'En raison d’avertissements répétés, la publication et les commentaires sont temporairement restreints.',\n moderationBlocked: 'Ce contenu ne peut pas être publié.',\n },\n hint: {\n reviewing: 'Vérification du contenu…',\n saving: 'Enregistrement…',\n },\n },\n footer: {\n info: {\n title: 'Infos du forum',\n about: 'À propos de ce forum',\n history: 'Historique des versions',\n },\n stack: {\n ui: 'Interface et expérience',\n data: 'Données et connexion',\n writing: 'Écriture et confort',\n },\n },\n likes: {\n signInRequired: 'Veuillez vous connecter.',\n commentNotFound: 'Commentaire introuvable.',\n },\n list: {\n settings: 'Paramètres',\n loadFailed: 'Impossible de charger la liste : {error}',\n empty: 'Aucune publication pour l’instant.',\n notice: 'Annonce',\n photo: 'Photo',\n likeCount: 'J’aime {count}',\n info: {\n title: 'Infos du forum',\n about: 'À propos de ce forum',\n history: 'Historique des versions',\n },\n stack: {\n framework: 'Framework et langage',\n ui: 'UI et style',\n backend: 'Backend et données',\n },\n tech: {\n nuxt: 'Framework SSR basé sur Vue',\n vue: 'Composition API · script setup',\n typescript: 'Données et composants typés',\n nuxtUi: 'UI de forum, formulaires et modales',\n tailwind: 'Responsive · styles clair/sombre',\n lucide: 'Icônes légères et cohérentes',\n dayjs: 'Dates lisibles et temps relatifs',\n firestore: 'Base de données temps réel pour publications et commentaires',\n auth: 'Connexion et autorisations sécurisées',\n storage: 'Stockage des images et pièces jointes',\n vuefire: 'Liaison temps réel Nuxt–Firebase',\n },\n },\n listViewSwitch: {\n default: 'Standard',\n dense: 'Compact',\n video: 'Vidéo',\n },\n miniComments: {\n empty: 'Aucun commentaire pour l’instant.',\n blinded: 'Ce commentaire a été masqué par un administrateur.',\n },\n miniList: {\n empty: 'Aucune publication pour l’instant.',\n },\n miniPicker: {\n selectedCount: 'Sélectionnées {count} / {max}',\n layoutHint: 'Carrousel à partir de 2, grille pour 4',\n searchPlaceholder: 'Rechercher un titre',\n loading: 'Chargement des publications…',\n noMore: 'Plus aucune publication à sélectionner.',\n },\n miniPost: {\n empty: 'Aucune publication sélectionnée.',\n },\n moderation: {\n writeRestricted: 'En raison d’avertissements répétés, la publication et les commentaires sont temporairement restreints.',\n },\n moderationPrompt: {\n localHit: 'Les expressions comme « {hit} » ne sont pas autorisées. Veuillez reformuler.',\n localGeneric: 'Ce contenu contient des grossièretés et ne peut pas être publié. Veuillez reformuler.',\n genericBlocked: 'Ce contenu ne peut pas être publié. Veuillez le modifier.',\n categories: {\n abuse: 'grossièretés ou insultes',\n spam: 'spam ou publicité',\n adult: 'contenu sexuel ou pour adultes',\n violence: 'violence ou menaces',\n other: 'contenu inapproprié',\n },\n },\n moderationStrike: {\n liftSoon: 'levée bientôt',\n liftInHours: 'levée dans environ {hours} h',\n liftInDays: 'levée dans environ {days} j',\n liftInDaysHours: 'levée dans environ {days} j {hours} h',\n },\n posts: {\n boardIdRequired: '[memi-board] boardId est requis.',\n photoRequired: 'Veuillez ajouter une photo.',\n bodyRequired: 'Veuillez saisir du texte ou joindre une image.',\n titleRequired: 'Veuillez saisir un titre.',\n },\n profile: {\n notFound: 'Utilisateur introuvable.',\n noName: 'Sans nom',\n joined: 'Inscrit {time}',\n lastVisit: 'Vu {time}',\n },\n profileEditModal: {\n imageOnly: 'Seuls les fichiers image peuvent être sélectionnés.',\n nameRequired: 'Veuillez saisir un nom.',\n saveFailed: 'Impossible d’enregistrer le profil.',\n title: 'Modifier le profil',\n changePhoto: 'Changer la photo',\n name: 'Nom',\n bio: 'Bio',\n bioPlaceholder: 'Présentez-vous',\n },\n reportButton: {\n failed: 'Impossible d’envoyer le signalement.',\n reported: 'Signalé',\n title: 'Signaler la publication',\n done: 'Signalement reçu. L’équipe va l’examiner.',\n reason: 'Motif',\n detailPlaceholder: 'Détails (facultatif)',\n submit: 'Signaler',\n },\n reportList: {\n staffOnly: 'Seule l’équipe peut consulter les signalements.',\n loadFailed: 'Impossible de charger la liste : {error}',\n empty: 'Aucun signalement en attente.',\n untitled: 'Publication sans titre',\n author: 'par {name}',\n dismiss: 'Rejeter',\n confirm: 'Traiter',\n },\n reports: {\n reason: {\n spam: 'Spam / publicité',\n abuse: 'Insultes / haine / harcèlement',\n adult: 'Contenu sexuel',\n illegal: 'Contenu illégal',\n other: 'Autre',\n },\n fallbackLabel: 'Signalement',\n signInRequired: 'Veuillez vous connecter.',\n cannotReportOwn: 'Vous ne pouvez pas signaler votre propre publication.',\n reasonRequired: 'Veuillez choisir un motif.',\n detailTooLong: 'Les détails sont limités à {max} caractères.',\n },\n sectionUtil: {\n kind: {\n list: 'Liste de publications',\n post: 'Publications',\n comments: 'Commentaires',\n },\n sort: {\n latest: 'Plus récentes',\n likes: 'Plus aimées',\n },\n untitledPost: 'Publication',\n view: {\n media: 'Médias',\n list: 'Liste',\n },\n },\n sections: {\n defaultTitle: 'Section {n}',\n },\n seo: {\n allCategory: 'Tout',\n boardDescription: 'Forum {name}',\n allDescription: 'Forum – annonces et actualités de la communauté.',\n postFallbackTitle: 'Publication | {site}',\n postFallbackDescription: 'Forum',\n photo: 'Photo',\n postDescriptionFallback: 'Publication du forum',\n listTitle: '{name} | {site}',\n listTitleAll: 'Forum | {site}',\n listDescription: '{name} – les dernières publications.',\n listDescriptionAll: 'Forum – annonces et discussions.',\n },\n settings: {\n loading: 'Chargement des paramètres…',\n noAccess: 'Accès refusé',\n notFound: {\n title: 'Forum introuvable',\n checkAddress: 'Veuillez vérifier l’adresse.',\n checkBoardAddress: 'Veuillez vérifier l’adresse du forum.',\n },\n newBoard: {\n title: 'Ce forum n’existe pas encore',\n description: 'Remplissez les informations ci-dessous et enregistrez pour le créer avec cet ID.',\n },\n noLabel: 'Sans libellé',\n option: {\n default: 'Standard',\n },\n id: {\n label: 'ID de catégorie',\n help: 'Utilisé dans l’URL et les données',\n },\n writeRole: {\n label: 'Qui peut publier',\n help: 'Rôle minimum pour publier dans cette catégorie',\n helpShort: 'Rôle minimum pour publier',\n options: {\n user: 'Utilisateurs et plus',\n staff: 'Équipe et plus',\n admin: 'Admins uniquement',\n },\n },\n commentWriteRole: {\n label: 'Qui peut commenter',\n help: 'Rôle minimum pour commenter dans cette catégorie',\n helpShort: 'Rôle minimum pour commenter',\n hiddenFixed: 'Équipe attitrée uniquement (fixe pour les forums masqués)',\n },\n staff: {\n label: 'Équipe attitrée',\n help: 'Seuls les membres sélectionnés peuvent configurer et gérer ce forum. Laissez vide pour les admins uniquement',\n placeholder: 'Admins uniquement (aucune équipe attitrée)',\n },\n label: {\n label: 'Nom affiché',\n help: 'Le nom visible par les utilisateurs',\n },\n description: {\n label: 'Description',\n help: 'Affichée en haut du forum, entre autres',\n placeholder: 'Brève description de ce forum (facultatif)',\n },\n visibility: {\n label: 'Visibilité',\n options: {\n public: {\n label: 'Visible',\n description: 'Affiché dans la liste complète et les filtres',\n },\n hidden: {\n label: 'Masqué',\n description: 'Journal ou privé. Seule l’équipe attitrée peut commenter',\n },\n },\n },\n listView: {\n label: 'Vue de liste',\n help: 'Affichage de la liste des publications',\n options: {\n dense: 'Compact',\n video: 'Vidéo',\n },\n },\n editorType: {\n label: 'Formulaire de publication',\n help: 'Mode de rédaction des publications',\n options: {\n default: 'Rédiger un titre et un texte',\n image: 'Ajouter plusieurs photos et une couverture',\n },\n },\n locale: {\n label: 'Langue du forum',\n auto: 'Automatique (langue du site)',\n },\n autoTranslate: {\n action: \"Traduire en 10 langues\",\n manualHelp: \"Traduisez le libellé et la description ensemble, puis enregistrez pour appliquer.\",\n pending: \"Les traductions en 10 langues sont prêtes. Enregistrez pour appliquer.\",\n manualFailed: \"La traduction a échoué. Votre texte est conservé. Veuillez réessayer.\",\n label: 'Traduire en 10 langues à l’enregistrement',\n help: 'Si activé, le nom et la description sont traduits en 10 langues. Sinon, ils ne sont pas traduits. Un texte inchangé n’est pas retraduit.',\n failed: 'Les réglages sont enregistrés, mais la traduction en 10 langues a échoué. Enregistrez à nouveau.',\n ready: 'Le nom et la description sont enregistrés en 10 langues.',\n },\n action: {\n moveDown: 'Descendre',\n goToBoard: 'Aller au forum',\n deleteBoard: 'Supprimer le forum',\n create: 'Créer',\n },\n newCategoryPlaceholder: 'Nom de la nouvelle catégorie',\n savedCategory: 'Catégorie « {label} » enregistrée.',\n savedSettings: 'Paramètres du forum enregistrés.',\n created: 'Forum créé.',\n error: {\n orderFailed: 'Impossible d’enregistrer l’ordre des catégories.',\n deleteFailed: 'Impossible de supprimer le forum et ses données.',\n saveFailed: 'Impossible d’enregistrer les paramètres du forum.',\n deleteAllFailed: 'Impossible de supprimer les données du forum.',\n },\n danger: {\n title: 'Zone de danger',\n confirmLabel: 'Saisissez « {phrase} » pour confirmer',\n phrase: 'supprimer les données du forum',\n button: 'Supprimer toutes les données',\n done: 'Toutes les données du forum ont été supprimées.',\n },\n },\n shareButton: {\n copied: 'Lien copié',\n },\n signIn: {\n withGoogle: 'Se connecter avec Google',\n withApple: 'Se connecter avec Apple',\n or: 'ou',\n name: 'Nom',\n email: 'E-mail',\n password: 'Mot de passe',\n signUp: 'S’inscrire',\n toSignUp: 'Pas encore de compte ? S’inscrire',\n toSignIn: 'Déjà un compte ? Se connecter',\n },\n storage: {\n sourceTooLarge: 'L’image originale ne doit pas dépasser {max} Mo.',\n imageOnly: 'Seuls les fichiers image peuvent être importés.',\n canvasUnavailable: 'Canvas n’est pas disponible',\n compressFailed: 'Échec de la compression',\n loadFailed: 'Échec du chargement de l’image',\n },\n swipeHint: {\n title: 'Balayez vers la gauche ou la droite',\n description: 'Balayez vers la gauche pour la publication suivante, vers la droite pour la précédente.',\n },\n userCommentList: {\n loadFailed: 'Impossible de charger la liste : {error}',\n empty: 'Aucun commentaire pour l’instant.',\n blinded: 'Ce commentaire a été masqué par un administrateur.',\n likes: '{count} j’aime',\n },\n userPostList: {\n loadFailed: 'Impossible de charger la liste : {error}',\n empty: 'Aucune publication pour l’instant.',\n },\n users: {\n changeRoleFailed: 'Impossible de modifier le rôle.',\n loading: 'Chargement des utilisateurs…',\n noPermission: {\n title: 'Aucune autorisation',\n description: 'Seuls les admins du forum peuvent gérer les rôles des utilisateurs.',\n },\n empty: 'Aucun utilisateur ne s’est encore connecté au forum.',\n noName: 'Sans nom',\n moderationWarnings: '{count} avertissements de contenu',\n },\n writingAssistant: {\n loginRequired: 'Connectez-vous pour utiliser l’assistant d’écriture AI.',\n userMissing: 'Impossible de vérifier vos informations. Veuillez réessayer.',\n contentRequired: 'Saisissez d’abord un texte à traiter par l’AI.',\n customRequired: 'Saisissez une consigne de réécriture.',\n emptyResult: 'L’AI n’a pas pu produire de résultat. Veuillez réessayer.',\n translateEmpty: 'Saisissez d’abord un titre ou un texte à traduire.',\n translateTooLong: 'Un texte de plus de {limit} caractères ne peut pas être enregistré en 10 langues. Raccourcissez-le et réessayez.',\n translateIncomplete: 'Certaines langues sont revenues vides. Veuillez réessayer.',\n failed: 'La tâche AI a échoué. Veuillez réessayer.',\n actions: {\n proofread: 'Vérifier l’orthographe',\n polish: 'Améliorer le texte',\n continue: 'Continuer l’écriture',\n summarize: 'Résumer brièvement',\n translateEn: 'Traduire en anglais',\n translateKo: 'Traduire en coréen',\n translateAll: 'Traduire et enregistrer en 10 langues',\n translateSaved: 'Enregistré en 10 langues. Les lecteurs voient la traduction de leur langue.',\n translatePending: 'Les traductions en 10 langues sont prêtes. Elles sont enregistrées avec le message.',\n translateEmpty: 'Saisissez d’abord un titre ou un texte à traduire.',\n title: 'Générer un titre à partir du texte',\n custom: 'Réécrire dans un style personnalisé…',\n },\n },\n}\n\nexport default messages\n"],"mappings":"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"}