├── .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 | '|\
]*)\/>|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 |
--------------------------------------------------------------------------------
/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\n')
33 |
34 | $button.on('click', function() {
35 | $button.data('button-template', '\n\n\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('', {
91 | needle: ''
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 |
3 | {% partial __SELF__ ~ "::items"
4 | categories = __SELF__.categories
5 | currentCategorySlug = __SELF__.currentCategorySlug
6 | %}
7 |
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 |
7 | {% for image in post.featured_images %}
8 |
9 |
14 |
15 | {% endfor %}
16 |
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 |
4 | {% for post in posts %}
5 | -
6 |
7 |
8 |
9 | {% if post.categories.count %}
10 | {% set categoryLinks = post.categories | map(c => "#{c.name}") | join(', ') %}
11 |
12 | {{ 'winter.blog::lang.post.posted_byline' | trans({
13 | date: post.published_at | date('winter.blog::lang.post.date_format' | trans),
14 | categories: categoryLinks
15 | }) }}
16 | {% else %}
17 | {{ 'winter.blog::lang.post.posted_byline_no_categories' | trans({
18 | date: post.published_at | date('winter.blog::lang.post.date_format' | trans)
19 | }) }}
20 | {% endif %}
21 |
22 |
23 | {{ post.summary | raw }}
24 |
25 | {% else %}
26 | - {{ __SELF__.noPostsMessage }}
27 | {% endfor %}
28 |
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 |
--------------------------------------------------------------------------------