Ljonka has submitted this change and it was merged. ( 
https://gerrit.wikimedia.org/r/388008 )

Change subject: Initial commit:
......................................................................


Initial commit:

Removal from BlueSpiceExtensions:
- https://gerrit.wikimedia.org/r/#/c/387205/
- https://gerrit.wikimedia.org/r/#/c/387207/

Change-Id: Ic3c0ca0875a801795e898c4adc2d35187057789f
ERM: #7930
---
A .gitreview
A CODE_OF_CONDUCT.md
A PagesVisited.class.php
A composer.json
A extension.json
A i18n/ar.json
A i18n/ba.json
A i18n/bg.json
A i18n/bgn.json
A i18n/bn.json
A i18n/br.json
A i18n/ce.json
A i18n/cv.json
A i18n/da.json
A i18n/de-formal.json
A i18n/de.json
A i18n/en-gb.json
A i18n/en.json
A i18n/es.json
A i18n/fa.json
A i18n/fr.json
A i18n/fy.json
A i18n/gl.json
A i18n/he.json
A i18n/hu.json
A i18n/id.json
A i18n/it.json
A i18n/ja.json
A i18n/ko.json
A i18n/ksh.json
A i18n/lb.json
A i18n/lki.json
A i18n/lt.json
A i18n/mai.json
A i18n/mk.json
A i18n/nb.json
A i18n/nl.json
A i18n/om.json
A i18n/pl.json
A i18n/pt-br.json
A i18n/pt.json
A i18n/qqq.json
A i18n/ru.json
A i18n/sl.json
A i18n/sq.json
A i18n/sv.json
A i18n/tcy.json
A i18n/tr.json
A i18n/uk.json
A i18n/zh-hans.json
A i18n/zh-hant.json
51 files changed, 1,107 insertions(+), 0 deletions(-)

Approvals:
  Ljonka: Verified; Looks good to me, approved
  Raimond Spekking: Looks good to me, but someone else must approve



diff --git a/.gitreview b/.gitreview
new file mode 100644
index 0000000..9bf982a
--- /dev/null
+++ b/.gitreview
@@ -0,0 +1,6 @@
+[gerrit]
+host=gerrit.wikimedia.org
+port=29418
+project=mediawiki/extensions/BlueSpicePagesVisited.git
+defaultbranch=master
+defaultrebase=0
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000..d8e5d08
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1 @@
+The development of this software is covered by a [Code of 
Conduct](https://www.mediawiki.org/wiki/Code_of_Conduct).
diff --git a/PagesVisited.class.php b/PagesVisited.class.php
new file mode 100644
index 0000000..82e9a46
--- /dev/null
+++ b/PagesVisited.class.php
@@ -0,0 +1,380 @@
+<?php
+/**
+ * PagesVisited extension for BlueSpice
+ *
+ * Provides a personalized list of last visited pages.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * This file is part of BlueSpice MediaWiki
+ * For further information visit http://www.bluespice.com
+ *
+ * @author     Robert Vogel <vo...@hallowelt.com>
+ * @author     Stephan Muggli <mug...@hallowelt.com>
+ * @version    2.23.1
+ * @package    BlueSpice_Extensions
+ * @subpackage PagesVisited
+ * @copyright  Copyright (C) 2016 Hallo Welt! GmbH, All rights reserved.
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU Public License v2 or 
later
+ * @filesource
+ */
+
+/**
+ * Base class for PagesVisited extension
+ * @package BlueSpice_Extensions
+ * @subpackage PagesVisited
+ */
+class PagesVisited extends BsExtensionMW {
+
+       /**
+        * Should cache a result list. Currently disabled.
+        * @var array
+        */
+       private static $prResultListViewCache = array();
+       /**
+        * Initialization of PagesVisited extension
+        */
+       protected function initExt() {
+               wfProfileIn( 'BS::'.__METHOD__ );
+               $this->setHook( 'ParserFirstCallInit' );
+               $this->setHook( 'BSUserSidebarDefaultWidgets' );
+               $this->setHook( 'BSWidgetListHelperInitKeyWords' );
+               $this->setHook( 'BSInsertMagicAjaxGetData' );
+               $this->setHook( 'BSUsageTrackerRegisterCollectors' );
+
+               BsConfig::registerVar( 'MW::PagesVisited::WidgetLimit', 10, 
BsConfig::LEVEL_USER|BsConfig::TYPE_INT, 'bs-pagesvisited-pref-widgetlimit', 
'int' );
+               BsConfig::registerVar( 'MW::PagesVisited::WidgetNS', array( 0 
), 
BsConfig::LEVEL_USER|BsConfig::TYPE_ARRAY_STRING|BsConfig::USE_PLUGIN_FOR_PREFS,
 'bs-pagesvisited-pref-widgetns', 'multiselectex' );
+               BsConfig::registerVar( 'MW::PagesVisited::WidgetSortOdr', 
'time', 
BsConfig::LEVEL_USER|BsConfig::TYPE_STRING|BsConfig::USE_PLUGIN_FOR_PREFS, 
'bs-pagesvisited-pref-widgetsortodr', 'select' );
+
+               wfProfileOut( 'BS::'.__METHOD__ );
+       }
+
+       /**
+        * The preferences plugin callback
+        * @param string $sAdapterName
+        * @param BsConfig $oVariable
+        * @return array MediaWiki preferences options array
+        */
+       public function runPreferencePlugin( $sAdapterName, $oVariable ) {
+               $aPrefs = array();
+               switch( $oVariable->getName() ) {
+                       case 'WidgetNS':
+                               $aPrefs = array(
+                                       'type' => 'multiselectex',
+                                       'options' => 
BsNamespaceHelper::getNamespacesForSelectOptions( array( -2, NS_MEDIA, 
NS_MEDIAWIKI, NS_MEDIAWIKI_TALK, NS_SPECIAL ) )
+                               );
+                               break;
+                       case 'WidgetSortOdr':
+                               $aPrefs = array(
+                                       'options' => array(
+                                               wfMessage( 
'bs-pagesvisited-pref-sort-time' )->plain() => 'time',
+                                               wfMessage( 
'bs-pagesvisited-pref-sort-pagename' )->plain() => 'pagename'
+                                       )
+                               );
+                               break;
+                       default:
+                               break;
+               }
+               return $aPrefs;
+       }
+
+       /**
+        * Inject tags into InsertMagic
+        * @param Object $oResponse reference
+        * $param String $type
+        * @return always true to keep hook running
+        */
+       public function onBSInsertMagicAjaxGetData( &$oResponse, $type ) {
+               if( $type != 'tags' ) return true;
+
+               $oDescriptor = new stdClass();
+               $oDescriptor->id = 'bs:pagesvisited';
+               $oDescriptor->type = 'tag';
+               $oDescriptor->name = 'pagesvisited';
+               $oDescriptor->desc = wfMessage( 
'bs-pagesvisited-tag-pagesvisited-desc' )->escaped();
+               $oDescriptor->code = '<bs:pagesvisited />';
+               $oDescriptor->previewable = false;
+               $oDescriptor->examples = array(
+                       array(
+                               'code' => '<bs:pagesvisited count="7" 
maxtitlelength="40" />'
+                       )
+               );
+               $oDescriptor->helplink = 
'https://help.bluespice.com/index.php/PagesVisited';
+               $oResponse->result[] = $oDescriptor;
+
+               return true;
+       }
+
+       /**
+        * Event-Handler for 'MW::Utility::WidgetListHelper::InitKeywords'. 
Registers a callback for the PAGESVISITED Keyword.
+        * @param array $aKeywords An array of Keywords array( 'KEYWORD' => 
$callable )
+        * @return array The appended array of Keywords array( 'KEYWORD' => 
$callable )
+        */
+       public function onBSWidgetListHelperInitKeyWords( &$aKeywords, $oTitle 
) {
+               $aKeywords['PAGESVISITED'] = array( $this, 
'onWidgetListKeyword' );
+               return true;
+       }
+
+       /**
+        * Hook-Handler for 'ParserFirstCallInit' (MediaWiki). Sets new 
Parser-Hooks for the &lt;bs:pagesvisited /&gt; and &lt;pagesvisited /&gt; tag
+        * @param Parser $oParser The current Parser object from MediaWiki 
Framework
+        * @return bool Always true to keep hook running.
+        */
+       public function onParserFirstCallInit( &$oParser ) {
+               $oParser->setHook( 'pagesvisited', array( $this, 
'onPagesVisitedTag' ) );
+               $oParser->setHook( 'bs:pagesvisited', array( $this, 
'onPagesVisitedTag' ) );
+               return true;
+       }
+
+       /**
+        * Handles the Parser Hook for TagExtensions
+        * @param string $sInput Content of $lt;pagesvisited /&gt; from 
MediaWiki Framework
+        * @param array $aAttributes Attributes of &lt;pagesvisited /&gt; from 
MediaWiki Framework
+        * @param Parser $oParser Parser object from MediaWiki Framework
+        * @return string HTML list of recently visited pages
+        */
+       public function onPagesVisitedTag( $sInput, $aAttributes, $oParser ) {
+               $oParser->disableCache();
+               $oParser->getOutput()->setProperty( 'bs-tag-pagesvisited', 1 );
+
+               $oErrorListView = new ViewTagErrorList( $this );
+
+               $iCount = BsCore::sanitizeArrayEntry( $aAttributes, 'count', 5, 
BsPARAMTYPE::INT );
+               $iMaxTitleLength = BsCore::sanitizeArrayEntry( $aAttributes, 
'maxtitlelength', 20, BsPARAMTYPE::INT );
+               $sNamespaces = BsCore::sanitizeArrayEntry( $aAttributes, 
'namespaces', 'all', BsPARAMTYPE::STRING | BsPARAMOPTION::CLEANUP_STRING );
+               $sSortOrder = BsCore::sanitizeArrayEntry( $aAttributes, 
'order', 'time', BsPARAMTYPE::STRING | BsPARAMOPTION::CLEANUP_STRING );
+
+               //Validation
+               $oValidationICount = BsValidator::isValid( 'IntegerRange', 
$iCount, array('fullResponse' => true, 'lowerBoundary' => 1, 'upperBoundary' => 
30) );
+               if ( $oValidationICount->getErrorCode() ) {
+                       $oErrorListView->addItem( new ViewTagError( 'count: 
'.$oValidationICount->getI18N() ) );
+               }
+
+               $oValidationIMaxTitleLength = BsValidator::isValid( 
'IntegerRange', $iMaxTitleLength, array('fullResponse' => true, 'lowerBoundary' 
=> 5, 'upperBoundary' => 50) );
+               if ( $oValidationIMaxTitleLength->getErrorCode() ) {
+                       $oErrorListView->addItem( new ViewTagError( 
'maxtitlelength: '.$oValidationIMaxTitleLength->getI18N() ) );
+               }
+
+               if ( $oErrorListView->hasItems() ) {
+                       return $oErrorListView->execute();
+               }
+               $iCurrentNamespaceId = $oParser->getTitle()->getNamespace();
+               $oListView = $this->makePagesVisitedWikiList( $iCount, 
$sNamespaces, $iCurrentNamespaceId, $iMaxTitleLength, $sSortOrder );
+               $sOut = $oListView->execute();
+
+               if ( $oListView instanceof ViewTagErrorList ) {
+                       return $sOut;
+               } else {
+                       return $this->mCore->parseWikiText( $sOut, 
$this->getTitle() );
+               }
+       }
+
+       /**
+        * Callback for WidgetListHelper. Adds the PagesVisited Widget to the 
list if Keyword is found.
+        * @return ViewWidget.
+        */
+       public function onWidgetListKeyword() {
+               $aViews = array();
+               $this->addWidgetView( $aViews );
+               $aViews[0]->setAdditionalBodyClasses( array( 'bs-nav-links' ) );
+
+               return $aViews[0];
+       }
+
+       /**
+        * Callback for WidgetBar. Adds the PagesVisited Widget to the 
WidgetBar as default filling.
+        * @param BsEvent $oEvent The event to handle
+        * @param array $aWidgets An array of WidgetView objects
+        * @return array An array of WidgetView objects
+        */
+       public function onBSUserSidebarDefaultWidgets( &$aViews, $oUser, 
$oTitle ) {
+               $aView = array();
+               $this->addWidgetView( $aView );
+               $aView[0]->setAdditionalBodyClasses( array( 'bs-nav-links' ) );
+               $aViews['PAGESVISITED'] = $aView[0];
+
+               return true;
+       }
+
+       /**
+        * Creates a Widget view object for the BlueSpice Skin.
+        * @param array &$aViews List of Widget view objects from the BlueSpice 
Skin.
+        */
+       private function addWidgetView( &$aViews ) {
+               $iCount = BsConfig::get( 'MW::PagesVisited::WidgetLimit' );
+               $aNamespaces = BsConfig::get( 'MW::PagesVisited::WidgetNS' );
+               $sSortOrder = BsConfig::get( 'MW::PagesVisited::WidgetSortOdr' 
);
+
+               //Validation
+               $oValidationICount = BsValidator::isValid( 'IntegerRange', 
$iCount, array( 'fullResponse' => true, 'lowerBoundary' => 1, 'upperBoundary' 
=> 30 ) );
+               if ( $oValidationICount->getErrorCode() ) $iCount = 10;
+
+               $iCurrentNamespaceId = $this->getTitle()->getNamespace();
+
+               // TODO RBV (04.07.11 15:02): Rework method -> implode() is a 
workaround for legacy code.
+               $oListView = $this->makePagesVisitedWikiList( $iCount, implode( 
',', $aNamespaces ), $iCurrentNamespaceId, 30, $sSortOrder );
+               $sOut = $oListView->execute();
+
+               if ( !( $oListView instanceof ViewTagError ) ) {
+                       $sOut = $this->mCore->parseWikiText( $sOut, 
$this->getTitle() );
+               }
+
+               $oWidgetView = new ViewWidget();
+               $oWidgetView->setTitle( wfMessage( 
'bs-pagesvisited-widget-title' )->plain() )
+                                       ->setBody( $sOut )
+                                       ->setAdditionalBodyClasses( array( 
'bs-nav-links' ) ); //For correct margin and fontsize
+
+               $aViews[] = $oWidgetView;
+       }
+
+       /**
+        * Gets the recently visited pages of the current user.
+        * @param int $iCount The number of pages to display
+        * @param string $sNamespaces Comma separated list of requested 
namespaces, i.e. "1,5,Category,101"
+        * @param int $iCurrentNamespaceId To determin wether the current 
namespace is in the list of requested namespaces
+        * @param string $sSortOrder Defines the sorting of the list. 
'time|pagename', default is 'time'
+        * @return ViewBaseElement Contains the list in its _data member. The 
predefined template is '*[[{LINK}|{TITLE}]]\n'
+        */
+       private function makePagesVisitedWikiList( $iCount = 5, $sNamespaces = 
'all', $iCurrentNamespaceId = 0, $iMaxTitleLength = 20, $sSortOrder = 'time' ) {
+               $oCurrentUser = $this->getUser();
+               if ( is_null( $oCurrentUser ) ) return null; // in CLI
+
+               //$sCacheKey = md5( 
$oCurrentUser->getName().$iCount.$sNamespaces.$iCurrentNamespaceId.$iMaxTitleLength
 );
+               //if( isset( self::$prResultListViewCache[$sCacheKey] ) ) 
return self::$prResultListViewCache[$sCacheKey];
+               $oErrorListView = new ViewTagErrorList( $this );
+               $oErrorView = null;
+               $aConditions = array();
+               $aNamespaceIndexes = array( 0 );
+
+               try {
+                       $aNamespaceIndexes = 
BsNamespaceHelper::getNamespaceIdsFromAmbiguousCSVString( $sNamespaces ); 
//Returns array of integer indexes
+               } catch ( BsInvalidNamespaceException $oException ) {
+                       $aInvalidNamespaces = 
$oException->getListOfInvalidNamespaces();
+
+                       $oVisitedPagesListView = new ViewBaseElement();
+                       $oVisitedPagesListView->setTemplate( 
'<ul><li><em>{TEXT}</em></li></ul>' . "\n" );
+
+                       $iCount = count( $aInvalidNamespaces );
+                       $sNs = implode( ', ', $aInvalidNamespaces );
+                       $sErrorMsg = wfMessage( 
'bs-pagesvisited-error-nsnotvalid', $iCount, $sNs )->text();
+
+                       $oVisitedPagesListView->addData( array ( 'TEXT' => 
$sErrorMsg ) );
+
+                       //self::$prResultListViewCache[$sCacheKey] = 
$oVisitedPagesListView;
+                       return $oVisitedPagesListView;
+               }
+
+               $aConditions = array(
+                       'wo_user_id' => $oCurrentUser->getId(),
+                       'wo_action' => 'view'
+               );
+
+               $aConditions[] = 'wo_page_namespace IN ('.implode( ',', 
$aNamespaceIndexes ).')'; //Add IN clause to conditions-array
+               $aConditions[] = 'wo_page_namespace != -1'; // TODO RBV 
(24.02.11 13:54): Filter SpecialPages because there are difficulties to list 
them
+
+               $aOptions = array(
+                       'GROUP BY' => 'wo_page_id, wo_page_namespace, 
wo_page_title',
+                       'ORDER BY' => 'MAX(wo_timestamp) DESC'
+               );
+
+               if ( $sSortOrder == 'pagename' ) $aOptions['ORDER BY'] = 
'wo_page_title ASC';
+
+               //If the page the extension is used on appears in the result 
set we have to fetch one row more than neccessary.
+               if ( in_array( $iCurrentNamespaceId, $aNamespaceIndexes ) ) 
$aOptions['OFFSET'] = 1;
+
+               $aFields = array( 'wo_page_id', 'wo_page_namespace', 
'wo_page_title' );
+               $sTable = 'bs_whoisonline';
+
+               $dbr = wfGetDB( DB_REPLICA );
+
+               global $wgDBtype;
+               if ( $wgDBtype == 'oracle' ) {
+                       $sRowNumField = 'rnk';
+                       $sTable = mb_strtoupper( $dbr->tablePrefix().$sTable );
+                       $sFields = implode( ',', $aFields );
+                       $sConditions = $dbr->makeList( $aConditions, LIST_AND );
+                       $aOptions['ORDER BY'] = $sSortOrder == 'pagename' ? 
$aOptions['ORDER BY'] : 'wo_timestamp DESC' ;
+
+                       $res = $dbr->query( "SELECT ".$sFields." FROM (
+                                                                               
        SELECT ".$sFields.", row_number() over (order by ".$aOptions['ORDER 
BY'].") ".$sRowNumField."
+                                                                               
        FROM ".$sTable."
+                                                                               
        WHERE ".$sConditions."
+                                                                               
        )
+                                                                               
WHERE ".$sRowNumField." BETWEEN (0) AND (".$iCount.") GROUP BY 
".$aOptions["GROUP BY"].""
+                       );
+               } else {
+                       $res = $dbr->select(
+                                                               $sTable,
+                                                               $aFields,
+                                                               $aConditions,
+                                                               __METHOD__,
+                                                               $aOptions
+                                               );
+               }
+
+               $oVisitedPagesListView = new ViewBaseElement();
+               $oVisitedPagesListView->setTemplate( '*{WIKILINK}' . "\n" );
+               $iItems = 1;
+
+               foreach ( $res as $row ) {
+                       if ( $iItems > $iCount ) break;
+                       $oVisitedPageTitle = Title::newFromID( $row->wo_page_id 
);
+                       /*
+                       // TODO RBV (24.02.11 13:52): Make SpecialPages work...
+                       $oVisitedPageTitle = ( $row->wo_page_namespace != 
NS_SPECIAL )
+                                                               ? 
Title::newFromID( $row->wo_page_id )
+                                                               //: 
SpecialPage::getTitleFor( $row->wo_page_title );
+                                                               : 
Title::makeTitle( NS_SPECIAL, $row->wo_page_title );
+                       */
+                       if ( $oVisitedPageTitle == null
+                               || $oVisitedPageTitle->exists() === false
+                               || $oVisitedPageTitle->quickUserCan( 'read' ) 
=== false
+                               //|| $oVisitedPageTitle->isRedirect() //Maybe 
later...
+                               ) {
+                               continue;
+                       }
+
+                       $sDisplayTitle = BsStringHelper::shorten(
+                               $oVisitedPageTitle->getPrefixedText(),
+                               array( 'max-length' => $iMaxTitleLength, 
'position' => 'middle' )
+                       );
+
+                       $oVisitedPagesListView->addData(
+                               array ( 'WIKILINK' => 
BsLinkProvider::makeEscapedWikiLinkForTitle( $oVisitedPageTitle, $sDisplayTitle 
) )
+                       );
+                       $iItems++;
+               }
+
+               //$dbr->freeResult( $res );
+
+               //self::$prResultListViewCache[$sCacheKey] = 
$oVisitedPagesListView;
+               return $oVisitedPagesListView;
+       }
+
+       /**
+        * Register tag with UsageTracker extension
+        * @param array $aCollectorsConfig
+        * @return Always true to keep hook running
+        */
+       public function onBSUsageTrackerRegisterCollectors( &$aCollectorsConfig 
) {
+               $aCollectorsConfig['bs:pagesvisited'] = array(
+                       'class' => 'Property',
+                       'config' => array(
+                               'identifier' => 'bs-tag-pagesvisited'
+                       )
+               );
+               return true;
+       }
+}
diff --git a/composer.json b/composer.json
new file mode 100644
index 0000000..db434bb
--- /dev/null
+++ b/composer.json
@@ -0,0 +1,13 @@
+{
+       "name": "mediawiki/blue-spice-pages-visited",
+       "type": "mediawiki-extension",
+       "description": "Provides a personalized list of the last visited pages",
+       "license": "GPL-3.0",
+       "require": {
+               "composer/installers": "~1.0"
+       },
+       "autoload": {
+               "psr-4": {
+               }
+       }
+}
\ No newline at end of file
diff --git a/extension.json b/extension.json
new file mode 100644
index 0000000..1890efb
--- /dev/null
+++ b/extension.json
@@ -0,0 +1,28 @@
+{
+       "name": "BlueSpicePagesVisited",
+       "version": "2.27.1-alpha",
+       "url": "https://help.bluespice.com/index.php/PagesVisited";,
+       "author": [
+               "Robert Vogel",
+               "Stephan Muggli"
+       ],
+       "descriptionmsg": "bs-pagesvisited-desc",
+       "license-name": "GPL-2.0+",
+       "type": "bluespice",
+       "bsgExtensions": {
+               "BlueSpicePagesVisited": {
+                       "className": "PagesVisited",
+                       "extPath": "/BlueSpicePagesVisited"
+               }
+       },
+       "MessagesDirs": {
+               "PagesVisited": [
+                       "i18n"
+               ]
+       },
+       "AutoloadClasses": {
+               "PagesVisited": "PagesVisited.class.php"
+       },
+       "load_composer_autoloader": true,
+       "manifest_version": 1
+}
diff --git a/i18n/ar.json b/i18n/ar.json
new file mode 100644
index 0000000..c1d064d
--- /dev/null
+++ b/i18n/ar.json
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Meno25"
+               ]
+       },
+       "bs-pagesvisited-pref-sort-pagename": "العنوان"
+}
diff --git a/i18n/ba.json b/i18n/ba.json
new file mode 100644
index 0000000..ee724c5
--- /dev/null
+++ b/i18n/ba.json
@@ -0,0 +1,18 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Sagan",
+                       "Азат Хәлилов"
+               ]
+       },
+       "bs-pagesvisited-desc": "Үҙе төҙөгән битте ҡараусылар исемлеген 
күрһәтә\n\nҺуңғы ҡаралған  биттәрҙең үҙ исемлеген тәҡдим итә",
+       "prefs-pagesvisited": "Битт ҡарау",
+       "bs-pagesvisited-widget-title": "Ҡаралған биттәр",
+       "bs-pagesvisited-error-nsnotvalid": "Исемдәр арауығы дөрөҫ 
түгел{{PLURAL:$1||s}} <code>$2</code> {{PLURAL:$1|is|are}}.",
+       "bs-pagesvisited-pref-widgetlimit": "Яҙма эшләү сикләнгән",
+       "bs-pagesvisited-pref-widgetns": "Исемдәр арауығы:",
+       "bs-pagesvisited-pref-widgetsortodr": "Тәртипләштереү:",
+       "bs-pagesvisited-pref-sort-time": "Ваҡыт",
+       "bs-pagesvisited-pref-sort-pagename": "Баш һүҙ",
+       "bs-pagesvisited-tag-pagesvisited-desc": "Һеҙ ҡараған биттәр исемлеге"
+}
diff --git a/i18n/bg.json b/i18n/bg.json
new file mode 100644
index 0000000..bf3b280
--- /dev/null
+++ b/i18n/bg.json
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": [
+                       "StanProg"
+               ]
+       },
+       "bs-pagesvisited-pref-widgetns": "Именни пространства:"
+}
diff --git a/i18n/bgn.json b/i18n/bgn.json
new file mode 100644
index 0000000..5011073
--- /dev/null
+++ b/i18n/bgn.json
@@ -0,0 +1,9 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Baloch Afghanistan"
+               ]
+       },
+       "bs-pagesvisited-pref-sort-time": "وخت",
+       "bs-pagesvisited-pref-sort-pagename": "ئنوان"
+}
diff --git a/i18n/bn.json b/i18n/bn.json
new file mode 100644
index 0000000..60a37e8
--- /dev/null
+++ b/i18n/bn.json
@@ -0,0 +1,11 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Aftabuzzaman"
+               ]
+       },
+       "bs-pagesvisited-pref-widgetns": "নামস্থান:",
+       "bs-pagesvisited-pref-widgetsortodr": "সাজান:",
+       "bs-pagesvisited-pref-sort-time": "সময়",
+       "bs-pagesvisited-pref-sort-pagename": "শিরোনাম"
+}
diff --git a/i18n/br.json b/i18n/br.json
new file mode 100644
index 0000000..fc733d5
--- /dev/null
+++ b/i18n/br.json
@@ -0,0 +1,13 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Fohanno"
+               ]
+       },
+       "prefs-pagesvisited": "Pajennoù gweladennet",
+       "bs-pagesvisited-widget-title": "Pajennoù gweladennet",
+       "bs-pagesvisited-pref-widgetsortodr": "Renkañ dre :",
+       "bs-pagesvisited-pref-sort-time": "Eur",
+       "bs-pagesvisited-pref-sort-pagename": "Titl",
+       "bs-pagesvisited-tag-pagesvisited-desc": "Diskwel ur roll eus ar 
pajennoù ho peus gweladennet."
+}
diff --git a/i18n/ce.json b/i18n/ce.json
new file mode 100644
index 0000000..8b4a2f0
--- /dev/null
+++ b/i18n/ce.json
@@ -0,0 +1,17 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Умар"
+               ]
+       },
+       "bs-pagesvisited-desc": "Хьайн хьаьжанчу агӀонийн могӀам ба йиш 
хуьлуьйту.",
+       "prefs-pagesvisited": "Хьаьжина агӀонаш",
+       "bs-pagesvisited-widget-title": "Хьаьжина агӀонаш",
+       "bs-pagesvisited-error-nsnotvalid": "Нийса йоцу цӀерийн 
{{PLURAL:$1|меттиг}} <code>$2</code> {{PLURAL:$1|is|are}}.",
+       "bs-pagesvisited-pref-widgetlimit": "ДӀаяздарийн доза тохар:",
+       "bs-pagesvisited-pref-widgetns": "ЦӀерийн меттиг:",
+       "bs-pagesvisited-pref-widgetsortodr": "Къастам бе:",
+       "bs-pagesvisited-pref-sort-time": "Хан",
+       "bs-pagesvisited-pref-sort-pagename": "Корта",
+       "bs-pagesvisited-tag-pagesvisited-desc": "Хьо хьаьжжина агӀонийн могӀам 
гойту."
+}
diff --git a/i18n/cv.json b/i18n/cv.json
new file mode 100644
index 0000000..4cb0955
--- /dev/null
+++ b/i18n/cv.json
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Chuvash2014"
+               ]
+       },
+       "bs-pagesvisited-pref-sort-time": "Вăхăт"
+}
diff --git a/i18n/da.json b/i18n/da.json
new file mode 100644
index 0000000..ab6dcee
--- /dev/null
+++ b/i18n/da.json
@@ -0,0 +1,17 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Joedalton"
+               ]
+       },
+       "bs-pagesvisited-desc": "Tilbyder en personlig liste over de sidst 
besøgte sider",
+       "prefs-pagesvisited": "Sider besøgt",
+       "bs-pagesvisited-widget-title": "Sider besøgt",
+       "bs-pagesvisited-error-nsnotvalid": "{{PLURAL:$1|navnerum}} 
<code>$2</code> {{PLURAL:$1|er}} ikke gyldig(e).",
+       "bs-pagesvisited-pref-widgetlimit": "Begrænsning af elementer:",
+       "bs-pagesvisited-pref-widgetns": "Navnerum:",
+       "bs-pagesvisited-pref-widgetsortodr": "Sorter efter:",
+       "bs-pagesvisited-pref-sort-time": "Tidspunkt",
+       "bs-pagesvisited-pref-sort-pagename": "Titel",
+       "bs-pagesvisited-tag-pagesvisited-desc": "Viser en liste over de sidst 
besøgte sider. Denne liste kan begrænses af parametre."
+}
diff --git a/i18n/de-formal.json b/i18n/de-formal.json
new file mode 100644
index 0000000..d1bea91
--- /dev/null
+++ b/i18n/de-formal.json
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Stephan Muggli <mug...@hallowelt.biz>"
+               ]
+       },
+       "bs-pagesvisited-tag-pagesvisited-desc": "Gibt eine Liste mit Seiten 
aus, die Sie besucht haben."
+}
diff --git a/i18n/de.json b/i18n/de.json
new file mode 100644
index 0000000..b2d83dc
--- /dev/null
+++ b/i18n/de.json
@@ -0,0 +1,18 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Stephan Muggli <mug...@hallowelt.biz>",
+                       "Metalhead64"
+               ]
+       },
+       "bs-pagesvisited-desc": "Stellt eine personalisierte Liste der zuletzt 
besuchten Seiten zur Verfügung",
+       "prefs-pagesvisited": "Besuchte Seiten",
+       "bs-pagesvisited-widget-title": "Besuchte Seiten",
+       "bs-pagesvisited-error-nsnotvalid": "{{PLURAL:$1|Der|Die}} 
angegebene{{PLURAL:$1||n}} Namens{{PLURAL:$1|raum|räume}} <code>$2</code> 
{{PLURAL:$1|ist|sind}} nicht gültig.",
+       "bs-pagesvisited-pref-widgetlimit": "Anzahl der Einträge:",
+       "bs-pagesvisited-pref-widgetns": "Anzuzeigende Namensräume:",
+       "bs-pagesvisited-pref-widgetsortodr": "Sortieren nach:",
+       "bs-pagesvisited-pref-sort-time": "Zeit",
+       "bs-pagesvisited-pref-sort-pagename": "Titel",
+       "bs-pagesvisited-tag-pagesvisited-desc": "Zeigt eine Liste kürzlich 
besuchter Seiten an. Diese Liste kann durch Parameter beschränkt werden."
+}
diff --git a/i18n/en-gb.json b/i18n/en-gb.json
new file mode 100644
index 0000000..2ff1554
--- /dev/null
+++ b/i18n/en-gb.json
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Shirayuki"
+               ]
+       },
+       "bs-pagesvisited-desc": "Provides a personalised list of the last 
visited pages"
+}
diff --git a/i18n/en.json b/i18n/en.json
new file mode 100644
index 0000000..638b211
--- /dev/null
+++ b/i18n/en.json
@@ -0,0 +1,17 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Stephan Muggli <mug...@hallowelt.biz>"
+               ]
+       },
+       "bs-pagesvisited-desc": "Provides a personalized list of the last 
visited pages",
+       "prefs-pagesvisited": "Pages visited",
+       "bs-pagesvisited-widget-title": "Pages visited",
+       "bs-pagesvisited-error-nsnotvalid": "Given 
{{PLURAL:$1|namespace|namespaces}} <code>$2</code> {{PLURAL:$1|is|are}} not 
valid.",
+       "bs-pagesvisited-pref-widgetlimit": "Limit of entries:",
+       "bs-pagesvisited-pref-widgetns": "Namespaces:",
+       "bs-pagesvisited-pref-widgetsortodr": "Sort by:",
+       "bs-pagesvisited-pref-sort-time": "Time",
+       "bs-pagesvisited-pref-sort-pagename": "Title",
+       "bs-pagesvisited-tag-pagesvisited-desc": "Shows a list of recently 
visited pages. This list can be restricted by parameters."
+}
diff --git a/i18n/es.json b/i18n/es.json
new file mode 100644
index 0000000..018cf4b
--- /dev/null
+++ b/i18n/es.json
@@ -0,0 +1,17 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Macofe"
+               ]
+       },
+       "bs-pagesvisited-desc": "Proporciona una lista personalizada de las 
últimas páginas visitadas",
+       "prefs-pagesvisited": "Páginas visitadas",
+       "bs-pagesvisited-widget-title": "Páginas visitadas",
+       "bs-pagesvisited-error-nsnotvalid": "{{PLURAL:$1|El espacio|Los 
espacios}} de nombres <code>$2</code> no {{PLURAL:$1|es válido|son válidos}}.",
+       "bs-pagesvisited-pref-widgetlimit": "Límite de entradas:",
+       "bs-pagesvisited-pref-widgetns": "Espacios de nombresː",
+       "bs-pagesvisited-pref-widgetsortodr": "Ordenar por:",
+       "bs-pagesvisited-pref-sort-time": "Tiempo",
+       "bs-pagesvisited-pref-sort-pagename": "Título",
+       "bs-pagesvisited-tag-pagesvisited-desc": "Muestra una lista de las 
páginas visitadas recientemente. Esta lista puede restringirse por parámetros."
+}
diff --git a/i18n/fa.json b/i18n/fa.json
new file mode 100644
index 0000000..02d6de6
--- /dev/null
+++ b/i18n/fa.json
@@ -0,0 +1,17 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Alirezaaa"
+               ]
+       },
+       "bs-pagesvisited-desc": "یک فهرست شخصی از آخرین صفحات بازدیدشده فراهم 
می‌کند",
+       "prefs-pagesvisited": "صفحات بازدیدشده",
+       "bs-pagesvisited-widget-title": "صفحات بازدیدشده",
+       "bs-pagesvisited-error-nsnotvalid": "{{PLURAL:$1|فضای نام|فضاهای نام}} 
<code>$2</code> داده‌شده معتبر {{PLURAL:$1|نیست|نیستند}}.",
+       "bs-pagesvisited-pref-widgetlimit": "محدودیت ورودی‌ها:",
+       "bs-pagesvisited-pref-widgetns": "فضاهای نام:",
+       "bs-pagesvisited-pref-widgetsortodr": "ترتیب بر پایه:",
+       "bs-pagesvisited-pref-sort-time": "زمان",
+       "bs-pagesvisited-pref-sort-pagename": "عنوان",
+       "bs-pagesvisited-tag-pagesvisited-desc": "یک فهرست از صفحاتی که بازدید 
کردید نشان می‌دهد."
+}
diff --git a/i18n/fr.json b/i18n/fr.json
new file mode 100644
index 0000000..c94b30f
--- /dev/null
+++ b/i18n/fr.json
@@ -0,0 +1,19 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Gomoko",
+                       "SnowedEarth",
+                       "Wladek92"
+               ]
+       },
+       "bs-pagesvisited-desc": "Fournit une liste personnalisée des dernières 
pages visitées",
+       "prefs-pagesvisited": "Pages visitées",
+       "bs-pagesvisited-widget-title": "Pages visitées",
+       "bs-pagesvisited-error-nsnotvalid": "{{PLURAL:$1|L’espace de nom|les 
espaces de nom}} <code>$2</code> {{PLURAL:$1|n’est|ne sont}} pas 
valide{{PLURAL:$1||s}}.",
+       "bs-pagesvisited-pref-widgetlimit": "Limite d’entrées :",
+       "bs-pagesvisited-pref-widgetns": "Espaces de nom :",
+       "bs-pagesvisited-pref-widgetsortodr": "Trier par :",
+       "bs-pagesvisited-pref-sort-time": "Horodatage",
+       "bs-pagesvisited-pref-sort-pagename": "Titre",
+       "bs-pagesvisited-tag-pagesvisited-desc": "Affiche une liste de pages 
récemment visitées. Cette liste peut être filtrée par des paramètres."
+}
diff --git a/i18n/fy.json b/i18n/fy.json
new file mode 100644
index 0000000..104d598
--- /dev/null
+++ b/i18n/fy.json
@@ -0,0 +1,9 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Robin0van0der0vliet"
+               ]
+       },
+       "bs-pagesvisited-pref-widgetns": "Nammeromten:",
+       "bs-pagesvisited-pref-sort-time": "Tiid"
+}
diff --git a/i18n/gl.json b/i18n/gl.json
new file mode 100644
index 0000000..e4d7af1
--- /dev/null
+++ b/i18n/gl.json
@@ -0,0 +1,17 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Elisardojm"
+               ]
+       },
+       "bs-pagesvisited-desc": "Proporciona unha lista personalizada das 
últimas páxinas visitadas",
+       "prefs-pagesvisited": "Páxinas visitadas",
+       "bs-pagesvisited-widget-title": "Páxinas visitadas",
+       "bs-pagesvisited-error-nsnotvalid": "{{PLURAL:$1|O espazo|Os espazos}} 
de nomes <code>$2</code> non {{PLURAL:$1|é válido|son válidos}}.",
+       "bs-pagesvisited-pref-widgetlimit": "Límite de entradas:",
+       "bs-pagesvisited-pref-widgetns": "Espazos de nomes:",
+       "bs-pagesvisited-pref-widgetsortodr": "Ordenar por:",
+       "bs-pagesvisited-pref-sort-time": "Tempo",
+       "bs-pagesvisited-pref-sort-pagename": "Título",
+       "bs-pagesvisited-tag-pagesvisited-desc": "Mostra unha lista das páxinas 
visitadas recentemente. Esta lista pode restrinxinse con parámetros."
+}
diff --git a/i18n/he.json b/i18n/he.json
new file mode 100644
index 0000000..f4fbe41
--- /dev/null
+++ b/i18n/he.json
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Guycn2"
+               ]
+       },
+       "bs-pagesvisited-tag-pagesvisited-desc": "הצגת רשימה של הדפים שניצפו 
לאחרונה. אפשר להגביל את זה באמצעות פרמטרים."
+}
diff --git a/i18n/hu.json b/i18n/hu.json
new file mode 100644
index 0000000..31bde26
--- /dev/null
+++ b/i18n/hu.json
@@ -0,0 +1,13 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Csega"
+               ]
+       },
+       "prefs-pagesvisited": "Meglátogatott oldalak",
+       "bs-pagesvisited-widget-title": "Meglátogatott oldalak",
+       "bs-pagesvisited-pref-widgetns": "Névterek:",
+       "bs-pagesvisited-pref-widgetsortodr": "Rendezés:",
+       "bs-pagesvisited-pref-sort-time": "Idő",
+       "bs-pagesvisited-pref-sort-pagename": "Cím"
+}
diff --git a/i18n/id.json b/i18n/id.json
new file mode 100644
index 0000000..c0f268e
--- /dev/null
+++ b/i18n/id.json
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Rachmat.Wahidi"
+               ]
+       },
+       "bs-pagesvisited-tag-pagesvisited-desc": "Menampilkan daftar halaman 
yang baru dikunjungi. Daftar ini dapat dibatasi dengan parameter."
+}
diff --git a/i18n/it.json b/i18n/it.json
new file mode 100644
index 0000000..49e7a4f
--- /dev/null
+++ b/i18n/it.json
@@ -0,0 +1,19 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Beta16",
+                       "Matteocng",
+                       "Selven"
+               ]
+       },
+       "bs-pagesvisited-desc": "Fornisce un elenco personalizzato delle ultime 
pagine visitate",
+       "prefs-pagesvisited": "Pagine visitate",
+       "bs-pagesvisited-widget-title": "Pagine visitate",
+       "bs-pagesvisited-error-nsnotvalid": "{{PLURAL:$1|Il|I}} namespace 
<code>$2</code> non {{PLURAL:$1|è valido|sono validi}}.",
+       "bs-pagesvisited-pref-widgetlimit": "Limite di ingressi:",
+       "bs-pagesvisited-pref-widgetns": "Namespace:",
+       "bs-pagesvisited-pref-widgetsortodr": "Ordina per:",
+       "bs-pagesvisited-pref-sort-time": "Ora",
+       "bs-pagesvisited-pref-sort-pagename": "Titolo",
+       "bs-pagesvisited-tag-pagesvisited-desc": "Mostra un elenco delle pagine 
visitate recentemente. Questo elenco può essere ristretto con dei parametri."
+}
diff --git a/i18n/ja.json b/i18n/ja.json
new file mode 100644
index 0000000..151e932
--- /dev/null
+++ b/i18n/ja.json
@@ -0,0 +1,18 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Shirayuki",
+                       "Otokoume"
+               ]
+       },
+       "bs-pagesvisited-desc": "最後に訪問したページのパーソナライズされたリストを提供します",
+       "prefs-pagesvisited": "閲覧したページ",
+       "bs-pagesvisited-widget-title": "閲覧したページ",
+       "bs-pagesvisited-error-nsnotvalid": "指定した{{PLURAL:$1|名前空間}} 
<code>$2</code> は有効ではありません。",
+       "bs-pagesvisited-pref-widgetlimit": "項目数の上限:",
+       "bs-pagesvisited-pref-widgetns": "名前空間:",
+       "bs-pagesvisited-pref-widgetsortodr": "並び順:",
+       "bs-pagesvisited-pref-sort-time": "日時",
+       "bs-pagesvisited-pref-sort-pagename": "ページ名",
+       "bs-pagesvisited-tag-pagesvisited-desc": "閲覧したページの一覧を表示する。"
+}
diff --git a/i18n/ko.json b/i18n/ko.json
new file mode 100644
index 0000000..4930951
--- /dev/null
+++ b/i18n/ko.json
@@ -0,0 +1,11 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Hwangjy9"
+               ]
+       },
+       "bs-pagesvisited-pref-widgetns": "이름공간:",
+       "bs-pagesvisited-pref-widgetsortodr": "정렬 기준:",
+       "bs-pagesvisited-pref-sort-time": "시간",
+       "bs-pagesvisited-pref-sort-pagename": "제목"
+}
diff --git a/i18n/ksh.json b/i18n/ksh.json
new file mode 100644
index 0000000..959d9d4
--- /dev/null
+++ b/i18n/ksh.json
@@ -0,0 +1,17 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Purodha"
+               ]
+       },
+       "bs-pagesvisited-desc": "Brängk en päsöhnlesche Leß vun de zerläß 
opjerohfe Sigge.",
+       "prefs-pagesvisited": "Opjerohfe Sigge",
+       "bs-pagesvisited-widget-title": "Opjerohfe Sigge",
+       "bs-pagesvisited-error-nsnotvalid": "{{PLURAL:$1|Dat aanjejovve 
Appachtemang|De aanjejovve Appachtemangs|Kein aanjejovve Appachtemang}} 
<code>$2</code> {{PLURAL:$1|es|sin|es}} onjöltesch.",
+       "bs-pagesvisited-pref-widgetlimit": "De Aanzahl Enndrähsch:",
+       "bs-pagesvisited-pref-widgetns": "Appachtemangs:",
+       "bs-pagesvisited-pref-widgetsortodr": "Zettehr noh:",
+       "bs-pagesvisited-pref-sort-time": "Zigg",
+       "bs-pagesvisited-pref-sort-pagename": "Övverschreff",
+       "bs-pagesvisited-tag-pagesvisited-desc": "Zeijsch en Leß met de 
köözlesch opjerohfe Sigge. Di löht sesch övver Parramehtere beschrängke."
+}
diff --git a/i18n/lb.json b/i18n/lb.json
new file mode 100644
index 0000000..f05069d
--- /dev/null
+++ b/i18n/lb.json
@@ -0,0 +1,15 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Robby"
+               ]
+       },
+       "bs-pagesvisited-desc": "Stellt eng personaliséiert Lëscht vun de 
leschte besichte Säiten",
+       "prefs-pagesvisited": "Besicht Säiten",
+       "bs-pagesvisited-widget-title": "Besicht Säiten",
+       "bs-pagesvisited-pref-widgetns": "Nummraim:",
+       "bs-pagesvisited-pref-widgetsortodr": "Zortéieren no:",
+       "bs-pagesvisited-pref-sort-time": "Zäit",
+       "bs-pagesvisited-pref-sort-pagename": "Titel",
+       "bs-pagesvisited-tag-pagesvisited-desc": "Weist eng Lëscht vu Säiten 
déi rezent besicht goufen. Dës Lëscht kann duerch Parametere limitéiert ginn."
+}
diff --git a/i18n/lki.json b/i18n/lki.json
new file mode 100644
index 0000000..840d6ba
--- /dev/null
+++ b/i18n/lki.json
@@ -0,0 +1,9 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Lakzon"
+               ]
+       },
+       "prefs-pagesvisited": "وةڵگةل بازدیدشده",
+       "bs-pagesvisited-widget-title": "وةڵگةل بازدیدشده"
+}
diff --git a/i18n/lt.json b/i18n/lt.json
new file mode 100644
index 0000000..e22170a
--- /dev/null
+++ b/i18n/lt.json
@@ -0,0 +1,15 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Eitvys200"
+               ]
+       },
+       "bs-pagesvisited-desc": "Pateikia persignalizuotą neseniai lankytų 
puslapių sąrašą",
+       "prefs-pagesvisited": "Lankyti puslapiai",
+       "bs-pagesvisited-widget-title": "Lankyti puslapiai",
+       "bs-pagesvisited-pref-widgetlimit": "Įrašų limitas:",
+       "bs-pagesvisited-pref-widgetsortodr": "Rūšiuoti pagal:",
+       "bs-pagesvisited-pref-sort-time": "Laiką",
+       "bs-pagesvisited-pref-sort-pagename": "Pavadinimą",
+       "bs-pagesvisited-tag-pagesvisited-desc": "Rodo neseniai lankytų 
puslapių sąrašą. Šis sąrašas gali būti apribotas parametrų."
+}
diff --git a/i18n/mai.json b/i18n/mai.json
new file mode 100644
index 0000000..de425bf
--- /dev/null
+++ b/i18n/mai.json
@@ -0,0 +1,15 @@
+{
+       "@metadata": {
+               "authors": [
+                       "बिप्लब आनन्द"
+               ]
+       },
+       "prefs-pagesvisited": "भ्रमण कएल पृष्ठसभ",
+       "bs-pagesvisited-widget-title": "भ्रमण कएल पृष्ठसभ",
+       "bs-pagesvisited-pref-widgetlimit": "प्रविष्टि सभ के सीमा:",
+       "bs-pagesvisited-pref-widgetns": "नामस्थान सभ:",
+       "bs-pagesvisited-pref-widgetsortodr": "क्रमबद्ध करू:",
+       "bs-pagesvisited-pref-sort-time": "समए",
+       "bs-pagesvisited-pref-sort-pagename": "शीर्षक",
+       "bs-pagesvisited-tag-pagesvisited-desc": "अहाँद्वारा घुमल गेल पृष्ठके 
सूची देखाऊ।"
+}
diff --git a/i18n/mk.json b/i18n/mk.json
new file mode 100644
index 0000000..5dd839e
--- /dev/null
+++ b/i18n/mk.json
@@ -0,0 +1,17 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Bjankuloski06"
+               ]
+       },
+       "bs-pagesvisited-desc": "Дава лично прилагоден список на скорешно 
посетените страници",
+       "prefs-pagesvisited": "Посетени страници",
+       "bs-pagesvisited-widget-title": "Посетени страници",
+       "bs-pagesvisited-error-nsnotvalid": "{{PLURAL:$1|Укажаниот именски 
простор|Укажаните именски простори}} <code>$2</code> не {{PLURAL:$1|е|се}} 
важечки.",
+       "bs-pagesvisited-pref-widgetlimit": "Ограничување на записи:",
+       "bs-pagesvisited-pref-widgetns": "Именски простори:",
+       "bs-pagesvisited-pref-widgetsortodr": "Подреди по:",
+       "bs-pagesvisited-pref-sort-time": "Време",
+       "bs-pagesvisited-pref-sort-pagename": "Наслов",
+       "bs-pagesvisited-tag-pagesvisited-desc": "Прикажува список на страници 
што се ти посетиле."
+}
diff --git a/i18n/nb.json b/i18n/nb.json
new file mode 100644
index 0000000..fa0f9ca
--- /dev/null
+++ b/i18n/nb.json
@@ -0,0 +1,17 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Jon Harald Søby"
+               ]
+       },
+       "bs-pagesvisited-desc": "Gir en personalisert liste over de sist 
besøkte sidene",
+       "prefs-pagesvisited": "Sider besøkt",
+       "bs-pagesvisited-widget-title": "Sider besøkt",
+       "bs-pagesvisited-error-nsnotvalid": 
"{{PLURAL:$1|Navnerommet|Navnerommene}} <code>$2</code> er ikke gyldig.",
+       "bs-pagesvisited-pref-widgetlimit": "Oppslagsgrense:",
+       "bs-pagesvisited-pref-widgetns": "Navnerom:",
+       "bs-pagesvisited-pref-widgetsortodr": "Sorter etter:",
+       "bs-pagesvisited-pref-sort-time": "Tid",
+       "bs-pagesvisited-pref-sort-pagename": "Tittel",
+       "bs-pagesvisited-tag-pagesvisited-desc": "Viser en liste over nylig 
besøkte sider. Listen kan begrenses med parametre."
+}
diff --git a/i18n/nl.json b/i18n/nl.json
new file mode 100644
index 0000000..d65713c
--- /dev/null
+++ b/i18n/nl.json
@@ -0,0 +1,21 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Arg",
+                       "SPQRobin",
+                       "Esketti",
+                       "Siebrand",
+                       "Sjoerddebruin"
+               ]
+       },
+       "bs-pagesvisited-desc": "Voegt een gepersonaliseerde lijst van de 
laatstbezochte pagina's",
+       "prefs-pagesvisited": "Bezochte pagina's",
+       "bs-pagesvisited-widget-title": "Pagina's bezocht",
+       "bs-pagesvisited-error-nsnotvalid": "Gegeven 
{{PLURAL:$1|namespace|naamruimten}} <code>$2</code> {{PLURAL:$1|is|zijn}} is 
niet geldig.",
+       "bs-pagesvisited-pref-widgetlimit": "Beperken van gegevens in:",
+       "bs-pagesvisited-pref-widgetns": "Naamruimten:",
+       "bs-pagesvisited-pref-widgetsortodr": "Sorteren op:",
+       "bs-pagesvisited-pref-sort-time": "Tijd",
+       "bs-pagesvisited-pref-sort-pagename": "Naam",
+       "bs-pagesvisited-tag-pagesvisited-desc": "Geeft een lijst van door u 
bezochte pagina's weer."
+}
diff --git a/i18n/om.json b/i18n/om.json
new file mode 100644
index 0000000..f086d5d
--- /dev/null
+++ b/i18n/om.json
@@ -0,0 +1,14 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Tumsaa"
+               ]
+       },
+       "prefs-pagesvisited": "Fuula daawwatte",
+       "bs-pagesvisited-widget-title": "Fuula daawwatte",
+       "bs-pagesvisited-pref-widgetns": "Iddoowwan maqaa:",
+       "bs-pagesvisited-pref-widgetsortodr": "Kanaan fooyi:",
+       "bs-pagesvisited-pref-sort-time": "Yeroo",
+       "bs-pagesvisited-pref-sort-pagename": "Mataduree",
+       "bs-pagesvisited-tag-pagesvisited-desc": "Tarree fuulawwan kana dura 
daawwattee."
+}
diff --git a/i18n/pl.json b/i18n/pl.json
new file mode 100644
index 0000000..d6a8761
--- /dev/null
+++ b/i18n/pl.json
@@ -0,0 +1,13 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Chrumps"
+               ]
+       },
+       "bs-pagesvisited-error-nsnotvalid": "{{PLURAL:$1|Dana przestrzeń|Dane 
przestrzenie}} nazw <code>$2</code> {{PLURAL:$1|nie jest|nie są}} prawidłowe.",
+       "bs-pagesvisited-pref-widgetns": "Przestrzenie nazw:",
+       "bs-pagesvisited-pref-widgetsortodr": "Sortuj według:",
+       "bs-pagesvisited-pref-sort-time": "Czas",
+       "bs-pagesvisited-pref-sort-pagename": "Tytuł",
+       "bs-pagesvisited-tag-pagesvisited-desc": "Pokazuje listę ostatnio 
odwiedzanych stron. Lista może zostać ograniczona przez parametry."
+}
diff --git a/i18n/pt-br.json b/i18n/pt-br.json
new file mode 100644
index 0000000..9315238
--- /dev/null
+++ b/i18n/pt-br.json
@@ -0,0 +1,18 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Felipe L. Ewald",
+                       "Eduardo Addad de Oliveira"
+               ]
+       },
+       "bs-pagesvisited-desc": "Fornece uma lista personalizada das últimas 
páginas visitadas",
+       "prefs-pagesvisited": "Páginas visitadas",
+       "bs-pagesvisited-widget-title": "Páginas visitadas",
+       "bs-pagesvisited-error-nsnotvalid": "{{PLURAL:$1|O domínio|os 
domínios}} <code>$2</code> não {{PLURAL:$1|é válido|são válidos}}.",
+       "bs-pagesvisited-pref-widgetlimit": "Limite de entradas:",
+       "bs-pagesvisited-pref-widgetns": "Espaços nominais:",
+       "bs-pagesvisited-pref-widgetsortodr": "Ordenar por:",
+       "bs-pagesvisited-pref-sort-time": "Tempo",
+       "bs-pagesvisited-pref-sort-pagename": "Título",
+       "bs-pagesvisited-tag-pagesvisited-desc": "Apresenta uma lista de 
páginas que visitou. Esta lista pode ser restringida por parâmetros."
+}
diff --git a/i18n/pt.json b/i18n/pt.json
new file mode 100644
index 0000000..5483a97
--- /dev/null
+++ b/i18n/pt.json
@@ -0,0 +1,18 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Vitorvicentevalente",
+                       "Hamilton Abreu"
+               ]
+       },
+       "bs-pagesvisited-desc": "Fornece uma lista personalizada das últimas 
páginas visitadas",
+       "prefs-pagesvisited": "Páginas visitadas",
+       "bs-pagesvisited-widget-title": "Páginas visitadas",
+       "bs-pagesvisited-error-nsnotvalid": "{{PLURAL:$1|O domínio|os 
domínios}} <code>$2</code> não {{PLURAL:$1|é válido|são válidos}}.",
+       "bs-pagesvisited-pref-widgetlimit": "Limite de entradas:",
+       "bs-pagesvisited-pref-widgetns": "Domínios:",
+       "bs-pagesvisited-pref-widgetsortodr": "Ordenar por:",
+       "bs-pagesvisited-pref-sort-time": "Hora",
+       "bs-pagesvisited-pref-sort-pagename": "Título",
+       "bs-pagesvisited-tag-pagesvisited-desc": "Apresenta uma lista de 
páginas que visitou. Esta lista pode ser restringida por parâmetros."
+}
diff --git a/i18n/qqq.json b/i18n/qqq.json
new file mode 100644
index 0000000..e4b0e28
--- /dev/null
+++ b/i18n/qqq.json
@@ -0,0 +1,20 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Stephan Muggli <mug...@hallowelt.biz>",
+                       "Robby",
+                       "Liuxinyu970226",
+                       "Shirayuki"
+               ]
+       },
+       "bs-pagesvisited-desc": "Used in 
[{{canonicalurl:Special:WikiAdmin|mode=ExtensionInfo}} 
Special:WikiAdmin?mode=ExtensionInfo], description of pages visited extension",
+       "prefs-pagesvisited": "Used in 
[{{canonicalurl:Special:WikiAdmin|mode=Preferences}} 
Special:WikiAdmin?mode=Preferences], headline for pages visited section in 
preferences.\n{{Identical|Pages visited}}",
+       "bs-pagesvisited-widget-title": "Widget headline for pages visited\n 
{{Identical|Pages visited}}",
+       "bs-pagesvisited-error-nsnotvalid": "Text for given namespaces 
<code>$2</code> are not valid.\n\nParameters:\n* $1 - the number of namespaces 
for PLURAL distinction\n* $2 - the namespace or comma separated list of 
namespaces",
+       "bs-pagesvisited-pref-widgetlimit": "Option in 
[{{canonicalurl:Special:WikiAdmin|mode=Preferences}} 
Special:WikiAdmin?mode=Preferences], label for limit of entries:",
+       "bs-pagesvisited-pref-widgetns": "Option in 
[{{canonicalurl:Special:WikiAdmin|mode=Preferences}} 
Special:WikiAdmin?mode=Preferences], label for 
namespaces:\n{{Identical|Namespace}}",
+       "bs-pagesvisited-pref-widgetsortodr": "Option in 
[{{canonicalurl:Special:WikiAdmin|mode=Preferences}} 
Special:WikiAdmin?mode=Preferences], label for sort by:\n{{Identical|Sort by}}",
+       "bs-pagesvisited-pref-sort-time": "Option in 
[{{canonicalurl:Special:WikiAdmin|mode=Preferences}} 
Special:WikiAdmin?mode=Preferences], option label for time\n{{Identical|Time}}",
+       "bs-pagesvisited-pref-sort-pagename": "Option in 
[{{canonicalurl:Special:WikiAdmin|mode=Preferences}} 
Special:WikiAdmin?mode=Preferences], option label for 
title\n{{Identical|Title}}",
+       "bs-pagesvisited-tag-pagesvisited-desc": "Used in InsertMagic 
extension, tag description for show a list of pages you have 
visited.\n{{Related|Bs-tag-desc}}"
+}
diff --git a/i18n/ru.json b/i18n/ru.json
new file mode 100644
index 0000000..4de39d0
--- /dev/null
+++ b/i18n/ru.json
@@ -0,0 +1,20 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Shuba",
+                       "HarpyWar",
+                       "Meshkov.a",
+                       "Okras"
+               ]
+       },
+       "bs-pagesvisited-desc": "Предоставляет собственный список последних 
посещенных страниц.",
+       "prefs-pagesvisited": "Посещенные страницы",
+       "bs-pagesvisited-widget-title": "Посещенные страницы",
+       "bs-pagesvisited-error-nsnotvalid": "Неверное пространство 
имен{{PLURAL:$1||s}} <code>$2</code> {{PLURAL:$1|is|are}}.",
+       "bs-pagesvisited-pref-widgetlimit": "Ограничение записей:",
+       "bs-pagesvisited-pref-widgetns": "Пространство имён:",
+       "bs-pagesvisited-pref-widgetsortodr": "Сортировать по:",
+       "bs-pagesvisited-pref-sort-time": "Время",
+       "bs-pagesvisited-pref-sort-pagename": "Заголовок",
+       "bs-pagesvisited-tag-pagesvisited-desc": "Показывает список недавно 
посещённых страниц. Этот список может быть ограничен параметрами."
+}
diff --git a/i18n/sl.json b/i18n/sl.json
new file mode 100644
index 0000000..8a0beeb
--- /dev/null
+++ b/i18n/sl.json
@@ -0,0 +1,19 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Alojz.tic",
+                       "Skalcaa",
+                       "Dbc334"
+               ]
+       },
+       "bs-pagesvisited-desc": "Zagotavlja osebni seznam nazadnje obiskanih 
strani",
+       "prefs-pagesvisited": "Obiskane strani",
+       "bs-pagesvisited-widget-title": "Obiskane strani",
+       "bs-pagesvisited-error-nsnotvalid": "Dan{{PLURAL:$1| imenski prostor|a 
imenska prostora|i imenski prostori}} {{PLURAL:$1|ni veljaven|nista 
veljavna|niso veljavni}}: <code>$2</code>",
+       "bs-pagesvisited-pref-widgetlimit": "Omejitev vnosov:",
+       "bs-pagesvisited-pref-widgetns": "Imenski prostor:",
+       "bs-pagesvisited-pref-widgetsortodr": "Razvrsti po:",
+       "bs-pagesvisited-pref-sort-time": "Čas",
+       "bs-pagesvisited-pref-sort-pagename": "Naslov",
+       "bs-pagesvisited-tag-pagesvisited-desc": "Prikaže seznam nedavno 
obiskanih strani. Seznam lahko omejite s parametri."
+}
diff --git a/i18n/sq.json b/i18n/sq.json
new file mode 100644
index 0000000..5e39dcf
--- /dev/null
+++ b/i18n/sq.json
@@ -0,0 +1,16 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Gertakapllani"
+               ]
+       },
+       "bs-pagesvisited-desc": "Ofron një listë të personalizuar të faqeve 
fundit qëkeni vizituar",
+       "prefs-pagesvisited": "Faqet e vizituara",
+       "bs-pagesvisited-widget-title": "Faqet e vizituara",
+       "bs-pagesvisited-pref-widgetlimit": "Kufiri i hyrjeve:",
+       "bs-pagesvisited-pref-widgetns": "Hapësira:",
+       "bs-pagesvisited-pref-widgetsortodr": "Rendit nga",
+       "bs-pagesvisited-pref-sort-time": "Koha",
+       "bs-pagesvisited-pref-sort-pagename": "titull",
+       "bs-pagesvisited-tag-pagesvisited-desc": "Afishon një listë të faqeve 
që keni vizituar."
+}
diff --git a/i18n/sv.json b/i18n/sv.json
new file mode 100644
index 0000000..795215c
--- /dev/null
+++ b/i18n/sv.json
@@ -0,0 +1,19 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Jopparn",
+                       "Lokal Profil",
+                       "WikiPhoenix"
+               ]
+       },
+       "bs-pagesvisited-desc": "Ger en personlig lista över de senast besökta 
sidorna",
+       "prefs-pagesvisited": "Besökta sidor",
+       "bs-pagesvisited-widget-title": "Besökta sidor",
+       "bs-pagesvisited-error-nsnotvalid": "{{PLURAL:$1|Den angivna 
namnrymden|De angivna namnrymderna}} <code>$2</code> är inte 
{{PLURAL:$1|giltig|giltiga}}.",
+       "bs-pagesvisited-pref-widgetlimit": "Begränsning av inlägg:",
+       "bs-pagesvisited-pref-widgetns": "Namnrymder:",
+       "bs-pagesvisited-pref-widgetsortodr": "Sortera efter:",
+       "bs-pagesvisited-pref-sort-time": "Tid",
+       "bs-pagesvisited-pref-sort-pagename": "Titel",
+       "bs-pagesvisited-tag-pagesvisited-desc": "Visar en lista över nyliga 
besökta sidor. Denna lista kan begränsas med parametrar."
+}
diff --git a/i18n/tcy.json b/i18n/tcy.json
new file mode 100644
index 0000000..cbbc855
--- /dev/null
+++ b/i18n/tcy.json
@@ -0,0 +1,10 @@
+{
+       "@metadata": {
+               "authors": [
+                       "VASANTH S.N."
+               ]
+       },
+       "bs-pagesvisited-pref-widgetns": "ಪುದರ್‍ದ ವರ್ಗೊಲು:",
+       "bs-pagesvisited-pref-sort-time": "ಸಮಯೊ",
+       "bs-pagesvisited-pref-sort-pagename": "ತರೆಬರವು"
+}
diff --git a/i18n/tr.json b/i18n/tr.json
new file mode 100644
index 0000000..47af44c
--- /dev/null
+++ b/i18n/tr.json
@@ -0,0 +1,18 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Sayginer",
+                       "Sadrettin"
+               ]
+       },
+       "bs-pagesvisited-desc": "Ziyaret edilen son sayfaların, 
kişiselleştirilmiş bir listesini oluşturur",
+       "prefs-pagesvisited": "Ziyaret edilen sayfalar",
+       "bs-pagesvisited-widget-title": "Ziyaret edilen sayfalar",
+       "bs-pagesvisited-error-nsnotvalid": "Verilen <code>$2</code> 
{{PLURAL:$1|isimalanı|isimalanı}} geçerli değil.",
+       "bs-pagesvisited-pref-widgetlimit": "Girdi sınırı:",
+       "bs-pagesvisited-pref-widgetns": "İsim alanları:",
+       "bs-pagesvisited-pref-widgetsortodr": "Sıralama ölçütü:",
+       "bs-pagesvisited-pref-sort-time": "Zaman",
+       "bs-pagesvisited-pref-sort-pagename": "Başlık",
+       "bs-pagesvisited-tag-pagesvisited-desc": "Ziyaret ettiğiniz sayfaların 
listesini görüntüler."
+}
diff --git a/i18n/uk.json b/i18n/uk.json
new file mode 100644
index 0000000..0699e6e
--- /dev/null
+++ b/i18n/uk.json
@@ -0,0 +1,18 @@
+{
+       "@metadata": {
+               "authors": [
+                       "NataChe",
+                       "Ата"
+               ]
+       },
+       "bs-pagesvisited-desc": "Відображає персоналізований список останніх 
відвіданих сторінок",
+       "prefs-pagesvisited": "Відвідані сторінки",
+       "bs-pagesvisited-widget-title": "Відвідані сторінки",
+       "bs-pagesvisited-error-nsnotvalid": "{{PLURAL:$1|Заданий простір 
назв|Задані простори назв}} <code>$2</code> {{PLURAL:$1|не дійсний|не 
дійсні}}.",
+       "bs-pagesvisited-pref-widgetlimit": "Ліміт записів:",
+       "bs-pagesvisited-pref-widgetns": "Простір назв:",
+       "bs-pagesvisited-pref-widgetsortodr": "Впорядкувати за:",
+       "bs-pagesvisited-pref-sort-time": "Час",
+       "bs-pagesvisited-pref-sort-pagename": "Заголовок",
+       "bs-pagesvisited-tag-pagesvisited-desc": "Показує список нещодавно 
відвіданих сторінок. Цей список може бути обмежений параметрами."
+}
diff --git a/i18n/zh-hans.json b/i18n/zh-hans.json
new file mode 100644
index 0000000..914bdd3
--- /dev/null
+++ b/i18n/zh-hans.json
@@ -0,0 +1,18 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Liuxinyu970226",
+                       "NigelSoft"
+               ]
+       },
+       "bs-pagesvisited-desc": "提供个性化的最近访问页面列表",
+       "prefs-pagesvisited": "访问过的页面",
+       "bs-pagesvisited-widget-title": "访问过的页面",
+       "bs-pagesvisited-error-nsnotvalid": 
"提供的名字空间<code>$2</code>{{PLURAL:$1|无效}}。",
+       "bs-pagesvisited-pref-widgetlimit": "记录限制:",
+       "bs-pagesvisited-pref-widgetns": "名字空间:",
+       "bs-pagesvisited-pref-widgetsortodr": "排序方式:",
+       "bs-pagesvisited-pref-sort-time": "时间",
+       "bs-pagesvisited-pref-sort-pagename": "标题",
+       "bs-pagesvisited-tag-pagesvisited-desc": "显示最近访问页面的列表。列表可通过参数限制。"
+}
diff --git a/i18n/zh-hant.json b/i18n/zh-hant.json
new file mode 100644
index 0000000..5ee2edb
--- /dev/null
+++ b/i18n/zh-hant.json
@@ -0,0 +1,16 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Liuxinyu970226",
+                       "Cwlin0416"
+               ]
+       },
+       "prefs-pagesvisited": "已參觀頁面",
+       "bs-pagesvisited-widget-title": "參觀的頁面",
+       "bs-pagesvisited-error-nsnotvalid": 
"提供之命名空間<code>$2</code>{{PLURAL:$1|無效}}。",
+       "bs-pagesvisited-pref-widgetlimit": "項目上限:",
+       "bs-pagesvisited-pref-widgetns": "命名空間:",
+       "bs-pagesvisited-pref-widgetsortodr": "排序方式:",
+       "bs-pagesvisited-pref-sort-time": "時間",
+       "bs-pagesvisited-pref-sort-pagename": "標題"
+}

-- 
To view, visit https://gerrit.wikimedia.org/r/388008
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: Ic3c0ca0875a801795e898c4adc2d35187057789f
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/BlueSpicePagesVisited
Gerrit-Branch: master
Gerrit-Owner: ItSpiderman <d.savulje...@gmail.com>
Gerrit-Reviewer: Ljonka <l.verhovs...@gmail.com>
Gerrit-Reviewer: Mglaser <gla...@hallowelt.biz>
Gerrit-Reviewer: Pwirth <wi...@hallowelt.biz>
Gerrit-Reviewer: Raimond Spekking <raimond.spekk...@gmail.com>
Gerrit-Reviewer: Robert Vogel <vo...@hallowelt.biz>
Gerrit-Reviewer: Siebrand <siebr...@kitano.nl>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to