Update Docker configuration and plugin versions default tip
authorymh <ymh.work@gmail.com>
Mon, 08 Sep 2025 19:44:41 +0200
changeset 23 417f20492bf7
parent 22 8c2e4d02f4ef
Update Docker configuration and plugin versions - Upgrade MariaDB from 10.6 to 11 with auto-upgrade support - Add WordPress debug environment variable to FPM container - Update PHP-FPM Dockerfile base image - Update Include Mastodon Feed plugin with bug fixes and improvements - Update Portfolio plugin (v2.58) with latest translations and demo data enhancements - Remove old README.md from Mastodon Feed plugin 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
docker-compose.yml
fpm.Dockerfile
wp/wp-content/plugins/include-mastodon-feed/LICENSE
wp/wp-content/plugins/include-mastodon-feed/README.md
wp/wp-content/plugins/include-mastodon-feed/config-example.php
wp/wp-content/plugins/include-mastodon-feed/plugin.php
wp/wp-content/plugins/include-mastodon-feed/readme.txt
wp/wp-content/plugins/portfolio/includes/class-prtfl-settings.php
wp/wp-content/plugins/portfolio/includes/demo-data/class-bws-demo-data.php
wp/wp-content/plugins/portfolio/languages/portfolio-ru_RU.mo
wp/wp-content/plugins/portfolio/languages/portfolio-ru_RU.po
wp/wp-content/plugins/portfolio/languages/portfolio-uk.mo
wp/wp-content/plugins/portfolio/languages/portfolio-uk.po
wp/wp-content/plugins/portfolio/portfolio.php
wp/wp-content/plugins/portfolio/readme.txt
--- a/docker-compose.yml	Fri Sep 05 18:52:52 2025 +0200
+++ b/docker-compose.yml	Mon Sep 08 19:44:41 2025 +0200
@@ -2,7 +2,7 @@
 services:
   db:
     # We use a mariadb image which supports both amd64 & arm64 architecture
-    image: mariadb:10.6
+    image: mariadb:11
     # If you really want to use MySQL, uncomment the following line
     #image: mysql:8.0.27
     command: '--default-authentication-plugin=mysql_native_password'
@@ -10,6 +10,7 @@
       - db_data:/var/lib/mysql
     restart: unless-stopped
     environment:
+      - MARIADB_AUTO_UPGRADE=1
       - MYSQL_ROOT_PASSWORD=iri
       - MYSQL_DATABASE=wordpress_ec
       - MYSQL_USER=iri
@@ -28,6 +29,7 @@
       - WORDPRESS_DB_USER=iri
       - WORDPRESS_DB_PASSWORD=iri
       - WORDPRESS_DB_NAME=wordpress_ec
+      - WORDPRESS_DEBUG=1
 
   wpcli:
     image: wordpress:cli
--- a/fpm.Dockerfile	Fri Sep 05 18:52:52 2025 +0200
+++ b/fpm.Dockerfile	Mon Sep 08 19:44:41 2025 +0200
@@ -1,4 +1,4 @@
-FROM php:7.4-fpm-alpine
+FROM php:fpm-alpine
 
 RUN mv "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini"
 ADD zz-zdocker.conf /usr/local/etc/php-fpm.d/
--- a/wp/wp-content/plugins/include-mastodon-feed/LICENSE	Fri Sep 05 18:52:52 2025 +0200
+++ b/wp/wp-content/plugins/include-mastodon-feed/LICENSE	Mon Sep 08 19:44:41 2025 +0200
@@ -7,7 +7,7 @@
 https://directory.fsf.org/wiki/License:Expat
 
 
-Copyright 2022 wolfgang.lol
+Copyright 2024 wolfgang.lol
 
 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
 
--- a/wp/wp-content/plugins/include-mastodon-feed/README.md	Fri Sep 05 18:52:52 2025 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,120 +0,0 @@
-# Include Mastodon Feed Wordpress Plugin
-
-Plugin that provides an `[include-mastodon-feed]` shortcode to easily integrate mastodon feeds into wordpress pages. Supports personal and tag feeds.
-
-The plugin is written in PHP and generates native JavaScript to fetch and render the mastodon feed. No special libraries needed.
-
-## Table of contents
-* [Usage](#usage)
-  * [Supported shortcode attributes](#supported-shortcode-attributes)
-  * [Additional customization](#additional-customizations)
-* [Installation](#installation)
-  * [Installation via ZIP file](#installation-via-zip-file)
-  * [Installation via git checkout](#installation-via-git-checkout)
-* [Known issues](#known-issues)
-  * [Todo](#todo)
-* [FAQ](#faq)
-  * [How do I find my account ID?](#how-do-i-find-my-account-id)
-  * [Can I modify the plugin?](#can-i-modify-the-plugin)
-
-## Usage
-
-Place the following shortcode right into the page. Either as shortcode block or just copy and paste right within a text block:
-
-```[include-mastodon-feed instance="YOUR-INSTANCE" account="YOUR-ACCOUNT-ID"]```
-
-### Supported shortcode attributes
-
- | Attribute          | Default value                 | Example                   | Description                                                       |
-| ------------------- | ----------------------------- | ------------------------- | ----------------------------------------------------------------- |
-| **account**         |                               | id="012345678910"         | (required attribute) Your account ID ([a long number](#how-do-i-find-my-account-id))   |
-| tag                 |                               | tag="travel"              | use **tag** instead of **account** if you want to embed a tag feed instead of a personal feed   |
-| **instance**        |                               | instance="example.org"    | (required attribute) Domain name of the instance without https:// |
-| limit               | 20                            | limit="10"                | Maximum number of statuses                                        |
-| excludeBoosts       | false                         | excludeBoosts="true"      | Exclude boosted statuses                                          |
-| excludeReplies      | false                         | excludeReplies="true"     | Exclude replies to other accounts                                 |
-| excludeConversationStarters       | false           | excludeConversationStarters="true"      | Exclude statuses that start with a user mention     |
-| onlyPinned          | false                         | onlyPinned="true"         | Show only pinned statuses                                         |
-| onlyMedia           | false                         | onlyMedia="true"          | Show only statuses containing media                               |
-| preserveImageAspectRatio          | false           | preserveImageAspectRatio="true"         | Preserve image aspect ratio                         |
-| tagged              | false                         | tagged="tagname"          | Show only statuses that are tagged with given tag name (no #!)    |
-| linkTarget          | "_self"                       | linkTarget="_blank"       | Target for all links                                              |
-| showPreviewCards    | true                          | showPreviewCards="false"  | Show preview cards                                                |
-| hideStatusMeta      | false                         | hideStatusMeta="true"     | Hide status meta information (automatically also hides date and time) |
-| hideDateTime        | false                         | hideDateTime="true"       | Hide date and time from status meta information                   |
-| darkmode            | false                         | darkmode="true"           | Enable dark mode                                                  |
-| text-loading        | "Loading Mastodon feed..."    | text-loading="Loading ⏳" | Loading text                                                      |
-| text-noStatuses     | "No statuses available"       | text-noStatuses="💩"      | Text if no statuses are available                                 |
-| text-boosted        | "boosted 🚀"                  | text-boosted="🚀"         | Boosted status indicator text                                     |
-| text-viewOnInstance | "view on instance"            | text-viewOnInstance="🔗"  | View status on instance link text                                 |
-| text-showContent    | "Show content"                | text-showContent="👀"     | Text for content warning buttons                                  |
-| text-permalinkPre   | "on"                          | text-showContent="📅"     | Text before post permalink (date & time)                          |
-| text-permalinkPost  | ""                            | text-showContent="📅"     | Text after post permalink (date & time)                           |
-| text-edited         | "(edited)"                    | text-showContent="✏"      | Text indicating edited posts                                      |
-| date-locale         | "en-US"                       | date-locale="de-DE"       | Locale for date string, used in toLocaleString()                  |
-| date-options        | "{}"                          | date-options="{dateStyle: 'short', timeStyle: 'long'}" | Format options directly fed into toLocaleString() |
-
-### Additional customizations
-
-You can define several plugin constants to set custom default options that will be applied site-wide.
-
-1. Open your `wp-config.php` file
-2. Search for the line `/* Add any custom values between this line and the "stop editing" line. */`
-3. Define the options you want to override between this line and `/* That's all, stop editing! Happy publishing. */`
-
-See [config-example.php](config-example.php) for a full list of supported settings.
-
-## Installation
-
-The plugin is available through the official Wordpress plugin directory https://wordpress.org/plugins/include-mastodon-feed/
-
-1. Log into your Wordpress installation
-2. Go to "Plugins" and select "Add New"
-3. Search for "Include Mastodon Feed"
-4. Hit the "Install" button
-5. After installation hit the "Activate" button
-
-### Installation via ZIP file
-
-1. Click on the `<>Code` in the top right of this page
-2. Select `Download ZIP`
-3. Create a `include-mastodon-feed` folder in your Wordpress plugins directory
-4. Unpack all the files from the ZIP there (files only, no sub-directory)
-5. Enable plugin in Wordpress
-6. Use shortcode
-
-### Installation via git checkout
-
-If you are familiar with Github you can clone the repository right into your Wordpress plugins folder
-
-1. SSH into your webserver
-2. `cd /path/to/wordpress/wp-content/plugins`
-3. `git clone https://github.com/wolfgang101/include-mastodon-feed.git`
-4. Enable plugin in Wordpress
-5. Use shortcode
-
-## Known issues
-
-### Todo
-
-* improve support for video and audio media attachment types
-* integrate i18n into translate.wordpress.org instead of text constants
-* re-build plugin as custom gutenberg block
-
-## FAQ
-
-### How do I find my account ID?
-As an instance admin you can easily read your user ID in the admin backend. As regular user you can try an API v2 search to find your ID
-
-Use the following URL to get your ID:
-
-```https://example.org/api/v2/search?q=username@example.org&resolve=true&limit=5```
-
-* Change `example.org` to your instance
-* Replace `username` with your handle.
-* Open the URL in your webbrowser
-
-**Note:** You must be logged in to do that
-
-### Can I modify the plugin?
-The plugin is released unter the [Expat License](LICENSE) which is very permissive. Knock youself out!
\ No newline at end of file
--- a/wp/wp-content/plugins/include-mastodon-feed/config-example.php	Fri Sep 05 18:52:52 2025 +0200
+++ b/wp/wp-content/plugins/include-mastodon-feed/config-example.php	Mon Sep 08 19:44:41 2025 +0200
@@ -19,7 +19,7 @@
     // set a default instance
     // can still be overriden in shortcode
     // plugin will show a warning if no default is set and instance is omitted in shortcode
-    //define('INCLUDE_MASTODON_FEED_DEFAULT_INSTANCE', 'example.org');
+    define('INCLUDE_MASTODON_FEED_DEFAULT_INSTANCE', 'example.org');
 
     // Maximum number of statuses
     define('INCLUDE_MASTODON_FEED_LIMIT', 20);
@@ -43,6 +43,12 @@
     // can be overridden in shortcode
     define('INCLUDE_MASTODON_FEED_PRESERVE_IMAGE_ASPECT_RATIO', true);
 
+    // load small sized preview images or full size high quality images
+    define( 'INCLUDE_MASTODON_FEED_IMAGE_SIZE', 'preview' );
+
+    // link image to status or image
+    define( 'INCLUDE_MASTODON_FEED_IMAGE_LINK', 'status' );
+
     // only tagged statuses
     // tag name without leading #, case insensitive
     define('INCLUDE_MASTODON_FEED_TAGGED', 'tagname');
--- a/wp/wp-content/plugins/include-mastodon-feed/plugin.php	Fri Sep 05 18:52:52 2025 +0200
+++ b/wp/wp-content/plugins/include-mastodon-feed/plugin.php	Mon Sep 08 19:44:41 2025 +0200
@@ -3,9 +3,11 @@
   Plugin Name: Include Mastodon Feed
 	Plugin URI: https://wolfgang.lol/code/include-mastodon-feed-wordpress-plugin
 	Description: Plugin providing [include-mastodon-feed] shortcode
-	Version: 1.9.4
+	Version: 1.13.1
 	Author: wolfgang.lol
 	Author URI: https://wolfgang.lol
+  License: MIT
+  License URI: https://directory.fsf.org/wiki/License:Expat
 */
 
 namespace IncludeMastodonFeedPlugin;
@@ -49,6 +51,14 @@
     'value' => false,
   ],
   [
+    'key' => 'INCLUDE_MASTODON_FEED_IMAGE_SIZE',
+    'value' => 'preview',
+  ],
+  [
+    'key' => 'INCLUDE_MASTODON_FEED_IMAGE_LINK',
+    'value' => 'status',
+  ],
+  [
     'key' => 'INCLUDE_MASTODON_FEED_TAGGED',
     'value' => false,
   ],
@@ -76,7 +86,7 @@
   ],
   [
     'key' => 'INCLUDE_MASTODON_FEED_STYLE_ACCENT_COLOR',
-    'value' => 'rgb(99, 100, 255)',
+    'value' => 'rgb(86, 58, 204)',
   ],
   [
     'key' => 'INCLUDE_MASTODON_FEED_STYLE_ACCENT_FONT_COLOR',
@@ -101,7 +111,7 @@
   ],
   [
     'key' => 'INCLUDE_MASTODON_FEED_TEXT_NO_STATUSES',
-    'value' => 'No statuses availablae',
+    'value' => 'No statuses available',
   ],
   [
     'key' => 'INCLUDE_MASTODON_FEED_TEXT_BOOSTED',
@@ -149,7 +159,6 @@
 
 
 function init_styles() {
-  ob_start();
 ?>
   <style>
     :root {
@@ -160,7 +169,12 @@
       --include-mastodon-feed-border-radius: <?php echo filter_var( INCLUDE_MASTODON_FEED_STYLE_BORDER_RADIUS, FILTER_UNSAFE_RAW ); ?>;
     }
 
+    .include-mastodon-feed-wrapper .include-mastodon-feed {
+      list-style: none;
+      padding-left: 0;
+    }
     .include-mastodon-feed .status {
+      display: block;
       margin: 0.5rem 0 1.5rem;
       border-radius: var(--include-mastodon-feed-border-radius);
       padding: 0.5rem;
@@ -175,6 +189,7 @@
       text-decoration: underline;
     }
     .include-mastodon-feed .avatar {
+      display: inline-block;
       height: 1.25rem;
       border-radius: var(--include-mastodon-feed-border-radius);
       vertical-align: top;
@@ -225,13 +240,16 @@
     }
     .include-mastodon-feed .media {
       display: flex;
+      list-style: none;
+      padding: 0;
       justify-content: space-around;
       align-items: center;
       flex-wrap: wrap;
       gap: 0.5rem;
       margin: 1rem;
     }
-    .include-mastodon-feed .media > div {
+    .include-mastodon-feed .media > * {
+      display: block;
       flex-basis: calc(50% - 0.5rem);
       flex-grow: 1;
     }
@@ -303,12 +321,10 @@
     }
   </style>
 <?php
-  echo ob_get_clean();
 }
 add_action('wp_head', __NAMESPACE__ . '\init_styles', 7);
 
 function init_scripts() {
-  ob_start();
 ?>
   <script>
 
@@ -323,9 +339,12 @@
     const mastodonFeedCreateElementAccountLink = function(account) {
       let accountLinkElem = mastodonFeedCreateElement('a');
       accountLinkElem.href = account.url;
+      accountLinkElem.setAttribute('aria-label', 'Link to Mastodon account of ' + account.display_name);
 
       let accountImageElem = mastodonFeedCreateElement('img', 'avatar');
       accountImageElem.src = account.avatar_static;
+      accountImageElem.loading = 'lazy';
+      accountImageElem.alt = 'Mastodon avatar image of ' + account.display_name;
 
       accountLinkElem.addEventListener('mouseover', (event) => {
         accountLinkElem.querySelector('.avatar').src = account.avatar;
@@ -346,41 +365,46 @@
       return accountLinkElem;
     }
 
-    const mastodonFeedCreateElementPermalink = function(status, label) {
+    const mastodonFeedCreateElementPermalink = function(status, label, ariaLabel) {
       let linkElem = mastodonFeedCreateElement('a');
       linkElem.href = status.url;
       linkElem.appendChild(document.createTextNode(label));
+      linkElem.setAttribute('aria-label', ariaLabel);
       return linkElem;
     }
 
     const mastodonFeedCreateElementMediaAttachments = function(status, options) {
       let attachments = status.media_attachments;
-      let mediaWrapperElem = mastodonFeedCreateElement('div', 'media');
+      let mediaWrapperElem = mastodonFeedCreateElement('ol', 'media');
       for(let mediaIndex = 0; mediaIndex < attachments.length; mediaIndex++) {
         let media = attachments[mediaIndex];
-        let mediaElem = mastodonFeedCreateElement('div', media.type);
+        let mediaElem = mastodonFeedCreateElement('li', media.type);
         if('image' == media.type) {
           let mediaElemImgLink = mastodonFeedCreateElement('a');
+          let imageUrl = media.url;
+          if('full' !== options.images.size && null !== media.preview_url) {
+            imageUrl = media.preview_url;
+          }
           mediaElemImgLink.href = status.url;
-          if(null === media.remote_url) {
-            mediaElemImgLink.style.backgroundImage = 'url("' + media.preview_url + '")';
+          if('image' === options.images.link) {
+            mediaElemImgLink.href = media.remote_url ?? media.url;
+          }
+          let mediaElemImgImage = mastodonFeedCreateElement('img');
+          mediaElemImgImage.src = imageUrl;
+          mediaElemImgImage.loading = 'lazy';
+          if(null === media.description) {
+            mediaElemImgImage.alt = 'Image attachment of Mastodon post';
           }
           else {
-            mediaElemImgLink.style.backgroundImage = 'url("' + media.remote_url + '")';
-          }
-          if(null !== media.description) {
-            mediaElem.title = media.description;
+            mediaElemImgImage.alt = media.description;
           }
-          if(options.preserveImageAspectRatio) {
-            let mediaElemImgImage = mastodonFeedCreateElement('img');
-            if(null === media.remote_url) {
-              mediaElemImgImage.src = media.preview_url;
-            }
-            else {
-              mediaElemImgImage.src = media.remote_url;
-            }
-            mediaElemImgLink.appendChild(mediaElemImgImage);
+          if(!options.images.preserveImageAspectRatio) {
+            mediaElemImgLink.style.backgroundImage = 'url("' + imageUrl + '")';
+            mediaElemImgImage.style.width = '100%';
+            mediaElemImgImage.style.height = '100%';
+            mediaElemImgImage.style.opacity = 0;
           }
+          mediaElemImgLink.appendChild(mediaElemImgImage);
           mediaElem.appendChild(mediaElemImgLink);
         }
         else if('gifv' == media.type) {
@@ -395,8 +419,11 @@
           }
           mediaElemGifv.loop = true;
           mediaElemGifv.muted = 'muted';
-          if(null !== media.description) {
-            mediaElemGifv.title = media.description;
+          if(null === media.description) {
+            mediaElemGifv.alt = 'Video attachment of Mastodon post';
+          }
+          else {
+            mediaElemGifv.alt = media.description;
           }
           mediaElemGifvLink.appendChild(mediaElemGifv);
           mediaElem.appendChild(mediaElemGifvLink);
@@ -414,7 +441,7 @@
           //      currently only image and gifv support implemented
           mediaElem.innerHTML = 'Stripped ' + media.type + ' - only available on instance<br />';
           let permalinkElem = mastodonFeedCreateElement('span', 'permalink');
-          permalinkElem.appendChild(mastodonFeedCreateElementPermalink(status, options.text.viewOnInstance));
+          permalinkElem.appendChild(mastodonFeedCreateElementPermalink(status, options.text.viewOnInstance, 'Link to Mastodon post'));
           mediaElem.appendChild(permalinkElem);
         }
         mediaWrapperElem.appendChild(mediaElem);
@@ -431,7 +458,14 @@
         if(null !== card.image) {
           let cardElemImageWrapper = mastodonFeedCreateElement('div', 'image');
           let cardElemImage = mastodonFeedCreateElement('img');
+          if(null === card.image_description) {
+            cardElemImage.alt = 'Preview image content card';
+          }
+          else {
+            cardElemImage.alt = card.image_description;
+          }
           cardElemImage.src = card.image;
+          cardElemImage.loading = 'lazy';
           cardElemImageWrapper.appendChild(cardElemImage);
           cardElemMeta.appendChild(cardElemImageWrapper);
         }
@@ -450,6 +484,7 @@
         else {
           let cardElemLink = mastodonFeedCreateElement('a');
           cardElemLink.href = card.url;
+          cardElemLink.setAttribute('aria-label', 'Link embedded in Mastodon post');
           cardElemLink.appendChild(cardElemMeta);
           cardElem.appendChild(cardElemLink);
         }
@@ -467,7 +502,7 @@
         createdInfo.innerHTML += new Date(status.created_at).toLocaleString(options.localization.date.locale, options.localization.date.options);
       }
       else {
-        createdInfo.appendChild(mastodonFeedCreateElementPermalink(status, new Date(status.created_at).toLocaleString(options.localization.date.locale, options.localization.date.options)));
+        createdInfo.appendChild(mastodonFeedCreateElementPermalink(status, new Date(status.created_at).toLocaleString(options.localization.date.locale, options.localization.date.options), 'Link to Mastodon post'));
       }
       createdInfo.innerHTML += ' ' + options.text.permalinkPost;
       return createdInfo;
@@ -479,7 +514,6 @@
 
     const mastodonFeedRenderStatuses = function(statuses, rootElem, options) {
       if(statuses.length < 1) {
-        console.log(options);
         rootElem.innerHTML = options.text.noStatuses;
       }
       else {
@@ -488,7 +522,7 @@
           let isEdited = (null === status.edited_at ? true : false);
           let isReblog = (null === status.reblog ? false : true);
 
-          let statusElem = mastodonFeedCreateElement('div', 'status');
+          let statusElem = mastodonFeedCreateElement('li', 'status');
 
           // add account meta info
           if(!options.content.hideStatusMeta) {
@@ -539,6 +573,7 @@
 
             let cwLinkElem = mastodonFeedCreateElement('a');
             cwLinkElem.href = '#';
+            cwLinkElem.setAttribute('aria-label', 'Show content despite warning');
             cwLinkElem.onclick = function() {
               this.parentElement.style = 'display: none;';
               this.parentElement.nextSibling.style = 'display: block;';
@@ -578,11 +613,11 @@
           rootElem.appendChild(statusElem);
         }
       }
-      if('_self' != options.linkTarget) {
-        rootElem.querySelectorAll('a').forEach(function(e) {
+      rootElem.querySelectorAll('a').forEach(function(e) {
+        if('_self' != options.linkTarget) {
           e.target = options.linkTarget;
-        });
-      }
+        }
+      });
     }
 
     const mastodonFeedLoad = function(url, elementId, options) {
@@ -594,11 +629,13 @@
         const rootElem = document.getElementById(elementId);
         rootElem.innerHTML = '';
         <?php if(true === INCLUDE_MASTODON_FEED_DEBUG) : ?>
-          console.log("<?php echo __NAMESPACE__; ?>", url);
+          console.log("<?php echo __NAMESPACE__; ?>", 'url', url);
+          console.log("<?php echo __NAMESPACE__; ?>", 'elementId', elementId);
+          console.log("<?php echo __NAMESPACE__; ?>", 'options', options);
         <?php endif; ?>
         if (xhr.status === 200) {
           <?php if(true === INCLUDE_MASTODON_FEED_DEBUG) : ?>
-            console.log("<?php echo __NAMESPACE__; ?>", xhr.response);
+            console.log("<?php echo __NAMESPACE__; ?>", 'response', xhr.response);
           <?php endif; ?>
           if(options.excludeConversationStarters && statuses.length > 0) {
             const filteredStatuses = [];
@@ -625,7 +662,7 @@
         }
         else {
           <?php if(true === INCLUDE_MASTODON_FEED_DEBUG) : ?>
-            console.log("<?php echo __NAMESPACE__; ?>", xhr);
+            console.log("<?php echo __NAMESPACE__; ?>", 'response error', xhr);
           <?php endif; ?>
           rootElem.appendChild(document.createTextNode(xhr.response.error));
         }
@@ -634,7 +671,6 @@
     }
   </script>
 <?php
-  echo ob_get_clean();
 }
 add_action('wp_footer', __NAMESPACE__ . '\init_scripts');
 
@@ -651,6 +687,8 @@
           'onlypinned' => filter_var(esc_html(INCLUDE_MASTODON_FEED_ONLY_PINNED), FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE),
           'onlymedia' => filter_var(esc_html(INCLUDE_MASTODON_FEED_ONLY_MEDIA), FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE),
           'preserveimageaspectratio' => filter_var(esc_html(INCLUDE_MASTODON_FEED_PRESERVE_IMAGE_ASPECT_RATIO), FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE),
+          'imagesize' => INCLUDE_MASTODON_FEED_IMAGE_SIZE,
+          'imagelink' => INCLUDE_MASTODON_FEED_IMAGE_LINK,
           'tagged' => INCLUDE_MASTODON_FEED_TAGGED,
           'linktarget' => INCLUDE_MASTODON_FEED_LINKTARGET,
           'showpreviewcards' => filter_var(esc_html(INCLUDE_MASTODON_FEED_SHOW_PREVIEWCARDS), FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE),
@@ -665,7 +703,6 @@
           'text-permalinkpost' => INCLUDE_MASTODON_FEED_TEXT_PERMALINK_POST,
           'text-edited' => INCLUDE_MASTODON_FEED_TEXT_EDITED,
           'date-locale' => INCLUDE_MASTODON_FEED_DATE_LOCALE,
-          'date-options' => INCLUDE_MASTODON_FEED_DATE_OPTIONS,
           'darkmode' => filter_var(esc_html(INCLUDE_MASTODON_FEED_DARKMODE), FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE),
       ), array_change_key_case($atts, CASE_LOWER)
   );
@@ -713,37 +750,41 @@
   <script>
     window.addEventListener("load", () => {
       mastodonFeedLoad(
-        "<?php echo sanitize_url( $apiUrl, ['https'] ); ?>",
+        "<?php echo esc_url( $apiUrl, ['https'], 'apicall' ); ?>",
         "<?php echo filter_var( $elemId, FILTER_UNSAFE_RAW ); ?>",
         {
-          linkTarget: "<?php echo filter_var( $atts['linktarget'], FILTER_UNSAFE_RAW ); ?>",
+          linkTarget: "<?php echo esc_js(filter_var( $atts['linktarget'], FILTER_UNSAFE_RAW )); ?>",
           showPreviewCards: <?php echo (filter_var( $atts['showpreviewcards'], FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE) ? "true" : "false"); ?>,
           excludeConversationStarters: <?php echo (filter_var( $atts['excludeconversationstarters'], FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE) ? "true" : "false"); ?>,
-          preserveImageAspectRatio: <?php echo (filter_var( $atts['preserveimageaspectratio'], FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE) ? "true" : "false"); ?>,
           content: {
             hideStatusMeta: <?php echo (filter_var( $atts['hidestatusmeta'], FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE) ? "true" : "false"); ?>,
             hideDateTime: <?php echo (filter_var( $atts['hidedatetime'], FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE) ? "true" : "false"); ?>
           },
+          images: {
+            preserveImageAspectRatio: <?php echo (filter_var( $atts['preserveimageaspectratio'], FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE) ? "true" : "false"); ?>,
+            size: "<?php echo ( "full" === $atts['imagesize'] ? "full" : "preview" ); ?>",
+            link: "<?php echo ( "image" === $atts['imagelink'] ? "image" : "status" ); ?>",
+          },
           text: {
-            boosted: "<?php echo esc_js( $atts['text-boosted'] ); ?>",
+            boosted: "<?php echo esc_html( $atts['text-boosted'] ); ?>",
             noStatuses: "<?php echo esc_html( $atts['text-nostatuses'] ); ?>",
             viewOnInstance: "<?php echo esc_js( $atts['text-viewoninstance'] ); ?>",
-            showContent: "<?php echo esc_js( $atts['text-showcontent'] ); ?>",
-            permalinkPre: "<?php echo esc_js( $atts['text-permalinkpre'] ); ?>",
-            permalinkPost: "<?php echo esc_js( $atts['text-permalinkpost'] ); ?>",
-            edited: "<?php echo esc_js( $atts['text-edited'] ); ?>",
+            showContent: "<?php echo esc_html( $atts['text-showcontent'] ); ?>",
+            permalinkPre: "<?php echo esc_html( $atts['text-permalinkpre'] ); ?>",
+            permalinkPost: "<?php echo esc_html( $atts['text-permalinkpost'] ); ?>",
+            edited: "<?php echo esc_html( $atts['text-edited'] ); ?>",
           },
           localization: {
             date: {
-              locale: "<?php echo filter_var( $atts['date-locale'], FILTER_UNSAFE_RAW ); ?>",
-              options: <?php echo filter_var( $atts['date-options'], FILTER_UNSAFE_RAW ); ?>,
+              locale: "<?php echo esc_js( filter_var( $atts['date-locale'], FILTER_UNSAFE_RAW ) ); ?>",
+              options: <?php echo filter_var( INCLUDE_MASTODON_FEED_DATE_OPTIONS, FILTER_UNSAFE_RAW ); ?>,
             }
           }
         }
       );
     });
   </script>
-  <div class="include-mastodon-feed<?php echo (true == $atts['darkmode'] ? ' dark' : ''); ?>" id="<?php echo esc_attr( $elemId ); ?>"><?php echo esc_html( $atts['text-loading'] ); ?></div>
+  <div class="include-mastodon-feed-wrapper"><ol class="include-mastodon-feed<?php echo (true == $atts['darkmode'] ? ' dark' : ''); ?>" id="<?php echo esc_attr( $elemId ); ?>"><li><?php echo esc_html( $atts['text-loading'] ); ?></li></ol></div>
 <?php
   return ob_get_clean();
 }
--- a/wp/wp-content/plugins/include-mastodon-feed/readme.txt	Fri Sep 05 18:52:52 2025 +0200
+++ b/wp/wp-content/plugins/include-mastodon-feed/readme.txt	Mon Sep 08 19:44:41 2025 +0200
@@ -3,10 +3,10 @@
 Donate link: https://www.buymeacoffee.com/w101
 Tags: mastodon, status, feed
 Requires at least: 6.0
-Tested up to: 6.5
+Tested up to: 6.8
 Requires PHP: 7.4
-Stable tag: 1.9.4
-License: Expat License
+Stable tag: 1.13.1
+License: MIT
 License URI: https://directory.fsf.org/wiki/License:Expat
 
 Plugin that provides a shortcode to easily integrate mastodon feeds into wordpress pages.
@@ -14,6 +14,8 @@
 == Description ==
 Plugin that provides an `[include-mastodon-feed]` shortcode to easily integrate mastodon feeds into wordpress pages. Supports personal and tag feeds.
 
+Account and post images are lazy loaded if preserveImageAspectRatio is set to true (default: false).
+
 The plugin is written in PHP and generates native JavaScript to fetch and render the mastodon feed. No special libraries needed.
 
 == Installation ==
@@ -26,15 +28,15 @@
 `[include-mastodon-feed instance="YOUR-INSTANCE" account="YOUR-ACCOUNT-ID"]`
 
 = Shortcode attributes =
+* **instance** (required)
+Domain name of the instance without https:// (e.g. example.org)
+
 * **account** (required)
 The account ID (a long number - see FAQ on how to get it)
 
 * **tag**
 Use **tag** instead of **account** if you want to embed a tag feed instead of a personal feed
 
-* **instance** (required)
-Domain name of the instance without https:// (e.g. example.org)
-
 * **limit**
 Maximum number of statuses (Default: 20)
 
@@ -56,6 +58,12 @@
 * **preserveImageAspectRatio**
 Preserve image aspect ratio (Default: false)
 
+* **imageSize**
+Load small sized preview images or full size high quality images (Default: preview, full)
+
+* **imageLink**
+Link image to status or image (Default: status, image)
+
 * **tagged**
 Show only statuses that are tagged with given tag name (Default: false)
 No leading #, case insensitive, e.g.: tagged="tagname"
@@ -102,12 +110,10 @@
 * **date-locale**
 Locale for date string, used in toLocaleString() (Default: en-US)
 
-* **date-options**
-Format options directly fed into toLocaleString() (Default: {})
 
 = Additional customizations =
 
-You can define several plugin constants to set custom default options that will be applied site-wide.
+You can define several plugin constants to set custom default options that will be applied site-wide (e.g. date options can only be set as php constant to mitigate an XSS vulnerability).
 
 1. Open your `wp-config.php` file
 2. Search for the line `/* Add any custom values between this line and the "stop editing" line. */`
@@ -148,6 +154,58 @@
 
 == Changelog ==
 
+= 1.13.1 =
+* fix: removed unnecessary, broken aria-label functionality
+
+= 1.13 =
+Special release for Global Accessibility Awareness Day
+in collaboration with @oldrup@mastodon.green
+
+Happy [Accesssibility Day](https://accessibility.day)
+
+* accessibility (fix): image alt attributes - initial implementation was faulty
+* accessibility: added alt text to image / gifv attachments
+* accessibility: added alt text to avatar images
+* accessibility: added alt text to preview card media
+* accessibility: added descriptive aria-labels
+* accessibility: increased default text / background color contrast
+* accessibility: switched from DIV to semantic OL / LI structure
+
+= 1.12 =
+* accessibility: added image alt attribute (thank you @oldrup@mastodon.green)
+
+= 1.11 =
+* now favoring preview_url (smaler size) instead of remote_url (full size) for image previews (thank you @oldrup@mastodon.green)
+
+= 1.10 =
+* added image lazy loading for account and post images - post image lazy loading only works with preserveImageAspectRatio set to true (thank you @oldrup@mastodon.green)
+
+= 1.9.11 =
+* fixed typo (thank you @hjek)
+* cleaned up code after 1.9.10 release
+
+= 1.9.10 =
+* fixed XSS vulnerability: removed support for date-options as shortcode attribute completely - to mitigate an XSS vulnerability where authenticated attackers with contributor permission could insert malicious JavaScript (still can be set as constant in PHP code)
+
+= 1.9.9 =
+* fixed esc_url context that previously broke the URL for the Mastodon API JS ajax request (thank you @beach@illo.social)
+
+= 1.9.8 =
+* fix broken date-locale and date-options parameters (thank you @crusy@chaos.social)
+* improved string excaping for text parameters and added url escaping
+* removed unnecessary output buffering
+* fix license SPDX Identifier
+
+= 1.9.7 =
+* fix option to either display smaller image media attachment previews (default) or large image versions (thank you @beach@illo.social)
+
+= 1.9.6 =
+* fixed XSS vulnerability where authenticated attackers with contributor permissions could insert malicious JavaScript
+
+= 1.9.5 =
+* added option to either display smaller image media attachment previews (default) or large image versions (thank you @beach@illo.social)
+* added option to point image media attachment links to either status (default) or image
+
 = 1.9.4 =
 * added option to hide status meta information and date/time (thank you @PaulKingtiger@dice.camp)
 * added tag support - you can now embed tag feeds (thank you @martin@openedtech.social)
--- a/wp/wp-content/plugins/portfolio/includes/class-prtfl-settings.php	Fri Sep 05 18:52:52 2025 +0200
+++ b/wp/wp-content/plugins/portfolio/includes/class-prtfl-settings.php	Mon Sep 08 19:44:41 2025 +0200
@@ -207,7 +207,11 @@
 				$this->options['slug'] = sanitize_text_field( wp_unslash( $_POST['prtfl_slug'] ) );
 
 				if ( is_plugin_active( 'sender-pro/sender-pro.php' ) ) {
-					$sndr_options = get_option( 'sndr_options' );
+					if ( is_multisite() ) {
+						$sndr_options = get_site_option( 'sndr_options' );
+					} else {
+						$sndr_options = get_option( 'sndr_options' );
+					}
 					/* mailout when publishing quote */
 					if ( ! empty( $_POST['sndr_distribution_select'] ) && ! empty( $_POST['sndr_templates_select'] ) && ! empty( $_POST['sndr_priority'] ) ) {
 						if ( isset( $_POST['prtfl_sndr_mailout'] ) ) {
@@ -311,7 +315,11 @@
 		 */
 		public function tab_settings() {
 			if ( is_plugin_active( 'sender-pro/sender-pro.php' ) ) {
-				$sndr_options = get_option( 'sndr_options' );
+				if ( is_multisite() ) {
+					$sndr_options = get_site_option( 'sndr_options' );
+				} else {
+					$sndr_options = get_option( 'sndr_options' );
+				}
 			}
 			?>
 			<h3 class="bws_tab_label"><?php esc_html_e( 'Portfolio Settings', 'portfolio' ); ?></h3>
--- a/wp/wp-content/plugins/portfolio/includes/demo-data/class-bws-demo-data.php	Fri Sep 05 18:52:52 2025 +0200
+++ b/wp/wp-content/plugins/portfolio/includes/demo-data/class-bws-demo-data.php	Mon Sep 08 19:44:41 2025 +0200
@@ -1,13 +1,21 @@
 <?php
-
 /**
  * Load demo data
- * @version 1.0.4
+ * @version 1.0.7
  */
 
 if ( ! class_exists( 'Bws_Demo_Data' ) ) {
 	class Bws_Demo_Data {
-		private $bws_plugin_text_domain, $bws_plugin_prefix, $bws_plugin_page, $bws_plugin_name, $bws_plugin_basename, $bws_demo_options, $bws_demo_folder;
+		private $bws_plugin_text_domain;
+		private $bws_plugin_prefix;
+		private $bws_plugin_page;
+		private $bws_plugin_name;
+		private $bws_plugin_basename;
+		private $bws_demo_options;
+		private $bws_plugin_options;
+		private $bws_demo_folder;
+		private $install_callback;
+		private $remove_callback;
 
 		public function __construct( $args ) {
 			$plugin_dir_array      	= explode( '/', $args['plugin_basename'] );
@@ -16,8 +24,11 @@
 			$this->bws_plugin_name			= $args['plugin_name'];
 			$this->bws_plugin_page			= $args['plugin_page'];
 			$this->bws_demo_folder			= $args['demo_folder'];
+			$this->install_callback 		= isset( $args['install_callback'] ) ? $args['install_callback'] : false;
+			$this->remove_callback 			= isset( $args['remove_callback'] ) ? $args['remove_callback'] : false;			
 			$this->bws_plugin_text_domain 	= $plugin_dir_array[0];
 			$this->bws_demo_options 		= get_option( $this->bws_plugin_prefix . 'demo_options' );
+			$this->bws_plugin_options		= get_option( $this->bws_plugin_prefix . 'options' );
 		}
 
 		/**
@@ -57,36 +68,30 @@
 					<p>
 						<button class="button button-primary" name="bws_<?php echo $_POST['bws_handle_demo']; ?>_demo_confirm" value="true"><?php echo $button_title; ?></button>
 						<button class="button" name="bws_<?php echo $_POST['bws_handle_demo']; ?>_demo_deny" value="true"><?php _e( 'No, go back to the settings page', $this->bws_plugin_text_domain ) ?></button>
-						<?php wp_nonce_field( $this->bws_plugin_basename, 'bws_settings_nonce_name' ); ?>
+						<?php wp_nonce_field( $this->bws_plugin_basename, 'bws_nonce_demo_name' ); ?>
 					</p>
 				</form>
 			</div>
 		<?php }
 
 		/**
-		 * @param bool $install_callback
-		 * @param bool $remove_callback
-		 *
 		 * @return array
 		 */
-		function bws_handle_demo_data( $install_callback = false, $remove_callback = false ) {
-			if ( isset( $_POST['bws_install_demo_confirm'] ) && check_admin_referer( $this->bws_plugin_basename, 'bws_settings_nonce_name' ) ) {
-				return $this->bws_install_demo_data( $install_callback );
-			} elseif ( isset( $_POST['bws_remove_demo_confirm'] ) && check_admin_referer( $this->bws_plugin_basename, 'bws_settings_nonce_name' ) ) {
-				return $this->bws_remove_demo_data( $remove_callback );
-			} else {
+		function bws_handle_demo_data() {
+			if ( isset( $_POST['bws_install_demo_confirm'] ) )
+				return $this->bws_install_demo_data();
+			elseif ( isset( $_POST['bws_remove_demo_confirm'] ) )
+				return $this->bws_remove_demo_data();
+			else
 				return false;
-			}
 		}
 
 		/**
 		 * Load demo data
 		 *
-		 * @param bool|string $callback
-		 *
 		 * @return array $message   message about the result of the query
 		 */
-		function bws_install_demo_data( $callback = false ) {
+		function bws_install_demo_data() {
 			global $wpdb;
 			/* get demo data*/
 			$message   = array(
@@ -127,19 +132,17 @@
 				 * load demo options
 				 */
 				if ( ! empty( $demo_data['options'] ) ) {
-					$plugin_options = get_option( $this->bws_plugin_prefix . 'options' );
 					/* remember old plugin options */
-					if ( ! empty( $plugin_options ) ) {
-						$this->bws_demo_options['options'] = $plugin_options;
+					if ( ! empty( $this->bws_plugin_options ) ) {
+						$this->bws_demo_options['options'] = $this->bws_plugin_options;
 						$demo_data['options']['display_demo_notice'] = 0;
-						update_option( $this->bws_plugin_prefix . 'options', array_merge( $plugin_options, $demo_data['options'] ) );
+						update_option( $this->bws_plugin_prefix . 'options', array_merge( $this->bws_plugin_options, $demo_data['options'] ) );
 					}
 				} else {
 					/* remove demo notice */
-					$plugin_options = get_option( $this->bws_plugin_prefix . 'options' );
-					if ( 0 != $plugin_options['display_demo_notice'] ) {
-						$plugin_options['display_demo_notice'] = 0;
-						update_option( $this->bws_plugin_prefix . 'options', $plugin_options );
+					if ( 0 != $this->bws_plugin_options['display_demo_notice'] ) {
+						$this->bws_plugin_options['display_demo_notice'] = 0;
+						update_option( $this->bws_plugin_prefix . 'options', $this->bws_plugin_options );
 					}
 				}
 
@@ -153,25 +156,25 @@
 					 * load demo terms
 					 */
 					if ( ! empty( $demo_data['terms'] ) ) {
-						foreach ( $demo_data['terms'] as $taxonomy_name => $terms_values_array ) {
-							foreach ( $terms_values_array as $term_key => $term_value_single ) {
-								$term_exists = term_exists( $term_key, $taxonomy_name );
+						foreach ( $demo_data['terms'] as $taxonomy_slug => $terms_values_array ) {
+							foreach ( $terms_values_array as $term_slug => $term_name ) {
+								$term_exists = term_exists( $term_slug, $taxonomy_slug );
 								if ( ! $term_exists ) {
 									$term_id = wp_insert_term(
-										$term_value_single, /* the term. */
-										$taxonomy_name, /* the taxonomy. */
+										$term_name, /* the term. */
+										$taxonomy_slug, /* the taxonomy. */
 										array(
-											'slug' 			=> $term_key
+											'slug' => $term_slug
 										)
 									);
 									if ( is_wp_error( $term_id ) ) {
 										$error ++;
 									} else {
-										$term_IDs[ $taxonomy_name ][ $term_key ] = $term_id['term_id'];
-										$term_IDs_new[ $taxonomy_name ][ $term_key ] = $term_id['term_id'];
+										$term_IDs[ $taxonomy_slug ][ $term_slug ] = $term_id['term_id'];
+										$term_IDs_new[ $taxonomy_slug ][ $term_slug ] = $term_id['term_id'];
 									}
 								} else {
-									$term_IDs[ $taxonomy_name ][ $term_key ] = $term_exists['term_id'];
+									$term_IDs[ $taxonomy_slug ][ $term_slug ] = $term_exists['term_id'];
 								}
 							}
 						}
@@ -188,30 +191,27 @@
 							$post['post_content'] = preg_replace( '/{last_post_id}/', $post_id, $post['post_content'] );
 						}
 						if ( preg_match( '/{template_page}/', $post['post_content'] ) ) {
-							if ( empty( $page_id ) && ! empty( $page_template ) ) {
+							if ( empty( $page_id ) && ! empty( $page_template ) )
 								$page_id = intval( $wpdb->get_var( "SELECT `post_id` FROM $wpdb->postmeta WHERE `meta_key` LIKE '_wp_page_template' AND `meta_value` LIKE '" . $page_template . "' LIMIT 1" ) );
-							}
-							if ( ! empty( $page_id ) ) {
+							if ( ! empty( $page_id ) )
 								$post['post_content'] = preg_replace( '/{template_page}/', '<a href="' . get_permalink( $page_id ) . '">' . get_the_title( $page_id ) . '</a>', $post['post_content'] );
-							}
 						}
 						/* insert current post */
 						$post_id = wp_insert_post( $post );
-						if ( 'post' == $post['post_type'] ) {
+						if ( 'post' == $post['post_type'] )
 							$posttype_post_id = $post_id;
-						}
 
 						/* add taxonomy for posttype */
 						if ( 'post' != $post['post_type'] && 'page' != $post['post_type'] && ! empty( $term_IDs ) ) {
-							foreach ( $term_IDs as $taxonomy_name => $term_array ) {
-								if ( isset( $post['terms'][ $taxonomy_name ] ) ) {
-									$selected_terms = $post['terms'][ $taxonomy_name ];
+							foreach ( $term_IDs as $taxonomy_slug => $term_array ) {
+								if ( isset( $post['terms'][ $taxonomy_slug ] ) ) {
+									$selected_terms = $post['terms'][ $taxonomy_slug ];
 								} else {
 									$selected_terms = array();
 									$selected_terms[] = intval( $term_array[ array_rand( $term_array ) ] );
 								}
 
-								if ( ! wp_set_object_terms( $post_id, $selected_terms, $taxonomy_name, false ) )
+								if ( ! wp_set_object_terms( $post_id, $selected_terms, $taxonomy_slug, false ) )
 									$error ++;
 							}
 						}
@@ -301,7 +301,6 @@
 										 * if there are error unlink the temp file name
 										 */
 										if ( is_wp_error( $tmp ) ) {
-												@unlink( $file_array[ 'tmp_name' ] );
 												continue;
 										}
 
@@ -344,6 +343,13 @@
 								$page_id = $post_id;
 								$page_template = $post['page_template'];
 							}
+							/* save page_id to options */
+							if ( ! empty( $post['save_to_options'] ) ) {
+								$page_id = $post_id;
+								$this->bws_plugin_options[ $post['save_to_options'] ] = $post_id;
+								update_option( $this->bws_plugin_prefix . 'options', $this->bws_plugin_options );
+							}
+
 							/* first inserted image is thummbnail for post */
 							if ( ! empty( $featured_attach_id ) )
 								update_post_meta( $post_id, '_thumbnail_id', $featured_attach_id );
@@ -366,9 +372,11 @@
 
 						if ( ! empty( $demo_data['options'] ) )
 							$message['options'] = $demo_data['options'];
+						else
+							$message['options'] = $this->bws_plugin_options;
 
-						if ( $callback && function_exists( $callback ) )
-							call_user_func( $callback );
+						if ( $this->install_callback && function_exists( $this->install_callback ) )
+							call_user_func( $this->install_callback );
 					} else {
 						$message['error'] = __( 'Demo data installation proceeded with some errors.', $this->bws_plugin_text_domain );
 					}
@@ -434,11 +442,9 @@
 		/**
 		 * Remove demo data
 		 *
-		 * @param $callback
-		 *
 		 * @return array $message   message about the result of the query
 		 */
-		function bws_remove_demo_data( $callback = false ) {
+		function bws_remove_demo_data() {
 			$error        = 0;
 			$message      = array(
 				'error'   => null,
@@ -456,13 +462,12 @@
 				if ( ! empty( $this->bws_demo_options['options'] ) ) {
 					$this->bws_demo_options['options']['display_demo_notice'] = 0;
 					update_option( $this->bws_plugin_prefix . 'options', $this->bws_demo_options['options'] );
-					if ( $callback && function_exists( $callback ) )
-						call_user_func( $callback );
+					if ( $this->remove_callback && function_exists( $this->remove_callback ) )
+						call_user_func( $this->remove_callback );
 				}
 				$done = $this->bws_delete_demo_option();
-				if ( ! $done ) {
+				if ( ! $done )
 					$error ++;
-				}
 
 				/*
 				 * Delete all posts
@@ -472,9 +477,8 @@
 						/* delete only not modified posts */
 						if ( get_post_modified_time( 'U', false, $post_id, false ) == $last_modified ) {
 							$done = wp_delete_post( $post_id, true );
-							if ( ! $done ) {
+							if ( ! $done )
 								$error ++;
-							}
 						}
 					}
 				}
@@ -494,17 +498,15 @@
 				if ( ! empty( $this->bws_demo_options['attachments'] ) ) {
 					foreach ( $this->bws_demo_options['attachments'] as $post_id ) {
 						$done = wp_delete_attachment( $post_id, true );
-						if ( ! $done ) {
+						if ( ! $done )
 							$error ++;
-						}
 					}
 				}
 				if ( ! empty( $this->bws_demo_options['distant_attachments'] ) ) {
 					foreach ( $this->bws_demo_options['distant_attachments'] as $post_id ) {
 						$done = wp_delete_attachment( $post_id, true );
-						if ( ! $done ) {
+						if ( ! $done )
 							$error ++;
-						}
 					}
 				}
 				if ( empty( $error ) ) {
@@ -533,9 +535,8 @@
 				global $wp_version;
 
 				if ( isset( $_POST['bws_hide_demo_notice'] ) && check_admin_referer( $this->bws_plugin_basename, 'bws_demo_nonce_name' ) ) {
-					$plugin_options = get_option( $this->bws_plugin_prefix . 'options' );
-					$plugin_options['display_demo_notice'] = 0;
-					update_option( $this->bws_plugin_prefix . 'options', $plugin_options );
+					$this->bws_plugin_options['display_demo_notice'] = 0;
+					update_option( $this->bws_plugin_prefix . 'options', $this->bws_plugin_options );
 					return;
 				}
 				if ( ! isset( $_POST['bws_handle_demo'] ) && ! isset( $_POST['bws_install_demo_confirm'] ) ) {
Binary file wp/wp-content/plugins/portfolio/languages/portfolio-ru_RU.mo has changed
--- a/wp/wp-content/plugins/portfolio/languages/portfolio-ru_RU.po	Fri Sep 05 18:52:52 2025 +0200
+++ b/wp/wp-content/plugins/portfolio/languages/portfolio-ru_RU.po	Mon Sep 08 19:44:41 2025 +0200
@@ -2,146 +2,156 @@
 msgstr ""
 "Project-Id-Version: portfolio\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-10-04 12:19+0300\n"
-"PO-Revision-Date: 2021-10-04 12:20+0300\n"
+"POT-Creation-Date: 2024-12-24 14:48+0200\n"
+"PO-Revision-Date: 2024-12-24 14:49+0200\n"
 "Last-Translator: bestwebsoft.com <plugins@bestwebsoft.com>\n"
 "Language-Team: bestwebsoft.com <plugin@bestwebsoft.com>\n"
 "Language: ru\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Poedit-KeywordsList: __;_e\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"X-Poedit-KeywordsList: __;_e;esc_html_e;esc_html__;esc_attr_e;esc_attr__\n"
 "X-Poedit-Basepath: ..\n"
 "X-Poedit-SourceCharset: UTF-8\n"
-"X-Generator: Poedit 2.3\n"
-"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
-"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"X-Generator: Poedit 3.5\n"
 "X-Poedit-SearchPath-0: .\n"
 "X-Poedit-SearchPathExcluded-0: bws_menu\n"
 
-#: inc/class-prtfl-settings.php:24 portfolio.php:40 portfolio.php:1633
-#: portfolio.php:1651
+#: includes/class-portfolio-technologies-widget.php:20
+#: includes/class-prtfl-settings.php:108 portfolio.php:369 portfolio.php:383
+#: portfolio.php:1271
+msgid "Technologies"
+msgstr "Технологии"
+
+#: includes/class-portfolio-technologies-widget.php:21
+msgid "The tag cloud with your most used portfolio technologies."
+msgstr "Облако тегов из технологий плагина Portfolio."
+
+#: includes/class-portfolio-technologies-widget.php:73
+#: includes/class-prtfl-settings.php:430 includes/class-prtfl-widget.php:56
+msgid "Title"
+msgstr "Название"
+
+#: includes/class-prtfl-settings.php:50 portfolio.php:42 portfolio.php:1808
+#: portfolio.php:1835
 msgid "Settings"
 msgstr "Настройки"
 
-#: inc/class-prtfl-settings.php:25 portfolio.php:269
+#: includes/class-prtfl-settings.php:51 portfolio.php:292
 msgid "Project"
 msgstr "Проект"
 
-#: inc/class-prtfl-settings.php:26
+#: includes/class-prtfl-settings.php:52
 msgid "Misc"
 msgstr "Разное"
 
-#: inc/class-prtfl-settings.php:27
+#: includes/class-prtfl-settings.php:53
 msgid "Custom Code"
 msgstr "Пользовательский код"
 
-#: inc/class-prtfl-settings.php:28
+#: includes/class-prtfl-settings.php:54
 msgid "Import / Export"
 msgstr "Импорт / Экспорт"
 
-#: inc/class-prtfl-settings.php:29
+#: includes/class-prtfl-settings.php:55
 msgid "License Key"
 msgstr "Лицензионный ключ"
 
-#: inc/class-prtfl-settings.php:79 portfolio.php:314 portfolio.php:328
+#: includes/class-prtfl-settings.php:107 portfolio.php:337 portfolio.php:351
 msgid "Executors"
 msgstr "Исполнители"
 
-#: inc/class-prtfl-settings.php:80 portfolio.php:346 portfolio.php:360
-#: portfolio.php:455 portfolio.php:1199
-msgid "Technologies"
-msgstr "Технологии"
-
-#: inc/class-prtfl-settings.php:81 portfolio.php:89
+#: includes/class-prtfl-settings.php:109 portfolio.php:88
 msgid "Date of completion"
 msgstr "Дата окончания выполнения"
 
-#: inc/class-prtfl-settings.php:82
+#: includes/class-prtfl-settings.php:110
 msgid "Link"
 msgstr "Ссылка"
 
-#: inc/class-prtfl-settings.php:83
+#: includes/class-prtfl-settings.php:111
 msgid "Short Description"
 msgstr "Краткое описание"
 
-#: inc/class-prtfl-settings.php:84
+#: includes/class-prtfl-settings.php:112
 msgid "Description"
 msgstr "Описание"
 
-#: inc/class-prtfl-settings.php:156
+#: includes/class-prtfl-settings.php:188
 msgid "Custom image size was changed. You need to update project images."
 msgstr ""
 "Пользовательский размер изображения был изменен. Вам необходимо обновить "
 "изображения проектов."
 
-#: inc/class-prtfl-settings.php:248
+#: includes/class-prtfl-settings.php:288
 msgid "Settings saved."
 msgstr "Настройки сохранены."
 
-#: inc/class-prtfl-settings.php:260
+#: includes/class-prtfl-settings.php:301
 msgid "Please enable JavaScript in Your browser."
 msgstr "Пожалуйста, включите поддержку JavaScript в вашем браузере."
 
-#: inc/class-prtfl-settings.php:265
+#: includes/class-prtfl-settings.php:306
 msgid "Update Images"
 msgstr "Обновить изображения"
 
-#: inc/class-prtfl-settings.php:278 portfolio.php:40 portfolio.php:416
+#: includes/class-prtfl-settings.php:325 portfolio.php:42 portfolio.php:439
 msgid "Portfolio Settings"
 msgstr "Настройки Portfolio"
 
-#: inc/class-prtfl-settings.php:283
+#: includes/class-prtfl-settings.php:330
 msgid "Portfolio Page"
 msgstr "Страница портфолио"
 
-#: inc/class-prtfl-settings.php:291
+#: includes/class-prtfl-settings.php:342
 msgid "Base page where all existing projects will be displayed."
 msgstr ""
 "Базовая страница, на которой будут отображены все существующие проекты."
 
-#: inc/class-prtfl-settings.php:295
+#: includes/class-prtfl-settings.php:346
 msgid "Number of Columns"
 msgstr "Количество колонок"
 
-#: inc/class-prtfl-settings.php:297 inc/class-prtfl-settings.php:304
+#: includes/class-prtfl-settings.php:348 includes/class-prtfl-settings.php:355
 msgid "columns"
 msgstr "колонок"
 
-#: inc/class-prtfl-settings.php:298
+#: includes/class-prtfl-settings.php:349
 #, php-format
 msgid "Number of portfolio columns (default is %s)."
 msgstr "Количество колонок portfolio (по умолчанию - %s)."
 
-#: inc/class-prtfl-settings.php:302
+#: includes/class-prtfl-settings.php:353
 msgid "Number of Image Columns"
 msgstr "Количество колонок изображений"
 
-#: inc/class-prtfl-settings.php:305
+#: includes/class-prtfl-settings.php:356
 #, php-format
 msgid "Number of image columns (default is %s)."
 msgstr "Количество колонок изображений (по умолчанию - %s)."
 
-#: inc/class-prtfl-settings.php:309
+#: includes/class-prtfl-settings.php:360
 msgid "Image Size"
 msgstr "Размер изображения"
 
-#: inc/class-prtfl-settings.php:315 inc/class-prtfl-settings.php:333
+#: includes/class-prtfl-settings.php:366 includes/class-prtfl-settings.php:384
 msgid "Custom"
 msgstr "Пользовательский"
 
-#: inc/class-prtfl-settings.php:317
+#: includes/class-prtfl-settings.php:368
 msgid ""
 "Maximum portfolio image size. \"Custom\" uses the Image Dimensions values."
 msgstr ""
 "Максимальный размер изображений портфолио. \"Пользовательский\" использует "
 "значения, указанные в поле Размеры изображения."
 
-#: inc/class-prtfl-settings.php:321
+#: includes/class-prtfl-settings.php:372
 msgid "Custom Image Size"
 msgstr "Пользовательский размер изображения"
 
-#: inc/class-prtfl-settings.php:323
+#: includes/class-prtfl-settings.php:374
 msgid ""
 "Adjust these values based on the number of columns in your project. This "
 "won't affect the full size of your images in the lightbox."
@@ -149,144 +159,140 @@
 "Настройте эти значения на основе количества колонок в вашем проекте. Это не "
 "влияет на размеры изображения в лайтбоксе."
 
-#: inc/class-prtfl-settings.php:327
+#: includes/class-prtfl-settings.php:378
 msgid "Cover Image Size"
 msgstr "Размер изображения альбома"
 
-#: inc/class-prtfl-settings.php:335
+#: includes/class-prtfl-settings.php:386
 msgid "Maximum cover image size. \"Custom\" uses the Image Dimensions values."
 msgstr ""
 "Максимальный размер изображений альбома. \"Пользовательский\" использует "
 "значения, указанные в поле Размеры изображения."
 
-#: inc/class-prtfl-settings.php:339
+#: includes/class-prtfl-settings.php:390
 msgid "Custom Cover Image Size"
 msgstr "Пользовательский размер изображения альбома"
 
-#: inc/class-prtfl-settings.php:348 inc/class-prtfl-settings.php:404
-#: inc/class-prtfl-settings.php:514
+#: includes/class-prtfl-settings.php:399 includes/class-prtfl-settings.php:455
+#: includes/class-prtfl-settings.php:570
 msgid "Close"
 msgstr "Закрыть"
 
-#: inc/class-prtfl-settings.php:352
+#: includes/class-prtfl-settings.php:403
 msgid "Slider Image Size"
 msgstr "Размер слайдера"
 
-#: inc/class-prtfl-settings.php:357
+#: includes/class-prtfl-settings.php:408
 msgid "Maximum slider image size. \"Custom\" uses the Image Dimensions values."
 msgstr ""
 "Максимальный размер изображений слайдера. \"Пользовательский\" использует "
 "значения, указанные в поле Размеры изображения."
 
-#: inc/class-prtfl-settings.php:361
+#: includes/class-prtfl-settings.php:412
 msgid "Sort Projects Option"
 msgstr "Cортировка проектов по"
 
-#: inc/class-prtfl-settings.php:364
+#: includes/class-prtfl-settings.php:415
 msgid "Enable to display sort projects manually by date or title."
 msgstr "Включить сортировку проектов вручную по дате или названию."
 
-#: inc/class-prtfl-settings.php:375
+#: includes/class-prtfl-settings.php:426
 msgid "Sort Projects by"
 msgstr "Cортировка проектов по"
 
-#: inc/class-prtfl-settings.php:378
+#: includes/class-prtfl-settings.php:429
 msgid "Project ID"
 msgstr "ID проекта"
 
-#: inc/class-prtfl-settings.php:379 portfolio.php:481 portfolio.php:2406
-msgid "Title"
-msgstr "Название"
-
-#: inc/class-prtfl-settings.php:380
+#: includes/class-prtfl-settings.php:431
 msgid "Date"
 msgstr "Дата"
 
-#: inc/class-prtfl-settings.php:381
+#: includes/class-prtfl-settings.php:432
 msgid "Last modified date"
 msgstr "Дата последнего изменения"
 
-#: inc/class-prtfl-settings.php:382
+#: includes/class-prtfl-settings.php:433
 msgid "Comment count"
 msgstr "Количество комментариев"
 
-#: inc/class-prtfl-settings.php:383
+#: includes/class-prtfl-settings.php:434
 msgid "Sorting order (the input field for sorting order)"
 msgstr "Порядок сортировки (поле ввода для сортировки)"
 
-#: inc/class-prtfl-settings.php:384
+#: includes/class-prtfl-settings.php:435
 msgid "Author"
 msgstr "Автор"
 
-#: inc/class-prtfl-settings.php:385
+#: includes/class-prtfl-settings.php:436
 msgid "Random"
 msgstr "Произвольно"
 
-#: inc/class-prtfl-settings.php:387
+#: includes/class-prtfl-settings.php:438
 msgid "Select projects sorting order in your portfolio page."
 msgstr "Выберите порядок сортировки проектов на странице портфолио."
 
-#: inc/class-prtfl-settings.php:391
+#: includes/class-prtfl-settings.php:442
 msgid "Arrange Projects by"
 msgstr "Сортировать проекты"
 
-#: inc/class-prtfl-settings.php:394
+#: includes/class-prtfl-settings.php:445
 msgid "Ascending (e.g. 1, 2, 3; a, b, c)"
 msgstr "По возрастанию (например, 1, 2, 3; а, б, в)"
 
-#: inc/class-prtfl-settings.php:396
+#: includes/class-prtfl-settings.php:447
 msgid "Descending (e.g. 3, 2, 1; c, b, a)"
 msgstr "По убыванию (например, 3, 2, 1; в, б, а)"
 
-#: inc/class-prtfl-settings.php:408
+#: includes/class-prtfl-settings.php:459
 msgid "Lightbox Helper"
 msgstr "Вспомогательные элементы в лайтбоксе"
 
-#: inc/class-prtfl-settings.php:410
+#: includes/class-prtfl-settings.php:461
 msgid "Enable to use a lightbox helper navigation between images."
 msgstr ""
 "Разрешить использовать вспомогательные элементы лайтбокса для навигации "
 "между изображениями."
 
-#: inc/class-prtfl-settings.php:414
+#: includes/class-prtfl-settings.php:465
 msgid "Lightbox Helper Type"
 msgstr "Тип вспомогательных элементов лайтбокса"
 
-#: inc/class-prtfl-settings.php:417
+#: includes/class-prtfl-settings.php:468
 msgid "Thumbnails"
 msgstr "Миниатюры"
 
-#: inc/class-prtfl-settings.php:418
+#: includes/class-prtfl-settings.php:469
 msgid "Buttons"
 msgstr "Кнопки"
 
-#: inc/class-prtfl-settings.php:429
+#: includes/class-prtfl-settings.php:480
 msgid "Text Link"
 msgstr "Текстовая ссылка"
 
-#: inc/class-prtfl-settings.php:432
+#: includes/class-prtfl-settings.php:483
 msgid "Enable to display link field as a text for non-registered users."
 msgstr ""
 "Включить отображение поля ссылки в качестве текста для незарегистрированных "
 "пользователей."
 
-#: inc/class-prtfl-settings.php:437
+#: includes/class-prtfl-settings.php:488
 msgid "Automatic Mailout when Publishing a New:"
 msgstr "Автоматическая рассылка при публикации нового:"
 
-#: inc/class-prtfl-settings.php:443 portfolio.php:268
+#: includes/class-prtfl-settings.php:496 portfolio.php:291
 msgid "Projects"
 msgstr "Проекты"
 
-#: inc/class-prtfl-settings.php:450
+#: includes/class-prtfl-settings.php:504
 msgid "Select mailout priority"
 msgstr "Выберите приоритет рассылки"
 
-#: inc/class-prtfl-settings.php:451
+#: includes/class-prtfl-settings.php:506
 msgid "Less number - higher priority"
 msgstr "Меньше числа - более высокий приоритет"
 
-#: inc/class-prtfl-settings.php:457 inc/class-prtfl-settings.php:461
+#: includes/class-prtfl-settings.php:512 includes/class-prtfl-settings.php:518
 msgid ""
 "Enable to automatic mailout when publishing a new bws-portfolios and tips. "
 "Sender Pro plugin is required."
@@ -294,59 +300,59 @@
 "Включите автоматическую рассылку при публикации новых bws-портфолио и "
 "советов. Требуется плагин Sender Pro."
 
-#: inc/class-prtfl-settings.php:457
-msgid "Ativate Now"
+#: includes/class-prtfl-settings.php:512 includes/class-prtfl-settings.php:663
+msgid "Activate Now"
 msgstr "Активировать сейчас"
 
-#: inc/class-prtfl-settings.php:461 inc/class-prtfl-settings.php:619
+#: includes/class-prtfl-settings.php:518 includes/class-prtfl-settings.php:679
 msgid "Install Now"
 msgstr "Установить сейчас"
 
-#: inc/class-prtfl-settings.php:474
+#: includes/class-prtfl-settings.php:533
 msgid "Single Project Settings"
 msgstr "Настройки отдельного проекта"
 
-#: inc/class-prtfl-settings.php:479 inc/class-prtfl-settings.php:518
+#: includes/class-prtfl-settings.php:538 includes/class-prtfl-settings.php:574
 msgid "Projects Fields"
 msgstr "Поля проектов"
 
-#: inc/class-prtfl-settings.php:493 portfolio.php:99
+#: includes/class-prtfl-settings.php:550 portfolio.php:98
 msgid "Source Files, URL"
 msgstr "Исходные файлы, URL"
 
-#: inc/class-prtfl-settings.php:497
+#: includes/class-prtfl-settings.php:553
 msgid "Display only for logged-in users"
 msgstr "Отображать только для авторизованных пользователей"
 
-#: inc/class-prtfl-settings.php:503 inc/class-prtfl-settings.php:541
+#: includes/class-prtfl-settings.php:559 includes/class-prtfl-settings.php:593
 msgid "\"More screenshots\" block"
 msgstr "Блок \"Больше скриншотов\""
 
-#: inc/class-prtfl-settings.php:523 inc/class-prtfl-settings.php:524
-#: portfolio.php:579
+#: includes/class-prtfl-settings.php:578 includes/class-prtfl-settings.php:579
+#: portfolio.php:599
 msgid "Categories"
 msgstr "Категории"
 
-#: inc/class-prtfl-settings.php:528 inc/class-prtfl-settings.php:529
-#: portfolio.php:580
+#: includes/class-prtfl-settings.php:582 includes/class-prtfl-settings.php:583
+#: portfolio.php:600
 msgid "Sectors"
 msgstr "Отрасли"
 
-#: inc/class-prtfl-settings.php:533 inc/class-prtfl-settings.php:534
-#: portfolio.php:581
+#: includes/class-prtfl-settings.php:586 includes/class-prtfl-settings.php:587
+#: portfolio.php:601
 msgid "Services"
 msgstr "Сервисы"
 
-#: inc/class-prtfl-settings.php:538 inc/class-prtfl-settings.php:539
-#: portfolio.php:603
+#: includes/class-prtfl-settings.php:590 includes/class-prtfl-settings.php:591
+#: portfolio.php:629
 msgid "Client"
 msgstr "Клиент"
 
-#: inc/class-prtfl-settings.php:558
+#: includes/class-prtfl-settings.php:612
 msgid "Demo Data"
 msgstr "Демо данные"
 
-#: inc/class-prtfl-settings.php:560
+#: includes/class-prtfl-settings.php:614
 msgid ""
 "Install demo data to create portfolio projects with images, post with "
 "shortcodes and page with a list of all portfolio projects."
@@ -354,11 +360,11 @@
 "Установите демо-данные, чтобы создать проекты портфолио с изображениями, "
 "запись с шорткодами и страницу со списком всех проектов портфолио."
 
-#: inc/class-prtfl-settings.php:580
+#: includes/class-prtfl-settings.php:637
 msgid "Portfolio Post Type"
 msgstr "Тип записи портфолио"
 
-#: inc/class-prtfl-settings.php:584
+#: includes/class-prtfl-settings.php:641
 msgid ""
 "Enable to avoid conflicts with other portfolio plugins installed. All "
 "portfolio created earlier will stay unchanged. However, after enabling we "
@@ -370,36 +376,32 @@
 "после переименования проверьте, пожалуйста, настройки других плагинов, где "
 "используется тип записи \"portfolio\"."
 
-#: inc/class-prtfl-settings.php:590
+#: includes/class-prtfl-settings.php:647
 msgid "Portfolio Slug"
 msgstr "Ярлык портфолио"
 
-#: inc/class-prtfl-settings.php:593
+#: includes/class-prtfl-settings.php:650
 msgid "Enter the unique portfolio slug."
 msgstr "Введите уникальный ярлык портфолио."
 
-#: inc/class-prtfl-settings.php:597
+#: includes/class-prtfl-settings.php:654
 msgid "Search Portfolio Projects"
 msgstr "Поиск проектов портфолио"
 
-#: inc/class-prtfl-settings.php:603
-msgid "Activate Now"
-msgstr "Активировать сейчас"
-
-#: inc/class-prtfl-settings.php:622
+#: includes/class-prtfl-settings.php:683
 msgid "Enable to include portfolio projects to your website search."
 msgstr "Включить проекты портфолио в поиск на вашем сайте."
 
-#: inc/class-prtfl-settings.php:622
+#: includes/class-prtfl-settings.php:683
 #, php-format
 msgid "%s plugin is required."
 msgstr "Требуется плагин %s."
 
-#: inc/class-prtfl-settings.php:636
+#: includes/class-prtfl-settings.php:698
 msgid "Portfolio Shortcode"
 msgstr "Шорткод портфолио"
 
-#: inc/class-prtfl-settings.php:639
+#: includes/class-prtfl-settings.php:701
 msgid ""
 "Add the latest portfolio projects using the following shortcode (where * is "
 "a number of projects to display):"
@@ -407,415 +409,435 @@
 "Добавьте последние проекты портфолио, используя следующий шорткод (где * - "
 "количество отображаемых проектов):"
 
-#: inc/demo-data/class-bws-demo-data.php:31
+#: includes/class-prtfl-widget.php:20
+msgid "Latest Portfolio Items"
+msgstr "Последние проекты портфолио"
+
+#: includes/class-prtfl-widget.php:21
+msgid "Displays the latest Portfolio projects."
+msgstr "Отображение последних проектов портфолио."
+
+#: includes/class-prtfl-widget.php:62
+msgid "Number of Projects:"
+msgstr "Количество проектов:"
+
+#: includes/class-prtfl-widget.php:68
+msgid "Number of Colums:"
+msgstr "Количество столбцов:"
+
+#: includes/demo-data/class-bws-demo-data.php:42
 msgid "Install Demo Data"
 msgstr "Установить демо-данные"
 
-#: inc/demo-data/class-bws-demo-data.php:34
+#: includes/demo-data/class-bws-demo-data.php:45
 msgid "Remove Demo Data"
 msgstr "Удалить демо-данные"
 
-#: inc/demo-data/class-bws-demo-data.php:35
+#: includes/demo-data/class-bws-demo-data.php:46
 msgid "Delete demo data and restore previous plugin settings."
 msgstr "Удалить демо данные и восстановить предыдущие настройки плагина."
 
-#: inc/demo-data/class-bws-demo-data.php:48
-#: inc/demo-data/class-bws-demo-data.php:595
+#: includes/demo-data/class-bws-demo-data.php:59
+#: includes/demo-data/class-bws-demo-data.php:593
 msgid "Yes, install demo data"
 msgstr "Да, установить демо-данные"
 
-#: inc/demo-data/class-bws-demo-data.php:49
+#: includes/demo-data/class-bws-demo-data.php:60
 msgid "Are you sure you want to install demo data?"
 msgstr "Вы уверены, что хотите установить демо-данные?"
 
-#: inc/demo-data/class-bws-demo-data.php:51
+#: includes/demo-data/class-bws-demo-data.php:62
 msgid "Yes, remove demo data"
 msgstr "Да, удалить демо-данные"
 
-#: inc/demo-data/class-bws-demo-data.php:52
+#: includes/demo-data/class-bws-demo-data.php:63
 msgid "Are you sure you want to remove demo data?"
 msgstr "Вы уверены, что хотите удалить демо-данные?"
 
-#: inc/demo-data/class-bws-demo-data.php:59
+#: includes/demo-data/class-bws-demo-data.php:70
 msgid "No, go back to the settings page"
 msgstr "Нет, вернуться на страницу настроек"
 
-#: inc/demo-data/class-bws-demo-data.php:115
+#: includes/demo-data/class-bws-demo-data.php:120
 msgid "Can not get demo data."
 msgstr "Невозможно получить демо-данные."
 
-#: inc/demo-data/class-bws-demo-data.php:122
+#: includes/demo-data/class-bws-demo-data.php:127
 msgid "Demo settings are already installed."
 msgstr "Настройки демо уже установлены."
 
-#: inc/demo-data/class-bws-demo-data.php:362
+#: includes/demo-data/class-bws-demo-data.php:365
 msgid "Demo data successfully installed."
 msgstr "Демо-данные успешно установлены."
 
-#: inc/demo-data/class-bws-demo-data.php:364
+#: includes/demo-data/class-bws-demo-data.php:367
 msgid "View post with shortcodes"
 msgstr "Просмотрите запись с шорткодами"
 
-#: inc/demo-data/class-bws-demo-data.php:367
+#: includes/demo-data/class-bws-demo-data.php:370
 msgid "View page with examples"
 msgstr "Просмотрите запись с примерами"
 
-#: inc/demo-data/class-bws-demo-data.php:376
+#: includes/demo-data/class-bws-demo-data.php:381
 msgid "Demo data installation proceeded with some errors."
 msgstr "Установка демо-данных прошла с ошибками."
 
-#: inc/demo-data/class-bws-demo-data.php:379
+#: includes/demo-data/class-bws-demo-data.php:384
 msgid "Post data is missing."
 msgstr "Контент записи отсутствует."
 
-#: inc/demo-data/class-bws-demo-data.php:453
+#: includes/demo-data/class-bws-demo-data.php:456
 msgid "Demo data have been already removed."
 msgstr "Демо-данные уже удалены."
 
-#: inc/demo-data/class-bws-demo-data.php:514
+#: includes/demo-data/class-bws-demo-data.php:513
 msgid "Demo data successfully removed."
 msgstr "Демо-данные успешно удалены."
 
-#: inc/demo-data/class-bws-demo-data.php:518
+#: includes/demo-data/class-bws-demo-data.php:517
 msgid "Removing demo data with some errors occurred."
 msgstr "Удаление демо-данных прошло с ошибками."
 
-#: inc/demo-data/class-bws-demo-data.php:587
+#: includes/demo-data/class-bws-demo-data.php:585
 msgid "Close notice"
 msgstr "Закрыть сообщение"
 
-#: inc/demo-data/class-bws-demo-data.php:593
+#: includes/demo-data/class-bws-demo-data.php:591
 #, php-format
 msgid "Do you want to install demo content and settings for %s now?"
 msgstr "Вы хотите установить демо контент и настройки для %s?"
 
-#: portfolio.php:46
+#: portfolio.php:48
 msgid "Upgrade to Pro"
 msgstr "Обновить до Pro"
 
-#: portfolio.php:84
+#: portfolio.php:83
 msgid "Short description"
 msgstr "Краткое описание"
 
-#: portfolio.php:94
+#: portfolio.php:93
 msgid "Project, URL"
 msgstr "Проект, URL"
 
-#: portfolio.php:239
+#: portfolio.php:260
 msgid "Date of completion:"
 msgstr "Дата окончания выполнения:"
 
-#: portfolio.php:240
+#: portfolio.php:261
 msgid "Project, URL:"
 msgstr "Проект, URL:"
 
-#: portfolio.php:241
+#: portfolio.php:262
 msgid "Short description:"
 msgstr "Краткое описание:"
 
-#: portfolio.php:242
+#: portfolio.php:263
 msgid "Description:"
 msgstr "Описание:"
 
-#: portfolio.php:243
+#: portfolio.php:264
 msgid "Source Files, URL:"
 msgstr "Исходные файлы, URL:"
 
-#: portfolio.php:244
+#: portfolio.php:265
 msgid "Executor:"
 msgstr "Исполнитель:"
 
-#: portfolio.php:245
+#: portfolio.php:266
 msgid "More screenshots:"
 msgstr "Больше скриншотов:"
 
-#: portfolio.php:246
+#: portfolio.php:267
 msgid "Technologies:"
 msgstr "Технологии:"
 
-#: portfolio.php:267
+#: portfolio.php:290
 msgid "Portfolio"
 msgstr "Portfolio"
 
-#: portfolio.php:270
+#: portfolio.php:293
 msgid "Add New"
 msgstr "Добавить проект"
 
-#: portfolio.php:271
+#: portfolio.php:294
 msgid "Add New Project"
 msgstr "Добавить новый проект"
 
-#: portfolio.php:272
+#: portfolio.php:295
 msgid "Edit"
 msgstr "Редактировать"
 
-#: portfolio.php:273
+#: portfolio.php:296
 msgid "Edit Project"
 msgstr "Редактировать проект"
 
-#: portfolio.php:274
+#: portfolio.php:297
 msgid "New Project"
 msgstr "Новый проект"
 
-#: portfolio.php:275 portfolio.php:276
+#: portfolio.php:298 portfolio.php:299
 msgid "View Project"
 msgstr "Просмотреть проект"
 
-#: portfolio.php:277
+#: portfolio.php:300
 msgid "Search Projects"
 msgstr "Поиск проектов"
 
-#: portfolio.php:278
+#: portfolio.php:301
 msgid "No project found"
 msgstr "Ни одного проекта не найдено"
 
-#: portfolio.php:279
+#: portfolio.php:302
 msgid "No project found in Trash"
 msgstr "Ни одного проекта в корзине не найдено"
 
-#: portfolio.php:280
+#: portfolio.php:303
 msgid "Parent Project"
 msgstr "Родительский проект"
 
-#: portfolio.php:281
+#: portfolio.php:304
 msgid "Filter projects list"
 msgstr "Фильтр списка проектов"
 
-#: portfolio.php:282
+#: portfolio.php:305
 msgid "Projects list navigation"
 msgstr "Навигация списка проектов"
 
-#: portfolio.php:283
+#: portfolio.php:306
 msgid "Projects list"
 msgstr "Список проектов"
 
-#: portfolio.php:285
+#: portfolio.php:308
 msgid "Create a project item"
 msgstr "Создать проект"
 
-#: portfolio.php:315
+#: portfolio.php:338
 msgid "Executor"
 msgstr "Профиль исполнителя"
 
-#: portfolio.php:316
+#: portfolio.php:339
 msgid "Search Executors"
 msgstr "Искать исполнителя"
 
-#: portfolio.php:317
+#: portfolio.php:340
 msgid "Popular Executors"
 msgstr "Популярные исполнители"
 
-#: portfolio.php:318
+#: portfolio.php:341
 msgid "All Executors"
 msgstr "Все исполнители"
 
-#: portfolio.php:319
+#: portfolio.php:342
 msgid "Parent Executor"
 msgstr "Родительский исполнитель"
 
-#: portfolio.php:320
+#: portfolio.php:343
 msgid "Parent Executor:"
 msgstr "Родительский исполнитель:"
 
-#: portfolio.php:321
+#: portfolio.php:344
 msgid "Edit Executor"
 msgstr "Редактировать исполнителя"
 
-#: portfolio.php:322
+#: portfolio.php:345
 msgid "Update Executor"
 msgstr "Обновить исполнителя"
 
-#: portfolio.php:323
+#: portfolio.php:346
 msgid "Add New Executor"
 msgstr "Добавить нового исполнителя"
 
-#: portfolio.php:324
+#: portfolio.php:347
 msgid "New Executor Name"
 msgstr "Имя нового Исполнителя"
 
-#: portfolio.php:325
+#: portfolio.php:348
 msgid "Separate executors with commas"
 msgstr "Разделите исполнителей запятыми"
 
-#: portfolio.php:326
+#: portfolio.php:349
 msgid "Add or remove Executor"
 msgstr "Добавить или удалить исполнителя"
 
-#: portfolio.php:327
+#: portfolio.php:350
 msgid "Choose from the most used Executors"
 msgstr "Выбрать из списка часто используемых исполнителей"
 
-#: portfolio.php:329
+#: portfolio.php:352
 msgid "Executors list navigation"
 msgstr "Навигация списка исполнителей"
 
-#: portfolio.php:330
+#: portfolio.php:353
 msgid "Executors list"
 msgstr "Список исполнителей"
 
-#: portfolio.php:347
+#: portfolio.php:370
 msgid "Technology"
 msgstr "Технология"
 
-#: portfolio.php:348
+#: portfolio.php:371
 msgid "Search Technologies"
 msgstr "Поиск технологии"
 
-#: portfolio.php:349
+#: portfolio.php:372
 msgid "Popular Technologies"
 msgstr "Популярные Технологии"
 
-#: portfolio.php:350
+#: portfolio.php:373
 msgid "All Technologies"
 msgstr "Все Технологии"
 
-#: portfolio.php:351
+#: portfolio.php:374
 msgid "Parent Technology"
 msgstr "Родительская Технология"
 
-#: portfolio.php:352
+#: portfolio.php:375
 msgid "Parent Technology:"
 msgstr "Родительская Технология:"
 
-#: portfolio.php:353
+#: portfolio.php:376
 msgid "Edit Technology"
 msgstr "Редактировать Технологию"
 
-#: portfolio.php:354
+#: portfolio.php:377
 msgid "Update Technology"
 msgstr "Обновить Технологию"
 
-#: portfolio.php:355
+#: portfolio.php:378
 msgid "Add New Technology"
 msgstr "Добавить новую Технологию"
 
-#: portfolio.php:356
+#: portfolio.php:379
 msgid "New Technology Name"
 msgstr "Название новой Технологии"
 
-#: portfolio.php:357
+#: portfolio.php:380
 msgid "Separate technologies with commas"
 msgstr "Разделите технологии запятыми"
 
-#: portfolio.php:358
+#: portfolio.php:381
 msgid "Add or remove Technology"
 msgstr "Добавить или удалить Технологию"
 
-#: portfolio.php:359
+#: portfolio.php:382
 msgid "Choose from the most used technologies"
 msgstr "Выбрать из наиболее используемых технологий"
 
-#: portfolio.php:361
+#: portfolio.php:384
 msgid "Technologies list navigation"
 msgstr "Навигация списка технологий"
 
-#: portfolio.php:362
+#: portfolio.php:385
 msgid "Technologies list"
 msgstr "Список технологий"
 
-#: portfolio.php:456
-msgid "The tag cloud with your most used portfolio technologies."
-msgstr "Облако тегов из технологий плагина Portfolio."
-
-#: portfolio.php:574
+#: portfolio.php:594
 msgid "Images"
 msgstr "Изображения"
 
-#: portfolio.php:575
+#: portfolio.php:595
 msgid "General"
 msgstr "Общее"
 
-#: portfolio.php:614
+#: portfolio.php:642
 msgid "Featured project"
 msgstr "Избранный проект"
 
-#: portfolio.php:616
+#: portfolio.php:644
 msgid "Add to slider"
 msgstr "Добавить в слайдер"
 
-#: portfolio.php:620 portfolio.php:679 portfolio.php:720 portfolio.php:761
+#: portfolio.php:648 portfolio.php:711 portfolio.php:754 portfolio.php:797
 msgid "Learn More"
 msgstr "Подробнее"
 
-#: portfolio.php:660
+#: portfolio.php:692
 msgid "All Categories"
 msgstr "Все Категории"
 
-#: portfolio.php:661 portfolio.php:701 portfolio.php:742
+#: portfolio.php:693 portfolio.php:735 portfolio.php:778
 msgid "Most Used"
 msgstr "Наиболее используемые"
 
-#: portfolio.php:666 portfolio.php:672 portfolio.php:706 portfolio.php:747
+#: portfolio.php:698 portfolio.php:704 portfolio.php:740 portfolio.php:783
 msgid "Uncatgorized"
 msgstr "Без категории"
 
-#: portfolio.php:700
+#: portfolio.php:734
 msgid "All Sectors"
 msgstr "Все отрасли"
 
-#: portfolio.php:712 portfolio.php:713
+#: portfolio.php:746 portfolio.php:747
 msgid "Sector"
 msgstr "Отрасль"
 
-#: portfolio.php:741
+#: portfolio.php:777
 msgid "All Services"
 msgstr "Все услуги"
 
-#: portfolio.php:753 portfolio.php:754
+#: portfolio.php:789 portfolio.php:790
 msgid "Service"
 msgstr "Услуга"
 
-#: portfolio.php:773
+#: portfolio.php:814
 msgid "Please enable JavaScript to add or delete images."
 msgstr ""
 "Пожалуйста, включите javascript для добавления или удаления изображений."
 
-#: portfolio.php:809
+#: portfolio.php:851 portfolio.php:867
 msgid "Delete image"
 msgstr "Удалить изображение"
 
-#: portfolio.php:809
+#: portfolio.php:851 portfolio.php:867
 msgid "Delete"
 msgstr "Удалить"
 
-#: portfolio.php:823
+#: portfolio.php:867
+msgid "Add Images to Portfolio"
+msgstr "Добавить изображения в портфолио"
+
+#: portfolio.php:867
+msgid "Add to portfolio"
+msgstr "Добавить в портфолио"
+
+#: portfolio.php:867
 msgid "Add images"
 msgstr "Добавить изображение"
 
-#: portfolio.php:1020 portfolio.php:1174 portfolio.php:1732 portfolio.php:1866
+#: portfolio.php:1080 portfolio.php:1246 portfolio.php:1925 portfolio.php:2071
 msgid "No title"
 msgstr "Без названия"
 
-#: portfolio.php:1193 portfolio.php:1919
+#: portfolio.php:1265 portfolio.php:2134
 msgid "Read more"
 msgstr "Подробнее"
 
-#: portfolio.php:1205 portfolio.php:1928 portfolio.php:2132
+#: portfolio.php:1277 portfolio.php:2147 portfolio.php:2403
 #, php-format
 msgid "View all projects in %s"
 msgstr "Посмотреть все проекты в %s"
 
-#: portfolio.php:1244
+#: portfolio.php:1329
 msgid "Updating images..."
 msgstr "Обновление изображений..."
 
-#: portfolio.php:1245
+#: portfolio.php:1330
 msgid "No image found."
 msgstr "Изображения не найдены."
 
-#: portfolio.php:1246
+#: portfolio.php:1331
 msgid "All images are updated."
 msgstr "Все изображения были обновлены."
 
-#: portfolio.php:1247
+#: portfolio.php:1333
 msgid "Error:"
 msgstr "Ошибка:"
 
-#: portfolio.php:1487
+#: portfolio.php:1636
 msgid "Image size not defined"
 msgstr "Невозможно определить размер изображения"
 
-#: portfolio.php:1502
+#: portfolio.php:1651
 msgid ""
 "We can update only PNG, JPEG, GIF, WPMP or XBM filetype. For other image "
 "formats, please manually reload image."
@@ -823,27 +845,27 @@
 "Плагин может обновить только PNG, JPEG, GIF, XBM или WPMP типы файлов. Для "
 "других, пожалуйста, вручную перезагрузите изображения."
 
-#: portfolio.php:1512
+#: portfolio.php:1661
 msgid "Image size changes not defined"
 msgstr "Не удалось вычислить изменения размеров изображения"
 
-#: portfolio.php:1540 portfolio.php:1544 portfolio.php:1550
+#: portfolio.php:1692 portfolio.php:1696 portfolio.php:1702
 msgid "Invalid path"
 msgstr "Некорректный путь к изображениям"
 
-#: portfolio.php:1635
+#: portfolio.php:1810
 msgid "FAQ"
 msgstr "FAQ"
 
-#: portfolio.php:1636
+#: portfolio.php:1811
 msgid "Support"
 msgstr "Поддержка"
 
-#: portfolio.php:1688
+#: portfolio.php:1876
 msgid "ATTENTION!"
 msgstr "ВНИМАНИЕ!"
 
-#: portfolio.php:1689
+#: portfolio.php:1877
 msgid ""
 "In the current version of Portfolio plugin we updated the Technologies "
 "widget. If it was added to the sidebar, it will disappear and you will have "
@@ -853,29 +875,16 @@
 "если он у вас уже был добавлен в сайдбар, то после обновления он пропадет, и "
 "вам нужно будет его заново добавить."
 
-#: portfolio.php:1693
+#: portfolio.php:1881
 msgid "Read and Understood"
 msgstr "Ознакомлен"
 
-#: portfolio.php:2202
+#: portfolio.php:2500
 msgid "The number of portfolio projects to display"
 msgstr "Количество проектов портфолио для отображения"
 
-#: portfolio.php:2376
-msgid "Latest Portfolio Items"
-msgstr "Последние проекты портфолио"
-
-#: portfolio.php:2377
-msgid "Displays the latest Portfolio projects."
-msgstr "Отображение последних проектов портфолио."
-
-#: portfolio.php:2412
-msgid "Number of Projects:"
-msgstr "Количество проектов:"
-
-#: portfolio.php:2418
-msgid "Number of Colums:"
-msgstr "Количество столбцов:"
+#~ msgid "Ativate Now"
+#~ msgstr "Активировать сейчас"
 
 #~ msgid "SVN URL"
 #~ msgstr "Путь к SVN"
@@ -1183,9 +1192,6 @@
 #~ "настройки плагина будут перезаписаны, однако, при удалении демо-данных, "
 #~ "они будут восстановлены."
 
-#~ msgid "Add New Portfolio"
-#~ msgstr "Добавить новое Portfolio"
-
 #~ msgid "Edit Portfolio"
 #~ msgstr "Редактировать Portfolio"
 
Binary file wp/wp-content/plugins/portfolio/languages/portfolio-uk.mo has changed
--- a/wp/wp-content/plugins/portfolio/languages/portfolio-uk.po	Fri Sep 05 18:52:52 2025 +0200
+++ b/wp/wp-content/plugins/portfolio/languages/portfolio-uk.po	Mon Sep 08 19:44:41 2025 +0200
@@ -2,144 +2,144 @@
 msgstr ""
 "Project-Id-Version: portfolio\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-10-04 12:20+0300\n"
-"PO-Revision-Date: 2021-10-04 12:21+0300\n"
+"POT-Creation-Date: 2024-12-24 14:50+0200\n"
+"PO-Revision-Date: 2024-12-24 14:50+0200\n"
 "Last-Translator: bestwebsoft.com <plugins@bestwebsoft.com>\n"
 "Language-Team: BestWebSoft <plugin@bestwebsoft.com>\n"
 "Language: uk\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Poedit-KeywordsList: __;_e\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"X-Poedit-KeywordsList: __;_e;esc_html_e;esc_htm__;esc_attr_e;esc_attr__\n"
 "X-Poedit-Basepath: ..\n"
 "X-Poedit-SourceCharset: UTF-8\n"
-"X-Generator: Poedit 2.3\n"
-"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
-"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"X-Generator: Poedit 3.5\n"
 "X-Poedit-SearchPath-0: .\n"
 "X-Poedit-SearchPathExcluded-0: bws_menu\n"
 
-#: inc/class-prtfl-settings.php:24 portfolio.php:40 portfolio.php:1633
-#: portfolio.php:1651
+#: includes/class-portfolio-technologies-widget.php:20
+#: includes/class-prtfl-settings.php:108 portfolio.php:369 portfolio.php:383
+#: portfolio.php:1271
+msgid "Technologies"
+msgstr "Технології"
+
+#: includes/class-portfolio-technologies-widget.php:21
+msgid "The tag cloud with your most used portfolio technologies."
+msgstr "Хмара тегів з технологій плагіну Portfolio."
+
+#: includes/class-portfolio-technologies-widget.php:73
+#: includes/class-prtfl-settings.php:430 includes/class-prtfl-widget.php:56
+msgid "Title"
+msgstr "Назва"
+
+#: includes/class-prtfl-settings.php:50 portfolio.php:42 portfolio.php:1808
+#: portfolio.php:1835
 msgid "Settings"
 msgstr "Налаштування"
 
-#: inc/class-prtfl-settings.php:25 portfolio.php:269
+#: includes/class-prtfl-settings.php:51 portfolio.php:292
 msgid "Project"
 msgstr "Проект"
 
-#: inc/class-prtfl-settings.php:26
+#: includes/class-prtfl-settings.php:52
 msgid "Misc"
 msgstr "Різне"
 
-#: inc/class-prtfl-settings.php:27
+#: includes/class-prtfl-settings.php:53
 msgid "Custom Code"
 msgstr "Користувацький код"
 
-#: inc/class-prtfl-settings.php:28
+#: includes/class-prtfl-settings.php:54
 msgid "Import / Export"
 msgstr "Імпорт / Експорт"
 
-#: inc/class-prtfl-settings.php:29
+#: includes/class-prtfl-settings.php:55
 msgid "License Key"
 msgstr "Ліцензійний ключ"
 
-#: inc/class-prtfl-settings.php:79 portfolio.php:314 portfolio.php:328
+#: includes/class-prtfl-settings.php:107 portfolio.php:337 portfolio.php:351
 msgid "Executors"
 msgstr "Виконавці"
 
-#: inc/class-prtfl-settings.php:80 portfolio.php:346 portfolio.php:360
-#: portfolio.php:455 portfolio.php:1199
-msgid "Technologies"
-msgstr "Технології"
-
-#: inc/class-prtfl-settings.php:81 portfolio.php:89
+#: includes/class-prtfl-settings.php:109 portfolio.php:88
 msgid "Date of completion"
 msgstr "Дата завершення"
 
-#: inc/class-prtfl-settings.php:82
+#: includes/class-prtfl-settings.php:110
 msgid "Link"
 msgstr "Посилання"
 
-#: inc/class-prtfl-settings.php:83
+#: includes/class-prtfl-settings.php:111
 msgid "Short Description"
 msgstr "Короткий опис"
 
-#: inc/class-prtfl-settings.php:84
+#: includes/class-prtfl-settings.php:112
 msgid "Description"
 msgstr "Опис"
 
-#: inc/class-prtfl-settings.php:156
+#: includes/class-prtfl-settings.php:188
 msgid "Custom image size was changed. You need to update project images."
 msgstr ""
 "Власний розмір зображення змінено. Вам потрібно оновити зображення проекту."
 
-#: inc/class-prtfl-settings.php:248
+#: includes/class-prtfl-settings.php:288
 msgid "Settings saved."
 msgstr "Налаштування збережено."
 
-#: inc/class-prtfl-settings.php:260
+#: includes/class-prtfl-settings.php:301
 msgid "Please enable JavaScript in Your browser."
 msgstr "Будь ласка, увімкніть використання JavaScript у вашому браузері."
 
-#: inc/class-prtfl-settings.php:265
+#: includes/class-prtfl-settings.php:306
 msgid "Update Images"
 msgstr "Оновити зображення"
 
-#: inc/class-prtfl-settings.php:278 portfolio.php:40 portfolio.php:416
+#: includes/class-prtfl-settings.php:325 portfolio.php:42 portfolio.php:439
 msgid "Portfolio Settings"
 msgstr "Налаштування Portfolio"
 
-#: inc/class-prtfl-settings.php:283
+#: includes/class-prtfl-settings.php:330
 msgid "Portfolio Page"
 msgstr "Сторінка портфоліо"
 
-#: inc/class-prtfl-settings.php:291
+#: includes/class-prtfl-settings.php:342
 msgid "Base page where all existing projects will be displayed."
 msgstr "Базова сторінка, на якій будуть відображені всі існуючі проекти."
 
-#: inc/class-prtfl-settings.php:295
+#: includes/class-prtfl-settings.php:346
 msgid "Number of Columns"
 msgstr "Кількість колонок"
 
-#: inc/class-prtfl-settings.php:297 inc/class-prtfl-settings.php:304
+#: includes/class-prtfl-settings.php:348 includes/class-prtfl-settings.php:355
 msgid "columns"
 msgstr "колонок"
 
-#: inc/class-prtfl-settings.php:298
-#, php-format
-msgid "Number of portfolio columns (default is %s)."
-msgstr "Кількість колонок portfolio (за замовчуванням - %s)."
-
-#: inc/class-prtfl-settings.php:302
+#: includes/class-prtfl-settings.php:353
 msgid "Number of Image Columns"
 msgstr "Кількість колонок зображень"
 
-#: inc/class-prtfl-settings.php:305
-#, php-format
-msgid "Number of image columns (default is %s)."
-msgstr "Кількість колонок зображень (за замовчуванням - %s)."
-
-#: inc/class-prtfl-settings.php:309
+#: includes/class-prtfl-settings.php:360
 msgid "Image Size"
 msgstr "Розмір зображення"
 
-#: inc/class-prtfl-settings.php:315 inc/class-prtfl-settings.php:333
+#: includes/class-prtfl-settings.php:366 includes/class-prtfl-settings.php:384
 msgid "Custom"
 msgstr "Користувацький"
 
-#: inc/class-prtfl-settings.php:317
+#: includes/class-prtfl-settings.php:368
 msgid ""
 "Maximum portfolio image size. \"Custom\" uses the Image Dimensions values."
 msgstr ""
 "Максимальний розмір зображень портфоліо. Користувацький використовує "
 "значення, зазначені в полі Розміри зображення."
 
-#: inc/class-prtfl-settings.php:321
+#: includes/class-prtfl-settings.php:372
 msgid "Custom Image Size"
 msgstr "Користувацький розмір зображення"
 
-#: inc/class-prtfl-settings.php:323
+#: includes/class-prtfl-settings.php:374
 msgid ""
 "Adjust these values based on the number of columns in your project. This "
 "won't affect the full size of your images in the lightbox."
@@ -147,143 +147,139 @@
 "Налаштуйте ці значення з урахуванням числа колонок у вашому проекті. Це не "
 "впливає на розміри повного зображення в лайтбоксі."
 
-#: inc/class-prtfl-settings.php:327
+#: includes/class-prtfl-settings.php:378
 msgid "Cover Image Size"
 msgstr "Розмір зображення альбому"
 
-#: inc/class-prtfl-settings.php:335
+#: includes/class-prtfl-settings.php:386
 msgid "Maximum cover image size. \"Custom\" uses the Image Dimensions values."
 msgstr ""
 "Максимальний розмір зображень альбому. \"Користувацький\" використовує "
 "значення, зазначені в полі Розміри зображення."
 
-#: inc/class-prtfl-settings.php:339
+#: includes/class-prtfl-settings.php:390
 msgid "Custom Cover Image Size"
 msgstr "Користувацький розмір зображення альбому"
 
-#: inc/class-prtfl-settings.php:348 inc/class-prtfl-settings.php:404
-#: inc/class-prtfl-settings.php:514
+#: includes/class-prtfl-settings.php:399 includes/class-prtfl-settings.php:455
+#: includes/class-prtfl-settings.php:570
 msgid "Close"
 msgstr "Закрити"
 
-#: inc/class-prtfl-settings.php:352
+#: includes/class-prtfl-settings.php:403
 msgid "Slider Image Size"
 msgstr "Розмір слайдера"
 
-#: inc/class-prtfl-settings.php:357
+#: includes/class-prtfl-settings.php:408
 msgid "Maximum slider image size. \"Custom\" uses the Image Dimensions values."
 msgstr ""
 "Максимальний розмір зображень слайдера. \"Користувацький\" використовує "
 "значення, зазначені в полі Розміри зображення."
 
-#: inc/class-prtfl-settings.php:361
+#: includes/class-prtfl-settings.php:412
 msgid "Sort Projects Option"
 msgstr "Сортувати проекти за"
 
-#: inc/class-prtfl-settings.php:364
+#: includes/class-prtfl-settings.php:415
 msgid "Enable to display sort projects manually by date or title."
 msgstr "Увімкнути відображення проектів сортування вручну за датою чи назвою."
 
-#: inc/class-prtfl-settings.php:375
+#: includes/class-prtfl-settings.php:426
 msgid "Sort Projects by"
 msgstr "Сортувати проекти за"
 
-#: inc/class-prtfl-settings.php:378
+#: includes/class-prtfl-settings.php:429
 msgid "Project ID"
 msgstr "ID проекту"
 
-#: inc/class-prtfl-settings.php:379 portfolio.php:481 portfolio.php:2406
-msgid "Title"
-msgstr "Назва"
-
-#: inc/class-prtfl-settings.php:380
+#: includes/class-prtfl-settings.php:431
 msgid "Date"
 msgstr "Дата"
 
-#: inc/class-prtfl-settings.php:381
+#: includes/class-prtfl-settings.php:432
 msgid "Last modified date"
 msgstr "Дата останньої зміни"
 
-#: inc/class-prtfl-settings.php:382
+#: includes/class-prtfl-settings.php:433
 msgid "Comment count"
 msgstr "Кількість коментарів"
 
-#: inc/class-prtfl-settings.php:383
+#: includes/class-prtfl-settings.php:434
 msgid "Sorting order (the input field for sorting order)"
 msgstr "Порядок сортування (поле введення для сортування)"
 
-#: inc/class-prtfl-settings.php:384
+#: includes/class-prtfl-settings.php:435
 msgid "Author"
 msgstr "Автор"
 
-#: inc/class-prtfl-settings.php:385
+#: includes/class-prtfl-settings.php:436
 msgid "Random"
 msgstr "Довільно"
 
-#: inc/class-prtfl-settings.php:387
+#: includes/class-prtfl-settings.php:438
 msgid "Select projects sorting order in your portfolio page."
 msgstr "Оберіть порядок сортування проектів на сторінці портфоліо."
 
-#: inc/class-prtfl-settings.php:391
+#: includes/class-prtfl-settings.php:442
 msgid "Arrange Projects by"
 msgstr "Сортування проектів за"
 
-#: inc/class-prtfl-settings.php:394
+#: includes/class-prtfl-settings.php:445
 msgid "Ascending (e.g. 1, 2, 3; a, b, c)"
 msgstr "За зростанням (наприклад, 1, 2, 3; а, б, в)"
 
-#: inc/class-prtfl-settings.php:396
+#: includes/class-prtfl-settings.php:447
 msgid "Descending (e.g. 3, 2, 1; c, b, a)"
 msgstr "За зменшенням (наприклад, 3, 2, 1; в, б, а)"
 
-#: inc/class-prtfl-settings.php:408
+#: includes/class-prtfl-settings.php:459
 msgid "Lightbox Helper"
 msgstr "Допоміжний елемент лайтбоксу"
 
-#: inc/class-prtfl-settings.php:410
+#: includes/class-prtfl-settings.php:461
 msgid "Enable to use a lightbox helper navigation between images."
 msgstr ""
 "Дозволити використовувати допоміжні елементи лайтбоксу для навігації між "
 "зображеннями."
 
-#: inc/class-prtfl-settings.php:414
+#: includes/class-prtfl-settings.php:465
 msgid "Lightbox Helper Type"
 msgstr "Тип допоміжного елементу лайтбоксу"
 
-#: inc/class-prtfl-settings.php:417
+#: includes/class-prtfl-settings.php:468
 msgid "Thumbnails"
 msgstr "Мініатюри"
 
-#: inc/class-prtfl-settings.php:418
+#: includes/class-prtfl-settings.php:469
 msgid "Buttons"
 msgstr "Кнопки"
 
-#: inc/class-prtfl-settings.php:429
+#: includes/class-prtfl-settings.php:480
 msgid "Text Link"
 msgstr "Текстове посилання"
 
-#: inc/class-prtfl-settings.php:432
+#: includes/class-prtfl-settings.php:483
 msgid "Enable to display link field as a text for non-registered users."
 msgstr ""
 "Увімкнути показ поля посилання як тексту для незареєстрованих користувачів."
 
-#: inc/class-prtfl-settings.php:437
+#: includes/class-prtfl-settings.php:488
 msgid "Automatic Mailout when Publishing a New:"
 msgstr "Автоматичне виправлення при публікації нового:"
 
-#: inc/class-prtfl-settings.php:443 portfolio.php:268
+#: includes/class-prtfl-settings.php:496 portfolio.php:291
 msgid "Projects"
 msgstr "Проекти"
 
-#: inc/class-prtfl-settings.php:450
+#: includes/class-prtfl-settings.php:504
 msgid "Select mailout priority"
 msgstr "Виберіть пріоритет виправлення"
 
-#: inc/class-prtfl-settings.php:451
+#: includes/class-prtfl-settings.php:506
 msgid "Less number - higher priority"
 msgstr "Менше число - вищий пріоритет"
 
-#: inc/class-prtfl-settings.php:457 inc/class-prtfl-settings.php:461
+#: includes/class-prtfl-settings.php:512 includes/class-prtfl-settings.php:518
 msgid ""
 "Enable to automatic mailout when publishing a new bws-portfolios and tips. "
 "Sender Pro plugin is required."
@@ -291,59 +287,59 @@
 "Увімкніть автоматичну розсилку під час публікації нових bws-портфоліо та "
 "порад. Потрібен плагін Sender Pro."
 
-#: inc/class-prtfl-settings.php:457
-msgid "Ativate Now"
+#: includes/class-prtfl-settings.php:512 includes/class-prtfl-settings.php:663
+msgid "Activate Now"
 msgstr "Активувати зараз"
 
-#: inc/class-prtfl-settings.php:461 inc/class-prtfl-settings.php:619
+#: includes/class-prtfl-settings.php:518 includes/class-prtfl-settings.php:679
 msgid "Install Now"
 msgstr "Встановити зараз"
 
-#: inc/class-prtfl-settings.php:474
+#: includes/class-prtfl-settings.php:533
 msgid "Single Project Settings"
 msgstr "Налаштування єдиного проекту"
 
-#: inc/class-prtfl-settings.php:479 inc/class-prtfl-settings.php:518
+#: includes/class-prtfl-settings.php:538 includes/class-prtfl-settings.php:574
 msgid "Projects Fields"
 msgstr "Поля проектів"
 
-#: inc/class-prtfl-settings.php:493 portfolio.php:99
+#: includes/class-prtfl-settings.php:550 portfolio.php:98
 msgid "Source Files, URL"
 msgstr "Вихідні файли, URL"
 
-#: inc/class-prtfl-settings.php:497
+#: includes/class-prtfl-settings.php:553
 msgid "Display only for logged-in users"
 msgstr "Відображати лише для зареєстрованих користувачів"
 
-#: inc/class-prtfl-settings.php:503 inc/class-prtfl-settings.php:541
+#: includes/class-prtfl-settings.php:559 includes/class-prtfl-settings.php:593
 msgid "\"More screenshots\" block"
 msgstr "Блок \"Більше скріншотів\""
 
-#: inc/class-prtfl-settings.php:523 inc/class-prtfl-settings.php:524
-#: portfolio.php:579
+#: includes/class-prtfl-settings.php:578 includes/class-prtfl-settings.php:579
+#: portfolio.php:599
 msgid "Categories"
 msgstr "Категорії"
 
-#: inc/class-prtfl-settings.php:528 inc/class-prtfl-settings.php:529
-#: portfolio.php:580
+#: includes/class-prtfl-settings.php:582 includes/class-prtfl-settings.php:583
+#: portfolio.php:600
 msgid "Sectors"
 msgstr "Сектори"
 
-#: inc/class-prtfl-settings.php:533 inc/class-prtfl-settings.php:534
-#: portfolio.php:581
+#: includes/class-prtfl-settings.php:586 includes/class-prtfl-settings.php:587
+#: portfolio.php:601
 msgid "Services"
 msgstr "Послуги"
 
-#: inc/class-prtfl-settings.php:538 inc/class-prtfl-settings.php:539
-#: portfolio.php:603
+#: includes/class-prtfl-settings.php:590 includes/class-prtfl-settings.php:591
+#: portfolio.php:629
 msgid "Client"
 msgstr "Клієнт"
 
-#: inc/class-prtfl-settings.php:558
+#: includes/class-prtfl-settings.php:612
 msgid "Demo Data"
 msgstr "Демо-дані"
 
-#: inc/class-prtfl-settings.php:560
+#: includes/class-prtfl-settings.php:614
 msgid ""
 "Install demo data to create portfolio projects with images, post with "
 "shortcodes and page with a list of all portfolio projects."
@@ -351,11 +347,11 @@
 "Встановіть демо-дані, щоб створити проекти портфоліо із зображеннями, запис "
 "з шорткодами і сторінку зі списком усіх проектів портфоліо."
 
-#: inc/class-prtfl-settings.php:580
+#: includes/class-prtfl-settings.php:637
 msgid "Portfolio Post Type"
 msgstr "Тип запису портфоліо"
 
-#: inc/class-prtfl-settings.php:584
+#: includes/class-prtfl-settings.php:641
 msgid ""
 "Enable to avoid conflicts with other portfolio plugins installed. All "
 "portfolio created earlier will stay unchanged. However, after enabling we "
@@ -367,36 +363,27 @@
 "перейменування перевірте, будь ласка, налаштування інших плагінів, де "
 "використовується тип запису \"portfolio\"."
 
-#: inc/class-prtfl-settings.php:590
+#: includes/class-prtfl-settings.php:647
 msgid "Portfolio Slug"
 msgstr "Слаґ портфоліо"
 
-#: inc/class-prtfl-settings.php:593
+#: includes/class-prtfl-settings.php:650
 msgid "Enter the unique portfolio slug."
 msgstr "Введіть унікальний слаґ портфоліо."
 
-#: inc/class-prtfl-settings.php:597
+#: includes/class-prtfl-settings.php:654
 msgid "Search Portfolio Projects"
 msgstr "Шукати проекти портфоліо"
 
-#: inc/class-prtfl-settings.php:603
-msgid "Activate Now"
-msgstr "Активувати зараз"
-
-#: inc/class-prtfl-settings.php:622
+#: includes/class-prtfl-settings.php:683
 msgid "Enable to include portfolio projects to your website search."
 msgstr "Включити проекти портфоліо в пошук на вашому сайті."
 
-#: inc/class-prtfl-settings.php:622
-#, php-format
-msgid "%s plugin is required."
-msgstr "Потрібен плагін %s."
-
-#: inc/class-prtfl-settings.php:636
+#: includes/class-prtfl-settings.php:698
 msgid "Portfolio Shortcode"
 msgstr "Шорткод портфоліо"
 
-#: inc/class-prtfl-settings.php:639
+#: includes/class-prtfl-settings.php:701
 msgid ""
 "Add the latest portfolio projects using the following shortcode (where * is "
 "a number of projects to display):"
@@ -404,415 +391,435 @@
 "Додайте останні проекти портфоліо, використовуючи наступний шорткод (де * "
 "являє собою кількість проектів для відображення):"
 
-#: inc/demo-data/class-bws-demo-data.php:31
+#: includes/class-prtfl-widget.php:20
+msgid "Latest Portfolio Items"
+msgstr "Останні проекти портфоліо"
+
+#: includes/class-prtfl-widget.php:21
+msgid "Displays the latest Portfolio projects."
+msgstr "Відображення останніх проектів портфоліо."
+
+#: includes/class-prtfl-widget.php:62
+msgid "Number of Projects:"
+msgstr "Кількість проектів:"
+
+#: includes/class-prtfl-widget.php:68
+msgid "Number of Colums:"
+msgstr "Кількість стовпців:"
+
+#: includes/demo-data/class-bws-demo-data.php:42
 msgid "Install Demo Data"
 msgstr "Встановити демо-дані"
 
-#: inc/demo-data/class-bws-demo-data.php:34
+#: includes/demo-data/class-bws-demo-data.php:45
 msgid "Remove Demo Data"
 msgstr "Видалити демо-дані"
 
-#: inc/demo-data/class-bws-demo-data.php:35
+#: includes/demo-data/class-bws-demo-data.php:46
 msgid "Delete demo data and restore previous plugin settings."
 msgstr "Видалити демо-дані та відновити старі налаштування плагіну."
 
-#: inc/demo-data/class-bws-demo-data.php:48
-#: inc/demo-data/class-bws-demo-data.php:595
+#: includes/demo-data/class-bws-demo-data.php:59
+#: includes/demo-data/class-bws-demo-data.php:593
 msgid "Yes, install demo data"
 msgstr "Так, встановити демо-дані"
 
-#: inc/demo-data/class-bws-demo-data.php:49
+#: includes/demo-data/class-bws-demo-data.php:60
 msgid "Are you sure you want to install demo data?"
 msgstr "Ви впевнені, що бажаєте встановити демо-дані?"
 
-#: inc/demo-data/class-bws-demo-data.php:51
+#: includes/demo-data/class-bws-demo-data.php:62
 msgid "Yes, remove demo data"
 msgstr "Так, видалити демо-дані"
 
-#: inc/demo-data/class-bws-demo-data.php:52
+#: includes/demo-data/class-bws-demo-data.php:63
 msgid "Are you sure you want to remove demo data?"
 msgstr "Ви впевнені, що бажаєте видалити демо-дані?"
 
-#: inc/demo-data/class-bws-demo-data.php:59
+#: includes/demo-data/class-bws-demo-data.php:70
 msgid "No, go back to the settings page"
 msgstr "Ні, повернутися на сторінку налаштувань"
 
-#: inc/demo-data/class-bws-demo-data.php:115
+#: includes/demo-data/class-bws-demo-data.php:120
 msgid "Can not get demo data."
 msgstr "Неможливо отримати демо-дані."
 
-#: inc/demo-data/class-bws-demo-data.php:122
+#: includes/demo-data/class-bws-demo-data.php:127
 msgid "Demo settings are already installed."
 msgstr "Налаштування демо вже встановлені."
 
-#: inc/demo-data/class-bws-demo-data.php:362
+#: includes/demo-data/class-bws-demo-data.php:365
 msgid "Demo data successfully installed."
 msgstr "Демо-дані успішно встановлені."
 
-#: inc/demo-data/class-bws-demo-data.php:364
+#: includes/demo-data/class-bws-demo-data.php:367
 msgid "View post with shortcodes"
 msgstr "Перегляньте запис із шорткодами"
 
-#: inc/demo-data/class-bws-demo-data.php:367
+#: includes/demo-data/class-bws-demo-data.php:370
 msgid "View page with examples"
 msgstr "Перегляньте запис із прикладами"
 
-#: inc/demo-data/class-bws-demo-data.php:376
+#: includes/demo-data/class-bws-demo-data.php:381
 msgid "Demo data installation proceeded with some errors."
 msgstr "Установка демо-даних пройшла із помилками."
 
-#: inc/demo-data/class-bws-demo-data.php:379
+#: includes/demo-data/class-bws-demo-data.php:384
 msgid "Post data is missing."
 msgstr "Дані постів відсутні."
 
-#: inc/demo-data/class-bws-demo-data.php:453
+#: includes/demo-data/class-bws-demo-data.php:456
 msgid "Demo data have been already removed."
 msgstr "Демо-дані вже видалені."
 
-#: inc/demo-data/class-bws-demo-data.php:514
+#: includes/demo-data/class-bws-demo-data.php:513
 msgid "Demo data successfully removed."
 msgstr "Демо-дані успішно видалені."
 
-#: inc/demo-data/class-bws-demo-data.php:518
+#: includes/demo-data/class-bws-demo-data.php:517
 msgid "Removing demo data with some errors occurred."
 msgstr "Видалення демо-даних пройшло із помилками."
 
-#: inc/demo-data/class-bws-demo-data.php:587
+#: includes/demo-data/class-bws-demo-data.php:585
 msgid "Close notice"
 msgstr "Закрити повідомлення"
 
-#: inc/demo-data/class-bws-demo-data.php:593
+#: includes/demo-data/class-bws-demo-data.php:591
 #, php-format
 msgid "Do you want to install demo content and settings for %s now?"
 msgstr "Ви хочете встановити демо-контент і налаштування для %s?"
 
-#: portfolio.php:46
+#: portfolio.php:48
 msgid "Upgrade to Pro"
 msgstr "Оновитися до Pro"
 
-#: portfolio.php:84
+#: portfolio.php:83
 msgid "Short description"
 msgstr "Короткий опис"
 
-#: portfolio.php:94
+#: portfolio.php:93
 msgid "Project, URL"
 msgstr "Проект, URL"
 
-#: portfolio.php:239
+#: portfolio.php:260
 msgid "Date of completion:"
 msgstr "Дата завершення:"
 
-#: portfolio.php:240
+#: portfolio.php:261
 msgid "Project, URL:"
 msgstr "Проект, URL:"
 
-#: portfolio.php:241
+#: portfolio.php:262
 msgid "Short description:"
 msgstr "Короткий опис:"
 
-#: portfolio.php:242
+#: portfolio.php:263
 msgid "Description:"
 msgstr "Опис:"
 
-#: portfolio.php:243
+#: portfolio.php:264
 msgid "Source Files, URL:"
 msgstr "Вихідні файли, URL:"
 
-#: portfolio.php:244
+#: portfolio.php:265
 msgid "Executor:"
 msgstr "Виконавець:"
 
-#: portfolio.php:245
+#: portfolio.php:266
 msgid "More screenshots:"
 msgstr "Більше скріншотів:"
 
-#: portfolio.php:246
+#: portfolio.php:267
 msgid "Technologies:"
 msgstr "Технології:"
 
-#: portfolio.php:267
+#: portfolio.php:290
 msgid "Portfolio"
 msgstr "Portfolio"
 
-#: portfolio.php:270
+#: portfolio.php:293
 msgid "Add New"
 msgstr "Додати новий"
 
-#: portfolio.php:271
+#: portfolio.php:294
 msgid "Add New Project"
 msgstr "Додати новий проект"
 
-#: portfolio.php:272
+#: portfolio.php:295
 msgid "Edit"
 msgstr "Редагувати"
 
-#: portfolio.php:273
+#: portfolio.php:296
 msgid "Edit Project"
 msgstr "Редагувати проект"
 
-#: portfolio.php:274
+#: portfolio.php:297
 msgid "New Project"
 msgstr "Новий проект"
 
-#: portfolio.php:275 portfolio.php:276
+#: portfolio.php:298 portfolio.php:299
 msgid "View Project"
 msgstr "Перегляд проекту"
 
-#: portfolio.php:277
+#: portfolio.php:300
 msgid "Search Projects"
 msgstr "Шукати проекти"
 
-#: portfolio.php:278
+#: portfolio.php:301
 msgid "No project found"
 msgstr "Проекти не знайдено"
 
-#: portfolio.php:279
+#: portfolio.php:302
 msgid "No project found in Trash"
 msgstr "В кошику не знайдено жодного проекту"
 
-#: portfolio.php:280
+#: portfolio.php:303
 msgid "Parent Project"
 msgstr "Батьківський проект"
 
-#: portfolio.php:281
+#: portfolio.php:304
 msgid "Filter projects list"
 msgstr "Фільтр списоку проектів"
 
-#: portfolio.php:282
+#: portfolio.php:305
 msgid "Projects list navigation"
 msgstr "Навігація списку проектів"
 
-#: portfolio.php:283
+#: portfolio.php:306
 msgid "Projects list"
 msgstr "Список проектів"
 
-#: portfolio.php:285
+#: portfolio.php:308
 msgid "Create a project item"
 msgstr "Додати проект"
 
-#: portfolio.php:315
+#: portfolio.php:338
 msgid "Executor"
 msgstr "Виконавець"
 
-#: portfolio.php:316
+#: portfolio.php:339
 msgid "Search Executors"
 msgstr "Пошук Виконавців"
 
-#: portfolio.php:317
+#: portfolio.php:340
 msgid "Popular Executors"
 msgstr "Популярні Виконавці"
 
-#: portfolio.php:318
+#: portfolio.php:341
 msgid "All Executors"
 msgstr "Всі Виконавці"
 
-#: portfolio.php:319
+#: portfolio.php:342
 msgid "Parent Executor"
 msgstr "Батьківський Виконавець"
 
-#: portfolio.php:320
+#: portfolio.php:343
 msgid "Parent Executor:"
 msgstr "Батьківський Виконавець:"
 
-#: portfolio.php:321
+#: portfolio.php:344
 msgid "Edit Executor"
 msgstr "Редагувати Виконавця"
 
-#: portfolio.php:322
+#: portfolio.php:345
 msgid "Update Executor"
 msgstr "Оновити Виконавця"
 
-#: portfolio.php:323
+#: portfolio.php:346
 msgid "Add New Executor"
 msgstr "Додати нового Виконавця"
 
-#: portfolio.php:324
+#: portfolio.php:347
 msgid "New Executor Name"
 msgstr "Ім’я нового Виконавця"
 
-#: portfolio.php:325
+#: portfolio.php:348
 msgid "Separate executors with commas"
 msgstr "Відокремити виконавців комами"
 
-#: portfolio.php:326
+#: portfolio.php:349
 msgid "Add or remove Executor"
 msgstr "Додати або видалити Виконавця"
 
-#: portfolio.php:327
+#: portfolio.php:350
 msgid "Choose from the most used Executors"
 msgstr "Оберіть одного з виконавців, що використовуються найчастіше"
 
-#: portfolio.php:329
+#: portfolio.php:352
 msgid "Executors list navigation"
 msgstr "Навігація списку виконавців"
 
-#: portfolio.php:330
+#: portfolio.php:353
 msgid "Executors list"
 msgstr "Список виконавців"
 
-#: portfolio.php:347
+#: portfolio.php:370
 msgid "Technology"
 msgstr "Технологія"
 
-#: portfolio.php:348
+#: portfolio.php:371
 msgid "Search Technologies"
 msgstr "Пошук Технологій"
 
-#: portfolio.php:349
+#: portfolio.php:372
 msgid "Popular Technologies"
 msgstr "Популярні Технології"
 
-#: portfolio.php:350
+#: portfolio.php:373
 msgid "All Technologies"
 msgstr "Всі технології"
 
-#: portfolio.php:351
+#: portfolio.php:374
 msgid "Parent Technology"
 msgstr "Батьківська технологія"
 
-#: portfolio.php:352
+#: portfolio.php:375
 msgid "Parent Technology:"
 msgstr "Батьківська технологія:"
 
-#: portfolio.php:353
+#: portfolio.php:376
 msgid "Edit Technology"
 msgstr "Редагувати технологію"
 
-#: portfolio.php:354
+#: portfolio.php:377
 msgid "Update Technology"
 msgstr "Оновити технологію"
 
-#: portfolio.php:355
+#: portfolio.php:378
 msgid "Add New Technology"
 msgstr "Додати Нову Технологію"
 
-#: portfolio.php:356
+#: portfolio.php:379
 msgid "New Technology Name"
 msgstr "Назва Нової Технології"
 
-#: portfolio.php:357
+#: portfolio.php:380
 msgid "Separate technologies with commas"
 msgstr "Відокремити технології комами"
 
-#: portfolio.php:358
+#: portfolio.php:381
 msgid "Add or remove Technology"
 msgstr "Додати або видалити Технологію"
 
-#: portfolio.php:359
+#: portfolio.php:382
 msgid "Choose from the most used technologies"
 msgstr "Виберіть одну з технологій, що використовуються найчастіше"
 
-#: portfolio.php:361
+#: portfolio.php:384
 msgid "Technologies list navigation"
 msgstr "Навігація списку технологій"
 
-#: portfolio.php:362
+#: portfolio.php:385
 msgid "Technologies list"
 msgstr "Список технологій"
 
-#: portfolio.php:456
-msgid "The tag cloud with your most used portfolio technologies."
-msgstr "Хмара тегів з технологій плагіну Portfolio."
-
-#: portfolio.php:574
+#: portfolio.php:594
 msgid "Images"
 msgstr "Зображення"
 
-#: portfolio.php:575
+#: portfolio.php:595
 msgid "General"
 msgstr "Загальне"
 
-#: portfolio.php:614
+#: portfolio.php:642
 msgid "Featured project"
 msgstr "Обраний проект"
 
-#: portfolio.php:616
+#: portfolio.php:644
 msgid "Add to slider"
 msgstr "Додати в слайдер"
 
-#: portfolio.php:620 portfolio.php:679 portfolio.php:720 portfolio.php:761
+#: portfolio.php:648 portfolio.php:711 portfolio.php:754 portfolio.php:797
 msgid "Learn More"
 msgstr "Докладніше"
 
-#: portfolio.php:660
+#: portfolio.php:692
 msgid "All Categories"
 msgstr "Всі категорії"
 
-#: portfolio.php:661 portfolio.php:701 portfolio.php:742
+#: portfolio.php:693 portfolio.php:735 portfolio.php:778
 msgid "Most Used"
 msgstr "Найбільш використовувані"
 
-#: portfolio.php:666 portfolio.php:672 portfolio.php:706 portfolio.php:747
+#: portfolio.php:698 portfolio.php:704 portfolio.php:740 portfolio.php:783
 msgid "Uncatgorized"
 msgstr "Без категорії"
 
-#: portfolio.php:700
+#: portfolio.php:734
 msgid "All Sectors"
 msgstr "Всі сектори"
 
-#: portfolio.php:712 portfolio.php:713
+#: portfolio.php:746 portfolio.php:747
 msgid "Sector"
 msgstr "Сектор"
 
-#: portfolio.php:741
+#: portfolio.php:777
 msgid "All Services"
 msgstr "Всі послуги"
 
-#: portfolio.php:753 portfolio.php:754
+#: portfolio.php:789 portfolio.php:790
 msgid "Service"
 msgstr "Послуга"
 
-#: portfolio.php:773
+#: portfolio.php:814
 msgid "Please enable JavaScript to add or delete images."
 msgstr ""
 "Будь ласка, увімкніть JavaScript для використання опції оновлення зображень."
 
-#: portfolio.php:809
+#: portfolio.php:867
+msgid "Add Images to Portfolio"
+msgstr "Додати зображення до портфоліо"
+
+#: portfolio.php:867
+msgid "Add to portfolio"
+msgstr "Додати до портфоліо"
+
+#: portfolio.php:867
 msgid "Delete image"
 msgstr "Видалити зображення"
 
-#: portfolio.php:809
+#: portfolio.php:867
 msgid "Delete"
 msgstr "Видалити"
 
-#: portfolio.php:823
+#: portfolio.php:867
 msgid "Add images"
 msgstr "Додати зображення"
 
-#: portfolio.php:1020 portfolio.php:1174 portfolio.php:1732 portfolio.php:1866
+#: portfolio.php:1080 portfolio.php:1246 portfolio.php:2071
 msgid "No title"
 msgstr "Без назви"
 
-#: portfolio.php:1193 portfolio.php:1919
+#: portfolio.php:1265 portfolio.php:2134
 msgid "Read more"
 msgstr "Докладніше"
 
-#: portfolio.php:1205 portfolio.php:1928 portfolio.php:2132
+#: portfolio.php:1277
 #, php-format
 msgid "View all projects in %s"
 msgstr "Проглянути всі проекти у %s"
 
-#: portfolio.php:1244
+#: portfolio.php:1329
 msgid "Updating images..."
 msgstr "Оновлення зображень..."
 
-#: portfolio.php:1245
+#: portfolio.php:1330
 msgid "No image found."
 msgstr "Жодного зображення не знайдено."
 
-#: portfolio.php:1246
+#: portfolio.php:1331
 msgid "All images are updated."
 msgstr "Всі зображення оновлено."
 
-#: portfolio.php:1247
+#: portfolio.php:1333
 msgid "Error:"
 msgstr "Помилка:"
 
-#: portfolio.php:1487
+#: portfolio.php:1636
 msgid "Image size not defined"
 msgstr "Розмір зображення не визначено"
 
-#: portfolio.php:1502
+#: portfolio.php:1651
 msgid ""
 "We can update only PNG, JPEG, GIF, WPMP or XBM filetype. For other image "
 "formats, please manually reload image."
@@ -820,27 +827,27 @@
 "Можливе оновлення файлів лише у форматах PNG, JPEG, GIF, WPMP чи XBM. В "
 "іншому випадку, будь ласка, перезалийте зображення вручну."
 
-#: portfolio.php:1512
+#: portfolio.php:1661
 msgid "Image size changes not defined"
 msgstr "Зміну розміру зображення не визначено"
 
-#: portfolio.php:1540 portfolio.php:1544 portfolio.php:1550
+#: portfolio.php:1692 portfolio.php:1696 portfolio.php:1702
 msgid "Invalid path"
 msgstr "Шлях некоректний"
 
-#: portfolio.php:1635
+#: portfolio.php:1810
 msgid "FAQ"
 msgstr "FAQ"
 
-#: portfolio.php:1636
+#: portfolio.php:1811
 msgid "Support"
 msgstr "Підтримка"
 
-#: portfolio.php:1688
+#: portfolio.php:1876
 msgid "ATTENTION!"
 msgstr "УВАГА!"
 
-#: portfolio.php:1689
+#: portfolio.php:1877
 msgid ""
 "In the current version of Portfolio plugin we updated the Technologies "
 "widget. If it was added to the sidebar, it will disappear and you will have "
@@ -850,29 +857,28 @@
 "якщо ви вже додали його до сайдбару, після оновлення він зникне, і вам треба "
 "буде додати його знову."
 
-#: portfolio.php:1693
+#: portfolio.php:1881
 msgid "Read and Understood"
 msgstr "Ознайомлений"
 
-#: portfolio.php:2202
+#: portfolio.php:2500
 msgid "The number of portfolio projects to display"
 msgstr "Кількість проектів портфоліо для відображення"
 
-#: portfolio.php:2376
-msgid "Latest Portfolio Items"
-msgstr "Останні проекти портфоліо"
-
-#: portfolio.php:2377
-msgid "Displays the latest Portfolio projects."
-msgstr "Відображення останніх проектів портфоліо."
+#, php-format
+#~ msgid "Number of portfolio columns (default is %s)."
+#~ msgstr "Кількість колонок portfolio (за замовчуванням - %s)."
 
-#: portfolio.php:2412
-msgid "Number of Projects:"
-msgstr "Кількість проектів:"
+#, php-format
+#~ msgid "Number of image columns (default is %s)."
+#~ msgstr "Кількість колонок зображень (за замовчуванням - %s)."
 
-#: portfolio.php:2418
-msgid "Number of Colums:"
-msgstr "Кількість стовпців:"
+#~ msgid "Ativate Now"
+#~ msgstr "Активувати зараз"
+
+#, php-format
+#~ msgid "%s plugin is required."
+#~ msgstr "Потрібен плагін %s."
 
 #~ msgid "SVN URL"
 #~ msgstr "Шлях до SVN"
--- a/wp/wp-content/plugins/portfolio/portfolio.php	Fri Sep 05 18:52:52 2025 +0200
+++ b/wp/wp-content/plugins/portfolio/portfolio.php	Mon Sep 08 19:44:41 2025 +0200
@@ -6,7 +6,7 @@
 Author: BestWebSoft
 Text Domain: portfolio
 Domain Path: /languages
-Version: 2.57
+Version: 2.58
 Author URI: https://bestwebsoft.com/
 License: GPLv2 or later
  */
--- a/wp/wp-content/plugins/portfolio/readme.txt	Fri Sep 05 18:52:52 2025 +0200
+++ b/wp/wp-content/plugins/portfolio/readme.txt	Mon Sep 08 19:44:41 2025 +0200
@@ -1,10 +1,10 @@
 === Portfolio by BestWebSoft - Work and Projects Presentation Plugin for WordPress ===
-Contributors: bestwebsoft
+Contributors: bestweblayout
 Donate link: https://bestwebsoft.com/donate/
-Tags: add portfolio, portfolio plugin, add portfolio widget, portfolio, fancybox, showcase, responsive portfolio, portfolio plugin, create portfolio, portfolio categories, project portfolio, portfolio widget, add album
+Tags: add portfolio, portfolio plugin, add portfolio widget, portfolio, fancybox
 Requires at least: 5.6
-Tested up to: 6.6
-Stable tag: 2.57
+Tested up to: 6.8
+Stable tag: 2.58
 License: GPLv2 or later
 License URI: http://www.gnu.org/licenses/gpl-2.0.html
 
@@ -169,6 +169,11 @@
 
 == Changelog ==
 
+= V2.58 - 24.12.2024 =
+* Update : All functionality was updated for WordPress 6.5.
+* Update : BWS plugins section is updated.
+* Bugfix : Bugs has been fixed.
+
 = V2.57 - 24.05.2024 =
 * Update : All functionality was updated for WordPress 6.5.
 * Update : BWS plugins section is updated.
@@ -433,6 +438,10 @@
 
 == Upgrade Notice ==
 
+= V2.58 =
+* The compatibility with new WordPress version updated.
+* Bug fixed.
+
 = V2.57 =
 * The compatibility with new WordPress version updated.
 * Usability improved.