Alex Trofimov пре 11 година
родитељ
комит
a4542fe0df

+ 26 - 0
inc/classes/BxDolImageResize.php

@@ -175,6 +175,32 @@ class BxDolImageResize extends BxDol implements iBxDolSingleton
         return array ('w' => $o->width(), 'h' => $o->height());
     }
 
+    function getExifInfo($sSrcImage, $bCreateLocalFileIfUrl = true)
+    {
+        $this->_sError = '';
+        $sTmpFileName = false;
+        $mixedRet = false;
+
+        if ($bCreateLocalFileIfUrl && preg_match('/^https?:\/\//', $sSrcImage)) {
+            $sTmpFileName = tempnam(BX_DIRECTORY_PATH_TMP, '');
+            file_put_contents($sTmpFileName, file_get_contents($sSrcImage));
+        }
+
+        try {
+            $mixedRet = $this->_oManager
+                ->make($sTmpFileName ? $sTmpFileName : $sSrcImage)
+                ->exif();
+        }
+        catch (Exception $e) {
+            $this->_sError = $e->getMessage();
+        }
+
+        if ($sTmpFileName)
+            @unlink($sTmpFileName);
+
+        return $mixedRet;
+    }
+
     function getAverageColor($sSrcImage)
     {
         $this->_sError = '';

+ 33 - 0
inc/classes/BxDolMetatags.php

@@ -224,6 +224,20 @@ class BxDolMetatags extends BxDol implements iBxDolFactoryObject
         return $this->_oQuery->keywordsAdd($iId, array_slice($a[0], 0, BX_METATAGS_KEYWORDS_MAX));
     }
 
+    /**
+     * Add keyword from the whole string
+     * @param $iId content id
+     * @param $s keyword 
+     * @return number of added keywords, should be 1
+     */
+    public function keywordsAddOne($iId, $s, $bDeletePreviousKeywords = true)
+    {
+        if ($bDeletePreviousKeywords)
+            $this->_oQuery->keywordsDelete($iId);
+
+        return $this->_oQuery->keywordsAdd($iId, array($s));
+    }
+
     /**
      * Add #keywords from the content fields
      * @param $iId content id
@@ -285,6 +299,25 @@ class BxDolMetatags extends BxDol implements iBxDolFactoryObject
         return $s;
     }
 
+    /**
+     * Add link to the provided keyword
+     * @param $iId content id
+     * @param $s keyword 
+     * @return modified string where provided keyword is transformed to link with rel="tag" attribute
+     */
+    public function keywordsParseOne($iId, $s) 
+    {   
+        $a = $this->keywordsGet($iId);
+        if (empty($a))
+            return $s;
+    
+        foreach ($a as $sKeyword)
+            if (0 == strcasecmp(mb_strtolower($s), mb_strtolower($sKeyword)))
+                $s = '<a rel="tag" href="' . BX_DOL_URL_ROOT . 'searchKeyword.php?type=keyword&keyword=' . rawurlencode($sKeyword) . '">' . $sKeyword . '</a>';
+
+        return $s;
+    }
+
     /**
      * Add keywords meta info to the head section
      * @param $iId content id

+ 4 - 2
inc/classes/BxDolMetatagsQuery.php

@@ -34,9 +34,11 @@ class BxDolMetatagsQuery extends BxDolDb
 
 
 
-    public function keywordsAdd($mixedContentId, $aKeywords)
+    public function keywordsAdd($mixedContentId, $aKeywords, $bDeletePreviousKeywords = true)
     {
-        $this->keywordsDelete($mixedContentId);
+        if ($bDeletePreviousKeywords)
+            $this->keywordsDelete($mixedContentId);
+
         $i = 0;
         foreach ($aKeywords as $sKeyword) {
             $sQuery = $this->prepare("INSERT INTO `{$this->_aObject['table_keywords']}` SET `object_id` = ?, `keyword` = ?", $mixedContentId, trim($sKeyword, '#'));

+ 1 - 0
modules/boonex/albums/classes/BxAlbumsConfig.php

@@ -72,6 +72,7 @@ class BxAlbumsConfig extends BxBaseModTextConfig
             'OBJECT_VOTES_MEDIA' => 'bx_albums_media',
             'OBJECT_METATAGS' => 'bx_albums',
             'OBJECT_METATAGS_MEDIA' => 'bx_albums_media',
+            'OBJECT_METATAGS_MEDIA_CAMERA' => 'bx_albums_media_camera',
             'OBJECT_COMMENTS' => 'bx_albums',
             'OBJECT_COMMENTS_MEDIA' => 'bx_albums_media',
             'OBJECT_PRIVACY_VIEW' => 'bx_albums_allow_view_to',

+ 2 - 2
modules/boonex/albums/classes/BxAlbumsDb.php

@@ -19,12 +19,12 @@ class BxAlbumsDb extends BxBaseModTextDb
         parent::__construct($oConfig);
     }
 
-    public function associateFileWithContent($iContentId, $iFileId, $sTitle, $sData = '')
+    public function associateFileWithContent($iContentId, $iFileId, $sTitle, $sData = '', $sExif = '')
     {
         $sQuery = $this->prepare ("SELECT MAX(`order`) FROM `" . $this->_oConfig->CNF['TABLE_FILES2ENTRIES'] . "` WHERE `content_id` = ?", $iContentId);
         $iOrder = 1 + (int)$this->getOne($sQuery);
         
-        $sQuery = $this->prepare ("INSERT INTO `" . $this->_oConfig->CNF['TABLE_FILES2ENTRIES'] . "` SET `content_id` = ?, `file_id` = ?, `title` = ?, `data` = ?, `order` = ? ON DUPLICATE KEY UPDATE `title` = ?, `data` = ?", $iContentId, $iFileId, $sTitle, $sData, $iOrder, $sTitle, $sData);
+        $sQuery = $this->prepare ("INSERT INTO `" . $this->_oConfig->CNF['TABLE_FILES2ENTRIES'] . "` SET `content_id` = ?, `file_id` = ?, `title` = ?, `data` = ?, `exif` = ?, `order` = ? ON DUPLICATE KEY UPDATE `title` = ?, `data` = ?, `exif` = ?", $iContentId, $iFileId, $sTitle, $sData, $sExif, $iOrder, $sTitle, $sData, $sExif);
         return $this->query($sQuery);
     }
 

+ 27 - 8
modules/boonex/albums/classes/BxAlbumsFormEntry.php

@@ -27,23 +27,42 @@ class BxAlbumsFormEntry extends BxBaseModTextFormEntry
         $CNF = &$this->_oModule->_oConfig->CNF;
 
         $sData = '';
+        $sExif = '';
+        $aExif = false;
         $aFile = $oStorage->getFile($iFileId);
         if (0 == strncmp('image/', $aFile['mime_type'], 6)) {
-            $oTranscoder = BxDolTranscoderImage::getObjectInstance($CNF['OBJECT_IMAGES_TRANSCODER_BIG']);
-            $a = BxDolImageResize::getImageSize($oTranscoder->getFileUrl($iFileId));
+            $oImageReize = BxDolImageResize::getInstance();
+
+            $oTranscoder = BxDolTranscoderImage::getObjectInstance($CNF['OBJECT_IMAGES_TRANSCODER_BIG']);            
+            $a = $oImageReize->getImageSize($oTranscoder->getFileUrl($iFileId));
             $sData = isset($a['w']) && isset($a['h']) ? $a['w'] . 'x' . $a['h'] : '';
+
+            if ($aExif = $oImageReize->getExifInfo($oStorage->getFileUrlById($iFileId))) {
+                $a = array('Make', 'Model', 'FocalLength', 'ShutterSpeedValue', 'ISOSpeedRatings', 'COMPUTED', 'GPSLatitudeRef', 'GPSLatitude', 'GPSLongitudeRef', 'GPSLongitude', 'GPSAltitudeRef', 'GPSAltitude', 'GPSTimeStamp', 'GPSImgDirectionRef', 'GPSImgDirection', 'GPSDateStamp');
+                $aExifFiltered = array();
+                foreach ($a as $sIndex)
+                    if (isset($aExif[$sIndex]))
+                        $aExifFiltered[$sIndex] = $aExif[$sIndex];
+                $sExif = serialize($aExifFiltered);
+            }
         }
         
-        if (!$this->_oModule->_oDb->associateFileWithContent ($iContentId, $iFileId, $this->getCleanValue('title-' . $iFileId), $sData))
+        if (!$this->_oModule->_oDb->associateFileWithContent ($iContentId, $iFileId, $this->getCleanValue('title-' . $iFileId), $sData, $sExif))
             return;
 
-        if (!empty($CNF['OBJECT_METATAGS_MEDIA'])) {
-            $aMediaInfo = $this->_oModule->_oDb->getMediaInfoSimpleByFileId($iFileId);
-            $oMetatags = BxDolMetatags::getObjectInstance($CNF['OBJECT_METATAGS_MEDIA']);
+        $aMediaInfo = $this->_oModule->_oDb->getMediaInfoSimpleByFileId($iFileId);
 
-            if ($aMediaInfo && $oMetatags->keywordsIsEnabled())
+        if ($aMediaInfo && !empty($CNF['OBJECT_METATAGS_MEDIA'])) {            
+            $oMetatags = BxDolMetatags::getObjectInstance($CNF['OBJECT_METATAGS_MEDIA']);
+            if ($oMetatags->keywordsIsEnabled())
                 $oMetatags->keywordsAdd($aMediaInfo['id'], $aMediaInfo['title']);
-        }        
+        }
+
+        if ($aMediaInfo && isset($aExif['Make']) && !empty($CNF['OBJECT_METATAGS_MEDIA_CAMERA'])) {
+            $oMetatags = BxDolMetatags::getObjectInstance($CNF['OBJECT_METATAGS_MEDIA_CAMERA']);
+            if ($oMetatags->keywordsIsEnabled())
+                $oMetatags->keywordsAddOne($aMediaInfo['id'], $aExif['Make'] . (isset($aExif['Model']) ? ' ' . $aExif['Model'] : ''));
+        }
     }
 
     function _deleteFile ($iFileId)

+ 10 - 0
modules/boonex/albums/classes/BxAlbumsModule.php

@@ -53,9 +53,19 @@ class BxAlbumsModule extends BxBaseModTextModule
             $oMetatags->onDeleteContent($aMediaInfo['id']);
         }
 
+        if (!empty($CNF['OBJECT_METATAGS_MEDIA_CAMERA'])) {
+            $oMetatags = BxDolMetatags::getObjectInstance($CNF['OBJECT_METATAGS_MEDIA_CAMERA']);
+            $oMetatags->onDeleteContent($aMediaInfo['id']);
+        }
+
         return true;
     }
 
+    public function serviceMediaExif ($iMediaId = 0)
+    {
+        return $this->_serviceTemplateFunc ('mediaExif', $iMediaId, 'getMediaInfoById');
+    }
+
     public function serviceMediaComments ($iMediaId = 0)
     {
         return $this->_entityComments($this->_oConfig->CNF['OBJECT_COMMENTS_MEDIA'], $iMediaId);

+ 24 - 0
modules/boonex/albums/classes/BxAlbumsSearchResultMediaCamera.php

@@ -0,0 +1,24 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) BoonEx Pty Limited - http://www.boonex.com/
+ * CC-BY License - http://creativecommons.org/licenses/by/3.0/
+ *
+ * @defgroup    Albums Albums
+ * @ingroup     TridentModules
+ *
+ * @{
+ */
+
+bx_import('BxAlbumsSearchResultMedia', 'bx_albums');
+
+class BxAlbumsSearchResultMediaCamera extends BxAlbumsSearchResultMedia
+{
+
+    function __construct($sMode = '', $aParams = array())
+    {
+        parent::__construct($sMode, $aParams);
+        $this->aCurrent['object_metatags'] = 'bx_albums_media_camera';
+    }
+}
+
+/** @} */

+ 56 - 1
modules/boonex/albums/classes/BxAlbumsTemplate.php

@@ -263,7 +263,7 @@ class BxAlbumsTemplate extends BxBaseModTextTemplate
         return $oModule->_serviceBrowse ('album', array('unit_view' => 'gallery', 'album_id' => $aData[$CNF['FIELD_ID']]), BX_DB_PADDING_DEF, true, true, 'SearchResultMedia');
     }
 
-    function mediaAuthor ($aMediaInfo, $iProfileId = false, $sFuncAuthorDesc = 'getAuthorDesc', $sTemplateName = 'author.html') 
+    function mediaAuthor ($aMediaInfo, $iProfileId = false, $sFuncAuthorDesc = '', $sTemplateName = '') 
     {
         $oModule = BxDolModule::getInstance($this->MODULE);
         $CNF = &$oModule->_oConfig->CNF;
@@ -274,6 +274,61 @@ class BxAlbumsTemplate extends BxBaseModTextTemplate
         return $this->entryAuthor ($aMediaInfo, $aAlbumInfo[$CNF['FIELD_AUTHOR']], '');
     }
 
+    function mediaExif ($aMediaInfo, $iProfileId = false, $sFuncAuthorDesc = '', $sTemplateName = 'media-exif.html') 
+    {
+        if (!$aMediaInfo['exif'])
+            return '';
+
+        $a = unserialize($aMediaInfo['exif']);
+
+        $s = '';
+        if (isset($a['Make'])) {
+            $oModule = BxDolModule::getInstance($this->MODULE);
+            $CNF = &$oModule->_oConfig->CNF;
+
+            $sCamera = $a['Make'] . (isset($a['Model']) ? ' ' . $a['Model'] : '');
+            if (!empty($CNF['OBJECT_METATAGS_MEDIA_CAMERA'])) {
+                $oMetatags = BxDolMetatags::getObjectInstance($CNF['OBJECT_METATAGS_MEDIA_CAMERA']);
+                if ($oMetatags->keywordsIsEnabled()) {
+                    $sCamera = $oMetatags->keywordsParseOne($aMediaInfo['id'], $sCamera);
+                }
+            }       
+            $s .= $this->parseHtmlByName('media-exif-value.html', array(
+                'key' => _t('_bx_albums_txt_media_album_camera'), 
+                'val' => $sCamera,
+            ));
+        }
+
+        if (isset($a['FocalLength']))
+            $s .= $this->parseHtmlByName('media-exif-value.html', array(
+                'key' => _t('_bx_albums_txt_media_album_focal_length'),
+                'val' => _t('_bx_albums_txt_media_album_focal_length_value', $a['FocalLength']),
+            ));
+
+        if (isset($a['COMPUTED']['ApertureFNumber']))
+            $s .= $this->parseHtmlByName('media-exif-value.html', array(
+                'key' => _t('_bx_albums_txt_media_album_aperture'),
+                'val' => $a['COMPUTED']['ApertureFNumber'],
+            ));
+
+        if (isset($a['ShutterSpeedValue']))
+            $s .= $this->parseHtmlByName('media-exif-value.html', array(
+                'key' => _t('_bx_albums_txt_media_album_shutter_speed'),
+                'val' => _t('_bx_albums_txt_media_album_shutter_speed_value', $a['ShutterSpeedValue']),
+            ));
+
+        if (isset($a['ISOSpeedRatings']))
+            $s .= $this->parseHtmlByName('media-exif-value.html', array(
+                'key' => _t('_bx_albums_txt_media_album_iso'),
+                'val' => $a['ISOSpeedRatings'],
+            ));
+
+        if (empty($s))
+            return '';
+
+        return $this->parseHtmlByName($sTemplateName, array('content' => $s));
+    }
+
 }
 
 /** @} */

+ 8 - 0
modules/boonex/albums/install/langs/en.xml

@@ -53,6 +53,7 @@
 	<string name="_bx_albums_page_title_sys_view_media"><![CDATA[View Image]]></string>
 	<string name="_bx_albums_page_title_view_media"><![CDATA[{title}]]></string>
 	<string name="_bx_albums_page_block_title_entry_view_media"><![CDATA[View Image]]></string>
+	<string name="_bx_albums_page_block_title_entry_view_media_exif"><![CDATA[EXIF]]></string>
 	<string name="_bx_albums_page_block_title_entry_attachments"><![CDATA[Attachments]]></string>
 	<string name="_bx_albums_page_block_title_entry_text"><![CDATA[Album Description]]></string>
 	<string name="_bx_albums_page_title_browse"><![CDATA[Albums]]></string>
@@ -149,4 +150,11 @@
     <string name="_bx_albums_txt_sample_comment_single"><![CDATA[album's comment]]></string>
 	<string name="_bx_albums_txt_media_title_alt"><![CDATA[{0}'s media]]></string>
 	<string name="_bx_albums_txt_media_album_link"><![CDATA[Album: <a href="{0}">{1}</a>]]></string>
+	<string name="_bx_albums_txt_media_album_camera"><![CDATA[Camera]]></string>
+	<string name="_bx_albums_txt_media_album_focal_length"><![CDATA[Focal length]]></string>
+	<string name="_bx_albums_txt_media_album_focal_length_value"><![CDATA[{0}mm]]></string>
+	<string name="_bx_albums_txt_media_album_aperture"><![CDATA[Aperture]]></string>
+	<string name="_bx_albums_txt_media_album_shutter_speed"><![CDATA[Exposure time]]></string>
+	<string name="_bx_albums_txt_media_album_shutter_speed_value"><![CDATA[{0}s]]></string>
+	<string name="_bx_albums_txt_media_album_iso"><![CDATA[ISO]]></string>
 </resources>

+ 2 - 2
modules/boonex/albums/install/sql/disable.sql

@@ -23,10 +23,10 @@ DELETE `sys_acl_actions`, `sys_acl_matrix` FROM `sys_acl_actions`, `sys_acl_matr
 DELETE FROM `sys_acl_actions` WHERE `Module` = 'bx_albums';
 
 -- SEARCH
-DELETE FROM `sys_objects_search` WHERE `ObjectName` IN ('bx_albums', 'bx_albums_cmts', 'bx_albums_media', 'bx_albums_media_cmts');
+DELETE FROM `sys_objects_search` WHERE `ObjectName` IN ('bx_albums', 'bx_albums_cmts', 'bx_albums_media', 'bx_albums_media_camera', 'bx_albums_media_cmts');
 
 -- METATAGS
-DELETE FROM `sys_objects_metatags` WHERE `object` = 'bx_albums' OR `object` = 'bx_albums_media';
+DELETE FROM `sys_objects_metatags` WHERE `object` IN('bx_albums', 'bx_albums_media', 'bx_albums_media_camera');
 
 -- GRIDS
 DELETE FROM `sys_objects_grid` WHERE `object` IN ('bx_albums_administration', 'bx_albums_common');

+ 4 - 2
modules/boonex/albums/install/sql/enable.sql

@@ -304,12 +304,14 @@ INSERT INTO `sys_objects_search` (`ObjectName`, `Title`, `Order`, `ClassName`, `
 ('bx_albums', '_bx_albums', @iSearchOrder + 1, 'BxAlbumsSearchResult', 'modules/boonex/albums/classes/BxAlbumsSearchResult.php'),
 ('bx_albums_cmts', '_bx_albums_cmts', @iSearchOrder + 2, 'BxAlbumsCmtsSearchResult', 'modules/boonex/albums/classes/BxAlbumsCmtsSearchResult.php'),
 ('bx_albums_media', '_bx_albums_media', @iSearchOrder + 3, 'BxAlbumsSearchResultMedia', 'modules/boonex/albums/classes/BxAlbumsSearchResultMedia.php'),
-('bx_albums_media_cmts', '_bx_albums_media_cmts', @iSearchOrder + 4, 'BxAlbumsCmtsSearchResultMedia', 'modules/boonex/albums/classes/BxAlbumsCmtsSearchResultMedia.php');
+('bx_albums_media_cmts', '_bx_albums_media_cmts', @iSearchOrder + 4, 'BxAlbumsCmtsSearchResultMedia', 'modules/boonex/albums/classes/BxAlbumsCmtsSearchResultMedia.php'),
+('bx_albums_media_camera', '_bx_albums_media', @iSearchOrder + 5, 'BxAlbumsSearchResultMediaCamera', 'modules/boonex/albums/classes/BxAlbumsSearchResultMediaCamera.php');
 
 -- METATAGS
 INSERT INTO `sys_objects_metatags` (`object`, `table_keywords`, `table_locations`, `table_mentions`, `override_class_name`, `override_class_file`) VALUES
 ('bx_albums', 'bx_albums_meta_keywords', 'bx_albums_meta_locations', '', '', ''),
-('bx_albums_media', 'bx_albums_meta_keywords_media', '', '', '', '');
+('bx_albums_media', 'bx_albums_meta_keywords_media', '', '', '', ''),
+('bx_albums_media_camera', 'bx_albums_meta_keywords_media_camera', '', '', '', '');
 
 -- GRIDS: moderation tools
 INSERT INTO `sys_objects_grid` (`object`, `source_type`, `source`, `table`, `field_id`, `field_order`, `field_active`, `paginate_url`, `paginate_per_page`, `paginate_simple`, `paginate_get_start`, `paginate_get_per_page`, `filter_fields`, `filter_fields_translatable`, `filter_mode`, `sorting_fields`, `sorting_fields_translatable`, `override_class_name`, `override_class_file`) VALUES

+ 8 - 0
modules/boonex/albums/install/sql/install.sql

@@ -63,6 +63,7 @@ CREATE TABLE IF NOT EXISTS `bx_albums_files2albums` (
   `votes` int(11) NOT NULL,
   `comments` int(11) NOT NULL,
   `data` text NOT NULL,
+  `exif` text NOT NULL,
   `order` int(11) NOT NULL,
   PRIMARY KEY (`id`),
   UNIQUE KEY `file_content` (`file_id`,`content_id`),
@@ -173,6 +174,13 @@ CREATE TABLE `bx_albums_meta_keywords_media` (
   KEY `keyword` (`keyword`)
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 
+CREATE TABLE `bx_albums_meta_keywords_media_camera` (
+  `object_id` int(10) unsigned NOT NULL,
+  `keyword` varchar(255) NOT NULL,
+  KEY `object_id` (`object_id`),
+  KEY `keyword` (`keyword`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
 CREATE TABLE `bx_albums_meta_locations` (
   `object_id` int(10) unsigned NOT NULL,
   `lat` double NOT NULL,

+ 1 - 1
modules/boonex/albums/install/sql/uninstall.sql

@@ -1,7 +1,7 @@
 
 -- TABLES
 
-DROP TABLE IF EXISTS `bx_albums_albums`, `bx_albums_files`, `bx_albums_photos_resized`, `bx_albums_files2albums`, `bx_albums_cmts`, `bx_albums_cmts_media`, `bx_albums_votes`, `bx_albums_votes_track`, `bx_albums_votes_media`, `bx_albums_votes_media_track`, `bx_albums_views_track`, `bx_albums_views_media_track`, `bx_albums_meta_keywords`, `bx_albums_meta_keywords_media`, `bx_albums_meta_locations`;
+DROP TABLE IF EXISTS `bx_albums_albums`, `bx_albums_files`, `bx_albums_photos_resized`, `bx_albums_files2albums`, `bx_albums_cmts`, `bx_albums_cmts_media`, `bx_albums_votes`, `bx_albums_votes_track`, `bx_albums_votes_media`, `bx_albums_votes_media_track`, `bx_albums_views_track`, `bx_albums_views_media_track`, `bx_albums_meta_keywords`, `bx_albums_meta_keywords_media`, `bx_albums_meta_keywords_media_camera`, `bx_albums_meta_locations`;
 
 -- STORAGES & TRANSCODERS
 

+ 3 - 0
modules/boonex/albums/template/media-exif-value.html

@@ -0,0 +1,3 @@
+
+    <b>__key__</b>: __val__ <br />
+

+ 3 - 0
modules/boonex/albums/template/media-exif.html

@@ -0,0 +1,3 @@
+<div class="bx-albums-media-exif">
+    __content__
+</div>

+ 8 - 0
modules/boonex/russian/data/langs/albums.xml

@@ -53,6 +53,7 @@
 	<string name="_bx_albums_page_title_sys_view_media"><![CDATA[Просмотреть изображение]]></string>
 	<string name="_bx_albums_page_title_view_media"><![CDATA[{title}]]></string>
 	<string name="_bx_albums_page_block_title_entry_view_media"><![CDATA[Просмотреть изображение]]></string>
+	<string name="_bx_albums_page_block_title_entry_view_media_exif"><![CDATA[EXIF]]></string>
 	<string name="_bx_albums_page_block_title_entry_attachments"><![CDATA[Прикрепления]]></string>
 	<string name="_bx_albums_page_block_title_entry_text"><![CDATA[Описание альбома]]></string>
 	<string name="_bx_albums_page_title_browse"><![CDATA[Альбомы]]></string>
@@ -150,4 +151,11 @@
     <string name="_bx_albums_txt_sample_comment_single"><![CDATA[комментарий к альбому]]></string>
 	<string name="_bx_albums_txt_media_title_alt"><![CDATA[медиа-файлы автора {0}]]></string>
 	<string name="_bx_albums_txt_media_album_link"><![CDATA[Альбом: <a href="{0}">{1}</a>]]></string>
+	<string name="_bx_albums_txt_media_album_camera"><![CDATA[Камера]]></string>
+	<string name="_bx_albums_txt_media_album_focal_length"><![CDATA[Фокусное расстояние]]></string>
+	<string name="_bx_albums_txt_media_album_focal_length_value"><![CDATA[{0} мм]]></string>
+	<string name="_bx_albums_txt_media_album_aperture"><![CDATA[Диафрагма]]></string>
+	<string name="_bx_albums_txt_media_album_shutter_speed"><![CDATA[Выдержка]]></string>
+	<string name="_bx_albums_txt_media_album_shutter_speed_value"><![CDATA[{0} сек]]></string>
+	<string name="_bx_albums_txt_media_album_iso"><![CDATA[Чувствительность (ISO)]]></string>
 </resources>