├── .gitignore ├── LICENSE ├── Plugin.php ├── README.md ├── assets ├── css │ ├── winter.blog-export.css │ └── winter.blog-preview.css ├── images │ └── blog-icon.svg ├── js │ └── post-form.js └── less │ └── winter.blog-preview.less ├── classes └── TagProcessor.php ├── components ├── Categories.php ├── Post.php ├── Posts.php ├── RssFeed.php ├── categories │ ├── default.htm │ └── items.htm ├── post │ └── default.htm ├── posts │ └── default.htm └── rssfeed │ └── default.htm ├── composer.json ├── controllers ├── Categories.php ├── Posts.php ├── categories │ ├── config_form.yaml │ ├── config_list.yaml │ └── config_reorder.yaml └── posts │ ├── config_filter.yaml │ ├── config_form.yaml │ ├── config_import_export.yaml │ └── config_list.yaml ├── formwidgets ├── BlogMarkdown.php └── MLBlogMarkdown.php ├── lang ├── bg │ └── lang.php ├── cs │ └── lang.php ├── de │ └── lang.php ├── en │ └── lang.php ├── es │ └── lang.php ├── fa │ └── lang.php ├── fi │ └── lang.php ├── fr │ └── lang.php ├── hu │ └── lang.php ├── it │ └── lang.php ├── ja │ └── lang.php ├── nb-no │ └── lang.php ├── nl │ └── lang.php ├── pl │ └── lang.php ├── pt-br │ └── lang.php ├── ru │ └── lang.php ├── sk │ └── lang.php ├── sl │ └── lang.php ├── tr │ └── lang.php ├── vn │ └── lang.php └── zh-cn │ └── lang.php ├── models ├── Category.php ├── Post.php ├── PostExport.php ├── PostImport.php ├── Settings.php ├── category │ ├── columns.yaml │ └── fields.yaml ├── post │ ├── columns.yaml │ └── fields.yaml ├── postexport │ └── columns.yaml ├── postimport │ ├── columns.yaml │ └── fields.yaml └── settings │ └── fields.yaml ├── traits └── Urlable.php └── updates ├── v1.0.1 ├── create_categories_table.php ├── create_posts_table.php └── seed_all_tables.php ├── v1.2.0 └── categories_add_nested_fields.php ├── v1.2.4 └── update_timestamp_nullable.php ├── v1.3.0 └── posts_add_metadata.php ├── v2.0.0 └── rename_tables.php ├── v2.0.1 ├── fix_translate_records.php └── rename_indexes.php └── version.yaml /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | 3 | # Editor ignores 4 | nbproject 5 | .idea 6 | .vscode 7 | _ide_helper.php 8 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2013-2021.03.01 October CMS 4 | Copyright (c) 2021 Winter CMS 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | -------------------------------------------------------------------------------- /Plugin.php: -------------------------------------------------------------------------------- 1 | 'winter.blog::lang.plugin.name', 22 | 'description' => 'winter.blog::lang.plugin.description', 23 | 'author' => 'Winter CMS', 24 | 'icon' => 'icon-pencil', 25 | 'homepage' => 'https://github.com/wintercms/wn-blog-plugin', 26 | 'replaces' => ['RainLab.Blog' => '<= 1.7.0'], 27 | ]; 28 | } 29 | 30 | /** 31 | * Registers the components provided by this plugin. 32 | */ 33 | public function registerComponents(): array 34 | { 35 | return [ 36 | \Winter\Blog\Components\Post::class => 'blogPost', 37 | \Winter\Blog\Components\Posts::class => 'blogPosts', 38 | \Winter\Blog\Components\Categories::class => 'blogCategories', 39 | \Winter\Blog\Components\RssFeed::class => 'blogRssFeed', 40 | ]; 41 | } 42 | 43 | /** 44 | * Registers the permissions provided by this plugin. 45 | */ 46 | public function registerPermissions(): array 47 | { 48 | return [ 49 | 'winter.blog.manage_settings' => [ 50 | 'tab' => 'winter.blog::lang.blog.tab', 51 | 'label' => 'winter.blog::lang.blog.manage_settings', 52 | 'roles' => [UserRole::CODE_DEVELOPER, UserRole::CODE_PUBLISHER], 53 | ], 54 | 'winter.blog.access_posts' => [ 55 | 'tab' => 'winter.blog::lang.blog.tab', 56 | 'label' => 'winter.blog::lang.blog.access_posts', 57 | 'roles' => [UserRole::CODE_DEVELOPER, UserRole::CODE_PUBLISHER], 58 | ], 59 | 'winter.blog.access_categories' => [ 60 | 'tab' => 'winter.blog::lang.blog.tab', 61 | 'label' => 'winter.blog::lang.blog.access_categories', 62 | 'roles' => [UserRole::CODE_DEVELOPER, UserRole::CODE_PUBLISHER], 63 | ], 64 | 'winter.blog.access_other_posts' => [ 65 | 'tab' => 'winter.blog::lang.blog.tab', 66 | 'label' => 'winter.blog::lang.blog.access_other_posts', 67 | 'roles' => [UserRole::CODE_DEVELOPER, UserRole::CODE_PUBLISHER], 68 | ], 69 | 'winter.blog.access_import_export' => [ 70 | 'tab' => 'winter.blog::lang.blog.tab', 71 | 'label' => 'winter.blog::lang.blog.access_import_export', 72 | 'roles' => [UserRole::CODE_DEVELOPER, UserRole::CODE_PUBLISHER], 73 | ], 74 | 'winter.blog.access_publish' => [ 75 | 'tab' => 'winter.blog::lang.blog.tab', 76 | 'label' => 'winter.blog::lang.blog.access_publish', 77 | 'roles' => [UserRole::CODE_DEVELOPER, UserRole::CODE_PUBLISHER], 78 | ], 79 | ]; 80 | } 81 | 82 | /** 83 | * Registers the backend navigation items provided by this plugin. 84 | */ 85 | public function registerNavigation(): array 86 | { 87 | return [ 88 | 'blog' => [ 89 | 'label' => 'winter.blog::lang.blog.menu_label', 90 | 'url' => Backend::url('winter/blog/posts'), 91 | 'icon' => 'icon-pencil', 92 | 'iconSvg' => 'plugins/winter/blog/assets/images/blog-icon.svg', 93 | 'permissions' => ['winter.blog.*'], 94 | 'order' => 300, 95 | 96 | 'sideMenu' => [ 97 | 'new_post' => [ 98 | 'label' => 'winter.blog::lang.posts.new_post', 99 | 'icon' => 'icon-plus', 100 | 'url' => Backend::url('winter/blog/posts/create'), 101 | 'permissions' => ['winter.blog.access_posts'], 102 | ], 103 | 'posts' => [ 104 | 'label' => 'winter.blog::lang.blog.posts', 105 | 'icon' => 'icon-copy', 106 | 'url' => Backend::url('winter/blog/posts'), 107 | 'permissions' => ['winter.blog.access_posts'], 108 | ], 109 | 'categories' => [ 110 | 'label' => 'winter.blog::lang.blog.categories', 111 | 'icon' => 'icon-list-ul', 112 | 'url' => Backend::url('winter/blog/categories'), 113 | 'permissions' => ['winter.blog.access_categories'], 114 | ], 115 | ], 116 | ], 117 | ]; 118 | } 119 | 120 | /** 121 | * Registers the settings provided by this plugin. 122 | */ 123 | public function registerSettings(): array 124 | { 125 | return [ 126 | 'blog' => [ 127 | 'label' => 'winter.blog::lang.blog.menu_label', 128 | 'description' => 'winter.blog::lang.blog.settings_description', 129 | 'category' => 'winter.blog::lang.blog.menu_label', 130 | 'icon' => 'icon-pencil', 131 | 'class' => 'Winter\Blog\Models\Settings', 132 | 'order' => 500, 133 | 'keywords' => 'blog post category', 134 | 'permissions' => ['winter.blog.manage_settings'], 135 | ], 136 | ]; 137 | } 138 | 139 | /** 140 | * Register method, called when the plugin is first registered. 141 | */ 142 | public function register(): void 143 | { 144 | /* 145 | * Register the image tag processing callback 146 | */ 147 | TagProcessor::instance()->registerCallback(function ($input, $preview) { 148 | if (!$preview) { 149 | return $input; 150 | } 151 | 152 | return preg_replace( 153 | '|\([0-9]+)]*)\/>|m', 154 | ' 155 | 156 | Click or drop an image... 157 | 158 | 159 | ', 160 | $input 161 | ); 162 | }); 163 | } 164 | 165 | /** 166 | * Boot method, called when the plugin is first booted. 167 | */ 168 | public function boot(): void 169 | { 170 | $this->extendWinterPagesPlugin(); 171 | } 172 | 173 | /** 174 | * Extends the Winter.Pages plugin 175 | */ 176 | protected function extendWinterPagesPlugin(): void 177 | { 178 | /* 179 | * Register menu items for the Winter.Pages plugin 180 | */ 181 | Event::listen('pages.menuitem.listTypes', function () { 182 | return [ 183 | 'blog-category' => 'winter.blog::lang.menuitem.blog_category', 184 | 'all-blog-categories' => 'winter.blog::lang.menuitem.all_blog_categories', 185 | 'blog-post' => 'winter.blog::lang.menuitem.blog_post', 186 | 'all-blog-posts' => 'winter.blog::lang.menuitem.all_blog_posts', 187 | 'category-blog-posts' => 'winter.blog::lang.menuitem.category_blog_posts', 188 | ]; 189 | }); 190 | 191 | Event::listen('pages.menuitem.getTypeInfo', function ($type) { 192 | switch ($type) { 193 | case 'blog-category': 194 | case 'all-blog-categories': 195 | return Category::getMenuTypeInfo($type); 196 | case 'blog-post': 197 | case 'all-blog-posts': 198 | case 'category-blog-posts': 199 | return Post::getMenuTypeInfo($type); 200 | } 201 | }); 202 | 203 | Event::listen('pages.menuitem.resolveItem', function ($type, $item, $url, $theme) { 204 | switch ($type) { 205 | case 'blog-category': 206 | case 'all-blog-categories': 207 | return Category::resolveMenuItem($item, $url, $theme); 208 | case 'blog-post': 209 | case 'all-blog-posts': 210 | case 'category-blog-posts': 211 | return Post::resolveMenuItem($item, $url, $theme); 212 | } 213 | }); 214 | } 215 | } 216 | -------------------------------------------------------------------------------- /assets/css/winter.blog-export.css: -------------------------------------------------------------------------------- 1 | .export-behavior .export-columns { 2 | max-height: 450px !important; 3 | } 4 | -------------------------------------------------------------------------------- /assets/css/winter.blog-preview.css: -------------------------------------------------------------------------------- 1 | .blog-post-preview .editor-preview .preview-content { 2 | padding: 20px; 3 | } 4 | .blog-post-preview .editor-preview span.image-placeholder { 5 | display: block; 6 | } 7 | .blog-post-preview .editor-preview span.image-placeholder .upload-dropzone { 8 | background: #ecf0f1; 9 | display: block; 10 | border: 1px solid #e5e9ec; 11 | padding: 25px; 12 | min-height: 123px; 13 | position: relative; 14 | text-align: center; 15 | cursor: pointer; 16 | -webkit-box-sizing: border-box; 17 | -moz-box-sizing: border-box; 18 | box-sizing: border-box; 19 | } 20 | .blog-post-preview .editor-preview span.image-placeholder .upload-dropzone span.label { 21 | color: #b1b9be; 22 | font-size: 16px; 23 | display: inline-block; 24 | margin-top: 25px; 25 | } 26 | .blog-post-preview .editor-preview span.image-placeholder .upload-dropzone:before { 27 | display: inline-block; 28 | font-family: 'Font Awesome 6 Free', FontAwesome; 29 | font-weight: normal; 30 | font-style: normal; 31 | text-decoration: inherit; 32 | -webkit-font-smoothing: antialiased; 33 | *margin-right: .3em; 34 | content: "\f03e"; 35 | position: absolute; 36 | left: 25px; 37 | top: 25px; 38 | line-height: 100%; 39 | font-size: 73px; 40 | color: #d1d3d4; 41 | } 42 | .blog-post-preview .editor-preview span.image-placeholder .upload-dropzone.hover, 43 | .blog-post-preview .editor-preview span.image-placeholder .upload-dropzone:hover { 44 | background: #2f99da; 45 | } 46 | .blog-post-preview .editor-preview span.image-placeholder .upload-dropzone.hover:before, 47 | .blog-post-preview .editor-preview span.image-placeholder .upload-dropzone:hover:before, 48 | .blog-post-preview .editor-preview span.image-placeholder .upload-dropzone.hover span.label, 49 | .blog-post-preview .editor-preview span.image-placeholder .upload-dropzone:hover span.label { 50 | color: white; 51 | } 52 | .blog-post-preview .editor-preview span.image-placeholder input[type=file] { 53 | position: absolute; 54 | left: -10000em; 55 | } 56 | .blog-post-preview-container .loading-indicator { 57 | position: absolute; 58 | display: none; 59 | width: 20px; 60 | height: 20px; 61 | padding: 0!important; 62 | background: transparent; 63 | right: 10px; 64 | left: auto; 65 | top: 10px; 66 | } 67 | .blog-post-preview-container.loading-indicator-visible .loading-indicator { 68 | display: block; 69 | } 70 | html.cssanimations .blog-post-preview span.image-placeholder.loading .upload-dropzone:before { 71 | display: none; 72 | } 73 | html.cssanimations .blog-post-preview span.image-placeholder.loading .upload-dropzone .indicator { 74 | display: block; 75 | width: 50px; 76 | height: 50px; 77 | position: absolute; 78 | left: 35px; 79 | top: 35px; 80 | background-image: url('../../../../../modules/system/assets/ui/images/loader-transparent.svg'); 81 | background-size: 50px 50px; 82 | background-position: 50% 50%; 83 | -webkit-animation: spin 1s linear infinite; 84 | animation: spin 1s linear infinite; 85 | } 86 | -------------------------------------------------------------------------------- /assets/images/blog-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | blog-icon 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /assets/js/post-form.js: -------------------------------------------------------------------------------- 1 | +function ($) { "use strict"; 2 | var PostForm = function () { 3 | this.$form = $('.fancy-layout > form') 4 | this.$markdownEditor = $('[data-field-name=content] [data-control=markdowneditor]:first', this.$form) 5 | this.$preview = $('.editor-preview', this.$markdownEditor) 6 | 7 | this.formAction = this.$form.attr('action') 8 | this.sessionKey = $('input[name=_session_key]', this.$form).val() 9 | 10 | if (this.$markdownEditor.length > 0) { 11 | this.codeEditor = this.$markdownEditor.markdownEditor('getEditorObject') 12 | 13 | this.$markdownEditor.on('initPreview.oc.markdowneditor', $.proxy(this.initPreview, this)) 14 | 15 | this.initDropzones() 16 | this.initFormEvents() 17 | this.addToolbarButton() 18 | } 19 | 20 | this.initLayout() 21 | } 22 | 23 | PostForm.prototype.addToolbarButton = function() { 24 | this.buttonClickCount = 1 25 | 26 | var self = this, 27 | $button = this.$markdownEditor.markdownEditor('findToolbarButton', 'image') 28 | 29 | if (!$button.length) return 30 | 31 | $button.data('button-action', 'insertLine') 32 | $button.data('button-template', '\n\n![1](image)\n') 33 | 34 | $button.on('click', function() { 35 | $button.data('button-template', '\n\n!['+self.buttonClickCount+'](image)\n') 36 | self.buttonClickCount++ 37 | }) 38 | } 39 | 40 | PostForm.prototype.initPreview = function() { 41 | this.initImageUploaders() 42 | } 43 | 44 | PostForm.prototype.updateScroll = function() { 45 | // Reserved in case MarkdownEditor uses scrollbar plugin 46 | // this.$preview.data('wn.scrollbar').update() 47 | } 48 | 49 | PostForm.prototype.initImageUploaders = function() { 50 | var self = this 51 | $('span.image-placeholder .upload-dropzone', this.$preview).each(function(){ 52 | var 53 | $placeholder = $(this).parent(), 54 | $link = $('span.label', $placeholder), 55 | placeholderIndex = $placeholder.data('index') 56 | 57 | var uploaderOptions = { 58 | url: self.formAction, 59 | clickable: [$(this).get(0), $link.get(0)], 60 | previewsContainer: $('
').get(0), 61 | paramName: 'file', 62 | headers: {} 63 | } 64 | 65 | /* 66 | * Add CSRF token to headers 67 | */ 68 | var token = $('meta[name="csrf-token"]').attr('content') 69 | if (token) { 70 | uploaderOptions.headers['X-CSRF-TOKEN'] = token 71 | } 72 | 73 | var dropzone = new Dropzone($(this).get(0), uploaderOptions) 74 | 75 | dropzone.on('error', function(file, error) { 76 | alert('Error uploading file: ' + error) 77 | }) 78 | dropzone.on('success', function(file, data){ 79 | if (data.error) 80 | alert(data.error) 81 | else { 82 | self.pauseUpdates() 83 | var $img = $('') 84 | $img.load(function(){ 85 | self.updateScroll() 86 | }) 87 | 88 | $placeholder.replaceWith($img) 89 | 90 | self.codeEditor.replace('!['+data.file+']('+data.path+')', { 91 | needle: '!['+placeholderIndex+'](image)' 92 | }) 93 | self.resumeUpdates() 94 | } 95 | }) 96 | dropzone.on('complete', function(){ 97 | $placeholder.removeClass('loading') 98 | }) 99 | dropzone.on('sending', function(file, xhr, formData) { 100 | formData.append('X_BLOG_IMAGE_UPLOAD', 1) 101 | formData.append('_session_key', self.sessionKey) 102 | $placeholder.addClass('loading') 103 | }) 104 | }) 105 | } 106 | 107 | PostForm.prototype.pauseUpdates = function() { 108 | this.$markdownEditor.markdownEditor('pauseUpdates') 109 | } 110 | 111 | PostForm.prototype.resumeUpdates = function() { 112 | this.$markdownEditor.markdownEditor('resumeUpdates') 113 | } 114 | 115 | PostForm.prototype.initDropzones = function() { 116 | $(document).bind('dragover', function (e) { 117 | var dropZone = $('span.image-placeholder .upload-dropzone'), 118 | foundDropzone, 119 | timeout = window.dropZoneTimeout 120 | 121 | if (!timeout) 122 | dropZone.addClass('in'); 123 | else 124 | clearTimeout(timeout); 125 | 126 | var found = false, 127 | node = e.target 128 | 129 | do { 130 | if ($(node).hasClass('dropzone')) { 131 | found = true 132 | foundDropzone = $(node) 133 | break 134 | } 135 | 136 | node = node.parentNode; 137 | 138 | } while (node != null); 139 | 140 | dropZone.removeClass('in hover') 141 | 142 | if (found) 143 | foundDropzone.addClass('hover') 144 | 145 | window.dropZoneTimeout = setTimeout(function () { 146 | window.dropZoneTimeout = null 147 | dropZone.removeClass('in hover') 148 | }, 100) 149 | }) 150 | } 151 | 152 | PostForm.prototype.initFormEvents = function() { 153 | $(document).on('ajaxSuccess', '.fancy-layout > form', function(event, context, data){ 154 | if (context.handler == 'onSave' && !data.X_WINTER_ERROR_FIELDS) { 155 | $(this).trigger('unchange.wn.changeMonitor') 156 | } 157 | }) 158 | } 159 | 160 | PostForm.prototype.initLayout = function() { 161 | $('#Form-secondaryTabs .tab-pane.layout-cell:not(:first-child)').addClass('padded-pane') 162 | } 163 | 164 | PostForm.prototype.replacePlaceholder = function(placeholder, placeholderHtmlReplacement, mdCodePlaceholder, mdCodeReplacement) { 165 | this.pauseUpdates() 166 | placeholder.replaceWith(placeholderHtmlReplacement) 167 | 168 | this.codeEditor.replace(mdCodeReplacement, { 169 | needle: mdCodePlaceholder 170 | }) 171 | this.updateScroll() 172 | this.resumeUpdates() 173 | } 174 | 175 | $(document).ready(function(){ 176 | var form = new PostForm() 177 | 178 | if ($.wn === undefined) 179 | $.wn = {} 180 | 181 | if ($.oc === undefined) 182 | $.oc = $.wn 183 | 184 | $.wn.blogPostForm = form 185 | }) 186 | 187 | }(window.jQuery); 188 | -------------------------------------------------------------------------------- /assets/less/winter.blog-preview.less: -------------------------------------------------------------------------------- 1 | @import "../../../../../modules/backend/assets/less/core/boot.less"; 2 | 3 | .blog-post-preview .editor-preview { 4 | .preview-content { 5 | padding: 20px; 6 | } 7 | 8 | span.image-placeholder { 9 | display: block; 10 | 11 | .upload-dropzone { 12 | background: #ecf0f1; 13 | display: block; 14 | border: 1px solid #e5e9ec; 15 | padding: 25px; 16 | min-height: 123px; 17 | position: relative; 18 | text-align: center; 19 | cursor: pointer; 20 | .box-sizing(border-box); 21 | 22 | span.label { 23 | color: #b1b9be; 24 | font-size: 16px; 25 | display: inline-block; 26 | margin-top: 25px; 27 | } 28 | 29 | &:before { 30 | display: inline-block; 31 | .icon(@picture-o); 32 | position: absolute; 33 | left: 25px; 34 | top: 25px; 35 | line-height: 100%; 36 | font-size: 73px; 37 | color: #d1d3d4; 38 | } 39 | 40 | &.hover, &:hover { 41 | background: #2f99da; 42 | 43 | &:before, span.label { 44 | color: white; 45 | } 46 | } 47 | } 48 | 49 | input[type=file] { 50 | position: absolute; 51 | left: -10000em; 52 | } 53 | } 54 | } 55 | 56 | .blog-post-preview-container { 57 | .loading-indicator { 58 | position: absolute; 59 | display: none; 60 | width: 20px; 61 | height: 20px; 62 | padding: 0!important; 63 | background: transparent; 64 | right: 10px; 65 | left: auto; 66 | top: 10px; 67 | } 68 | 69 | &.loading-indicator-visible { 70 | .loading-indicator { 71 | display: block; 72 | } 73 | } 74 | } 75 | 76 | html.cssanimations { 77 | .blog-post-preview { 78 | span.image-placeholder.loading { 79 | .upload-dropzone { 80 | &:before { 81 | display: none; 82 | } 83 | 84 | .indicator { 85 | display: block; 86 | width: 50px; 87 | height: 50px; 88 | position: absolute; 89 | left: 35px; 90 | top: 35px; 91 | background-image:url('../../../../../modules/system/assets/ui/images/loader-transparent.svg'); 92 | background-size: 50px 50px; 93 | background-position: 50% 50%; 94 | .animation(spin 1s linear infinite); 95 | } 96 | } 97 | } 98 | } 99 | } -------------------------------------------------------------------------------- /classes/TagProcessor.php: -------------------------------------------------------------------------------- 1 | callbacks[] = $callback; 31 | } 32 | 33 | public function processTags($markup, $preview) 34 | { 35 | foreach ($this->callbacks as $callback) { 36 | $markup = $callback($markup, $preview); 37 | } 38 | 39 | return $markup; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /components/Categories.php: -------------------------------------------------------------------------------- 1 | 'winter.blog::lang.settings.category_title', 31 | 'description' => 'winter.blog::lang.settings.category_description', 32 | ]; 33 | } 34 | 35 | public function defineProperties(): array 36 | { 37 | return [ 38 | 'slug' => [ 39 | 'title' => 'winter.blog::lang.settings.category_slug', 40 | 'description' => 'winter.blog::lang.settings.category_slug_description', 41 | 'default' => '{{ :slug }}', 42 | 'type' => 'string', 43 | ], 44 | 'displayEmpty' => [ 45 | 'title' => 'winter.blog::lang.settings.category_display_empty', 46 | 'description' => 'winter.blog::lang.settings.category_display_empty_description', 47 | 'type' => 'checkbox', 48 | 'default' => 0, 49 | ], 50 | 'categoryPage' => [ 51 | 'title' => 'winter.blog::lang.settings.category_page', 52 | 'description' => 'winter.blog::lang.settings.category_page_description', 53 | 'type' => 'dropdown', 54 | 'default' => 'blog/category', 55 | 'group' => 'winter.blog::lang.settings.group_links', 56 | ], 57 | ]; 58 | } 59 | 60 | public function getCategoryPageOptions() 61 | { 62 | return Page::sortBy('baseFileName')->lists('baseFileName', 'baseFileName'); 63 | } 64 | 65 | public function onRun() 66 | { 67 | $this->currentCategorySlug = $this->page['currentCategorySlug'] = $this->property('slug'); 68 | $this->categoryPage = $this->page['categoryPage'] = $this->property('categoryPage'); 69 | $this->categories = $this->page['categories'] = $this->loadCategories(); 70 | } 71 | 72 | /** 73 | * Load all categories or, depending on the option, only those that have blog posts 74 | */ 75 | protected function loadCategories(): Collection 76 | { 77 | $categories = BlogCategory::with('posts_count')->getNested(); 78 | if (!$this->property('displayEmpty')) { 79 | $iterator = function ($categories) use (&$iterator) { 80 | return $categories->reject(function ($category) use (&$iterator) { 81 | if ($category->getNestedPostCount() == 0) { 82 | return true; 83 | } 84 | if ($category->children) { 85 | $category->children = $iterator($category->children); 86 | } 87 | return false; 88 | }); 89 | }; 90 | $categories = $iterator($categories); 91 | } 92 | 93 | /* 94 | * Add a "url" helper attribute for linking to each category 95 | */ 96 | return $this->linkCategories($categories); 97 | } 98 | 99 | /** 100 | * Sets the URL on each category according to the defined category page 101 | */ 102 | protected function linkCategories(Collection $categories): Collection 103 | { 104 | return $categories->each(function ($category) { 105 | $category->setUrl($this->categoryPage, $this->controller); 106 | 107 | if ($category->children) { 108 | $this->linkCategories($category->children); 109 | } 110 | }); 111 | } 112 | } 113 | -------------------------------------------------------------------------------- /components/Post.php: -------------------------------------------------------------------------------- 1 | 'winter.blog::lang.settings.post_title', 27 | 'description' => 'winter.blog::lang.settings.post_description', 28 | ]; 29 | } 30 | 31 | public function defineProperties(): array 32 | { 33 | return [ 34 | 'slug' => [ 35 | 'title' => 'winter.blog::lang.settings.post_slug', 36 | 'description' => 'winter.blog::lang.settings.post_slug_description', 37 | 'default' => '{{ :slug }}', 38 | 'type' => 'string', 39 | ], 40 | 'categoryPage' => [ 41 | 'title' => 'winter.blog::lang.settings.post_category', 42 | 'description' => 'winter.blog::lang.settings.post_category_description', 43 | 'type' => 'dropdown', 44 | 'default' => 'blog/category', 45 | ], 46 | ]; 47 | } 48 | 49 | public function getCategoryPageOptions() 50 | { 51 | return Page::sortBy('baseFileName')->lists('baseFileName', 'baseFileName'); 52 | } 53 | 54 | public function init() 55 | { 56 | Event::listen('translate.localePicker.translateParams', function ($page, $params, $oldLocale, $newLocale) { 57 | if (isset($params['slug'])) { 58 | $newParams = $params; 59 | $record = BlogPost::transWhere('slug', $params['slug'], $oldLocale)->first(); 60 | if ($record) { 61 | $newParams['slug'] = $record->getAttributeTranslated('slug', $newLocale); 62 | return $newParams; 63 | } 64 | } 65 | }); 66 | } 67 | 68 | public function onRun() 69 | { 70 | $this->categoryPage = $this->page['categoryPage'] = $this->property('categoryPage'); 71 | $this->post = $this->page['post'] = $this->loadPost(); 72 | if (!$this->post) { 73 | $this->setStatusCode(404); 74 | return $this->controller->run('404'); 75 | } 76 | } 77 | 78 | public function onRender() 79 | { 80 | if (empty($this->post)) { 81 | $this->post = $this->page['post'] = $this->loadPost(); 82 | } 83 | } 84 | 85 | protected function loadPost() 86 | { 87 | $slug = $this->property('slug'); 88 | 89 | $post = new BlogPost(); 90 | $query = $post->query(); 91 | 92 | if ($post->isClassExtendedWith('Winter.Translate.Behaviors.TranslatableModel')) { 93 | $query->transWhere('slug', $slug); 94 | } else { 95 | $query->where('slug', $slug); 96 | } 97 | 98 | if (!$this->checkEditor()) { 99 | $query->isPublished(); 100 | } 101 | 102 | $post = $query->first(); 103 | 104 | /* 105 | * Add a "url" helper attribute for linking to each category 106 | */ 107 | if ($post && $post->exists && $post->categories->count()) { 108 | $post->categories->each(function ($category) { 109 | $category->setUrl($this->categoryPage, $this->controller); 110 | }); 111 | } 112 | 113 | return $post; 114 | } 115 | 116 | public function previousPost() 117 | { 118 | return $this->getPostSibling(-1); 119 | } 120 | 121 | public function nextPost() 122 | { 123 | return $this->getPostSibling(1); 124 | } 125 | 126 | protected function getPostSibling($direction = 1) 127 | { 128 | if (!$this->post) { 129 | return; 130 | } 131 | 132 | $method = $direction === -1 ? 'previousPost' : 'nextPost'; 133 | 134 | if (!$post = $this->post->$method()) { 135 | return; 136 | } 137 | 138 | $postPage = $this->getPage()->getBaseFileName(); 139 | 140 | $post->setUrl($postPage, $this->controller); 141 | 142 | $post->categories->each(function ($category) { 143 | $category->setUrl($this->categoryPage, $this->controller); 144 | }); 145 | 146 | return $post; 147 | } 148 | 149 | protected function checkEditor() 150 | { 151 | $backendUser = BackendAuth::getUser(); 152 | 153 | return $backendUser && $backendUser->hasAccess('winter.blog.access_posts'); 154 | } 155 | } 156 | -------------------------------------------------------------------------------- /components/RssFeed.php: -------------------------------------------------------------------------------- 1 | 'winter.blog::lang.settings.rssfeed_title', 41 | 'description' => 'winter.blog::lang.settings.rssfeed_description', 42 | ]; 43 | } 44 | 45 | public function defineProperties(): array 46 | { 47 | return [ 48 | 'categoryFilter' => [ 49 | 'title' => 'winter.blog::lang.settings.posts_filter', 50 | 'description' => 'winter.blog::lang.settings.posts_filter_description', 51 | 'type' => 'string', 52 | 'default' => '', 53 | ], 54 | 'sortOrder' => [ 55 | 'title' => 'winter.blog::lang.settings.posts_order', 56 | 'description' => 'winter.blog::lang.settings.posts_order_description', 57 | 'type' => 'dropdown', 58 | 'default' => 'created_at desc', 59 | ], 60 | 'postsPerPage' => [ 61 | 'title' => 'winter.blog::lang.settings.posts_per_page', 62 | 'type' => 'string', 63 | 'validationPattern' => '^[0-9]+$', 64 | 'validationMessage' => 'winter.blog::lang.settings.posts_per_page_validation', 65 | 'default' => '10', 66 | ], 67 | 'blogPage' => [ 68 | 'title' => 'winter.blog::lang.settings.rssfeed_blog', 69 | 'description' => 'winter.blog::lang.settings.rssfeed_blog_description', 70 | 'type' => 'dropdown', 71 | 'default' => 'blog/post', 72 | 'group' => 'winter.blog::lang.settings.group_links', 73 | ], 74 | 'postPage' => [ 75 | 'title' => 'winter.blog::lang.settings.posts_post', 76 | 'description' => 'winter.blog::lang.settings.posts_post_description', 77 | 'type' => 'dropdown', 78 | 'default' => 'blog/post', 79 | 'group' => 'winter.blog::lang.settings.group_links', 80 | ], 81 | ]; 82 | } 83 | 84 | public function getBlogPageOptions(): array 85 | { 86 | return Page::sortBy('baseFileName')->lists('baseFileName', 'baseFileName'); 87 | } 88 | 89 | public function getPostPageOptions(): array 90 | { 91 | return Page::sortBy('baseFileName')->lists('baseFileName', 'baseFileName'); 92 | } 93 | 94 | public function getSortOrderOptions(): array 95 | { 96 | $options = BlogPost::$allowedSortingOptions; 97 | 98 | foreach ($options as $key => $value) { 99 | $options[$key] = Lang::get($value); 100 | } 101 | 102 | return $options; 103 | } 104 | 105 | public function onRun(): HttpResponse 106 | { 107 | $this->prepareVars(); 108 | 109 | $xmlFeed = $this->renderPartial('@default'); 110 | 111 | return Response::make($xmlFeed, '200')->header('Content-Type', 'text/xml'); 112 | } 113 | 114 | protected function prepareVars(): void 115 | { 116 | $this->blogPage = $this->page['blogPage'] = $this->property('blogPage'); 117 | $this->postPage = $this->page['postPage'] = $this->property('postPage'); 118 | $this->category = $this->page['category'] = $this->loadCategory(); 119 | $this->posts = $this->page['posts'] = $this->listPosts(); 120 | 121 | $this->page['link'] = $this->pageUrl($this->blogPage); 122 | $this->page['rssLink'] = url()->full(); 123 | 124 | $currentPage = $this->posts->currentPage(); 125 | $lastPage = $this->posts->lastPage(); 126 | $prevPage = $currentPage > 1 ? $currentPage - 1 : null; 127 | $nextPage = $currentPage < $lastPage ? $currentPage + 1 : null; 128 | $this->page['paginationLinks'] = [ 129 | 'first' => $this->getPageUrl(1), 130 | 'last' => $this->getPageUrl($lastPage), 131 | 'prev' => $prevPage ? $this->getPageUrl($prevPage) : null, 132 | 'next' => $nextPage ? $this->getPageUrl($nextPage) : null, 133 | ]; 134 | } 135 | 136 | /** 137 | * Get the URL to the provided page number 138 | */ 139 | protected function getPageUrl(int $page): string 140 | { 141 | return UrlGenerator::buildUrl( 142 | url()->full(), 143 | ['query' => ['page' => $page]], 144 | HTTP_URL_JOIN_QUERY 145 | ); 146 | } 147 | 148 | protected function listPosts(): LengthAwarePaginator 149 | { 150 | $category = $this->category ? $this->category->id : null; 151 | 152 | /* 153 | * List all the posts, eager load their categories 154 | */ 155 | $posts = BlogPost::with('categories')->listFrontEnd([ 156 | 'sort' => $this->property('sortOrder'), 157 | 'perPage' => $this->property('postsPerPage'), 158 | 'category' => $category, 159 | 'page' => (int) get('page', 1), 160 | ]); 161 | 162 | /* 163 | * Add a "url" helper attribute for linking to each post and category 164 | */ 165 | $posts->each(function ($post) { 166 | $post->setUrl($this->postPage, $this->controller); 167 | }); 168 | 169 | return $posts; 170 | } 171 | 172 | protected function loadCategory(): ?BlogCategory 173 | { 174 | if (!$categoryId = $this->property('categoryFilter')) { 175 | return null; 176 | } 177 | 178 | if (!$category = BlogCategory::whereSlug($categoryId)->first()) { 179 | return null; 180 | } 181 | 182 | return $category; 183 | } 184 | } 185 | -------------------------------------------------------------------------------- /components/categories/default.htm: -------------------------------------------------------------------------------- 1 | {% if __SELF__.categories|length > 0 %} 2 | 8 | {% else %} 9 |

No categories were found.

10 | {% endif %} 11 | -------------------------------------------------------------------------------- /components/categories/items.htm: -------------------------------------------------------------------------------- 1 | {% for category in categories %} 2 | {% set postCount = category.post_count %} 3 |
  • 4 | {{ category.name }} 5 | {% if postCount %} 6 | {{ postCount }} 7 | {% endif %} 8 | 9 | {% if category.children|length > 0 %} 10 |
      11 | {% partial __SELF__ ~ "::items" 12 | categories=category.children 13 | currentCategorySlug=currentCategorySlug 14 | %} 15 |
    16 | {% endif %} 17 |
  • 18 | {% endfor %} 19 | -------------------------------------------------------------------------------- /components/post/default.htm: -------------------------------------------------------------------------------- 1 | {% set post = __SELF__.post %} 2 | 3 |
    {{ post.content_html | raw }}
    4 | 5 | {% if post.featured_images.count %} 6 | 17 | {% endif %} 18 | 19 |

    20 | {% if post.categories.count %} 21 | {% set categoryLinks = post.categories | map(c => "#{c.name}") | join(', ') %} 22 | 23 | {{ 'winter.blog::lang.post.posted_byline' | trans({ 24 | date: post.published_at | date('winter.blog::lang.post.date_format' | trans), 25 | categories: categoryLinks 26 | }) }} 27 | {% else %} 28 | {{ 'winter.blog::lang.post.posted_byline_no_categories' | trans({ 29 | date: post.published_at | date('winter.blog::lang.post.date_format'|trans) 30 | }) }} 31 | {% endif %} 32 |

    33 | 34 | {% if post.user %} 35 |

    36 | {{ 'winter.blog::lang.post.published_by' | trans }}: {{ post.user.first_name ~ ' ' ~ post.user.last_name }} 37 |

    38 | {% endif %} 39 | -------------------------------------------------------------------------------- /components/posts/default.htm: -------------------------------------------------------------------------------- 1 | {% set posts = __SELF__.posts %} 2 | 3 | 29 | 30 | {% if posts.lastPage > 1 %} 31 | 46 | {% endif %} 47 | -------------------------------------------------------------------------------- /components/rssfeed/default.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {{ this.page.meta_title ?: this.page.title }} 5 | {{ link }} 6 | {{ this.page.meta_description ?: this.page.description }} 7 | 8 | 9 | {% if paginationLinks.prev %}{% endif %} 10 | {% if paginationLinks.next %}{% endif %} 11 | 12 | {% for post in posts %} 13 | 14 | {{ post.title }} 15 | {{ post.url }} 16 | {{ post.url }} 17 | {{ post.published_at.toRfc2822String }} 18 | {{ post.summary }} 19 | 20 | {% endfor %} 21 | 22 | 23 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "winter/wn-blog-plugin", 3 | "type": "winter-plugin", 4 | "description": "Blog plugin for Winter CMS", 5 | "homepage": "https://github.com/wintercms/wn-blog-plugin", 6 | "keywords": ["winter cms", "winter", "plugin", "blog"], 7 | "license": "MIT", 8 | "authors": [ 9 | { 10 | "name": "Alexey Bobkov", 11 | "email": "aleksey.bobkov@gmail.com", 12 | "role": "Original Author" 13 | }, 14 | { 15 | "name": "Samuel Georges", 16 | "email": "daftspunky@gmail.com", 17 | "role": "Original Author" 18 | }, 19 | { 20 | "name": "Winter CMS Maintainers", 21 | "homepage": "https://wintercms.com", 22 | "role": "Maintainer" 23 | } 24 | ], 25 | "support": { 26 | "issues": "https://github.com/wintercms/wn-blog-plugin/issues", 27 | "discord": "https://discord.gg/D5MFSPH6Ux", 28 | "source": "https://github.com/wintercms/wn-blog-plugin" 29 | }, 30 | "require": { 31 | "php": ">=7.0", 32 | "winter/wn-backend-module": "^1.2.8|dev-develop", 33 | "composer/installers": "~1.0" 34 | }, 35 | "replace": { 36 | "rainlab/blog-plugin": "~1.3" 37 | }, 38 | "extra": { 39 | "installer-name": "blog" 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /controllers/Categories.php: -------------------------------------------------------------------------------- 1 | delete(); 29 | } 30 | 31 | Flash::success(Lang::get('winter.blog::lang.category.delete_success')); 32 | } 33 | 34 | return $this->listRefresh(); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /controllers/Posts.php: -------------------------------------------------------------------------------- 1 | vars['postsTotal'] = Post::count(); 28 | $this->vars['postsPublished'] = Post::isPublished()->count(); 29 | $this->vars['postsDrafts'] = $this->vars['postsTotal'] - $this->vars['postsPublished']; 30 | 31 | $this->asExtension('ListController')->index(); 32 | } 33 | 34 | public function create() 35 | { 36 | BackendMenu::setContextSideMenu('new_post'); 37 | 38 | $this->addCss('/plugins/winter/blog/assets/css/winter.blog-preview.css'); 39 | $this->addJs('/plugins/winter/blog/assets/js/post-form.js'); 40 | 41 | return $this->asExtension('FormController')->create(); 42 | } 43 | 44 | public function update($recordId = null) 45 | { 46 | $this->bodyClass = 'compact-container'; 47 | $this->addCss('/plugins/winter/blog/assets/css/winter.blog-preview.css'); 48 | $this->addJs('/plugins/winter/blog/assets/js/post-form.js'); 49 | 50 | return $this->asExtension('FormController')->update($recordId); 51 | } 52 | 53 | public function export() 54 | { 55 | $this->addCss('/plugins/winter/blog/assets/css/winter.blog-export.css'); 56 | 57 | return $this->asExtension('ImportExportController')->export(); 58 | } 59 | 60 | public function listExtendQuery($query) 61 | { 62 | if (!$this->user->hasAnyAccess(['winter.blog.access_other_posts'])) { 63 | $query->where('user_id', $this->user->id); 64 | } 65 | } 66 | 67 | public function formExtendQuery($query) 68 | { 69 | if (!$this->user->hasAnyAccess(['winter.blog.access_other_posts'])) { 70 | $query->where('user_id', $this->user->id); 71 | } 72 | } 73 | 74 | public function formExtendModel($model) 75 | { 76 | if ($model->exists && !empty($model->slug) && $model->preview_page) { 77 | $model->setUrl($model->preview_page, (new \Cms\Classes\Controller())); 78 | } 79 | } 80 | 81 | public function formExtendFieldsBefore($widget) 82 | { 83 | if (!$model = $widget->model) { 84 | return; 85 | } 86 | if (!$model instanceof Post || $widget->isNested) { 87 | return; 88 | } 89 | $pluginManager = PluginManager::instance(); 90 | 91 | $useRichEditor = BlogSettings::get('use_rich_editor', false); 92 | $useMlWidget = $pluginManager->exists('Winter.Translate'); 93 | 94 | if ($useRichEditor) { 95 | $widget->tabs['fields']['content']['type'] = $useMlWidget ? 'Winter\Translate\FormWidgets\MLRichEditor' : 'richeditor'; 96 | } elseif ($useMlWidget) { 97 | $widget->tabs['fields']['content']['type'] = 'Winter\Blog\FormWidgets\MLBlogMarkdown'; 98 | } 99 | } 100 | 101 | public function index_onDelete() 102 | { 103 | if (($checkedIds = post('checked')) && is_array($checkedIds) && count($checkedIds)) { 104 | foreach ($checkedIds as $postId) { 105 | if ((!$post = Post::find($postId)) || !$post->canEdit($this->user)) { 106 | continue; 107 | } 108 | 109 | $post->delete(); 110 | } 111 | 112 | Flash::success(Lang::get('winter.blog::lang.post.delete_success')); 113 | } 114 | 115 | return $this->listRefresh(); 116 | } 117 | 118 | /** 119 | * {@inheritDoc} 120 | */ 121 | public function listInjectRowClass($record, $definition = null) 122 | { 123 | if (!$record->published) { 124 | return 'safe disabled'; 125 | } 126 | } 127 | 128 | public function formBeforeCreate($model) 129 | { 130 | $model->user_id = $this->user->id; 131 | } 132 | 133 | public function onRefreshPreview() 134 | { 135 | $data = post('Post'); 136 | 137 | $previewHtml = Post::formatHtml($data['content'], true); 138 | 139 | return [ 140 | 'preview' => $previewHtml, 141 | ]; 142 | } 143 | } 144 | -------------------------------------------------------------------------------- /controllers/categories/config_form.yaml: -------------------------------------------------------------------------------- 1 | # =================================== 2 | # Form Behavior Config 3 | # =================================== 4 | 5 | name: winter.blog::lang.blog.create_category 6 | form: ~/plugins/winter/blog/models/category/fields.yaml 7 | modelClass: Winter\Blog\Models\Category 8 | defaultRedirect: winter/blog/categories 9 | 10 | create: 11 | redirect: winter/blog/categories/update/:id 12 | redirectClose: winter/blog/categories 13 | 14 | update: 15 | redirect: winter/blog/categories 16 | redirectClose: winter/blog/categories 17 | -------------------------------------------------------------------------------- /controllers/categories/config_list.yaml: -------------------------------------------------------------------------------- 1 | # =================================== 2 | # List Behavior Config 3 | # =================================== 4 | 5 | # Model List Column configuration 6 | list: ~/plugins/winter/blog/models/category/columns.yaml 7 | 8 | # Model Class name 9 | modelClass: Winter\Blog\Models\Category 10 | 11 | # List Title 12 | title: winter.blog::lang.category.label_plural 13 | 14 | # Link URL for each record 15 | recordUrl: winter/blog/categories/update/:id 16 | 17 | # Message to display if the list is empty 18 | noRecordsMessage: backend::lang.list.no_records 19 | 20 | # Records to display per page 21 | recordsPerPage: 5 22 | 23 | # Display checkboxes next to each record 24 | showCheckboxes: true 25 | 26 | showTree: true 27 | 28 | # Toolbar widget configuration 29 | toolbar: 30 | # Partial for toolbar buttons 31 | buttons: list_toolbar 32 | 33 | # Search widget configuration 34 | search: 35 | prompt: backend::lang.list.search_prompt 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /controllers/categories/config_reorder.yaml: -------------------------------------------------------------------------------- 1 | # =================================== 2 | # Reorder Behavior Config 3 | # =================================== 4 | 5 | # Reorder Title 6 | title: winter.blog::lang.category.reorder 7 | 8 | # Attribute name 9 | nameFrom: name 10 | 11 | # Model Class name 12 | modelClass: Winter\Blog\Models\Category 13 | 14 | # Toolbar widget configuration 15 | toolbar: 16 | # Partial for toolbar buttons 17 | buttons: reorder_toolbar -------------------------------------------------------------------------------- /controllers/posts/config_filter.yaml: -------------------------------------------------------------------------------- 1 | # =================================== 2 | # Filter Scope Definitions 3 | # =================================== 4 | 5 | scopes: 6 | 7 | category: 8 | 9 | # Filter name 10 | label: winter.blog::lang.posts.filter_category 11 | 12 | # Model Class name 13 | modelClass: Winter\Blog\Models\Category 14 | 15 | # Model attribute to display for the name 16 | nameFrom: name 17 | 18 | # Apply query scope 19 | scope: FilterCategories 20 | 21 | published: 22 | 23 | # Filter name 24 | label: winter.blog::lang.posts.filter_published 25 | 26 | # Filter type 27 | type: switch 28 | 29 | # SQL Conditions 30 | conditions: 31 | - published <> '1' 32 | - published = '1' 33 | 34 | published_date: 35 | 36 | # Filter name 37 | label: winter.blog::lang.posts.filter_date 38 | 39 | # Filter type 40 | type: daterange 41 | 42 | # SQL Conditions 43 | conditions: created_at >= ':after' AND created_at <= ':before' 44 | -------------------------------------------------------------------------------- /controllers/posts/config_form.yaml: -------------------------------------------------------------------------------- 1 | # =================================== 2 | # Form Behavior Config 3 | # =================================== 4 | 5 | name: winter.blog::lang.blog.create_post 6 | form: ~/plugins/winter/blog/models/post/fields.yaml 7 | modelClass: Winter\Blog\Models\Post 8 | defaultRedirect: winter/blog/posts 9 | 10 | create: 11 | redirect: winter/blog/posts/update/:id 12 | redirectClose: winter/blog/posts 13 | 14 | update: 15 | redirect: winter/blog/posts 16 | redirectClose: winter/blog/posts 17 | -------------------------------------------------------------------------------- /controllers/posts/config_import_export.yaml: -------------------------------------------------------------------------------- 1 | # =================================== 2 | # Import/Export Behavior Config 3 | # =================================== 4 | 5 | import: 6 | # Page title 7 | title: winter.blog::lang.posts.import_post 8 | 9 | # Import List Column configuration 10 | list: $/winter/blog/models/postimport/columns.yaml 11 | 12 | # Import Form Field configuration 13 | form: $/winter/blog/models/postimport/fields.yaml 14 | 15 | # Import Model class 16 | modelClass: Winter\Blog\Models\PostImport 17 | 18 | # Redirect when finished 19 | redirect: winter/blog/posts 20 | 21 | # Required permissions 22 | permissions: winter.blog.access_import_export 23 | 24 | export: 25 | # Page title 26 | title: winter.blog::lang.posts.export_post 27 | 28 | # Output file name 29 | fileName: posts.csv 30 | 31 | # Export List Column configuration 32 | list: $/winter/blog/models/postexport/columns.yaml 33 | 34 | # Export Model class 35 | modelClass: Winter\Blog\Models\PostExport 36 | 37 | # Redirect when finished 38 | redirect: winter/blog/posts 39 | 40 | # Required permissions 41 | permissions: winter.blog.access_import_export 42 | -------------------------------------------------------------------------------- /controllers/posts/config_list.yaml: -------------------------------------------------------------------------------- 1 | # =================================== 2 | # List Behavior Config 3 | # =================================== 4 | 5 | # Model List Column configuration 6 | list: ~/plugins/winter/blog/models/post/columns.yaml 7 | 8 | # Model Class name 9 | modelClass: Winter\Blog\Models\Post 10 | 11 | # List Title 12 | title: winter.blog::lang.post.label_plural 13 | 14 | # Link URL for each record 15 | recordUrl: winter/blog/posts/update/:id 16 | 17 | # Message to display if the list is empty 18 | noRecordsMessage: backend::lang.list.no_records 19 | 20 | # Records to display per page 21 | recordsPerPage: 25 22 | 23 | # Displays the list column set up button 24 | showSetup: true 25 | 26 | # Displays the sorting link on each column 27 | showSorting: true 28 | 29 | # Default sorting column 30 | defaultSort: 31 | column: published_at 32 | direction: desc 33 | 34 | # Display checkboxes next to each record 35 | showCheckboxes: true 36 | 37 | # Toolbar widget configuration 38 | toolbar: 39 | # Partial for toolbar buttons 40 | buttons: list_toolbar 41 | 42 | # Search widget configuration 43 | search: 44 | prompt: backend::lang.list.search_prompt 45 | 46 | # Filter widget configuration 47 | filter: config_filter.yaml 48 | -------------------------------------------------------------------------------- /formwidgets/BlogMarkdown.php: -------------------------------------------------------------------------------- 1 | viewPath = base_path() . '/modules/backend/formwidgets/markdowneditor/partials'; 30 | 31 | $this->checkUploadPostback(); 32 | 33 | parent::init(); 34 | } 35 | 36 | /** 37 | * {@inheritDoc} 38 | */ 39 | protected function loadAssets() 40 | { 41 | $this->assetPath = '/modules/backend/formwidgets/markdowneditor/assets'; 42 | parent::loadAssets(); 43 | } 44 | 45 | /** 46 | * Disable HTML cleaning on the widget level since the PostModel will handle it 47 | * 48 | * @return boolean 49 | */ 50 | protected function shouldCleanHtml() 51 | { 52 | return false; 53 | } 54 | 55 | /** 56 | * {@inheritDoc} 57 | */ 58 | public function onRefresh() 59 | { 60 | $content = post($this->formField->getName()); 61 | 62 | $previewHtml = PostModel::formatHtml($content, true); 63 | 64 | return [ 65 | 'preview' => $previewHtml, 66 | ]; 67 | } 68 | 69 | /** 70 | * Handle images being uploaded to the blog post 71 | * 72 | * @return void 73 | */ 74 | protected function checkUploadPostback() 75 | { 76 | if (!post('X_BLOG_IMAGE_UPLOAD')) { 77 | return; 78 | } 79 | 80 | $uploadedFileName = null; 81 | 82 | try { 83 | $uploadedFile = Input::file('file'); 84 | 85 | if ($uploadedFile) { 86 | $uploadedFileName = $uploadedFile->getClientOriginalName(); 87 | } 88 | 89 | $validationRules = ['max:' . File::getMaxFilesize()]; 90 | $validationRules[] = 'mimes:jpg,jpeg,bmp,png,gif'; 91 | 92 | $validation = Validator::make( 93 | ['file_data' => $uploadedFile], 94 | ['file_data' => $validationRules] 95 | ); 96 | 97 | if ($validation->fails()) { 98 | throw new ValidationException($validation); 99 | } 100 | 101 | if (!$uploadedFile->isValid()) { 102 | throw new SystemException(Lang::get('cms::lang.asset.file_not_valid')); 103 | } 104 | 105 | $fileRelation = $this->model->content_images(); 106 | 107 | $file = new File(); 108 | $file->data = $uploadedFile; 109 | $file->is_public = true; 110 | $file->save(); 111 | 112 | $fileRelation->add($file, $this->sessionKey); 113 | $result = [ 114 | 'file' => $uploadedFileName, 115 | 'path' => $file->getPath(), 116 | ]; 117 | 118 | $response = Response::make()->setContent($result); 119 | $this->controller->setResponse($response); 120 | } catch (Exception $ex) { 121 | $message = $uploadedFileName 122 | ? Lang::get('cms::lang.asset.error_uploading_file', ['name' => $uploadedFileName, 'error' => $ex->getMessage()]) 123 | : $ex->getMessage(); 124 | 125 | $result = [ 126 | 'error' => $message, 127 | 'file' => $uploadedFileName, 128 | ]; 129 | 130 | $response = Response::make()->setContent($result); 131 | $this->controller->setResponse($response); 132 | } 133 | } 134 | } 135 | -------------------------------------------------------------------------------- /formwidgets/MLBlogMarkdown.php: -------------------------------------------------------------------------------- 1 | initLocale(); 34 | } 35 | 36 | /** 37 | * {@inheritDoc} 38 | */ 39 | public function render() 40 | { 41 | $this->actAsParent(); 42 | $parentContent = parent::render(); 43 | $this->actAsParent(false); 44 | 45 | if (!$this->isAvailable) { 46 | return $parentContent; 47 | } 48 | 49 | $this->vars['markdowneditor'] = $parentContent; 50 | 51 | $this->actAsControl(true); 52 | 53 | return $this->makePartial('mlmarkdowneditor'); 54 | } 55 | 56 | public function prepareVars() 57 | { 58 | parent::prepareVars(); 59 | $this->prepareLocaleVars(); 60 | } 61 | 62 | /** 63 | * Returns an array of translated values for this field 64 | * @param $value 65 | * @return array 66 | */ 67 | public function getSaveValue($value) 68 | { 69 | $localeData = $this->getLocaleSaveData(); 70 | 71 | /* 72 | * Set the translated values to the model 73 | */ 74 | if ($this->model->methodExists('setAttributeTranslated')) { 75 | foreach ($localeData as $locale => $value) { 76 | $this->model->setAttributeTranslated('content', $value, $locale); 77 | 78 | $this->model->setAttributeTranslated( 79 | 'content_html', 80 | Post::formatHtml($value), 81 | $locale 82 | ); 83 | } 84 | } 85 | 86 | return array_get($localeData, $this->defaultLocale->code, $value); 87 | } 88 | 89 | /** 90 | * {@inheritDoc} 91 | */ 92 | protected function loadAssets() 93 | { 94 | $this->actAsParent(); 95 | parent::loadAssets(); 96 | $this->actAsParent(false); 97 | 98 | if (Locale::isAvailable()) { 99 | $this->loadLocaleAssets(); 100 | 101 | $this->actAsControl(true); 102 | $this->addJs('js/mlmarkdowneditor.js'); 103 | $this->actAsControl(false); 104 | } 105 | } 106 | 107 | protected function actAsParent($switch = true) 108 | { 109 | if ($switch) { 110 | $this->originalAssetPath = $this->assetPath; 111 | $this->originalViewPath = $this->viewPath; 112 | $this->assetPath = '/modules/backend/formwidgets/markdowneditor/assets'; 113 | $this->viewPath = base_path('/modules/backend/formwidgets/markdowneditor/partials'); 114 | } else { 115 | $this->assetPath = $this->originalAssetPath; 116 | $this->viewPath = $this->originalViewPath; 117 | } 118 | } 119 | 120 | protected function actAsControl($switch = true) 121 | { 122 | if ($switch) { 123 | $this->originalAssetPath = $this->assetPath; 124 | $this->originalViewPath = $this->viewPath; 125 | $this->assetPath = '/plugins/winter/translate/formwidgets/mlmarkdowneditor/assets'; 126 | $this->viewPath = base_path('/plugins/winter/translate/formwidgets/mlmarkdowneditor/partials'); 127 | } else { 128 | $this->assetPath = $this->originalAssetPath; 129 | $this->viewPath = $this->originalViewPath; 130 | } 131 | } 132 | } 133 | -------------------------------------------------------------------------------- /lang/bg/lang.php: -------------------------------------------------------------------------------- 1 | [ 5 | 'name' => 'Блог', 6 | 'description' => 'Стабилната блог платформа.', 7 | ], 8 | 'blog' => [ 9 | 'menu_label' => 'Блог', 10 | 'menu_description' => 'управление на публикациите', 11 | 'posts' => 'публикации', 12 | 'create_post' => 'създай публикация', 13 | 'categories' => 'категории', 14 | 'create_category' => 'създай категория', 15 | 'tab' => 'Блог', 16 | 'access_posts' => 'управление на публикациите', 17 | 'access_categories' => 'управление на категории', 18 | 'access_other_posts' => 'управление на други потребители публикации в блога', 19 | 'delete_confirm' => 'Сигурни ли сте?', 20 | 'chart_published' => 'Публикувано', 21 | 'chart_drafts' => 'Чернови', 22 | 'chart_total' => 'Общо', 23 | ], 24 | 'posts' => [ 25 | 'list_title' => 'Управление публикациите в блога', 26 | 'filter_category' => 'Категория', 27 | 'filter_published' => 'Скрий публикуваните', 28 | 'new_post' => 'Нова публикация', 29 | ], 30 | 'post' => [ 31 | 'title' => 'Заглавие', 32 | 'title_placeholder' => 'Ново заглавие на публикацията', 33 | 'slug' => 'Slug', 34 | 'slug_placeholder' => 'нов slug на публикацията', 35 | 'categories' => 'Категории', 36 | 'created' => 'Създаден', 37 | 'updated' => 'Обновен', 38 | 'published' => 'Публикуван', 39 | 'published_validation' => 'Моля, посочете дата на публикуване', 40 | 'tab_edit' => 'Промяна', 41 | 'tab_categories' => 'Категории', 42 | 'categories_comment' => 'Изберете категории към който пренадлежи публикацията ', 43 | 'categories_placeholder' => 'Няма категирии, Създайте първата?!', 44 | 'tab_manage' => 'Управление', 45 | 'published_on' => 'публикувано в', 46 | 'excerpt' => 'Откъс', 47 | 'featured_images' => 'Избрани снимки', 48 | 'delete_confirm' => 'Наистина ли искате да изтриете тази публикация?', 49 | 'close_confirm' => 'Публикацията не е запазена.', 50 | 'return_to_posts' => 'Върни ме към всички публикации', 51 | ], 52 | 'categories' => [ 53 | 'list_title' => 'Управление категориите в блога', 54 | 'new_category' => 'Нова категория', 55 | 'uncategorized' => 'Без категория', 56 | ], 57 | 'category' => [ 58 | 'name' => 'Име', 59 | 'name_placeholder' => 'Ново име на категорията', 60 | 'slug' => 'Slug', 61 | 'slug_placeholder' => 'нов slug на категотията', 62 | 'posts' => 'публикации', 63 | 'delete_confirm' => 'Наистина ли искате да изтриете тази категория?', 64 | 'return_to_categories' => 'Върни ме към всички категории', 65 | ], 66 | 'settings' => [ 67 | 'category_title' => 'Списък с категории', 68 | 'category_description' => 'Показва списък с категориите на блога.', 69 | 'category_slug' => 'категория slug', 70 | 'category_slug_description' => "Look up the blog category using the supplied slug value. This property is used by the default component partial for marking the currently active category.", 71 | 'category_display_empty' => 'Показване на празни категории', 72 | 'category_display_empty_description' => 'Показване на категории, които нямат никакви публикации.', 73 | 'category_page' => 'Страница на категория', 74 | 'category_page_description' => 'Име на страницата за категирия. Това се използва подразбиране от компонента.', 75 | 'post_title' => 'Публикация', 76 | 'post_description' => 'Показване на Публикациите в блога на страницата.', 77 | 'post_slug' => 'Post slug', 78 | 'post_slug_description' => "Търсене на публикации по зададен slug.", 79 | 'post_category' => 'Страница за Категория', 80 | 'post_category_description' => 'Име на страница за категория за генериране на линк.Това се използва подразбиране от компонента.', 81 | 'posts_title' => 'Лист с Публикации', 82 | 'posts_description' => 'Показване на лист с публикации на страницата.', 83 | 'posts_pagination' => 'Номер на страницата', 84 | 'posts_pagination_description' => 'Тази стойност се използва за определяне на коя страница е потребителя.', 85 | 'posts_filter' => 'Филтер Категория', 86 | 'posts_filter_description' => 'Въведи slug на категория или URL адрес за филтриране по. Оставете празно за да се покажат всички публикации.', 87 | 'posts_per_page' => 'Публикации на страница', 88 | 'posts_per_page_validation' => 'Невалиден формат за публикации на страница', 89 | 'posts_no_posts' => 'Няма публикации', 90 | 'posts_no_posts_description' => 'Съобщение което да се покаже, в случай ,че няма публикации за показване.Това се използва подразбиране от компонента.', 91 | 'posts_order' => 'подреждане на публикации', 92 | 'posts_order_description' => 'Атрибут по който да бъдат подредени публикациите', 93 | 'posts_category' => 'страница на категориите', 94 | 'posts_category_description' => 'Име на страницата за категории , за "публикувано в". Това се използва подразбиране от компонента.', 95 | 'posts_post' => 'Post page', 96 | 'posts_post_description' => 'Име на страницата за публикации "Прочетете повече". Това се използва подразбиране от компонента.', 97 | 'posts_except_post' => 'Except post', 98 | 'posts_except_post_description' => 'Enter ID/URL or variable with post ID/URL you want to except', 99 | ], 100 | ]; 101 | -------------------------------------------------------------------------------- /lang/cs/lang.php: -------------------------------------------------------------------------------- 1 | [ 5 | 'name' => 'Blog', 6 | 'description' => 'Robustní blogová platforma.', 7 | ], 8 | 'blog' => [ 9 | 'menu_label' => 'Blog', 10 | 'menu_description' => 'Správa blogových příspěvků', 11 | 'posts' => 'Příspěvky', 12 | 'create_post' => 'Příspěvek', 13 | 'categories' => 'Kategorie', 14 | 'create_category' => 'Kategorie příspěvků', 15 | 'tab' => 'Blog', 16 | 'access_posts' => 'Správa blogových příspěvků', 17 | 'access_categories' => 'Správa blogových kategorií', 18 | 'access_other_posts' => 'Správa příspěvků ostatních uživatelů', 19 | 'access_import_export' => 'Možnost importu a exportu příspěvků', 20 | 'access_publish' => 'Možnost publikovat příspěvky', 21 | 'delete_confirm' => 'Jste si jistí?', 22 | 'chart_published' => 'Publikované', 23 | 'chart_drafts' => 'Návrhy', 24 | 'chart_total' => 'Celkem', 25 | ], 26 | 'posts' => [ 27 | 'list_title' => 'Správa blogových příspěvků', 28 | 'filter_category' => 'Kategorie', 29 | 'filter_published' => 'Schovat publikované', 30 | 'filter_date' => 'Datum', 31 | 'new_post' => 'Nový příspěvek', 32 | 'export_post' => 'Export příspěvků', 33 | 'import_post' => 'Import příspěvků', 34 | ], 35 | 'post' => [ 36 | 'title' => 'Název', 37 | 'title_placeholder' => 'Zadejte název', 38 | 'content' => 'Obsah', 39 | 'content_html' => 'HTML obsah', 40 | 'slug' => 'URL příspěvku', 41 | 'slug_placeholder' => 'zadejte-url-prispevku', 42 | 'categories' => 'Kategorie', 43 | 'author_email' => 'E-mail autora', 44 | 'created' => 'Vytvořeno', 45 | 'created_date' => 'Vytvořeno dne', 46 | 'updated' => 'Upraveno', 47 | 'updated_date' => 'Upraveno dne', 48 | 'published' => 'Publikováno', 49 | 'published_date' => 'Publikováno dne', 50 | 'published_validation' => 'Zadejte prosím datum publikace příspěvku', 51 | 'tab_edit' => 'Upravit', 52 | 'tab_categories' => 'Kategorie', 53 | 'categories_comment' => 'Vyberte kategorie do kterých příspěvek patří', 54 | 'categories_placeholder' => 'Nejsou zde žádné kategorie, nejdříve musíte nějaké vytvořit!', 55 | 'tab_manage' => 'Nastavení', 56 | 'published_on' => 'Publikováno dne', 57 | 'excerpt' => 'Perex příspěvku', 58 | 'summary' => 'Shrnutí', 59 | 'featured_images' => 'Obrázky', 60 | 'delete_confirm' => 'Opravdu chcete smazat tento příspěvek?', 61 | 'delete_success' => 'Vybrané příspěvky úspěšně odstraněny.', 62 | 'close_confirm' => 'Příspěvek není uložený.', 63 | 'return_to_posts' => 'Zpět na seznam příspěvků', 64 | ], 65 | 'categories' => [ 66 | 'list_title' => 'Správa blogových kategorií', 67 | 'new_category' => 'Nová kategorie', 68 | 'uncategorized' => 'Nezařazeno', 69 | ], 70 | 'category' => [ 71 | 'name' => 'Název', 72 | 'name_placeholder' => 'Název nové kategorie', 73 | 'description' => 'Popis', 74 | 'slug' => 'URL kategorie', 75 | 'slug_placeholder' => 'zadejte-url-kategorie', 76 | 'posts' => 'Počet příspěvků', 77 | 'delete_confirm' => 'Opravdu chcete smazat tuto kategorii?', 78 | 'delete_success' => 'Vybrané kategorie úspěšně odstraněny.', 79 | 'return_to_categories' => 'Zpět na seznam blogových kategorií', 80 | 'reorder' => 'Změnit pořadí', 81 | ], 82 | 'menuitem' => [ 83 | 'blog_category' => 'Blogová kategorie', 84 | 'all_blog_categories' => 'Všechny blogové kategorie', 85 | 'blog_post' => 'Blogový příspěvek', 86 | 'all_blog_posts' => 'Všechny blogové příspěvky', 87 | 'category_blog_posts' => 'Blog category posts', 88 | ], 89 | 'settings' => [ 90 | 'category_title' => 'Seznam kategorií', 91 | 'category_description' => 'Zobrazí na stránce seznam blogových kategorií.', 92 | 'category_slug' => 'URL kategorie', 93 | 'category_slug_description' => "Najde blogovou kategorii s tímto URL. Používá se pro zobrazení aktivní kategorie.", 94 | 'category_display_empty' => 'Zobrazit prázdné kategorie', 95 | 'category_display_empty_description' => 'Zobrazit kategorie bez blogových příspěvků.', 96 | 'category_page' => 'Stránka kategorií', 97 | 'category_page_description' => 'Vyberte stránku která slouží k zobrazení všech kategorií (nebo detailu kategorie).', 98 | 'post_title' => 'Příspěvek', 99 | 'post_description' => 'Zobrazí blogový příspěvek na stránce.', 100 | 'post_slug' => 'URL příspěvku', 101 | 'post_slug_description' => "Najde příspěvek dle zadané URL.", 102 | 'post_category' => 'Stránka kategorie', 103 | 'post_category_description' => 'Vyberte stránku která slouží k zobrazení všech kategorií (nebo detailu kategorie).', 104 | 'posts_title' => 'Seznam příspěvků', 105 | 'posts_description' => 'Zobrazí na stránce seznam posledních příspěvků na stránkách.', 106 | 'posts_pagination' => 'Číslo stránky', 107 | 'posts_pagination_description' => 'Číslo stránky určující na které stránce se uživatel nachází. Použito pro stránkování.', 108 | 'posts_filter' => 'Filtr kategorií', 109 | 'posts_filter_description' => 'Zadejte URL kategorie, nebo URL parametr pro filtrování příspěvků. Nechte prázdné pro zobrazení všech příspěvků.', 110 | 'posts_per_page' => 'Příspěvků na stránku', 111 | 'posts_per_page_validation' => 'Špatný formát počtu příspěvků na stránku, musí být zadáno jako číslo', 112 | 'posts_no_posts' => 'Hláška prázdné stránky', 113 | 'posts_no_posts_description' => 'Zpráva se zobrazí pokud se nepovede najít žádné články.', 114 | 'posts_no_posts_default' => 'Nenalezeny žádné příspěvky', 115 | 'posts_order' => 'Řazení článků', 116 | 'posts_order_decription' => 'Nastaví řazení článků ve výpisu', 117 | 'posts_category' => 'Stránka kategorií', 118 | 'posts_category_description' => 'Vyberte stránku která slouží k zobrazení všech kategorií (nebo detailu kategorie).', 119 | 'posts_post' => 'Stránka příspěvků', 120 | 'posts_post_description' => 'Vyberte stránku která slouží k zobrazení článků (nebo detailu článku).', 121 | 'posts_except_post' => 'Vyloučit příspěvěk', 122 | 'posts_except_post_description' => 'Zadejte ID nebo URL příspěvku který chcete vyloučit', 123 | 'posts_except_categories' => 'Vyloučené kategorie', 124 | 'posts_except_categories_description' => 'Pro vyloučení kategorií zadejte čárkou oddělené URL příspěvků nebo proměnnou, která tento seznam obsahuje.', 125 | 'rssfeed_blog' => 'Blogová stránka', 126 | 'rssfeed_blog_description' => 'Name of the main blog page file for generating links. This property is used by the default component partial.', 127 | 'rssfeed_title' => 'RSS Kanál', 128 | 'rssfeed_description' => 'Vygeneruje RSS kanál který obsahuje blogové příspěvky.', 129 | 'group_links' => 'Odkazy', 130 | 'group_exceptions' => 'Výjimky', 131 | ], 132 | 'sorting' => [ 133 | 'title_asc' => 'Název (sestupně)', 134 | 'title_desc' => 'Název (vzestupně)', 135 | 'created_asc' => 'Vytvořeno (sestupně)', 136 | 'created_desc' => 'Vytvořeno (vzestupně)', 137 | 'updated_asc' => 'Upraveno (sestupně)', 138 | 'updated_desc' => 'Upraveno (vzestupně)', 139 | 'published_asc' => 'Publikováno (sestupně)', 140 | 'published_desc' => 'Publikováno (vzestupně)', 141 | 'random' => 'Náhodně', 142 | ], 143 | 'import' => [ 144 | 'update_existing_label' => 'Uprav existující příspěvky', 145 | 'update_existing_comment' => 'Zvolte pokud chcete upravit příspěvky se stejným ID, názvem nebo URL.', 146 | 'auto_create_categories_label' => 'VYtvořit kategorie ze souboru', 147 | 'auto_create_categories_comment' => 'Chcete-li tuto funkci použít, měli byste se shodovat se sloupcem Kategorie, jinak vyberte výchozí kategorie, které chcete použít z níže uvedených položek.', 148 | 'categories_label' => 'Kategorie', 149 | 'categories_comment' => 'Vyberte kategorie ke kterým budou příspěvky přiřazeny (volitelné).', 150 | 'default_author_label' => 'Výchozí autor příspěvků (volitelné)', 151 | 'default_author_comment' => 'Import se pokusí použít existujícího autora, pokud odpovídá sloupci email, jinak se použije výše uvedený autor.', 152 | 'default_author_placeholder' => '-- vyberte autora --', 153 | ], 154 | ]; 155 | -------------------------------------------------------------------------------- /lang/de/lang.php: -------------------------------------------------------------------------------- 1 | [ 5 | 'name' => 'Blog', 6 | 'description' => 'Eine robuste Blog Plattform.', 7 | ], 8 | 'blog' => [ 9 | 'menu_label' => 'Blog', 10 | 'menu_description' => 'Blog Artikel bearbeiten', 11 | 'posts' => 'Artikel', 12 | 'create_post' => 'Blog Artikel', 13 | 'categories' => 'Kategorien', 14 | 'create_category' => 'Blog Kategorie', 15 | 'tab' => 'Blog', 16 | 'access_posts' => 'Blog Artikel verwalten', 17 | 'access_categories' => 'Blog Kategorien verwalten', 18 | 'access_other_posts' => 'Blog Artikel anderer Benutzer verwalten', 19 | 'access_import_export' => 'Blog Artikel importieren oder exportieren', 20 | 'access_publish' => 'Kann Artikel veröffentlichen', 21 | 'delete_confirm' => 'Bist du sicher?', 22 | 'chart_published' => 'Veröffentlicht', 23 | 'chart_drafts' => 'Entwurf', 24 | 'chart_total' => 'Gesamt', 25 | ], 26 | 'posts' => [ 27 | 'list_title' => 'Blog Artikel verwalten', 28 | 'filter_category' => 'Kategorie', 29 | 'filter_published' => 'Veröffentlichte ausblenden', 30 | 'filter_date' => 'Date', 31 | 'new_post' => 'Neuer Artikel', 32 | 'export_post' => 'Exportiere Artikel', 33 | 'import_post' => 'Importiere Artikel', 34 | ], 35 | 'post' => [ 36 | 'title' => 'Titel', 37 | 'title_placeholder' => 'Neuer Titel', 38 | 'content' => 'Inhalt', 39 | 'content_html' => 'HTML-Inhalt', 40 | 'slug' => 'Slug', 41 | 'slug_placeholder' => 'neuer-artikel-slug', 42 | 'categories' => 'Kategorien', 43 | 'author_email' => 'Autor E-Mail', 44 | 'created' => 'Erstellt', 45 | 'created_date' => 'Erstellzeitpunkt', 46 | 'updated' => 'Aktualisiert', 47 | 'updated_date' => 'Aktualisierungszeitpunk', 48 | 'published' => 'Veröffentlicht', 49 | 'published_date' => 'Veröffentlichungszeitpunkt', 50 | 'published_validation' => 'Bitte gebe das Datum der Veröffentlichung an', 51 | 'tab_edit' => 'Bearbeiten', 52 | 'tab_categories' => 'Kategorien', 53 | 'categories_comment' => 'Wähle die zugehörigen Kategorien', 54 | 'categories_placeholder' => 'Es existieren keine Kategorien. Bitte lege zuerst Kategorien an!', 55 | 'tab_manage' => 'Verwalten', 56 | 'published_on' => 'Veröffentlicht am', 57 | 'excerpt' => 'Textauszug', 58 | 'summary' => 'Zusammenfassung', 59 | 'featured_images' => 'Zugehörige Bilder', 60 | 'delete_confirm' => 'Möchtest du diesen Artikel wirklich löschen?', 61 | 'close_confirm' => 'Der Artikel ist noch nicht gespeichert.', 62 | 'return_to_posts' => 'Zurück zur Artikel-Übersicht', 63 | 'posted_byline' => 'Veröffentlicht in :categories am :date', 64 | 'posted_byline_no_categories' => 'Veröffentlicht am :date', 65 | 'date_format' => 'd. F Y', 66 | ], 67 | 'categories' => [ 68 | 'list_title' => 'Blog Kategorien verwalten', 69 | 'new_category' => 'Neue Kategorie', 70 | 'uncategorized' => 'Allgemein', 71 | ], 72 | 'category' => [ 73 | 'name' => 'Name', 74 | 'name_placeholder' => 'Neuer Kategorie Name', 75 | 'description' => 'Beschreibung', 76 | 'slug' => 'Slug', 77 | 'slug_placeholder' => 'neuer-kategorie-slug', 78 | 'posts' => 'Artikel', 79 | 'delete_confirm' => 'Möchtest du die Kategorie wirklich löschen?', 80 | 'return_to_categories' => 'Zurück zur Kategorie-Übersicht.', 81 | 'reorder' => 'Kategorien sortieren', 82 | ], 83 | 'menuitem' => [ 84 | 'blog_category' => 'Blog Kategorie', 85 | 'all_blog_categories' => 'Alle Blog Kategorien', 86 | 'blog_post' => 'Blog Artikel', 87 | 'all_blog_posts' => 'Alle Blog Artikel', 88 | 'category_blog_posts' => 'Blog Kategorie Artikel', 89 | ], 90 | 'settings' => [ 91 | 'category_title' => 'Blog Kategorie-Übersicht', 92 | 'category_description' => 'Zeigt eine Blog Kategorien-Übersicht.', 93 | 'category_slug' => 'Slug Parametername', 94 | 'category_slug_description' => 'Der URL-Routen-Parameter welcher verwendet wird um die aktuelle Kategorie zu bestimmen. Wird von der Standard-Komponente benötigt um die aktive Kategorie zu markieren.', 95 | 'category_display_empty' => 'Leere Kategorien anzeigen', 96 | 'category_display_empty_description' => 'Kategorien zeigen welche keine Artikel besitzen.', 97 | 'category_page' => 'Kategorien Seite', 98 | 'category_page_description' => 'Name der Kategorien-Seiten-Datei für die Kategorien Links. Wird von der Standard-Komponente benötigt.', 99 | 'post_title' => 'Blog Artikel', 100 | 'post_description' => 'Zeigt einen Blog Artikel auf der Seite.', 101 | 'post_slug' => 'Slug Parametername', 102 | 'post_slug_description' => 'Der URL-Routen-Parameter um den Post mittels "Slug" zu bestimmen.', 103 | 'post_category' => 'Kategorien-Seite', 104 | 'post_category_description' => 'Name der Kategorien-Seiten-Datei für Kategorie-Links.', 105 | 'posts_title' => 'Blog Artikel-Übersicht', 106 | 'posts_description' => 'Stellt eine Liste der neuesten Artikel auf der Seite dar.', 107 | 'posts_pagination' => 'Blättern Parametername', 108 | 'posts_pagination_description' => 'Der erwartete Parametername welcher für Seiten verwendet wird.', 109 | 'posts_filter' => 'Kategorien-Filter', 110 | 'posts_filter_description' => 'Bitte gebe ein Kategorien-Slug oder URL-Parameter an, mittels den die Artikel gefiltert werden. Wenn der Wert leer ist, werden alle Artikel angezeigt.', 111 | 'posts_per_page' => 'Artikel pro Seite', 112 | 'posts_per_page_validation' => 'Ungültiger "Artikel pro Seiten" Wert', 113 | 'posts_no_posts' => 'Keine Artikel Nachricht', 114 | 'posts_no_posts_description' => 'Nachricht welche dargestellt wird wenn keine Artikel vorhanden sind. Dieser Wert wird von der Standard-Komponente verwendet.', 115 | 'posts_order' => 'Artikel Sortierung', 116 | 'posts_order_description' => 'Attribute nach welchem Artikel sortiert werden.', 117 | 'posts_category' => 'Kategorien-Seite', 118 | 'posts_category_description' => 'Name der Kategorien-Seiten-Datei für "Veröffentlicht in" Kategorien-Links. Dieser Wert von der Standard-Komponente verwendet.', 119 | 'posts_post' => 'Artikel Seite', 120 | 'posts_post_description' => 'Name der Artikel-Seiten-Datei für die "Erfahre mehr" Links. Dieser Wert für von der Standard-Komponente verwendet.', 121 | 'posts_except_post' => 'Artikel ausschließen', 122 | 'posts_except_post_description' => 'Gebe direkt die ID/URL oder eine Variable mit der Artikel-ID/URL an um diesen Artikel auszuschließen. Dieser Wert für von der Standard-Komponente verwendet.', 123 | 'posts_except_categories' => 'Kategorien ausschließen', 124 | 'posts_except_categories_description' => 'Gebe eine kommagetrennte Liste von Kategorie-Slugs oder eine Variable mit einer solchen Liste an um deren Artikel auszuschließen. Die Dieser Wert für von der Standard-Komponente verwendet.', 125 | 'rssfeed_blog' => 'Blog Seite', 126 | 'rssfeed_blog_description' => 'Name der Artikel-Seiten-Datei für die Links. Dieser Wert für von der Standard-Komponente verwendet.', 127 | 'rssfeed_title' => 'RSS-Feed', 128 | 'rssfeed_description' => 'Erstellt einen RSS-Feed mit Artikeln aus dem Blog.', 129 | 'group_links' => 'Links', 130 | 'group_exceptions' => 'Ausnahmen', 131 | ], 132 | ]; 133 | -------------------------------------------------------------------------------- /lang/fa/lang.php: -------------------------------------------------------------------------------- 1 | [ 5 | 'name' => 'وبلاگ', 6 | 'description' => 'پلتفرم قوی برای وبلاگ نویسی', 7 | ], 8 | 'blog' => [ 9 | 'menu_label' => 'وبلاگ', 10 | 'menu_description' => 'مدیریت پست های ارسالی', 11 | 'posts' => 'پست ها', 12 | 'create_post' => 'ایجاد پست جدید', 13 | 'categories' => 'دسته بندی ها', 14 | 'create_category' => 'ایجاد دسته بندی جدید', 15 | 'tab' => 'وبلاگ', 16 | 'access_posts' => 'مدیریت پست های ارسالی', 17 | 'access_categories' => 'مدیریت دسته بندی های وبلاگ', 18 | 'access_other_posts' => 'مدیریت پست های ارسالی سایر کاربران', 19 | 'access_import_export' => 'توانایی واردکردن و خارج کردن پستها', 20 | 'delete_confirm' => 'آیا اطمینان دارید؟', 21 | 'chart_published' => 'منتشر شده', 22 | 'chart_drafts' => 'پیش نویس', 23 | 'chart_total' => 'مجموع', 24 | ], 25 | 'posts' => [ 26 | 'list_title' => 'مدیریت پست های ارسالی', 27 | 'filter_category' => 'دسته بندی', 28 | 'filter_published' => 'مخفی کردن منتشر شده ها', 29 | 'new_post' => 'پست جدید', 30 | ], 31 | 'post' => [ 32 | 'title' => 'عنوان', 33 | 'title_placeholder' => 'عنوان پست جدید', 34 | 'content' => 'محتوی', 35 | 'content_html' => 'محتوی HTML', 36 | 'slug' => 'آدرس', 37 | 'slug_placeholder' => 'آدرس-پست-جدید', 38 | 'categories' => 'دسته بندی ها', 39 | 'author_email' => 'پست الکترونیکی نویسنده', 40 | 'created' => 'ایجاد شده در', 41 | 'created_date' => 'تاریخ ایجاد', 42 | 'updated' => 'به روزرسانی شده در', 43 | 'updated_date' => 'تاریخ به روزرسانی', 44 | 'published' => 'منتشر شده', 45 | 'published_date' => 'تاریخ انتشار', 46 | 'published_validation' => 'لطفا تاریخ انتشار را وارد نمایید', 47 | 'tab_edit' => 'ویرایش', 48 | 'tab_categories' => 'دسته بندی ها', 49 | 'categories_comment' => 'دسته بندی هایی را که پست به آنها تعلق دارد را انتخاب نمایید', 50 | 'categories_placeholder' => 'دسته بندی ای وجود ندارد. ابتدا یک دسته بندی ایجاد نمایید!', 51 | 'tab_manage' => 'مدیریت', 52 | 'published_on' => 'منتشر شده در', 53 | 'excerpt' => 'خلاصه', 54 | 'summary' => 'چکیده', 55 | 'featured_images' => 'تصاویر شاخص', 56 | 'delete_confirm' => 'آیا از حذف این پست اطمینان دارید؟', 57 | 'close_confirm' => 'پست ذخیره نشده است', 58 | 'return_to_posts' => 'بازگشت به لیست پست ها', 59 | ], 60 | 'categories' => [ 61 | 'list_title' => 'مدیریت دسته بندی های وبلاگ', 62 | 'new_category' => 'دسته بندی جدید', 63 | 'uncategorized' => 'بدون دسته بندی', 64 | ], 65 | 'category' => [ 66 | 'name' => 'نام', 67 | 'name_placeholder' => 'نام دسته بندی جدید', 68 | 'slug' => 'آدرس', 69 | 'slug_placeholder' => 'آدرس-جدید-دسته-بندی', 70 | 'posts' => 'پست ها', 71 | 'delete_confirm' => 'آیا از حذف این دسته بندی اطمینان دارید؟', 72 | 'return_to_categories' => 'بازگشت به لیست دسته بندی های وبلاگ', 73 | 'reorder' => 'مرتب سازی دسته بندی ها', 74 | ], 75 | 'settings' => [ 76 | 'category_title' => 'لیست دسته بندی', 77 | 'category_description' => 'نمایش لیست دسته بندی های وبلاگ در صفحه', 78 | 'category_slug' => 'آدرس دسته بندی', 79 | 'category_slug_description' => "دسته بندی وبلاگ توسط آدرس وارد شده جستجو می شود. این عمل توسط ابزار دسته بندی برای برجسته ساختن دسته بندی در حال نمایش استفاده می شود.", 80 | 'category_display_empty' => 'نمایش دسته بندی های خالی', 81 | 'category_display_empty_description' => 'نمایش دسته بندی هایی که هیچ ارسالی در آنها وجود ندارد.', 82 | 'category_page' => 'صفحه دسته بندی', 83 | 'category_page_description' => 'نام صفحه ای که لیست دسته بندی ها در آن نمایش داده می شوند. این گزینه به طور پیشفرض توسط ابزار مورد استفاده قرار میگیرد.', 84 | 'post_title' => 'پست', 85 | 'post_description' => 'نمایش پست در صفحه', 86 | 'post_slug' => 'آدرس پست', 87 | 'post_slug_description' => "پست توسط آدرس وارد شده جستجو میشود.", 88 | 'post_category' => 'صفحه دسته بندی', 89 | 'post_category_description' => 'نام صفحه ای که لیست دسته بندی ها در آن نمایش داده می شوند. این گزینه به طور پیشفرض توسط ابزار مورد استفاده قرار میگیرد.', 90 | 'posts_title' => 'لیست پست ها', 91 | 'posts_description' => 'نمایش لیستی از پستهایی که اخیرا ارسال شده اند در صفحه.', 92 | 'posts_pagination' => 'شماره صفحه', 93 | 'posts_pagination_description' => 'این مقدار جهت تشخیص صفحه ای که کاربر در آن قرار دارد مورد استفاده قرار میگیرد.', 94 | 'posts_filter' => 'فیلتر دسته بندی', 95 | 'posts_filter_description' => 'آدرس دسته بندی ای را که میخواهید پست های آن نمایش داده شوند را وارد نمایید. اگر میخواهید همه پست ها نمایش داده شوند این مقدار را خالی رها کنید.', 96 | 'posts_per_page' => 'تعداد پست ها در هر صفحه', 97 | 'posts_per_page_validation' => 'مقدار ورودی تعداد پست ها در هر صفحه نامعتبر است.', 98 | 'posts_no_posts' => 'پیغام پستی وجود ندارد', 99 | 'posts_no_posts_description' => 'این پیغام در صورتی که پستی جهت نمایش وجود نداشته باشد، نمایش داده می شود.', 100 | 'posts_order' => 'ترتیب پست ها', 101 | 'posts_order_decription' => 'مشخصه ترتیب نمایش پست ها در صفحه', 102 | 'posts_category' => 'صفحه دسته بندی', 103 | 'posts_category_description' => 'نام صفحه دسته بندی برای نمایش پستهای مربوط به آن.', 104 | 'posts_post' => 'صفحه پست', 105 | 'posts_post_description' => 'نام صفحه مربوط به نمایش کامل پست ها جهت لینک ادامه مطلب', 106 | 'posts_except_post' => 'Except post', 107 | 'posts_except_post_description' => 'Enter ID/URL or variable with post ID/URL you want to except', 108 | ], 109 | ]; 110 | -------------------------------------------------------------------------------- /lang/fi/lang.php: -------------------------------------------------------------------------------- 1 | [ 5 | 'name' => 'Blogi', 6 | 'description' => 'Vankka bloggausalusta.', 7 | ], 8 | 'blog' => [ 9 | 'menu_label' => 'Blogi', 10 | 'menu_description' => 'Hallitse blogipostauksia', 11 | 'posts' => 'Postaukset', 12 | 'create_post' => 'Blogipostaus', 13 | 'categories' => 'Categories', 14 | 'create_category' => 'Blogikategoria', 15 | 'tab' => 'Blogi', 16 | 'access_posts' => 'Hallitse postauksia', 17 | 'access_categories' => 'Hallitse kategorioita', 18 | 'access_other_posts' => 'Hallitse muiden käyttäjien postauksia', 19 | 'access_import_export' => 'Saa tuoda ja viedä postauksia', 20 | 'access_publish' => 'Saa julkaista postauksia', 21 | 'manage_settings' => 'Manage blog settings', 22 | 'delete_confirm' => 'Olteko varma?', 23 | 'chart_published' => 'Julkaistu', 24 | 'chart_drafts' => 'Luonnokset', 25 | 'chart_total' => 'Yhteensä', 26 | 'settings_description' => 'Hallinnoi blogin asetuksia', 27 | 'show_all_posts_label' => 'Näytä kaikki postaukset ylläpitäjille', 28 | 'show_all_posts_comment' => 'Näytä molemmat sekä julkaistut että julkaisemattomat postaukset ylläpitäjille', 29 | 'tab_general' => 'Yleiset', 30 | ], 31 | 'posts' => [ 32 | 'list_title' => 'Hallitse blogipostauksia', 33 | 'filter_category' => 'Kategoria', 34 | 'filter_published' => 'Julkaistu', 35 | 'filter_date' => 'Päivämäärä', 36 | 'new_post' => 'Uusi postaus', 37 | 'export_post' => 'Vie postaukset', 38 | 'import_post' => 'Tuo postauksia', 39 | ], 40 | 'post' => [ 41 | 'title' => 'Otsikko', 42 | 'title_placeholder' => 'Uuden postauksen otsikko', 43 | 'content' => 'Sisältö', 44 | 'content_html' => 'HTML Sisältö', 45 | 'slug' => 'Slugi', 46 | 'slug_placeholder' => 'uuden-postaukse-slugi', 47 | 'categories' => 'Kategoriat', 48 | 'author_email' => 'Tekijän sähköposti', 49 | 'created' => 'Luotu', 50 | 'created_date' => 'Luomispäivämäärä', 51 | 'updated' => 'Muokattu', 52 | 'updated_date' => 'Muokkauspäivämäärä', 53 | 'published' => 'Julkaistu', 54 | 'published_by' => 'Published by', 55 | 'current_user' => 'Current user', 56 | 'published_date' => 'Julkaisupäivämäärä', 57 | 'published_validation' => 'Määrittele julkaisupäivämäärä', 58 | 'tab_edit' => 'Muokkaa', 59 | 'tab_categories' => 'Kategoriat', 60 | 'categories_comment' => 'Valitse kategoriat joihin postaus kuuluu', 61 | 'categories_placeholder' => 'Kategorioita ei ole, sinun pitäisi luoda ensimmäinen ensin!', 62 | 'tab_manage' => 'Hallitse', 63 | 'published_on' => 'Julkaistu', 64 | 'excerpt' => 'Poiminto', 65 | 'summary' => 'Yhteenveto', 66 | 'featured_images' => 'Esittelykuvat', 67 | 'delete_confirm' => 'Poista tämä postaus?', 68 | 'delete_success' => 'Postaukset poistettu onnistuneesti.', 69 | 'close_confirm' => 'Tämä postaus ei ole tallennettu.', 70 | 'return_to_posts' => 'Palaa postauslistaan', 71 | ], 72 | 'categories' => [ 73 | 'list_title' => 'Hallitse blogikategorioita', 74 | 'new_category' => 'Uusi kategoria', 75 | 'uncategorized' => 'Luokittelematon', 76 | ], 77 | 'category' => [ 78 | 'name' => 'Nimi', 79 | 'name_placeholder' => 'Uuden kategorian nimi', 80 | 'description' => 'Kuvaus', 81 | 'slug' => 'Slugi', 82 | 'slug_placeholder' => 'uuden-kategorian-slugi', 83 | 'posts' => 'Julkaisuja', 84 | 'delete_confirm' => 'Poista tämä kategoria?', 85 | 'delete_success' => 'Kategoriat poistettu onnistuneesti.', 86 | 'return_to_categories' => 'Palaa blogikategorialistaan', 87 | 'reorder' => 'Järjestä kategoriat uudelleen', 88 | ], 89 | 'menuitem' => [ 90 | 'blog_category' => 'Blogikategoria', 91 | 'all_blog_categories' => 'Kaikki blogikategoriat', 92 | 'blog_post' => 'Blogipostaukset', 93 | 'all_blog_posts' => 'Kaikki blogipostaukset', 94 | 'category_blog_posts' => 'Blogin kategorian postaukset', 95 | ], 96 | 'settings' => [ 97 | 'category_title' => 'Kategorialista', 98 | 'category_description' => 'Näyttää listan blogikategorioista sivulla.', 99 | 'category_slug' => 'Kategorian slugi', 100 | 'category_slug_description' => 'Etsii blogikategorian käyttämällä annettua slugi-arvoa. Komponentti käyttää tätä merkitsemään aktiivisen kategorian.', 101 | 'category_display_empty' => 'Näytä tyhjät kategoriat', 102 | 'category_display_empty_description' => 'Näytä kategoriat joilla ei ole yhtään postauksia.', 103 | 'category_page' => 'Kategoriasivu', 104 | 'category_page_description' => 'Kategorialistaussivun tiedostonimi. Oletuskomponenttiosa käyttää tätä ominaisuutta.', 105 | 'post_title' => 'Postaus', 106 | 'post_description' => 'Näyttää blogipostauksen sivulla.', 107 | 'post_slug' => 'Postauksen slugi', 108 | 'post_slug_description' => 'Etsii blogipostauksen käyttämällä annettua slugi-arvoa.', 109 | 'post_category' => 'Kategoriasivu', 110 | 'post_category_description' => 'Kategorialistaussivun tiedostonimi. Oletuskomponenttiosa käyttää tätä ominaisuutta.', 111 | 'posts_title' => 'Lista postauksista', 112 | 'posts_description' => 'Näyttää listan uusimmista blogipostauksista sivulla.', 113 | 'posts_pagination' => 'Sivunumero', 114 | 'posts_pagination_description' => 'Tätä arvoa käytetään määrittämään millä sivulla käyttäjä on.', 115 | 'posts_filter' => 'Kategoriasuodatin', 116 | 'posts_filter_description' => 'Lisää kategorian slugi tai URL parametri, jolla suodattaa postauksia. Jätä tyhjäksi näyttääksesi kaikki postaukset.', 117 | 'posts_per_page' => 'Postauksia per sivu', 118 | 'posts_per_page_validation' => 'Postauksia per sivu -kohta sisältää kelvottoman arvon', 119 | 'posts_no_posts' => 'Ei julkaisuja -viesti', 120 | 'posts_no_posts_description' => 'Viesti, joka näytetään silloin kun postauksia ei ole. Oletuskomponenttiosa käyttää tätä ominaisuutta.', 121 | 'posts_no_posts_default' => 'Ei postauksia', 122 | 'posts_order' => 'Postauksien järjestys', 123 | 'posts_order_description' => 'Attribuutti, jonka mukaan postaukset tulisi järjestää', 124 | 'posts_category' => 'Kategoriasivu', 125 | 'posts_category_description' => 'Kategoriasivun tiedosto "Julkaistu kohteeseen" kategorialinkkejä varten. Oletuskomponenttiosa käyttää tätä ominaisuutta.', 126 | 'posts_post' => 'Postaussivu', 127 | 'posts_post_description' => 'Blogisivun tiedostonimi "Lue lisää" linkkejä varten. Oletuskomponenttiosa käyttää tätä ominaisuutta.', 128 | 'posts_except_post' => 'Poissulje postauksia', 129 | 'posts_except_post_description' => 'Lisää postauksen ID/URL tai muuttuja, jonka haluat poissulkea', 130 | 'posts_except_post_validation' => 'Postaukset poikkeukset täytyy olla yksittäinen slugi tai ID, pilkulla erotettu slugi-lista ja ID:t', 131 | 'posts_except_categories' => 'Poikkeavat kategoriat', 132 | 'posts_except_categories_description' => 'Lisää pilkulla erotettu listaus kategoria slugeista tai listaus kategorioista jotka haluat jättää ulkopuolelle', 133 | 'posts_except_categories_validation' => 'Poikkeavat kategoriat ovat oltava yksittäinen kategoria slugi tai pilkulla erotettu listaus slugeista', 134 | 'rssfeed_blog' => 'Blogisivu', 135 | 'rssfeed_blog_description' => 'Blogisivun tiedostonimi linkkien generointia varten. Oletuskomponenttiosa käyttää tätä ominaisuutta.', 136 | 'rssfeed_title' => 'RSS syöte', 137 | 'rssfeed_description' => 'Generoi RSS syötteen sisältäen postaukset blogista.', 138 | 'group_links' => 'Linkit', 139 | 'group_exceptions' => 'Poikkeukset', 140 | ], 141 | 'sorting' => [ 142 | 'title_asc' => 'Otsikko (ascending)', 143 | 'title_desc' => 'Otsikko (descending)', 144 | 'created_asc' => 'Luotu (ascending)', 145 | 'created_desc' => 'Luotu (descending)', 146 | 'updated_asc' => 'Päivitetty (ascending)', 147 | 'updated_desc' => 'Päivitetty (descending)', 148 | 'published_asc' => 'Julkaistu (ascending)', 149 | 'published_desc' => 'Julkaistu (descending)', 150 | 'random' => 'Satunnainen', 151 | ], 152 | 'import' => [ 153 | 'update_existing_label' => 'Päivitä olemassa olevat postaukset', 154 | 'update_existing_comment' => 'Valitse tämä laatikko päivittääksesi postaukset, joissa on täsmälleen sama ID, otsikko tai slugi.', 155 | 'auto_create_categories_label' => 'Luo tuotavassa tiedostossa määritellyt kategoriat.', 156 | 'auto_create_categories_comment' => 'Sinun tulisi yhdistää Kategoriat-sarake käyttääksesi tätä toiminnallisuutta. Muussa tapauksessa valitse oletuskategoria alapuolelta.', 157 | 'categories_label' => 'Kategoriat', 158 | 'categories_comment' => 'Valitse kategoriat, joihin tuotavat postaukset liitetään (option).', 159 | 'default_author_label' => 'Oletuskirjoittaja (optio)', 160 | 'default_author_comment' => 'Tuonti yrittää käyttää Kirjoittaja tiedon sähköpostia yhdistäessään kirjoittajaa. Muussa tapauksessa käytetään ylempänä määriteltyä.', 161 | 'default_author_placeholder' => '-- valitse kirjoittaja --', 162 | ], 163 | ]; 164 | -------------------------------------------------------------------------------- /lang/it/lang.php: -------------------------------------------------------------------------------- 1 | [ 5 | 'name' => 'Blog', 6 | 'description' => 'Una solida piattaforma di blogging.', 7 | ], 8 | 'blog' => [ 9 | 'menu_label' => 'Blog', 10 | 'menu_description' => 'Gestisci i post', 11 | 'posts' => 'Post', 12 | 'create_post' => 'post del blog', 13 | 'categories' => 'Categorie', 14 | 'create_category' => 'categorie del blog', 15 | 'tab' => 'Blog', 16 | 'access_posts' => 'Gestisci i post', 17 | 'access_categories' => 'Gestisci le categorie', 18 | 'access_other_posts' => 'Gestisci i post di altri utenti', 19 | 'access_import_export' => 'Permesso ad importare ed esportare i post', 20 | 'delete_confirm' => 'Sei sicuro?', 21 | 'chart_published' => 'Pubblicato', 22 | 'chart_drafts' => 'Bozze', 23 | 'chart_total' => 'Totale', 24 | ], 25 | 'posts' => [ 26 | 'list_title' => 'Gestisci i post', 27 | 'category' => 'Categoria', 28 | 'hide_published' => 'Nascondi pubblicati', 29 | 'new_post' => 'Nuovo post', 30 | ], 31 | 'post' => [ 32 | 'title' => 'Titolo', 33 | 'title_placeholder' => 'Titolo del nuovo post', 34 | 'content' => 'Contenuto', 35 | 'content_html' => 'Contenuto HTML', 36 | 'slug' => 'Slug', 37 | 'slug_placeholder' => 'slug-del-nuovo-post', 38 | 'categories' => 'Categorie', 39 | 'author_email' => 'Email dell\'autore', 40 | 'created' => 'Creato', 41 | 'created_date' => 'Data di creazione', 42 | 'updated' => 'Aggiornato', 43 | 'updated_date' => 'Data di aggiornamento', 44 | 'published' => 'Pubblicato', 45 | 'published_date' => 'Data di pubblicazione', 46 | 'published_validation' => 'Per favore fornisci la data di pubblicazione', 47 | 'tab_edit' => 'Modifica', 48 | 'tab_categories' => 'Categorie', 49 | 'categories_comment' => 'Seleziona le categorie a cui appartiene il post', 50 | 'categories_placeholder' => 'Non ci sono categorie, per iniziare dovresti crearne una!', 51 | 'tab_manage' => 'Gestisci', 52 | 'published_on' => 'Pubblicato il', 53 | 'excerpt' => 'Estratto', 54 | 'summary' => 'Riassunto', 55 | 'featured_images' => 'Immagini in evidenza', 56 | 'delete_confirm' => 'Vuoi veramente cancellare questo post?', 57 | 'close_confirm' => 'Questo post non è salvato.', 58 | 'return_to_posts' => 'Ritorna all\'elenco dei post', 59 | ], 60 | 'categories' => [ 61 | 'list_title' => 'Gestisci le categorie del blog', 62 | 'new_category' => 'Nuova categoria', 63 | 'uncategorized' => 'Non categorizzato', 64 | ], 65 | 'category' => [ 66 | 'name' => 'Nome', 67 | 'name_placeholder' => 'Nome della nuova categoria', 68 | 'slug' => 'Slug', 69 | 'slug_placeholder' => 'slug-nuova-categoria', 70 | 'posts' => 'Post', 71 | 'delete_confirm' => 'Vuoi veramente cancellare questa categoria?', 72 | 'return_to_categories' => 'Ritorna all\'elenco delle categorie del blog', 73 | 'reorder' => 'Riordino Categorie', 74 | ], 75 | 'settings' => [ 76 | 'category_title' => 'Elenco Categorie', 77 | 'category_description' => 'Mostra un\'elenco delle categorie del blog sulla pagina.', 78 | 'category_slug' => 'Slug categoria', 79 | 'category_slug_description' => "Cerca la categoria del blog usando lo slug fornito. Questa proprietà è usata dal componente parziale di default per segnare la categoria attualmente usata.", 80 | 'category_display_empty' => 'Mostra categorie vuote', 81 | 'category_display_empty_description' => 'Mostra categorie che non hanno alcun post.', 82 | 'category_page' => 'Pagina delle categorie', 83 | 'category_page_description' => 'Nome del file della pagina delle categorie contenente i link delle categorie. Questa proprietà è usata dal componente parziale di default.', 84 | 'post_title' => 'Post', 85 | 'post_description' => 'Mostra un post sulla pagina.', 86 | 'post_slug' => 'Slug del post', 87 | 'post_slug_description' => "Cerca il post con lo slug fornito.", 88 | 'post_category' => 'Pagina delle categorie', 89 | 'post_category_description' => 'Nome del file della pagina delle categorie contenente i link delle categorie. Questa proprietà è usata dal componente parziale di default.', 90 | 'posts_title' => 'Elenco dei post', 91 | 'posts_description' => 'Mostra un\'elenco degli ultimi post sulla pagina.', 92 | 'posts_pagination' => 'Numero di pagina', 93 | 'posts_pagination_description' => 'Questo valore è usato per determinare su quale pagina è l\'utente.', 94 | 'posts_filter' => 'Filtro delle categorie', 95 | 'posts_filter_description' => 'Inserisci lo slug di una categoria o un parametro dell\'URL con il quale filtrare i post. Lascia vuoto per mostrare tutti i post.', 96 | 'posts_per_page' => 'Post per pagina', 97 | 'posts_per_page_validation' => 'Il valore di post per pagina ha un formato non valido ', 98 | 'posts_no_posts' => 'Messaggio per l\'assenza di post', 99 | 'posts_no_posts_description' => 'Messaggio da mostrare nell\'elenco dei post in caso non ce ne siano. Questa proprietà è usata dal componente parziale di default.', 100 | 'posts_order' => 'Ordine dei post', 101 | 'posts_order_description' => 'Attributo sul quale i post dovrebbero esser ordinati', 102 | 'posts_category' => 'Pagina delle categorie', 103 | 'posts_category_description' => 'Nome del file per la pagina delle categorie per i link "Postato in" alle categorie. Questa proprietà è usata dal componente parziale di default.', 104 | 'posts_post' => 'Pagina del post', 105 | 'posts_post_description' => 'Nome del file per la pagina del post per i link "Scopri di più". Questa proprietà è usata dal componente parziale di default.', 106 | ], 107 | ]; 108 | -------------------------------------------------------------------------------- /lang/ja/lang.php: -------------------------------------------------------------------------------- 1 | [ 5 | 'name' => 'ブログ', 6 | 'description' => 'ロバストなブログプラットフォームです。', 7 | ], 8 | 'blog' => [ 9 | 'menu_label' => 'ブログ', 10 | 'menu_description' => 'ブログの投稿管理', 11 | 'posts' => '投稿', 12 | 'create_post' => '投稿の追加', 13 | 'categories' => 'カテゴリ', 14 | 'create_category' => 'カテゴリの追加', 15 | 'tab' => 'ブログ', 16 | 'access_posts' => '投稿の管理', 17 | 'access_categories' => 'カテゴリの管理', 18 | 'access_other_posts' => '他ユーザーの投稿の管理', 19 | 'delete_confirm' => '削除していいですか?', 20 | 'chart_published' => '公開済み', 21 | 'chart_drafts' => '下書き', 22 | 'chart_total' => '合計', 23 | ], 24 | 'posts' => [ 25 | 'list_title' => '投稿の管理', 26 | 'filter_category' => 'カテゴリ', 27 | 'filter_published' => '下書きのみ', 28 | 'new_post' => '投稿を追加', 29 | ], 30 | 'post' => [ 31 | 'title' => 'タイトル', 32 | 'title_placeholder' => 'タイトルを入力してください', 33 | 'slug' => 'スラッグ', 34 | 'slug_placeholder' => 'new-post-slug−123', 35 | 'categories' => 'カテゴリ', 36 | 'created' => '作成日', 37 | 'updated' => '更新日', 38 | 'published' => '公開する', 39 | 'published_validation' => '投稿の公開日を指定してください。', 40 | 'tab_edit' => '編集', 41 | 'tab_categories' => 'カテゴリ', 42 | 'categories_comment' => '投稿を関連付けるカテゴリを選択してください。(複数選択可)', 43 | 'categories_placeholder' => 'まだカテゴリがありません。先に作成してください。', 44 | 'tab_manage' => '管理', 45 | 'published_on' => '公開日', 46 | 'excerpt' => '投稿の抜粋', 47 | 'featured_images' => 'アイキャッチ画像', 48 | 'delete_confirm' => '削除していいですか?', 49 | 'close_confirm' => '投稿は保存されていません。', 50 | 'return_to_posts' => '投稿一覧に戻る', 51 | ], 52 | 'categories' => [ 53 | 'list_title' => 'カテゴリ管理', 54 | 'new_category' => 'カテゴリの追加', 55 | 'uncategorized' => '未分類', 56 | ], 57 | 'category' => [ 58 | 'name' => '名前', 59 | 'name_placeholder' => 'カテゴリ名をつけてください', 60 | 'slug' => 'スラッグ', 61 | 'slug_placeholder' => 'new-category-slug-123', 62 | 'posts' => '投稿数', 63 | 'delete_confirm' => '削除していいですか?', 64 | 'return_to_categories' => 'カテゴリ一覧に戻る', 65 | ], 66 | 'settings' => [ 67 | 'category_title' => 'カテゴリリスト', 68 | 'category_description' => 'ページ内にカテゴリリストを表示します。', 69 | 'category_slug' => 'カテゴリスラッグ', 70 | 'category_slug_description' => "表示するカテゴリのスラッグを指定します。この項目はコンポーネントのデフォルトパーシャルで使用されます。", 71 | 'category_display_empty' => '空のカテゴリの表示', 72 | 'category_display_empty_description' => 'この項目がチェックされている場合、投稿が0件のカテゴリもリストに表示します。', 73 | 'category_page' => 'カテゴリページ', 74 | 'category_page_description' => 'カテゴリページへのリンクを生成するために、カテゴリページのファイル名を指定します。この項目はコンポーネントのデフォルトパーシャルで使用されます。', 75 | 'post_title' => '投稿', 76 | 'post_description' => 'ページ内に投稿を表示します。', 77 | 'post_slug' => '投稿スラッグ', 78 | 'post_slug_description' => "表示する投稿のスラッグを指定します。特定の投稿のスラッグか、URLパラメータ(:slug)を指定できます。", 79 | 'post_category' => 'カテゴリページ', 80 | 'post_category_description' => 'カテゴリリンクを生成するために、カテゴリページのファイル名を指定します。拡張子(.htm)は省いてください。この項目はコンポーネントのデフォルトパーシャルで使用されます。', 81 | 'posts_title' => '投稿リスト', 82 | 'posts_description' => 'ページ内に新しい投稿のリストを表示します。', 83 | 'posts_pagination' => 'ページ番号', 84 | 'posts_pagination_description' => 'ページ番号を指定します。URLパラメータ(:page)を指定できます。', 85 | 'posts_filter' => 'カテゴリフィルタ', 86 | 'posts_filter_description' => '投稿リストのフィルタを指定します。カテゴリのスラッグかURLパラメータ(:slug)を指定できます。空の場合、すべての投稿が表示されます。', 87 | 'posts_per_page' => '1ページに表示する投稿数を指定します。', 88 | 'posts_per_page_validation' => '1ページに表示する投稿数の形式が正しくありません。', 89 | 'posts_no_posts' => '0件時メッセージ', 90 | 'posts_no_posts_description' => 'この投稿リストが0件の場合に表示するメッセージを指定します。この項目はコンポーネントのデフォルトパーシャルで使用されます。', 91 | 'posts_order' => '並び順', 92 | 'posts_order_description' => '投稿リスト内の並び順を指定します。', 93 | 'posts_category' => 'カテゴリページ', 94 | 'posts_category_description' => 'カテゴリリンクを生成するために、カテゴリページのファイル名を指定します。この項目はコンポーネントのデフォルトパーシャルで使用されます。', 95 | 'posts_post' => '投稿ページ', 96 | 'posts_post_description' => '"Learn more"リンクを生成するため、投稿ページのファイル名を指定します。拡張子(.htm)は省いてください。この項目はコンポーネントのデフォルトパーシャルで使用されます。', 97 | 'posts_except_post' => 'Except post', 98 | 'posts_except_post_description' => 'Enter ID/URL or variable with post ID/URL you want to except', 99 | ], 100 | ]; 101 | -------------------------------------------------------------------------------- /lang/nb-no/lang.php: -------------------------------------------------------------------------------- 1 | [ 5 | 'name' => 'Blogg', 6 | 'description' => 'En robust bloggeplattform.', 7 | ], 8 | 'blog' => [ 9 | 'menu_label' => 'Blogg', 10 | 'menu_description' => 'Administrer blogginnlegg', 11 | 'posts' => 'Innlegg', 12 | 'create_post' => 'innlegg', 13 | 'categories' => 'Kategorier', 14 | 'create_category' => 'kategori', 15 | 'access_posts' => 'Administrer blogginnleggene', 16 | 'access_categories' => 'Administrer bloggkategorier', 17 | 'access_other_posts' => 'Administrere andre brukere sine blogginnlegg', 18 | 'delete_confirm' => 'Er du sikker?', 19 | 'chart_published' => 'Publisert', 20 | 'chart_drafts' => 'Utkast', 21 | 'chart_total' => 'Totalt', 22 | ], 23 | 'posts' => [ 24 | 'list_title' => 'Administrer blogginnlegg', 25 | 'filter_category' => 'Kategori', 26 | 'filter_published' => 'Skjul publiserte', 27 | 'new_post' => 'Nytt innlegg', 28 | ], 29 | 'post' => [ 30 | 'title' => 'Tittel', 31 | 'title_placeholder' => 'Innleggets tittel', 32 | 'slug' => 'Slug', 33 | 'slug_placeholder' => 'innleggets-tittel', 34 | 'categories' => 'Kategorier', 35 | 'created' => 'Opprettet', 36 | 'updated' => 'Oppdatert', 37 | 'published' => 'Publisert', 38 | 'published_validation' => 'Velg en dato når innlegget skal publiseres', 39 | 'tab_edit' => 'Endre', 40 | 'tab_categories' => 'Kategorier', 41 | 'categories_comment' => 'Velg hvilke kategorier innlegget tilhører', 42 | 'categories_placeholder' => 'Det finnes ingen kategorier! Vennligst opprett en først.', 43 | 'tab_manage' => 'Egenskaper', 44 | 'published_on' => 'Publiseringsdato', 45 | 'excerpt' => 'Utdrag', 46 | 'featured_images' => 'Utvalgte bilder', 47 | 'delete_confirm' => 'Vil du virkelig slette dette innlegget?', 48 | 'close_confirm' => 'Innlegget er ikke lagret.', 49 | 'return_to_posts' => 'Tilbake til innleggsliste', 50 | ], 51 | 'categories' => [ 52 | 'list_title' => 'Administrer bloggkategorier', 53 | 'new_category' => 'Ny kategori', 54 | 'uncategorized' => 'Uten kategori', 55 | ], 56 | 'category' => [ 57 | 'name' => 'Navn', 58 | 'name_placeholder' => 'Kategoriens navn', 59 | 'slug' => 'Slug', 60 | 'slug_placeholder' => 'kategoriens-navn', 61 | 'posts' => 'Innlegg', 62 | 'delete_confirm' => 'Vil du virkelig slette denne kategorien?', 63 | 'return_to_categories' => 'Tilbake til kategorilisten', 64 | ], 65 | 'settings' => [ 66 | 'category_title' => 'Category List', 67 | 'category_description' => 'Displays a list of blog categories on the page.', 68 | 'category_slug' => 'Category slug', 69 | 'category_slug_description' => "Look up the blog category using the supplied slug value. This property is used by the default component partial for marking the currently active category.", 70 | 'category_display_empty' => 'Display empty categories', 71 | 'category_display_empty_description' => 'Show categories that do not have any posts.', 72 | 'category_page' => 'Category page', 73 | 'category_page_description' => 'Name of the category page file for the category links. This property is used by the default component partial.', 74 | 'post_title' => 'Post', 75 | 'post_description' => 'Displays a blog post on the page.', 76 | 'post_slug' => 'Post slug', 77 | 'post_slug_description' => "Look up the blog post using the supplied slug value.", 78 | 'post_category' => 'Category page', 79 | 'post_category_description' => 'Name of the category page file for the category links. This property is used by the default component partial.', 80 | 'posts_title' => 'Post List', 81 | 'posts_description' => 'Displays a list of latest blog posts on the page.', 82 | 'posts_pagination' => 'Page number', 83 | 'posts_pagination_description' => 'This value is used to determine what page the user is on.', 84 | 'posts_filter' => 'Category filter', 85 | 'posts_filter_description' => 'Enter a category slug or URL parameter to filter the posts by. Leave empty to show all posts.', 86 | 'posts_per_page' => 'Posts per page', 87 | 'posts_per_page_validation' => 'Invalid format of the posts per page value', 88 | 'posts_no_posts' => 'No posts message', 89 | 'posts_no_posts_description' => 'Message to display in the blog post list in case if there are no posts. This property is used by the default component partial.', 90 | 'posts_order' => 'Post order', 91 | 'posts_order_description' => 'Attribute on which the posts should be ordered', 92 | 'posts_category' => 'Category page', 93 | 'posts_category_description' => 'Name of the category page file for the "Posted into" category links. This property is used by the default component partial.', 94 | 'posts_post' => 'Post page', 95 | 'posts_post_description' => 'Name of the blog post page file for the "Learn more" links. This property is used by the default component partial.', 96 | 'posts_except_post' => 'Except post', 97 | 'posts_except_post_description' => 'Enter ID/URL or variable with post ID/URL you want to except', 98 | ], 99 | ]; 100 | -------------------------------------------------------------------------------- /lang/nl/lang.php: -------------------------------------------------------------------------------- 1 | [ 5 | 'name' => 'Blog', 6 | 'description' => 'A robust blogging platform.', 7 | ], 8 | 'blog' => [ 9 | 'menu_label' => 'Blog', 10 | 'menu_description' => 'Beheer blog artikelen', 11 | 'posts' => 'Artikelen', 12 | 'create_post' => 'Artikel', 13 | 'categories' => 'Categorieën', 14 | 'create_category' => 'blog categorie', 15 | 'tab' => 'Blog', 16 | 'access_posts' => 'Blog artikelen beheren', 17 | 'access_categories' => 'Blog categorieën beheren', 18 | 'access_other_posts' => 'Beheren van blog artikelen van gebruikers', 19 | 'access_import_export' => 'Toegang tot importeren en exporteren van artikelen', 20 | 'delete_confirm' => 'Weet je het zeker?', 21 | 'chart_published' => 'Gepubliceerd', 22 | 'chart_drafts' => 'Concepten', 23 | 'chart_total' => 'Totaal', 24 | ], 25 | 'posts' => [ 26 | 'list_title' => 'Beheren van blog artikelen', 27 | 'filter_category' => 'Categorie', 28 | 'filter_published' => 'Verberg gepubliceerd', 29 | 'new_post' => 'Nieuw artikel', 30 | ], 31 | 'post' => [ 32 | 'title' => 'Titel', 33 | 'title_placeholder' => 'Titel van artikel', 34 | 'content' => 'Inhoud', 35 | 'content_html' => 'HTML Inhoud', 36 | 'slug' => 'Slug', 37 | 'slug_placeholder' => 'nieuw-artikel-slug', 38 | 'categories' => 'Categorieën', 39 | 'author_email' => 'E-mail auteur', 40 | 'created' => 'Aangemaakt', 41 | 'created_date' => 'Aangemaakt op', 42 | 'updated' => 'Bijgewerkt', 43 | 'updated_date' => 'Bijgewerkt op', 44 | 'published' => 'Gepubliceerd', 45 | 'published_by' => 'Gepubliceerd door', 46 | 'current_user' => 'Huidige gebruiker', 47 | 'published_date' => 'Gepubliceerd op', 48 | 'published_validation' => 'Graag een publicatie datum opgeven', 49 | 'tab_edit' => 'Bewerken', 50 | 'tab_categories' => 'Categorieën', 51 | 'categories_comment' => 'Selecteer een categorie waarbij het artikel hoort', 52 | 'categories_placeholder' => 'Er zijn geen categorieën, maak eerst een categorie aan!', 53 | 'tab_manage' => 'Beheer', 54 | 'published_on' => 'Gepubliceerd op', 55 | 'excerpt' => 'Samenvatting', 56 | 'summary' => 'Samenvatting', 57 | 'featured_images' => 'Uitgelichte afbeelding', 58 | 'delete_confirm' => 'Weet je zeker dat je dit artikel wilt verwijderen?', 59 | 'close_confirm' => 'Artikel is nog niet opgeslagen.', 60 | 'return_to_posts' => 'Terug naar artikel overzicht', 61 | 'posted_byline' => 'Gepubliceerd in :categories op :date.', 62 | 'posted_byline_no_categories' => 'Gepubliceerd op :date.', 63 | 'date_format' => 'd, M, Y', 64 | ], 65 | 'categories' => [ 66 | 'list_title' => 'Beheer blog categorieën', 67 | 'new_category' => 'Nieuwe categorie', 68 | 'uncategorized' => 'Ongecategoriseerd', 69 | ], 70 | 'category' => [ 71 | 'name' => 'Naam', 72 | 'name_placeholder' => 'Naam categorie', 73 | 'slug' => 'Slug', 74 | 'slug_placeholder' => 'nieuw-categorie-slug', 75 | 'posts' => 'Artikelen', 76 | 'delete_confirm' => 'Weet je zeker dat je deze categorie wilt verwijderen?', 77 | 'return_to_categories' => 'Terug naar categorie overzicht', 78 | ], 79 | 'settings' => [ 80 | 'category_title' => 'Categorie overzicht', 81 | 'category_description' => 'Geeft een lijst weer van alle categorieën op de pagina.', 82 | 'category_slug' => 'Categorie slug', 83 | 'category_slug_description' => 'Haal blog categorie op a.h.v. de opgegeven slug. Deze waarde wordt standaard gebruikt voor de partial om de actieve categorie te markeren.', 84 | 'category_display_empty' => 'Geef lege categorieën weer', 85 | 'category_display_empty_description' => 'Geef categorieën weer die geen artikelen hebben.', 86 | 'category_page' => 'Categorie pagina', 87 | 'category_page_description' => 'Naam van categorie pagina bestand voor de categorie links. Deze waarde wordt standaard gebruikt door de partial.', 88 | 'post_title' => 'Artikel', 89 | 'post_description' => 'Geef een artikel weer op de pagina.', 90 | 'post_slug' => 'Artikel slug', 91 | 'post_slug_description' => 'Haal een artikel op a.h.v. de opgegeven slug.', 92 | 'post_category' => 'Categorie pagina', 93 | 'post_category_description' => 'Naam van categorie pagina bestand voor de categorie links. Deze waarde wordt standaard gebruikt door de partial.', 94 | 'posts_title' => 'Artikel overzicht', 95 | 'posts_description' => 'Geeft een lijst van de nieuwste artikelen weer op de pagina.', 96 | 'posts_pagination' => 'Pagina nummer', 97 | 'posts_pagination_description' => 'Deze waarde wordt gebruikt om te kijken op welke pagina de gebruiker is.', 98 | 'posts_filter' => 'Categorie filter', 99 | 'posts_filter_description' => 'Geef een categorie slug of URL param om de artikelen hier op te kunnen filteren. Leeg laten als alle artikelen getoond moeten worden.', 100 | 'posts_per_page' => 'Artikelen per pagina', 101 | 'posts_per_page_validation' => 'Ongeldig formaat voor het aantal artikelen per pagina', 102 | 'posts_no_posts' => 'Geen artikelen melding', 103 | 'posts_no_posts_description' => 'Deze tekst wordt getoond als er geen artikelen zijn. Deze waarde wordt standaard gebruikt door de partial.', 104 | 'posts_order' => 'Volgorde artikelen', 105 | 'posts_order_description' => 'Kolom waar de artikelen op gesorteerd moeten worden', 106 | 'posts_category' => 'Categorie pagina', 107 | 'posts_category_description' => 'Naam van categorie pagina bestand voor gekoppeld artikel overzichts pagina. Deze waarde wordt standaard gebruikt door de partial.', 108 | 'posts_post' => 'Artikel pagina', 109 | 'posts_post_description' => 'Naam van blog pagina bestand voor de "Lees meer" links. Deze waarde wordt standaard gebruikt door de partial.', 110 | 'posts_except_post' => 'Except post', 111 | 'posts_except_post_description' => 'Enter ID/URL or variable with post ID/URL you want to except', 112 | ], 113 | ]; 114 | -------------------------------------------------------------------------------- /lang/pl/lang.php: -------------------------------------------------------------------------------- 1 | [ 5 | 'name' => 'Blog', 6 | 'description' => 'Solidna platforma blogera', 7 | ], 8 | 'blog' => [ 9 | 'menu_label' => 'Blog', 10 | 'menu_description' => 'Zarządzaj postami na blogu', 11 | 'posts' => 'Posty', 12 | 'create_post' => 'Utwórz post', 13 | 'categories' => 'Kategorie', 14 | 'create_category' => 'Utwórz kategorię', 15 | 'tab' => 'Blog', 16 | 'access_posts' => 'Zarządzaj postami', 17 | 'access_categories' => 'Zarządzaj kategoriami na blogu', 18 | 'access_other_posts' => 'Zarządzaj postami innych użytkowników', 19 | 'access_import_export' => 'Zarządzaj importowaniem i eksportowaniem postów', 20 | 'access_publish' => 'Publikuj posty', 21 | 'manage_settings' => 'Zarządzaj ustawieniami bloga', 22 | 'delete_confirm' => 'Czy jesteś pewien?', 23 | 'chart_published' => 'Opublikowane', 24 | 'chart_drafts' => 'Szkice', 25 | 'chart_total' => 'Łącznie', 26 | 'settings_description' => 'Zarządzaj ustawieniami bloga', 27 | 'show_all_posts_label' => 'Pokaż wszystkie posty użytkownikom backendu', 28 | 'show_all_posts_comment' => 'Wyświetl opublikowane i nieopublikowany posty na stronie dla użytkowników backendu', 29 | 'tab_general' => 'Ogólne', 30 | ], 31 | 'posts' => [ 32 | 'list_title' => 'Zarządzaj postami', 33 | 'filter_category' => 'Kategoria', 34 | 'filter_published' => 'Ukryj opublikowane', 35 | 'filter_date' => 'Date', 36 | 'new_post' => 'Nowy post', 37 | 'export_post' => 'Eksportuj posty', 38 | 'import_post' => 'Importuj posty', 39 | ], 40 | 'post' => [ 41 | 'title' => 'Tytuł', 42 | 'title_placeholder' => 'Tytuł nowego posta', 43 | 'content' => 'Zawartość', 44 | 'content_html' => 'Zawartość HTML', 45 | 'slug' => 'Alias', 46 | 'slug_placeholder' => 'alias-nowego-postu', 47 | 'categories' => 'Kategorie', 48 | 'author_email' => 'Email autora', 49 | 'created' => 'Utworzony', 50 | 'created_date' => 'Data utworzenia', 51 | 'updated' => 'Zaktualizowany', 52 | 'updated_date' => 'Data aktualizacji', 53 | 'published' => 'Opublikowany', 54 | 'published_date' => 'Data publikacji', 55 | 'published_validation' => 'Proszę określić datę publikacji', 56 | 'tab_edit' => 'Edytuj', 57 | 'tab_categories' => 'Kategorie', 58 | 'categories_comment' => 'Wybierz kategorie do których post należy', 59 | 'categories_placeholder' => 'Nie ma żadnej kategorii, powinieneś utworzyć przynajmniej jedną.', 60 | 'tab_manage' => 'Zarządzaj', 61 | 'published_on' => 'Opublikowane', 62 | 'excerpt' => 'Zalążek', 63 | 'summary' => 'Summary', 64 | 'featured_images' => 'Załączone grafiki', 65 | 'delete_confirm' => 'Czy naprawdę chcesz usunąć ten post?', 66 | 'delete_success' => 'Posty zostały pomyślnie usunięte.', 67 | 'close_confirm' => 'Ten post nie jest zapisany.', 68 | 'return_to_posts' => 'Wróć do listy postów', 69 | ], 70 | 'categories' => [ 71 | 'list_title' => 'Zarządzaj kategoriami postów', 72 | 'new_category' => 'Nowa kategoria', 73 | 'uncategorized' => 'Bez kategorii', 74 | ], 75 | 'category' => [ 76 | 'name' => 'Nazwa', 77 | 'name_placeholder' => 'Nazwa nowej kategorii', 78 | 'description' => 'Opis', 79 | 'slug' => 'Alias', 80 | 'slug_placeholder' => 'alias-nowej-kategorii', 81 | 'posts' => 'Posty', 82 | 'delete_confirm' => 'Czy naprawdę chcesz usunąć tę kategorię?', 83 | 'delete_success' => 'Kategorie zostały pomyślnie usunięte.', 84 | 'return_to_categories' => 'Wróć do listy kategorii', 85 | 'reorder' => 'Zmień kolejnośc kategorii', 86 | ], 87 | 'menuitem' => [ 88 | 'blog_category' => 'Kategorie', 89 | 'all_blog_categories' => 'Wszystkie kategorie', 90 | 'blog_post' => 'Post na bloga', 91 | 'all_blog_posts' => 'Wszystkie posty', 92 | 'category_blog_posts' => 'Posty w kategorii', 93 | ], 94 | 'settings' => [ 95 | 'category_title' => 'Lista kategorii', 96 | 'category_description' => 'Wyświetla listę blogowych kategorii na stronie.', 97 | 'category_slug' => 'Alias kategorii', 98 | 'category_slug_description' => 'Look up the blog category using the supplied slug value. This property is used by the default component partial for marking the currently active category.', 99 | 'category_display_empty' => 'Pokaż puste kategorie', 100 | 'category_display_empty_description' => 'Pokazuje kategorie, które nie posiadają postów', 101 | 'category_page' => 'Strona kategorii', 102 | 'category_page_description' => 'Nazwa strony kategorii gdzie są pokazywane linki. Ten parametr jest domyślnie używany przez komponent.', 103 | 'post_title' => 'Post', 104 | 'post_description' => 'Wyświetla pojedynczy post na stronie.', 105 | 'post_slug' => 'Alias postu', 106 | 'post_slug_description' => 'Szuka post po nazwie aliasu.', 107 | 'post_category' => 'Strona kategorii', 108 | 'post_category_description' => 'Nazwa strony kategorii gdzie są pokazywane linki. Ten parametr jest domyślnie używany przez komponent.', 109 | 'posts_title' => 'Lista postów', 110 | 'posts_description' => 'Wyświetla kilka ostatnich postów.', 111 | 'posts_pagination' => 'Numer strony', 112 | 'posts_pagination_description' => 'Ta wartość odpowiada za odczytanie numeru strony.', 113 | 'posts_filter' => 'Filtr kategorii', 114 | 'posts_filter_description' => 'Wprowadź alias kategorii lub adres URL aby filtrować posty. Pozostaw puste aby pokazać wszystkie.', 115 | 'posts_per_page' => 'Ilość postów na strone', 116 | 'posts_per_page_validation' => 'Nieprawidłowa wartość ilości postów na strone', 117 | 'posts_no_posts' => 'Komunikat o braku postów', 118 | 'posts_no_posts_description' => 'Wiadomość, która ukaże się kiedy komponent nie odnajdzie postów. Ten parametr jest domyślnie używany przez komponent.', 119 | 'posts_no_posts_default' => 'Nie znaleziono postów', 120 | 'posts_order' => 'Kolejność postów', 121 | 'posts_order_description' => 'Parametr przez który mają być sortowane posty', 122 | 'posts_category' => 'Strona kategorii', 123 | 'posts_category_description' => 'Nazwa strony kategorii w wyświetlaniu linków "Posted into" [Opublikowano w]. Ten parametr jest domyślnie używany przez komponent.', 124 | 'posts_post' => 'Strona postu', 125 | 'posts_post_description' => 'Nazwa strony postu dla linków "Learn more" [Czytaj więcej]. Ten parametr jest domyślnie używany przez komponent.', 126 | 'posts_except_post' => 'Wyklucz posty', 127 | 'posts_except_post_description' => 'Wprowadź ID/URL lub zmienną z ID/URL postu, który chcesz wykluczyć', 128 | 'posts_except_post_validation' => 'Wartość pola wykluczenia postów musi być pojedynczym ID/aliasem lub listą ID/aliasów rozdzieloną przecinkami', 129 | 'posts_except_categories' => 'Wyklucz kategorie', 130 | 'posts_except_categories_description' => 'Wprowadź listę aliasów kategorii rozdzieloną przecinkami lub zmienną zawierającą taką listę', 131 | 'posts_except_categories_validation' => 'Wartośc pola wykluczenia kategorii musi być pojedynczym aliasem lub listą aliasów rozdzielonych przecinkami', 132 | 'rssfeed_blog' => 'Strona bloga', 133 | 'rssfeed_blog_description' => 'Nazwa strony głównej bloga do generowania linków. Używane przez domyślny fragment komponentu.', 134 | 'rssfeed_title' => 'Kanał RSS', 135 | 'rssfeed_description' => 'Generuje kanał RSS zawierający posty z bloga.', 136 | 'group_links' => 'Linki', 137 | 'group_exceptions' => 'Wyjątki', 138 | ], 139 | 'sorting' => [ 140 | 'title_asc' => 'Tytuł (rosnąco)', 141 | 'title_desc' => 'Tytuł (malejąco)', 142 | 'created_asc' => 'Data utworzenia (rosnąco)', 143 | 'created_desc' => 'Data utworzenia (rosnąco)', 144 | 'updated_asc' => 'Data aktualizacji (rosnąco)', 145 | 'updated_desc' => 'Data aktualizacji (rosnąco)', 146 | 'published_asc' => 'Data publikacji (rosnąco)', 147 | 'published_desc' => 'Data publikacji (rosnąco)', 148 | 'random' => 'Losowo', 149 | ], 150 | 'import' => [ 151 | 'update_existing_label' => 'Aktualizuj istniejące wpisy', 152 | 'update_existing_comment' => 'Zaznacz to pole, aby zaktualizować posty, które mają taki sam identyfikator (ID), tytuł lub alias.', 153 | 'auto_create_categories_label' => 'Utwórz kategorie podane w pliku', 154 | 'auto_create_categories_comment' => 'Aby skorzystać z tej funkcji powinieneś dopasować kolumnę Kategorii. W przeciwnym wypadku wybierz domyślną kategorię do użycia poniżej.', 155 | 'categories_label' => 'Kategorie', 156 | 'categories_comment' => 'Wybierz kategorię, do której będą należeć zaimportowane posty (opcjonalne).', 157 | 'default_author_label' => 'Domyślny autor postów (opcjonalne)', 158 | 'default_author_comment' => 'Import spróbuje dopasować istniejącego autora na podstawie kolumny email. W przypadku niepowodzenia zostanie użyty autor wybrany powyżej.', 159 | 'default_author_placeholder' => '-- wybierz autora --', 160 | ], 161 | ]; 162 | -------------------------------------------------------------------------------- /lang/pt-br/lang.php: -------------------------------------------------------------------------------- 1 | [ 5 | 'name' => 'Blog', 6 | 'description' => 'A plataforma de blogs robusta.', 7 | ], 8 | 'blog' => [ 9 | 'menu_label' => 'Blog', 10 | 'menu_description' => 'Gerencie os posts do blog', 11 | 'posts' => 'Posts', 12 | 'create_post' => 'Blog post', 13 | 'categories' => 'Categorias', 14 | 'create_category' => 'Blog categoria', 15 | 'tab' => 'Blog', 16 | 'access_posts' => 'Gerencie os posts do blog', 17 | 'access_categories' => 'Gerenciar as categorias de blog', 18 | 'access_other_posts' => 'Gerencie outros posts de usuários do blog', 19 | 'access_import_export' => 'Permissão para importação e exportação de mensagens', 20 | 'access_publish' => 'Permitido publicar posts', 21 | 'delete_confirm' => 'Você tem certeza?', 22 | 'chart_published' => 'Publicados', 23 | 'chart_drafts' => 'Rascunhos', 24 | 'chart_total' => 'Total', 25 | ], 26 | 'posts' => [ 27 | 'list_title' => 'Gerencie os posts do blog', 28 | 'filter_category' => 'Categoria', 29 | 'filter_published' => 'Esconder publicados', 30 | 'filter_date' => 'Data', 31 | 'new_post' => 'Novo post', 32 | 'export_post' => 'Exportar posts', 33 | 'import_post' => 'Importar posts', 34 | ], 35 | 'post' => [ 36 | 'title' => 'Título', 37 | 'title_placeholder' => 'Novo título do post', 38 | 'content' => 'Conteúdo', 39 | 'content_html' => 'HTML Conteúdo', 40 | 'slug' => 'Slug', 41 | 'slug_placeholder' => 'slug-do-post', 42 | 'categories' => 'Categorias', 43 | 'author_email' => 'Autor Email', 44 | 'created' => 'Criado', 45 | 'created_date' => 'Data de criação', 46 | 'updated' => 'Atualizado', 47 | 'updated_date' => 'Data de atualização', 48 | 'published' => 'Publicado', 49 | 'published_date' => 'Data de publicação', 50 | 'published_validation' => 'Por favor, especifique a data de publicação', 51 | 'tab_edit' => 'Editar', 52 | 'tab_categories' => 'Categorias', 53 | 'categories_comment' => 'Selecione as categorias do blog que o post pertence.', 54 | 'categories_placeholder' => 'Não há categorias, você deve criar um primeiro!', 55 | 'tab_manage' => 'Gerenciar', 56 | 'published_on' => 'Publicado em', 57 | 'excerpt' => 'Resumo', 58 | 'summary' => 'Resumo', 59 | 'featured_images' => 'Imagens destacadas', 60 | 'delete_confirm' => 'Você realmente deseja excluir este post?', 61 | 'close_confirm' => 'O post não foi salvo.', 62 | 'return_to_posts' => 'Voltar à lista de posts', 63 | ], 64 | 'categories' => [ 65 | 'list_title' => 'Gerenciar as categorias do blog', 66 | 'new_category' => 'Nova categoria', 67 | 'uncategorized' => 'Sem categoria', 68 | ], 69 | 'category' => [ 70 | 'name' => 'Nome', 71 | 'name_placeholder' => 'Novo nome para a categoria', 72 | 'description' => 'Descrição', 73 | 'slug' => 'Slug', 74 | 'slug_placeholder' => 'novo-slug-da-categoria', 75 | 'posts' => 'Posts', 76 | 'delete_confirm' => 'Você realmente quer apagar esta categoria?', 77 | 'return_to_categories' => 'Voltar para a lista de categorias do blog', 78 | 'reorder' => 'Reordenar Categorias', 79 | ], 80 | 'menuitem' => [ 81 | 'blog_category' => 'Blog categoria', 82 | 'all_blog_categories' => 'Todas as categorias de blog', 83 | 'blog_post' => 'Blog post', 84 | 'all_blog_posts' => 'Todas as postagens do blog', 85 | ], 86 | 'settings' => [ 87 | 'category_title' => 'Lista de categoria', 88 | 'category_description' => 'Exibe uma lista de categorias de blog na página.', 89 | 'category_slug' => 'Slug da categoria', 90 | 'category_slug_description' => "Olhe para cima, a categoria do blog já está usando o valor fornecido! Esta propriedade é usada pelo componente default parcial para a marcação da categoria atualmente ativa.", 91 | 'category_display_empty' => 'xibir categorias vazias', 92 | 'category_display_empty_description' => 'Mostrar categorias que não tem nenhum post.', 93 | 'category_page' => 'Página da categoria', 94 | 'category_page_description' => 'Nome do arquivo de página da categoria para os links de categoria. Esta propriedade é usada pelo componente default parcial.', 95 | 'post_title' => 'Post', 96 | 'post_description' => 'Exibe um post na página.', 97 | 'post_slug' => 'Post slug', 98 | 'post_slug_description' => "Procure o post do blog usando o valor do slug fornecido.", 99 | 'post_category' => 'Página da categoria', 100 | 'post_category_description' => 'Nome do arquivo de página da categoria para os links de categoria. Esta propriedade é usada pelo componente default parcial.', 101 | 'posts_title' => 'Lista de posts', 102 | 'posts_description' => 'Exibe uma lista de últimas postagens na página.', 103 | 'posts_pagination' => 'Número da pagina', 104 | 'posts_pagination_description' => 'Esse valor é usado para determinar qual página o usuário está.', 105 | 'posts_filter' => 'Filtro de categoria', 106 | 'posts_filter_description' => 'Digite um slug de categoria ou parâmetro de URL para filtrar as mensagens. Deixe em branco para mostrar todas as mensagens.', 107 | 'posts_per_page' => 'Posts por página', 108 | 'posts_per_page_validation' => 'Formato inválido das mensagens por valor de página', 109 | 'posts_no_posts' => 'Nenhuma mensagem de posts', 110 | 'posts_no_posts_description' => 'Mensagem para exibir na lista post no caso, se não há mensagens. Esta propriedade é usada pelo componente default parcial.', 111 | 'posts_order' => 'Orde posts', 112 | 'posts_order_decription' => 'Atributo em que as mensagens devem ser ordenados', 113 | 'posts_category' => 'Página de Categoria', 114 | 'posts_category_description' => 'Nome do arquivo de página da categoria para os links de categoria. Esta propriedade é usada pelo componente default parcial.', 115 | 'posts_post' => 'Página de posts', 116 | 'posts_post_description' => 'Nome do arquivo post página para os "Saiba mais" links. Esta propriedade é usada pelo componente default parcial.', 117 | 'posts_except_post' => 'Except post', 118 | 'posts_except_post_description' => 'Enter ID/URL or variable with post ID/URL you want to except', 119 | 'rssfeed_blog' => 'Página do Blog', 120 | 'rssfeed_blog_description' => 'Nome do arquivo principal da página do blog para geração de links. Essa propriedade é usada pelo componente padrão parcial.', 121 | 'rssfeed_title' => 'RSS Feed', 122 | 'rssfeed_description' => 'Gera um feed RSS que contém posts do blog.', 123 | ], 124 | ]; 125 | -------------------------------------------------------------------------------- /lang/ru/lang.php: -------------------------------------------------------------------------------- 1 | [ 5 | 'name' => 'Блог', 6 | 'description' => 'Надежная блоговая-платформа.', 7 | ], 8 | 'blog' => [ 9 | 'menu_label' => 'Блог', 10 | 'menu_description' => 'Управление Блогом', 11 | 'posts' => 'Записи', 12 | 'create_post' => 'записи', 13 | 'categories' => 'Категории', 14 | 'create_category' => 'категории', 15 | 'tab' => 'Блог', 16 | 'access_posts' => 'Управление записями блога', 17 | 'access_categories' => 'Управление категориями блога', 18 | 'access_other_posts' => 'Управление записями других пользователей', 19 | 'access_import_export' => 'Разрешено импортировать и экспортировать записи', 20 | 'access_publish' => 'Разрешено публиковать записи', 21 | 'manage_settings' => 'Управление настройками блога', 22 | 'delete_confirm' => 'Вы уверены, что хотите сделать это?', 23 | 'chart_published' => 'Опубликовано', 24 | 'chart_drafts' => 'Черновики', 25 | 'chart_total' => 'Всего', 26 | 'settings_description' => 'Управление настройками блога', 27 | 'show_all_posts_label' => 'Показывать все записи для внутренних (бэкенд) пользователей', 28 | 'show_all_posts_comment' => 'Показывать опубликованные и неопубликованные записи на фронтенде для внутренних (бэкенд) пользователей', 29 | 'tab_general' => 'Основные', 30 | ], 31 | 'posts' => [ 32 | 'list_title' => 'Управление записями блога', 33 | 'filter_category' => 'Категория', 34 | 'filter_published' => 'Скрыть опубликованные', 35 | 'filter_date' => 'Дата', 36 | 'new_post' => 'Новая запись', 37 | 'export_post' => 'Экспорт записей', 38 | 'import_post' => 'Импорт записей', 39 | ], 40 | 'post' => [ 41 | 'title' => 'Заголовок', 42 | 'title_placeholder' => 'Новый заголовок записи', 43 | 'content' => 'Контент', 44 | 'content_html' => 'HTML Контент', 45 | 'slug' => 'URL записи', 46 | 'slug_placeholder' => 'new-post-slug', 47 | 'categories' => 'Категории', 48 | 'author_email' => 'Email автора', 49 | 'created' => 'Создано', 50 | 'created_date' => 'Дата создания', 51 | 'updated' => 'Обновлено', 52 | 'updated_date' => 'Дата обновления', 53 | 'published' => 'Опубликовано', 54 | 'published_date' => 'Дата публикации', 55 | 'published_validation' => 'Пожалуйста, укажите дату публикации.', 56 | 'tab_edit' => 'Редактор', 57 | 'tab_categories' => 'Категории', 58 | 'categories_comment' => 'Выберите категории, к которым относится эта запись', 59 | 'categories_placeholder' => 'Не найдено ни одной категории, создайте хотя бы одну!', 60 | 'tab_manage' => 'Управление', 61 | 'published_on' => 'Опубликовано', 62 | 'excerpt' => 'Отрывок', 63 | 'summary' => 'Резюме', 64 | 'featured_images' => 'Тематические изображения', 65 | 'delete_confirm' => 'Вы действительно хотите удалить эту запись?', 66 | 'delete_success' => 'Эти записи успешно удалены.', 67 | 'close_confirm' => 'Запись не была сохранена.', 68 | 'return_to_posts' => 'Вернуться к списку записей', 69 | ], 70 | 'categories' => [ 71 | 'list_title' => 'Управление категориями блога', 72 | 'new_category' => 'Новая категория', 73 | 'uncategorized' => 'Без категории', 74 | ], 75 | 'category' => [ 76 | 'name' => 'Название', 77 | 'name_placeholder' => 'Новое имя категории', 78 | 'description' => 'Описание', 79 | 'slug' => 'URL адрес', 80 | 'slug_placeholder' => 'new-category-slug', 81 | 'posts' => 'Записи', 82 | 'delete_confirm' => 'Вы действительно хотите удалить эту категорию?', 83 | 'delete_success' => 'Эти категории успешно удалены.', 84 | 'return_to_categories' => 'Вернуться к списку категорий', 85 | 'reorder' => 'Порядок категорий', 86 | ], 87 | 'menuitem' => [ 88 | 'blog_category' => 'Категория блога', 89 | 'all_blog_categories' => 'Все категории блога', 90 | 'blog_post' => 'Запись блога', 91 | 'all_blog_posts' => 'Все записи блога', 92 | 'category_blog_posts' => 'Записи категории блога', 93 | ], 94 | 'settings' => [ 95 | 'category_title' => 'Список категорий блога', 96 | 'category_description' => 'Отображает список категорий на странице.', 97 | 'category_slug' => 'Параметр URL', 98 | 'category_slug_description' => 'Параметр маршрута, используемый для поиска в текущей категории по URL. Это свойство используется по умолчанию компонентом Фрагменты для маркировки активной категории.', 99 | 'category_display_empty' => 'Пустые категории', 100 | 'category_display_empty_description' => 'Отображать категории, которые не имеют записей.', 101 | 'category_page' => 'Страница категорий', 102 | 'category_page_description' => 'Название страницы категорий. Это свойство используется по умолчанию компонентом Фрагменты.', 103 | 'post_title' => 'Запись блога', 104 | 'post_description' => 'Отображение записи блога', 105 | 'post_slug' => 'Параметр URL', 106 | 'post_slug_description' => 'Параметр маршрута, необходимый для выбора конкретной записи.', 107 | 'post_category' => 'Страница категорий', 108 | 'post_category_description' => 'Название страницы категорий. Это свойство используется по умолчанию компонентом Фрагменты.', 109 | 'posts_title' => 'Список записей блога', 110 | 'posts_description' => 'Отображает список последних записей блога на странице.', 111 | 'posts_pagination' => 'Параметр постраничной навигации', 112 | 'posts_pagination_description' => 'Параметр, необходимый для постраничной навигации.', 113 | 'posts_filter' => 'Фильтр категорий', 114 | 'posts_filter_description' => 'Введите URL категории или параметр URL-адреса для фильтрации записей. Оставьте пустым, чтобы посмотреть все записи.', 115 | 'posts_per_page' => 'Записей на странице', 116 | 'posts_per_page_validation' => 'Недопустимый Формат. Ожидаемый тип данных - действительное число.', 117 | 'posts_no_posts' => 'Отсутствие записей', 118 | 'posts_no_posts_description' => 'Сообщение, отображаемое в блоге, если отсутствуют записи. Это свойство используется по умолчанию компонентом Фрагменты.', 119 | 'posts_no_posts_default' => 'Записей не найдено', 120 | 'posts_order' => 'Сортировка', 121 | 'posts_order_description' => 'Атрибут, по которому будут сортироваться записи.', 122 | 'posts_category' => 'Страница категорий', 123 | 'posts_category_description' => 'Название категории на странице записи "размещена в категории". Это свойство используется по умолчанию компонентом Фрагменты.', 124 | 'posts_post' => 'Страница записи', 125 | 'posts_post_description' => 'Название страницы для ссылки "подробнее". Это свойство используется по умолчанию компонентом Фрагменты.', 126 | 'posts_except_post' => 'Кроме записи', 127 | 'posts_except_post_description' => 'Введите ID/URL или переменную с ID/URL записи, которую вы хотите исключить', 128 | 'posts_except_categories' => 'Кроме категорий', 129 | 'posts_except_categories_description' => 'Введите разделенный запятыми список URL категорий или переменную со списком категорий, которые вы хотите исключить', 130 | 'rssfeed_blog' => 'Страница блога', 131 | 'rssfeed_blog_description' => 'Имя основного файла страницы блога для генерации ссылок. Это свойство используется по умолчанию компонентом Фрагменты.', 132 | 'rssfeed_title' => 'RSS Feed', 133 | 'rssfeed_description' => 'Создает RSS-канал, содержащий записи из блога.', 134 | 'group_links' => 'Ссылки', 135 | 'group_exceptions' => 'Исключения', 136 | ], 137 | 'sorting' => [ 138 | 'title_asc' => 'Заголовок (по возрастанию)', 139 | 'title_desc' => 'Заголовок (по убыванию)', 140 | 'created_asc' => 'Создано (по возрастанию)', 141 | 'created_desc' => 'Создано (по убыванию)', 142 | 'updated_asc' => 'Обновлено (по возрастанию)', 143 | 'updated_desc' => 'Обновлено (по убыванию)', 144 | 'published_asc' => 'Опубликовано (по возрастанию)', 145 | 'published_desc' => 'Опубликовано (по убыванию)', 146 | 'random' => 'Случайно', 147 | ], 148 | 'import' => [ 149 | 'update_existing_label' => 'Обновить существующие записи', 150 | 'update_existing_comment' => 'Установите этот флажок, чтобы обновлять записи имеющие одинаковый ID, title или URL.', 151 | 'auto_create_categories_label' => 'Создать категории указанные в импортируемом файле', 152 | 'auto_create_categories_comment' => 'Вы должны сопоставить столбец Категории, чтобы использовать эту функцию. В противном случае выберите для назначения категорию по умолчанию из пунктов ниже.', 153 | 'categories_label' => 'Категории', 154 | 'categories_comment' => 'Выберите категории, к которым будут принадлежать импортированные записи (необязательно).', 155 | 'default_author_label' => 'Автор записи по умолчанию (необязательно)', 156 | 'default_author_comment' => 'Импорт попытается использовать существующего автора, если он соответствуете столбцу Email автора, в противном случае используется указанный выше автор.', 157 | 'default_author_placeholder' => '-- выберите автора --', 158 | ], 159 | ]; 160 | -------------------------------------------------------------------------------- /lang/sk/lang.php: -------------------------------------------------------------------------------- 1 | [ 5 | 'name' => 'Blog', 6 | 'description' => 'Robustná blogová platforma.', 7 | ], 8 | 'blog' => [ 9 | 'menu_label' => 'Blog', 10 | 'menu_description' => 'Správa blogových príspevkov', 11 | 'posts' => 'Príspevky', 12 | 'create_post' => 'Príspevok', 13 | 'categories' => 'Kategórie', 14 | 'create_category' => 'Kategórie príspevkov', 15 | 'tab' => 'Blog', 16 | 'access_posts' => 'Správa blogových príspevkov', 17 | 'access_categories' => 'Správa blogových kategórií', 18 | 'access_other_posts' => 'Správa blogových príspevkov ostatných užívateľov', 19 | 'access_import_export' => 'Možnosť importu a exportu príspevkov', 20 | 'access_publish' => 'Možnosť publikovať príspevky', 21 | 'delete_confirm' => 'Ste si istý?', 22 | 'chart_published' => 'PublikovanéPublished', 23 | 'chart_drafts' => 'Koncepty', 24 | 'chart_total' => 'Celkom', 25 | ], 26 | 'posts' => [ 27 | 'list_title' => 'Správa blogových príspevkov', 28 | 'filter_category' => 'Kategória', 29 | 'filter_published' => 'Publikované', 30 | 'filter_date' => 'Dátum', 31 | 'new_post' => 'Nový príspevok', 32 | 'export_post' => 'Exportovať príspevky', 33 | 'import_post' => 'Importovať príspevky', 34 | ], 35 | 'post' => [ 36 | 'title' => 'Názov', 37 | 'title_placeholder' => 'Názov nového príspevku', 38 | 'content' => 'Obsah', 39 | 'content_html' => 'HTML Obsah', 40 | 'slug' => 'URL príspevku', 41 | 'slug_placeholder' => 'url-nového-príspevku', 42 | 'categories' => 'Kategórie', 43 | 'author_email' => 'Email autora', 44 | 'created' => 'Vytvorené', 45 | 'created_date' => 'Dátum vytvorenia', 46 | 'updated' => 'Upravené', 47 | 'updated_date' => 'Dátum upravenia', 48 | 'published' => 'Publikované', 49 | 'published_date' => 'Dátum publikovania', 50 | 'published_validation' => 'Prosím zvoľte dátum publikovania príspevku', 51 | 'tab_edit' => 'Upraviť', 52 | 'tab_categories' => 'Kategórie', 53 | 'categories_comment' => 'Vyberte kategórie do ktorých tento príspevok patrí', 54 | 'categories_placeholder' => 'Neexistujú žiadne kategórie, najprv nejakú vytvorte!', 55 | 'tab_manage' => 'Nastavenia', 56 | 'published_on' => 'Dátum publikovania', 57 | 'excerpt' => 'Výňatok príspevku', 58 | 'summary' => 'Zhrnutie', 59 | 'featured_images' => 'Obrázky', 60 | 'delete_confirm' => 'Zmazať tento príspevok?', 61 | 'delete_success' => 'Vybrané príspevky boli úspešne odstránené.', 62 | 'close_confirm' => 'Príspevok nie je uložený.', 63 | 'return_to_posts' => 'Späť na zoznam príspevkov', 64 | ], 65 | 'categories' => [ 66 | 'list_title' => 'Správa blogových kategórií', 67 | 'new_category' => 'Nová kategória', 68 | 'uncategorized' => 'Nezaradené', 69 | ], 70 | 'category' => [ 71 | 'name' => 'Názov', 72 | 'name_placeholder' => 'Názov novej kategórie', 73 | 'description' => 'Popis', 74 | 'slug' => 'URL kategórie', 75 | 'slug_placeholder' => 'url-novej-kategórie', 76 | 'posts' => 'Počet príspevkov', 77 | 'delete_confirm' => 'Zmazať túto kategóriu?', 78 | 'delete_success' => 'Vybrané kategórie boli úspešne odstránené.', 79 | 'return_to_categories' => 'Späť na zoznam kategórií', 80 | 'reorder' => 'Zmeniť poradie kategórií', 81 | ], 82 | 'menuitem' => [ 83 | 'blog_category' => 'Blogová kategória', 84 | 'all_blog_categories' => 'Všetky blogové kategórie', 85 | 'blog_post' => 'Blogové príspevky', 86 | 'all_blog_posts' => 'Všetky blogové príspevky', 87 | 'category_blog_posts' => 'Blogové príspevky v kategórií', 88 | ], 89 | 'settings' => [ 90 | 'category_title' => 'Zoznam kategórií', 91 | 'category_description' => 'Zobrazí zoznam blogových kategórií na stránke.', 92 | 'category_slug' => 'URL kategórie', 93 | 'category_slug_description' => "Nájde blogovú kategóriu s týmto URL. Používa sa pre zobrazenie aktívnej kategórie.", 94 | 'category_display_empty' => 'Zobraziť prázdne kategórie', 95 | 'category_display_empty_description' => 'Zobrazí kategórie, ktoré nemajú žiadne príspevky.', 96 | 'category_page' => 'Stránka kategórie', 97 | 'category_page_description' => 'Názov stránky kategórie kam budú smerovať odkazy na kategóriu. Táto hodnota je použitá v predvolenej čiastočnej stránke komponentu.', 98 | 'post_title' => 'Príspevok', 99 | 'post_description' => 'Zobrazí blogový príspevok na stránke.', 100 | 'post_slug' => 'URL príspevku', 101 | 'post_slug_description' => "Nájde blogový príspevok s týmto URL.", 102 | 'post_category' => 'Stránka kategórie', 103 | 'post_category_description' => 'Názov stránky kategórie kam budú smerovať odkazy na kategóriu. Táto hodnota je použitá v predvolenej čiastočnej stránke komponentu.', 104 | 'posts_title' => 'Zoznam príspevkov', 105 | 'posts_description' => 'Zobrazí zoznam blogových príspevkov na stránke.', 106 | 'posts_pagination' => 'číslo stránky', 107 | 'posts_pagination_description' => 'Táto hodnota je použitá na určenie na akej stránke sa užívateľ nachádza.', 108 | 'posts_filter' => 'Filter kategórií', 109 | 'posts_filter_description' => 'Zadajte URL kategórie alebo URL parameter na filtrovanie príspevkov. Nechajte prázdne pre zobrazenie všetkých príspevkov.', 110 | 'posts_per_page' => 'Príspevkov na stránku', 111 | 'posts_per_page_validation' => 'Neplatný formát hodnoty počtu príspevkov na stránku', 112 | 'posts_no_posts' => 'Správa prázdnej stránky', 113 | 'posts_no_posts_description' => 'Správa, ktorá bude zobrazená v zozname príspevkov v prípade, že nie sú žiadne na zobrazenie. Táto hodnota je použitá v predvolenej čiastočnej stránke komponentu.', 114 | 'posts_no_posts_default' => 'Nenašli sa žiadne príspevky', 115 | 'posts_order' => 'Zoradenie príspevkov', 116 | 'posts_order_description' => 'Atribút podľa ktorého budú príspevky zoradené', 117 | 'posts_category' => 'Stránka kategórie', 118 | 'posts_category_description' => 'Názov stránky kategórie kam budú smerovať odkazy "Vložené do". Táto hodnota je použitá v predvolenej čiastočnej stránke komponentu.', 119 | 'posts_post' => 'Stránka príspevku', 120 | 'posts_post_description' => 'Názov stránky príspevku kam budú smerovať odkazy "Zistiť viac". Táto hodnota je použitá v predvolenej čiastočnej stránke komponentu.', 121 | 'posts_except_post' => 'Okrem príspevku', 122 | 'posts_except_post_description' => 'Zadajte ID/URL alebo premennú s ID/URL príspevku, ktorý chcete vylúčiť', 123 | 'posts_except_categories' => 'Okrem kategórií', 124 | 'posts_except_categories_description' => 'Zadajte zoznam kategórií oddelený čiarkami alebo premennú s týmto zoznamom, ktoré chcete vylúčiť', 125 | 'rssfeed_blog' => 'Stránka blogu', 126 | 'rssfeed_blog_description' => 'Názov hlavnej stránky blogu na generovanie odkazov. Táto hodnota je použitá v predvolenej čiastočnej stránke komponentu.', 127 | 'rssfeed_title' => 'RSS Kanál', 128 | 'rssfeed_description' => 'Vygeneruje RSS kanál, ktorý obsahuje blogové príspevky.', 129 | 'group_links' => 'Odkazy', 130 | 'group_exceptions' => 'Výnimky', 131 | ], 132 | 'sorting' => [ 133 | 'title_asc' => 'Názov (vzostupne)', 134 | 'title_desc' => 'Názov (zostupne)', 135 | 'created_asc' => 'Vytvorené (vzostupne)', 136 | 'created_desc' => 'Vytvorené (zostupne)', 137 | 'updated_asc' => 'Upravené (vzostupne)', 138 | 'updated_desc' => 'Upravené (zostupne)', 139 | 'published_asc' => 'Publikované (vzostupne)', 140 | 'published_desc' => 'Publikované (zostupne)', 141 | 'random' => 'Náhodne', 142 | ], 143 | 'import' => [ 144 | 'update_existing_label' => 'Aktualizovať existujúce príspevky', 145 | 'update_existing_comment' => 'Začiarknutím tohto políčka aktualizujte príspevky, ktoré majú presne to isté ID, titul alebo URL príspevku.', 146 | 'auto_create_categories_label' => 'Vytvoriť kategórie zadané v importovanom súbore', 147 | 'auto_create_categories_comment' => 'Ak chcete túto funkciu použiť, mali by sa zhodovať so stĺpcom Kategórie, inak vyberte predvolené kategórie, ktoré chcete použiť z nižšie uvedených položiek.', 148 | 'categories_label' => 'Kategórie', 149 | 'categories_comment' => 'Vyberte kategórie, do ktorých budú patriť importované príspevky (voliteľné).', 150 | 'default_author_label' => 'Predvolený autor príspevku (voliteľné)', 151 | 'default_author_comment' => 'Import sa pokúsi použiť existujúceho autora, ak sa zhoduje so stĺpcom e-mail, inak sa použije vyššie uvedený autor.', 152 | 'default_author_placeholder' => '-- vyberte autora --', 153 | ], 154 | ]; 155 | -------------------------------------------------------------------------------- /lang/sl/lang.php: -------------------------------------------------------------------------------- 1 | [ 5 | 'name' => 'Blog', 6 | 'description' => 'Robustna platforma za bloganje.', 7 | ], 8 | 'blog' => [ 9 | 'menu_label' => 'Blog', 10 | 'menu_description' => 'Upravljanje bloga', 11 | 'posts' => 'Objave', 12 | 'create_post' => 'Blog objava', 13 | 'categories' => 'Kategorije', 14 | 'create_category' => 'Blog kategorija', 15 | 'tab' => 'Blog', 16 | 'access_posts' => 'Upravljanje blog objav', 17 | 'access_categories' => 'Upravljanje blog kategorij', 18 | 'access_other_posts' => 'Upravljanje objav drugih uporabnikov', 19 | 'access_import_export' => 'Dovoljenje za uvoz in izvoz objav', 20 | 'access_publish' => 'Dovoljenje za objavljanje objav', 21 | 'manage_settings' => 'Urejanje nastavitev bloga', 22 | 'delete_confirm' => 'Ali ste prepričani?', 23 | 'chart_published' => 'Objavljeno', 24 | 'chart_drafts' => 'Osnutki', 25 | 'chart_total' => 'Skupaj', 26 | 'settings_description' => 'Urejanje nastavitev bloga', 27 | 'show_all_posts_label' => 'Administratorjem prikaži vse objave', 28 | 'show_all_posts_comment' => 'Na spletni strani prikaži administratorjem vse objavljene in neobjavljene objave.', 29 | 'tab_general' => 'Splošno', 30 | ], 31 | 'posts' => [ 32 | 'list_title' => 'Urejanje blog objav', 33 | 'filter_category' => 'Kategorija', 34 | 'filter_published' => 'Objavljeno', 35 | 'filter_date' => 'Datum', 36 | 'new_post' => 'Nova objava', 37 | 'export_post' => 'Izvoz objav', 38 | 'import_post' => 'Uvoz objav', 39 | ], 40 | 'post' => [ 41 | 'title' => 'Naslov', 42 | 'title_placeholder' => 'Naslov nove objave', 43 | 'content' => 'Vsebina', 44 | 'content_html' => 'HTML vsebina', 45 | 'slug' => 'Povezava', 46 | 'slug_placeholder' => 'povezava-nove-objave', 47 | 'categories' => 'Kategorije', 48 | 'author_email' => 'E-pošta avtorja', 49 | 'created' => 'Ustvarjeno', 50 | 'created_date' => 'Ustvarjeno dne', 51 | 'updated' => 'Posodobljeno', 52 | 'updated_date' => 'Posodobljeno dne', 53 | 'published' => 'Objavljeno', 54 | 'published_by' => 'Objavil', 55 | 'current_user' => 'Trenutni uporabnik', 56 | 'published_date' => 'Datum objave', 57 | 'published_validation' => 'Prosimo, podajte datum objave', 58 | 'tab_edit' => 'Upravljanje', 59 | 'tab_categories' => 'Kategorije', 60 | 'categories_comment' => 'Izberite kategorije, v katere spada objava', 61 | 'categories_placeholder' => 'Ni najdenih kategorij, ustvarite vsaj eno kategorijo!', 62 | 'tab_manage' => 'Urejanje', 63 | 'published_on' => 'Datum objave', 64 | 'excerpt' => 'Izvleček', 65 | 'summary' => 'Povzetek', 66 | 'featured_images' => 'Uporabljene slike', 67 | 'delete_confirm' => 'Želite izbrisati to objavo?', 68 | 'delete_success' => 'Te objave so bile uspešno izbrisane.', 69 | 'close_confirm' => 'Ta objava ni shranjena.', 70 | 'return_to_posts' => 'Vrnite se na seznam objav', 71 | ], 72 | 'categories' => [ 73 | 'list_title' => 'Upravljanje blog kategorij', 74 | 'new_category' => 'Nova kategorija', 75 | 'uncategorized' => 'Nekategorizirano', 76 | ], 77 | 'category' => [ 78 | 'name' => 'Naslov', 79 | 'name_placeholder' => 'Naslov nove kategorije', 80 | 'description' => 'Opis', 81 | 'slug' => 'Povezava', 82 | 'slug_placeholder' => 'povezava-nove-kategorije', 83 | 'posts' => 'Objave', 84 | 'delete_confirm' => 'Želite izbrisati to kategorijo?', 85 | 'delete_success' => 'Te kategorije so bile uspešno izbrisane.', 86 | 'return_to_categories' => 'Vrnite se na seznam blog kategorij', 87 | 'reorder' => 'Spremenite vrstni red kategorij', 88 | ], 89 | 'menuitem' => [ 90 | 'blog_category' => 'Blog kategorija', 91 | 'all_blog_categories' => 'Vse blog kategorije', 92 | 'blog_post' => 'Blog objava', 93 | 'all_blog_posts' => 'Vse blog objave', 94 | 'category_blog_posts' => 'Objave v kategoriji', 95 | ], 96 | 'settings' => [ 97 | 'category_title' => 'Seznam kategorij', 98 | 'category_description' => 'Prikaži seznam blog kategorij na strani.', 99 | 'category_slug' => 'Povezava kategorije', 100 | 'category_slug_description' => 'Omogoča pregled blog kategorije na podani povezavi. Ta lastnost je uporabljena v privzeti predlogi komponente za označevanje trenutno aktivne kategorije.', 101 | 'category_display_empty' => 'Prikaži prazne kategorije', 102 | 'category_display_empty_description' => 'Prikaže kategorije brez objav.', 103 | 'category_page' => 'Stran s kategorijo', 104 | 'category_page_description' => 'Naslov strani blog kategorij za ustvarjanje povezav. Ta lastnost je uporabljena v privzeti predlogi komponente.', 105 | 'post_title' => 'Objava', 106 | 'post_description' => 'Prikaži blog objavo na strani.', 107 | 'post_slug' => 'Povezava objave', 108 | 'post_slug_description' => "Omogoča pregled blog objave na podani povezavi.", 109 | 'post_category' => 'Stran s kategorijo', 110 | 'post_category_description' => 'Naslov strani blog kategorije za ustvarjanje povezav. Ta lastnost je uporabljena v privzeti predlogi komponente.', 111 | 'posts_title' => 'Seznam objav', 112 | 'posts_description' => 'Prikaži seznam najnovejših blog objav na strani.', 113 | 'posts_pagination' => 'Številka strani', 114 | 'posts_pagination_description' => 'Ta vrednost se uporablja za določitev, na kateri strani se nahaja uporabnik.', 115 | 'posts_filter' => 'Filter kategorij', 116 | 'posts_filter_description' => 'Vnesite povezavo kategorije ali URL parameter za filtriranje objav. Pustite prazno za prikaz vseh objav.', 117 | 'posts_per_page' => 'Število objav na strani', 118 | 'posts_per_page_validation' => 'Neveljaven format števila objav na strani', 119 | 'posts_no_posts' => 'Sporočilo brez objav', 120 | 'posts_no_posts_description' => 'Sporočilo, ki se prikaže na seznamu blog objav, če ni nobenih objav. Ta lastnost je uporabljena v privzeti predlogi komponente.', 121 | 'posts_no_posts_default' => 'Ni najdenih objav', 122 | 'posts_order' => 'Vrstni red objav', 123 | 'posts_order_description' => 'Lastnost, glede na katero naj bodo razvrščene objave', 124 | 'posts_category' => 'Stran s kategorijo', 125 | 'posts_category_description' => 'Naslov strani blog kategorije za povezave "Objavljeno v". Ta lastnost je uporabljena v privzeti predlogi komponente.', 126 | 'posts_post' => 'Stran z objavo', 127 | 'posts_post_description' => 'Naslov strani blog objave za povezave "Preberi več". Ta lastnost je uporabljena v privzeti predlogi komponente.', 128 | 'posts_except_post' => 'Izvzete objave', 129 | 'posts_except_post_description' => 'Vnesite ID/URL objave ali spremenljivko z ID-jem/URL-jem objave, ki jo želite izvzeti. Za določitev večjega števila objav lahko uporabite seznam, ločen z vejicami.', 130 | 'posts_except_post_validation' => 'Izvzete objave morajo biti posamezna povezava ali ID objave ali pa seznam povezav oz. ID-jev objav, ločen z vejicami.', 131 | 'posts_except_categories' => 'Izvzete kategorije', 132 | 'posts_except_categories_description' => 'Vnesite seznam povezav kategorij, ločen z vejicami ali pa spremenljivko, ki vključuje takšen seznam kategorij, ki jih želite izvzeti.', 133 | 'posts_except_categories_validation' => 'Izvzete kategorije morajo biti posamezna povezava kategorije ali pa seznam povezav kategorij, ločen z vejicami.', 134 | 'rssfeed_blog' => 'Stran z blogom', 135 | 'rssfeed_blog_description' => 'Naslov glavne strani bloga za ustvarjanje povezav. Ta lastnost je uporabljena v privzeti predlogi komponente.', 136 | 'rssfeed_title' => 'RSS vir', 137 | 'rssfeed_description' => 'Ustvari vir RSS, ki vsebuje objave iz bloga.', 138 | 'group_links' => 'Povezave', 139 | 'group_exceptions' => 'Izjeme', 140 | ], 141 | 'sorting' => [ 142 | 'title_asc' => 'Naslov (naraščajoče)', 143 | 'title_desc' => 'Naslov (padajoče)', 144 | 'created_asc' => 'Ustvarjeno (naraščajoče)', 145 | 'created_desc' => 'Ustvarjeno (padajoče)', 146 | 'updated_asc' => 'Posodobljeno (naraščajoče)', 147 | 'updated_desc' => 'Posodobljeno (padajoče)', 148 | 'published_asc' => 'Objavljeno (naraščajoče)', 149 | 'published_desc' => 'Objavljeno (padajoče)', 150 | 'random' => 'Naključno', 151 | ], 152 | 'import' => [ 153 | 'update_existing_label' => 'Posodobi obstoječe objave', 154 | 'update_existing_comment' => 'Označite kvadratek, če želite posodobiti objave, ki imajo popolnoma enak ID, naslov ali povezavo.', 155 | 'auto_create_categories_label' => 'Ustvari kategorije, določene v uvozni datoteki', 156 | 'auto_create_categories_comment' => "Za uporabo te možnosti morate ali povezati stolpec 'Kategorije' ali pa označiti privzete kategorije za uporabo iz spodnjega seznama.", 157 | 'categories_label' => 'Kategorije', 158 | 'categories_comment' => 'Izberite kategorije, na katere bodo povezavne uvožene objave (neobvezno).', 159 | 'default_author_label' => 'Privzeti avtor objave (neobvezno)', 160 | 'default_author_comment' => "Uvoz bo poskusil uporabiti obstoječega avtorja, če povežete stolpec 'E-pošta avtorja', sicer se bo uporabil zgoraj navedeni avtor.", 161 | 'default_author_placeholder' => '-- izberite avtorja --', 162 | ], 163 | ]; 164 | -------------------------------------------------------------------------------- /lang/zh-cn/lang.php: -------------------------------------------------------------------------------- 1 | [ 5 | 'name' => '博客', 6 | 'description' => '一个强大的博客平台.', 7 | ], 8 | 'blog' => [ 9 | 'menu_label' => '博客', 10 | 'menu_description' => '管理博客帖子', 11 | 'posts' => '帖子', 12 | 'create_post' => '博客帖子', 13 | 'categories' => '分类', 14 | 'create_category' => '博客分类', 15 | 'tab' => '博客', 16 | 'access_posts' => '管理博客帖子', 17 | 'access_categories' => '管理博客分类', 18 | 'access_other_posts' => '管理其他用户帖子', 19 | 'access_import_export' => '允许导入和导出', 20 | 'access_publish' => '允许发布帖子', 21 | 'delete_confirm' => '你确定?', 22 | 'chart_published' => '已发布', 23 | 'chart_drafts' => '草稿', 24 | 'chart_total' => '总数', 25 | ], 26 | 'posts' => [ 27 | 'list_title' => '管理博客帖子', 28 | 'filter_category' => '分类', 29 | 'filter_published' => '发布', 30 | 'filter_date' => '日期', 31 | 'new_post' => '创建帖子', 32 | 'export_post' => '导出帖子', 33 | 'import_post' => '导入帖子', 34 | ], 35 | 'post' => [ 36 | 'title' => '标题', 37 | 'title_placeholder' => '新帖子标题', 38 | 'content' => '内容', 39 | 'content_html' => 'HTML 内容', 40 | 'slug' => '别名', 41 | 'slug_placeholder' => 'new-post-slug', 42 | 'categories' => '分类', 43 | 'author_email' => '作者邮箱', 44 | 'created' => '创建时间', 45 | 'created_date' => '创建日期', 46 | 'updated' => '更新时间', 47 | 'updated_date' => '更新日期', 48 | 'published' => '发布时间', 49 | 'published_date' => '发布日期', 50 | 'published_validation' => '请指定发布日期', 51 | 'tab_edit' => '编辑', 52 | 'tab_categories' => '分类', 53 | 'categories_comment' => '选择帖子属于那个分类', 54 | 'categories_placeholder' => '没有分类,你应该先创建一个分类!', 55 | 'tab_manage' => '管理', 56 | 'published_on' => '发布于', 57 | 'excerpt' => '摘录', 58 | 'summary' => '总结', 59 | 'featured_images' => '特色图片', 60 | 'delete_confirm' => '确定删除该帖子?', 61 | 'close_confirm' => '该帖子未保存.', 62 | 'return_to_posts' => '返回帖子列表', 63 | ], 64 | 'categories' => [ 65 | 'list_title' => '管理博客分类', 66 | 'new_category' => '新分类', 67 | 'uncategorized' => '未分类', 68 | ], 69 | 'category' => [ 70 | 'name' => '名称', 71 | 'name_placeholder' => '新分类名称', 72 | 'description' => '描述', 73 | 'slug' => '别名', 74 | 'slug_placeholder' => 'new-category-slug', 75 | 'posts' => '帖子', 76 | 'delete_confirm' => '确定删除分类?', 77 | 'return_to_categories' => '返回博客分类列表', 78 | 'reorder' => '重新排序分类', 79 | ], 80 | 'menuitem' => [ 81 | 'blog_category' => '博客分类', 82 | 'all_blog_categories' => '所有博客分类', 83 | 'blog_post' => '博客帖子', 84 | 'all_blog_posts' => '所有博客帖子', 85 | ], 86 | 'settings' => [ 87 | 'category_title' => '分类列表', 88 | 'category_description' => '在页面上显示帖子分类列表.', 89 | 'category_slug' => '分类别名', 90 | 'category_slug_description' => "用分类别名查找博客分类. 该值被默认组件的partial用来激活当前分类.", 91 | 'category_display_empty' => '显示空的分类', 92 | 'category_display_empty_description' => '显示没有帖子的分类.', 93 | 'category_page' => '分类页', 94 | 'category_page_description' => '用来生成分类链接的分类页面文件名称. 该属性被默认组件partial所使用.', 95 | 'post_title' => '帖子', 96 | 'post_description' => '在页面上显示博客帖子.', 97 | 'post_slug' => '帖子别名', 98 | 'post_slug_description' => "用帖子别名查找博客帖子.", 99 | 'post_category' => '分类页', 100 | 'post_category_description' => '用来生成分类链接的分类页面文件名称. 该属性被默认组件partial所使用.', 101 | 'posts_title' => '帖子列表', 102 | 'posts_description' => '在页面上显示最近发布的博客帖子列表.', 103 | 'posts_pagination' => '页数', 104 | 'posts_pagination_description' => '该值用来判定用户所在页面.', 105 | 'posts_filter' => '过滤分类', 106 | 'posts_filter_description' => '输入分类的别名(slug)或者URL参数来过滤帖子. 留空显示所有帖子.', 107 | 'posts_per_page' => '每页帖子数', 108 | 'posts_per_page_validation' => '每一页帖子数量的值的格式错误', 109 | 'posts_no_posts' => '没有帖子的消息', 110 | 'posts_no_posts_description' => '如果博客帖子列表中一个帖子都没有要显示的提示消息. 该属性被默认组件partial所使用.', 111 | 'posts_order' => '帖子排序', 112 | 'posts_order_description' => '帖子排序的属性', 113 | 'posts_category' => '分类页', 114 | 'posts_category_description' => '用来生成"发布到"分类链接的分类页文件名称. 该属性被默认组件partial所使用.', 115 | 'posts_post' => '帖子页', 116 | 'posts_post_description' => ' 查看帖子的"详情"的页面文件. 该属性被默认组件partial所使用.', 117 | 'posts_except_post' => '排除的帖子', 118 | 'posts_except_post_description' => '输入帖子的ID/URL或者变量来排除你不想看见的帖子', 119 | 'rssfeed_blog' => '博客页面', 120 | 'rssfeed_blog_description' => '生成博客帖子首页面文件名称. 该属性被默认组件partial所使用.', 121 | 'rssfeed_title' => 'RSS Feed', 122 | 'rssfeed_description' => '从博客生成一个包含帖子的RSS Feed.', 123 | ], 124 | ]; 125 | -------------------------------------------------------------------------------- /models/PostExport.php: -------------------------------------------------------------------------------- 1 | [ 19 | 'Backend\Models\User', 20 | 'key' => 'user_id', 21 | ], 22 | ]; 23 | 24 | public $belongsToMany = [ 25 | 'post_categories' => [ 26 | 'Winter\Blog\Models\Category', 27 | 'table' => 'winter_blog_posts_categories', 28 | 'key' => 'post_id', 29 | 'otherKey' => 'category_id', 30 | ], 31 | ]; 32 | 33 | public $hasMany = [ 34 | 'featured_images' => [ 35 | 'System\Models\File', 36 | 'order' => 'sort_order', 37 | 'key' => 'attachment_id', 38 | 'conditions' => "field = 'featured_images' AND attachment_type = 'Winter\\\\Blog\\\\Models\\\\Post'", 39 | ], 40 | ]; 41 | 42 | /** 43 | * The accessors to append to the model's array form. 44 | * @var array 45 | */ 46 | protected $appends = [ 47 | 'author_email', 48 | 'categories', 49 | 'featured_image_urls', 50 | ]; 51 | 52 | public function exportData($columns, $sessionKey = null) 53 | { 54 | $result = self::make() 55 | ->with([ 56 | 'post_user', 57 | 'post_categories', 58 | 'featured_images', 59 | ]) 60 | ->get() 61 | ->toArray() 62 | ; 63 | 64 | return $result; 65 | } 66 | 67 | public function getAuthorEmailAttribute() 68 | { 69 | if (!$this->post_user) { 70 | return ''; 71 | } 72 | 73 | return $this->post_user->email; 74 | } 75 | 76 | public function getCategoriesAttribute() 77 | { 78 | if (!$this->post_categories) { 79 | return ''; 80 | } 81 | 82 | return $this->encodeArrayValue($this->post_categories->lists('name')); 83 | } 84 | 85 | public function getFeaturedImageUrlsAttribute() 86 | { 87 | if (!$this->featured_images) { 88 | return ''; 89 | } 90 | 91 | return $this->encodeArrayValue($this->featured_images->map(function ($image) { 92 | return $image->getPath(); 93 | })); 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /models/PostImport.php: -------------------------------------------------------------------------------- 1 | 'required', 22 | 'content' => 'required', 23 | ]; 24 | 25 | protected $authorEmailCache = []; 26 | 27 | protected $categoryNameCache = []; 28 | 29 | public function getDefaultAuthorOptions() 30 | { 31 | return AuthorModel::all()->lists('full_name', 'email'); 32 | } 33 | 34 | public function getCategoriesOptions() 35 | { 36 | return Category::lists('name', 'id'); 37 | } 38 | 39 | public function importData($results, $sessionKey = null) 40 | { 41 | $firstRow = reset($results); 42 | 43 | /* 44 | * Validation 45 | */ 46 | if ($this->auto_create_categories && !array_key_exists('categories', $firstRow)) { 47 | throw new ApplicationException('Please specify a match for the Categories column.'); 48 | } 49 | 50 | /* 51 | * Import 52 | */ 53 | foreach ($results as $row => $data) { 54 | try { 55 | if (!$title = array_get($data, 'title')) { 56 | $this->logSkipped($row, 'Missing post title'); 57 | continue; 58 | } 59 | 60 | /* 61 | * Find or create 62 | */ 63 | $post = Post::make(); 64 | 65 | if ($this->update_existing) { 66 | $post = $this->findDuplicatePost($data) ?: $post; 67 | } 68 | 69 | $postExists = $post->exists; 70 | 71 | /* 72 | * Set attributes 73 | */ 74 | $except = ['id', 'categories', 'author_email']; 75 | 76 | foreach (array_except($data, $except) as $attribute => $value) { 77 | if (in_array($attribute, $post->getDates()) && empty($value)) { 78 | continue; 79 | } 80 | $post->{$attribute} = isset($value) ? $value : null; 81 | } 82 | 83 | if ($author = $this->findAuthorFromEmail($data)) { 84 | $post->user_id = $author->id; 85 | } 86 | 87 | $post->forceSave(); 88 | 89 | if ($categoryIds = $this->getCategoryIdsForPost($data)) { 90 | $post->categories()->sync($categoryIds, false); 91 | } 92 | 93 | /* 94 | * Log results 95 | */ 96 | if ($postExists) { 97 | $this->logUpdated(); 98 | } else { 99 | $this->logCreated(); 100 | } 101 | } catch (Exception $ex) { 102 | $this->logError($row, $ex->getMessage()); 103 | } 104 | } 105 | } 106 | 107 | protected function findAuthorFromEmail($data) 108 | { 109 | if (!$email = array_get($data, 'email', $this->default_author)) { 110 | return null; 111 | } 112 | 113 | if (isset($this->authorEmailCache[$email])) { 114 | return $this->authorEmailCache[$email]; 115 | } 116 | 117 | $author = AuthorModel::where('email', $email)->first(); 118 | return $this->authorEmailCache[$email] = $author; 119 | } 120 | 121 | protected function findDuplicatePost($data) 122 | { 123 | if ($id = array_get($data, 'id')) { 124 | return Post::find($id); 125 | } 126 | 127 | $title = array_get($data, 'title'); 128 | $post = Post::where('title', $title); 129 | 130 | if ($slug = array_get($data, 'slug')) { 131 | $post->orWhere('slug', $slug); 132 | } 133 | 134 | return $post->first(); 135 | } 136 | 137 | protected function getCategoryIdsForPost($data) 138 | { 139 | $ids = []; 140 | 141 | if ($this->auto_create_categories) { 142 | $categoryNames = $this->decodeArrayValue(array_get($data, 'categories')); 143 | 144 | foreach ($categoryNames as $name) { 145 | if (!$name = trim($name)) { 146 | continue; 147 | } 148 | 149 | if (isset($this->categoryNameCache[$name])) { 150 | $ids[] = $this->categoryNameCache[$name]; 151 | } else { 152 | $newCategory = Category::firstOrCreate(['name' => $name]); 153 | $ids[] = $this->categoryNameCache[$name] = $newCategory->id; 154 | } 155 | } 156 | } elseif ($this->categories) { 157 | $ids = (array) $this->categories; 158 | } 159 | 160 | return $ids; 161 | } 162 | } 163 | -------------------------------------------------------------------------------- /models/Settings.php: -------------------------------------------------------------------------------- 1 | ['boolean'], 19 | ]; 20 | } 21 | -------------------------------------------------------------------------------- /models/category/columns.yaml: -------------------------------------------------------------------------------- 1 | # =================================== 2 | # Column Definitions 3 | # =================================== 4 | 5 | columns: 6 | 7 | name: 8 | label: winter.blog::lang.category.name 9 | searchable: true 10 | 11 | post_count: 12 | label: winter.blog::lang.category.posts 13 | sortable: false 14 | -------------------------------------------------------------------------------- /models/category/fields.yaml: -------------------------------------------------------------------------------- 1 | # =================================== 2 | # Field Definitions 3 | # =================================== 4 | 5 | fields: 6 | 7 | name: 8 | label: winter.blog::lang.category.name 9 | placeholder: winter.blog::lang.category.name_placeholder 10 | span: left 11 | 12 | slug: 13 | label: winter.blog::lang.category.slug 14 | span: right 15 | placeholder: winter.blog::lang.category.slug_placeholder 16 | preset: name 17 | 18 | description: 19 | label: 'winter.blog::lang.category.description' 20 | size: large 21 | span: full 22 | type: textarea 23 | -------------------------------------------------------------------------------- /models/post/columns.yaml: -------------------------------------------------------------------------------- 1 | # =================================== 2 | # Column Definitions 3 | # =================================== 4 | 5 | columns: 6 | 7 | title: 8 | label: winter.blog::lang.post.title 9 | searchable: true 10 | 11 | # author: 12 | # label: Author 13 | # relation: user 14 | # select: login 15 | # searchable: true 16 | 17 | categories: 18 | label: winter.blog::lang.post.categories 19 | relation: categories 20 | select: name 21 | searchable: true 22 | sortable: false 23 | 24 | created_at: 25 | label: winter.blog::lang.post.created 26 | type: date 27 | invisible: true 28 | 29 | updated_at: 30 | label: winter.blog::lang.post.updated 31 | type: date 32 | invisible: true 33 | 34 | published_at: 35 | label: winter.blog::lang.post.published 36 | type: date 37 | -------------------------------------------------------------------------------- /models/post/fields.yaml: -------------------------------------------------------------------------------- 1 | # =================================== 2 | # Field Definitions 3 | # =================================== 4 | 5 | fields: 6 | 7 | title: 8 | label: winter.blog::lang.post.title 9 | span: left 10 | placeholder: winter.blog::lang.post.title_placeholder 11 | 12 | slug: 13 | label: winter.blog::lang.post.slug 14 | span: right 15 | placeholder: winter.blog::lang.post.slug_placeholder 16 | preset: 17 | field: title 18 | type: slug 19 | 20 | toolbar: 21 | type: partial 22 | cssClass: collapse-visible 23 | 24 | tabs: 25 | stretch: true 26 | cssClass: master-area 27 | paneCssClass: 28 | 0: pane-compact 29 | icons: 30 | winter.blog::lang.post.tab_edit: icon-pencil 31 | winter.blog::lang.post.tab_categories: icon-tags 32 | winter.blog::lang.post.tab_manage: icon-cog 33 | fields: 34 | content: 35 | tab: winter.blog::lang.post.tab_edit 36 | type: Winter\Blog\FormWidgets\BlogMarkdown 37 | cssClass: field-slim blog-post-preview 38 | stretch: true 39 | mode: split 40 | 41 | categories: 42 | tab: winter.blog::lang.post.tab_categories 43 | type: relation 44 | commentAbove: winter.blog::lang.post.categories_comment 45 | placeholder: winter.blog::lang.post.categories_placeholder 46 | 47 | published: 48 | tab: winter.blog::lang.post.tab_manage 49 | label: winter.blog::lang.post.published 50 | span: left 51 | type: checkbox 52 | 53 | user: 54 | tab: winter.blog::lang.post.tab_manage 55 | label: winter.blog::lang.post.published_by 56 | span: right 57 | type: relation 58 | nameFrom: login 59 | emptyOption: winter.blog::lang.post.current_user 60 | 61 | published_at: 62 | tab: winter.blog::lang.post.tab_manage 63 | label: winter.blog::lang.post.published_on 64 | span: left 65 | type: datepicker 66 | mode: datetime 67 | trigger: 68 | action: enable 69 | field: published 70 | condition: checked 71 | 72 | metadata[preview_page]: 73 | tab: winter.blog::lang.post.tab_manage 74 | label: winter.blog::lang.post.preview_page 75 | commentAbove: winter.blog::lang.post.preview_page_comment 76 | span: auto 77 | type: dropdown 78 | options: getCmsPageOptions 79 | 80 | excerpt: 81 | tab: winter.blog::lang.post.tab_manage 82 | label: winter.blog::lang.post.excerpt 83 | type: textarea 84 | size: small 85 | 86 | featured_images: 87 | tab: winter.blog::lang.post.tab_manage 88 | label: winter.blog::lang.post.featured_images 89 | type: fileupload 90 | mode: image 91 | imageWidth: 200 92 | imageHeight: 200 93 | -------------------------------------------------------------------------------- /models/postexport/columns.yaml: -------------------------------------------------------------------------------- 1 | # =================================== 2 | # Column Definitions 3 | # =================================== 4 | 5 | columns: 6 | 7 | id: ID 8 | title: winter.blog::lang.post.title 9 | content: winter.blog::lang.post.content 10 | content_html: winter.blog::lang.post.content_html 11 | excerpt: winter.blog::lang.post.excerpt 12 | slug: winter.blog::lang.post.slug 13 | categories: winter.blog::lang.post.categories 14 | author_email: winter.blog::lang.post.author_email 15 | featured_image_urls: winter.blog::lang.post.featured_images 16 | created_at: winter.blog::lang.post.created_date 17 | updated_at: winter.blog::lang.post.updated_date 18 | published: winter.blog::lang.post.published 19 | published_at: winter.blog::lang.post.published_date 20 | -------------------------------------------------------------------------------- /models/postimport/columns.yaml: -------------------------------------------------------------------------------- 1 | # =================================== 2 | # Column Definitions 3 | # =================================== 4 | 5 | columns: 6 | 7 | id: ID 8 | title: winter.blog::lang.post.title 9 | content: winter.blog::lang.post.content 10 | excerpt: winter.blog::lang.post.excerpt 11 | slug: winter.blog::lang.post.slug 12 | categories: winter.blog::lang.post.categories 13 | author_email: winter.blog::lang.post.author_email 14 | created_at: winter.blog::lang.post.created_date 15 | updated_at: winter.blog::lang.post.updated_date 16 | published: winter.blog::lang.post.published 17 | published_at: winter.blog::lang.post.published_date 18 | -------------------------------------------------------------------------------- /models/postimport/fields.yaml: -------------------------------------------------------------------------------- 1 | # =================================== 2 | # Form Field Definitions 3 | # =================================== 4 | 5 | fields: 6 | 7 | update_existing: 8 | label: winter.blog::lang.import.update_existing_label 9 | comment: winter.blog::lang.import.update_existing_comment 10 | type: checkbox 11 | default: true 12 | span: left 13 | 14 | auto_create_categories: 15 | label: winter.blog::lang.import.auto_create_categories_label 16 | comment: winter.blog::lang.import.auto_create_categories_comment 17 | type: checkbox 18 | default: true 19 | span: right 20 | 21 | categories: 22 | label: winter.blog::lang.import.categories_label 23 | commentAbove: winter.blog::lang.import.categories_comment 24 | type: checkboxlist 25 | span: right 26 | cssClass: field-indent 27 | trigger: 28 | action: hide 29 | field: auto_create_categories 30 | condition: checked 31 | 32 | default_author: 33 | label: winter.blog::lang.import.default_author_label 34 | comment: winter.blog::lang.import.default_author_comment 35 | type: dropdown 36 | placeholder: winter.blog::lang.import.default_author_placeholder 37 | span: left 38 | -------------------------------------------------------------------------------- /models/settings/fields.yaml: -------------------------------------------------------------------------------- 1 | tabs: 2 | fields: 3 | show_all_posts: 4 | span: left 5 | label: winter.blog::lang.blog.show_all_posts_label 6 | comment: winter.blog::lang.blog.show_all_posts_comment 7 | type: switch 8 | default: 1 9 | tab: winter.blog::lang.blog.tab_general 10 | use_rich_editor: 11 | span: left 12 | label: winter.blog::lang.blog.use_rich_editor_label 13 | comment: winter.blog::lang.blog.use_rich_editor_comment 14 | type: switch 15 | default: 0 16 | tab: winter.blog::lang.blog.tab_general 17 | -------------------------------------------------------------------------------- /traits/Urlable.php: -------------------------------------------------------------------------------- 1 | getTheme(), $pageName); 28 | if (!$cmsPage) { 29 | return null; 30 | } 31 | 32 | $params = array_merge($this->getUrlParams($cmsPage), $extraParams); 33 | 34 | return $this->url = $controller->pageUrl($pageName, $params, false); 35 | } 36 | 37 | /** 38 | * Get the URL parameters for this record, optionally using the provided CMS page. 39 | */ 40 | public function getUrlParams(?CmsPage $page = null): array 41 | { 42 | return $this->toArray(); 43 | } 44 | 45 | /** 46 | * Get the URL to this record, optionally using the provided CMS page. 47 | */ 48 | public function getUrl(?CmsPage $page = null): ?string 49 | { 50 | $params = $this->getUrlParams($page); 51 | 52 | return CmsPage::url($page->getBaseFileName(), $params); 53 | } 54 | 55 | /** 56 | * Get the localized URL to this record, optionally using the provided CMS page. 57 | */ 58 | public function getLocalizedUrl(string $locale, ?CmsPage $page = null): ?string 59 | { 60 | $translator = Translator::instance(); 61 | 62 | $localRecord = clone $this; 63 | $localRecord->translateContext($locale); 64 | 65 | $localeUrl = $page->getViewBagUrlAttributeTranslated($locale) ?: $page->url; 66 | 67 | $params = $localRecord->getUrlParams($page); 68 | $url = $translator->getPathInLocale($localeUrl, $locale); 69 | 70 | return (new Router())->urlFromPattern($url, $params); 71 | } 72 | 73 | /** 74 | * Get the localized URLs to this record 75 | */ 76 | public function getLocalizedUrls(?CmsPage $page = null, bool $absolute = true): array 77 | { 78 | $localizedUrls = []; 79 | $enabledLocales = class_exists(Locale::class) ? Locale::listEnabled() : []; 80 | 81 | foreach ($enabledLocales as $locale => $name) { 82 | $url = $this->getLocalizedUrl($locale, $page); 83 | 84 | if ($absolute) { 85 | $url = Url::to($url); 86 | } 87 | 88 | $localizedUrls[$locale] = $url; 89 | } 90 | 91 | return $localizedUrls; 92 | } 93 | 94 | /** 95 | * Helper method to get a URL parameter name from a component property on a CMS page. 96 | */ 97 | protected function getParamNameFromComponentProperty(CmsPage $page, string $componentName, string $propertyName): ?string 98 | { 99 | $properties = $page->getComponentProperties($componentName); 100 | if (!isset($properties[$propertyName])) { 101 | return null; 102 | } 103 | 104 | /* 105 | * Extract the routing parameter name from the category filter 106 | * eg: {{ :someRouteParam }} 107 | */ 108 | if (!preg_match('/^\{\{([^\}]+)\}\}$/', $properties[$propertyName], $matches)) { 109 | return null; 110 | } 111 | 112 | $paramName = substr(trim($matches[1]), 1) ?? null; 113 | 114 | return $paramName; 115 | } 116 | } 117 | -------------------------------------------------------------------------------- /updates/v1.0.1/create_categories_table.php: -------------------------------------------------------------------------------- 1 | engine = 'InnoDB'; 14 | $table->increments('id'); 15 | $table->string('name')->nullable(); 16 | $table->string('slug')->nullable()->index(); 17 | $table->string('code')->nullable(); 18 | $table->text('description')->nullable(); 19 | $table->integer('parent_id')->unsigned()->index()->nullable(); 20 | $table->integer('nest_left')->nullable(); 21 | $table->integer('nest_right')->nullable(); 22 | $table->integer('nest_depth')->nullable(); 23 | $table->timestamps(); 24 | }); 25 | 26 | Schema::create('rainlab_blog_posts_categories', function ($table) { 27 | $table->engine = 'InnoDB'; 28 | $table->integer('post_id')->unsigned(); 29 | $table->integer('category_id')->unsigned(); 30 | $table->primary(['post_id', 'category_id']); 31 | }); 32 | } 33 | 34 | public function down() 35 | { 36 | Schema::dropIfExists('rainlab_blog_categories'); 37 | Schema::dropIfExists('rainlab_blog_posts_categories'); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /updates/v1.0.1/create_posts_table.php: -------------------------------------------------------------------------------- 1 | engine = 'InnoDB'; 14 | $table->increments('id'); 15 | $table->integer('user_id')->unsigned()->nullable()->index(); 16 | $table->string('title')->nullable(); 17 | $table->string('slug')->index(); 18 | $table->text('excerpt')->nullable(); 19 | $table->longText('content')->nullable(); 20 | $table->longText('content_html')->nullable(); 21 | $table->timestamp('published_at')->nullable(); 22 | $table->boolean('published')->default(false); 23 | $table->timestamps(); 24 | }); 25 | } 26 | 27 | public function down() 28 | { 29 | Schema::dropIfExists('rainlab_blog_posts'); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /updates/v1.0.1/seed_all_tables.php: -------------------------------------------------------------------------------- 1 | setTable('rainlab_blog_posts'); 16 | }); 17 | 18 | Post::create([ 19 | 'title' => 'First blog post', 20 | 'slug' => 'first-blog-post', 21 | 'content' => ' 22 | This is your first ever **blog post**! It might be a good idea to update this post with some more relevant content. 23 | 24 | You can edit this content by selecting **Blog** from the administration back-end menu. 25 | 26 | *Enjoy the good times!* 27 | ', 28 | 'excerpt' => 'The first ever blog post is here. It might be a good idea to update this post with some more relevant content.', 29 | 'published_at' => Carbon::now(), 30 | 'published' => true, 31 | ]); 32 | 33 | Category::extend(function ($model) { 34 | $model->setTable('rainlab_blog_categories'); 35 | }); 36 | 37 | Category::create([ 38 | 'name' => trans('winter.blog::lang.categories.uncategorized'), 39 | 'slug' => 'uncategorized', 40 | ]); 41 | 42 | Post::extend(function ($model) { 43 | $model->setTable('winter_blog_posts'); 44 | }); 45 | 46 | Category::extend(function ($model) { 47 | $model->setTable('winter_blog_categories'); 48 | }); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /updates/v1.2.0/categories_add_nested_fields.php: -------------------------------------------------------------------------------- 1 | integer('parent_id')->unsigned()->index()->nullable(); 19 | $table->integer('nest_left')->nullable(); 20 | $table->integer('nest_right')->nullable(); 21 | $table->integer('nest_depth')->nullable(); 22 | }); 23 | 24 | Category::extend(function ($model) { 25 | $model->setTable('rainlab_blog_categories'); 26 | }); 27 | 28 | foreach (Category::all() as $category) { 29 | $category->setDefaultLeftAndRight(); 30 | $category->save(); 31 | } 32 | 33 | Category::extend(function ($model) { 34 | $model->setTable('winter_blog_categories'); 35 | }); 36 | } 37 | 38 | public function down() 39 | { 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /updates/v1.2.4/update_timestamp_nullable.php: -------------------------------------------------------------------------------- 1 | mediumText('metadata')->nullable(); 18 | }); 19 | } 20 | 21 | public function down() 22 | { 23 | if (Schema::hasColumn('rainlab_blog_posts', 'metadata')) { 24 | Schema::table('rainlab_blog_posts', function ($table) { 25 | $table->dropColumn('metadata'); 26 | }); 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /updates/v2.0.0/rename_tables.php: -------------------------------------------------------------------------------- 1 | where('attachment_type', 'RainLab\Blog\Models\Post')->update(['attachment_type' => 'Winter\Blog\Models\Post']); 29 | Db::table('system_settings')->where('item', 'rainlab_blog_settings')->update(['item' => 'winter_blog_settings']); 30 | } 31 | 32 | public function down() 33 | { 34 | foreach (self::TABLES as $table) { 35 | $from = 'winter_blog_' . $table; 36 | $to = 'rainlab_blog_' . $table; 37 | 38 | if (Schema::hasTable($from) && !Schema::hasTable($to)) { 39 | Schema::rename($from, $to); 40 | } 41 | } 42 | 43 | Db::table('system_files')->where('attachment_type', 'Winter\Blog\Models\Post')->update(['attachment_type' => 'RainLab\Blog\Models\Post']); 44 | Db::table('system_settings')->where('item', 'winter_blog_settings')->update(['item' => 'rainlab_blog_settings']); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /updates/v2.0.1/fix_translate_records.php: -------------------------------------------------------------------------------- 1 | fix_records('RainLab', 'Winter'); 19 | } 20 | 21 | public function down() 22 | { 23 | $this->fix_records('Winter', 'RainLab'); 24 | } 25 | 26 | public function fix_records($from, $to) 27 | { 28 | $tables = ['indexes', 'attributes']; 29 | 30 | if (Schema::hasTable('rainlab_translate_indexes')) { 31 | $tables = preg_filter('/^/', 'rainlab_translate_', $tables); 32 | } elseif (Schema::hasTable('rainlab_translate_indexes')) { 33 | $tables = preg_filter('/^/', 'rainlab_translate_', $tables); 34 | } else { 35 | return; 36 | } 37 | 38 | foreach ($tables as $table) { 39 | foreach (self::MODELS as $model) { 40 | $fromModel = $from . '\\Blog\\Models\\' . $model; 41 | $toModel = $to . '\\Blog\\Models\\' . $model; 42 | Db::table($table) 43 | ->where('model_type', $fromModel) 44 | ->update(['model_type' => $toModel]); 45 | } 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /updates/v2.0.1/rename_indexes.php: -------------------------------------------------------------------------------- 1 | updateIndexNames($from, $to, $to); 23 | } 24 | } 25 | 26 | public function down() 27 | { 28 | foreach (self::TABLES as $table) { 29 | $from = 'winter_blog_' . $table; 30 | $to = 'rainlab_blog_' . $table; 31 | 32 | $this->updateIndexNames($from, $to, $from); 33 | } 34 | } 35 | 36 | public function updateIndexNames($from, $to, $table) 37 | { 38 | Schema::table($table, function ($blueprint) use ($from, $to) { 39 | foreach ($this->getIndexes($blueprint) as $index) { 40 | if (is_object($index) ? $index->isPrimary() : $index['primary']) { 41 | continue; 42 | } 43 | 44 | $old = is_object($index) ? $index->getName() : $index['name']; 45 | $new = str_replace($from, $to, $old); 46 | 47 | $blueprint->renameIndex($old, $new); 48 | } 49 | }); 50 | } 51 | 52 | public function getIndexes($blueprint) 53 | { 54 | $connection = Schema::getConnection(); 55 | $table = $blueprint->getTable(); 56 | 57 | if (method_exists($connection, 'getDoctrineSchemaManager')) { 58 | $sm = $connection->getDoctrineSchemaManager(); 59 | return $sm->listTableDetails($table)->getIndexes(); 60 | } else { 61 | return $connection->getSchemaBuilder()->getIndexes($table); 62 | } 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /updates/version.yaml: -------------------------------------------------------------------------------- 1 | "1.0.1": 2 | - Initialize plugin. 3 | - v1.0.1/create_posts_table.php 4 | - v1.0.1/create_categories_table.php 5 | - v1.0.1/seed_all_tables.php 6 | "1.0.2": Added the processed HTML content column to the posts table. 7 | "1.0.3": Category component has been merged with Posts component. 8 | "1.0.4": Improvements to the Posts list management UI. 9 | "1.0.5": Removes the Author column from blog post list. 10 | "1.0.6": Featured images now appear in the Post component. 11 | "1.0.7": Added support for the Static Pages menus. 12 | "1.0.8": Added total posts to category list. 13 | "1.0.9": Added support for the Sitemap plugin. 14 | "1.0.10": Added permission to prevent users from seeing posts they did not create. 15 | "1.0.11": 'Deprecate "idParam" component property in favour of "slug" property.' 16 | "1.0.12": Fixes issue where images cannot be uploaded caused by latest Markdown library. 17 | "1.0.13": Fixes problem with providing pages to Sitemap and Pages plugins. 18 | "1.0.14": Add support for CSRF protection feature added to core. 19 | "1.1.0": Replaced the Post editor with the new core Markdown editor. 20 | "1.1.1": Posts can now be imported and exported. 21 | "1.1.2": Posts are no longer visible if the published date has not passed. 22 | "1.1.3": Added a New Post shortcut button to the blog menu. 23 | "1.2.0": 24 | - Categories now support nesting. 25 | - v1.2.0/categories_add_nested_fields.php 26 | "1.2.1": Post slugs now must be unique. 27 | "1.2.2": Fixes issue on new installs. 28 | "1.2.3": Minor user interface update. 29 | "1.2.4": 30 | - Database maintenance. Updated all timestamp columns to be nullable. 31 | - v1.2.4/update_timestamp_nullable.php 32 | "1.2.5": Added translation support for blog posts. 33 | "1.2.6": The published field can now supply a time with the date. 34 | "1.2.7": Introduced a new RSS feed component. 35 | "1.2.8": Fixes issue with translated `content_html` attribute on blog posts. 36 | "1.2.9": Added translation support for blog categories. 37 | "1.2.10": Added translation support for post slugs. 38 | "1.2.11": Fixes bug where excerpt is not translated. 39 | "1.2.12": Description field added to category form. 40 | "1.2.13": Improved support for Static Pages menus, added a blog post and all blog posts. 41 | "1.2.14": Added post exception property to the post list component, useful for showing related posts. 42 | "1.2.15": Back-end navigation sort order updated. 43 | "1.2.16": Added `nextPost` and `previousPost` to the blog post component. 44 | "1.2.17": Improved the next and previous logic to sort by the published date. 45 | "1.2.18": Minor change to internals. 46 | "1.2.19": Improved support for Build 420+ 47 | "1.3.0": 48 | - Added metadata column for plugins to store data in 49 | - v1.3.0/posts_add_metadata.php 50 | "1.3.1": Fixed metadata column not being jsonable 51 | "1.3.2": Allow custom slug name for components, add 404 handling for missing blog posts, allow exporting of blog images. 52 | "1.3.3": Fixed 'excluded categories' filter from being run when value is empty. 53 | "1.3.4": Allow post author to be specified. Improved translations. 54 | "1.3.5": Fixed missing user info from breaking initial seeder in migrations. Fixed a PostgreSQL issue with blog exports. 55 | "1.3.6": Improved French translations. 56 | "1.4.0": Stability improvements. Rollback custom slug names for components 57 | "1.4.1": Fixes potential security issue with unsafe Markdown. Allow blog bylines to be translated. 58 | "1.4.2": Fix 404 redirects for missing blog posts. Assign current category to the listed posts when using the Posts component on a page with the category parameter available. 59 | "1.4.3": Fixes incompatibility with locale switching when plugin is used in conjunction with the Translate plugin. Fixes undefined category error. 60 | "1.4.4": Rollback translated bylines, please move or override the default component markup instead. 61 | "1.5.0": Implement support for October CMS v2.0 62 | "2.0.0": 63 | - Rebrand to Winter.Blog 64 | - v2.0.0/rename_tables.php 65 | "2.0.1": 66 | - Rebrand table indexes 67 | - Add migrations for translate plugin attributes and indexes tables 68 | - v2.0.1/rename_indexes.php 69 | - v2.0.1/fix_translate_records.php 70 | "2.0.2": Fixes issue where images could not be uploaded directly to the Markdown editor. 71 | "2.1.0": 72 | - "Added Vietnamese translation" 73 | - "Added support for default Editor & Developer roles" 74 | - "Added button to go directly to the frontend preview page for a post from the backend" 75 | - "Added 🔒 icon to unpublished post titles in the frontend to identify when a post isn't visible to the public" 76 | - "Added is_published attribute accessor on the Post model" 77 | - "Added support for paginating the RSSFeed component" 78 | "2.1.1": "Bumped version of RainLab.Blog replaced by Winter.Blog to v1.7." 79 | "2.1.2": 80 | - "Add multilang data to resolveMenuItem() methods." 81 | - "Move blog post form fields to primary tabs." 82 | "2.1.3": 83 | - "Fixed issue with type hints on Category and Post components that threw an exception if no category or post was available." 84 | - "Honor prefixDefaultLocale to improve support with the Translate plugin" 85 | - "Revert to default locale url when url is missing for an alternate locale" 86 | - "Correction of grammatical error in ES translations" 87 | "2.1.4": 88 | - "Improve seo support for posts root page" 89 | - "Added post author to default markup as an example" 90 | - "Added richeditor option to blog post" 91 | - "Added missing translations, remove duplicate ones" 92 | - "Use Font Awesome 6 font family" 93 | - "Fix Cms/Classes not found when CMS module isn't loaded in config/cms.php" 94 | "2.2.0": 95 | - "Use new controller behavior default views provided by Winter v1.2.8+" 96 | - "Improve support with the Winter.Translate plugin" 97 | --------------------------------------------------------------------------------