memi-board 0.51.2 → 0.52.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +297 -297
- package/dist/{ar-Dzc31QaB.js → ar-BVwpedHS.js} +23 -14
- package/dist/ar-BVwpedHS.js.map +1 -0
- package/dist/{commentImages-CV0g3ARh.js → commentImages-CzXO42gE.js} +39 -23
- package/dist/commentImages-CzXO42gE.js.map +1 -0
- package/dist/composables/useMemiBoardAutoTranslate.d.ts +1 -0
- package/dist/composables/useMemiBoardWritingAssistant.d.ts +3 -0
- package/dist/data/versionHistory.d.ts +5 -0
- package/dist/{de-Wci_gqEw.js → de-K2gYwR8U.js} +23 -14
- package/dist/de-K2gYwR8U.js.map +1 -0
- package/dist/{en-Dhe-tFzi.js → en-CmPLbFcN.js} +30 -14
- package/dist/en-CmPLbFcN.js.map +1 -0
- package/dist/{es-BHJ1VeX-.js → es-1P1miLJH.js} +23 -14
- package/dist/es-1P1miLJH.js.map +1 -0
- package/dist/{fr-aSscFSwK.js → fr-cDQCmNSc.js} +23 -14
- package/dist/fr-cDQCmNSc.js.map +1 -0
- package/dist/{id-BuUIYpdS.js → id-BzDIqeZ4.js} +23 -14
- package/dist/id-BzDIqeZ4.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +671 -466
- package/dist/index.js.map +1 -1
- package/dist/{ja-owJ_AiPl.js → ja-B2wxHGCr.js} +23 -14
- package/dist/ja-B2wxHGCr.js.map +1 -0
- package/dist/{pt-B3Uxrkz2.js → pt-BCY3OODD.js} +23 -14
- package/dist/pt-BCY3OODD.js.map +1 -0
- package/dist/runtime/components/CategorySettings.vue +37 -9
- package/dist/runtime/components/Editor.vue +9 -6
- package/dist/runtime/components/Settings.vue +198 -9
- package/dist/runtime/components/VersionHistory.vue +9 -2
- package/dist/storage.js +1 -1
- package/dist/types.d.ts +5 -0
- package/dist/utils/localizedFields.d.ts +12 -2
- package/dist/{zh-B49hHRSL.js → zh-Y824rwR6.js} +23 -14
- package/dist/zh-Y824rwR6.js.map +1 -0
- package/docs/firebase-setup.md +85 -85
- package/docs/firestore.rules.example +58 -58
- package/docs/host-integration.md +80 -80
- package/docs/internationalization.md +76 -72
- package/docs/roles-migration.md +18 -18
- package/docs/storage.rules.example +18 -18
- package/package.json +2 -2
- package/dist/ar-Dzc31QaB.js.map +0 -1
- package/dist/commentImages-CV0g3ARh.js.map +0 -1
- package/dist/de-Wci_gqEw.js.map +0 -1
- package/dist/en-Dhe-tFzi.js.map +0 -1
- package/dist/es-BHJ1VeX-.js.map +0 -1
- package/dist/fr-aSscFSwK.js.map +0 -1
- package/dist/id-BuUIYpdS.js.map +0 -1
- package/dist/ja-owJ_AiPl.js.map +0 -1
- package/dist/pt-B3Uxrkz2.js.map +0 -1
- package/dist/zh-B49hHRSL.js.map +0 -1
|
@@ -257,9 +257,9 @@ var e = {
|
|
|
257
257
|
summarize: "短く要約",
|
|
258
258
|
translateEn: "英語に翻訳",
|
|
259
259
|
translateKo: "韓国語に翻訳",
|
|
260
|
-
translateAll: "
|
|
261
|
-
translateSaved: "
|
|
262
|
-
translatePending: "
|
|
260
|
+
translateAll: "{count}言語に翻訳して保存",
|
|
261
|
+
translateSaved: "{count}言語で保存しました。ほかの言語では翻訳が表示されます。",
|
|
262
|
+
translatePending: "{count}言語の翻訳を用意しました。投稿を保存すると一緒に記録されます。",
|
|
263
263
|
translateEmpty: "翻訳するタイトルか本文を先に入力してください。",
|
|
264
264
|
title: "本文からタイトルを生成",
|
|
265
265
|
custom: "カスタムスタイルに書き換え…",
|
|
@@ -297,6 +297,7 @@ var e = {
|
|
|
297
297
|
}
|
|
298
298
|
},
|
|
299
299
|
footer: {
|
|
300
|
+
introduction: "Nuxt 4、Vue 3、TypeScriptで作り、Nuxt UIとFirebaseで投稿とコメントを自然につなぐ掲示板です。",
|
|
300
301
|
info: {
|
|
301
302
|
title: "掲示板の情報",
|
|
302
303
|
about: "この掲示板について",
|
|
@@ -541,19 +542,27 @@ var e = {
|
|
|
541
542
|
image: "複数の写真とカバー写真を登録"
|
|
542
543
|
}
|
|
543
544
|
},
|
|
545
|
+
bulk: {
|
|
546
|
+
title: "すべての掲示板に適用",
|
|
547
|
+
apply: "{count}件の掲示板に適用",
|
|
548
|
+
applyShort: "適用",
|
|
549
|
+
confirmTitle: "すべての掲示板に適用",
|
|
550
|
+
translateUntranslated: "未翻訳の掲示板を翻訳 ({count})"
|
|
551
|
+
},
|
|
552
|
+
translationLocales: { label: "翻訳する言語" },
|
|
544
553
|
locale: {
|
|
545
554
|
label: "掲示板の言語",
|
|
546
555
|
auto: "自動(サイトの言語に従う)"
|
|
547
556
|
},
|
|
548
557
|
autoTranslate: {
|
|
549
|
-
action: "
|
|
558
|
+
action: "{count}言語に翻訳",
|
|
550
559
|
manualHelp: "表示名と説明をまとめて翻訳します。翻訳後に保存して適用してください。",
|
|
551
|
-
pending: "
|
|
560
|
+
pending: "{count}言語の翻訳ができました。保存して適用してください。",
|
|
552
561
|
manualFailed: "翻訳に失敗しました。入力内容は保持されています。もう一度お試しください。",
|
|
553
|
-
label: "保存時に
|
|
554
|
-
help: "オンにすると名前と説明を
|
|
555
|
-
failed: "設定は保存しましたが、
|
|
556
|
-
ready: "名前と説明が
|
|
562
|
+
label: "保存時に{count}言語へ翻訳",
|
|
563
|
+
help: "オンにすると名前と説明を{count}言語に翻訳します。オフでは翻訳しません。文言が同じなら再翻訳しません。",
|
|
564
|
+
failed: "設定は保存しましたが、{count}言語への翻訳に失敗しました。もう一度保存してください。",
|
|
565
|
+
ready: "名前と説明が{count}言語で保存されています。"
|
|
557
566
|
},
|
|
558
567
|
action: {
|
|
559
568
|
moveDown: "下へ",
|
|
@@ -630,7 +639,7 @@ var e = {
|
|
|
630
639
|
customRequired: "どのように書き換えるか指示を入力してください。",
|
|
631
640
|
emptyResult: "AIが結果を生成できませんでした。もう一度お試しください。",
|
|
632
641
|
translateEmpty: "翻訳するタイトルか本文を先に入力してください。",
|
|
633
|
-
translateTooLong: "本文が{limit}字を超えると
|
|
642
|
+
translateTooLong: "本文が{limit}字を超えると{count}言語では保存できません。短くしてからもう一度お試しください。",
|
|
634
643
|
translateIncomplete: "一部の言語の翻訳が空でした。もう一度お試しください。",
|
|
635
644
|
failed: "AI処理に失敗しました。もう一度お試しください。",
|
|
636
645
|
actions: {
|
|
@@ -640,9 +649,9 @@ var e = {
|
|
|
640
649
|
summarize: "短く要約",
|
|
641
650
|
translateEn: "英語に翻訳",
|
|
642
651
|
translateKo: "韓国語に翻訳",
|
|
643
|
-
translateAll: "
|
|
644
|
-
translateSaved: "
|
|
645
|
-
translatePending: "
|
|
652
|
+
translateAll: "{count}言語に翻訳して保存",
|
|
653
|
+
translateSaved: "{count}言語で保存しました。ほかの言語では翻訳が表示されます。",
|
|
654
|
+
translatePending: "{count}言語の翻訳を用意しました。投稿を保存すると一緒に記録されます。",
|
|
646
655
|
translateEmpty: "翻訳するタイトルか本文を先に入力してください。",
|
|
647
656
|
title: "本文からタイトルを生成",
|
|
648
657
|
custom: "カスタムスタイルに書き換え…"
|
|
@@ -652,4 +661,4 @@ var e = {
|
|
|
652
661
|
//#endregion
|
|
653
662
|
export { e as default };
|
|
654
663
|
|
|
655
|
-
//# sourceMappingURL=ja-
|
|
664
|
+
//# sourceMappingURL=ja-B2wxHGCr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ja-B2wxHGCr.js","names":[],"sources":["../src/i18n/messages/ja.ts"],"sourcesContent":["import type { MemiBoardMessages } from '../translate'\n\n/** 짧은 화면 문구만 번역한다. 빠진 키는 en → ko 순으로 폴백된다. */\nconst messages: MemiBoardMessages = {\n attachments: {\n attach: 'ファイルを添付({count} / {max})',\n maxFiles: '最大{max}件まで添付できます。',\n },\n auth: {\n writeRestricted: 'コンテンツ警告が累積したため、投稿・コメントが一時的に制限されています。',\n strikeSuffix: '(警告 {count}/{threshold})',\n strikeRestricted: '警告が{count}回に達したため、投稿・コメントが制限されます。',\n notInitialized: '[memi-board] Firebase Authが初期化されていません。',\n },\n authorMemo: {\n tooLong: 'メモは{max}文字まで入力できます。',\n },\n authorMenu: {\n viewProfile: 'プロフィールを見る',\n viewPosts: '投稿を見る',\n viewComments: 'コメントを見る',\n memoAriaLabel: 'この投稿者についてのメモ',\n memoTitle: '自分だけのメモ',\n memoPlaceholder: 'この投稿者についてメモする…',\n bad: '悪い',\n good: '良い',\n },\n avatarCropModal: {\n title: 'プロフィール写真を切り抜き',\n description: '正方形(1:1)で表示されます。範囲を調整してください。',\n confirm: '切り抜いてアップロード',\n },\n boardSettings: {\n signInRequired: 'ログインが必要です。',\n idAndNameRequired: 'ボードIDと名前を入力してください。',\n deleteIdRequired: '削除する掲示板のIDが必要です。',\n nameRequired: 'ボード名を入力してください。',\n },\n boardUsers: {\n unsupportedRole: 'サポートされていないロールです。',\n roleDescription: {\n admin: 'ユーザーのロール、掲示板の設定、すべてのコンテンツを管理します。',\n user: '投稿とコメントができ、自分のコンテンツのみ編集・削除できます。',\n },\n },\n commentFeed: {\n empty: 'まだコメントはありません。',\n emptyLiked: 'いいねされたコメントはまだありません。',\n loadFailed: '一覧を読み込めませんでした: {error}',\n blinded: '管理者により非表示にされたコメントです。',\n },\n commentForm: {\n hiddenBoardDenied: '非表示の掲示板には担当スタッフのみコメントできます。',\n denied: 'この掲示板にコメントする権限がありません。',\n signInRequired: 'ログインが必要です。',\n writeRestricted: 'コンテンツ警告が累積したため、投稿・コメントが一時的に制限されています。',\n moderationBlocked: '投稿できない内容が含まれています。',\n replyTo: '{name}さんに返信',\n placeholder: 'コメントを入力',\n submitReply: '返信する',\n submit: 'コメントする',\n signInToComment: 'コメントするにはログインが必要です。',\n attachHint: 'ここに画像をドロップするか、クリックして選択してください。',\n attachNote: 'jpg, png, gif, webp。大きな画像は5MB以下に調整されます。',\n removeImage: '添付画像を削除',\n imageOnly: '添付できるのは jpg、png、gif、webp 画像だけです。',\n uploadFailed: '画像をアップロードできませんでした。',\n uploading: '画像をアップロードしています…',\n },\n commentItem: {\n editRestricted: 'コメントの編集が一時的に制限されています。',\n moderationBlocked: '投稿できない内容が含まれています。',\n editFailed: 'コメントを編集できませんでした。',\n blindFailed: '非表示の状態を変更できませんでした。',\n likeFailed: 'いいねを処理できませんでした。',\n blinded: '管理者により非表示にされたコメントです。',\n attachedImage: 'コメントに添付された画像',\n edit: 'コメントを編集',\n blind: 'コメントを非表示',\n unblind: 'コメントの非表示を解除',\n delete: 'コメントを削除',\n },\n commentList: {\n loading: 'コメントを読み込んでいます',\n empty: 'まだコメントはありません。',\n loadMore: 'コメントをもっと見る',\n loadingMore: 'コメントをさらに読み込んでいます',\n },\n commentThread: {\n deleteConfirm: 'このコメントを削除しますか?',\n deleteFailed: 'コメントを削除できませんでした。',\n hideReplies: '返信を非表示',\n showReplies: '返信{count}件',\n loadMoreReplies: '返信をもっと見る',\n },\n comments: {\n bodyRequired: 'コメントを入力してください。',\n bodyTooLong: 'コメントは{max}文字まで入力できます。',\n replyTargetNotFound: '返信先のコメントが見つかりません。',\n threadNotFound: 'コメントスレッドが見つかりません。',\n hasRepliesCannotDelete: '返信があるコメントは現在削除できません。',\n },\n common: {\n action: {\n cancel: 'キャンセル',\n save: '保存',\n saved: '保存済み',\n edit: '編集',\n delete: '削除',\n confirm: 'OK',\n close: '閉じる',\n add: '追加',\n more: 'もっと見る',\n prev: '前へ',\n next: '次へ',\n retry: '再試行',\n reply: '返信',\n like: 'いいね',\n unlike: 'いいねを取り消す',\n share: '共有',\n report: '通報',\n signIn: 'ログイン',\n signOut: 'ログアウト',\n write: '投稿する',\n toTop: 'トップへ',\n },\n label: {\n anonymous: '匿名',\n user: 'ユーザー',\n image: '画像',\n draft: '下書き',\n loading: '読み込み中…',\n },\n role: {\n admin: '管理者',\n staff: 'スタッフ',\n user: 'ユーザー',\n },\n date: {\n justNow: 'たった今',\n fewSecondsAgo: '数秒前',\n checking: '時刻を確認中',\n createdAt: '作成日時: {time}',\n updatedAt: '更新日時: {time}',\n },\n },\n detail: {\n deleteConfirm: 'この投稿を削除しますか?元に戻すことはできません。',\n notFound: '投稿が見つかりません。',\n draftPreview: '非公開プレビュー',\n draftNotice: 'まだ公開されていません。公開するまでは投稿者だけが閲覧できます。',\n publish: '公開する',\n notice: 'お知らせ',\n pin: 'お知らせに指定',\n unpin: 'お知らせを解除',\n backToList: '一覧に戻る',\n postNav: '投稿の移動',\n list: '一覧',\n comments: 'コメント',\n },\n editor: {\n titlePlaceholder: 'タイトル',\n contentPlaceholder: '本文を入力…「/」でブロックメニューが開きます。',\n imageContentPlaceholder: '内容を入力…',\n tagsPlaceholder: 'タグを入力してEnter',\n skipModeration: '不適切表現フィルターを無視(管理者)',\n pinNotice: 'お知らせとして固定',\n submitEdit: '編集を完了',\n submitNext: '次へ: プレビュー',\n apply: '適用',\n imageOptimizing: '画像を最適化してアップロード中…',\n cover: {\n imageLink: '画像リンク',\n addPhoto: '写真を追加',\n alt: '写真{n}',\n representative: 'カバー',\n setRepresentative: 'カバーに設定',\n setRepresentativeAria: '写真{n}をカバー写真に設定',\n remove: '写真を削除',\n add: '追加',\n uploading: 'アップロード中…',\n dropOrClick: '写真をドロップまたはクリックして追加',\n emptyHint: '複数選択可 · アップロード後にカバー写真を選択 · ドラッグで並べ替え',\n uploadTitle: 'アップロード',\n },\n uploadFailed: 'アップロード失敗',\n aiAssistant: 'AI文章アシスタント',\n insertBlock: 'ブロックを挿入',\n blockMenu: 'ブロックメニュー',\n imageDialog: {\n title: '画像を追加',\n chooseFile: 'デバイスから画像を選択',\n orLink: 'または画像リンク',\n urlLabel: '画像URL',\n previewAlt: '外部画像のプレビュー',\n addLink: 'リンクを追加',\n },\n customDialog: {\n title: 'カスタムスタイルに書き換え',\n label: 'どのように書き換えますか?',\n help: '例: 関西弁で / 丁寧な書き言葉で / 簡潔な箇条書きで',\n placeholder: '関西弁で',\n },\n aiPreview: {\n title: 'AIの結果を確認',\n currentTitle: '現在のタイトル',\n newTitle: '新しいタイトル',\n currentContent: '現在の内容',\n appendedContent: '追加される内容',\n before: '変更前',\n after: '変更後',\n },\n menu: {\n ai: 'AI',\n aiContinue: 'AIで続きを書く',\n style: 'スタイル',\n insert: '挿入',\n paragraph: '本文',\n heading1: '見出し1',\n heading2: '見出し2',\n heading3: '見出し3',\n bulletList: '箇条書きリスト',\n orderedList: '番号付きリスト',\n blockquote: '引用',\n codeBlock: 'コードブロック',\n horizontalRule: '区切り線',\n image: '画像',\n turnInto: 'ブロックの種類を変更',\n resetFormatting: '書式をリセット',\n duplicate: '複製',\n moveUp: '上に移動',\n moveDown: '下に移動',\n delete: '削除',\n },\n toolbar: {\n link: 'リンク',\n image: '画像',\n format: '書式',\n bold: '太字',\n italic: '斜体',\n underline: '下線',\n strike: '取り消し線',\n title: 'タイトル',\n heading: '見出し',\n subheading: '小見出し',\n body: '本文',\n mono: '等幅',\n bulletList: '箇条書きリスト',\n orderedList: '番号付きリスト',\n blockquote: 'ブロック引用',\n codeBlock: 'コードブロック',\n horizontalRule: '区切り線',\n clearFormatting: '書式をクリア',\n undo: '元に戻す',\n redo: 'やり直す',\n },\n ai: {\n proofread: 'スペルチェック',\n polish: '文章を整える',\n continue: '自然に続きを書く',\n summarize: '短く要約',\n translateEn: '英語に翻訳',\n translateKo: '韓国語に翻訳',\n translateAll: '{count}言語に翻訳して保存',\n translateSaved: '{count}言語で保存しました。ほかの言語では翻訳が表示されます。',\n translatePending: '{count}言語の翻訳を用意しました。投稿を保存すると一緒に記録されます。',\n translateEmpty: '翻訳するタイトルか本文を先に入力してください。',\n title: '本文からタイトルを生成',\n custom: 'カスタムスタイルに書き換え…',\n failed: 'AI処理に失敗しました。もう一度お試しください。',\n },\n youtubePrompt: 'YouTubeのリンクを入力してください。',\n errors: {\n coverMax: '写真は最大{max}枚までアップロードできます。',\n imageUrlRequired: '画像のURLを入力してください。',\n imageUrlInvalid: '正しい画像URLを入力してください。',\n imageUrlHttps: 'HTTPSの画像URLのみ使用できます。',\n imageUrlCredentials: 'ログイン情報を含むURLは使用できません。',\n imageTimeout: '画像の読み込みに時間がかかりすぎています。',\n imageNotDisplayable: '表示できない画像です。',\n editorNotReady: 'エディターを準備できませんでした。もう一度お試しください。',\n imageLinkFailed: '画像リンクを追加できませんでした。',\n imageOnly: '画像ファイルのみアップロードできます。',\n imageTooLarge: '元の画像は{mb}MB以下にしてください。',\n imageUploadFailed: '画像のアップロードに失敗しました。',\n pasteAsFile: '写真はファイルとして上のエリアに貼り付けるか、ドラッグしてください。',\n postNotFound: '投稿が見つかりません。',\n loadPermission: '投稿を読み込む権限がありません。ログイン状態を確認してください。',\n loadFailed: '投稿を読み込めませんでした: {message}',\n titleRequired: 'タイトルを入力してください。',\n photoRequired: '写真を1枚以上アップロードしてください。',\n bodyRequired: '本文にテキストを入力するか、画像を添付してください。',\n signInRequired: 'ログインが必要です。',\n boardMissing: '掲示板(ボード)が指定されていません。',\n writeRestricted: 'コンテンツ警告が累積したため、投稿・コメントが一時的に制限されています。',\n moderationBlocked: '投稿できない内容が含まれています。',\n },\n hint: {\n reviewing: '内容を確認中…',\n saving: '保存中…',\n },\n },\n footer: {\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 likes: {\n signInRequired: 'ログインが必要です。',\n commentNotFound: 'コメントが見つかりません。',\n },\n list: {\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 listViewSwitch: {\n default: '標準',\n dense: 'コンパクト',\n video: '動画',\n },\n miniComments: {\n empty: 'まだコメントはありません。',\n blinded: '管理者により非表示にされたコメントです。',\n },\n miniList: {\n empty: 'まだ投稿はありません。',\n },\n miniPicker: {\n selectedCount: '選択した投稿 {count} / {max}',\n layoutHint: '2件以上でカルーセル、4件でグリッド',\n searchPlaceholder: 'タイトルを検索',\n loading: '投稿を読み込み中…',\n noMore: '選択できる投稿はもうありません。',\n },\n miniPost: {\n empty: '選択された投稿はありません。',\n },\n moderation: {\n writeRestricted: 'コンテンツ警告が累積したため、投稿・コメントが一時的に制限されています。',\n },\n moderationPrompt: {\n localHit: '「{hit}」のような表現は使用できません。別の言葉に言い換えてください。',\n localGeneric: '暴言・卑語が含まれているため投稿できません。表現を変えてください。',\n genericBlocked: '投稿できない内容が含まれています。内容を修正してください。',\n categories: {\n abuse: '暴言・卑語・侮辱',\n spam: 'スパム・広告',\n adult: '性的・成人向けの内容',\n violence: '暴力・脅迫',\n other: '不適切な内容',\n },\n },\n moderationStrike: {\n liftSoon: 'まもなく解除',\n liftInHours: '約{hours}時間後に解除',\n liftInDays: '約{days}日後に解除',\n liftInDaysHours: '約{days}日{hours}時間後に解除',\n },\n posts: {\n boardIdRequired: '[memi-board] boardIdが必要です。',\n photoRequired: '写真をアップロードしてください。',\n bodyRequired: '本文にテキストを入力するか、画像を添付してください。',\n titleRequired: 'タイトルを入力してください。',\n },\n profile: {\n notFound: 'ユーザーが見つかりません。',\n noName: '名前なし',\n joined: '登録 {time}',\n lastVisit: '最終訪問 {time}',\n },\n profileEditModal: {\n imageOnly: '画像ファイルのみ選択できます。',\n nameRequired: '名前を入力してください。',\n saveFailed: 'プロフィールを保存できませんでした。',\n title: 'プロフィールを編集',\n changePhoto: '写真を変更',\n name: '名前',\n bio: '自己紹介',\n bioPlaceholder: '自己紹介を書いてみましょう',\n },\n reportButton: {\n failed: '通報できませんでした。',\n reported: '通報済み',\n title: '投稿を通報',\n done: '通報を受け付けました。スタッフが内容を確認します。',\n reason: '理由',\n detailPlaceholder: '詳細(任意)',\n submit: '通報する',\n },\n reportList: {\n staffOnly: '通報一覧はスタッフのみ閲覧できます。',\n loadFailed: '一覧を読み込めませんでした: {error}',\n empty: '対応待ちの通報はありません。',\n untitled: '無題の投稿',\n author: '投稿者 {name}',\n dismiss: '却下',\n confirm: '対応済み',\n },\n reports: {\n reason: {\n spam: 'スパム・広告',\n abuse: '暴言・ヘイト・嫌がらせ',\n adult: 'わいせつな内容',\n illegal: '違法な情報',\n other: 'その他',\n },\n fallbackLabel: '通報',\n signInRequired: 'ログインが必要です。',\n cannotReportOwn: '自分の投稿は通報できません。',\n reasonRequired: '通報理由を選択してください。',\n detailTooLong: '詳細は{max}文字までです。',\n },\n sectionUtil: {\n kind: {\n list: '投稿一覧',\n post: '投稿',\n comments: 'コメントまとめ',\n },\n sort: {\n latest: '新着順',\n likes: 'いいね順',\n },\n untitledPost: '投稿',\n view: {\n media: 'メディア',\n list: 'リスト',\n },\n },\n sections: {\n defaultTitle: 'セクション{n}',\n },\n seo: {\n allCategory: 'すべて',\n boardDescription: '{name}掲示板',\n allDescription: '掲示板 — お知らせやコミュニティの最新情報をチェックしましょう。',\n postFallbackTitle: '投稿 | {site}',\n postFallbackDescription: '掲示板',\n photo: '写真',\n postDescriptionFallback: '掲示板の投稿',\n listTitle: '{name}掲示板 | {site}',\n listTitleAll: '掲示板 | {site}',\n listDescription: '{name}掲示板 — 最新の投稿をチェックしましょう。',\n listDescriptionAll: '掲示板 — お知らせや話題をチェックしましょう。',\n },\n settings: {\n 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: 'URLとデータで使われる識別値',\n },\n writeRole: {\n label: '投稿権限',\n help: 'このカテゴリーに投稿できる最低ロール',\n helpShort: '投稿できる最低ロール',\n options: {\n user: '一般ユーザー以上',\n staff: 'スタッフ以上',\n admin: '管理者のみ',\n },\n },\n commentWriteRole: {\n label: 'コメント権限',\n help: 'このカテゴリーにコメントできる最低ロール',\n helpShort: 'コメントできる最低ロール',\n hiddenFixed: '担当スタッフのみ(非表示ボードでは固定)',\n },\n staff: {\n label: '担当スタッフ',\n help: '指定したスタッフだけがこのボードを設定・管理します。空欄の場合は管理者のみ',\n placeholder: '管理者のみ(スタッフ未指定)',\n },\n label: {\n label: '表示名',\n help: 'ユーザーに表示される名前',\n },\n description: {\n label: '説明',\n help: '掲示板の上部などに表示される案内文',\n placeholder: 'この掲示板の短い説明(任意)',\n },\n visibility: {\n label: '公開範囲',\n options: {\n public: {\n label: '表示',\n description: '全体の一覧・フィルターに表示',\n },\n hidden: {\n label: '非表示',\n description: '日記・非公開用。コメントは担当スタッフのみ',\n },\n },\n },\n listView: {\n label: '一覧表示',\n help: '投稿一覧の表示方法',\n options: {\n dense: 'コンパクト',\n video: '動画',\n },\n },\n editorType: {\n label: '入力フォーム',\n help: '投稿画面の作成方法',\n options: {\n default: 'タイトルと本文を入力',\n image: '複数の写真とカバー写真を登録',\n },\n },\n bulk: {\n title: 'すべての掲示板に適用',\n apply: '{count}件の掲示板に適用',\n applyShort: '適用',\n confirmTitle: 'すべての掲示板に適用',\n translateUntranslated: '未翻訳の掲示板を翻訳 ({count})',\n },\n translationLocales: {\n label: '翻訳する言語',\n },\n locale: {\n label: '掲示板の言語',\n auto: '自動(サイトの言語に従う)',\n },\n autoTranslate: {\n action: \"{count}言語に翻訳\",\n manualHelp: \"表示名と説明をまとめて翻訳します。翻訳後に保存して適用してください。\",\n pending: \"{count}言語の翻訳ができました。保存して適用してください。\",\n manualFailed: \"翻訳に失敗しました。入力内容は保持されています。もう一度お試しください。\",\n label: '保存時に{count}言語へ翻訳',\n help: 'オンにすると名前と説明を{count}言語に翻訳します。オフでは翻訳しません。文言が同じなら再翻訳しません。',\n failed: '設定は保存しましたが、{count}言語への翻訳に失敗しました。もう一度保存してください。',\n ready: '名前と説明が{count}言語で保存されています。',\n },\n action: {\n moveDown: '下へ',\n goToBoard: '掲示板へ移動',\n deleteBoard: '掲示板を削除',\n create: '作成',\n },\n newCategoryPlaceholder: '新しいカテゴリー名',\n savedCategory: '「{label}」カテゴリーを保存しました。',\n savedSettings: '掲示板の設定を保存しました。',\n created: '掲示板を作成しました。',\n error: {\n orderFailed: 'カテゴリーの順序を保存できませんでした。',\n deleteFailed: '掲示板と関連データを削除できませんでした。',\n saveFailed: '掲示板の設定を保存できませんでした。',\n deleteAllFailed: '掲示板のデータを削除できませんでした。',\n },\n danger: {\n title: '危険な操作',\n confirmLabel: '確認のため「{phrase}」と入力してください',\n phrase: '掲示板のデータを削除',\n button: 'すべてのデータを削除',\n done: '掲示板のデータをすべて削除しました。',\n },\n },\n shareButton: {\n copied: 'リンクをコピーしました',\n },\n signIn: {\n withGoogle: 'Googleでログイン',\n withApple: 'Appleでログイン',\n or: 'または',\n name: '名前',\n email: 'メールアドレス',\n password: 'パスワード',\n signUp: '新規登録',\n toSignUp: 'アカウントをお持ちでないですか?新規登録',\n toSignIn: 'すでにアカウントをお持ちですか?ログイン',\n },\n storage: {\n sourceTooLarge: '元の画像は{max}MB以下にしてください。',\n imageOnly: '画像ファイルのみアップロードできます。',\n canvasUnavailable: 'Canvasを使用できません',\n compressFailed: '圧縮に失敗しました',\n loadFailed: '画像の読み込みに失敗しました',\n },\n swipeHint: {\n title: '左右にスワイプしてみましょう',\n description: '左にスワイプすると次の投稿、右にスワイプすると前の投稿に移動します。',\n },\n userCommentList: {\n loadFailed: '一覧を読み込めませんでした: {error}',\n empty: 'コメントはまだありません。',\n blinded: '管理者により非表示にされたコメントです。',\n likes: 'いいね {count}',\n },\n userPostList: {\n loadFailed: '一覧を読み込めませんでした: {error}',\n empty: '投稿はまだありません。',\n },\n users: {\n changeRoleFailed: 'ロールを変更できませんでした。',\n loading: 'ユーザー一覧を読み込んでいます。',\n noPermission: {\n title: '権限がありません',\n description: '掲示板の管理者のみユーザーのロールを管理できます。',\n },\n empty: '掲示板にログインしたユーザーはいません。',\n noName: '名前なし',\n moderationWarnings: 'コンテンツ警告 {count}回',\n },\n writingAssistant: {\n loginRequired: 'AI文章アシスタントはログイン後に利用できます。',\n userMissing: 'ユーザー情報を確認してから、もう一度お試しください。',\n contentRequired: 'AIで整える内容を先に入力してください。',\n customRequired: 'どのように書き換えるか指示を入力してください。',\n emptyResult: 'AIが結果を生成できませんでした。もう一度お試しください。',\n translateEmpty: '翻訳するタイトルか本文を先に入力してください。',\n translateTooLong: '本文が{limit}字を超えると{count}言語では保存できません。短くしてからもう一度お試しください。',\n translateIncomplete: '一部の言語の翻訳が空でした。もう一度お試しください。',\n failed: 'AI処理に失敗しました。もう一度お試しください。',\n actions: {\n proofread: 'スペルチェック',\n polish: '文章を整える',\n continue: '自然に続きを書く',\n summarize: '短く要約',\n translateEn: '英語に翻訳',\n translateKo: '韓国語に翻訳',\n translateAll: '{count}言語に翻訳して保存',\n translateSaved: '{count}言語で保存しました。ほかの言語では翻訳が表示されます。',\n translatePending: '{count}言語の翻訳を用意しました。投稿を保存すると一緒に記録されます。',\n translateEmpty: '翻訳するタイトルか本文を先に入力してください。',\n title: '本文からタイトルを生成',\n custom: 'カスタムスタイルに書き換え…',\n },\n },\n}\n\nexport default messages\n"],"mappings":"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"}
|
|
@@ -257,9 +257,9 @@ var e = {
|
|
|
257
257
|
summarize: "Resumir brevemente",
|
|
258
258
|
translateEn: "Traduzir para inglês",
|
|
259
259
|
translateKo: "Traduzir para coreano",
|
|
260
|
-
translateAll: "Traduzir e salvar em
|
|
261
|
-
translateSaved: "Salvo em
|
|
262
|
-
translatePending: "As traduções para
|
|
260
|
+
translateAll: "Traduzir e salvar em {count} idiomas",
|
|
261
|
+
translateSaved: "Salvo em {count} idiomas. Quem lê vê a tradução do seu idioma.",
|
|
262
|
+
translatePending: "As traduções para {count} idiomas estão prontas. Elas são salvas com a publicação.",
|
|
263
263
|
translateEmpty: "Digite primeiro um título ou um texto para traduzir.",
|
|
264
264
|
title: "Gerar título a partir do texto",
|
|
265
265
|
custom: "Reescrever com um estilo personalizado…",
|
|
@@ -297,6 +297,7 @@ var e = {
|
|
|
297
297
|
}
|
|
298
298
|
},
|
|
299
299
|
footer: {
|
|
300
|
+
introduction: "Um fórum feito com Nuxt 4, Vue 3 e TypeScript que, com Nuxt UI e Firebase, mantém publicações e comentários fluindo naturalmente.",
|
|
300
301
|
info: {
|
|
301
302
|
title: "Informações do fórum",
|
|
302
303
|
about: "Sobre este fórum",
|
|
@@ -541,19 +542,27 @@ var e = {
|
|
|
541
542
|
image: "Adicionar várias fotos e uma foto de capa"
|
|
542
543
|
}
|
|
543
544
|
},
|
|
545
|
+
bulk: {
|
|
546
|
+
title: "Aplicar a todos os fóruns",
|
|
547
|
+
apply: "Aplicar a {count} fóruns",
|
|
548
|
+
applyShort: "Aplicar",
|
|
549
|
+
confirmTitle: "Aplicar a todos os fóruns",
|
|
550
|
+
translateUntranslated: "Traduzir fóruns sem tradução ({count})"
|
|
551
|
+
},
|
|
552
|
+
translationLocales: { label: "Idiomas de tradução" },
|
|
544
553
|
locale: {
|
|
545
554
|
label: "Idioma do fórum",
|
|
546
555
|
auto: "Automático (seguir o idioma do site)"
|
|
547
556
|
},
|
|
548
557
|
autoTranslate: {
|
|
549
|
-
action: "Traduzir para
|
|
558
|
+
action: "Traduzir para {count} idiomas",
|
|
550
559
|
manualHelp: "Traduza o nome e a descrição juntos e salve para aplicar.",
|
|
551
|
-
pending: "As traduções para
|
|
560
|
+
pending: "As traduções para {count} idiomas estão prontas. Salve para aplicar.",
|
|
552
561
|
manualFailed: "A tradução falhou. Seu texto foi mantido. Tente novamente.",
|
|
553
|
-
label: "Traduzir para
|
|
554
|
-
help: "Quando ligado, o nome e a descrição são traduzidos para
|
|
555
|
-
failed: "As configurações foram salvas, mas a tradução para
|
|
556
|
-
ready: "O nome e a descrição estão salvos em
|
|
562
|
+
label: "Traduzir para {count} idiomas ao salvar",
|
|
563
|
+
help: "Quando ligado, o nome e a descrição são traduzidos para {count} idiomas. Quando desligado, não são traduzidos. Texto inalterado não é traduzido de novo.",
|
|
564
|
+
failed: "As configurações foram salvas, mas a tradução para {count} idiomas falhou. Salve novamente.",
|
|
565
|
+
ready: "O nome e a descrição estão salvos em {count} idiomas."
|
|
557
566
|
},
|
|
558
567
|
action: {
|
|
559
568
|
moveDown: "Para baixo",
|
|
@@ -630,7 +639,7 @@ var e = {
|
|
|
630
639
|
customRequired: "Escreva uma instrução de como reescrever.",
|
|
631
640
|
emptyResult: "A AI não conseguiu gerar um resultado. Tente novamente.",
|
|
632
641
|
translateEmpty: "Digite primeiro um título ou um texto para traduzir.",
|
|
633
|
-
translateTooLong: "Textos com mais de {limit} caracteres não podem ser salvos em
|
|
642
|
+
translateTooLong: "Textos com mais de {limit} caracteres não podem ser salvos em {count} idiomas. Encurte e tente de novo.",
|
|
634
643
|
translateIncomplete: "Alguns idiomas voltaram vazios. Tente novamente.",
|
|
635
644
|
failed: "A tarefa de AI falhou. Tente novamente.",
|
|
636
645
|
actions: {
|
|
@@ -640,9 +649,9 @@ var e = {
|
|
|
640
649
|
summarize: "Resumir",
|
|
641
650
|
translateEn: "Traduzir para inglês",
|
|
642
651
|
translateKo: "Traduzir para coreano",
|
|
643
|
-
translateAll: "Traduzir e salvar em
|
|
644
|
-
translateSaved: "Salvo em
|
|
645
|
-
translatePending: "As traduções para
|
|
652
|
+
translateAll: "Traduzir e salvar em {count} idiomas",
|
|
653
|
+
translateSaved: "Salvo em {count} idiomas. Quem lê vê a tradução do seu idioma.",
|
|
654
|
+
translatePending: "As traduções para {count} idiomas estão prontas. Elas são salvas com a publicação.",
|
|
646
655
|
translateEmpty: "Digite primeiro um título ou um texto para traduzir.",
|
|
647
656
|
title: "Gerar título a partir do texto",
|
|
648
657
|
custom: "Reescrever com um estilo personalizado…"
|
|
@@ -652,4 +661,4 @@ var e = {
|
|
|
652
661
|
//#endregion
|
|
653
662
|
export { e as default };
|
|
654
663
|
|
|
655
|
-
//# sourceMappingURL=pt-
|
|
664
|
+
//# sourceMappingURL=pt-BCY3OODD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pt-BCY3OODD.js","names":[],"sources":["../src/i18n/messages/pt.ts"],"sourcesContent":["import type { MemiBoardMessages } from '../translate'\n\n/** 짧은 화면 문구만 번역한다. 빠진 키는 en → ko 순으로 폴백된다. */\nconst messages: MemiBoardMessages = {\n attachments: {\n attach: 'Anexar arquivos ({count} / {max})',\n maxFiles: 'Você pode anexar até {max} arquivos.',\n },\n auth: {\n writeRestricted: 'Publicar e comentar está temporariamente restrito por causa de avisos de conteúdo acumulados.',\n strikeSuffix: ' (Aviso {count}/{threshold})',\n strikeRestricted: ' Você atingiu {count} avisos, então publicar e comentar está restrito.',\n notInitialized: '[memi-board] O Firebase Auth não foi inicializado.',\n },\n authorMemo: {\n tooLong: 'As notas podem ter até {max} caracteres.',\n },\n authorMenu: {\n viewProfile: 'Ver perfil',\n viewPosts: 'Ver publicações',\n viewComments: 'Ver comentários',\n memoAriaLabel: 'Nota sobre este autor',\n memoTitle: 'Nota privada',\n memoPlaceholder: 'Anote algo sobre este autor…',\n bad: 'Ruim',\n good: 'Bom',\n },\n avatarCropModal: {\n title: 'Recortar foto do perfil',\n description: 'Exibida em formato quadrado (1:1). Ajuste a área.',\n confirm: 'Recortar e enviar',\n },\n boardSettings: {\n signInRequired: 'Faça login.',\n idAndNameRequired: 'Informe um ID e um nome para o fórum.',\n deleteIdRequired: 'É necessário o ID do fórum para excluí-lo.',\n nameRequired: 'Informe um nome para o fórum.',\n },\n boardUsers: {\n unsupportedRole: 'Função não suportada.',\n roleDescription: {\n admin: 'Gerencia as funções dos usuários, as configurações do fórum e todo o conteúdo.',\n user: 'Pode escrever publicações e comentários, e editar ou excluir apenas o próprio conteúdo.',\n },\n },\n commentFeed: {\n empty: 'Ainda não há comentários.',\n emptyLiked: 'Ainda não há comentários curtidos.',\n loadFailed: 'Não foi possível carregar a lista: {error}',\n blinded: 'Este comentário foi ocultado por um administrador.',\n },\n commentForm: {\n hiddenBoardDenied: 'Somente a equipe responsável pode comentar em fóruns ocultos.',\n denied: 'Você não tem permissão para comentar neste fórum.',\n signInRequired: 'Faça login.',\n writeRestricted: 'Publicar está temporariamente restrito por causa de avisos de conteúdo acumulados.',\n moderationBlocked: 'Há conteúdo que não pode ser publicado.',\n replyTo: 'Responder a {name}',\n placeholder: 'Escreva um comentário',\n submitReply: 'Responder',\n submit: 'Comentar',\n signInToComment: 'Faça login para deixar um comentário.',\n attachHint: 'Solte uma imagem aqui ou clique para escolher uma.',\n attachNote: 'jpg, png, gif, webp. Imagens grandes são reduzidas para 5MB ou menos.',\n removeImage: 'Remover imagem anexada',\n imageOnly: 'Só é possível anexar imagens jpg, png, gif e webp.',\n uploadFailed: 'Não foi possível enviar a imagem.',\n uploading: 'Enviando imagem…',\n },\n commentItem: {\n editRestricted: 'A edição de comentários está temporariamente restrita.',\n moderationBlocked: 'Há conteúdo que não pode ser publicado.',\n editFailed: 'Não foi possível atualizar o comentário.',\n blindFailed: 'Não foi possível alterar o estado de ocultação.',\n likeFailed: 'Não foi possível processar a curtida.',\n blinded: 'Este comentário foi ocultado por um administrador.',\n attachedImage: 'Imagem anexada ao comentário',\n edit: 'Editar comentário',\n blind: 'Ocultar comentário',\n unblind: 'Reexibir comentário',\n delete: 'Excluir comentário',\n },\n commentList: {\n loading: 'Carregando comentários',\n empty: 'Ainda não há comentários.',\n loadMore: 'Mais comentários',\n loadingMore: 'Carregando mais comentários',\n },\n commentThread: {\n deleteConfirm: 'Excluir este comentário?',\n deleteFailed: 'Não foi possível excluir o comentário.',\n hideReplies: 'Ocultar respostas',\n showReplies: '{count} respostas',\n loadMoreReplies: 'Mais respostas',\n },\n comments: {\n bodyRequired: 'Escreva um comentário.',\n bodyTooLong: 'Os comentários podem ter até {max} caracteres.',\n replyTargetNotFound: 'O comentário que você está respondendo não foi encontrado.',\n threadNotFound: 'A conversa de comentários não foi encontrada.',\n hasRepliesCannotDelete: 'No momento, não é possível excluir comentários com respostas.',\n },\n common: {\n action: {\n cancel: 'Cancelar',\n save: 'Salvar',\n saved: 'Salvo',\n edit: 'Editar',\n delete: 'Excluir',\n confirm: 'OK',\n close: 'Fechar',\n add: 'Adicionar',\n more: 'Ver mais',\n prev: 'Anterior',\n next: 'Próximo',\n retry: 'Tentar novamente',\n reply: 'Responder',\n like: 'Curtir',\n unlike: 'Descurtir',\n share: 'Compartilhar',\n report: 'Denunciar',\n signIn: 'Entrar',\n signOut: 'Sair',\n write: 'Escrever',\n toTop: 'Topo',\n },\n label: {\n anonymous: 'Anônimo',\n user: 'Usuário',\n image: 'Imagem',\n draft: 'Rascunho',\n loading: 'Carregando…',\n },\n role: {\n admin: 'Administrador',\n staff: 'Equipe',\n user: 'Usuário',\n },\n date: {\n justNow: 'Agora mesmo',\n fewSecondsAgo: 'Há alguns segundos',\n checking: 'Verificando horário',\n createdAt: 'Criado: {time}',\n updatedAt: 'Atualizado: {time}',\n },\n },\n detail: {\n deleteConfirm: 'Excluir esta publicação? Isso não pode ser desfeito.',\n notFound: 'Publicação não encontrada.',\n draftPreview: 'Prévia não publicada',\n draftNotice: 'Esta publicação ainda não foi publicada. Só você pode vê-la até publicá-la.',\n publish: 'Publicar',\n notice: 'Aviso',\n pin: 'Fixar como aviso',\n unpin: 'Remover aviso',\n backToList: 'Voltar à lista',\n postNav: 'Navegação entre publicações',\n list: 'Lista',\n comments: 'Comentários',\n },\n editor: {\n titlePlaceholder: 'Título',\n contentPlaceholder: 'Escreva algo… Digite / para abrir o menu de blocos.',\n imageContentPlaceholder: 'Escreva algo…',\n tagsPlaceholder: 'Digite uma tag e pressione Enter',\n skipModeration: 'Ignorar filtro de palavrões (admin)',\n pinNotice: 'Fixar como aviso',\n submitEdit: 'Salvar alterações',\n submitNext: 'Próximo: prévia',\n apply: 'Aplicar',\n imageOptimizing: 'Otimizando e enviando a imagem…',\n cover: {\n imageLink: 'Link da imagem',\n addPhoto: 'Adicionar fotos',\n alt: 'Foto {n}',\n representative: 'Capa',\n setRepresentative: 'Usar como capa',\n setRepresentativeAria: 'Usar a foto {n} como capa',\n remove: 'Remover foto',\n add: 'Adicionar',\n uploading: 'Enviando…',\n dropOrClick: 'Solte fotos ou clique para adicionar',\n emptyHint: 'Selecione várias · Escolha a capa após o envio · Arraste para reordenar',\n uploadTitle: 'Enviar',\n },\n uploadFailed: 'Falha no envio',\n aiAssistant: 'Assistente de escrita com AI',\n insertBlock: 'Inserir bloco',\n blockMenu: 'Menu de blocos',\n imageDialog: {\n title: 'Adicionar imagem',\n chooseFile: 'Escolher imagem do dispositivo',\n orLink: 'ou link da imagem',\n urlLabel: 'URL da imagem',\n previewAlt: 'Prévia da imagem externa',\n addLink: 'Adicionar link',\n },\n customDialog: {\n title: 'Reescrever com um estilo personalizado',\n label: 'Como você quer reescrever?',\n help: 'ex.: em tom descontraído / em estilo formal / em tópicos concisos',\n placeholder: 'Em tom descontraído',\n },\n aiPreview: {\n title: 'Revisar resultado da AI',\n currentTitle: 'Título atual',\n newTitle: 'Novo título',\n currentContent: 'Conteúdo atual',\n appendedContent: 'Conteúdo a adicionar',\n before: 'Antes',\n after: 'Depois',\n },\n menu: {\n ai: 'AI',\n aiContinue: 'Continuar com AI',\n style: 'Estilo',\n insert: 'Inserir',\n paragraph: 'Parágrafo',\n heading1: 'Título 1',\n heading2: 'Título 2',\n heading3: 'Título 3',\n bulletList: 'Lista com marcadores',\n orderedList: 'Lista numerada',\n blockquote: 'Citação',\n codeBlock: 'Bloco de código',\n horizontalRule: 'Divisor',\n image: 'Imagem',\n turnInto: 'Transformar em',\n resetFormatting: 'Redefinir formatação',\n duplicate: 'Duplicar',\n moveUp: 'Mover para cima',\n moveDown: 'Mover para baixo',\n delete: 'Excluir',\n },\n toolbar: {\n link: 'Link',\n image: 'Imagem',\n format: 'Formatar',\n bold: 'Negrito',\n italic: 'Itálico',\n underline: 'Sublinhado',\n strike: 'Tachado',\n title: 'Título',\n heading: 'Cabeçalho',\n subheading: 'Subtítulo',\n body: 'Corpo',\n mono: 'Monoespaçado',\n bulletList: 'Lista com marcadores',\n orderedList: 'Lista numerada',\n blockquote: 'Citação em bloco',\n codeBlock: 'Bloco de código',\n horizontalRule: 'Divisor',\n clearFormatting: 'Limpar formatação',\n undo: 'Desfazer',\n redo: 'Refazer',\n },\n ai: {\n proofread: 'Verificar ortografia',\n polish: 'Aprimorar texto',\n continue: 'Continuar escrevendo',\n summarize: 'Resumir brevemente',\n translateEn: 'Traduzir para inglês',\n translateKo: 'Traduzir para coreano',\n translateAll: 'Traduzir e salvar em {count} idiomas',\n translateSaved: 'Salvo em {count} idiomas. Quem lê vê a tradução do seu idioma.',\n translatePending: 'As traduções para {count} idiomas estão prontas. Elas são salvas com a publicação.',\n translateEmpty: 'Digite primeiro um título ou um texto para traduzir.',\n title: 'Gerar título a partir do texto',\n custom: 'Reescrever com um estilo personalizado…',\n failed: 'A tarefa de AI falhou. Tente novamente.',\n },\n youtubePrompt: 'Insira um link do YouTube.',\n errors: {\n coverMax: 'Você pode enviar até {max} fotos.',\n imageUrlRequired: 'Insira uma URL de imagem.',\n imageUrlInvalid: 'Insira uma URL de imagem válida.',\n imageUrlHttps: 'Somente URLs de imagem HTTPS são permitidas.',\n imageUrlCredentials: 'URLs com dados de login não são permitidas.',\n imageTimeout: 'A imagem está demorando demais para carregar.',\n imageNotDisplayable: 'Não é possível exibir esta imagem.',\n editorNotReady: 'O editor não está pronto. Tente novamente.',\n imageLinkFailed: 'Não foi possível adicionar o link da imagem.',\n imageOnly: 'Somente arquivos de imagem podem ser enviados.',\n imageTooLarge: 'As imagens originais devem ter {mb}MB ou menos.',\n imageUploadFailed: 'Falha ao enviar a imagem.',\n pasteAsFile: 'Cole ou arraste as fotos como arquivos na área acima.',\n postNotFound: 'Publicação não encontrada.',\n loadPermission: 'Você não tem permissão para carregar esta publicação. Verifique se você fez login.',\n loadFailed: 'Não foi possível carregar a publicação: {message}',\n titleRequired: 'Insira um título.',\n photoRequired: 'Envie pelo menos uma foto.',\n bodyRequired: 'Escreva algum texto ou anexe uma imagem.',\n signInRequired: 'É necessário fazer login.',\n boardMissing: 'Nenhum fórum foi especificado.',\n writeRestricted: 'Publicar e comentar está temporariamente restrito por causa de avisos de conteúdo acumulados.',\n moderationBlocked: 'Há conteúdo que não pode ser publicado.',\n },\n hint: {\n reviewing: 'Revisando o conteúdo…',\n saving: 'Salvando…',\n },\n },\n footer: {\n introduction: 'Um fórum feito com Nuxt 4, Vue 3 e TypeScript que, com Nuxt UI e Firebase, mantém publicações e comentários fluindo naturalmente.',\n info: {\n title: 'Informações do fórum',\n about: 'Sobre este fórum',\n history: 'Histórico de versões',\n },\n stack: {\n ui: 'Interface e experiência',\n data: 'Dados e login',\n writing: 'Escrita e praticidade',\n },\n },\n likes: {\n signInRequired: 'Faça login.',\n commentNotFound: 'Comentário não encontrado.',\n },\n list: {\n settings: 'Configurações',\n loadFailed: 'Não foi possível carregar a lista: {error}',\n empty: 'Ainda não há publicações.',\n notice: 'Aviso',\n photo: 'Foto',\n likeCount: 'Curtidas {count}',\n info: {\n title: 'Informações do fórum',\n about: 'Sobre este fórum',\n history: 'Histórico de versões',\n },\n stack: {\n framework: 'Framework e linguagem',\n ui: 'UI e estilos',\n backend: 'Backend e dados',\n },\n tech: {\n nuxt: 'Framework SSR baseado em Vue',\n vue: 'Composition API · script setup',\n typescript: 'Dados e componentes com tipagem segura',\n nuxtUi: 'UI de fórum, formulários e modais',\n tailwind: 'Estilos responsivos · claro/escuro',\n lucide: 'Ícones leves e consistentes',\n dayjs: 'Datas legíveis e tempos relativos',\n firestore: 'Banco de dados em tempo real para publicações e comentários',\n auth: 'Login e permissões seguros',\n storage: 'Armazenamento de imagens e anexos',\n vuefire: 'Conexão em tempo real entre Nuxt e Firebase',\n },\n },\n listViewSwitch: {\n default: 'Padrão',\n dense: 'Compacta',\n video: 'Vídeo',\n },\n miniComments: {\n empty: 'Ainda não há comentários.',\n blinded: 'Este comentário foi ocultado por um administrador.',\n },\n miniList: {\n empty: 'Ainda não há publicações.',\n },\n miniPicker: {\n selectedCount: 'Selecionadas {count} / {max}',\n layoutHint: '2 ou mais aparecem em carrossel; 4, em grade',\n searchPlaceholder: 'Buscar títulos',\n loading: 'Carregando publicações…',\n noMore: 'Não há mais publicações para escolher.',\n },\n miniPost: {\n empty: 'Nenhuma publicação selecionada.',\n },\n moderation: {\n writeRestricted: 'Publicar e comentar está temporariamente restrito por causa de avisos de conteúdo acumulados.',\n },\n moderationPrompt: {\n localHit: 'Expressões como “{hit}” não são permitidas. Reescreva o texto.',\n localGeneric: 'Há palavrões no texto, então não é possível publicar. Reescreva o texto.',\n genericBlocked: 'Há conteúdo que não pode ser publicado. Edite o texto.',\n categories: {\n abuse: 'palavrões ou insultos',\n spam: 'spam ou publicidade',\n adult: 'conteúdo sexual ou adulto',\n violence: 'violência ou ameaças',\n other: 'conteúdo impróprio',\n },\n },\n moderationStrike: {\n liftSoon: 'liberado em breve',\n liftInHours: 'liberado em cerca de {hours} h',\n liftInDays: 'liberado em cerca de {days} d',\n liftInDaysHours: 'liberado em cerca de {days} d {hours} h',\n },\n posts: {\n boardIdRequired: '[memi-board] boardId é obrigatório.',\n photoRequired: 'Adicione uma foto.',\n bodyRequired: 'Escreva algum texto ou anexe uma imagem.',\n titleRequired: 'Insira um título.',\n },\n profile: {\n notFound: 'Usuário não encontrado.',\n noName: 'Sem nome',\n joined: 'Entrou {time}',\n lastVisit: 'Visto por último {time}',\n },\n profileEditModal: {\n imageOnly: 'Somente arquivos de imagem podem ser selecionados.',\n nameRequired: 'Insira um nome.',\n saveFailed: 'Não foi possível salvar o perfil.',\n title: 'Editar perfil',\n changePhoto: 'Alterar foto',\n name: 'Nome',\n bio: 'Bio',\n bioPlaceholder: 'Conte um pouco sobre você',\n },\n reportButton: {\n failed: 'Não foi possível enviar a denúncia.',\n reported: 'Denunciado',\n title: 'Denunciar publicação',\n done: 'Denúncia recebida. A equipe vai analisá-la.',\n reason: 'Motivo',\n detailPlaceholder: 'Detalhes (opcional)',\n submit: 'Denunciar',\n },\n reportList: {\n staffOnly: 'Somente a equipe pode ver as denúncias.',\n loadFailed: 'Não foi possível carregar a lista: {error}',\n empty: 'Nenhuma denúncia pendente.',\n untitled: 'Publicação sem título',\n author: 'por {name}',\n dismiss: 'Descartar',\n confirm: 'Resolver',\n },\n reports: {\n reason: {\n spam: 'Spam / publicidade',\n abuse: 'Ofensa / ódio / assédio',\n adult: 'Conteúdo sexual',\n illegal: 'Conteúdo ilegal',\n other: 'Outro',\n },\n fallbackLabel: 'Denúncia',\n signInRequired: 'Faça login.',\n cannotReportOwn: 'Você não pode denunciar sua própria publicação.',\n reasonRequired: 'Selecione um motivo.',\n detailTooLong: 'Os detalhes podem ter até {max} caracteres.',\n },\n sectionUtil: {\n kind: {\n list: 'Lista de publicações',\n post: 'Publicações',\n comments: 'Comentários',\n },\n sort: {\n latest: 'Mais recentes',\n likes: 'Mais curtidas',\n },\n untitledPost: 'Publicação',\n view: {\n media: 'Mídia',\n list: 'Lista',\n },\n },\n sections: {\n defaultTitle: 'Seção {n}',\n },\n seo: {\n allCategory: 'Tudo',\n boardDescription: 'Fórum {name}',\n allDescription: 'Fórum: avisos e novidades da comunidade.',\n postFallbackTitle: 'Publicação | {site}',\n postFallbackDescription: 'Fórum',\n photo: 'Foto',\n postDescriptionFallback: 'Publicação do fórum',\n listTitle: '{name} | {site}',\n listTitleAll: 'Fórum | {site}',\n listDescription: '{name}: confira as publicações mais recentes.',\n listDescriptionAll: 'Fórum: avisos e histórias.',\n },\n settings: {\n loading: 'Carregando configurações…',\n noAccess: 'Você não tem acesso',\n notFound: {\n title: 'Fórum não encontrado',\n checkAddress: 'Verifique o endereço.',\n checkBoardAddress: 'Verifique o endereço do fórum.',\n },\n newBoard: {\n title: 'Este fórum ainda não existe',\n description: 'Preencha os dados abaixo e salve para criá-lo com este ID.',\n },\n noLabel: 'Sem rótulo',\n option: {\n default: 'Padrão',\n },\n id: {\n label: 'ID da categoria',\n help: 'Usado na URL e nos dados',\n },\n writeRole: {\n label: 'Quem pode publicar',\n help: 'Função mínima necessária para publicar nesta categoria',\n helpShort: 'Função mínima necessária para publicar',\n options: {\n user: 'Usuários ou acima',\n staff: 'Equipe ou acima',\n admin: 'Somente administradores',\n },\n },\n commentWriteRole: {\n label: 'Quem pode comentar',\n help: 'Função mínima necessária para comentar nesta categoria',\n helpShort: 'Função mínima necessária para comentar',\n hiddenFixed: 'Somente a equipe responsável (fixo em fóruns ocultos)',\n },\n staff: {\n label: 'Equipe responsável',\n help: 'Somente a equipe selecionada pode configurar e gerenciar este fórum. Deixe vazio para apenas administradores',\n placeholder: 'Somente administradores (sem equipe definida)',\n },\n label: {\n label: 'Nome de exibição',\n help: 'O nome que os usuários veem',\n },\n description: {\n label: 'Descrição',\n help: 'Exibida no topo do fórum e em outros lugares',\n placeholder: 'Uma breve descrição deste fórum (opcional)',\n },\n visibility: {\n label: 'Visibilidade',\n options: {\n public: {\n label: 'Visível',\n description: 'Exibido na lista completa e nos filtros',\n },\n hidden: {\n label: 'Oculto',\n description: 'Diário ou privado. Somente a equipe responsável pode comentar',\n },\n },\n },\n listView: {\n label: 'Visualização da lista',\n help: 'Como a lista de publicações é exibida',\n options: {\n dense: 'Compacta',\n video: 'Vídeo',\n },\n },\n editorType: {\n label: 'Formulário de publicação',\n help: 'Como as publicações são escritas',\n options: {\n default: 'Escrever um título e um texto',\n image: 'Adicionar várias fotos e uma foto de capa',\n },\n },\n bulk: {\n title: 'Aplicar a todos os fóruns',\n apply: 'Aplicar a {count} fóruns',\n applyShort: 'Aplicar',\n confirmTitle: 'Aplicar a todos os fóruns',\n translateUntranslated: 'Traduzir fóruns sem tradução ({count})',\n },\n translationLocales: {\n label: 'Idiomas de tradução',\n },\n locale: {\n label: 'Idioma do fórum',\n auto: 'Automático (seguir o idioma do site)',\n },\n autoTranslate: {\n action: \"Traduzir para {count} idiomas\",\n manualHelp: \"Traduza o nome e a descrição juntos e salve para aplicar.\",\n pending: \"As traduções para {count} idiomas estão prontas. Salve para aplicar.\",\n manualFailed: \"A tradução falhou. Seu texto foi mantido. Tente novamente.\",\n label: 'Traduzir para {count} idiomas ao salvar',\n help: 'Quando ligado, o nome e a descrição são traduzidos para {count} idiomas. Quando desligado, não são traduzidos. Texto inalterado não é traduzido de novo.',\n failed: 'As configurações foram salvas, mas a tradução para {count} idiomas falhou. Salve novamente.',\n ready: 'O nome e a descrição estão salvos em {count} idiomas.',\n },\n action: {\n moveDown: 'Para baixo',\n goToBoard: 'Ir para o fórum',\n deleteBoard: 'Excluir fórum',\n create: 'Criar',\n },\n newCategoryPlaceholder: 'Nome da nova categoria',\n savedCategory: 'Categoria “{label}” salva.',\n savedSettings: 'Configurações do fórum salvas.',\n created: 'Fórum criado.',\n error: {\n orderFailed: 'Não foi possível salvar a ordem das categorias.',\n deleteFailed: 'Não foi possível excluir o fórum e seus dados.',\n saveFailed: 'Não foi possível salvar as configurações do fórum.',\n deleteAllFailed: 'Não foi possível excluir os dados do fórum.',\n },\n danger: {\n title: 'Zona de perigo',\n confirmLabel: 'Digite “{phrase}” para confirmar',\n phrase: 'excluir dados do fórum',\n button: 'Excluir todos os dados',\n done: 'Todos os dados do fórum foram excluídos.',\n },\n },\n shareButton: {\n copied: 'Link copiado',\n },\n signIn: {\n withGoogle: 'Entrar com o Google',\n withApple: 'Entrar com a Apple',\n or: 'ou',\n name: 'Nome',\n email: 'E-mail',\n password: 'Senha',\n signUp: 'Cadastrar-se',\n toSignUp: 'Não tem uma conta? Cadastre-se',\n toSignIn: 'Já tem uma conta? Entrar',\n },\n storage: {\n sourceTooLarge: 'A imagem original deve ter {max}MB ou menos.',\n imageOnly: 'Somente arquivos de imagem podem ser enviados.',\n canvasUnavailable: 'Canvas não está disponível',\n compressFailed: 'Falha na compressão',\n loadFailed: 'Falha ao carregar a imagem',\n },\n swipeHint: {\n title: 'Experimente deslizar para os lados',\n description: 'Deslize para a esquerda para ver a próxima publicação e para a direita para ver a anterior.',\n },\n userCommentList: {\n loadFailed: 'Não foi possível carregar a lista: {error}',\n empty: 'Ainda não há comentários.',\n blinded: 'Este comentário foi ocultado por um administrador.',\n likes: '{count} curtidas',\n },\n userPostList: {\n loadFailed: 'Não foi possível carregar a lista: {error}',\n empty: 'Ainda não há publicações.',\n },\n users: {\n changeRoleFailed: 'Não foi possível alterar a função.',\n loading: 'Carregando usuários…',\n noPermission: {\n title: 'Sem permissão',\n description: 'Somente administradores do fórum podem gerenciar as funções dos usuários.',\n },\n empty: 'Nenhum usuário fez login no fórum ainda.',\n noName: 'Sem nome',\n moderationWarnings: '{count} avisos de conteúdo',\n },\n writingAssistant: {\n loginRequired: 'Faça login para usar o assistente de escrita com AI.',\n userMissing: 'Não foi possível verificar suas informações de usuário. Tente novamente.',\n contentRequired: 'Primeiro, escreva algum conteúdo para a AI trabalhar.',\n customRequired: 'Escreva uma instrução de como reescrever.',\n emptyResult: 'A AI não conseguiu gerar um resultado. Tente novamente.',\n translateEmpty: 'Digite primeiro um título ou um texto para traduzir.',\n translateTooLong: 'Textos com mais de {limit} caracteres não podem ser salvos em {count} idiomas. Encurte e tente de novo.',\n translateIncomplete: 'Alguns idiomas voltaram vazios. Tente novamente.',\n failed: 'A tarefa de AI falhou. Tente novamente.',\n actions: {\n proofread: 'Verificar ortografia',\n polish: 'Aprimorar frases',\n continue: 'Continuar escrevendo',\n summarize: 'Resumir',\n translateEn: 'Traduzir para inglês',\n translateKo: 'Traduzir para coreano',\n translateAll: 'Traduzir e salvar em {count} idiomas',\n translateSaved: 'Salvo em {count} idiomas. Quem lê vê a tradução do seu idioma.',\n translatePending: 'As traduções para {count} idiomas estão prontas. Elas são salvas com a publicação.',\n translateEmpty: 'Digite primeiro um título ou um texto para traduzir.',\n title: 'Gerar título a partir do texto',\n custom: 'Reescrever com um estilo personalizado…',\n },\n },\n}\n\nexport default messages\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
2
|
import { computed, onMounted, ref, watch } from 'vue'
|
|
3
|
-
import { boardCopyIsTranslated, MEMI_BOARD_LOCALES, useMemiBoardAuth, useMemiBoardI18n, useMemiBoardSettings, useMemiBoardUsers } from 'memi-board/runtime'
|
|
3
|
+
import { boardCopyIsTranslated, boardTranslationLocales, MEMI_BOARD_LOCALES, useMemiBoardAuth, useMemiBoardI18n, useMemiBoardSettings, useMemiBoardUsers } from 'memi-board/runtime'
|
|
4
4
|
import type { BoardCategory, BoardEditorType, BoardListView, BoardVisibility, BoardWriteRole } from 'memi-board/runtime'
|
|
5
5
|
import MemiBoardOptionCards from './OptionCards.vue'
|
|
6
6
|
|
|
@@ -53,6 +53,17 @@ function fromLocaleOption(value: string) {
|
|
|
53
53
|
return value === LOCALE_AUTO ? '' : value
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
+
// 번역 언어: 보드 이름·설명과 글을 이 언어들로만 번역한다. 전체를 고르면 빈 배열(= 전체)로 저장한다.
|
|
57
|
+
const translationLocaleItems = MEMI_BOARD_LOCALES.map((item: { code: string, name: string }) => ({ label: item.name, value: item.code }))
|
|
58
|
+
function translationCount(board: { translationLocales?: string[] }) {
|
|
59
|
+
return boardTranslationLocales(board).length
|
|
60
|
+
}
|
|
61
|
+
function setTranslationLocales(board: { translationLocales?: string[] }, value: unknown) {
|
|
62
|
+
const codes = Array.isArray(value) ? value.filter((code): code is string => typeof code === 'string') : []
|
|
63
|
+
if (!codes.length) return
|
|
64
|
+
board.translationLocales = (codes.length === MEMI_BOARD_LOCALES.length ? [] : codes) as typeof board.translationLocales
|
|
65
|
+
}
|
|
66
|
+
|
|
56
67
|
const { isAdmin, canConfigureBoard, rolePending } = useMemiBoardAuth()
|
|
57
68
|
const { categories, settingsPending, saveCategory, translateBoard } = useMemiBoardSettings()
|
|
58
69
|
const canManage = computed(() => canConfigureBoard(props.categoryId) || props.authorized)
|
|
@@ -89,6 +100,7 @@ function emptyDraft(id: string): BoardCategory {
|
|
|
89
100
|
locale: '',
|
|
90
101
|
autoTranslate: false,
|
|
91
102
|
autoTranslatePosts: false,
|
|
103
|
+
translationLocales: [],
|
|
92
104
|
}
|
|
93
105
|
}
|
|
94
106
|
|
|
@@ -113,6 +125,7 @@ function toDraft(category: BoardCategory): BoardCategory {
|
|
|
113
125
|
locale: category.locale ?? '',
|
|
114
126
|
autoTranslate: category.autoTranslate === true,
|
|
115
127
|
autoTranslatePosts: category.autoTranslatePosts === true,
|
|
128
|
+
translationLocales: [...(category.translationLocales ?? [])],
|
|
116
129
|
}
|
|
117
130
|
}
|
|
118
131
|
|
|
@@ -165,7 +178,7 @@ async function translateCopy() {
|
|
|
165
178
|
}
|
|
166
179
|
catch (cause) {
|
|
167
180
|
console.warn('[memi-board] board translation failed', cause)
|
|
168
|
-
if (draft.value === current) error.value = t('settings.autoTranslate.manualFailed')
|
|
181
|
+
if (draft.value === current) error.value = t('settings.autoTranslate.manualFailed', { count: translationCount(current ?? {}) })
|
|
169
182
|
}
|
|
170
183
|
finally {
|
|
171
184
|
translating.value = false
|
|
@@ -202,7 +215,7 @@ async function save() {
|
|
|
202
215
|
saved.value = true
|
|
203
216
|
translatedDraft.value = false
|
|
204
217
|
emit('saved', snapshot)
|
|
205
|
-
if (translateFailed) error.value = t('settings.autoTranslate.failed')
|
|
218
|
+
if (translateFailed) error.value = t('settings.autoTranslate.failed', { count: translationCount(snapshot) })
|
|
206
219
|
}
|
|
207
220
|
catch (cause) {
|
|
208
221
|
error.value = cause instanceof Error ? cause.message : t('settings.error.saveFailed')
|
|
@@ -278,7 +291,7 @@ async function save() {
|
|
|
278
291
|
<UInput v-model="draft.label" class="min-w-0 flex-1" :disabled="translating" @update:model-value="saved = false" />
|
|
279
292
|
<UButton
|
|
280
293
|
v-if="translationEnabled"
|
|
281
|
-
:label="t('settings.autoTranslate.action')"
|
|
294
|
+
:label="t('settings.autoTranslate.action', { count: translationCount(draft) })"
|
|
282
295
|
icon="i-lucide-languages"
|
|
283
296
|
color="neutral"
|
|
284
297
|
variant="outline"
|
|
@@ -302,22 +315,37 @@ async function save() {
|
|
|
302
315
|
/>
|
|
303
316
|
<div v-if="translationEnabled" class="flex items-center justify-between gap-3">
|
|
304
317
|
<div>
|
|
305
|
-
<p class="text-sm font-medium">{{ t('settings.autoTranslate.label') }}</p>
|
|
306
|
-
<p class="text-xs text-muted">{{ t('settings.autoTranslate.help') }}</p>
|
|
318
|
+
<p class="text-sm font-medium">{{ t('settings.autoTranslate.label', { count: translationCount(draft) }) }}</p>
|
|
319
|
+
<p class="text-xs text-muted">{{ t('settings.autoTranslate.help', { count: translationCount(draft) }) }}</p>
|
|
307
320
|
</div>
|
|
308
321
|
<USwitch v-model="draft.autoTranslate" size="sm" @update:model-value="saved = false" />
|
|
309
322
|
</div>
|
|
310
|
-
<p v-if="translationEnabled" class="text-xs text-muted">{{ t('settings.autoTranslate.manualHelp') }}</p>
|
|
311
|
-
<p v-if="translationEnabled && boardCopyIsTranslated(draft)" class="text-xs text-primary">{{ t(translatedDraft ? 'settings.autoTranslate.pending' : 'settings.autoTranslate.ready') }}</p>
|
|
323
|
+
<p v-if="translationEnabled" class="text-xs text-muted">{{ t('settings.autoTranslate.manualHelp', { count: translationCount(draft) }) }}</p>
|
|
324
|
+
<p v-if="translationEnabled && boardCopyIsTranslated(draft)" class="text-xs text-primary">{{ t(translatedDraft ? 'settings.autoTranslate.pending' : 'settings.autoTranslate.ready', { count: translationCount(draft) }) }}</p>
|
|
312
325
|
</div>
|
|
313
326
|
</div>
|
|
314
327
|
<div v-if="translationEnabled" class="flex items-center justify-between gap-3">
|
|
315
328
|
<div>
|
|
316
329
|
<p class="text-sm font-medium">{{ t('settings.autoTranslatePosts.label') }}</p>
|
|
317
|
-
<p class="text-xs text-muted">{{ t('settings.autoTranslatePosts.help') }}</p>
|
|
330
|
+
<p class="text-xs text-muted">{{ t('settings.autoTranslatePosts.help', { count: translationCount(draft) }) }}</p>
|
|
318
331
|
</div>
|
|
319
332
|
<USwitch v-model="draft.autoTranslatePosts" size="sm" :aria-label="t('settings.autoTranslatePosts.label')" @update:model-value="saved = false" />
|
|
320
333
|
</div>
|
|
334
|
+
<div v-if="translationEnabled" class="flex flex-col gap-2">
|
|
335
|
+
<div>
|
|
336
|
+
<p class="text-sm font-medium">{{ t('settings.translationLocales.label') }}</p>
|
|
337
|
+
<p class="text-xs text-muted">{{ t('settings.translationLocales.help') }}</p>
|
|
338
|
+
</div>
|
|
339
|
+
<USelectMenu
|
|
340
|
+
:model-value="boardTranslationLocales(draft)"
|
|
341
|
+
:items="translationLocaleItems"
|
|
342
|
+
value-key="value"
|
|
343
|
+
multiple
|
|
344
|
+
class="w-full"
|
|
345
|
+
:aria-label="t('settings.translationLocales.label')"
|
|
346
|
+
@update:model-value="setTranslationLocales(draft, $event); saved = false"
|
|
347
|
+
/>
|
|
348
|
+
</div>
|
|
321
349
|
<div v-if="isAdmin" class="flex flex-col gap-2">
|
|
322
350
|
<div>
|
|
323
351
|
<p class="text-sm font-medium">{{ t('settings.visibility.label') }}</p>
|
|
@@ -17,6 +17,7 @@ import {
|
|
|
17
17
|
useMemiBoardAuth,
|
|
18
18
|
useMemiBoardPosts,
|
|
19
19
|
useMemiBoardModeration,
|
|
20
|
+
boardTranslationLocales,
|
|
20
21
|
useMemiBoardI18n,
|
|
21
22
|
useMemiBoardSettings,
|
|
22
23
|
hasBodyImage,
|
|
@@ -59,6 +60,8 @@ const attachments = ref<Attachment[]>([])
|
|
|
59
60
|
|
|
60
61
|
/** 이미지 리스트뷰 보드 — 제목 없음, 이미지만 있어도 작성 가능 */
|
|
61
62
|
const isImageEditor = computed(() => getBoard(resolvedBoardId.value)?.editorType === 'image')
|
|
63
|
+
/** 보드 설정의 번역 언어(비어 있으면 전체) */
|
|
64
|
+
const translationTargets = computed(() => boardTranslationLocales(getBoard(resolvedBoardId.value)))
|
|
62
65
|
const isEdit = computed(() => Boolean(props.postId))
|
|
63
66
|
|
|
64
67
|
const loading = ref(false)
|
|
@@ -663,7 +666,7 @@ const aiMenuItems = computed(() => [
|
|
|
663
666
|
{ label: t('editor.ai.summarize'), icon: 'i-lucide-scan-text', onSelect: () => runWritingAssistant('summarize') },
|
|
664
667
|
],
|
|
665
668
|
...(translationEnabled.value ? [[
|
|
666
|
-
{ label: t('editor.ai.translateAll'), icon: 'i-lucide-languages', onSelect: () => translateAllLocales() },
|
|
669
|
+
{ label: t('editor.ai.translateAll', { count: translationTargets.value.length }), icon: 'i-lucide-languages', onSelect: () => translateAllLocales() },
|
|
667
670
|
]] : []),
|
|
668
671
|
[
|
|
669
672
|
{ label: t('editor.ai.title'), icon: 'i-lucide-heading-1', onSelect: () => runWritingAssistant('title') },
|
|
@@ -756,7 +759,7 @@ async function translateAllLocales() {
|
|
|
756
759
|
aiRunning.value = true
|
|
757
760
|
try {
|
|
758
761
|
const translations = await translatePost({
|
|
759
|
-
|
|
762
|
+
targets: translationTargets.value,
|
|
760
763
|
title: storedTitle,
|
|
761
764
|
summary,
|
|
762
765
|
content: plainTextFromHtml(body) ? body : '',
|
|
@@ -765,12 +768,12 @@ async function translateAllLocales() {
|
|
|
765
768
|
await savePostTranslations(props.postId, translations)
|
|
766
769
|
pendingTranslations.value = null
|
|
767
770
|
pendingTranslationKey.value = ''
|
|
768
|
-
aiNotice.value = t('editor.ai.translateSaved')
|
|
771
|
+
aiNotice.value = t('editor.ai.translateSaved', { count: translationTargets.value.length })
|
|
769
772
|
}
|
|
770
773
|
else {
|
|
771
774
|
pendingTranslations.value = translations
|
|
772
775
|
pendingTranslationKey.value = translationKey(body, storedTitle)
|
|
773
|
-
aiNotice.value = t('editor.ai.translatePending')
|
|
776
|
+
aiNotice.value = t('editor.ai.translatePending', { count: translationTargets.value.length })
|
|
774
777
|
}
|
|
775
778
|
}
|
|
776
779
|
catch (cause) {
|
|
@@ -1055,9 +1058,9 @@ async function handleSubmit() {
|
|
|
1055
1058
|
? pendingTranslations.value
|
|
1056
1059
|
: undefined
|
|
1057
1060
|
if (!props.postId && translationEnabled.value && getBoard(resolvedBoardId.value)?.autoTranslatePosts === true && !translations) {
|
|
1058
|
-
submitHint.value = t('editor.hint.translating')
|
|
1061
|
+
submitHint.value = t('editor.hint.translating', { count: translationTargets.value.length })
|
|
1059
1062
|
translations = await translatePost({
|
|
1060
|
-
|
|
1063
|
+
targets: translationTargets.value,
|
|
1061
1064
|
title: storedTitle,
|
|
1062
1065
|
summary: buildPostPreview(bodyContent, imageBoard ? [] : attachments.value).summary,
|
|
1063
1066
|
content: plainTextFromHtml(bodyContent) ? bodyContent : '',
|