Initial baseline: LaraBlog core with plugin commerce surface.
Captures the current working tree after theme slots, ArticleAccess, and the payment / paid-content plugins so subsequent work has a reviewable git history.
This commit is contained in:
@@ -0,0 +1,384 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'brand' => 'LaraBlog Admin',
|
||||
'dashboard' => 'Dashboard',
|
||||
|
||||
'groups' => [
|
||||
'content' => 'Content',
|
||||
'system' => 'System',
|
||||
'plugins' => 'Plugins',
|
||||
],
|
||||
|
||||
'nav' => [
|
||||
'articles' => 'Articles',
|
||||
'categories' => 'Categories',
|
||||
'comments' => 'Comments',
|
||||
'tags' => 'Tags',
|
||||
'links' => 'Links',
|
||||
'attachments' => 'Attachments',
|
||||
'stylevars' => 'Stylevars',
|
||||
'users' => 'Users',
|
||||
'themes' => 'Themes',
|
||||
'plugins' => 'Plugins',
|
||||
'settings' => 'Settings',
|
||||
'cache' => 'Clear cache',
|
||||
'payment' => 'Payment',
|
||||
'orders' => 'Orders',
|
||||
'payment_settings' => 'Payment settings',
|
||||
'membership' => 'Membership',
|
||||
'plugin_marketplace' => 'Plugin marketplace',
|
||||
'theme_marketplace' => 'Theme marketplace',
|
||||
],
|
||||
|
||||
'models' => [
|
||||
'article' => 'Article',
|
||||
'articles' => 'Articles',
|
||||
'category' => 'Category',
|
||||
'categories' => 'Categories',
|
||||
'comment' => 'Comment',
|
||||
'comments' => 'Comments',
|
||||
'tag' => 'Tag',
|
||||
'tags' => 'Tags',
|
||||
'link' => 'Link',
|
||||
'links' => 'Links',
|
||||
'attachment' => 'Attachment',
|
||||
'attachments' => 'Attachments',
|
||||
'stylevar' => 'Stylevar',
|
||||
'stylevars' => 'Stylevars',
|
||||
'user' => 'User',
|
||||
'users' => 'Users',
|
||||
'plugin' => 'Plugin',
|
||||
'plugins' => 'Plugins',
|
||||
'order' => 'Order',
|
||||
'orders' => 'Orders',
|
||||
],
|
||||
|
||||
'actions' => [
|
||||
'save' => 'Save',
|
||||
'edit' => 'Edit',
|
||||
'delete' => 'Delete',
|
||||
'create' => 'Create',
|
||||
'cancel' => 'Cancel',
|
||||
'confirm' => 'Confirm',
|
||||
'mark_paid' => 'Mark as paid',
|
||||
],
|
||||
|
||||
'fields' => [
|
||||
'id' => 'ID',
|
||||
'title' => 'Title',
|
||||
'name' => 'Name',
|
||||
'display_name' => 'Display name',
|
||||
'username' => 'Username',
|
||||
'email' => 'Email',
|
||||
'password' => 'Password',
|
||||
'url' => 'URL',
|
||||
'website' => 'Website',
|
||||
'roles' => 'Roles',
|
||||
'category' => 'Category',
|
||||
'author' => 'Author',
|
||||
'user' => 'User',
|
||||
'article' => 'Article',
|
||||
'description' => 'Description',
|
||||
'keywords' => 'Keywords',
|
||||
'slug' => 'Slug',
|
||||
'published_at' => 'Published at',
|
||||
'created_at' => 'Created at',
|
||||
'updated_at' => 'Updated at',
|
||||
'login_at' => 'Last login',
|
||||
'views' => 'Views',
|
||||
'comments_count' => 'Comments',
|
||||
'stick' => 'Sticky',
|
||||
'visible' => 'Visible',
|
||||
'close_comment' => 'Comments closed',
|
||||
'content_format' => 'Content format',
|
||||
'content' => 'Content',
|
||||
'content_markdown' => 'Content (Markdown)',
|
||||
'content_html' => 'Content (HTML)',
|
||||
'read_password' => 'Read password',
|
||||
'ai_summary' => 'AI summary',
|
||||
'display_order' => 'Order',
|
||||
'articles_count' => 'Articles',
|
||||
'use_count' => 'Usage count',
|
||||
'note' => 'Note',
|
||||
'ip' => 'IP',
|
||||
'moderation_status' => 'Moderation status',
|
||||
'disk' => 'Disk',
|
||||
'path' => 'Path',
|
||||
'thumb_path' => 'Thumbnail path',
|
||||
'filename' => 'Filename',
|
||||
'mime' => 'MIME type',
|
||||
'size' => 'Size',
|
||||
'checksum' => 'Checksum',
|
||||
'visibility' => 'Visibility',
|
||||
'legacy_filepath' => 'Legacy path',
|
||||
'synced_at' => 'Synced at',
|
||||
'downloads' => 'Downloads',
|
||||
'upload' => 'Upload file',
|
||||
'version' => 'Version',
|
||||
'enabled' => 'Enabled',
|
||||
'config' => 'Config',
|
||||
'value' => 'Value',
|
||||
'status' => 'Status',
|
||||
'amount' => 'Amount',
|
||||
'currency' => 'Currency',
|
||||
'gateway' => 'Gateway',
|
||||
'paid_at' => 'Paid at',
|
||||
'price' => 'Price',
|
||||
'paid_enabled' => 'Paid reading',
|
||||
'trial_value' => 'Teaser characters',
|
||||
],
|
||||
|
||||
'options' => [
|
||||
'markdown' => 'Markdown',
|
||||
'markdown_recommended' => 'Markdown (recommended)',
|
||||
'html' => 'HTML',
|
||||
'html_legacy' => 'HTML (legacy posts)',
|
||||
'comment_order_asc' => 'Oldest first',
|
||||
'comment_order_desc' => 'Newest first',
|
||||
'ai_provider_stub' => 'Stub (local acceptance)',
|
||||
'ai_provider_openai' => 'OpenAI-compatible API',
|
||||
'moderation' => [
|
||||
'pending' => 'Pending',
|
||||
'pending_ai' => 'AI pending',
|
||||
'approved' => 'Approved',
|
||||
'rejected' => 'Rejected',
|
||||
'needs_human' => 'Needs human review',
|
||||
],
|
||||
],
|
||||
|
||||
'helpers' => [
|
||||
'article_content' => 'For Markdown use  or [name](attach:ID); HTML may keep [attach=ID]. Resolved at render time — do not paste object-storage URLs into the body.',
|
||||
'attachment_upload' => 'Files go to object storage (or the local attachments disk), not long-term app storage.',
|
||||
'attachments_prefix' => 'Used for /attachments/{path} resolution; disk is controlled by attachment driver env vars.',
|
||||
'analytics_extra' => 'Can coexist with plugin scripts.',
|
||||
'ads_sidebar_extra' => 'Admin snippets and plugins are concatenated in order.',
|
||||
],
|
||||
|
||||
'messages' => [
|
||||
'settings_saved' => 'Settings saved',
|
||||
'ai_optimize' => 'AI content optimize',
|
||||
'ai_optimize_queued' => 'Queued for content optimization',
|
||||
'ai_optimize_queue_hint' => 'Ensure a queue worker (or Workerman) is consuming jobs.',
|
||||
'upload_required' => 'Please upload an attachment.',
|
||||
'mime_not_allowed' => 'MIME type not allowed: :mime',
|
||||
'theme_slots_warn' => 'Activated, but slot declaration: :label. Declare slots in theme.json.',
|
||||
'slots_missing_prefix' => 'Missing: ',
|
||||
'mark_paid_success' => 'Order marked as paid',
|
||||
'mark_paid_failed' => 'Could not mark order as paid',
|
||||
'plugin_requires' => 'Cannot enable :plugin; enable dependencies first: :requires',
|
||||
'plugin_required_by' => 'Cannot disable :plugin; still required by: :dependents',
|
||||
'plugin_docs_missing' => 'No usage docs found for this plugin',
|
||||
'paid_password_mutex' => 'Read password and paid reading cannot both be enabled',
|
||||
],
|
||||
|
||||
'pages' => [
|
||||
'themes_title' => 'Themes',
|
||||
'plugins_title' => 'Plugins',
|
||||
'plugin_docs' => 'Docs',
|
||||
'plugin_requires' => 'Requires',
|
||||
'settings_title' => 'Site settings',
|
||||
'cache_title' => 'Clear cache',
|
||||
'themes_publish' => 'Publish theme assets',
|
||||
'themes_refresh' => 'Refresh',
|
||||
'plugins_sync' => 'Sync plugins',
|
||||
'activate' => 'Activate',
|
||||
'disable' => 'Disable',
|
||||
'enable' => 'Enable',
|
||||
'current' => 'Active',
|
||||
'enabled' => 'Enabled',
|
||||
'disabled' => 'Disabled',
|
||||
'preview' => 'Preview',
|
||||
'version' => 'Version',
|
||||
'no_plugins' => 'No plugins found. Check plugins/ then sync.',
|
||||
'no_themes' => 'No themes found. Check themes/.',
|
||||
'cache_hint' => 'Clear application, view, route and config caches. Database and attachments are untouched.',
|
||||
'cache_run' => 'Clear cache',
|
||||
'cache_confirm' => 'Clear application, view, route and config caches? Database and attachments are untouched.',
|
||||
'cache_cleared' => 'Cache cleared',
|
||||
'skeleton_note' => 'Skeleton only in phase 1 — no real payment or remote marketplace.',
|
||||
'status' => 'Status',
|
||||
'payment_settings_empty' => 'No README found for larablog/payment.',
|
||||
],
|
||||
|
||||
'settings' => [
|
||||
'tabs' => [
|
||||
'site' => 'Site',
|
||||
'reading' => 'Reading & lists',
|
||||
'comments' => 'Comments',
|
||||
'seo' => 'SEO / GEO',
|
||||
'storage' => 'Storage',
|
||||
'ai' => 'AI',
|
||||
'snippets' => 'Inject / ads / analytics',
|
||||
],
|
||||
'paid_content' => 'Paid reading',
|
||||
'snippet_groups' => [
|
||||
'analytics' => 'Analytics & scripts',
|
||||
'analytics_help' => 'Scripts for document head / end of body',
|
||||
'ads' => 'Ad slots',
|
||||
'ads_help' => 'Header banner, sidebar and article ad HTML',
|
||||
'misc' => 'Temp links & footer',
|
||||
'misc_help' => 'Campaign links and footer HTML',
|
||||
],
|
||||
'site_name' => 'Site name',
|
||||
'site_url' => 'Site URL',
|
||||
'site_description' => 'Site description',
|
||||
'active_theme' => 'Active theme slug',
|
||||
'attachments_url_prefix' => 'Attachments URL prefix',
|
||||
'default_content_format' => 'Default content format',
|
||||
'import_content_format' => 'Import default format',
|
||||
'import_convert_html_to_markdown' => 'Convert HTML to Markdown on import',
|
||||
'posts_per_page' => 'Posts per page',
|
||||
'date_format' => 'Date format',
|
||||
'show_views' => 'Show view count',
|
||||
'show_author' => 'Show author',
|
||||
'allow_comments' => 'Allow comments site-wide',
|
||||
'comment_order' => 'Comment order',
|
||||
'close_comments_on_old_posts' => 'Auto-close comments on old posts',
|
||||
'close_comments_days' => 'Close after days',
|
||||
'guest_can_comment' => 'Allow guest comments',
|
||||
'require_moderation' => 'Require human moderation (non-AI)',
|
||||
'rate_limit_per_minute' => 'Comments per minute limit',
|
||||
'enable_website_field' => 'Show website field',
|
||||
'forbidden_words' => 'Forbidden words (comma-separated)',
|
||||
'meta_title_suffix' => 'Title suffix',
|
||||
'default_description' => 'Default description',
|
||||
'default_keywords' => 'Default keywords',
|
||||
'json_ld_enabled' => 'Enable JSON-LD',
|
||||
'robots_index' => 'Allow search engine indexing',
|
||||
'twitter_site' => 'X (Twitter) @site',
|
||||
'canonical_force_https' => 'Force HTTPS canonical URLs',
|
||||
'attachments_legacy_prefix' => 'Attachments legacy prefix',
|
||||
'ai_provider' => 'AI provider',
|
||||
'ai_api_base_url' => 'API base URL',
|
||||
'ai_api_key' => 'API key',
|
||||
'ai_model' => 'Model',
|
||||
'comment_moderation_enabled' => 'AI comment moderation',
|
||||
'content_optimization_enabled' => 'AI content optimization',
|
||||
'analytics_head' => 'Analytics code (document head)',
|
||||
'body_end' => 'Footer scripts (before body end)',
|
||||
'header_banner' => 'Header banner / notice HTML',
|
||||
'ads_sidebar' => 'Sidebar ad HTML',
|
||||
'custom_links_html' => 'Temporary links / sidebar HTML',
|
||||
'ads_article_top' => 'Article top ad',
|
||||
'ads_article_bottom' => 'Article bottom ad',
|
||||
'footer_html' => 'Footer HTML',
|
||||
],
|
||||
|
||||
'slots' => [
|
||||
'hint' => ':place · :size · slot theme.:slot · multiple allowed',
|
||||
'custom' => 'theme.:slot (custom; theme must call @themeslot)',
|
||||
'status_full' => 'Slots complete',
|
||||
'status_partial' => 'Missing :count standard slots',
|
||||
'status_mismatch' => 'Declaration mismatches views',
|
||||
'status_undeclared' => 'slots not declared',
|
||||
'head' => [
|
||||
'label' => 'Document head',
|
||||
'place' => 'Before </head>; analytics, extra CSS/JS',
|
||||
'size' => 'No layout size (scripts/meta)',
|
||||
],
|
||||
'body_start' => [
|
||||
'label' => 'Body start',
|
||||
'place' => 'Immediately after <body>',
|
||||
'size' => 'No layout size',
|
||||
],
|
||||
'body_end' => [
|
||||
'label' => 'Body end',
|
||||
'place' => 'Before </body>',
|
||||
'size' => 'No layout size',
|
||||
],
|
||||
'header_after' => [
|
||||
'label' => 'Header banner',
|
||||
'place' => 'Below site header/nav, above main',
|
||||
'size' => 'Full width, ~60–120px tall',
|
||||
],
|
||||
'nav_after' => [
|
||||
'label' => 'After nav',
|
||||
'place' => 'After primary nav links',
|
||||
'size' => 'Text links / small buttons',
|
||||
],
|
||||
'content_before' => [
|
||||
'label' => 'Before content',
|
||||
'place' => 'Before main content yield',
|
||||
'size' => 'Main column width (~640–760px)',
|
||||
],
|
||||
'content_after' => [
|
||||
'label' => 'After content',
|
||||
'place' => 'After main content yield',
|
||||
'size' => 'Same as main column',
|
||||
],
|
||||
'article_top' => [
|
||||
'label' => 'Article top',
|
||||
'place' => 'Above title (article page)',
|
||||
'size' => 'Main width × ~90–250px',
|
||||
],
|
||||
'article_bottom' => [
|
||||
'label' => 'Article bottom',
|
||||
'place' => 'After body, before comments',
|
||||
'size' => 'Main width × ~90–250px',
|
||||
],
|
||||
'sidebar_before' => [
|
||||
'label' => 'Sidebar before',
|
||||
'place' => 'Before first sidebar panel',
|
||||
'size' => 'Sidebar ~280–320px',
|
||||
],
|
||||
'sidebar' => [
|
||||
'label' => 'Sidebar',
|
||||
'place' => 'Ad panel after categories/stylevars',
|
||||
'size' => 'Sidebar ~280–320px; stacks vertically',
|
||||
],
|
||||
'sidebar_after' => [
|
||||
'label' => 'Sidebar after',
|
||||
'place' => 'Later sidebar (temp links)',
|
||||
'size' => 'Sidebar width; text links',
|
||||
],
|
||||
'footer_before' => [
|
||||
'label' => 'Before footer',
|
||||
'place' => 'Before <footer>',
|
||||
'size' => 'Full or wrap width',
|
||||
],
|
||||
'footer_after' => [
|
||||
'label' => 'After footer',
|
||||
'place' => 'After </footer>, before </body>',
|
||||
'size' => 'Full width; scripts OK',
|
||||
],
|
||||
],
|
||||
|
||||
'plugins' => [
|
||||
'larablog/payment' => [
|
||||
'title' => 'Payment',
|
||||
'description' => 'Orders, Stub checkout, entitlements, and admin order management.',
|
||||
],
|
||||
'larablog/paid-content' => [
|
||||
'title' => 'Paid content',
|
||||
'description' => 'Article pricing, teasers, and paywall; requires the payment plugin.',
|
||||
],
|
||||
'larablog/membership' => [
|
||||
'title' => 'Membership',
|
||||
'description' => 'Membership tiers and entitlements skeleton.',
|
||||
],
|
||||
'larablog/plugin-marketplace' => [
|
||||
'title' => 'Plugin marketplace',
|
||||
'description' => 'Remote plugin catalog skeleton; local plugins/ sync only for now.',
|
||||
],
|
||||
'larablog/theme-marketplace' => [
|
||||
'title' => 'Theme marketplace',
|
||||
'description' => 'Remote theme catalog skeleton; local themes/ switch only for now.',
|
||||
],
|
||||
'larablog/ai-comment-moderation' => [
|
||||
'title' => 'AI comment moderation',
|
||||
'description' => 'Queues AI moderation after comment create (stub OK).',
|
||||
],
|
||||
],
|
||||
|
||||
'themes' => [
|
||||
'default' => [
|
||||
'title' => 'Default (teal)',
|
||||
'description' => 'Fraunces + teal accent for everyday reading.',
|
||||
],
|
||||
'example' => [
|
||||
'title' => 'Example (amber)',
|
||||
'description' => 'Newsreader + amber accent; second theme demo.',
|
||||
],
|
||||
],
|
||||
];
|
||||
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'nav' => [
|
||||
'home' => 'Home',
|
||||
'archives' => 'Archives',
|
||||
'tags' => 'Tags',
|
||||
'comments' => 'Comments',
|
||||
'links' => 'Links',
|
||||
'search' => 'Search',
|
||||
'login' => 'Login',
|
||||
'register' => 'Register',
|
||||
'profile' => 'Profile',
|
||||
'logout' => 'Log out',
|
||||
],
|
||||
'sidebar' => [
|
||||
'categories' => 'Categories',
|
||||
'subscribe' => 'Subscribe',
|
||||
'empty_category' => 'No categories',
|
||||
],
|
||||
'article' => [
|
||||
'toc' => 'Contents',
|
||||
'password_error' => 'Incorrect password',
|
||||
'paywall_title' => 'Paid content',
|
||||
'paywall_hint' => 'Purchase to read the full article.',
|
||||
'buy' => 'Buy now',
|
||||
],
|
||||
'common' => [
|
||||
'pinned' => 'Pinned',
|
||||
'reads' => 'views',
|
||||
'no_posts' => 'No posts yet',
|
||||
'no_posts_hint' => 'Publish from admin or run db:seed.',
|
||||
'comments' => 'Comments',
|
||||
'no_comments' => 'No comments yet.',
|
||||
'submit_comment' => 'Submit',
|
||||
'nickname' => 'Name',
|
||||
'website' => 'Website',
|
||||
'content' => 'Content',
|
||||
'password' => 'Password',
|
||||
'unlock' => 'Unlock',
|
||||
'password_protected' => 'This post is password protected.',
|
||||
'theme' => 'Theme',
|
||||
],
|
||||
];
|
||||
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'checkout' => [
|
||||
'title' => 'Checkout',
|
||||
'subtitle' => 'Order #:id — stub gateway',
|
||||
'stub_badge' => 'Stub payment',
|
||||
'total' => 'Total',
|
||||
'pay_stub' => 'Simulate payment success',
|
||||
'cancel' => 'Cancel',
|
||||
'back' => 'Back',
|
||||
'already_paid' => 'This order is already paid.',
|
||||
'error_title' => 'Checkout unavailable',
|
||||
],
|
||||
'errors' => [
|
||||
'already_entitled' => 'You already have an active entitlement for :product_type #:product_id.',
|
||||
'order_not_payable' => 'Order cannot be paid in status [:status].',
|
||||
'invalid_checkout' => 'Invalid checkout parameters, or this product is not purchasable.',
|
||||
'checkout_failed' => 'Could not create the order. Please try again.',
|
||||
],
|
||||
];
|
||||
@@ -0,0 +1,384 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'brand' => 'LaraBlog 后台',
|
||||
'dashboard' => '控制台',
|
||||
|
||||
'groups' => [
|
||||
'content' => '内容',
|
||||
'system' => '系统',
|
||||
'plugins' => '插件',
|
||||
],
|
||||
|
||||
'nav' => [
|
||||
'articles' => '文章',
|
||||
'categories' => '分类',
|
||||
'comments' => '评论',
|
||||
'tags' => '标签',
|
||||
'links' => '友情链接',
|
||||
'attachments' => '附件',
|
||||
'stylevars' => '站点片段',
|
||||
'users' => '用户',
|
||||
'themes' => '皮肤',
|
||||
'plugins' => '插件',
|
||||
'settings' => '站点设置',
|
||||
'cache' => '清理缓存',
|
||||
'payment' => '支付',
|
||||
'orders' => '订单',
|
||||
'payment_settings' => '支付说明',
|
||||
'membership' => '会员',
|
||||
'plugin_marketplace' => '插件商城',
|
||||
'theme_marketplace' => '皮肤商城',
|
||||
],
|
||||
|
||||
'models' => [
|
||||
'article' => '文章',
|
||||
'articles' => '文章',
|
||||
'category' => '分类',
|
||||
'categories' => '分类',
|
||||
'comment' => '评论',
|
||||
'comments' => '评论',
|
||||
'tag' => '标签',
|
||||
'tags' => '标签',
|
||||
'link' => '链接',
|
||||
'links' => '友情链接',
|
||||
'attachment' => '附件',
|
||||
'attachments' => '附件',
|
||||
'stylevar' => '站点片段',
|
||||
'stylevars' => '站点片段',
|
||||
'user' => '用户',
|
||||
'users' => '用户',
|
||||
'plugin' => '插件',
|
||||
'plugins' => '插件',
|
||||
'order' => '订单',
|
||||
'orders' => '订单',
|
||||
],
|
||||
|
||||
'actions' => [
|
||||
'save' => '保存',
|
||||
'edit' => '编辑',
|
||||
'delete' => '删除',
|
||||
'create' => '新建',
|
||||
'cancel' => '取消',
|
||||
'confirm' => '确认',
|
||||
'mark_paid' => '标记已支付',
|
||||
],
|
||||
|
||||
'fields' => [
|
||||
'id' => 'ID',
|
||||
'title' => '标题',
|
||||
'name' => '名称',
|
||||
'display_name' => '显示名',
|
||||
'username' => '用户名',
|
||||
'email' => '邮箱',
|
||||
'password' => '密码',
|
||||
'url' => '网址',
|
||||
'website' => '网站',
|
||||
'roles' => '角色',
|
||||
'category' => '分类',
|
||||
'author' => '作者',
|
||||
'user' => '用户',
|
||||
'article' => '关联文章',
|
||||
'description' => '描述',
|
||||
'keywords' => '关键词',
|
||||
'slug' => '别名',
|
||||
'published_at' => '发布时间',
|
||||
'created_at' => '创建时间',
|
||||
'updated_at' => '更新时间',
|
||||
'login_at' => '最近登录',
|
||||
'views' => '阅读数',
|
||||
'comments_count' => '评论数',
|
||||
'stick' => '置顶',
|
||||
'visible' => '显示',
|
||||
'close_comment' => '关闭评论',
|
||||
'content_format' => '正文格式',
|
||||
'content' => '正文',
|
||||
'content_markdown' => '正文(Markdown)',
|
||||
'content_html' => '正文(HTML)',
|
||||
'read_password' => '阅读密码',
|
||||
'ai_summary' => 'AI 摘要',
|
||||
'display_order' => '排序',
|
||||
'articles_count' => '文章数',
|
||||
'use_count' => '使用次数',
|
||||
'note' => '备注',
|
||||
'ip' => 'IP',
|
||||
'moderation_status' => '审核状态',
|
||||
'disk' => '磁盘',
|
||||
'path' => '路径',
|
||||
'thumb_path' => '缩略图路径',
|
||||
'filename' => '文件名',
|
||||
'mime' => 'MIME 类型',
|
||||
'size' => '大小',
|
||||
'checksum' => '校验和',
|
||||
'visibility' => '可见性',
|
||||
'legacy_filepath' => '兼容路径',
|
||||
'synced_at' => '同步时间',
|
||||
'downloads' => '下载次数',
|
||||
'upload' => '上传文件',
|
||||
'version' => '版本',
|
||||
'enabled' => '启用',
|
||||
'config' => '配置',
|
||||
'value' => '内容',
|
||||
'status' => '状态',
|
||||
'amount' => '金额',
|
||||
'currency' => '币种',
|
||||
'gateway' => '网关',
|
||||
'paid_at' => '支付时间',
|
||||
'price' => '价格',
|
||||
'paid_enabled' => '启用付费阅读',
|
||||
'trial_value' => '试读字数',
|
||||
],
|
||||
|
||||
'options' => [
|
||||
'markdown' => 'Markdown',
|
||||
'markdown_recommended' => 'Markdown(推荐)',
|
||||
'html' => 'HTML',
|
||||
'html_legacy' => 'HTML(兼容旧文)',
|
||||
'comment_order_asc' => '旧 → 新',
|
||||
'comment_order_desc' => '新 → 旧',
|
||||
'ai_provider_stub' => 'Stub(本地验收)',
|
||||
'ai_provider_openai' => 'OpenAI 兼容接口',
|
||||
'moderation' => [
|
||||
'pending' => '待审核',
|
||||
'pending_ai' => 'AI 审核中',
|
||||
'approved' => '已通过',
|
||||
'rejected' => '已拒绝',
|
||||
'needs_human' => '需人工复核',
|
||||
],
|
||||
],
|
||||
|
||||
'helpers' => [
|
||||
'article_content' => 'Markdown 附件请用  或 [name](attach:ID);HTML 可保留 [attach=ID]。输出时再解析为附件地址,勿把对象存储直链写进正文。',
|
||||
'attachment_upload' => '文件写入对象存储(或本地附件驱动),不在应用侧长期落盘。',
|
||||
'attachments_prefix' => '对应 /attachments/{path} 解析;磁盘由环境变量中的附件驱动配置控制。',
|
||||
'analytics_extra' => '可与插件脚本并存。',
|
||||
'ads_sidebar_extra' => '后台片段与多个插件会依次拼接。',
|
||||
],
|
||||
|
||||
'messages' => [
|
||||
'settings_saved' => '设置已保存',
|
||||
'ai_optimize' => 'AI 内容优化',
|
||||
'ai_optimize_queued' => '已投递到内容优化队列',
|
||||
'ai_optimize_queue_hint' => '请确保队列 Worker(或 Workerman)正在消费。',
|
||||
'upload_required' => '请上传附件文件。',
|
||||
'mime_not_allowed' => '不允许的 MIME 类型::mime',
|
||||
'theme_slots_warn' => '已启用,但槽位声明::label。请在 theme.json 中声明 slots。',
|
||||
'slots_missing_prefix' => '缺少:',
|
||||
'mark_paid_success' => '订单已标记为已支付',
|
||||
'mark_paid_failed' => '标记已支付失败',
|
||||
'plugin_requires' => '无法启用 :plugin,请先启用依赖::requires',
|
||||
'plugin_required_by' => '无法禁用 :plugin,仍被以下已启用插件依赖::dependents',
|
||||
'plugin_docs_missing' => '未找到该插件的使用说明',
|
||||
'paid_password_mutex' => '阅读密码与付费阅读不能同时启用',
|
||||
],
|
||||
|
||||
'pages' => [
|
||||
'themes_title' => '皮肤管理',
|
||||
'plugins_title' => '插件管理',
|
||||
'plugin_docs' => '使用说明',
|
||||
'plugin_requires' => '依赖',
|
||||
'settings_title' => '站点设置',
|
||||
'cache_title' => '清理缓存',
|
||||
'themes_publish' => '发布皮肤静态资源',
|
||||
'themes_refresh' => '刷新列表',
|
||||
'plugins_sync' => '同步磁盘插件',
|
||||
'activate' => '启用',
|
||||
'disable' => '禁用',
|
||||
'enable' => '启用',
|
||||
'current' => '使用中',
|
||||
'enabled' => '已启用',
|
||||
'disabled' => '未启用',
|
||||
'preview' => '预览',
|
||||
'version' => '版本',
|
||||
'no_plugins' => '未发现插件,请检查 plugins/ 目录后点击「同步磁盘插件」。',
|
||||
'no_themes' => '未发现皮肤,请检查 themes/ 目录。',
|
||||
'cache_hint' => '清理应用缓存、视图、路由与配置缓存。不影响数据库内容与对象存储附件。',
|
||||
'cache_run' => '清理缓存',
|
||||
'cache_confirm' => '确认清理应用、视图、路由与配置缓存?不影响数据库与附件。',
|
||||
'cache_cleared' => '缓存已清理',
|
||||
'skeleton_note' => '本期仅提供配置/入口占位,不实现真实支付结算或远程商城交易。',
|
||||
'status' => '状态',
|
||||
'payment_settings_empty' => '未找到 larablog/payment 的 README。',
|
||||
],
|
||||
|
||||
'settings' => [
|
||||
'tabs' => [
|
||||
'site' => '站点',
|
||||
'reading' => '阅读与列表',
|
||||
'comments' => '评论',
|
||||
'seo' => 'SEO / GEO',
|
||||
'storage' => '存储',
|
||||
'ai' => 'AI',
|
||||
'snippets' => '注入 / 广告 / 统计',
|
||||
],
|
||||
'paid_content' => '付费阅读',
|
||||
'snippet_groups' => [
|
||||
'analytics' => '统计与脚本',
|
||||
'analytics_help' => '写入页面 head / body 末尾的统计与第三方脚本',
|
||||
'ads' => '广告位',
|
||||
'ads_help' => '页头横幅、侧栏与文章上下广告 HTML',
|
||||
'misc' => '临时链接与页脚',
|
||||
'misc_help' => '活动入口、临时链与页脚附加 HTML',
|
||||
],
|
||||
'site_name' => '站点名称',
|
||||
'site_url' => '站点网址',
|
||||
'site_description' => '站点简介',
|
||||
'active_theme' => '当前皮肤标识',
|
||||
'attachments_url_prefix' => '附件网址前缀',
|
||||
'default_content_format' => '新建正文默认格式',
|
||||
'import_content_format' => '导入默认格式',
|
||||
'import_convert_html_to_markdown' => '导入时将 HTML 转为 Markdown',
|
||||
'posts_per_page' => '每页文章数',
|
||||
'date_format' => '日期格式',
|
||||
'show_views' => '显示阅读数',
|
||||
'show_author' => '显示作者',
|
||||
'allow_comments' => '全站允许评论',
|
||||
'comment_order' => '评论排序',
|
||||
'close_comments_on_old_posts' => '自动关闭旧文评论',
|
||||
'close_comments_days' => '多少天后关闭',
|
||||
'guest_can_comment' => '允许游客评论',
|
||||
'require_moderation' => '评论需人工审核(非 AI)',
|
||||
'rate_limit_per_minute' => '每分钟评论上限',
|
||||
'enable_website_field' => '显示网站字段',
|
||||
'forbidden_words' => '简易违禁词(逗号分隔)',
|
||||
'meta_title_suffix' => '标题后缀',
|
||||
'default_description' => '默认描述',
|
||||
'default_keywords' => '默认关键词',
|
||||
'json_ld_enabled' => '启用结构化数据(JSON-LD)',
|
||||
'robots_index' => '允许搜索引擎收录',
|
||||
'twitter_site' => 'X(Twitter)站点账号',
|
||||
'canonical_force_https' => '规范链接强制 HTTPS',
|
||||
'attachments_legacy_prefix' => '附件兼容前缀',
|
||||
'ai_provider' => 'AI 服务商',
|
||||
'ai_api_base_url' => 'API 基础地址',
|
||||
'ai_api_key' => 'API 密钥',
|
||||
'ai_model' => '模型',
|
||||
'comment_moderation_enabled' => 'AI 评论审核',
|
||||
'content_optimization_enabled' => 'AI 内容优化',
|
||||
'analytics_head' => '统计代码(文档头部)',
|
||||
'body_end' => '页尾脚本(正文结束前)',
|
||||
'header_banner' => '页头横幅 / 公告 HTML',
|
||||
'ads_sidebar' => '侧栏广告 HTML',
|
||||
'custom_links_html' => '临时链接 / 侧栏附加 HTML',
|
||||
'ads_article_top' => '文章顶广告',
|
||||
'ads_article_bottom' => '文章底广告',
|
||||
'footer_html' => '页脚附加 HTML',
|
||||
],
|
||||
|
||||
'slots' => [
|
||||
'hint' => ':place · :size · 槽 theme.:slot · 可多条叠加',
|
||||
'custom' => 'theme.:slot(自定义槽;主题需调用 @themeslot)',
|
||||
'status_full' => '槽位完整',
|
||||
'status_partial' => '缺标准槽 :count',
|
||||
'status_mismatch' => '声明与视图不一致',
|
||||
'status_undeclared' => '未声明 slots',
|
||||
'head' => [
|
||||
'label' => '文档头部',
|
||||
'place' => '文档结束标签前;统计、额外样式与脚本',
|
||||
'size' => '无版面尺寸(脚本/元数据)',
|
||||
],
|
||||
'body_start' => [
|
||||
'label' => '正文开头',
|
||||
'place' => '正文开始标签后立刻',
|
||||
'size' => '无版面尺寸',
|
||||
],
|
||||
'body_end' => [
|
||||
'label' => '正文结尾',
|
||||
'place' => '正文结束标签前',
|
||||
'size' => '无版面尺寸',
|
||||
],
|
||||
'header_after' => [
|
||||
'label' => '页头横幅',
|
||||
'place' => '站点头/导航下方、主栏上方',
|
||||
'size' => '建议通栏,高度约 60–120px;宽随主题内容区',
|
||||
],
|
||||
'nav_after' => [
|
||||
'label' => '导航后',
|
||||
'place' => '主导航链接之后',
|
||||
'size' => '文字链/小按钮;勿塞大图',
|
||||
],
|
||||
'content_before' => [
|
||||
'label' => '主栏前',
|
||||
'place' => '主内容区之前',
|
||||
'size' => '主栏宽度(约 640–760px,视主题)',
|
||||
],
|
||||
'content_after' => [
|
||||
'label' => '主栏后',
|
||||
'place' => '主内容区之后',
|
||||
'size' => '同主栏宽度',
|
||||
],
|
||||
'article_top' => [
|
||||
'label' => '文章顶',
|
||||
'place' => '标题区上方(文章页)',
|
||||
'size' => '主栏宽 × 约 90–250px',
|
||||
],
|
||||
'article_bottom' => [
|
||||
'label' => '文章底',
|
||||
'place' => '正文后、评论前(文章页)',
|
||||
'size' => '主栏宽 × 约 90–250px',
|
||||
],
|
||||
'sidebar_before' => [
|
||||
'label' => '侧栏前',
|
||||
'place' => '侧栏第一个面板之前',
|
||||
'size' => '侧栏宽约 280–320px',
|
||||
],
|
||||
'sidebar' => [
|
||||
'label' => '侧栏中',
|
||||
'place' => '分类/片段之后的广告面板',
|
||||
'size' => '侧栏宽约 280–320px;多条会纵向叠放',
|
||||
],
|
||||
'sidebar_after' => [
|
||||
'label' => '侧栏后',
|
||||
'place' => '侧栏靠后(临时链/附加块)',
|
||||
'size' => '侧栏宽;适合文字链列表',
|
||||
],
|
||||
'footer_before' => [
|
||||
'label' => '页脚前',
|
||||
'place' => '页脚之前',
|
||||
'size' => '通栏或内容区宽',
|
||||
],
|
||||
'footer_after' => [
|
||||
'label' => '页脚后',
|
||||
'place' => '页脚之后、正文结束前',
|
||||
'size' => '通栏;也可放脚本',
|
||||
],
|
||||
],
|
||||
|
||||
'plugins' => [
|
||||
'larablog/payment' => [
|
||||
'title' => '支付',
|
||||
'description' => '订单、Stub 结账、权益入账与后台订单管理。',
|
||||
],
|
||||
'larablog/paid-content' => [
|
||||
'title' => '内容付费',
|
||||
'description' => '文章定价、试读与购买闸;依赖支付插件。',
|
||||
],
|
||||
'larablog/membership' => [
|
||||
'title' => '会员',
|
||||
'description' => '会员等级、权益与订阅周期占位。',
|
||||
],
|
||||
'larablog/plugin-marketplace' => [
|
||||
'title' => '插件商城',
|
||||
'description' => '远程插件目录浏览/安装占位;本期仅本地 plugins/ 同步。',
|
||||
],
|
||||
'larablog/theme-marketplace' => [
|
||||
'title' => '皮肤商城',
|
||||
'description' => '远程主题目录浏览/安装占位;本期仅本地 themes/ 切换。',
|
||||
],
|
||||
'larablog/ai-comment-moderation' => [
|
||||
'title' => 'AI 评论审核',
|
||||
'description' => '评论创建后进入 AI 审核队列(可用 stub)。',
|
||||
],
|
||||
],
|
||||
|
||||
'themes' => [
|
||||
'default' => [
|
||||
'title' => '默认(青石)',
|
||||
'description' => 'Fraunces + 青绿强调,适合日常阅读博客。',
|
||||
],
|
||||
'example' => [
|
||||
'title' => '示例(暖琥珀)',
|
||||
'description' => 'Newsreader + 琥珀强调,演示第二套皮肤切换。',
|
||||
],
|
||||
],
|
||||
];
|
||||
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'nav' => [
|
||||
'home' => '首页',
|
||||
'archives' => '归档',
|
||||
'tags' => '标签',
|
||||
'comments' => '评论',
|
||||
'links' => '链接',
|
||||
'search' => '搜索',
|
||||
'login' => '登录',
|
||||
'register' => '注册',
|
||||
'profile' => '资料',
|
||||
'logout' => '退出登录',
|
||||
],
|
||||
'sidebar' => [
|
||||
'categories' => '分类',
|
||||
'subscribe' => '订阅',
|
||||
'empty_category' => '暂无分类',
|
||||
],
|
||||
'article' => [
|
||||
'toc' => '目录',
|
||||
'password_error' => '密码错误',
|
||||
'paywall_title' => '付费内容',
|
||||
'paywall_hint' => '购买后可阅读全文。',
|
||||
'buy' => '立即购买',
|
||||
],
|
||||
'common' => [
|
||||
'pinned' => '置顶',
|
||||
'reads' => '阅读',
|
||||
'no_posts' => '还没有文章',
|
||||
'no_posts_hint' => '去后台发布第一篇,或运行 php artisan db:seed 载入演示内容。',
|
||||
'comments' => '评论',
|
||||
'no_comments' => '还没有评论,来抢沙发。',
|
||||
'submit_comment' => '提交评论',
|
||||
'nickname' => '昵称',
|
||||
'website' => '网站',
|
||||
'content' => '内容',
|
||||
'password' => '密码',
|
||||
'unlock' => '解锁',
|
||||
'password_protected' => '这篇文章受密码保护,请输入阅读密码。',
|
||||
'theme' => '主题',
|
||||
],
|
||||
];
|
||||
@@ -0,0 +1,6 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'previous' => '« 上一页',
|
||||
'next' => '下一页 »',
|
||||
];
|
||||
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'checkout' => [
|
||||
'title' => '确认支付',
|
||||
'subtitle' => '订单 #:id — Stub 网关',
|
||||
'stub_badge' => 'Stub 模拟支付',
|
||||
'total' => '合计',
|
||||
'pay_stub' => '模拟支付成功',
|
||||
'cancel' => '取消',
|
||||
'back' => '返回',
|
||||
'already_paid' => '该订单已支付。',
|
||||
'error_title' => '无法发起结账',
|
||||
],
|
||||
'errors' => [
|
||||
'already_entitled' => '你已拥有该商品的有效权益(:product_type #:product_id),不能重复下单。',
|
||||
'order_not_payable' => '当前订单状态为 [:status],无法标记支付。',
|
||||
'invalid_checkout' => '结账参数无效,或该商品当前不可购买。',
|
||||
'checkout_failed' => '创建订单失败,请重试。',
|
||||
],
|
||||
];
|
||||
Reference in New Issue
Block a user