@openrails/contentkit-ui 0.70.0 → 0.72.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.
- package/README.md +98 -10
- package/dist/client/content/bans.d.ts +2 -0
- package/dist/client/content/bans.js +24 -12
- package/dist/client/content/bans.js.map +1 -1
- package/dist/client/content/comments.d.ts +4 -2
- package/dist/client/content/comments.js.map +1 -1
- package/dist/client/content/polls.d.ts +10 -3
- package/dist/client/content/polls.js.map +1 -1
- package/dist/client/content/posts.d.ts +4 -4
- package/dist/client/content/posts.js.map +1 -1
- package/dist/client/generated/error-codes.js +2 -2
- package/dist/client/generated/error-codes.js.map +1 -1
- package/dist/client/generated/routes.d.ts +146 -120
- package/dist/client/generated/routes.js +245 -117
- package/dist/client/generated/routes.js.map +1 -1
- package/dist/client/generated/wire.d.ts +5 -0
- package/dist/client/generated/wire.js.map +1 -1
- package/dist/client/index.d.ts +2 -2
- package/dist/client/taxonomy.d.ts +6 -2
- package/dist/client/taxonomy.js +7 -0
- package/dist/client/taxonomy.js.map +1 -1
- package/dist/components/admin/poll-manager.d.ts +28 -0
- package/dist/components/admin/poll-manager.js +297 -0
- package/dist/components/admin/poll-manager.js.map +1 -0
- package/dist/components/admin/post-manager.d.ts +45 -0
- package/dist/components/admin/post-manager.js +602 -0
- package/dist/components/admin/post-manager.js.map +1 -0
- package/dist/components/admin/shell.d.ts +73 -0
- package/dist/components/admin/shell.js +148 -0
- package/dist/components/admin/shell.js.map +1 -0
- package/dist/components/admin/taxonomy-manager.d.ts +54 -0
- package/dist/components/admin/taxonomy-manager.js +976 -0
- package/dist/components/admin/taxonomy-manager.js.map +1 -0
- package/dist/components/admin/user-comment-standing.d.ts +25 -0
- package/dist/components/admin/user-comment-standing.js +229 -0
- package/dist/components/admin/user-comment-standing.js.map +1 -0
- package/dist/components/social/bans.d.ts +5 -2
- package/dist/components/social/bans.js +132 -134
- package/dist/components/social/bans.js.map +1 -1
- package/dist/components/social/index.d.ts +1 -1
- package/dist/components/social/moderation.d.ts +11 -13
- package/dist/components/social/moderation.js +299 -218
- package/dist/components/social/moderation.js.map +1 -1
- package/dist/components/social/parts.d.ts +3 -2
- package/dist/components/social/parts.js +74 -48
- package/dist/components/social/parts.js.map +1 -1
- package/dist/components/social/poll-editor.d.ts +1 -1
- package/dist/components/social/poll-editor.js +1 -0
- package/dist/components/social/poll-editor.js.map +1 -1
- package/dist/editor/index.d.ts +1 -0
- package/dist/editor/rich-text-editor.d.ts +13 -0
- package/dist/editor/rich-text-editor.js +228 -0
- package/dist/editor/rich-text-editor.js.map +1 -0
- package/dist/editor.js +2 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +13 -8
- package/dist/locales/admin/de.d.ts +2 -0
- package/dist/locales/admin/de.js +176 -0
- package/dist/locales/admin/de.js.map +1 -0
- package/dist/locales/admin/en.d.ts +171 -0
- package/dist/locales/admin/en.js +176 -0
- package/dist/locales/admin/en.js.map +1 -0
- package/dist/locales/admin/es.d.ts +2 -0
- package/dist/locales/admin/es.js +176 -0
- package/dist/locales/admin/es.js.map +1 -0
- package/dist/locales/admin/ja.d.ts +2 -0
- package/dist/locales/admin/ja.js +176 -0
- package/dist/locales/admin/ja.js.map +1 -0
- package/dist/locales/admin/ko.d.ts +2 -0
- package/dist/locales/admin/ko.js +176 -0
- package/dist/locales/admin/ko.js.map +1 -0
- package/dist/locales/admin/zh.d.ts +2 -0
- package/dist/locales/admin/zh.js +176 -0
- package/dist/locales/admin/zh.js.map +1 -0
- package/dist/locales/de.js +5 -3
- package/dist/locales/de.js.map +1 -1
- package/dist/locales/en.d.ts +176 -0
- package/dist/locales/en.js +5 -3
- package/dist/locales/en.js.map +1 -1
- package/dist/locales/es.js +5 -3
- package/dist/locales/es.js.map +1 -1
- package/dist/locales/ja.js +5 -3
- package/dist/locales/ja.js.map +1 -1
- package/dist/locales/ko.js +5 -3
- package/dist/locales/ko.js.map +1 -1
- package/dist/locales/social/de.js +8 -1
- package/dist/locales/social/de.js.map +1 -1
- package/dist/locales/social/en.d.ts +7 -0
- package/dist/locales/social/en.js +8 -1
- package/dist/locales/social/en.js.map +1 -1
- package/dist/locales/social/es.js +8 -1
- package/dist/locales/social/es.js.map +1 -1
- package/dist/locales/social/ja.js +8 -1
- package/dist/locales/social/ja.js.map +1 -1
- package/dist/locales/social/ko.js +8 -1
- package/dist/locales/social/ko.js.map +1 -1
- package/dist/locales/social/zh.js +8 -1
- package/dist/locales/social/zh.js.map +1 -1
- package/dist/locales/zh.js +5 -3
- package/dist/locales/zh.js.map +1 -1
- package/dist/provider.d.ts +2 -0
- package/dist/provider.js +23 -19
- package/dist/provider.js.map +1 -1
- package/dist/react/admin.d.ts +55 -0
- package/dist/react/admin.js +97 -0
- package/dist/react/admin.js.map +1 -0
- package/dist/react/comments.d.ts +18 -2
- package/dist/react/comments.js +24 -8
- package/dist/react/comments.js.map +1 -1
- package/dist/react/context.d.ts +7 -1
- package/dist/react/context.js +6 -1
- package/dist/react/context.js.map +1 -1
- package/dist/react/index.d.ts +4 -3
- package/dist/react/polls.d.ts +2 -2
- package/dist/react/polls.js +88 -87
- package/dist/react/polls.js.map +1 -1
- package/dist/react/posts.d.ts +3 -3
- package/dist/react/posts.js +123 -122
- package/dist/react/posts.js.map +1 -1
- package/dist/react/resources.js +3 -0
- package/dist/react/resources.js.map +1 -1
- package/dist/react/use-resource.d.ts +16 -0
- package/dist/react/use-resource.js +20 -1
- package/dist/react/use-resource.js.map +1 -1
- package/dist/react.js +21 -20
- package/dist/styles.css +1 -1
- package/package.json +37 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ja.js","names":[],"sources":["../../../src/locales/social/ja.ts"],"sourcesContent":["import type { social as en } from \"./en.js\";\n\nexport const social: typeof en = {\n comments: {\n title: \"コメント\",\n count_one: \"コメント {count} 件\",\n count_other: \"コメント {count} 件\",\n placeholder: \"コメントを書く…\",\n replyPlaceholder: \"返信を書く…\",\n name: \"名前\",\n namePlaceholder: \"コメントと一緒に表示されます\",\n post: \"投稿\",\n posting: \"投稿中…\",\n reply: \"返信\",\n replyingTo: \"{name} さんへの返信\",\n empty: \"まだコメントはありません。最初のコメントを書きましょう!\",\n loadMore: \"コメントをさらに表示\",\n loading: \"コメントを読み込み中…\",\n loadFailed: \"コメントを読み込めませんでした。\",\n signIn: \"ログインしてコメント\",\n required: \"先に何か書いてください。\",\n nameRequired: \"名前を入力してください。\",\n charsLeft_one: \"残り {count} 文字\",\n charsLeft_other: \"残り {count} 文字\",\n submitHint: \"{key}+Enter で投稿\",\n sort: \"コメントの並び替え\",\n newest: \"新しい順\",\n best: \"人気順\",\n showReplies_one: \"返信 {count} 件を表示\",\n showReplies_other: \"返信 {count} 件を表示\",\n hideReplies: \"返信を非表示\",\n moreReplies: \"返信をさらに表示\",\n loadingReplies: \"返信を読み込み中…\",\n anonymous: \"匿名\",\n deleted: \"このコメントは削除されました。\",\n edit: \"編集\",\n delete: \"削除\",\n actions: \"コメントの操作\",\n deleteTitle: \"このコメントを削除しますか?\",\n deleteBody: \"削除されたことを示す表示に置き換わります。返信は残ります。\",\n held: \"確認中です。モデレーターが承認するまで、このコメントはあなたにだけ表示されます。\",\n heldBadge: \"確認中\",\n rejected: \"公開されませんでした:{reason}\",\n rejectedNoReason: \"公開されませんでした。\",\n rejectedBadge: \"非公開\",\n like: \"高評価\",\n dislike: \"低評価\",\n showMore: \"もっと見る\",\n showLess: \"閉じる\",\n restore: \"復元\",\n locked: \"ここにはコメントできません。\",\n rateLimited: \"コメントのペースが速すぎます。{seconds} 秒後にもう一度お試しください。\",\n rateLimitedSoon: \"コメントのペースが速すぎます。しばらくしてからもう一度お試しください。\",\n ban: \"コメントを禁止\",\n unban: \"コメント禁止を解除\",\n },\n bans: {\n globalNotice: \"このサイトではコメントできません。\",\n ownerNotice: \"このクリエイターのコンテンツにはコメントできません。\",\n reason: \"理由:{reason}\",\n until: \"{date} まで。\",\n untilLifted: \"解除されるまで。\",\n title: \"{name} さんのコメントを禁止\",\n ownerHelp: \"あなたのすべてのコンテンツに適用されます。既存のコメントは残り、リアクション、お気に入り、投票は引き続きできます。\",\n globalHelp: \"サイト全体に適用されます。既存のコメントは残り、リアクション、お気に入り、投票は引き続きできます。\",\n scope: \"範囲\",\n scopeOwner: \"自分のコンテンツ\",\n scopeGlobal: \"サイト全体\",\n duration: \"期間\",\n day: \"1 日\",\n week: \"7 日\",\n month: \"30 日\",\n forever: \"解除されるまで\",\n custom: \"日時を指定\",\n endsAt: \"終了\",\n reasonLabel: \"理由(任意)\",\n reasonPlaceholder: \"ユーザーに表示されます\",\n save: \"禁止する\",\n update: \"禁止を更新\",\n lift: \"禁止を解除\",\n liftTitle: \"{name} さんの禁止を解除しますか?\",\n liftBody: \"ほかの禁止がない限り、再びコメントできるようになります。\",\n empty: \"禁止はありません。\",\n active: \"有効\",\n expired: \"期限切れ\",\n bannedAt: \"{date} に禁止\",\n add: \"ユーザーを禁止\",\n user: \"ユーザー ID\",\n userPlaceholder: \"ユーザーの ID\",\n loadFailed: \"禁止の一覧を読み込めませんでした。\",\n },\n reactions: {\n like: \"高評価\",\n dislike: \"低評価\",\n signIn: \"ログインしてリアクション\",\n failed: \"リアクションを保存できませんでした。もう一度お試しください。\",\n },\n favorites: {\n add: \"お気に入りに追加\",\n remove: \"お気に入りから削除\",\n added: \"お気に入りに追加しました。\",\n removed: \"お気に入りから削除しました。\",\n signIn: \"ログインしてお気に入りを保存\",\n },\n poll: {\n votes_one: \"{count} 票\",\n votes_other: \"{count} 票\",\n yourVote: \"あなたの投票\",\n closes: \"{date} に締め切り\",\n closed: \"この投票は締め切られました。\",\n signIn: \"ログインして投票\",\n answerPlaceholder: \"あなたの回答\",\n answer: \"回答を送信\",\n updateAnswer: \"回答を更新\",\n editAnswer: \"回答を編集\",\n yourAnswer: \"あなたの回答\",\n answers_one: \"回答 {count} 件\",\n answers_other: \"回答 {count} 件\",\n loadFailed: \"この投票を読み込めませんでした。\",\n },\n pollEditor: {\n newTitle: \"新しい投票\",\n editTitle: \"投票を編集\",\n question: \"質問\",\n questionPlaceholder: \"何を聞きますか?\",\n language: \"言語\",\n kind: \"種類\",\n multipleChoice: \"選択式\",\n freeText: \"自由記述\",\n freeTextHelp: \"読者が回答を書き、回答は自動でグループ分けされます。\",\n liveAt: \"公開日時\",\n closesAt: \"締め切り(任意)\",\n active: \"公開中\",\n inactive: \"非公開\",\n image: \"質問の画像\",\n options: \"選択肢\",\n option: \"選択肢 {index}\",\n addOption: \"選択肢を追加\",\n newOption: \"新しい選択肢\",\n removeOption: \"選択肢を削除\",\n removeOptionTitle: \"この選択肢を削除しますか?\",\n removeOptionBody: \"その票も削除されます。投票には少なくとも 2 つの選択肢が残ります。\",\n optionImage: \"選択肢 {index} の画像\",\n uploadImage: \"画像を追加\",\n replaceImage: \"画像を差し替え\",\n removeImage: \"画像を削除\",\n create: \"投票を作成\",\n creating: \"作成中…\",\n delete: \"投票を削除\",\n deleteTitle: \"この投票を削除しますか?\",\n deleteBody: \"票と画像が削除されます。元に戻せません。\",\n saved: \"保存しました。\",\n created: \"投票を作成しました。\",\n imageFailed: \"投票は保存されましたが、画像がアップロードされませんでした。ここでもう一度追加してください。\",\n minOptions: \"投票には少なくとも 2 つの選択肢が必要です。\",\n maxOptions: \"選択肢は最大 {max} 個です。\",\n questionRequired: \"質問を入力してください。\",\n optionRequired: \"すべての選択肢にラベルが必要です。\",\n },\n moderation: {\n title: \"コメントのモデレーション\",\n all: \"すべてのコメント\",\n queue: \"確認待ち\",\n bans: \"禁止\",\n kind: \"コンテンツ\",\n allKinds: \"すべてのコンテンツ\",\n on: \"対象\",\n published: \"公開\",\n held: \"保留\",\n rejected: \"却下\",\n deleted: \"削除済み\",\n reply: \"返信\",\n delete: \"削除\",\n restore: \"復元\",\n approve: \"承認\",\n reject: \"却下\",\n rejectReason: \"投稿者に表示する理由(任意)\",\n heldBecause: \"保留の理由:{reason}\",\n empty: \"コメントはありません。\",\n queueEmpty: \"確認待ちはありません。\",\n loadFailed: \"コメントを読み込めませんでした。\",\n stale: \"一覧の表示後に編集されました。もう一度確認してください。\",\n loadMore: \"さらに表示\",\n queueComments: \"コメント\",\n queuePosts: \"投稿\",\n },\n time: {\n justNow: \"たった今\",\n },\n contentErrors: {\n forbidden: \"この操作を行う権限がありません。\",\n unauthorized: \"セッションの有効期限が切れました。もう一度ログインしてください。\",\n not_found: \"これは利用できなくなりました。\",\n conflict: \"ほかの場所で変更されました。再読み込みしてもう一度お試しください。\",\n rate_limited: \"リクエストが多すぎます。{seconds} 秒後にもう一度お試しください。\",\n },\n};\n"],"mappings":";AAEA,IAAa,IAAoB;CAC/B,UAAU;EACR,OAAO;EACP,WAAW;EACX,aAAa;EACb,aAAa;EACb,kBAAkB;EAClB,MAAM;EACN,iBAAiB;EACjB,MAAM;EACN,SAAS;EACT,OAAO;EACP,YAAY;EACZ,OAAO;EACP,UAAU;EACV,SAAS;EACT,YAAY;EACZ,QAAQ;EACR,UAAU;EACV,cAAc;EACd,eAAe;EACf,iBAAiB;EACjB,YAAY;EACZ,MAAM;EACN,QAAQ;EACR,MAAM;EACN,iBAAiB;EACjB,mBAAmB;EACnB,aAAa;EACb,aAAa;EACb,gBAAgB;EAChB,WAAW;EACX,SAAS;EACT,MAAM;EACN,QAAQ;EACR,SAAS;EACT,aAAa;EACb,YAAY;EACZ,MAAM;EACN,WAAW;EACX,UAAU;EACV,kBAAkB;EAClB,eAAe;EACf,MAAM;EACN,SAAS;EACT,UAAU;EACV,UAAU;EACV,SAAS;EACT,QAAQ;EACR,aAAa;EACb,iBAAiB;EACjB,KAAK;EACL,OAAO;CACT;CACA,MAAM;EACJ,cAAc;EACd,aAAa;EACb,QAAQ;EACR,OAAO;EACP,aAAa;EACb,OAAO;EACP,WAAW;EACX,YAAY;EACZ,OAAO;EACP,YAAY;EACZ,aAAa;EACb,UAAU;EACV,KAAK;EACL,MAAM;EACN,OAAO;EACP,SAAS;EACT,QAAQ;EACR,QAAQ;EACR,aAAa;EACb,mBAAmB;EACnB,MAAM;EACN,QAAQ;EACR,MAAM;EACN,WAAW;EACX,UAAU;EACV,OAAO;EACP,QAAQ;EACR,SAAS;EACT,UAAU;EACV,KAAK;EACL,MAAM;EACN,iBAAiB;EACjB,YAAY;CACd;CACA,WAAW;EACT,MAAM;EACN,SAAS;EACT,QAAQ;EACR,QAAQ;CACV;CACA,WAAW;EACT,KAAK;EACL,QAAQ;EACR,OAAO;EACP,SAAS;EACT,QAAQ;CACV;CACA,MAAM;EACJ,WAAW;EACX,aAAa;EACb,UAAU;EACV,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,mBAAmB;EACnB,QAAQ;EACR,cAAc;EACd,YAAY;EACZ,YAAY;EACZ,aAAa;EACb,eAAe;EACf,YAAY;CACd;CACA,YAAY;EACV,UAAU;EACV,WAAW;EACX,UAAU;EACV,qBAAqB;EACrB,UAAU;EACV,MAAM;EACN,gBAAgB;EAChB,UAAU;EACV,cAAc;EACd,QAAQ;EACR,UAAU;EACV,QAAQ;EACR,UAAU;EACV,OAAO;EACP,SAAS;EACT,QAAQ;EACR,WAAW;EACX,WAAW;EACX,cAAc;EACd,mBAAmB;EACnB,kBAAkB;EAClB,aAAa;EACb,aAAa;EACb,cAAc;EACd,aAAa;EACb,QAAQ;EACR,UAAU;EACV,QAAQ;EACR,aAAa;EACb,YAAY;EACZ,OAAO;EACP,SAAS;EACT,aAAa;EACb,YAAY;EACZ,YAAY;EACZ,kBAAkB;EAClB,gBAAgB;CAClB;CACA,YAAY;EACV,OAAO;EACP,KAAK;EACL,OAAO;EACP,MAAM;EACN,MAAM;EACN,UAAU;EACV,IAAI;EACJ,WAAW;EACX,MAAM;EACN,UAAU;EACV,SAAS;EACT,OAAO;EACP,QAAQ;EACR,SAAS;EACT,SAAS;EACT,QAAQ;EACR,cAAc;EACd,aAAa;EACb,OAAO;EACP,YAAY;EACZ,YAAY;EACZ,OAAO;EACP,UAAU;EACV,eAAe;EACf,YAAY;
|
|
1
|
+
{"version":3,"file":"ja.js","names":[],"sources":["../../../src/locales/social/ja.ts"],"sourcesContent":["import type { social as en } from \"./en.js\";\n\nexport const social: typeof en = {\n comments: {\n title: \"コメント\",\n count_one: \"コメント {count} 件\",\n count_other: \"コメント {count} 件\",\n placeholder: \"コメントを書く…\",\n replyPlaceholder: \"返信を書く…\",\n name: \"名前\",\n namePlaceholder: \"コメントと一緒に表示されます\",\n post: \"投稿\",\n posting: \"投稿中…\",\n reply: \"返信\",\n replyingTo: \"{name} さんへの返信\",\n empty: \"まだコメントはありません。最初のコメントを書きましょう!\",\n loadMore: \"コメントをさらに表示\",\n loading: \"コメントを読み込み中…\",\n loadFailed: \"コメントを読み込めませんでした。\",\n signIn: \"ログインしてコメント\",\n required: \"先に何か書いてください。\",\n nameRequired: \"名前を入力してください。\",\n charsLeft_one: \"残り {count} 文字\",\n charsLeft_other: \"残り {count} 文字\",\n submitHint: \"{key}+Enter で投稿\",\n sort: \"コメントの並び替え\",\n newest: \"新しい順\",\n best: \"人気順\",\n showReplies_one: \"返信 {count} 件を表示\",\n showReplies_other: \"返信 {count} 件を表示\",\n hideReplies: \"返信を非表示\",\n moreReplies: \"返信をさらに表示\",\n loadingReplies: \"返信を読み込み中…\",\n anonymous: \"匿名\",\n deleted: \"このコメントは削除されました。\",\n edit: \"編集\",\n delete: \"削除\",\n actions: \"コメントの操作\",\n deleteTitle: \"このコメントを削除しますか?\",\n deleteBody: \"削除されたことを示す表示に置き換わります。返信は残ります。\",\n held: \"確認中です。モデレーターが承認するまで、このコメントはあなたにだけ表示されます。\",\n heldBadge: \"確認中\",\n rejected: \"公開されませんでした:{reason}\",\n rejectedNoReason: \"公開されませんでした。\",\n rejectedBadge: \"非公開\",\n like: \"高評価\",\n dislike: \"低評価\",\n showMore: \"もっと見る\",\n showLess: \"閉じる\",\n restore: \"復元\",\n locked: \"ここにはコメントできません。\",\n rateLimited: \"コメントのペースが速すぎます。{seconds} 秒後にもう一度お試しください。\",\n rateLimitedSoon: \"コメントのペースが速すぎます。しばらくしてからもう一度お試しください。\",\n ban: \"コメントを禁止\",\n unban: \"コメント禁止を解除\",\n },\n bans: {\n globalNotice: \"このサイトではコメントできません。\",\n ownerNotice: \"このクリエイターのコンテンツにはコメントできません。\",\n reason: \"理由:{reason}\",\n until: \"{date} まで。\",\n untilLifted: \"解除されるまで。\",\n title: \"{name} さんのコメントを禁止\",\n ownerHelp: \"あなたのすべてのコンテンツに適用されます。既存のコメントは残り、リアクション、お気に入り、投票は引き続きできます。\",\n globalHelp: \"サイト全体に適用されます。既存のコメントは残り、リアクション、お気に入り、投票は引き続きできます。\",\n scope: \"範囲\",\n scopeOwner: \"自分のコンテンツ\",\n scopeGlobal: \"サイト全体\",\n duration: \"期間\",\n day: \"1 日\",\n week: \"7 日\",\n month: \"30 日\",\n forever: \"解除されるまで\",\n custom: \"日時を指定\",\n endsAt: \"終了\",\n reasonLabel: \"理由(任意)\",\n reasonPlaceholder: \"ユーザーに表示されます\",\n save: \"禁止する\",\n update: \"禁止を更新\",\n lift: \"禁止を解除\",\n liftTitle: \"{name} さんの禁止を解除しますか?\",\n liftBody: \"ほかの禁止がない限り、再びコメントできるようになります。\",\n empty: \"禁止はありません。\",\n active: \"有効\",\n expired: \"期限切れ\",\n bannedAt: \"{date} に禁止\",\n add: \"ユーザーを禁止\",\n user: \"ユーザー ID\",\n userPlaceholder: \"ユーザーの ID\",\n loadFailed: \"禁止の一覧を読み込めませんでした。\",\n },\n reactions: {\n like: \"高評価\",\n dislike: \"低評価\",\n signIn: \"ログインしてリアクション\",\n failed: \"リアクションを保存できませんでした。もう一度お試しください。\",\n },\n favorites: {\n add: \"お気に入りに追加\",\n remove: \"お気に入りから削除\",\n added: \"お気に入りに追加しました。\",\n removed: \"お気に入りから削除しました。\",\n signIn: \"ログインしてお気に入りを保存\",\n },\n poll: {\n votes_one: \"{count} 票\",\n votes_other: \"{count} 票\",\n yourVote: \"あなたの投票\",\n closes: \"{date} に締め切り\",\n closed: \"この投票は締め切られました。\",\n signIn: \"ログインして投票\",\n answerPlaceholder: \"あなたの回答\",\n answer: \"回答を送信\",\n updateAnswer: \"回答を更新\",\n editAnswer: \"回答を編集\",\n yourAnswer: \"あなたの回答\",\n answers_one: \"回答 {count} 件\",\n answers_other: \"回答 {count} 件\",\n loadFailed: \"この投票を読み込めませんでした。\",\n },\n pollEditor: {\n newTitle: \"新しい投票\",\n editTitle: \"投票を編集\",\n question: \"質問\",\n questionPlaceholder: \"何を聞きますか?\",\n language: \"言語\",\n kind: \"種類\",\n multipleChoice: \"選択式\",\n freeText: \"自由記述\",\n freeTextHelp: \"読者が回答を書き、回答は自動でグループ分けされます。\",\n liveAt: \"公開日時\",\n closesAt: \"締め切り(任意)\",\n active: \"公開中\",\n inactive: \"非公開\",\n image: \"質問の画像\",\n options: \"選択肢\",\n option: \"選択肢 {index}\",\n addOption: \"選択肢を追加\",\n newOption: \"新しい選択肢\",\n removeOption: \"選択肢を削除\",\n removeOptionTitle: \"この選択肢を削除しますか?\",\n removeOptionBody: \"その票も削除されます。投票には少なくとも 2 つの選択肢が残ります。\",\n optionImage: \"選択肢 {index} の画像\",\n uploadImage: \"画像を追加\",\n replaceImage: \"画像を差し替え\",\n removeImage: \"画像を削除\",\n create: \"投票を作成\",\n creating: \"作成中…\",\n delete: \"投票を削除\",\n deleteTitle: \"この投票を削除しますか?\",\n deleteBody: \"票と画像が削除されます。元に戻せません。\",\n saved: \"保存しました。\",\n created: \"投票を作成しました。\",\n imageFailed: \"投票は保存されましたが、画像がアップロードされませんでした。ここでもう一度追加してください。\",\n minOptions: \"投票には少なくとも 2 つの選択肢が必要です。\",\n maxOptions: \"選択肢は最大 {max} 個です。\",\n questionRequired: \"質問を入力してください。\",\n optionRequired: \"すべての選択肢にラベルが必要です。\",\n },\n moderation: {\n title: \"コメントのモデレーション\",\n all: \"すべてのコメント\",\n queue: \"確認待ち\",\n bans: \"禁止\",\n kind: \"コンテンツ\",\n allKinds: \"すべてのコンテンツ\",\n on: \"対象\",\n published: \"公開\",\n held: \"保留\",\n rejected: \"却下\",\n deleted: \"削除済み\",\n reply: \"返信\",\n delete: \"削除\",\n restore: \"復元\",\n approve: \"承認\",\n reject: \"却下\",\n rejectReason: \"投稿者に表示する理由(任意)\",\n heldBecause: \"保留の理由:{reason}\",\n empty: \"コメントはありません。\",\n queueEmpty: \"確認待ちはありません。\",\n loadFailed: \"コメントを読み込めませんでした。\",\n stale: \"一覧の表示後に編集されました。もう一度確認してください。\",\n loadMore: \"さらに表示\",\n queueComments: \"コメント\",\n queuePosts: \"投稿\",\n noAccess: \"コメントをモデレートする権限がありません。\",\n author: \"投稿者\",\n authorPlaceholder: \"ユーザー ID で絞り込む\",\n filter: \"絞り込む\",\n byAuthor: \"{name} さんのコメント\",\n clearAuthor: \"すべて表示\",\n theirComments: \"このユーザーのコメント\",\n },\n time: {\n justNow: \"たった今\",\n },\n contentErrors: {\n forbidden: \"この操作を行う権限がありません。\",\n unauthorized: \"セッションの有効期限が切れました。もう一度ログインしてください。\",\n not_found: \"これは利用できなくなりました。\",\n conflict: \"ほかの場所で変更されました。再読み込みしてもう一度お試しください。\",\n rate_limited: \"リクエストが多すぎます。{seconds} 秒後にもう一度お試しください。\",\n },\n};\n"],"mappings":"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"}
|
|
@@ -181,7 +181,14 @@ var e = {
|
|
|
181
181
|
stale: "목록이 표시된 뒤 수정되었습니다. 다시 검토하세요.",
|
|
182
182
|
loadMore: "더 보기",
|
|
183
183
|
queueComments: "댓글",
|
|
184
|
-
queuePosts: "게시물"
|
|
184
|
+
queuePosts: "게시물",
|
|
185
|
+
noAccess: "댓글을 관리할 권한이 없습니다.",
|
|
186
|
+
author: "작성자",
|
|
187
|
+
authorPlaceholder: "사용자 ID로 필터",
|
|
188
|
+
filter: "필터",
|
|
189
|
+
byAuthor: "{name} 님의 댓글",
|
|
190
|
+
clearAuthor: "전체 보기",
|
|
191
|
+
theirComments: "이 사용자의 댓글"
|
|
185
192
|
},
|
|
186
193
|
time: { justNow: "방금" },
|
|
187
194
|
contentErrors: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ko.js","names":[],"sources":["../../../src/locales/social/ko.ts"],"sourcesContent":["import type { social as en } from \"./en.js\";\n\nexport const social: typeof en = {\n comments: {\n title: \"댓글\",\n count_one: \"댓글 {count}개\",\n count_other: \"댓글 {count}개\",\n placeholder: \"댓글 쓰기…\",\n replyPlaceholder: \"답글 쓰기…\",\n name: \"이름\",\n namePlaceholder: \"댓글과 함께 표시됩니다\",\n post: \"게시\",\n posting: \"게시 중…\",\n reply: \"답글\",\n replyingTo: \"{name}님에게 답글\",\n empty: \"아직 댓글이 없습니다. 첫 댓글을 남겨 보세요!\",\n loadMore: \"댓글 더 보기\",\n loading: \"댓글을 불러오는 중…\",\n loadFailed: \"댓글을 불러오지 못했습니다.\",\n signIn: \"로그인하고 댓글 쓰기\",\n required: \"먼저 내용을 입력하세요.\",\n nameRequired: \"이름을 입력하세요.\",\n charsLeft_one: \"{count}자 남음\",\n charsLeft_other: \"{count}자 남음\",\n submitHint: \"{key}+Enter로 게시\",\n sort: \"댓글 정렬\",\n newest: \"최신순\",\n best: \"인기순\",\n showReplies_one: \"답글 {count}개 보기\",\n showReplies_other: \"답글 {count}개 보기\",\n hideReplies: \"답글 숨기기\",\n moreReplies: \"답글 더 보기\",\n loadingReplies: \"답글을 불러오는 중…\",\n anonymous: \"익명\",\n deleted: \"삭제된 댓글입니다.\",\n edit: \"수정\",\n delete: \"삭제\",\n actions: \"댓글 작업\",\n deleteTitle: \"이 댓글을 삭제할까요?\",\n deleteBody: \"삭제되었다는 표시로 바뀌며, 답글은 남습니다.\",\n held: \"검토 중입니다. 운영자가 승인할 때까지 이 댓글은 나에게만 보입니다.\",\n heldBadge: \"검토 중\",\n rejected: \"게시되지 않음: {reason}\",\n rejectedNoReason: \"게시되지 않았습니다.\",\n rejectedBadge: \"게시 안 됨\",\n like: \"좋아요\",\n dislike: \"싫어요\",\n showMore: \"더 보기\",\n showLess: \"접기\",\n restore: \"복원\",\n locked: \"여기에는 댓글을 쓸 수 없습니다.\",\n rateLimited: \"댓글을 너무 빨리 쓰고 있습니다. {seconds}초 후에 다시 시도하세요.\",\n rateLimitedSoon: \"댓글을 너무 빨리 쓰고 있습니다. 잠시 후 다시 시도하세요.\",\n ban: \"댓글 금지\",\n unban: \"댓글 금지 해제\",\n },\n bans: {\n globalNotice: \"이 사이트에서는 댓글을 쓸 수 없습니다.\",\n ownerNotice: \"이 크리에이터의 콘텐츠에는 댓글을 쓸 수 없습니다.\",\n reason: \"사유: {reason}\",\n until: \"{date}까지.\",\n untilLifted: \"해제될 때까지.\",\n title: \"{name}님의 댓글 금지\",\n ownerHelp: \"내 모든 콘텐츠에 적용됩니다. 기존 댓글은 남고 반응, 즐겨찾기, 투표는 계속할 수 있습니다.\",\n globalHelp: \"사이트 전체에 적용됩니다. 기존 댓글은 남고 반응, 즐겨찾기, 투표는 계속할 수 있습니다.\",\n scope: \"범위\",\n scopeOwner: \"내 콘텐츠\",\n scopeGlobal: \"사이트 전체\",\n duration: \"기간\",\n day: \"1일\",\n week: \"7일\",\n month: \"30일\",\n forever: \"해제할 때까지\",\n custom: \"날짜 지정\",\n endsAt: \"종료\",\n reasonLabel: \"사유(선택)\",\n reasonPlaceholder: \"사용자에게 표시됩니다\",\n save: \"금지\",\n update: \"금지 수정\",\n lift: \"금지 해제\",\n liftTitle: \"{name}님의 금지를 해제할까요?\",\n liftBody: \"다른 금지가 없다면 다시 댓글을 쓸 수 있습니다.\",\n empty: \"금지가 없습니다.\",\n active: \"활성\",\n expired: \"만료됨\",\n bannedAt: \"{date}에 금지됨\",\n add: \"사용자 금지\",\n user: \"사용자 ID\",\n userPlaceholder: \"사용자의 ID\",\n loadFailed: \"금지 목록을 불러오지 못했습니다.\",\n },\n reactions: {\n like: \"좋아요\",\n dislike: \"싫어요\",\n signIn: \"로그인하고 반응하기\",\n failed: \"반응이 저장되지 않았습니다. 다시 시도하세요.\",\n },\n favorites: {\n add: \"즐겨찾기에 추가\",\n remove: \"즐겨찾기에서 삭제\",\n added: \"즐겨찾기에 추가했습니다.\",\n removed: \"즐겨찾기에서 삭제했습니다.\",\n signIn: \"로그인하고 즐겨찾기 저장\",\n },\n poll: {\n votes_one: \"{count}표\",\n votes_other: \"{count}표\",\n yourVote: \"내 투표\",\n closes: \"{date}에 마감\",\n closed: \"마감된 투표입니다.\",\n signIn: \"로그인하고 투표하기\",\n answerPlaceholder: \"내 답변\",\n answer: \"답변 보내기\",\n updateAnswer: \"답변 수정\",\n editAnswer: \"답변 편집\",\n yourAnswer: \"내 답변\",\n answers_one: \"답변 {count}개\",\n answers_other: \"답변 {count}개\",\n loadFailed: \"투표를 불러오지 못했습니다.\",\n },\n pollEditor: {\n newTitle: \"새 투표\",\n editTitle: \"투표 수정\",\n question: \"질문\",\n questionPlaceholder: \"무엇을 물어볼까요?\",\n language: \"언어\",\n kind: \"유형\",\n multipleChoice: \"객관식\",\n freeText: \"주관식\",\n freeTextHelp: \"독자가 답변을 쓰고, 답변은 자동으로 묶입니다.\",\n liveAt: \"게시 시작\",\n closesAt: \"마감(선택)\",\n active: \"공개\",\n inactive: \"비공개\",\n image: \"질문 이미지\",\n options: \"선택지\",\n option: \"선택지 {index}\",\n addOption: \"선택지 추가\",\n newOption: \"새 선택지\",\n removeOption: \"선택지 삭제\",\n removeOptionTitle: \"이 선택지를 삭제할까요?\",\n removeOptionBody: \"해당 표도 삭제됩니다. 투표에는 선택지가 최소 2개 남습니다.\",\n optionImage: \"선택지 {index} 이미지\",\n uploadImage: \"이미지 추가\",\n replaceImage: \"이미지 교체\",\n removeImage: \"이미지 삭제\",\n create: \"투표 만들기\",\n creating: \"만드는 중…\",\n delete: \"투표 삭제\",\n deleteTitle: \"이 투표를 삭제할까요?\",\n deleteBody: \"표와 이미지가 삭제됩니다. 되돌릴 수 없습니다.\",\n saved: \"저장했습니다.\",\n created: \"투표를 만들었습니다.\",\n imageFailed: \"투표는 저장되었지만 이미지 하나가 업로드되지 않았습니다. 여기서 다시 추가하세요.\",\n minOptions: \"투표에는 선택지가 최소 2개 필요합니다.\",\n maxOptions: \"선택지는 최대 {max}개입니다.\",\n questionRequired: \"질문을 입력하세요.\",\n optionRequired: \"모든 선택지에 이름이 필요합니다.\",\n },\n moderation: {\n title: \"댓글 관리\",\n all: \"모든 댓글\",\n queue: \"검토 대기열\",\n bans: \"금지\",\n kind: \"콘텐츠\",\n allKinds: \"모든 콘텐츠\",\n on: \"대상\",\n published: \"게시됨\",\n held: \"보류\",\n rejected: \"거부됨\",\n deleted: \"삭제됨\",\n reply: \"답글\",\n delete: \"삭제\",\n restore: \"복원\",\n approve: \"승인\",\n reject: \"거부\",\n rejectReason: \"작성자에게 보여 줄 사유(선택)\",\n heldBecause: \"보류 사유: {reason}\",\n empty: \"댓글이 없습니다.\",\n queueEmpty: \"검토할 항목이 없습니다.\",\n loadFailed: \"댓글을 불러오지 못했습니다.\",\n stale: \"목록이 표시된 뒤 수정되었습니다. 다시 검토하세요.\",\n loadMore: \"더 보기\",\n queueComments: \"댓글\",\n queuePosts: \"게시물\",\n },\n time: {\n justNow: \"방금\",\n },\n contentErrors: {\n forbidden: \"이 작업을 할 권한이 없습니다.\",\n unauthorized: \"세션이 만료되었습니다. 다시 로그인하세요.\",\n not_found: \"더 이상 사용할 수 없습니다.\",\n conflict: \"다른 곳에서 변경되었습니다. 새로고침 후 다시 시도하세요.\",\n rate_limited: \"요청이 너무 많습니다. {seconds}초 후에 다시 시도하세요.\",\n },\n};\n"],"mappings":";AAEA,IAAa,IAAoB;CAC/B,UAAU;EACR,OAAO;EACP,WAAW;EACX,aAAa;EACb,aAAa;EACb,kBAAkB;EAClB,MAAM;EACN,iBAAiB;EACjB,MAAM;EACN,SAAS;EACT,OAAO;EACP,YAAY;EACZ,OAAO;EACP,UAAU;EACV,SAAS;EACT,YAAY;EACZ,QAAQ;EACR,UAAU;EACV,cAAc;EACd,eAAe;EACf,iBAAiB;EACjB,YAAY;EACZ,MAAM;EACN,QAAQ;EACR,MAAM;EACN,iBAAiB;EACjB,mBAAmB;EACnB,aAAa;EACb,aAAa;EACb,gBAAgB;EAChB,WAAW;EACX,SAAS;EACT,MAAM;EACN,QAAQ;EACR,SAAS;EACT,aAAa;EACb,YAAY;EACZ,MAAM;EACN,WAAW;EACX,UAAU;EACV,kBAAkB;EAClB,eAAe;EACf,MAAM;EACN,SAAS;EACT,UAAU;EACV,UAAU;EACV,SAAS;EACT,QAAQ;EACR,aAAa;EACb,iBAAiB;EACjB,KAAK;EACL,OAAO;CACT;CACA,MAAM;EACJ,cAAc;EACd,aAAa;EACb,QAAQ;EACR,OAAO;EACP,aAAa;EACb,OAAO;EACP,WAAW;EACX,YAAY;EACZ,OAAO;EACP,YAAY;EACZ,aAAa;EACb,UAAU;EACV,KAAK;EACL,MAAM;EACN,OAAO;EACP,SAAS;EACT,QAAQ;EACR,QAAQ;EACR,aAAa;EACb,mBAAmB;EACnB,MAAM;EACN,QAAQ;EACR,MAAM;EACN,WAAW;EACX,UAAU;EACV,OAAO;EACP,QAAQ;EACR,SAAS;EACT,UAAU;EACV,KAAK;EACL,MAAM;EACN,iBAAiB;EACjB,YAAY;CACd;CACA,WAAW;EACT,MAAM;EACN,SAAS;EACT,QAAQ;EACR,QAAQ;CACV;CACA,WAAW;EACT,KAAK;EACL,QAAQ;EACR,OAAO;EACP,SAAS;EACT,QAAQ;CACV;CACA,MAAM;EACJ,WAAW;EACX,aAAa;EACb,UAAU;EACV,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,mBAAmB;EACnB,QAAQ;EACR,cAAc;EACd,YAAY;EACZ,YAAY;EACZ,aAAa;EACb,eAAe;EACf,YAAY;CACd;CACA,YAAY;EACV,UAAU;EACV,WAAW;EACX,UAAU;EACV,qBAAqB;EACrB,UAAU;EACV,MAAM;EACN,gBAAgB;EAChB,UAAU;EACV,cAAc;EACd,QAAQ;EACR,UAAU;EACV,QAAQ;EACR,UAAU;EACV,OAAO;EACP,SAAS;EACT,QAAQ;EACR,WAAW;EACX,WAAW;EACX,cAAc;EACd,mBAAmB;EACnB,kBAAkB;EAClB,aAAa;EACb,aAAa;EACb,cAAc;EACd,aAAa;EACb,QAAQ;EACR,UAAU;EACV,QAAQ;EACR,aAAa;EACb,YAAY;EACZ,OAAO;EACP,SAAS;EACT,aAAa;EACb,YAAY;EACZ,YAAY;EACZ,kBAAkB;EAClB,gBAAgB;CAClB;CACA,YAAY;EACV,OAAO;EACP,KAAK;EACL,OAAO;EACP,MAAM;EACN,MAAM;EACN,UAAU;EACV,IAAI;EACJ,WAAW;EACX,MAAM;EACN,UAAU;EACV,SAAS;EACT,OAAO;EACP,QAAQ;EACR,SAAS;EACT,SAAS;EACT,QAAQ;EACR,cAAc;EACd,aAAa;EACb,OAAO;EACP,YAAY;EACZ,YAAY;EACZ,OAAO;EACP,UAAU;EACV,eAAe;EACf,YAAY;
|
|
1
|
+
{"version":3,"file":"ko.js","names":[],"sources":["../../../src/locales/social/ko.ts"],"sourcesContent":["import type { social as en } from \"./en.js\";\n\nexport const social: typeof en = {\n comments: {\n title: \"댓글\",\n count_one: \"댓글 {count}개\",\n count_other: \"댓글 {count}개\",\n placeholder: \"댓글 쓰기…\",\n replyPlaceholder: \"답글 쓰기…\",\n name: \"이름\",\n namePlaceholder: \"댓글과 함께 표시됩니다\",\n post: \"게시\",\n posting: \"게시 중…\",\n reply: \"답글\",\n replyingTo: \"{name}님에게 답글\",\n empty: \"아직 댓글이 없습니다. 첫 댓글을 남겨 보세요!\",\n loadMore: \"댓글 더 보기\",\n loading: \"댓글을 불러오는 중…\",\n loadFailed: \"댓글을 불러오지 못했습니다.\",\n signIn: \"로그인하고 댓글 쓰기\",\n required: \"먼저 내용을 입력하세요.\",\n nameRequired: \"이름을 입력하세요.\",\n charsLeft_one: \"{count}자 남음\",\n charsLeft_other: \"{count}자 남음\",\n submitHint: \"{key}+Enter로 게시\",\n sort: \"댓글 정렬\",\n newest: \"최신순\",\n best: \"인기순\",\n showReplies_one: \"답글 {count}개 보기\",\n showReplies_other: \"답글 {count}개 보기\",\n hideReplies: \"답글 숨기기\",\n moreReplies: \"답글 더 보기\",\n loadingReplies: \"답글을 불러오는 중…\",\n anonymous: \"익명\",\n deleted: \"삭제된 댓글입니다.\",\n edit: \"수정\",\n delete: \"삭제\",\n actions: \"댓글 작업\",\n deleteTitle: \"이 댓글을 삭제할까요?\",\n deleteBody: \"삭제되었다는 표시로 바뀌며, 답글은 남습니다.\",\n held: \"검토 중입니다. 운영자가 승인할 때까지 이 댓글은 나에게만 보입니다.\",\n heldBadge: \"검토 중\",\n rejected: \"게시되지 않음: {reason}\",\n rejectedNoReason: \"게시되지 않았습니다.\",\n rejectedBadge: \"게시 안 됨\",\n like: \"좋아요\",\n dislike: \"싫어요\",\n showMore: \"더 보기\",\n showLess: \"접기\",\n restore: \"복원\",\n locked: \"여기에는 댓글을 쓸 수 없습니다.\",\n rateLimited: \"댓글을 너무 빨리 쓰고 있습니다. {seconds}초 후에 다시 시도하세요.\",\n rateLimitedSoon: \"댓글을 너무 빨리 쓰고 있습니다. 잠시 후 다시 시도하세요.\",\n ban: \"댓글 금지\",\n unban: \"댓글 금지 해제\",\n },\n bans: {\n globalNotice: \"이 사이트에서는 댓글을 쓸 수 없습니다.\",\n ownerNotice: \"이 크리에이터의 콘텐츠에는 댓글을 쓸 수 없습니다.\",\n reason: \"사유: {reason}\",\n until: \"{date}까지.\",\n untilLifted: \"해제될 때까지.\",\n title: \"{name}님의 댓글 금지\",\n ownerHelp: \"내 모든 콘텐츠에 적용됩니다. 기존 댓글은 남고 반응, 즐겨찾기, 투표는 계속할 수 있습니다.\",\n globalHelp: \"사이트 전체에 적용됩니다. 기존 댓글은 남고 반응, 즐겨찾기, 투표는 계속할 수 있습니다.\",\n scope: \"범위\",\n scopeOwner: \"내 콘텐츠\",\n scopeGlobal: \"사이트 전체\",\n duration: \"기간\",\n day: \"1일\",\n week: \"7일\",\n month: \"30일\",\n forever: \"해제할 때까지\",\n custom: \"날짜 지정\",\n endsAt: \"종료\",\n reasonLabel: \"사유(선택)\",\n reasonPlaceholder: \"사용자에게 표시됩니다\",\n save: \"금지\",\n update: \"금지 수정\",\n lift: \"금지 해제\",\n liftTitle: \"{name}님의 금지를 해제할까요?\",\n liftBody: \"다른 금지가 없다면 다시 댓글을 쓸 수 있습니다.\",\n empty: \"금지가 없습니다.\",\n active: \"활성\",\n expired: \"만료됨\",\n bannedAt: \"{date}에 금지됨\",\n add: \"사용자 금지\",\n user: \"사용자 ID\",\n userPlaceholder: \"사용자의 ID\",\n loadFailed: \"금지 목록을 불러오지 못했습니다.\",\n },\n reactions: {\n like: \"좋아요\",\n dislike: \"싫어요\",\n signIn: \"로그인하고 반응하기\",\n failed: \"반응이 저장되지 않았습니다. 다시 시도하세요.\",\n },\n favorites: {\n add: \"즐겨찾기에 추가\",\n remove: \"즐겨찾기에서 삭제\",\n added: \"즐겨찾기에 추가했습니다.\",\n removed: \"즐겨찾기에서 삭제했습니다.\",\n signIn: \"로그인하고 즐겨찾기 저장\",\n },\n poll: {\n votes_one: \"{count}표\",\n votes_other: \"{count}표\",\n yourVote: \"내 투표\",\n closes: \"{date}에 마감\",\n closed: \"마감된 투표입니다.\",\n signIn: \"로그인하고 투표하기\",\n answerPlaceholder: \"내 답변\",\n answer: \"답변 보내기\",\n updateAnswer: \"답변 수정\",\n editAnswer: \"답변 편집\",\n yourAnswer: \"내 답변\",\n answers_one: \"답변 {count}개\",\n answers_other: \"답변 {count}개\",\n loadFailed: \"투표를 불러오지 못했습니다.\",\n },\n pollEditor: {\n newTitle: \"새 투표\",\n editTitle: \"투표 수정\",\n question: \"질문\",\n questionPlaceholder: \"무엇을 물어볼까요?\",\n language: \"언어\",\n kind: \"유형\",\n multipleChoice: \"객관식\",\n freeText: \"주관식\",\n freeTextHelp: \"독자가 답변을 쓰고, 답변은 자동으로 묶입니다.\",\n liveAt: \"게시 시작\",\n closesAt: \"마감(선택)\",\n active: \"공개\",\n inactive: \"비공개\",\n image: \"질문 이미지\",\n options: \"선택지\",\n option: \"선택지 {index}\",\n addOption: \"선택지 추가\",\n newOption: \"새 선택지\",\n removeOption: \"선택지 삭제\",\n removeOptionTitle: \"이 선택지를 삭제할까요?\",\n removeOptionBody: \"해당 표도 삭제됩니다. 투표에는 선택지가 최소 2개 남습니다.\",\n optionImage: \"선택지 {index} 이미지\",\n uploadImage: \"이미지 추가\",\n replaceImage: \"이미지 교체\",\n removeImage: \"이미지 삭제\",\n create: \"투표 만들기\",\n creating: \"만드는 중…\",\n delete: \"투표 삭제\",\n deleteTitle: \"이 투표를 삭제할까요?\",\n deleteBody: \"표와 이미지가 삭제됩니다. 되돌릴 수 없습니다.\",\n saved: \"저장했습니다.\",\n created: \"투표를 만들었습니다.\",\n imageFailed: \"투표는 저장되었지만 이미지 하나가 업로드되지 않았습니다. 여기서 다시 추가하세요.\",\n minOptions: \"투표에는 선택지가 최소 2개 필요합니다.\",\n maxOptions: \"선택지는 최대 {max}개입니다.\",\n questionRequired: \"질문을 입력하세요.\",\n optionRequired: \"모든 선택지에 이름이 필요합니다.\",\n },\n moderation: {\n title: \"댓글 관리\",\n all: \"모든 댓글\",\n queue: \"검토 대기열\",\n bans: \"금지\",\n kind: \"콘텐츠\",\n allKinds: \"모든 콘텐츠\",\n on: \"대상\",\n published: \"게시됨\",\n held: \"보류\",\n rejected: \"거부됨\",\n deleted: \"삭제됨\",\n reply: \"답글\",\n delete: \"삭제\",\n restore: \"복원\",\n approve: \"승인\",\n reject: \"거부\",\n rejectReason: \"작성자에게 보여 줄 사유(선택)\",\n heldBecause: \"보류 사유: {reason}\",\n empty: \"댓글이 없습니다.\",\n queueEmpty: \"검토할 항목이 없습니다.\",\n loadFailed: \"댓글을 불러오지 못했습니다.\",\n stale: \"목록이 표시된 뒤 수정되었습니다. 다시 검토하세요.\",\n loadMore: \"더 보기\",\n queueComments: \"댓글\",\n queuePosts: \"게시물\",\n noAccess: \"댓글을 관리할 권한이 없습니다.\",\n author: \"작성자\",\n authorPlaceholder: \"사용자 ID로 필터\",\n filter: \"필터\",\n byAuthor: \"{name} 님의 댓글\",\n clearAuthor: \"전체 보기\",\n theirComments: \"이 사용자의 댓글\",\n },\n time: {\n justNow: \"방금\",\n },\n contentErrors: {\n forbidden: \"이 작업을 할 권한이 없습니다.\",\n unauthorized: \"세션이 만료되었습니다. 다시 로그인하세요.\",\n not_found: \"더 이상 사용할 수 없습니다.\",\n conflict: \"다른 곳에서 변경되었습니다. 새로고침 후 다시 시도하세요.\",\n rate_limited: \"요청이 너무 많습니다. {seconds}초 후에 다시 시도하세요.\",\n },\n};\n"],"mappings":"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"}
|
|
@@ -181,7 +181,14 @@ var e = {
|
|
|
181
181
|
stale: "列出后内容已被编辑,请重新审核。",
|
|
182
182
|
loadMore: "显示更多",
|
|
183
183
|
queueComments: "评论",
|
|
184
|
-
queuePosts: "文章"
|
|
184
|
+
queuePosts: "文章",
|
|
185
|
+
noAccess: "你没有审核评论的权限。",
|
|
186
|
+
author: "作者",
|
|
187
|
+
authorPlaceholder: "按用户 ID 筛选",
|
|
188
|
+
filter: "筛选",
|
|
189
|
+
byAuthor: "{name} 的评论",
|
|
190
|
+
clearAuthor: "显示所有人的",
|
|
191
|
+
theirComments: "该用户的评论"
|
|
185
192
|
},
|
|
186
193
|
time: { justNow: "刚刚" },
|
|
187
194
|
contentErrors: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zh.js","names":[],"sources":["../../../src/locales/social/zh.ts"],"sourcesContent":["import type { social as en } from \"./en.js\";\n\nexport const social: typeof en = {\n comments: {\n title: \"评论\",\n count_one: \"{count} 条评论\",\n count_other: \"{count} 条评论\",\n placeholder: \"写评论…\",\n replyPlaceholder: \"写回复…\",\n name: \"名字\",\n namePlaceholder: \"将随评论显示\",\n post: \"发布\",\n posting: \"发布中…\",\n reply: \"回复\",\n replyingTo: \"回复 {name}\",\n empty: \"还没有评论。来发表第一条吧!\",\n loadMore: \"显示更多评论\",\n loading: \"正在加载评论…\",\n loadFailed: \"无法加载评论。\",\n signIn: \"登录后评论\",\n required: \"请先写点内容。\",\n nameRequired: \"请输入名字。\",\n charsLeft_one: \"还剩 {count} 个字符\",\n charsLeft_other: \"还剩 {count} 个字符\",\n submitHint: \"按 {key}+Enter 发布\",\n sort: \"评论排序\",\n newest: \"最新\",\n best: \"最热\",\n showReplies_one: \"显示 {count} 条回复\",\n showReplies_other: \"显示 {count} 条回复\",\n hideReplies: \"隐藏回复\",\n moreReplies: \"显示更多回复\",\n loadingReplies: \"正在加载回复…\",\n anonymous: \"匿名\",\n deleted: \"此评论已删除。\",\n edit: \"编辑\",\n delete: \"删除\",\n actions: \"评论操作\",\n deleteTitle: \"删除这条评论?\",\n deleteBody: \"它会被替换为已删除的提示,回复会保留。\",\n held: \"审核中。在管理员批准前,这条评论只有你能看到。\",\n heldBadge: \"审核中\",\n rejected: \"未发布:{reason}\",\n rejectedNoReason: \"未发布。\",\n rejectedBadge: \"未发布\",\n like: \"赞\",\n dislike: \"踩\",\n showMore: \"展开\",\n showLess: \"收起\",\n restore: \"恢复\",\n locked: \"你不能在这里评论。\",\n rateLimited: \"你评论得太快了。请在 {seconds} 秒后重试。\",\n rateLimitedSoon: \"你评论得太快了。请稍后重试。\",\n ban: \"禁止评论\",\n unban: \"解除评论禁令\",\n },\n bans: {\n globalNotice: \"你不能在本站评论。\",\n ownerNotice: \"你不能评论这位创作者的内容。\",\n reason: \"原因:{reason}\",\n until: \"截至 {date}。\",\n untilLifted: \"直到解除为止。\",\n title: \"禁止 {name} 评论\",\n ownerHelp: \"适用于你的所有内容。对方已有的评论会保留,仍可点赞、收藏和投票。\",\n globalHelp: \"适用于整个网站。对方已有的评论会保留,仍可点赞、收藏和投票。\",\n scope: \"范围\",\n scopeOwner: \"我的内容\",\n scopeGlobal: \"整个网站\",\n duration: \"时长\",\n day: \"1 天\",\n week: \"7 天\",\n month: \"30 天\",\n forever: \"直到解除\",\n custom: \"截至某个日期\",\n endsAt: \"结束\",\n reasonLabel: \"原因(可选)\",\n reasonPlaceholder: \"会显示给该用户\",\n save: \"禁止\",\n update: \"更新禁令\",\n lift: \"解除禁令\",\n liftTitle: \"解除对 {name} 的禁令?\",\n liftBody: \"如果没有其他禁令,对方可以再次评论。\",\n empty: \"没有禁令。\",\n active: \"生效中\",\n expired: \"已过期\",\n bannedAt: \"于 {date} 禁止\",\n add: \"禁止用户\",\n user: \"用户 ID\",\n userPlaceholder: \"该用户的 ID\",\n loadFailed: \"无法加载禁令。\",\n },\n reactions: {\n like: \"赞\",\n dislike: \"踩\",\n signIn: \"登录后表态\",\n failed: \"你的表态未保存。请重试。\",\n },\n favorites: {\n add: \"加入收藏\",\n remove: \"取消收藏\",\n added: \"已加入收藏。\",\n removed: \"已取消收藏。\",\n signIn: \"登录后收藏\",\n },\n poll: {\n votes_one: \"{count} 票\",\n votes_other: \"{count} 票\",\n yourVote: \"你的投票\",\n closes: \"{date} 截止\",\n closed: \"此投票已结束。\",\n signIn: \"登录后投票\",\n answerPlaceholder: \"你的回答\",\n answer: \"提交回答\",\n updateAnswer: \"更新回答\",\n editAnswer: \"编辑回答\",\n yourAnswer: \"你的回答\",\n answers_one: \"{count} 个回答\",\n answers_other: \"{count} 个回答\",\n loadFailed: \"无法加载此投票。\",\n },\n pollEditor: {\n newTitle: \"新投票\",\n editTitle: \"编辑投票\",\n question: \"问题\",\n questionPlaceholder: \"你想问什么?\",\n language: \"语言\",\n kind: \"类型\",\n multipleChoice: \"选择题\",\n freeText: \"自由回答\",\n freeTextHelp: \"读者写下回答,回答会被自动归类。\",\n liveAt: \"上线时间\",\n closesAt: \"截止时间(可选)\",\n active: \"公开可见\",\n inactive: \"对公众隐藏\",\n image: \"问题图片\",\n options: \"选项\",\n option: \"选项 {index}\",\n addOption: \"添加选项\",\n newOption: \"新选项\",\n removeOption: \"删除选项\",\n removeOptionTitle: \"删除此选项?\",\n removeOptionBody: \"它的票数也会被删除。投票至少保留两个选项。\",\n optionImage: \"选项 {index} 的图片\",\n uploadImage: \"添加图片\",\n replaceImage: \"替换图片\",\n removeImage: \"移除图片\",\n create: \"创建投票\",\n creating: \"创建中…\",\n delete: \"删除投票\",\n deleteTitle: \"删除此投票?\",\n deleteBody: \"票数和图片会被删除,且无法撤销。\",\n saved: \"已保存。\",\n created: \"投票已创建。\",\n imageFailed: \"投票已保存,但有一张图片未上传。请在这里重新添加。\",\n minOptions: \"投票至少需要两个选项。\",\n maxOptions: \"投票最多有 {max} 个选项。\",\n questionRequired: \"请填写问题。\",\n optionRequired: \"每个选项都需要文字。\",\n },\n moderation: {\n title: \"评论管理\",\n all: \"全部评论\",\n queue: \"待审队列\",\n bans: \"禁令\",\n kind: \"内容\",\n allKinds: \"全部内容\",\n on: \"位于\",\n published: \"已发布\",\n held: \"已暂扣\",\n rejected: \"已拒绝\",\n deleted: \"已删除\",\n reply: \"回复\",\n delete: \"删除\",\n restore: \"恢复\",\n approve: \"通过\",\n reject: \"拒绝\",\n rejectReason: \"告知作者的原因(可选)\",\n heldBecause: \"暂扣原因:{reason}\",\n empty: \"没有评论。\",\n queueEmpty: \"没有待审内容。\",\n loadFailed: \"无法加载评论。\",\n stale: \"列出后内容已被编辑,请重新审核。\",\n loadMore: \"显示更多\",\n queueComments: \"评论\",\n queuePosts: \"文章\",\n },\n time: {\n justNow: \"刚刚\",\n },\n contentErrors: {\n forbidden: \"你没有执行此操作的权限。\",\n unauthorized: \"会话已过期。请重新登录。\",\n not_found: \"此内容已不可用。\",\n conflict: \"此内容已在别处更改。请刷新后重试。\",\n rate_limited: \"请求过多。请在 {seconds} 秒后重试。\",\n },\n};\n"],"mappings":";AAEA,IAAa,IAAoB;CAC/B,UAAU;EACR,OAAO;EACP,WAAW;EACX,aAAa;EACb,aAAa;EACb,kBAAkB;EAClB,MAAM;EACN,iBAAiB;EACjB,MAAM;EACN,SAAS;EACT,OAAO;EACP,YAAY;EACZ,OAAO;EACP,UAAU;EACV,SAAS;EACT,YAAY;EACZ,QAAQ;EACR,UAAU;EACV,cAAc;EACd,eAAe;EACf,iBAAiB;EACjB,YAAY;EACZ,MAAM;EACN,QAAQ;EACR,MAAM;EACN,iBAAiB;EACjB,mBAAmB;EACnB,aAAa;EACb,aAAa;EACb,gBAAgB;EAChB,WAAW;EACX,SAAS;EACT,MAAM;EACN,QAAQ;EACR,SAAS;EACT,aAAa;EACb,YAAY;EACZ,MAAM;EACN,WAAW;EACX,UAAU;EACV,kBAAkB;EAClB,eAAe;EACf,MAAM;EACN,SAAS;EACT,UAAU;EACV,UAAU;EACV,SAAS;EACT,QAAQ;EACR,aAAa;EACb,iBAAiB;EACjB,KAAK;EACL,OAAO;CACT;CACA,MAAM;EACJ,cAAc;EACd,aAAa;EACb,QAAQ;EACR,OAAO;EACP,aAAa;EACb,OAAO;EACP,WAAW;EACX,YAAY;EACZ,OAAO;EACP,YAAY;EACZ,aAAa;EACb,UAAU;EACV,KAAK;EACL,MAAM;EACN,OAAO;EACP,SAAS;EACT,QAAQ;EACR,QAAQ;EACR,aAAa;EACb,mBAAmB;EACnB,MAAM;EACN,QAAQ;EACR,MAAM;EACN,WAAW;EACX,UAAU;EACV,OAAO;EACP,QAAQ;EACR,SAAS;EACT,UAAU;EACV,KAAK;EACL,MAAM;EACN,iBAAiB;EACjB,YAAY;CACd;CACA,WAAW;EACT,MAAM;EACN,SAAS;EACT,QAAQ;EACR,QAAQ;CACV;CACA,WAAW;EACT,KAAK;EACL,QAAQ;EACR,OAAO;EACP,SAAS;EACT,QAAQ;CACV;CACA,MAAM;EACJ,WAAW;EACX,aAAa;EACb,UAAU;EACV,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,mBAAmB;EACnB,QAAQ;EACR,cAAc;EACd,YAAY;EACZ,YAAY;EACZ,aAAa;EACb,eAAe;EACf,YAAY;CACd;CACA,YAAY;EACV,UAAU;EACV,WAAW;EACX,UAAU;EACV,qBAAqB;EACrB,UAAU;EACV,MAAM;EACN,gBAAgB;EAChB,UAAU;EACV,cAAc;EACd,QAAQ;EACR,UAAU;EACV,QAAQ;EACR,UAAU;EACV,OAAO;EACP,SAAS;EACT,QAAQ;EACR,WAAW;EACX,WAAW;EACX,cAAc;EACd,mBAAmB;EACnB,kBAAkB;EAClB,aAAa;EACb,aAAa;EACb,cAAc;EACd,aAAa;EACb,QAAQ;EACR,UAAU;EACV,QAAQ;EACR,aAAa;EACb,YAAY;EACZ,OAAO;EACP,SAAS;EACT,aAAa;EACb,YAAY;EACZ,YAAY;EACZ,kBAAkB;EAClB,gBAAgB;CAClB;CACA,YAAY;EACV,OAAO;EACP,KAAK;EACL,OAAO;EACP,MAAM;EACN,MAAM;EACN,UAAU;EACV,IAAI;EACJ,WAAW;EACX,MAAM;EACN,UAAU;EACV,SAAS;EACT,OAAO;EACP,QAAQ;EACR,SAAS;EACT,SAAS;EACT,QAAQ;EACR,cAAc;EACd,aAAa;EACb,OAAO;EACP,YAAY;EACZ,YAAY;EACZ,OAAO;EACP,UAAU;EACV,eAAe;EACf,YAAY;
|
|
1
|
+
{"version":3,"file":"zh.js","names":[],"sources":["../../../src/locales/social/zh.ts"],"sourcesContent":["import type { social as en } from \"./en.js\";\n\nexport const social: typeof en = {\n comments: {\n title: \"评论\",\n count_one: \"{count} 条评论\",\n count_other: \"{count} 条评论\",\n placeholder: \"写评论…\",\n replyPlaceholder: \"写回复…\",\n name: \"名字\",\n namePlaceholder: \"将随评论显示\",\n post: \"发布\",\n posting: \"发布中…\",\n reply: \"回复\",\n replyingTo: \"回复 {name}\",\n empty: \"还没有评论。来发表第一条吧!\",\n loadMore: \"显示更多评论\",\n loading: \"正在加载评论…\",\n loadFailed: \"无法加载评论。\",\n signIn: \"登录后评论\",\n required: \"请先写点内容。\",\n nameRequired: \"请输入名字。\",\n charsLeft_one: \"还剩 {count} 个字符\",\n charsLeft_other: \"还剩 {count} 个字符\",\n submitHint: \"按 {key}+Enter 发布\",\n sort: \"评论排序\",\n newest: \"最新\",\n best: \"最热\",\n showReplies_one: \"显示 {count} 条回复\",\n showReplies_other: \"显示 {count} 条回复\",\n hideReplies: \"隐藏回复\",\n moreReplies: \"显示更多回复\",\n loadingReplies: \"正在加载回复…\",\n anonymous: \"匿名\",\n deleted: \"此评论已删除。\",\n edit: \"编辑\",\n delete: \"删除\",\n actions: \"评论操作\",\n deleteTitle: \"删除这条评论?\",\n deleteBody: \"它会被替换为已删除的提示,回复会保留。\",\n held: \"审核中。在管理员批准前,这条评论只有你能看到。\",\n heldBadge: \"审核中\",\n rejected: \"未发布:{reason}\",\n rejectedNoReason: \"未发布。\",\n rejectedBadge: \"未发布\",\n like: \"赞\",\n dislike: \"踩\",\n showMore: \"展开\",\n showLess: \"收起\",\n restore: \"恢复\",\n locked: \"你不能在这里评论。\",\n rateLimited: \"你评论得太快了。请在 {seconds} 秒后重试。\",\n rateLimitedSoon: \"你评论得太快了。请稍后重试。\",\n ban: \"禁止评论\",\n unban: \"解除评论禁令\",\n },\n bans: {\n globalNotice: \"你不能在本站评论。\",\n ownerNotice: \"你不能评论这位创作者的内容。\",\n reason: \"原因:{reason}\",\n until: \"截至 {date}。\",\n untilLifted: \"直到解除为止。\",\n title: \"禁止 {name} 评论\",\n ownerHelp: \"适用于你的所有内容。对方已有的评论会保留,仍可点赞、收藏和投票。\",\n globalHelp: \"适用于整个网站。对方已有的评论会保留,仍可点赞、收藏和投票。\",\n scope: \"范围\",\n scopeOwner: \"我的内容\",\n scopeGlobal: \"整个网站\",\n duration: \"时长\",\n day: \"1 天\",\n week: \"7 天\",\n month: \"30 天\",\n forever: \"直到解除\",\n custom: \"截至某个日期\",\n endsAt: \"结束\",\n reasonLabel: \"原因(可选)\",\n reasonPlaceholder: \"会显示给该用户\",\n save: \"禁止\",\n update: \"更新禁令\",\n lift: \"解除禁令\",\n liftTitle: \"解除对 {name} 的禁令?\",\n liftBody: \"如果没有其他禁令,对方可以再次评论。\",\n empty: \"没有禁令。\",\n active: \"生效中\",\n expired: \"已过期\",\n bannedAt: \"于 {date} 禁止\",\n add: \"禁止用户\",\n user: \"用户 ID\",\n userPlaceholder: \"该用户的 ID\",\n loadFailed: \"无法加载禁令。\",\n },\n reactions: {\n like: \"赞\",\n dislike: \"踩\",\n signIn: \"登录后表态\",\n failed: \"你的表态未保存。请重试。\",\n },\n favorites: {\n add: \"加入收藏\",\n remove: \"取消收藏\",\n added: \"已加入收藏。\",\n removed: \"已取消收藏。\",\n signIn: \"登录后收藏\",\n },\n poll: {\n votes_one: \"{count} 票\",\n votes_other: \"{count} 票\",\n yourVote: \"你的投票\",\n closes: \"{date} 截止\",\n closed: \"此投票已结束。\",\n signIn: \"登录后投票\",\n answerPlaceholder: \"你的回答\",\n answer: \"提交回答\",\n updateAnswer: \"更新回答\",\n editAnswer: \"编辑回答\",\n yourAnswer: \"你的回答\",\n answers_one: \"{count} 个回答\",\n answers_other: \"{count} 个回答\",\n loadFailed: \"无法加载此投票。\",\n },\n pollEditor: {\n newTitle: \"新投票\",\n editTitle: \"编辑投票\",\n question: \"问题\",\n questionPlaceholder: \"你想问什么?\",\n language: \"语言\",\n kind: \"类型\",\n multipleChoice: \"选择题\",\n freeText: \"自由回答\",\n freeTextHelp: \"读者写下回答,回答会被自动归类。\",\n liveAt: \"上线时间\",\n closesAt: \"截止时间(可选)\",\n active: \"公开可见\",\n inactive: \"对公众隐藏\",\n image: \"问题图片\",\n options: \"选项\",\n option: \"选项 {index}\",\n addOption: \"添加选项\",\n newOption: \"新选项\",\n removeOption: \"删除选项\",\n removeOptionTitle: \"删除此选项?\",\n removeOptionBody: \"它的票数也会被删除。投票至少保留两个选项。\",\n optionImage: \"选项 {index} 的图片\",\n uploadImage: \"添加图片\",\n replaceImage: \"替换图片\",\n removeImage: \"移除图片\",\n create: \"创建投票\",\n creating: \"创建中…\",\n delete: \"删除投票\",\n deleteTitle: \"删除此投票?\",\n deleteBody: \"票数和图片会被删除,且无法撤销。\",\n saved: \"已保存。\",\n created: \"投票已创建。\",\n imageFailed: \"投票已保存,但有一张图片未上传。请在这里重新添加。\",\n minOptions: \"投票至少需要两个选项。\",\n maxOptions: \"投票最多有 {max} 个选项。\",\n questionRequired: \"请填写问题。\",\n optionRequired: \"每个选项都需要文字。\",\n },\n moderation: {\n title: \"评论管理\",\n all: \"全部评论\",\n queue: \"待审队列\",\n bans: \"禁令\",\n kind: \"内容\",\n allKinds: \"全部内容\",\n on: \"位于\",\n published: \"已发布\",\n held: \"已暂扣\",\n rejected: \"已拒绝\",\n deleted: \"已删除\",\n reply: \"回复\",\n delete: \"删除\",\n restore: \"恢复\",\n approve: \"通过\",\n reject: \"拒绝\",\n rejectReason: \"告知作者的原因(可选)\",\n heldBecause: \"暂扣原因:{reason}\",\n empty: \"没有评论。\",\n queueEmpty: \"没有待审内容。\",\n loadFailed: \"无法加载评论。\",\n stale: \"列出后内容已被编辑,请重新审核。\",\n loadMore: \"显示更多\",\n queueComments: \"评论\",\n queuePosts: \"文章\",\n noAccess: \"你没有审核评论的权限。\",\n author: \"作者\",\n authorPlaceholder: \"按用户 ID 筛选\",\n filter: \"筛选\",\n byAuthor: \"{name} 的评论\",\n clearAuthor: \"显示所有人的\",\n theirComments: \"该用户的评论\",\n },\n time: {\n justNow: \"刚刚\",\n },\n contentErrors: {\n forbidden: \"你没有执行此操作的权限。\",\n unauthorized: \"会话已过期。请重新登录。\",\n not_found: \"此内容已不可用。\",\n conflict: \"此内容已在别处更改。请刷新后重试。\",\n rate_limited: \"请求过多。请在 {seconds} 秒后重试。\",\n },\n};\n"],"mappings":"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"}
|
package/dist/locales/zh.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { admin as e } from "./admin/zh.js";
|
|
2
|
+
import { social as t } from "./social/zh.js";
|
|
2
3
|
//#region src/locales/zh.ts
|
|
3
|
-
var
|
|
4
|
+
var n = {
|
|
5
|
+
...t,
|
|
4
6
|
...e,
|
|
5
7
|
common: {
|
|
6
8
|
cancel: "取消",
|
|
@@ -267,6 +269,6 @@ var t = {
|
|
|
267
269
|
}
|
|
268
270
|
};
|
|
269
271
|
//#endregion
|
|
270
|
-
export {
|
|
272
|
+
export { n as zh };
|
|
271
273
|
|
|
272
274
|
//# sourceMappingURL=zh.js.map
|
package/dist/locales/zh.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zh.js","names":[],"sources":["../../src/locales/zh.ts"],"sourcesContent":["import type { ContentKitUiMessageBundle } from \"../i18n/messages.js\";\nimport { social } from \"./social/zh.js\";\n\nexport const zh: ContentKitUiMessageBundle = {\n ...social,\n common: {\n cancel: \"取消\",\n close: \"关闭\",\n save: \"保存\",\n saving: \"正在保存…\",\n retry: \"重试\",\n change: \"更换\",\n upload: \"上传\",\n editCrop: \"编辑裁剪\",\n remove: \"移除\",\n rename: \"重命名\",\n replace: \"替换\",\n },\n crop: {\n title: \"裁剪图片\",\n avatarTitle: \"裁剪头像\",\n coverTitle: \"裁剪封面\",\n description: \"拖动调整位置。滚动、双指缩放或使用滑块来缩放。\",\n area: \"裁剪区域。使用方向键移动图片,按 + 或 − 缩放,按 R 旋转。\",\n zoom: \"缩放\",\n zoomIn: \"放大\",\n zoomOut: \"缩小\",\n rotateLeft: \"向左旋转\",\n rotateRight: \"向右旋转\",\n reset: \"重置\",\n undersized: \"此裁剪宽 {width} 像素;在高分辨率屏幕上需要 {target} 像素或以上才清晰。\",\n tooSmall: \"此图片最宽 {width} 像素;至少需要 {min} 像素。请使用更大的图片。\",\n shape: \"比例\",\n original: \"原始比例\",\n preview: \"效果预览\",\n size: \"{width} × {height} 像素\",\n },\n sortable: {\n handle: \"调整 {name} 的顺序\",\n instructions: \"要调整顺序,请按空格键或回车键,用方向键移动,再按空格键或回车键放下。按 Esc 取消。\",\n pickedUp: \"已拿起 {name},位于第 {position} 位,共 {total} 项。\",\n over: \"{name} 将移到第 {position} 位,共 {total} 项。\",\n dropped: \"{name} 已放在第 {position} 位,共 {total} 项。\",\n droppedAway: \"{name} 已放下。\",\n canceled: \"已取消移动 {name}。\",\n },\n folder: {\n label: \"媒体\",\n drop: \"将文件拖放到此处,或点击选择\",\n add: \"添加文件\",\n commit: \"添加 {count} 个\",\n commitAgain: \"重新添加\",\n adding: \"正在添加…\",\n queued: \"等待中\",\n uploaded: \"已上传\",\n processing: \"处理中…\",\n processingPercent: \"处理中 {percent}%\",\n edited: \"已编辑\",\n failed: \"未处理\",\n failedVideo: \"无法播放\",\n crop: \"裁剪和旋转\",\n select: \"选择 {name}\",\n selected: \"已选择 {count} 个\",\n removeSelected: \"移除所选\",\n clearSelection: \"取消选择\",\n confirmRemove: \"要移除 {count} 个文件吗?此操作无法撤销。\",\n renameLabel: \"{name} 的新名称\",\n paused: \"上传已暂停\",\n resume: \"继续\",\n dismiss: \"关闭\",\n limitSize: \"{what}最大 {size}\",\n limitMax: \"最多 {max} 个\",\n limitAspect: \"视频比例为 {min} 至 {max}\",\n kinds: {\n image: \"图片\",\n video: \"视频\",\n audio: \"音频\",\n subtitle: \"字幕\",\n file: \"文件\",\n },\n },\n readiness: {\n processing: \"正在处理媒体\",\n processingHint: \"所有文件处理完成后将自动发布。\",\n failedOne: \"无法处理 {name}\",\n failedMany: \"无法处理 {count} 个文件:{names}\",\n failedHint: \"移除这些文件后将自动发布。\",\n },\n avatar: {\n label: \"头像\",\n empty: \"暂无头像\",\n hint: \"正方形图片,至少 {size} 像素。\",\n },\n cover: {\n label: \"封面图片\",\n empty: \"暂无封面\",\n hint: \"横向图片,至少 {width} × {height} 像素。\",\n drop: \"将图片拖放到此处\",\n },\n poster: {\n title: \"设置封面\",\n description: \"从视频中选取一帧,或上传一张图片。封面与视频比例相同。\",\n frame: \"视频画面\",\n upload: \"上传图片\",\n time: \"时间\",\n previousFrame: \"上一帧\",\n nextFrame: \"下一帧\",\n jumpTo: \"跳到 {time}\",\n useFrame: \"使用此帧\",\n crop: \"裁剪…\",\n cropTitle: \"裁剪封面\",\n auto: \"自动\",\n autoHint: \"在你选择之前,将使用自动选取的画面。\",\n drop: \"将图片拖到这里,或点击选择\",\n processing: \"视频仍在处理中。编码完成后即可选择封面。\",\n rendering: \"正在生成封面…\",\n },\n progress: {\n decoding: \"正在打开图片…\",\n hashing: \"正在准备…\",\n uploading: \"正在上传… {percent}%\",\n completing: \"正在完成上传…\",\n rendering: \"正在生成各尺寸…\",\n },\n encode: {\n processing: \"正在处理视频\",\n queued: \"等待处理\",\n queuedPosition: \"排队中 · 第 {position} 位\",\n stalled: \"处理已暂停,正在等待服务器…\",\n segments: \"片段 {done} / {total}\",\n higherQualities: \"更高画质\",\n remainingSeconds: \"剩余约 {seconds} 秒\",\n remainingMinutes: \"剩余约 {minutes} 分钟\",\n remainingHours: \"剩余约 {hours} 小时 {minutes} 分钟\",\n almostDone: \"即将完成\",\n estimating: \"正在估算…\",\n phase: {\n queued: \"排队中\",\n downloading: \"准备中\",\n probing: \"分析中\",\n encoding: \"编码中\",\n muxing: \"封装中\",\n uploading: \"保存中\",\n publishing: \"发布中\",\n images: \"正在生成封面\",\n },\n },\n gallery: {\n label: \"媒体\",\n view: \"布局\",\n carousel: \"轮播\",\n grid: \"网格\",\n counter: \"{current} / {total}\",\n slide: \"第 {current} 项,共 {total} 项\",\n previous: \"上一个\",\n next: \"下一个\",\n goTo: \"转到第 {index} 项\",\n open: \"打开第 {index} 项,共 {total} 项\",\n lightbox: \"媒体查看器\",\n lockedOne: \"还有 1 项已锁定\",\n lockedMany: \"还有 {count} 项已锁定\",\n processingImage: \"正在处理图片…\",\n image: \"图片 {index}\",\n video: \"视频 {index}\",\n audio: \"音频 {index}\",\n processingAudio: \"正在处理音频…\",\n download: \"下载\",\n failedAudio: \"无法处理此音频。\",\n failedImage: \"无法处理此图片。\",\n },\n player: {\n play: \"播放视频\",\n loading: \"正在加载视频…\",\n retry: \"重试\",\n code: \"代码 {code}\",\n quality: \"画质\",\n auto: \"自动\",\n autoCurrent: \"自动({quality})\",\n label: \"视频播放器\",\n resume: \"播放\",\n pause: \"暂停\",\n replay: \"重新播放\",\n seek: \"跳转\",\n time: \"{current} / {duration}\",\n seekBack: \"后退 {seconds} 秒\",\n seekForward: \"前进 {seconds} 秒\",\n seconds: \"{seconds} 秒\",\n mute: \"静音\",\n unmute: \"取消静音\",\n volume: \"音量\",\n settings: \"设置\",\n speed: \"播放速度\",\n normal: \"正常\",\n audio: \"音轨\",\n subtitles: \"字幕\",\n subtitlesOff: \"关闭\",\n forced: \"{label}(强制)\",\n track: \"轨道 {number}\",\n fullscreen: \"全屏\",\n exitFullscreen: \"退出全屏\",\n pip: \"画中画\",\n exitPip: \"退出画中画\",\n theater: \"影院模式\",\n miniPlayer: \"迷你播放器\",\n expand: \"展开\",\n close: \"关闭\",\n failed: \"无法处理此视频。\",\n errors: {\n network: \"无法连接到视频服务器。\",\n access: \"你已无权访问此视频。\",\n not_found: \"此视频不可用。\",\n rate_limited: \"请求过多,请稍后重试。\",\n unsupported: \"此浏览器无法播放此视频。\",\n stalled: \"播放已停滞。请检查网络连接后重试。\",\n unknown: \"目前无法播放此视频。\",\n },\n },\n errors: {\n generic: \"我们这边出了问题,请重试。\",\n network: \"连接已断开,请检查网络后重试。\",\n storage: \"上传中断,请重试。\",\n decode: \"无法将此文件作为图片打开。\",\n invalid_request: \"无法保存图片。\",\n unauthorized: \"会话已过期,请重新登录后上传。\",\n forbidden: \"你没有权限更改此图片。\",\n not_found: \"此项目已不存在。\",\n conflict: \"图片已在其他地方被更改,请刷新后重试。\",\n incomplete: \"上传未完成,请重试。\",\n not_uploaded: \"上传已过期,请重新选择图片。\",\n too_large: \"文件过大。\",\n quota_exceeded: \"已达到存储空间上限。\",\n type_not_allowed: \"此处不支持该文件类型。\",\n checksum_mismatch: \"上传过程中文件发生了变化,请重试。\",\n rate_limited: \"上传次数过多,请在 {seconds} 秒后重试。\",\n unavailable: \"媒体存储暂时不可用,请稍后重试。\",\n upgrade_required: \"此项目正在升级,请稍后重试。\",\n internal_error: \"我们这边出了问题,请重试。\",\n allowedTypes: \"请使用 {allowed}。\",\n tooLargeBy: \"此文件为 {size};上限为 {max}。\",\n image_too_small: \"裁剪后图片宽 {width} 像素;至少需要 {min} 像素。请选择更大的区域或使用更大的图片。\",\n image_too_large: \"此图片为 {width}×{height} 像素;图片最多 {megapixels} 百万像素。\",\n image_unreadable: \"此文件不是有效的 {format} 图片。\",\n render_timeout: \"服务器仍在处理,完成后会显示;请稍后再查看。\",\n animation_not_allowed: \"此处不允许动图。请上传静态图片。\",\n animation_unsupported: \"不支持动态 {format} 图片。请使用动态 WebP 或 GIF。\",\n animationFrames: \"动图最多 {maxFrames} 帧;此图有 {frames} 帧。\",\n animationSeconds: \"动图最长 {maxSeconds} 秒。\",\n animationTooLarge: \"此动图过大:{frames} 帧 {width}×{height} 像素。请减少帧数或缩小尺寸。\",\n too_many_files: \"此项目的文件数已达上限。请先删除一些。\",\n animation_too_long: \"此动图过长。\",\n video_too_long: \"此文件时长超出此处允许的范围。\",\n video_too_large: \"此视频的画面尺寸超出此处允许的范围。\",\n videoTooLongBy: \"此文件时长 {duration} 秒;此处上限为 {maxSeconds} 秒。\",\n videoTooLargeBy: \"此视频为 {width}×{height} 像素;视频最多 {megapixels} 百万像素。\",\n video_over_budget: \"处理此视频耗时过长。请使用更短或更小的视频。\",\n video_aspect_unsupported: \"此视频过宽或过高,无法在此使用。\",\n videoAspectBy: \"此视频的比例为 {shape};此处的视频比例须在 {minAspect} 至 {maxAspect} 之间。\",\n tooManyFilesBy: \"此项目最多可包含 {maxFiles} 个此类文件。请先移除一些。\",\n aborted: \"已取消。\",\n resume_mismatch: \"保存的上传属于另一个文件。请重新选择文件。\",\n moderation_rejected: \"已被审核拒绝。\",\n comment_banned: \"你无法在此评论。\",\n comment_too_long: \"评论太长了。\",\n commentTooLongBy: \"评论最多 {maxChars} 个字符。\",\n not_configured: \"此网站未提供该功能。\",\n tenant_mismatch: \"我们这边出了点问题,请重试。\",\n gone: \"此内容已不可用。\",\n },\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"zh.js","names":[],"sources":["../../src/locales/zh.ts"],"sourcesContent":["import type { ContentKitUiMessageBundle } from \"../i18n/messages.js\";\nimport { admin } from \"./admin/zh.js\";\nimport { social } from \"./social/zh.js\";\n\nexport const zh: ContentKitUiMessageBundle = {\n ...social,\n ...admin,\n common: {\n cancel: \"取消\",\n close: \"关闭\",\n save: \"保存\",\n saving: \"正在保存…\",\n retry: \"重试\",\n change: \"更换\",\n upload: \"上传\",\n editCrop: \"编辑裁剪\",\n remove: \"移除\",\n rename: \"重命名\",\n replace: \"替换\",\n },\n crop: {\n title: \"裁剪图片\",\n avatarTitle: \"裁剪头像\",\n coverTitle: \"裁剪封面\",\n description: \"拖动调整位置。滚动、双指缩放或使用滑块来缩放。\",\n area: \"裁剪区域。使用方向键移动图片,按 + 或 − 缩放,按 R 旋转。\",\n zoom: \"缩放\",\n zoomIn: \"放大\",\n zoomOut: \"缩小\",\n rotateLeft: \"向左旋转\",\n rotateRight: \"向右旋转\",\n reset: \"重置\",\n undersized: \"此裁剪宽 {width} 像素;在高分辨率屏幕上需要 {target} 像素或以上才清晰。\",\n tooSmall: \"此图片最宽 {width} 像素;至少需要 {min} 像素。请使用更大的图片。\",\n shape: \"比例\",\n original: \"原始比例\",\n preview: \"效果预览\",\n size: \"{width} × {height} 像素\",\n },\n sortable: {\n handle: \"调整 {name} 的顺序\",\n instructions: \"要调整顺序,请按空格键或回车键,用方向键移动,再按空格键或回车键放下。按 Esc 取消。\",\n pickedUp: \"已拿起 {name},位于第 {position} 位,共 {total} 项。\",\n over: \"{name} 将移到第 {position} 位,共 {total} 项。\",\n dropped: \"{name} 已放在第 {position} 位,共 {total} 项。\",\n droppedAway: \"{name} 已放下。\",\n canceled: \"已取消移动 {name}。\",\n },\n folder: {\n label: \"媒体\",\n drop: \"将文件拖放到此处,或点击选择\",\n add: \"添加文件\",\n commit: \"添加 {count} 个\",\n commitAgain: \"重新添加\",\n adding: \"正在添加…\",\n queued: \"等待中\",\n uploaded: \"已上传\",\n processing: \"处理中…\",\n processingPercent: \"处理中 {percent}%\",\n edited: \"已编辑\",\n failed: \"未处理\",\n failedVideo: \"无法播放\",\n crop: \"裁剪和旋转\",\n select: \"选择 {name}\",\n selected: \"已选择 {count} 个\",\n removeSelected: \"移除所选\",\n clearSelection: \"取消选择\",\n confirmRemove: \"要移除 {count} 个文件吗?此操作无法撤销。\",\n renameLabel: \"{name} 的新名称\",\n paused: \"上传已暂停\",\n resume: \"继续\",\n dismiss: \"关闭\",\n limitSize: \"{what}最大 {size}\",\n limitMax: \"最多 {max} 个\",\n limitAspect: \"视频比例为 {min} 至 {max}\",\n kinds: {\n image: \"图片\",\n video: \"视频\",\n audio: \"音频\",\n subtitle: \"字幕\",\n file: \"文件\",\n },\n },\n readiness: {\n processing: \"正在处理媒体\",\n processingHint: \"所有文件处理完成后将自动发布。\",\n failedOne: \"无法处理 {name}\",\n failedMany: \"无法处理 {count} 个文件:{names}\",\n failedHint: \"移除这些文件后将自动发布。\",\n },\n avatar: {\n label: \"头像\",\n empty: \"暂无头像\",\n hint: \"正方形图片,至少 {size} 像素。\",\n },\n cover: {\n label: \"封面图片\",\n empty: \"暂无封面\",\n hint: \"横向图片,至少 {width} × {height} 像素。\",\n drop: \"将图片拖放到此处\",\n },\n poster: {\n title: \"设置封面\",\n description: \"从视频中选取一帧,或上传一张图片。封面与视频比例相同。\",\n frame: \"视频画面\",\n upload: \"上传图片\",\n time: \"时间\",\n previousFrame: \"上一帧\",\n nextFrame: \"下一帧\",\n jumpTo: \"跳到 {time}\",\n useFrame: \"使用此帧\",\n crop: \"裁剪…\",\n cropTitle: \"裁剪封面\",\n auto: \"自动\",\n autoHint: \"在你选择之前,将使用自动选取的画面。\",\n drop: \"将图片拖到这里,或点击选择\",\n processing: \"视频仍在处理中。编码完成后即可选择封面。\",\n rendering: \"正在生成封面…\",\n },\n progress: {\n decoding: \"正在打开图片…\",\n hashing: \"正在准备…\",\n uploading: \"正在上传… {percent}%\",\n completing: \"正在完成上传…\",\n rendering: \"正在生成各尺寸…\",\n },\n encode: {\n processing: \"正在处理视频\",\n queued: \"等待处理\",\n queuedPosition: \"排队中 · 第 {position} 位\",\n stalled: \"处理已暂停,正在等待服务器…\",\n segments: \"片段 {done} / {total}\",\n higherQualities: \"更高画质\",\n remainingSeconds: \"剩余约 {seconds} 秒\",\n remainingMinutes: \"剩余约 {minutes} 分钟\",\n remainingHours: \"剩余约 {hours} 小时 {minutes} 分钟\",\n almostDone: \"即将完成\",\n estimating: \"正在估算…\",\n phase: {\n queued: \"排队中\",\n downloading: \"准备中\",\n probing: \"分析中\",\n encoding: \"编码中\",\n muxing: \"封装中\",\n uploading: \"保存中\",\n publishing: \"发布中\",\n images: \"正在生成封面\",\n },\n },\n gallery: {\n label: \"媒体\",\n view: \"布局\",\n carousel: \"轮播\",\n grid: \"网格\",\n counter: \"{current} / {total}\",\n slide: \"第 {current} 项,共 {total} 项\",\n previous: \"上一个\",\n next: \"下一个\",\n goTo: \"转到第 {index} 项\",\n open: \"打开第 {index} 项,共 {total} 项\",\n lightbox: \"媒体查看器\",\n lockedOne: \"还有 1 项已锁定\",\n lockedMany: \"还有 {count} 项已锁定\",\n processingImage: \"正在处理图片…\",\n image: \"图片 {index}\",\n video: \"视频 {index}\",\n audio: \"音频 {index}\",\n processingAudio: \"正在处理音频…\",\n download: \"下载\",\n failedAudio: \"无法处理此音频。\",\n failedImage: \"无法处理此图片。\",\n },\n player: {\n play: \"播放视频\",\n loading: \"正在加载视频…\",\n retry: \"重试\",\n code: \"代码 {code}\",\n quality: \"画质\",\n auto: \"自动\",\n autoCurrent: \"自动({quality})\",\n label: \"视频播放器\",\n resume: \"播放\",\n pause: \"暂停\",\n replay: \"重新播放\",\n seek: \"跳转\",\n time: \"{current} / {duration}\",\n seekBack: \"后退 {seconds} 秒\",\n seekForward: \"前进 {seconds} 秒\",\n seconds: \"{seconds} 秒\",\n mute: \"静音\",\n unmute: \"取消静音\",\n volume: \"音量\",\n settings: \"设置\",\n speed: \"播放速度\",\n normal: \"正常\",\n audio: \"音轨\",\n subtitles: \"字幕\",\n subtitlesOff: \"关闭\",\n forced: \"{label}(强制)\",\n track: \"轨道 {number}\",\n fullscreen: \"全屏\",\n exitFullscreen: \"退出全屏\",\n pip: \"画中画\",\n exitPip: \"退出画中画\",\n theater: \"影院模式\",\n miniPlayer: \"迷你播放器\",\n expand: \"展开\",\n close: \"关闭\",\n failed: \"无法处理此视频。\",\n errors: {\n network: \"无法连接到视频服务器。\",\n access: \"你已无权访问此视频。\",\n not_found: \"此视频不可用。\",\n rate_limited: \"请求过多,请稍后重试。\",\n unsupported: \"此浏览器无法播放此视频。\",\n stalled: \"播放已停滞。请检查网络连接后重试。\",\n unknown: \"目前无法播放此视频。\",\n },\n },\n errors: {\n generic: \"我们这边出了问题,请重试。\",\n network: \"连接已断开,请检查网络后重试。\",\n storage: \"上传中断,请重试。\",\n decode: \"无法将此文件作为图片打开。\",\n invalid_request: \"无法保存图片。\",\n unauthorized: \"会话已过期,请重新登录后上传。\",\n forbidden: \"你没有权限更改此图片。\",\n not_found: \"此项目已不存在。\",\n conflict: \"图片已在其他地方被更改,请刷新后重试。\",\n incomplete: \"上传未完成,请重试。\",\n not_uploaded: \"上传已过期,请重新选择图片。\",\n too_large: \"文件过大。\",\n quota_exceeded: \"已达到存储空间上限。\",\n type_not_allowed: \"此处不支持该文件类型。\",\n checksum_mismatch: \"上传过程中文件发生了变化,请重试。\",\n rate_limited: \"上传次数过多,请在 {seconds} 秒后重试。\",\n unavailable: \"媒体存储暂时不可用,请稍后重试。\",\n upgrade_required: \"此项目正在升级,请稍后重试。\",\n internal_error: \"我们这边出了问题,请重试。\",\n allowedTypes: \"请使用 {allowed}。\",\n tooLargeBy: \"此文件为 {size};上限为 {max}。\",\n image_too_small: \"裁剪后图片宽 {width} 像素;至少需要 {min} 像素。请选择更大的区域或使用更大的图片。\",\n image_too_large: \"此图片为 {width}×{height} 像素;图片最多 {megapixels} 百万像素。\",\n image_unreadable: \"此文件不是有效的 {format} 图片。\",\n render_timeout: \"服务器仍在处理,完成后会显示;请稍后再查看。\",\n animation_not_allowed: \"此处不允许动图。请上传静态图片。\",\n animation_unsupported: \"不支持动态 {format} 图片。请使用动态 WebP 或 GIF。\",\n animationFrames: \"动图最多 {maxFrames} 帧;此图有 {frames} 帧。\",\n animationSeconds: \"动图最长 {maxSeconds} 秒。\",\n animationTooLarge: \"此动图过大:{frames} 帧 {width}×{height} 像素。请减少帧数或缩小尺寸。\",\n too_many_files: \"此项目的文件数已达上限。请先删除一些。\",\n animation_too_long: \"此动图过长。\",\n video_too_long: \"此文件时长超出此处允许的范围。\",\n video_too_large: \"此视频的画面尺寸超出此处允许的范围。\",\n videoTooLongBy: \"此文件时长 {duration} 秒;此处上限为 {maxSeconds} 秒。\",\n videoTooLargeBy: \"此视频为 {width}×{height} 像素;视频最多 {megapixels} 百万像素。\",\n video_over_budget: \"处理此视频耗时过长。请使用更短或更小的视频。\",\n video_aspect_unsupported: \"此视频过宽或过高,无法在此使用。\",\n videoAspectBy: \"此视频的比例为 {shape};此处的视频比例须在 {minAspect} 至 {maxAspect} 之间。\",\n tooManyFilesBy: \"此项目最多可包含 {maxFiles} 个此类文件。请先移除一些。\",\n aborted: \"已取消。\",\n resume_mismatch: \"保存的上传属于另一个文件。请重新选择文件。\",\n moderation_rejected: \"已被审核拒绝。\",\n comment_banned: \"你无法在此评论。\",\n comment_too_long: \"评论太长了。\",\n commentTooLongBy: \"评论最多 {maxChars} 个字符。\",\n not_configured: \"此网站未提供该功能。\",\n tenant_mismatch: \"我们这边出了点问题,请重试。\",\n gone: \"此内容已不可用。\",\n },\n};\n"],"mappings":"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"}
|
package/dist/provider.d.ts
CHANGED
|
@@ -18,5 +18,7 @@ export interface ContentKitUiProviderProps {
|
|
|
18
18
|
inlinePreview?: boolean;
|
|
19
19
|
children?: ReactNode;
|
|
20
20
|
}
|
|
21
|
+
/** The translator for a language's bundle (loaded on demand) under the given bundles and host hook. */
|
|
22
|
+
export declare function useTranslator(language?: string, messages?: ContentKitUiMessageBundle | readonly ContentKitUiMessageBundle[], t?: ContentKitUiTranslate): import('./index.js').Translator;
|
|
21
23
|
/** Look and language for every component below. Renders no DOM; components create their own `.ckui` roots. */
|
|
22
24
|
export declare function ContentKitUiProvider({ appearance, language, messages, t, density, inlinePreview, children }: ContentKitUiProviderProps): import('react').JSX.Element;
|
package/dist/provider.js
CHANGED
|
@@ -18,42 +18,46 @@ function f(e) {
|
|
|
18
18
|
let t = e?.toLowerCase().split(/[-_]/)[0];
|
|
19
19
|
return t && t in d ? t : void 0;
|
|
20
20
|
}
|
|
21
|
-
function p(
|
|
22
|
-
let
|
|
21
|
+
function p(e, t, n) {
|
|
22
|
+
let a = f(e), [o, u] = l(null);
|
|
23
23
|
s(() => {
|
|
24
|
-
if (!
|
|
24
|
+
if (!a) return;
|
|
25
25
|
let e = !0;
|
|
26
|
-
return d[
|
|
27
|
-
lang:
|
|
26
|
+
return d[a]().then((t) => e && u({
|
|
27
|
+
lang: a,
|
|
28
28
|
bundle: t
|
|
29
29
|
}), () => {}), () => {
|
|
30
30
|
e = !1;
|
|
31
31
|
};
|
|
32
|
-
}, [
|
|
33
|
-
let
|
|
34
|
-
|
|
35
|
-
|
|
32
|
+
}, [a]);
|
|
33
|
+
let p = a && o?.lang === a ? o.bundle : void 0;
|
|
34
|
+
return c(() => {
|
|
35
|
+
let a = t ? Array.isArray(t) ? t : [t] : [];
|
|
36
|
+
return r(i(p ? [p, ...a] : a), n, e);
|
|
36
37
|
}, [
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
38
|
+
p,
|
|
39
|
+
t,
|
|
40
|
+
n,
|
|
41
|
+
e
|
|
41
42
|
]);
|
|
43
|
+
}
|
|
44
|
+
function m({ appearance: r, language: i, messages: s, t: c, density: l = e, inlinePreview: d = !0, children: f }) {
|
|
45
|
+
let m = p(i, s, c);
|
|
42
46
|
return /* @__PURE__ */ u(o.Provider, {
|
|
43
|
-
value:
|
|
47
|
+
value: r,
|
|
44
48
|
children: /* @__PURE__ */ u(a.Provider, {
|
|
45
|
-
value:
|
|
49
|
+
value: m,
|
|
46
50
|
children: /* @__PURE__ */ u(n.Provider, {
|
|
47
|
-
value:
|
|
51
|
+
value: l,
|
|
48
52
|
children: /* @__PURE__ */ u(t.Provider, {
|
|
49
|
-
value:
|
|
50
|
-
children:
|
|
53
|
+
value: d,
|
|
54
|
+
children: f
|
|
51
55
|
})
|
|
52
56
|
})
|
|
53
57
|
})
|
|
54
58
|
});
|
|
55
59
|
}
|
|
56
60
|
//#endregion
|
|
57
|
-
export {
|
|
61
|
+
export { m as ContentKitUiProvider, f as bundleLanguage, p as useTranslator };
|
|
58
62
|
|
|
59
63
|
//# sourceMappingURL=provider.js.map
|
package/dist/provider.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.js","names":[],"sources":["../src/provider.tsx"],"sourcesContent":["import { useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport type { ContentKitUiAppearance } from \"./appearance.js\";\nimport { DEFAULT_DENSITY, type DensityRange } from \"./client/rendition.js\";\nimport { DensityContext } from \"./components/rendition-img.js\";\nimport { MessagesContext } from \"./i18n/context.js\";\nimport { createTranslator, resolveMessages, type ContentKitUiMessageBundle, type ContentKitUiTranslate } from \"./i18n/messages.js\";\nimport { InlinePreviewContext } from \"./react/inline-preview.js\";\nimport { AppearanceContext } from \"./scope.js\";\n\n/** Built-in bundles besides English, loaded on demand. */\nconst BUNDLES: Record<string, () => Promise<ContentKitUiMessageBundle>> = {\n de: () => import(\"./locales/de.js\").then((m) => m.de),\n es: () => import(\"./locales/es.js\").then((m) => m.es),\n ja: () => import(\"./locales/ja.js\").then((m) => m.ja),\n ko: () => import(\"./locales/ko.js\").then((m) => m.ko),\n zh: () => import(\"./locales/zh.js\").then((m) => m.zh),\n};\n\n/** The built-in bundle's language for a BCP 47 tag (\"ja-JP\" → \"ja\"); undefined for English or one we lack. */\nexport function bundleLanguage(language: string | null | undefined): string | undefined {\n const primary = language?.toLowerCase().split(/[-_]/)[0];\n return primary && primary in BUNDLES ? primary : undefined;\n}\n\nexport interface ContentKitUiProviderProps {\n appearance?: ContentKitUiAppearance;\n /** BCP 47 tag; its built-in bundle loads under `messages`. English until it arrives. */\n language?: string;\n /** Bundle(s) layered over English and the language's bundle; later entries win. */\n messages?: ContentKitUiMessageBundle | readonly ContentKitUiMessageBundle[];\n /** Host translation hook, consulted before the bundles. */\n t?: ContentKitUiTranslate;\n /** Device-pixel density range images and covers are picked for. Default [2, 3]. */\n density?: DensityRange;\n /** Playable videos preview muted inline (hover, or in view on touch). Default true. */\n inlinePreview?: boolean;\n children?: ReactNode;\n}\n\n/**
|
|
1
|
+
{"version":3,"file":"provider.js","names":[],"sources":["../src/provider.tsx"],"sourcesContent":["import { useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport type { ContentKitUiAppearance } from \"./appearance.js\";\nimport { DEFAULT_DENSITY, type DensityRange } from \"./client/rendition.js\";\nimport { DensityContext } from \"./components/rendition-img.js\";\nimport { MessagesContext } from \"./i18n/context.js\";\nimport { createTranslator, resolveMessages, type ContentKitUiMessageBundle, type ContentKitUiTranslate } from \"./i18n/messages.js\";\nimport { InlinePreviewContext } from \"./react/inline-preview.js\";\nimport { AppearanceContext } from \"./scope.js\";\n\n/** Built-in bundles besides English, loaded on demand. */\nconst BUNDLES: Record<string, () => Promise<ContentKitUiMessageBundle>> = {\n de: () => import(\"./locales/de.js\").then((m) => m.de),\n es: () => import(\"./locales/es.js\").then((m) => m.es),\n ja: () => import(\"./locales/ja.js\").then((m) => m.ja),\n ko: () => import(\"./locales/ko.js\").then((m) => m.ko),\n zh: () => import(\"./locales/zh.js\").then((m) => m.zh),\n};\n\n/** The built-in bundle's language for a BCP 47 tag (\"ja-JP\" → \"ja\"); undefined for English or one we lack. */\nexport function bundleLanguage(language: string | null | undefined): string | undefined {\n const primary = language?.toLowerCase().split(/[-_]/)[0];\n return primary && primary in BUNDLES ? primary : undefined;\n}\n\nexport interface ContentKitUiProviderProps {\n appearance?: ContentKitUiAppearance;\n /** BCP 47 tag; its built-in bundle loads under `messages`. English until it arrives. */\n language?: string;\n /** Bundle(s) layered over English and the language's bundle; later entries win. */\n messages?: ContentKitUiMessageBundle | readonly ContentKitUiMessageBundle[];\n /** Host translation hook, consulted before the bundles. */\n t?: ContentKitUiTranslate;\n /** Device-pixel density range images and covers are picked for. Default [2, 3]. */\n density?: DensityRange;\n /** Playable videos preview muted inline (hover, or in view on touch). Default true. */\n inlinePreview?: boolean;\n children?: ReactNode;\n}\n\n/** The translator for a language's bundle (loaded on demand) under the given bundles and host hook. */\nexport function useTranslator(language?: string, messages?: ContentKitUiMessageBundle | readonly ContentKitUiMessageBundle[], t?: ContentKitUiTranslate) {\n const lang = bundleLanguage(language);\n const [loaded, setLoaded] = useState<{ lang: string; bundle: ContentKitUiMessageBundle } | null>(null);\n useEffect(() => {\n if (!lang) return;\n let live = true;\n BUNDLES[lang]!().then(\n (bundle) => live && setLoaded({ lang, bundle }),\n () => {},\n );\n return () => {\n live = false;\n };\n }, [lang]);\n const bundle = lang && loaded?.lang === lang ? loaded.bundle : undefined;\n return useMemo(() => {\n const own = messages ? (Array.isArray(messages) ? messages : [messages]) : [];\n return createTranslator(resolveMessages(bundle ? [bundle, ...own] : own), t, language);\n }, [bundle, messages, t, language]);\n}\n\n/** Look and language for every component below. Renders no DOM; components create their own `.ckui` roots. */\nexport function ContentKitUiProvider({ appearance, language, messages, t, density = DEFAULT_DENSITY, inlinePreview = true, children }: ContentKitUiProviderProps) {\n const translator = useTranslator(language, messages, t);\n return (\n <AppearanceContext.Provider value={appearance}>\n <MessagesContext.Provider value={translator}>\n <DensityContext.Provider value={density}>\n <InlinePreviewContext.Provider value={inlinePreview}>{children}</InlinePreviewContext.Provider>\n </DensityContext.Provider>\n </MessagesContext.Provider>\n </AppearanceContext.Provider>\n );\n}\n"],"mappings":";;;;;;;;;AAUA,IAAM,IAAoE;CACxE,UAAU,OAAO,kBAAkB,CAAC,MAAM,MAAM,EAAE,EAAE;CACpD,UAAU,OAAO,kBAAkB,CAAC,MAAM,MAAM,EAAE,EAAE;CACpD,UAAU,OAAO,kBAAkB,CAAC,MAAM,MAAM,EAAE,EAAE;CACpD,UAAU,OAAO,kBAAkB,CAAC,MAAM,MAAM,EAAE,EAAE;CACpD,UAAU,OAAO,kBAAkB,CAAC,MAAM,MAAM,EAAE,EAAE;AACtD;AAGA,SAAgB,EAAe,GAAyD;CACtF,IAAM,IAAU,GAAU,YAAY,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC;CACtD,OAAO,KAAW,KAAW,IAAU,IAAU,KAAA;AACnD;AAkBA,SAAgB,EAAc,GAAmB,GAA6E,GAA2B;CACvJ,IAAM,IAAO,EAAe,CAAQ,GAC9B,CAAC,GAAQ,KAAa,EAAqE,IAAI;CACrG,QAAgB;EACd,IAAI,CAAC,GAAM;EACX,IAAI,IAAO;EAKX,OAJA,EAAQ,EAAK,CAAE,CAAC,CAAC,MACd,MAAW,KAAQ,EAAU;GAAE;GAAM;EAAO,CAAC,SACxC,CAAC,CACT,SACa;GACX,IAAO;EACT;CACF,GAAG,CAAC,CAAI,CAAC;CACT,IAAM,IAAS,KAAQ,GAAQ,SAAS,IAAO,EAAO,SAAS,KAAA;CAC/D,OAAO,QAAc;EACnB,IAAM,IAAM,IAAY,MAAM,QAAQ,CAAQ,IAAI,IAAW,CAAC,CAAQ,IAAK,CAAC;EAC5E,OAAO,EAAiB,EAAgB,IAAS,CAAC,GAAQ,GAAG,CAAG,IAAI,CAAG,GAAG,GAAG,CAAQ;CACvF,GAAG;EAAC;EAAQ;EAAU;EAAG;CAAQ,CAAC;AACpC;AAGA,SAAgB,EAAqB,EAAE,eAAY,aAAU,aAAU,MAAG,aAAU,GAAiB,mBAAgB,IAAM,eAAuC;CAChK,IAAM,IAAa,EAAc,GAAU,GAAU,CAAC;CACtD,OACE,kBAAC,EAAkB,UAAnB;EAA4B,OAAO;EACjC,UAAA,kBAAC,EAAgB,UAAjB;GAA0B,OAAO;GAC/B,UAAA,kBAAC,EAAe,UAAhB;IAAyB,OAAO;IAC9B,UAAA,kBAAC,EAAqB,UAAtB;KAA+B,OAAO;KAAgB;IAAwC,CAAA;GACvE,CAAA;EACD,CAAA;CACA,CAAA;AAEhC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { ContentKitClient } from '../client/client.js';
|
|
2
|
+
import { ContentKitError } from '../client/errors.js';
|
|
3
|
+
import { TokenSource } from '../client/http.js';
|
|
4
|
+
/** What a flow needs of the host's auth: an authenticating fetch, as auth-ui's AuthClient and IssuerClient have. */
|
|
5
|
+
export interface ContentKitAuth {
|
|
6
|
+
authFetch: (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;
|
|
7
|
+
/** The access token, for HLS playlists on the API origin. */
|
|
8
|
+
getAccessToken?: TokenSource;
|
|
9
|
+
}
|
|
10
|
+
/** How a flow reaches ContentKit: its own client, or baseUrl with the host's auth; else the provider's client. */
|
|
11
|
+
export interface FlowClientOptions {
|
|
12
|
+
client?: ContentKitClient;
|
|
13
|
+
baseUrl?: string;
|
|
14
|
+
auth?: ContentKitAuth;
|
|
15
|
+
}
|
|
16
|
+
/** The flow's client: `client`, else one made from `baseUrl` and `auth`, else the provider's. */
|
|
17
|
+
export declare function useFlowClient({ client, baseUrl, auth }: FlowClientOptions): ContentKitClient;
|
|
18
|
+
/** The host router as a flow sees it. With React Router: `{ pathname, search }` of useLocation() and useNavigate(). */
|
|
19
|
+
export interface AdminNavigation {
|
|
20
|
+
pathname: string;
|
|
21
|
+
search: string;
|
|
22
|
+
navigate: (to: string, options?: {
|
|
23
|
+
replace?: boolean;
|
|
24
|
+
}) => void;
|
|
25
|
+
}
|
|
26
|
+
/** A query for a view; empty values are left out. */
|
|
27
|
+
export type AdminQuery = Record<string, string | number | null | undefined>;
|
|
28
|
+
export interface AdminLocation {
|
|
29
|
+
/** The view: the path under basePath, "" at its root. */
|
|
30
|
+
view: string;
|
|
31
|
+
query: URLSearchParams;
|
|
32
|
+
go: (view: string, query?: AdminQuery, options?: {
|
|
33
|
+
replace?: boolean;
|
|
34
|
+
}) => void;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* A multi-view flow's place: under basePath in the host router (navigation),
|
|
38
|
+
* else in the browser history; without basePath, in memory.
|
|
39
|
+
*/
|
|
40
|
+
export declare function useAdminLocation(basePath: string | undefined, navigation: AdminNavigation | undefined): AdminLocation;
|
|
41
|
+
/** A ContentKit staff area, each behind its own permission. */
|
|
42
|
+
export type StaffArea = "comments" | "queue" | "bans" | "polls" | "posts" | "taxonomy";
|
|
43
|
+
export interface StaffAccess<A extends StaffArea> {
|
|
44
|
+
loading: boolean;
|
|
45
|
+
/** Per area; true until known, and when the check itself failed (the area then shows its own error). */
|
|
46
|
+
allowed: Record<A, boolean>;
|
|
47
|
+
/** Some area is allowed. */
|
|
48
|
+
any: boolean;
|
|
49
|
+
error?: ContentKitError;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* What the caller may do in each area: one small read per area, refused
|
|
53
|
+
* (401, 403) or not, shared by every hook asking on the client.
|
|
54
|
+
*/
|
|
55
|
+
export declare function useStaffAccess<A extends StaffArea>(areas: readonly A[], o?: FlowClientOptions): StaffAccess<A>;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { toContentKitError as e } from "../client/errors.js";
|
|
2
|
+
import { useContentKitClient as t } from "./context.js";
|
|
3
|
+
import { keyOf as n, useContentScope as r, useResource as i } from "./use-resource.js";
|
|
4
|
+
import { createContentKitClient as a } from "../client/client.js";
|
|
5
|
+
import { useCallback as o, useMemo as s, useState as c, useSyncExternalStore as l } from "react";
|
|
6
|
+
//#region src/react/admin.ts
|
|
7
|
+
function u({ client: e, baseUrl: n, auth: r }) {
|
|
8
|
+
let i = s(() => e || n === void 0 ? null : a({
|
|
9
|
+
baseUrl: n,
|
|
10
|
+
fetch: r ? (e, t) => r.authFetch(e, t) : void 0,
|
|
11
|
+
token: r?.getAccessToken ? () => r.getAccessToken() : void 0
|
|
12
|
+
}), [
|
|
13
|
+
e,
|
|
14
|
+
n,
|
|
15
|
+
r
|
|
16
|
+
]);
|
|
17
|
+
return t(e ?? i);
|
|
18
|
+
}
|
|
19
|
+
var d = "ckui:navigate", f = (e) => (addEventListener("popstate", e), addEventListener(d, e), () => {
|
|
20
|
+
removeEventListener("popstate", e), removeEventListener(d, e);
|
|
21
|
+
}), p = () => location.pathname + location.search, m = () => "";
|
|
22
|
+
function h(e = {}) {
|
|
23
|
+
let t = new URLSearchParams();
|
|
24
|
+
for (let [n, r] of Object.entries(e)) r != null && r !== "" && t.set(n, String(r));
|
|
25
|
+
let n = t.toString();
|
|
26
|
+
return n ? `?${n}` : "";
|
|
27
|
+
}
|
|
28
|
+
function g(e, t) {
|
|
29
|
+
let n = l(t || e === void 0 ? _ : f, p, m), [r, i] = c({
|
|
30
|
+
view: "",
|
|
31
|
+
search: ""
|
|
32
|
+
}), a = e?.replace(/\/+$/, "") ?? "", u, g;
|
|
33
|
+
if (e === void 0 && !t) ({view: u, search: g} = r);
|
|
34
|
+
else {
|
|
35
|
+
let [e, r = ""] = v(t ? t.pathname + t.search : n, "?");
|
|
36
|
+
g = r ? `?${r}` : "", u = e === a || e === `${a}/` ? "" : e.startsWith(`${a}/`) ? e.slice(a.length + 1).replace(/\/+$/, "") : "";
|
|
37
|
+
}
|
|
38
|
+
let y = o((n, r, o = {}) => {
|
|
39
|
+
let s = h(r);
|
|
40
|
+
if (e === void 0 && !t) return i({
|
|
41
|
+
view: n,
|
|
42
|
+
search: s
|
|
43
|
+
});
|
|
44
|
+
let c = (n ? `${a}/${n}` : a || "/") + s;
|
|
45
|
+
if (t) return t.navigate(c, o);
|
|
46
|
+
window.history[o.replace ? "replaceState" : "pushState"](null, "", c), dispatchEvent(new Event(d));
|
|
47
|
+
}, [
|
|
48
|
+
e,
|
|
49
|
+
a,
|
|
50
|
+
t
|
|
51
|
+
]), b = s(() => new URLSearchParams(g), [g]);
|
|
52
|
+
return {
|
|
53
|
+
view: u,
|
|
54
|
+
query: b,
|
|
55
|
+
go: y
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
var _ = () => () => {};
|
|
59
|
+
function v(e, t) {
|
|
60
|
+
let n = e.indexOf(t);
|
|
61
|
+
return n < 0 ? [e] : [e.slice(0, n), e.slice(n + 1)];
|
|
62
|
+
}
|
|
63
|
+
var y = {
|
|
64
|
+
comments: (e, t) => e.comments.adminList({ limit: 1 }, t),
|
|
65
|
+
queue: (e, t) => e.moderation.held({
|
|
66
|
+
kind: "comment",
|
|
67
|
+
limit: 1
|
|
68
|
+
}, t),
|
|
69
|
+
bans: (e, t) => e.bans.list("global", { limit: 1 }, t),
|
|
70
|
+
polls: (e, t) => e.polls.adminList({ limit: 1 }, t),
|
|
71
|
+
posts: (e, t) => e.posts.adminList({ limit: 1 }, t),
|
|
72
|
+
taxonomy: (e, t) => e.taxonomy.nodes({ limit: 1 }, t)
|
|
73
|
+
};
|
|
74
|
+
function b(t, a = {}) {
|
|
75
|
+
let o = u(a), { store: s, scope: c } = r(o), l = i(s, n("access", c, ...t), { type: "access" }, async (n) => {
|
|
76
|
+
let r = {};
|
|
77
|
+
return await Promise.all(t.map(async (t) => {
|
|
78
|
+
try {
|
|
79
|
+
await y[t](o, n), r[t] = !0;
|
|
80
|
+
} catch (n) {
|
|
81
|
+
let i = e(n);
|
|
82
|
+
if (i.code !== "forbidden" && i.code !== "unauthorized") throw i;
|
|
83
|
+
r[t] = !1;
|
|
84
|
+
}
|
|
85
|
+
})), r;
|
|
86
|
+
}), d = Object.fromEntries(t.map((e) => [e, l.data?.[e] ?? !0]));
|
|
87
|
+
return {
|
|
88
|
+
loading: l.loading || !l.loaded,
|
|
89
|
+
allowed: d,
|
|
90
|
+
any: t.some((e) => d[e]),
|
|
91
|
+
error: l.error
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
//#endregion
|
|
95
|
+
export { g as useAdminLocation, u as useFlowClient, b as useStaffAccess };
|
|
96
|
+
|
|
97
|
+
//# sourceMappingURL=admin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin.js","names":[],"sources":["../../src/react/admin.ts"],"sourcesContent":["import { useCallback, useMemo, useState, useSyncExternalStore } from \"react\";\nimport { createContentKitClient, type ContentKitClient } from \"../client/client.js\";\nimport { toContentKitError, type ContentKitError } from \"../client/errors.js\";\nimport type { TokenSource } from \"../client/http.js\";\nimport { useContentKitClient } from \"./context.js\";\nimport { keyOf, useContentScope, useResource } from \"./use-resource.js\";\n\n/** What a flow needs of the host's auth: an authenticating fetch, as auth-ui's AuthClient and IssuerClient have. */\nexport interface ContentKitAuth {\n authFetch: (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;\n /** The access token, for HLS playlists on the API origin. */\n getAccessToken?: TokenSource;\n}\n\n/** How a flow reaches ContentKit: its own client, or baseUrl with the host's auth; else the provider's client. */\nexport interface FlowClientOptions {\n client?: ContentKitClient;\n baseUrl?: string;\n auth?: ContentKitAuth;\n}\n\n/** The flow's client: `client`, else one made from `baseUrl` and `auth`, else the provider's. */\nexport function useFlowClient({ client, baseUrl, auth }: FlowClientOptions): ContentKitClient {\n const made = useMemo(\n () =>\n client || baseUrl === undefined\n ? null\n : createContentKitClient({\n baseUrl,\n fetch: auth ? (input, init) => auth.authFetch(input, init) : undefined,\n token: auth?.getAccessToken ? () => auth.getAccessToken!() : undefined,\n }),\n [client, baseUrl, auth],\n );\n return useContentKitClient(client ?? made);\n}\n\n/** The host router as a flow sees it. With React Router: `{ pathname, search }` of useLocation() and useNavigate(). */\nexport interface AdminNavigation {\n pathname: string;\n search: string;\n navigate: (to: string, options?: { replace?: boolean }) => void;\n}\n\n/** A query for a view; empty values are left out. */\nexport type AdminQuery = Record<string, string | number | null | undefined>;\n\nexport interface AdminLocation {\n /** The view: the path under basePath, \"\" at its root. */\n view: string;\n query: URLSearchParams;\n go: (view: string, query?: AdminQuery, options?: { replace?: boolean }) => void;\n}\n\nconst MOVED = \"ckui:navigate\";\nconst subscribeHistory = (cb: () => void) => {\n addEventListener(\"popstate\", cb);\n addEventListener(MOVED, cb);\n return () => {\n removeEventListener(\"popstate\", cb);\n removeEventListener(MOVED, cb);\n };\n};\nconst historySnapshot = () => location.pathname + location.search;\nconst noHistory = () => \"\";\n\nfunction encode(query: AdminQuery = {}): string {\n const q = new URLSearchParams();\n for (const [k, v] of Object.entries(query)) if (v !== undefined && v !== null && v !== \"\") q.set(k, String(v));\n const s = q.toString();\n return s ? `?${s}` : \"\";\n}\n\n/**\n * A multi-view flow's place: under basePath in the host router (navigation),\n * else in the browser history; without basePath, in memory.\n */\nexport function useAdminLocation(basePath: string | undefined, navigation: AdminNavigation | undefined): AdminLocation {\n const history = useSyncExternalStore(navigation || basePath === undefined ? subscribeNone : subscribeHistory, historySnapshot, noHistory);\n const [memory, setMemory] = useState({ view: \"\", search: \"\" });\n const base = basePath?.replace(/\\/+$/, \"\") ?? \"\";\n let view: string;\n let search: string;\n if (basePath === undefined && !navigation) {\n ({ view, search } = memory);\n } else {\n const at = navigation ? navigation.pathname + navigation.search : history;\n const [pathname, query = \"\"] = splitOnce(at, \"?\");\n search = query ? `?${query}` : \"\";\n view = pathname === base || pathname === `${base}/` ? \"\" : pathname.startsWith(`${base}/`) ? pathname.slice(base.length + 1).replace(/\\/+$/, \"\") : \"\";\n }\n const go = useCallback(\n (to: string, query?: AdminQuery, o: { replace?: boolean } = {}) => {\n const qs = encode(query);\n if (basePath === undefined && !navigation) return setMemory({ view: to, search: qs });\n const url = (to ? `${base}/${to}` : base || \"/\") + qs;\n if (navigation) return navigation.navigate(url, o);\n window.history[o.replace ? \"replaceState\" : \"pushState\"](null, \"\", url);\n dispatchEvent(new Event(MOVED));\n },\n [basePath, base, navigation],\n );\n const query = useMemo(() => new URLSearchParams(search), [search]);\n return { view, query, go };\n}\n\nconst subscribeNone = () => () => {};\n\nfunction splitOnce(s: string, sep: string): [string, string?] {\n const i = s.indexOf(sep);\n return i < 0 ? [s] : [s.slice(0, i), s.slice(i + 1)];\n}\n\n/** A ContentKit staff area, each behind its own permission. */\nexport type StaffArea = \"comments\" | \"queue\" | \"bans\" | \"polls\" | \"posts\" | \"taxonomy\";\n\nconst PROBES: Record<StaffArea, (c: ContentKitClient, signal: AbortSignal) => Promise<unknown>> = {\n comments: (c, signal) => c.comments.adminList({ limit: 1 }, signal),\n queue: (c, signal) => c.moderation.held({ kind: \"comment\", limit: 1 }, signal),\n bans: (c, signal) => c.bans.list(\"global\", { limit: 1 }, signal),\n polls: (c, signal) => c.polls.adminList({ limit: 1 }, signal),\n posts: (c, signal) => c.posts.adminList({ limit: 1 }, signal),\n taxonomy: (c, signal) => c.taxonomy.nodes({ limit: 1 }, signal),\n};\n\nexport interface StaffAccess<A extends StaffArea> {\n loading: boolean;\n /** Per area; true until known, and when the check itself failed (the area then shows its own error). */\n allowed: Record<A, boolean>;\n /** Some area is allowed. */\n any: boolean;\n error?: ContentKitError;\n}\n\n/**\n * What the caller may do in each area: one small read per area, refused\n * (401, 403) or not, shared by every hook asking on the client.\n */\nexport function useStaffAccess<A extends StaffArea>(areas: readonly A[], o: FlowClientOptions = {}): StaffAccess<A> {\n const client = useFlowClient(o);\n const { store, scope } = useContentScope(client);\n const r = useResource<Record<string, boolean>>(store, keyOf(\"access\", scope, ...areas), { type: \"access\" }, async (signal) => {\n const out: Record<string, boolean> = {};\n await Promise.all(\n areas.map(async (a) => {\n try {\n await PROBES[a](client, signal);\n out[a] = true;\n } catch (e) {\n const err = toContentKitError(e);\n if (err.code !== \"forbidden\" && err.code !== \"unauthorized\") throw err;\n out[a] = false;\n }\n }),\n );\n return out;\n });\n const allowed = Object.fromEntries(areas.map((a) => [a, r.data?.[a] ?? true])) as Record<A, boolean>;\n return { loading: r.loading || !r.loaded, allowed, any: areas.some((a) => allowed[a]), error: r.error };\n}\n"],"mappings":"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"}
|