Bladeren bron

#2304 Wiki functionality: list of missing and outdated translations

Alex Trofimov 6 jaren geleden
bovenliggende
commit
545b218596

+ 105 - 4
inc/classes/BxDolWiki.php

@@ -152,6 +152,9 @@ class BxDolWiki extends BxDolFactory implements iBxDolFactoryObject
         return $s . $sControls;
     }
 
+    /**
+     * Generate wiki contents - list of all wiki pages
+     */
     public function getContents ()
     {
         if (!($a = $this->_oQuery->getPages()))
@@ -159,8 +162,7 @@ class BxDolWiki extends BxDolFactory implements iBxDolFactoryObject
 
         $aVars = array('bx_repeat:pages' => array());
         foreach ($a as $r) {
-            $sUrl = BX_DOL_URL_ROOT . 'r.php?_q=' . $this->_aObject['uri'] . '/' . $r['uri'];
-            $sUrl = BxDolPermalinks::getInstance()->permalink($sUrl);
+            $sUrl = $this->getPageUrl($r['uri']);
             $aVars['bx_repeat:pages'][] = array(
                 'url' => $sUrl,
                 'title' => _t($r['title']),
@@ -172,6 +174,99 @@ class BxDolWiki extends BxDolFactory implements iBxDolFactoryObject
         return BxDolTemplate::getInstance()->parseHtmlByName('wiki_contents.html', $aVars);
     }
 
+    /**
+     * Generate list of wiki blocks with missing translations for the given language
+     */
+    public function getMissingTranslations ($sLang = false)
+    {
+        if (!$sLang)
+            $sLang = bx_lang_name();
+
+        if (!$this->isAllowed('edit') && !$this->isAllowed('translate') || !preg_match("/^[a-z]+$/", $sLang))
+            return _t('_sys_txt_access_denied');
+
+        if (!BxDolLanguages::getInstance()->getLangId($sLang))
+            return _t('_sys_wiki_error_no_such_lang');
+
+        $a = $this->_oQuery->getBlocksWithMissingTranslations($sLang);
+        if (!$a)
+            return _t('_sys_wiki_no_missing_translations', $sLang);
+
+        $aVars = array(
+            'title_title' => _t('_sys_wiki_title_title'),
+            'title_lang' => _t('_sys_wiki_title_lang_missing'),
+            'title_author' => _t('_sys_wiki_title_author', _t('_sys_wiki_orig')),
+            'title_content' => _t('_sys_wiki_title_content', _t('_sys_wiki_orig')),
+            'title_time' => _t('_sys_wiki_title_time', _t('_sys_wiki_orig')),
+            'bx_repeat:blocks' => array()
+        );
+        foreach ($a as $iBlockId) {
+            $aWikiVerMain = $this->_oQuery->getBlockContent ($iBlockId, false);
+            $aPage = $this->_oQuery->getPageByBlockId($iBlockId);
+            $sUrl = $this->getPageUrl($aPage['uri']) . '#bx-page-wiki-container-' . $iBlockId;
+            $oProfile = BxDolProfile::getInstanceMagic($aWikiVerMain['profile_id']);
+
+            $aVars['bx_repeat:blocks'][] = array(
+                'author_url' => $oProfile->getUrl(),
+                'author_name' => $oProfile->getDisplayName(),
+                'url' => $sUrl,
+                'lang' => $sLang,
+                'title' => _t($aPage['title']),
+                'content' => strmaxtextlen($aWikiVerMain['content']),
+                'timejs' => bx_time_js($aWikiVerMain['added']),
+            );
+        }
+        return BxDolTemplate::getInstance()->parseHtmlByName('wiki_translations_missing.html', $aVars);
+    }
+
+    /**
+     * Generate list of wiki blocks with outdated translations for the given language
+     */
+    public function getOutdatedTranslations ($sLang = false)
+    {
+        if (!$sLang)
+            $sLang = bx_lang_name();
+
+        if (!$this->isAllowed('edit') && !$this->isAllowed('translate') || !preg_match("/^[a-z]+$/", $sLang))
+            return _t('_sys_txt_access_denied');
+
+        if (!BxDolLanguages::getInstance()->getLangId($sLang))
+            return _t('_sys_wiki_error_no_such_lang');
+
+        $aVars = array(
+            'title_title' => _t('_sys_wiki_title_title'),
+            'title_lang' => _t('_sys_wiki_title_lang_outated'),
+            'title_author' => _t('_sys_wiki_title_author', _t('_sys_wiki_orig')),
+            'title_content' => _t('_sys_wiki_title_content', _t('_sys_wiki_orig')),
+            'title_time_main' => _t('_sys_wiki_title_time', _t('_sys_wiki_orig')),
+            'title_time' => _t('_sys_wiki_title_time', '"'.$sLang.'"'),
+            'bx_repeat:blocks' => array()
+        );
+        $a = $this->_oQuery->getBlocksWithOutdatedTranslations($sLang);
+        if (!$a)
+            return _t('_sys_wiki_all_translations_up_to_date', $sLang);
+
+        foreach ($a as $iBlockId) {
+            $aWikiVer = $this->_oQuery->getBlockContent ($iBlockId, $sLang, false, false);
+            $aWikiVerMain = $this->_oQuery->getBlockContent ($iBlockId, false);
+            $aPage = $this->_oQuery->getPageByBlockId($iBlockId);
+            $sUrl = $this->getPageUrl($aPage['uri']) . '#bx-page-wiki-container-' . $iBlockId;
+            $oProfile = BxDolProfile::getInstanceMagic($aWikiVerMain['profile_id']);
+
+            $aVars['bx_repeat:blocks'][] = array(
+                'author_url' => $oProfile->getUrl(),
+                'author_name' => $oProfile->getDisplayName(),
+                'url' => $sUrl,
+                'lang' => $sLang,
+                'title' => _t($aPage['title']),
+                'content' => strmaxtextlen($aWikiVerMain['content']),                
+                'timejs_main' => bx_time_js($aWikiVerMain['added']),
+                'timejs' => bx_time_js($aWikiVer['added']),
+            );
+        }
+        return BxDolTemplate::getInstance()->parseHtmlByName('wiki_translations_outdated.html', $aVars);
+    }
+
     /**
      * Check if partucular action is allowed
      * @param $sType action type: add, edit, delete, translate
@@ -387,7 +482,7 @@ class BxDolWiki extends BxDolFactory implements iBxDolFactoryObject
 
             // insert page
             $sLangKey = '_' . $this->_aObject['module'] . '_' . str_replace('-', '_', $sPageUri) . '_' . time();
-            $sUrl = 'r.php?_q=' . $this->_aObject['uri'] . '/' . $sPageUri;
+            $sUrl = $this->getPageUrl($sPageUri, false, false);
             $iPageId = $this->_oQuery->insertPage ($sPageUri, $sUrl, $sLangKey);
             if (!$iPageId)
                 return array('code' => 10, 'actions' => array('ShowMsg'), 'msg' => _t('_sys_wiki_error_occured', 10));
@@ -583,6 +678,12 @@ class BxDolWiki extends BxDolFactory implements iBxDolFactoryObject
         }
     }
 
+    protected function getPageUrl ($sPageUri, $bPermalink = true, $bAddRootUrl = true)
+    {
+        $sUrl = ($bAddRootUrl ? BX_DOL_URL_ROOT : '') . 'r.php?_q=' . $this->_aObject['uri'] . '/' . $sPageUri;
+        return $bPermalink ? BxDolPermalinks::getInstance()->permalink($sUrl) : $sUrl;
+    }
+
     protected function isContentChanged ($iBlockId, $sLang, $sContent)
     {
         if (!$sContent) // don't allow revisions with empty content
@@ -647,7 +748,7 @@ class BxDolWiki extends BxDolFactory implements iBxDolFactoryObject
             }            
         }
         return $aLangs;
-    }
+    }    
 
     public function getVarsForHistory ($iBlockId, $sLang)
     {

+ 42 - 8
inc/classes/BxDolWikiQuery.php

@@ -51,16 +51,20 @@ class BxDolWikiQuery extends BxDolDb
      * @return array with wiki block info
      */
     public function getBlockContent ($iBlockId, $sLang, $iRevision = false, $bAutoMainLang = true)
-    {
+    {        
         $sWhere = '';
-        $aBind = array('block' => $iBlockId, 'language' => $sLang);
-        if (false !== $iRevision) {
-            $sWhere = " AND `revision` = :rev";
-            $aBind['rev'] = $iRevision;
-        }
+        $aRow = false;
+        $aBind = array('block' => $iBlockId);
+        if (false !== $sLang) {            
+            $aBind['language'] = $sLang;
+            if (false !== $iRevision) {
+                $sWhere = " AND `revision` = :rev";
+                $aBind['rev'] = $iRevision;
+            }
 
-        // get latest revision for specific language
-        $aRow = $this->getRow("SELECT `block_id`, `revision`, `profile_id`, `language`, `main_lang`, `content`, `unsafe`, `notes`, `added` FROM `sys_pages_wiki_blocks` WHERE `block_id` = :block AND `language` = :language $sWhere ORDER BY `revision` DESC LIMIT 1", $aBind);
+            // get latest revision for specific language
+            $aRow = $this->getRow("SELECT `block_id`, `revision`, `profile_id`, `language`, `main_lang`, `content`, `unsafe`, `notes`, `added` FROM `sys_pages_wiki_blocks` WHERE `block_id` = :block AND `language` = :language $sWhere ORDER BY `revision` DESC LIMIT 1", $aBind);
+        }
 
         // if translation isn't found for specific language then get latest revision for main language 
         if ($bAutoMainLang && !$aRow) {
@@ -77,6 +81,31 @@ class BxDolWikiQuery extends BxDolDb
         return $this->getAll("SELECT `block_id`, `language`, `revision`, `profile_id`, `notes`, `added` FROM `sys_pages_wiki_blocks` WHERE `block_id` = :block AND `language` = :language ORDER BY `revision` DESC", $aBind);
     }
 
+    public function getBlocksWithMissingTranslations ($sLang)
+    {
+        $aBind = array('lang' => $sLang, 'module' => $this->_aObject['module']);
+        return $this->getColumn("
+            SELECT `wo`.`block_id`
+            FROM `sys_pages_wiki_blocks` AS `wo`
+            INNER JOIN `sys_pages_blocks` AS `b` ON (`wo`.`block_id` = `b`.`id` AND `b`.`module` = :module)
+            LEFT JOIN `sys_pages_wiki_blocks` AS `wt` ON (`wo`.`block_id` = `wt`.`block_id` AND `wt`.`language` = :lang AND `wt`.`main_lang` != 1)            
+            WHERE `wo`.`main_lang` = 1 AND `wo`.`language` != :lang AND `wt`.`block_id` IS NULL
+            GROUP BY `wo`.`block_id`", $aBind);
+    }
+
+    public function getBlocksWithOutdatedTranslations ($sLang)
+    {
+        $aBind = array('lang' => $sLang, 'module' => $this->_aObject['module']);
+        return $this->getColumn("
+            SELECT `wo`.`block_id`
+            FROM `sys_pages_wiki_blocks` AS `wo`
+            INNER JOIN `sys_pages_blocks` AS `b` ON (`wo`.`block_id` = `b`.`id` AND `b`.`module` = :module)
+            INNER JOIN `sys_pages_wiki_blocks` AS `wt` ON (`wo`.`block_id` = `wt`.`block_id` AND `wt`.`language` = :lang AND `wt`.`main_lang` != 1)
+            WHERE `wo`.`main_lang` = 1 AND `wo`.`language` != :lang
+            GROUP BY `wo`.`block_id`
+            HAVING MAX(`wt`.`added`) < MAX(`wo`.`added`)", $aBind);
+    }
+
     public function deleteRevisions ($iBlockId, $sLang, $aRevisions)
     {
         $aBind = array('block' => $iBlockId, 'language' => $sLang);
@@ -92,6 +121,11 @@ class BxDolWikiQuery extends BxDolDb
         return $i;
     }
 
+    public function getPageByBlockId ($iBlockId)
+    {
+        return $this->getRow("SELECT `p`.`title`, `p`.`uri` FROM `sys_objects_page` AS `p` INNER JOIN `sys_pages_blocks` AS `b` ON (`p`.`object` = `b`.`object` AND `b`.`id` = ? AND `p`.`module` = ?) LIMIT 1", array($iBlockId, $this->_aObject['module']));
+    }
+
     public function getPages ()
     {
         return $this->getAll("SELECT `title`, `uri` FROM `sys_objects_page` WHERE `module` = ?", array($this->_aObject['module']));

+ 2 - 1
inc/js/classes/BxDolWiki.js

@@ -142,7 +142,8 @@ BxDolWiki.prototype.actionClosePopup = function (oResponce) {
         this.removePopup();
 }
 BxDolWiki.prototype.actionReload = function (oResponce) {
-    loadDynamicBlock(oResponce.block_id, document.location.href);
+    var l = document.location;
+    loadDynamicBlock(oResponce.block_id, l.hash.length ? l.href.replace(l.hash, '') : l.href);
 }
 
 BxDolWiki.prototype.actionDeleteBlock = function (oResponce) {

+ 12 - 2
modules/boonex/english/data/langs/system/en.xml

@@ -2291,10 +2291,10 @@ If it is not enabled then please consider implement this optimization, since it
 	<string name="_sys_form_display_wiki_translate"><![CDATA[Wiki Translate]]></string>
 	<string name="_sys_form_wiki_input_caption_block_id"><![CDATA[Block ID]]></string>
 	<string name="_sys_form_wiki_input_caption_lang"><![CDATA[Language]]></string>
-	<string name="_sys_form_wiki_input_caption_lang_info"><![CDATA[★ - main language, red - outdated or missing translation]]></string>
+	<string name="_sys_form_wiki_input_caption_lang_info"><![CDATA[★ - main(original) language, red - outdated or missing translation]]></string>
 	<string name="_sys_form_wiki_input_caption_lang_err"><![CDATA[Please select value]]></string>
 	<string name="_sys_form_wiki_input_caption_content"><![CDATA[Content]]></string>
-	<string name="_sys_form_wiki_input_caption_content_main"><![CDATA[Main Content]]></string>
+	<string name="_sys_form_wiki_input_caption_content_main"><![CDATA[Main(original) Content]]></string>
 	<string name="_sys_form_wiki_input_caption_notes"><![CDATA[Notes]]></string>
 	<string name="_sys_form_wiki_input_caption_submit"><![CDATA[Submit]]></string>
 	<string name="_sys_form_wiki_input_caption_close"><![CDATA[Close]]></string>
@@ -3117,6 +3117,7 @@ If it is not enabled then please consider implement this optimization, since it
 	<string name="_sys_wiki_error_missing_wiki_object"><![CDATA[Wiki object ({0}) wasn't found]]></string>
     <string name="_sys_wiki_error_action_not_allowed"><![CDATA[Wiki object ({1}) action ({0}) isn't allowed]]></string>
     <string name="_sys_wiki_error_incorrect_page_uri"><![CDATA["{0}" isn't correct page URI]]></string>
+    <string name="_sys_wiki_error_no_such_lang"><![CDATA[No sucn language]]></string>
     <string name="_sys_wiki_error_occured"><![CDATA[Error occured (code:{0})]]></string>
     <string name="_sys_wiki_view_rev"><![CDATA[Version <b>{0}</b> by <a href="{1}">{2}</a>, {3}]]></string>
     <string name="_sys_wiki_lang_mask"><![CDATA[{0} {1} <span class="bx-def-font-grayed bx-def-font-small">{2}</span>]]></string>
@@ -3128,4 +3129,13 @@ If it is not enabled then please consider implement this optimization, since it
     <string name="_sys_wiki_add_block"><![CDATA[Add Block]]></string>
 	<string name="_sys_wiki_add_page"><![CDATA[Add Page]]></string>
 	<string name="_sys_wiki_add_page_text"><![CDATA[Such wiki page doesn't exists.]]></string>
+	<string name="_sys_wiki_no_missing_translations"><![CDATA[No missing translations for {0} language.]]></string>
+	<string name="_sys_wiki_all_translations_up_to_date"><![CDATA[All translations are up to date for {0} language.]]></string>
+    <string name="_sys_wiki_title_title"><![CDATA[Page]]></string>
+    <string name="_sys_wiki_title_lang_missing"><![CDATA[Missing Lang]]></string>
+    <string name="_sys_wiki_title_lang_outated"><![CDATA[Outdated Lang]]></string>
+    <string name="_sys_wiki_title_author"><![CDATA[{0} author]]></string>
+    <string name="_sys_wiki_title_content"><![CDATA[{0} content]]></string>
+    <string name="_sys_wiki_title_time"><![CDATA[{0} updated]]></string>
+    <string name="_sys_wiki_orig"><![CDATA[Orig.]]></string>
 </resources>

+ 11 - 2
modules/boonex/russian/data/langs/system/ru.xml

@@ -2280,10 +2280,10 @@
     <string name="_sys_form_display_wiki_translate"><![CDATA[Вики: перевод]]></string>
 	<string name="_sys_form_wiki_input_caption_block_id"><![CDATA[Идентификатор блока]]></string>
 	<string name="_sys_form_wiki_input_caption_lang"><![CDATA[Язык]]></string>
-    <string name="_sys_form_wiki_input_caption_lang_info"><![CDATA[★ - основной язык, красным помечен отсутствующий или устаревший перевод]]></string>
+    <string name="_sys_form_wiki_input_caption_lang_info"><![CDATA[★ - основной(оригинальный) язык, красным помечен отсутствующий или устаревший перевод]]></string>
     <string name="_sys_form_wiki_input_caption_lang_err"><![CDATA[Пожалуйста выберите значение]]></string>
 	<string name="_sys_form_wiki_input_caption_content"><![CDATA[Содержимое]]></string>
-    <string name="_sys_form_wiki_input_caption_content_main"><![CDATA[Основное содержимое]]></string>
+    <string name="_sys_form_wiki_input_caption_content_main"><![CDATA[Основное(оригинальное) содержимое]]></string>
 	<string name="_sys_form_wiki_input_caption_notes"><![CDATA[Заметки]]></string>
 	<string name="_sys_form_wiki_input_caption_submit"><![CDATA[Сохранить]]></string>
 	<string name="_sys_format_size_b"><![CDATA[{0} байт]]></string>
@@ -3097,6 +3097,7 @@
     <string name="_sys_wiki_error_missing_wiki_object"><![CDATA[Вики объект ({0}) не найден]]></string>
     <string name="_sys_wiki_error_action_not_allowed"><![CDATA[Не разрешенное действие ({0}) для вики объекта ({1})]]></string>
     <string name="_sys_wiki_error_incorrect_page_uri"><![CDATA["{0}" - неправильная ссылка на страницу]]></string>
+    <string name="_sys_wiki_error_no_such_lang"><![CDATA[Нет такого языка]]></string>
     <string name="_sys_wiki_error_occured"><![CDATA[Ошибка (код:{0})]]></string>
     <string name="_sys_wiki_view_rev"><![CDATA[Версия <b>{0}</b> от <a href="{1}">{2}</a>, {3}]]></string>
     <string name="_sys_wiki_lang_mask"><![CDATA[{0} {1} <span class="bx-def-font-grayed bx-def-font-small">{2}</span>]]></string>
@@ -3108,4 +3109,12 @@
     <string name="_sys_wiki_add_block"><![CDATA[Добавить блок]]></string>
 	<string name="_sys_wiki_add_page"><![CDATA[Добавить страницу]]></string>
 	<string name="_sys_wiki_add_page_text"><![CDATA[Такой вики страницы не существует.]]></string>
+	<string name="_sys_wiki_no_missing_translations"><![CDATA[Все переводы на {0} язык присутствуют.]]></string>
+	<string name="_sys_wiki_all_translations_up_to_date"><![CDATA[Все переводы на {0} язык обновлены.]]></string>
+    <string name="_sys_wiki_title_title"><![CDATA[Страница]]></string>
+    <string name="_sys_wiki_title_lang_missing"><![CDATA[Отсут. язык]]></string>
+    <string name="_sys_wiki_title_author"><![CDATA[{0} автор]]></string>
+    <string name="_sys_wiki_title_content"><![CDATA[{0} содержимое]]></string>
+    <string name="_sys_wiki_title_time"><![CDATA[{0} обновлен]]></string>
+    <string name="_sys_wiki_orig"><![CDATA[Ориг.]]></string>
 </resources>

+ 53 - 2
modules/boonex/wiki/classes/BxWikiModule.php

@@ -20,19 +20,21 @@ class BxWikiModule extends BxDolModule
     {
         return array (
             'Contents' => '',
+            'MissingTranslations' => '',
+            'OutdatedTranslations' => '',
         );
     }
 
     /**
      * @page service Service Calls
      * @section bx_wiki Wiki
-     * @subsection bx_wiki-browse Browse
+     * @subsection bx_wiki-macros Macros
      * @subsubsection bx_wiki-contents contents
      * 
      * @code bx_srv('bx_wiki', 'contents'); @endcode
+     * @code {{~bx_wiki:contents~}} @endcode
      * 
      * Wiki contents - list of pages
-     * @code {{~bx_wiki:contents~}} @endcode
      *
      * @see BxWikiModule::serviceContents
      */
@@ -47,6 +49,55 @@ class BxWikiModule extends BxDolModule
         return $oWiki->getContents();
     }
 
+    /**
+     * @page service Service Calls
+     * @section bx_wiki Wiki
+     * @subsection bx_wiki-macros Macros
+     * @subsubsection bx_wiki-missing_translations missing_translations
+     * 
+     * @code bx_srv('bx_wiki', 'missing_translations'); @endcode
+     * @code {{~bx_wiki:missing_translations["ru"]~}} @endcode
+     * 
+     * Get list of blocks with missing translations
+     * @param $sLang language to get missing translations for
+     *
+     * @see BxWikiModule::serviceMissingTranslations
+     */
+    /** 
+     * @ref bx_wiki-missing_translations "missing_translations"
+     */
+    public function serviceMissingTranslations ($sLang)
+    {
+        if (!($oWiki = BxDolWiki::getObjectInstance($this->getName())))
+            return '';
+        
+        return $oWiki->getMissingTranslations($sLang);
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_wiki Wiki
+     * @subsection bx_wiki-macros Macros
+     * @subsubsection bx_wiki-outdated_translations outdated_translations
+     * 
+     * @code bx_srv('bx_wiki', 'outdated_translations'); @endcode
+     * @code {{~bx_wiki:outdated_translations["ru"]~}} @endcode
+     * 
+     * Get list of blocks with outdated translations
+     * @param $sLang language to get outdated translations for
+     *
+     * @see BxWikiModule::serviceOutdatedTranslations
+     */
+    /** 
+     * @ref bx_wiki-outdated_translations "outdated_translations"
+     */
+    public function serviceOutdatedTranslations ($sLang)
+    {
+        if (!($oWiki = BxDolWiki::getObjectInstance($this->getName())))
+            return '';
+        
+        return $oWiki->getOutdatedTranslations($sLang);
+    }
 }
 
 /** @} */

+ 9 - 6
template/css/wiki.css

@@ -28,15 +28,13 @@
     max-width:37.5rem;
 }
 .bx-wiki-del-rev,
+.bx-wiki-translations,
 .bx-wiki-history {
     border-collapse:collapse;
 }
-.bx-wiki-del-rev-cell-profile,
-.bx-wiki-del-rev-cell-time,
-.bx-wiki-del-rev-cell-rev,
-.bx-wiki-history-cell-profile,
-.bx-wiki-history-cell-time,
-.bx-wiki-history-cell-rev {
+.bx-wiki-cell-profile,
+.bx-wiki-cell-time,
+.bx-wiki-cell-rev {
     text-align:center;
 }
 .bx-wiki-add-block {
@@ -50,3 +48,8 @@
     float:none;
     display:inline-block;
 }
+.bx-wiki-trans {
+    -webkit-transition: background-color 1500ms linear;
+    -ms-transition: background-color 1500ms linear;
+    transition: background-color 1500ms linear;
+}

+ 0 - 1
template/scripts/BxBasePage.php

@@ -401,7 +401,6 @@ class BxBasePage extends BxDolPage
         } 
         else {
             $sContent = $oWiki->getBlockContent($aBlock['id'], false, (int)bx_get($aBlock['id'].'rev') ? (int)bx_get($aBlock['id'].'rev') : false);
-            $sContent = bx_process_macros($sContent);
         }
 
         $s = '<div id="bx-page-wiki-container-' . $aBlock['id'] . '" class="bx-page-wiki-container">' . $sContent . '</div>';

+ 10 - 0
template/wiki_controls.html

@@ -4,4 +4,14 @@
 </div>
 <script>
     window.glBxDolWiki__block_id__ = new BxDolWiki('__obj__', $('#bx-page-wiki-container-__block_id__'), __options__);
+    if (location.hash.length) {
+        var e = $('#' + location.hash.substr(1));
+        e.css('background-color', 'yellow');
+        setTimeout(function () {
+            e.addClass('bx-wiki-trans');
+            setTimeout(function () {
+                e.css('background-color', 'transparent');
+            }, 1500);
+        }, 100);
+    }
 </script>

+ 6 - 6
template/wiki_delete_version.html

@@ -1,12 +1,12 @@
     <table class="bx-wiki-del-rev bx-def-margin-sec-top">
     <bx_repeat:revisions>
         <tr>
-            <td class="bx-wiki-del-rev-cell-checkbox bx-def-border bx-def-padding-thd"><input type="checkbox" name="revision[]" value="__revision__" id="bx-wiki-del-rev-cell-checkbox-__revision__" /></td>
-            <td class="bx-wiki-del-rev-cell-lang bx-def-border bx-def-padding-thd"><label for="bx-wiki-del-rev-cell-checkbox-__revision__">__language__</label></td>
-            <td class="bx-wiki-del-rev-cell-rev bx-def-border bx-def-padding-thd"><label for="bx-wiki-del-rev-cell-checkbox-__revision__">__revision__</label></td>
-            <td class="bx-wiki-del-rev-cell-time bx-def-border bx-def-padding-thd"><label for="bx-wiki-del-rev-cell-checkbox-__revision__">__timejs__</label></td>
-            <td class="bx-wiki-del-rev-cell-profile bx-def-border bx-def-padding-thd"><label for="bx-wiki-del-rev-cell-checkbox-__revision__">__author_name__</label></td>
-            <td class="bx-wiki-del-rev-cell-notes bx-def-border bx-def-padding-thd"><label for="bx-wiki-del-rev-cell-checkbox-__revision__">__notes__</label></td>
+            <td class="bx-wiki-cell-checkbox bx-def-border bx-def-padding-thd"><input type="checkbox" name="revision[]" value="__revision__" id="bx-wiki-del-rev-cell-checkbox-__revision__" /></td>
+            <td class="bx-wiki-cell-lang bx-def-border bx-def-padding-thd"><label for="bx-wiki-del-rev-cell-checkbox-__revision__">__language__</label></td>
+            <td class="bx-wiki-cell-rev bx-def-border bx-def-padding-thd"><label for="bx-wiki-del-rev-cell-checkbox-__revision__">__revision__</label></td>
+            <td class="bx-wiki-cell-time bx-def-border bx-def-padding-thd"><label for="bx-wiki-del-rev-cell-checkbox-__revision__">__timejs__</label></td>
+            <td class="bx-wiki-cell-profile bx-def-border bx-def-padding-thd"><label for="bx-wiki-del-rev-cell-checkbox-__revision__">__author_name__</label></td>
+            <td class="bx-wiki-cell-notes bx-def-border bx-def-padding-thd"><label for="bx-wiki-del-rev-cell-checkbox-__revision__">__notes__</label></td>
         </tr>
     </bx_repeat:revisions>
     </table>

+ 5 - 5
template/wiki_history.html

@@ -2,11 +2,11 @@
 <table class="bx-wiki-history bx-def-margin-sec-top">
 <bx_repeat:revisions>
     <tr>
-        <td class="bx-wiki-history-cell-rev bx-def-border bx-def-padding-thd"><a href="__rev_url__">__revision__</a></td>
-        <td class="bx-wiki-history-cell-lang bx-def-border bx-def-padding-thd">__language__</td>
-        <td class="bx-wiki-history-cell-time bx-def-border bx-def-padding-thd">__timejs__</td>
-        <td class="bx-wiki-history-cell-profile bx-def-border bx-def-padding-thd"><a href="__author_url__">__author_name__</a></td>
-        <td class="bx-wiki-history-cell-notes bx-def-border bx-def-padding-thd">__notes__</td>
+        <td class="bx-wiki-cell-rev bx-def-border bx-def-padding-thd"><a href="__rev_url__">__revision__</a></td>
+        <td class="bx-wiki-cell-lang bx-def-border bx-def-padding-thd">__language__</td>
+        <td class="bx-wiki-cell-time bx-def-border bx-def-padding-thd">__timejs__</td>
+        <td class="bx-wiki-cell-profile bx-def-border bx-def-padding-thd"><a href="__author_url__">__author_name__</a></td>
+        <td class="bx-wiki-cell-notes bx-def-border bx-def-padding-thd">__notes__</td>
     </tr>
 </bx_repeat:revisions>
 </table>

+ 18 - 0
template/wiki_translations_missing.html

@@ -0,0 +1,18 @@
+<table class="bx-wiki-translations">
+    <tr>
+        <th class="bx-wiki-cell-title bx-def-border bx-def-padding-thd">__title_title__</a></th>
+        <th class="bx-wiki-cell-profile bx-def-border bx-def-padding-thd">__title_author__</th>
+        <th class="bx-wiki-cell-lang bx-def-border bx-def-padding-thd">__title_lang__</th>
+        <th class="bx-wiki-cell-content bx-def-border bx-def-padding-thd">__title_content__</th>
+        <th class="bx-wiki-cell-time bx-def-border bx-def-padding-thd">__title_time__</th>
+    </tr>
+<bx_repeat:blocks>
+    <tr>
+        <td class="bx-wiki-cell-title bx-def-border bx-def-padding-thd"><a href="__url__">__title__</a></td>
+        <td class="bx-wiki-cell-profile bx-def-border bx-def-padding-thd"><a href="__author_url__">__author_name__</a></td>
+        <td class="bx-wiki-cell-lang bx-def-border bx-def-padding-thd">__lang__</td>
+        <td class="bx-wiki-cell-content bx-def-border bx-def-padding-thd">__content__</td>
+        <td class="bx-wiki-cell-time bx-def-border bx-def-padding-thd">__timejs__</td>
+    </tr>
+</bx_repeat:blocks>
+</table>

+ 20 - 0
template/wiki_translations_outdated.html

@@ -0,0 +1,20 @@
+<table class="bx-wiki-translations">
+    <tr>
+        <th class="bx-wiki-cell-title bx-def-border bx-def-padding-thd">__title_title__</a></th>
+        <th class="bx-wiki-cell-profile bx-def-border bx-def-padding-thd">__title_author__</th>
+        <th class="bx-wiki-cell-lang bx-def-border bx-def-padding-thd">__title_lang__</th>
+        <th class="bx-wiki-cell-content bx-def-border bx-def-padding-thd">__title_content__</th>
+        <th class="bx-wiki-cell-time bx-def-border bx-def-padding-thd">__title_time_main__</th>
+        <th class="bx-wiki-cell-time bx-def-border bx-def-padding-thd">__title_time__</th>
+    </tr>
+<bx_repeat:blocks>
+    <tr>
+        <td class="bx-wiki-cell-title bx-def-border bx-def-padding-thd"><a href="__url__">__title__</a></td>
+        <td class="bx-wiki-cell-profile bx-def-border bx-def-padding-thd"><a href="__author_url__">__author_name__</a></td>
+        <td class="bx-wiki-cell-lang bx-def-border bx-def-padding-thd">__lang__</td>
+        <td class="bx-wiki-cell-content bx-def-border bx-def-padding-thd">__content__</td>
+        <td class="bx-wiki-cell-time bx-def-border bx-def-padding-thd">__timejs_main__</td>
+        <td class="bx-wiki-cell-time bx-def-border bx-def-padding-thd">__timejs__</td>
+    </tr>
+</bx_repeat:blocks>
+</table>