PDF rausgenommen

This commit is contained in:
aschwarz
2023-01-23 11:03:31 +01:00
parent 82d562a322
commit a6523903eb
28078 changed files with 4247552 additions and 2 deletions

View File

@ -0,0 +1,61 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\UserLanguage;
use Piwik\Archive;
use Piwik\DataTable;
use Piwik\Metrics;
use Piwik\Piwik;
/**
* @see plugins/UserLanguage/functions.php
*/
require_once PIWIK_INCLUDE_PATH . '/plugins/UserLanguage/functions.php';
/**
* The UserLanguage API lets you access reports about your Visitors language setting
*
* @method static \Piwik\Plugins\UserLanguage\API getInstance()
*/
class API extends \Piwik\Plugin\API
{
protected function getDataTable($name, $idSite, $period, $date, $segment)
{
Piwik::checkUserHasViewAccess($idSite);
$archive = Archive::build($idSite, $period, $date, $segment);
$dataTable = $archive->getDataTable($name);
$dataTable->queueFilter('ReplaceColumnNames');
$dataTable->queueFilter('ReplaceSummaryRowLabel');
return $dataTable;
}
public function getLanguage($idSite, $period, $date, $segment = false)
{
$dataTable = $this->getDataTable(Archiver::LANGUAGE_RECORD_NAME, $idSite, $period, $date, $segment);
$dataTable->filter('GroupBy', array('label', __NAMESPACE__ . '\groupByLangCallback'));
$dataTable->filter('ColumnCallbackAddMetadata', array('label', 'segment', function($label) {
if (empty($label) || $label == 'xx') {
return 'languageCode==xx';
}
return sprintf('languageCode==%1$s,languageCode=@%1$s-', $label);
}));
$dataTable->filter('ColumnCallbackReplace', array('label', __NAMESPACE__ . '\languageTranslate'));
return $dataTable;
}
public function getLanguageCode($idSite, $period, $date, $segment = false)
{
$dataTable = $this->getDataTable(Archiver::LANGUAGE_RECORD_NAME, $idSite, $period, $date, $segment);
$dataTable->filter('AddSegmentValue');
$dataTable->filter('ColumnCallbackReplace', array('label', __NAMESPACE__ . '\languageTranslateWithCode'));
return $dataTable;
}
}

View File

@ -0,0 +1,92 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\UserLanguage;
use Piwik\Common;
use Piwik\Container\StaticContainer;
use Piwik\DataArray;
use Piwik\DataTable;
use Piwik\Intl\Data\Provider\RegionDataProvider;
use Piwik\Metrics;
require_once PIWIK_INCLUDE_PATH . '/plugins/UserLanguage/functions.php';
/**
* Archiver for UserLanguage Plugin
*
* @see PluginsArchiver
*/
class Archiver extends \Piwik\Plugin\Archiver
{
const LANGUAGE_RECORD_NAME = 'UserLanguage_language';
const LANGUAGE_DIMENSION = "log_visit.location_browser_lang";
/**
* Daily archive of User Settings report. Processes reports for Visits by Resolution,
* browser plugins, etc. Some reports are built from the logs, some reports are superset of an existing report
*/
public function aggregateDayReport()
{
$this->aggregateByLanguage();
}
/**
* Period archiving: simply sums up daily archives
*/
public function aggregateMultipleReports()
{
$dataTableRecords = array(
self::LANGUAGE_RECORD_NAME,
);
$columnsAggregationOperation = null;
$this->getProcessor()->aggregateDataTableRecords(
$dataTableRecords,
$this->maximumRows,
$maximumRowsInSubDataTable = null,
$columnToSortByBeforeTruncation = null,
$columnsAggregationOperation,
$columnsToRenameAfterAggregation = null,
$countRowsRecursive = array());
}
protected function aggregateByLanguage()
{
/** @var RegionDataProvider $regionDataProvider */
$regionDataProvider = StaticContainer::get('Piwik\Intl\Data\Provider\RegionDataProvider');
$query = $this->getLogAggregator()->queryVisitsByDimension(array("label" => self::LANGUAGE_DIMENSION));
$countryCodes = $regionDataProvider->getCountryList($includeInternalCodes = true);
$metricsByLanguage = new DataArray();
while ($row = $query->fetch()) {
$langCode = Common::extractLanguageCodeFromBrowserLanguage($row['label']);
$countryCode = Common::extractCountryCodeFromBrowserLanguage($row['label'], $countryCodes, $enableLanguageToCountryGuess = true);
if ($countryCode == 'xx' || $countryCode == $langCode) {
$metricsByLanguage->sumMetricsVisits($langCode, $row);
} else {
$metricsByLanguage->sumMetricsVisits($langCode . '-' . $countryCode, $row);
}
}
$report = $metricsByLanguage->asDataTable();
$this->insertTable(self::LANGUAGE_RECORD_NAME, $report);
}
protected function insertTable($recordName, DataTable $table)
{
$report = $table->getSerialized($this->maximumRows, null, Metrics::INDEX_NB_VISITS);
return $this->getProcessor()->insertBlobRecord($recordName, $report);
}
}

View File

@ -0,0 +1,63 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\UserLanguage\Columns;
use Piwik\Common;
use Piwik\Metrics\Formatter;
use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Tracker\Action;
use Piwik\Tracker\Request;
use Piwik\Tracker\Visitor;
require_once PIWIK_INCLUDE_PATH . '/plugins/UserLanguage/functions.php';
class Language extends VisitDimension
{
protected $columnName = 'location_browser_lang';
protected $columnType = 'VARCHAR(20) NULL';
protected $category = 'UserCountry_VisitLocation';
protected $nameSingular = 'General_Language';
protected $namePlural = 'General_Languages';
protected $segmentName = 'languageCode';
protected $acceptValues = 'de, fr, en-gb, zh-cn, etc.';
protected $type = self::TYPE_TEXT;
public function formatValue($value, $idSite, Formatter $formatter)
{
return \Piwik\Plugins\UserLanguage\languageTranslateWithCode($value);
}
/**
* @param Request $request
* @param Visitor $visitor
* @param Action|null $action
* @return mixed
*/
public function onNewVisit(Request $request, Visitor $visitor, $action)
{
return $this->getSingleLanguageFromAcceptedLanguages($request->getBrowserLanguage());
}
/**
* For better privacy we store only the main language code, instead of the whole browser language string.
*
* @param $acceptLanguagesString
* @return string
*/
protected function getSingleLanguageFromAcceptedLanguages($acceptLanguagesString)
{
if (empty($acceptLanguagesString)) {
return '';
}
$languageCode = Common::extractLanguageAndRegionCodeFromBrowserLanguage($acceptLanguagesString);
return $languageCode;
}
}

View File

@ -0,0 +1,20 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\UserLanguage\Reports;
use Piwik\Plugins\CoreVisualizations\Visualizations\Graph;
abstract class Base extends \Piwik\Plugin\Report
{
protected function init()
{
$this->categoryId = 'General_Visitors';
$this->subcategoryId = 'UserCountry_SubmenuLocations';
}
}

View File

@ -0,0 +1,44 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\UserLanguage\Reports;
use Piwik\Piwik;
use Piwik\Plugin\ViewDataTable;
use Piwik\Plugins\UserLanguage\Columns\Language;
use Piwik\Plugin\ReportsProvider;
class GetLanguage extends Base
{
protected function init()
{
parent::init();
$this->dimension = new Language();
$this->name = Piwik::translate('UserLanguage_BrowserLanguage');
$this->documentation = ''; // TODO
$this->order = 8;
}
public function configureView(ViewDataTable $view)
{
$view->config->show_search = false;
$view->config->columns_to_display = array('label', 'nb_visits');
$view->config->show_exclude_low_population = false;
$view->config->addTranslation('label', $this->dimension->getName());
$view->requestConfig->filter_sort_column = 'nb_visits';
$view->requestConfig->filter_sort_order = 'desc';
}
public function getRelatedReports() {
return array(
ReportsProvider::factory('UserLanguage', 'getLanguageCode'),
);
}
}

View File

@ -0,0 +1,33 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\UserLanguage\Reports;
use Piwik\Piwik;
use Piwik\Plugins\UserLanguage\Columns\Language;
use Piwik\Plugin\ReportsProvider;
class GetLanguageCode extends GetLanguage
{
protected function init()
{
parent::init();
$this->dimension = new Language();
$this->name = Piwik::translate('UserLanguage_LanguageCode');
$this->documentation = '';
$this->order = 11;
}
public function getRelatedReports()
{
return array(
ReportsProvider::factory('UserLanguage', 'getLanguage'),
);
}
}

View File

@ -0,0 +1,29 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\UserLanguage;
use Piwik\Piwik;
use Piwik\FrontController;
/**
*
*/
class UserLanguage extends \Piwik\Plugin
{
public function postLoad()
{
Piwik::addAction('Template.footerUserCountry', array('Piwik\Plugins\UserLanguage\UserLanguage', 'footerUserCountry'));
}
public static function footerUserCountry(&$out)
{
$out .= '<h2 piwik-enriched-headline>' . Piwik::translate('UserLanguage_BrowserLanguage') . '</h2>';
$out .= FrontController::getInstance()->fetchDispatch('UserLanguage', 'getLanguage');
}
}

View File

@ -0,0 +1,32 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\UserLanguage;
use Piwik\Plugins\Live\VisitorDetailsAbstract;
require_once PIWIK_INCLUDE_PATH . '/plugins/UserLanguage/functions.php';
class VisitorDetails extends VisitorDetailsAbstract
{
public function extendVisitorDetails(&$visitor)
{
$visitor['languageCode'] = $this->getLanguageCode();
$visitor['language'] = $this->getLanguage();
}
protected function getLanguageCode()
{
return $this->details['location_browser_lang'];
}
protected function getLanguage()
{
return languageTranslate($this->details['location_browser_lang']);
}
}

View File

@ -0,0 +1,82 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\UserLanguage;
use Piwik\Piwik;
/**
* Returns the given language code to translated language name
*
* @param $label
*
* @return string
*/
function languageTranslate($label)
{
if ($label == '' || $label == 'xx') {
return Piwik::translate('General_Unknown');
}
$language = Piwik::translate('Intl_Language_'.$label);
if ($language != 'Intl_Language_'.$label) {
return $language;
}
$key = 'UserLanguage_Language_' . $label;
$translation = Piwik::translate($key);
// Show language code if unknown code
if ($translation == $key) {
$translation = Piwik::translate('UserLanguage_LanguageCode') . ' ' . $label;
}
return $translation;
}
/**
* @param $label
* @return string
*/
function languageTranslateWithCode($label)
{
$ex = explode('-', $label);
$lang = languageTranslate($ex[0]);
if (count($ex) == 2 && $ex[0] != $ex[1]) {
$countryKey = 'UserCountry_country_' . $ex[1];
$country = Piwik::translate('Intl_Country_'.strtoupper($ex[1]));
if ($country == 'Intl_Country_'.strtoupper($ex[1])) {
$country = Piwik::translate($countryKey);
}
if ($country == $countryKey) {
return sprintf("%s (%s)", $lang, $ex[0]);
}
return sprintf("%s - %s (%s)", $lang, $country, $label);
} else {
return sprintf("%s (%s)", $lang, $ex[0]);
}
}
/**
* @param $lang
* @return mixed
*/
function groupByLangCallback($lang)
{
$ex = explode('-', $lang);
return $ex[0];
}

View File

@ -0,0 +1,5 @@
{
"UserLanguage": {
"LanguageCode": "የቋንቋ ኮድ"
}
}

View File

@ -0,0 +1,7 @@
{
"UserLanguage": {
"BrowserLanguage": "لغة المستعرض",
"LanguageCode": "كود اللغة",
"PluginDescription": "يعرض اللغة التي تستخدمها مستعرضات زوَّارك."
}
}

View File

@ -0,0 +1,5 @@
{
"UserLanguage": {
"LanguageCode": "Код мовы"
}
}

View File

@ -0,0 +1,6 @@
{
"UserLanguage": {
"BrowserLanguage": "Език на браузъра",
"LanguageCode": "Код на езика"
}
}

View File

@ -0,0 +1,5 @@
{
"UserLanguage": {
"LanguageCode": "Codi de l'idioma"
}
}

View File

@ -0,0 +1,7 @@
{
"UserLanguage": {
"BrowserLanguage": "Jazyk prohlížeče",
"LanguageCode": "Jazykový kód",
"PluginDescription": "Hlásí jazyk prohlížeče vašich návštěvníků."
}
}

View File

@ -0,0 +1,7 @@
{
"UserLanguage": {
"BrowserLanguage": "Browsersprog",
"LanguageCode": "Sprogkode",
"PluginDescription": "Rapporterer sproget, som anvendes af de besøgendes browsere."
}
}

View File

@ -0,0 +1,7 @@
{
"UserLanguage": {
"BrowserLanguage": "Browsersprache",
"LanguageCode": "Sprach-Code",
"PluginDescription": "Bericht darüber, welche Sprache die Besucher im Browser eingestellt haben."
}
}

View File

@ -0,0 +1,7 @@
{
"UserLanguage": {
"BrowserLanguage": "Γλώσσα φυλλομετρητή",
"LanguageCode": "Κωδικός γλώσσας",
"PluginDescription": "Αναφέρει τη γλώσσα που χρησιμοποιούν τα προγράμματα πλοήγησης των επισκεπτών σας."
}
}

View File

@ -0,0 +1,7 @@
{
"UserLanguage": {
"BrowserLanguage": "Browser language",
"LanguageCode": "Language code",
"PluginDescription": "Reports the language used by your visitors' browsers."
}
}

View File

@ -0,0 +1,7 @@
{
"UserLanguage": {
"BrowserLanguage": "Idioma del navegador",
"LanguageCode": "Código de idioma",
"PluginDescription": "Informa el idioma usado por los navegadores de tus visitantes."
}
}

View File

@ -0,0 +1,7 @@
{
"UserLanguage": {
"BrowserLanguage": "Idioma de navegador",
"LanguageCode": "Código de idioma",
"PluginDescription": "Informa del idioma utilizado en los navegadores de sus visitantes."
}
}

View File

@ -0,0 +1,6 @@
{
"UserLanguage": {
"BrowserLanguage": "Veebisirvija keel",
"LanguageCode": "Keele kood"
}
}

View File

@ -0,0 +1,5 @@
{
"UserLanguage": {
"LanguageCode": "Hizkuntza-kodea"
}
}

View File

@ -0,0 +1,6 @@
{
"UserLanguage": {
"BrowserLanguage": "زبان مرورگر",
"LanguageCode": "کد زبان"
}
}

View File

@ -0,0 +1,7 @@
{
"UserLanguage": {
"BrowserLanguage": "Selaimen kieli",
"LanguageCode": "Kielikoodi",
"PluginDescription": "Raportoi kävijöiden selainten kieliasetukset."
}
}

View File

@ -0,0 +1,7 @@
{
"UserLanguage": {
"BrowserLanguage": "Langage du navigateur",
"LanguageCode": "Code langue",
"PluginDescription": "Affiche la langue configurée au sein du navigateur de vos visiteurs."
}
}

View File

@ -0,0 +1,7 @@
{
"UserLanguage": {
"BrowserLanguage": "Idioma do navegador",
"LanguageCode": "Código de idioma",
"PluginDescription": "Informa sobre o idioma empregado polos navegadores das visitas."
}
}

View File

@ -0,0 +1,5 @@
{
"UserLanguage": {
"LanguageCode": "קוד שפה"
}
}

View File

@ -0,0 +1,7 @@
{
"UserLanguage": {
"BrowserLanguage": "ब्राउज़र की भाषा",
"LanguageCode": "भाषा कोड",
"PluginDescription": "अपने दर्शकों के ब्राउज़रों द्वारा प्रयुक्त भाषा रिपोर्ट।"
}
}

View File

@ -0,0 +1,7 @@
{
"UserLanguage": {
"BrowserLanguage": "Jezik preglednika",
"LanguageCode": "Oznaka jezika",
"PluginDescription": "Bilježi jezik na koji je podešen preglednik posjetitelja."
}
}

View File

@ -0,0 +1,5 @@
{
"UserLanguage": {
"LanguageCode": "Nyelvi kód"
}
}

View File

@ -0,0 +1,7 @@
{
"UserLanguage": {
"BrowserLanguage": "Bahasa Peramban",
"LanguageCode": "Kode Bahasa",
"PluginDescription": "Laporan bahasa yang digunakan oleh peramban pengguna"
}
}

View File

@ -0,0 +1,5 @@
{
"UserLanguage": {
"LanguageCode": "Kóði tungumáls"
}
}

View File

@ -0,0 +1,7 @@
{
"UserLanguage": {
"BrowserLanguage": "Lingua Browser",
"LanguageCode": "Codice della lingua",
"PluginDescription": "Restituisce la lingua utilizzata dai browser dei tuoi visitatori."
}
}

View File

@ -0,0 +1,7 @@
{
"UserLanguage": {
"BrowserLanguage": "ブラウザの言語",
"LanguageCode": "言語コード",
"PluginDescription": "ビジターのブラウザーで使用されている言語をレポートします。"
}
}

View File

@ -0,0 +1,5 @@
{
"UserLanguage": {
"LanguageCode": "ენის კოდი"
}
}

View File

@ -0,0 +1,7 @@
{
"UserLanguage": {
"BrowserLanguage": "브라우저 언어",
"LanguageCode": "언어 코드",
"PluginDescription": "방문자의 브라우저를 통해 언어 기록"
}
}

View File

@ -0,0 +1,7 @@
{
"UserLanguage": {
"BrowserLanguage": "Naršyklės kalba",
"LanguageCode": "Kalbos kodas",
"PluginDescription": "Praneša apie jūsų lankytojų naršyklių naudojamą kalbą."
}
}

View File

@ -0,0 +1,5 @@
{
"UserLanguage": {
"LanguageCode": "Valodas kods"
}
}

View File

@ -0,0 +1,7 @@
{
"UserLanguage": {
"BrowserLanguage": "Nettleserspråk",
"LanguageCode": "Språkkode",
"PluginDescription": "Rapporterer språket som er brukt av dine besøkeres nettlesere."
}
}

View File

@ -0,0 +1,7 @@
{
"UserLanguage": {
"BrowserLanguage": "Browsertaal",
"LanguageCode": "Taalcode",
"PluginDescription": "Rapporteert de taal die door browsers van uw bezoekers werd gebruikt."
}
}

View File

@ -0,0 +1,5 @@
{
"UserLanguage": {
"LanguageCode": "Språkkode"
}
}

View File

@ -0,0 +1,7 @@
{
"UserLanguage": {
"BrowserLanguage": "Język przeglądarki",
"LanguageCode": "Kod języka",
"PluginDescription": "Raportuj języki używane przez przeglądarki odwiedzających."
}
}

View File

@ -0,0 +1,7 @@
{
"UserLanguage": {
"BrowserLanguage": "Idioma do navegador",
"LanguageCode": "Código do Idioma",
"PluginDescription": "Informa o idioma usado pelos navegadores dos visitantes."
}
}

View File

@ -0,0 +1,7 @@
{
"UserLanguage": {
"BrowserLanguage": "Idioma do navegador",
"LanguageCode": "Código do idioma",
"PluginDescription": "Apresenta o idioma utilizado pelos navegadores dos seus visitantes."
}
}

View File

@ -0,0 +1,6 @@
{
"UserLanguage": {
"BrowserLanguage": "Limba browser-ului",
"LanguageCode": "Cod limbă"
}
}

View File

@ -0,0 +1,7 @@
{
"UserLanguage": {
"BrowserLanguage": "Язык браузера",
"LanguageCode": "Код языка",
"PluginDescription": "Сообщает о языках, используемых у посетителей в браузере"
}
}

View File

@ -0,0 +1,7 @@
{
"UserLanguage": {
"BrowserLanguage": "Jazyk prehliadača",
"LanguageCode": "Kód jazyka",
"PluginDescription": "Informuje o jazyku použitom v prehliadači návštevníka."
}
}

View File

@ -0,0 +1,6 @@
{
"UserLanguage": {
"BrowserLanguage": "Jezik brskalnika",
"LanguageCode": "Šifra jezika"
}
}

View File

@ -0,0 +1,7 @@
{
"UserLanguage": {
"BrowserLanguage": "Gjuhë shfletuesi",
"LanguageCode": "Kod gjuhe",
"PluginDescription": "Raporton gjuhën e përdorur nga shfletuesit e vizitorëve tuaj."
}
}

View File

@ -0,0 +1,7 @@
{
"UserLanguage": {
"BrowserLanguage": "Jezik brauzera",
"LanguageCode": "Kod jezika",
"PluginDescription": "Prikazuje jezik koji je podešen u brauzerima vaših posetilaca."
}
}

View File

@ -0,0 +1,7 @@
{
"UserLanguage": {
"BrowserLanguage": "Webbläsarspråk",
"LanguageCode": "Språkkod",
"PluginDescription": "Språk som används i besökarens webbläsare."
}
}

View File

@ -0,0 +1,7 @@
{
"UserLanguage": {
"BrowserLanguage": "உலாவி மொழி",
"LanguageCode": "மொழி குறியீடு",
"PluginDescription": "வருகையாளர் உலாவியின் மொழிகளை பற்றிய அறிக்கை"
}
}

View File

@ -0,0 +1,5 @@
{
"UserLanguage": {
"LanguageCode": "భాషా సంకేతం"
}
}

View File

@ -0,0 +1,5 @@
{
"UserLanguage": {
"LanguageCode": "รหัสภาษา"
}
}

View File

@ -0,0 +1,6 @@
{
"UserLanguage": {
"BrowserLanguage": "wika ng browser",
"LanguageCode": "wika ng code"
}
}

View File

@ -0,0 +1,7 @@
{
"UserLanguage": {
"BrowserLanguage": "Tarayıcı dili",
"LanguageCode": "Dil kodu",
"PluginDescription": "Ziyaretçilerin web tarayıcılarında kullandıkları dilleri görüntüler."
}
}

View File

@ -0,0 +1,7 @@
{
"UserLanguage": {
"BrowserLanguage": "Мова браузеру",
"LanguageCode": "Код мови",
"PluginDescription": "Повідомляє про мови, які використовуються у відвідувачів в браузері"
}
}

View File

@ -0,0 +1,7 @@
{
"UserLanguage": {
"BrowserLanguage": "Ngôn ngữ trình duyệt",
"LanguageCode": "Mã ngôn ngữ",
"PluginDescription": "Các báo cáo ngôn ngữ được sử dụng bởi trình duyệt người dùng của bạn."
}
}

View File

@ -0,0 +1,7 @@
{
"UserLanguage": {
"BrowserLanguage": "浏览器语言",
"LanguageCode": "语言代码",
"PluginDescription": "报告访问者浏览器用的语言"
}
}

View File

@ -0,0 +1,7 @@
{
"UserLanguage": {
"BrowserLanguage": "瀏覽器語言",
"LanguageCode": "語言代碼",
"PluginDescription": "報告訪客所使用的瀏覽器語言"
}
}