mediawiki/extensions/Translate (master)

sourcepatches
$ date
Thu Mar  4 07:26:02 UTC 2021

$ git clone file:///srv/git/mediawiki-extensions-Translate.git repo --depth=1 -b master
Cloning into 'repo'...

$ git config user.name libraryupgrader

$ git config user.email tools.libraryupgrader@tools.wmflabs.org

$ git submodule update --init

$ grr init
Installed commit-msg hook.

$ git show-ref refs/heads/master
9ca867b43f6dfa6e57198c41cd44e61e0538d7a7 refs/heads/master

$ composer install
Loading composer repositories with package information
Warning from https://repo.packagist.org: You are using an outdated version of Composer. Composer 2 is now available and you should upgrade. See https://getcomposer.org/2
Updating dependencies (including require-dev)
Package operations: 36 installs, 0 updates, 0 removals
  - Installing composer/installers (v1.10.0): Loading from cache
  - Installing squizlabs/php_codesniffer (3.5.8): Loading from cache
  - Installing dealerdirect/phpcodesniffer-composer-installer (v0.7.1): Downloading (connecting...)Downloading (0%)           Downloading (10%)Downloading (20%)Downloading (95%)Downloading (100%)
  - Installing mustangostang/spyc (0.6.3): Downloading (connecting...)Downloading (0%)           Downloading (20%)Downloading (45%)Downloading (65%)Downloading (85%)Downloading (100%)
  - Installing composer/spdx-licenses (1.5.5): Loading from cache
  - Installing composer/semver (3.2.4): Loading from cache
  - Installing mediawiki/mediawiki-codesniffer (v35.0.0): Loading from cache
  - Installing symfony/polyfill-php80 (v1.22.1): Loading from cache
  - Installing symfony/polyfill-mbstring (v1.22.1): Loading from cache
  - Installing symfony/polyfill-intl-normalizer (v1.22.1): Loading from cache
  - Installing symfony/polyfill-intl-grapheme (v1.22.1): Loading from cache
  - Installing symfony/polyfill-ctype (v1.22.1): Loading from cache
  - Installing symfony/string (v5.2.3): Loading from cache
  - Installing psr/container (1.0.0): Loading from cache
  - Installing symfony/service-contracts (v2.2.0): Loading from cache
  - Installing symfony/polyfill-php73 (v1.22.1): Loading from cache
  - Installing symfony/console (v5.2.3): Loading from cache
  - Installing psr/log (1.1.3): Loading from cache
  - Installing sabre/event (5.1.2): Loading from cache
  - Installing netresearch/jsonmapper (v2.1.0): Loading from cache
  - Installing microsoft/tolerant-php-parser (v0.0.23): Loading from cache
  - Installing phpdocumentor/reflection-common (2.2.0): Loading from cache
  - Installing webmozart/assert (1.9.1): Loading from cache
  - Installing phpdocumentor/type-resolver (1.4.0): Loading from cache
  - Installing phpdocumentor/reflection-docblock (5.2.2): Loading from cache
  - Installing felixfbecker/advanced-json-rpc (v3.2.0): Loading from cache
  - Installing composer/xdebug-handler (1.4.5): Loading from cache
  - Installing phan/phan (3.2.6): Loading from cache
  - Installing mediawiki/phan-taint-check-plugin (3.2.1): Loading from cache
  - Installing mediawiki/mediawiki-phan-config (0.10.6): Loading from cache
  - Installing mediawiki/minus-x (1.1.0): Loading from cache
  - Installing php-parallel-lint/php-console-color (v0.3): Loading from cache
  - Installing php-parallel-lint/php-console-highlighter (v0.5): Loading from cache
  - Installing php-parallel-lint/php-parallel-lint (v1.2.0): Loading from cache
  - Installing phpstan/phpdoc-parser (0.4.9): Downloading (connecting...)Downloading (0%)           Downloading (25%)Downloading (35%)Downloading (60%)Downloading (85%)Downloading (95%)Downloading (100%)
  - Installing slevomat/coding-standard (6.4.1): Downloading (connecting...)Downloading (0%)           Downloading (5%)Downloading (10%)Downloading (15%)Downloading (20%)Downloading (25%)Downloading (30%)Downloading (35%)Downloading (40%)Downloading (45%)Downloading (50%)Downloading (55%)Downloading (60%)Downloading (65%)Downloading (70%)Downloading (75%)Downloading (80%)Downloading (85%)Downloading (90%)Downloading (95%)Downloading (100%)
symfony/service-contracts suggests installing symfony/service-implementation
symfony/console suggests installing symfony/event-dispatcher
symfony/console suggests installing symfony/lock
symfony/console suggests installing symfony/process
phan/phan suggests installing ext-ast (Needed for parsing ASTs (unless --use-fallback-parser is used). 1.0.1+ is needed, 1.0.8+ is recommended.)
Writing lock file
Generating autoload files
14 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
PHP CodeSniffer Config installed_paths set to ../../mediawiki/mediawiki-codesniffer,../../slevomat/coding-standard

Upgrading n:eslint-config-wikimedia from 0.17.0 -> 0.18.1
$ npm install

> core-js@3.9.1 postinstall /src/repo/node_modules/core-js
> node -e "try{require('./postinstall')}catch(e){}"

Thank you for using core-js ( https://github.com/zloirock/core-js ) for polyfilling JavaScript standard library!

The project needs your help! Please consider supporting of core-js on Open Collective or Patreon: 
> https://opencollective.com/core-js 
> https://www.patreon.com/zloirock 

Also, the author of core-js ( https://github.com/zloirock ) is looking for a good job -)

added 677 packages from 345 contributors and audited 677 packages in 105.733s

70 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities


$ npm update eslint -depth 10
+ eslint@7.21.0
added 17 packages from 9 contributors, removed 10 packages, updated 15 packages, moved 1 package and audited 684 packages in 62.213s

65 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities


$ npm install grunt-eslint@23.0.0 --save-exact
+ grunt-eslint@23.0.0
updated 3 packages and audited 684 packages in 59.073s

68 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities


$ ./node_modules/.bin/eslint i18n/core/vro.json i18n/core/ln.json i18n/api/kjp.json i18n/pagetranslation/pcd.json i18n/api/zh-hant.json i18n/sandbox/sd.json resources/js/ext.translate.groupselector.js i18n/core/ksh.json i18n/search/it.json i18n/core/lij.json i18n/core/glk.json i18n/core/hil.json i18n/api/ia.json i18n/core/cs.json i18n/core/kbd-cyrl.json i18n/core/da.json i18n/sandbox/ce.json resources/js/ext.translate.special.translate.js i18n/core/gsw.json resources/js/ext.translate.pagetranslation.uls.js i18n/sandbox/nl.json i18n/core/cop.json i18n/core/qu.json i18n/sandbox/gu.json i18n/pagetranslation/as.json i18n/sandbox/et.json i18n/sandbox/hy.json i18n/core/tru.json i18n/pagetranslation/ceb.json i18n/sandbox/ast.json i18n/core/xal.json i18n/core/wa.json i18n/core/ku-latn.json i18n/api/en.json i18n/pagetranslation/tay.json i18n/search/krl.json i18n/pagetranslation/tly.json i18n/core/ug-arab.json i18n/core/mn.json i18n/api/tr.json i18n/pagetranslation/krl.json i18n/pagetranslation/tr.json i18n/pagetranslation/bm.json i18n/pagetranslation/ar.json i18n/core/os.json i18n/core/br.json i18n/api/ps.json i18n/api/bg.json i18n/pagetranslation/zh-hant.json i18n/sandbox/eo.json i18n/core/arn.json i18n/sandbox/ka.json i18n/search/fo.json i18n/pagetranslation/nn.json i18n/core/tr.json i18n/pagetranslation/tt-cyrl.json i18n/search/es.json i18n/pagetranslation/sdh.json i18n/pagetranslation/luz.json resources/js/jquery.ajaxdispatcher.js i18n/pagetranslation/li.json i18n/pagetranslation/sco.json i18n/core/se.json i18n/core/ug-latn.json i18n/api/cs.json i18n/pagetranslation/fur.json i18n/core/sms.json i18n/core/ta.json i18n/sandbox/ta.json i18n/search/fi.json i18n/core/lg.json i18n/api/bcl.json i18n/core/war.json i18n/api/nl.json i18n/core/jbo.json i18n/api/oc.json i18n/core/roa-tara.json i18n/core/qqq.json i18n/search/tcy.json i18n/pagetranslation/atj.json resources/js/jquery.textchange.js i18n/pagetranslation/qu.json i18n/core/kiu.json i18n/sandbox/kk-cyrl.json i18n/api/qqq.json i18n/api/awa.json i18n/core/pcd.json i18n/search/szy.json i18n/pagetranslation/nia.json i18n/pagetranslation/ff.json i18n/search/mr.json i18n/pagetranslation/shi.json i18n/sandbox/ne.json i18n/pagetranslation/mnw.json i18n/core/xsy.json i18n/core/arc.json i18n/sandbox/sah.json i18n/pagetranslation/kab.json i18n/core/ltg.json i18n/search/zh-hant.json i18n/core/pa.json resources/js/ext.translate.editor.shortcuts.js i18n/core/hsb.json i18n/core/sah.json i18n/pagetranslation/ang.json i18n/sandbox/he.json i18n/core/ny.json i18n/pagetranslation/zgh.json i18n/pagetranslation/ltg.json i18n/core/sv.json i18n/api/hr.json i18n/pagetranslation/olo.json i18n/pagetranslation/aeb-latn.json i18n/pagetranslation/mrh.json i18n/core/yue.json i18n/core/pap.json i18n/pagetranslation/az.json i18n/core/lki.json i18n/pagetranslation/szl.json i18n/api/pt.json i18n/sandbox/eu.json i18n/api/nb.json i18n/search/ilo.json i18n/pagetranslation/se.json i18n/core/mt.json i18n/core/guc.json i18n/pagetranslation/nds-nl.json i18n/sandbox/vi.json i18n/search/lfn.json i18n/sandbox/sw.json i18n/pagetranslation/wuu.json i18n/sandbox/yo.json i18n/api/tl.json i18n/api/pl.json i18n/pagetranslation/cs.json i18n/pagetranslation/hr.json i18n/core/ee.json i18n/pagetranslation/mk.json i18n/core/kum.json i18n/search/nah.json i18n/core/za.json i18n/search/ko.json resources/js/ext.translate.special.managetranslatorsandbox.js i18n/search/lrc.json i18n/core/kl.json i18n/pagetranslation/sr-el.json i18n/pagetranslation/abs.json i18n/search/en.json i18n/search/ti.json i18n/sandbox/id.json i18n/api/af.json i18n/pagetranslation/sli.json i18n/core/cv.json i18n/pagetranslation/bcc.json i18n/pagetranslation/alt.json tests/qunit/ext.translate.special.pagemigration.test.js i18n/search/tt-cyrl.json i18n/pagetranslation/mg.json i18n/api/sw.json i18n/pagetranslation/pt-br.json i18n/sandbox/oc.json i18n/sandbox/ar.json i18n/pagetranslation/hyw.json i18n/pagetranslation/vi.json i18n/api/io.json i18n/pagetranslation/mzn.json i18n/api/li.json i18n/pagetranslation/gom-deva.json i18n/search/oc.json i18n/core/lb.json i18n/core/mnc.json i18n/pagetranslation/yi.json i18n/sandbox/nb.json resources/js/ext.translate.navitoggle.js i18n/search/gu.json i18n/search/ku-latn.json i18n/sandbox/lrc.json i18n/api/ko.json i18n/sandbox/zh-hant.json i18n/search/gom-deva.json i18n/pagetranslation/gom-latn.json i18n/core/kk-kz.json i18n/core/lzz.json i18n/search/lv.json i18n/search/io.json i18n/core/ba.json i18n/api/bs.json i18n/sandbox/sv.json i18n/pagetranslation/arq.json i18n/search/shn.json i18n/search/mk.json i18n/core/bar.json i18n/api/it.json i18n/sandbox/tg-cyrl.json i18n/core/my.json i18n/api/nds-nl.json i18n/search/ja.json i18n/pagetranslation/my.json i18n/pagetranslation/tcy.json i18n/sandbox/cs.json i18n/sandbox/is.json i18n/search/as.json i18n/pagetranslation/jam.json i18n/sandbox/tt-cyrl.json i18n/pagetranslation/qqq.json i18n/pagetranslation/ku-latn.json resources/js/ext.translate.dropdownmenu.js i18n/pagetranslation/nys.json i18n/search/kab.json i18n/api/ce.json i18n/search/bg.json i18n/core/bci.json i18n/pagetranslation/guc.json i18n/core/id.json i18n/sandbox/bg.json i18n/sandbox/pnb.json i18n/core/ciw.json i18n/core/it.json i18n/core/gcr.json i18n/search/pt.json i18n/core/so.json i18n/search/ms.json i18n/core/cu.json i18n/pagetranslation/mt.json i18n/core/ti.json i18n/core/nds.json i18n/pagetranslation/fy.json i18n/pagetranslation/lmo.json i18n/core/kbp.json i18n/pagetranslation/kjp.json i18n/pagetranslation/ksw.json i18n/core/an.json i18n/pagetranslation/xmf.json i18n/sandbox/ia.json i18n/sandbox/fr.json i18n/api/pam.json i18n/search/de.json i18n/pagetranslation/lrc.json i18n/core/mg.json i18n/pagetranslation/bqi.json i18n/pagetranslation/sgs.json i18n/pagetranslation/ksh.json i18n/api/de.json i18n/search/udm.json i18n/core/wo.json resources/js/ext.translate.special.aggregategroups.js i18n/search/roa-tara.json i18n/core/kcg.json resources/js/ext.translate.special.languagestats.js i18n/sandbox/fy.json i18n/api/diq.json i18n/core/ban.json i18n/pagetranslation/km.json resources/js/ext.translate.selecttoinput.js i18n/core/nds-nl.json i18n/core/bxr.json i18n/pagetranslation/diq.json i18n/sandbox/te.json i18n/api/kab.json i18n/sandbox/bs.json i18n/pagetranslation/szy.json i18n/sandbox/kab.json i18n/pagetranslation/ml.json i18n/search/lki.json i18n/pagetranslation/ady-cyrl.json i18n/search/br.json i18n/pagetranslation/ne.json i18n/pagetranslation/zh-hans.json i18n/core/lld.json i18n/core/olo.json i18n/api/ru.json i18n/pagetranslation/azb.json i18n/pagetranslation/tk.json i18n/core/din.json i18n/core/bho.json i18n/pagetranslation/mai.json i18n/core/mui.json i18n/core/io.json i18n/sandbox/br.json i18n/sandbox/hu.json i18n/sandbox/ja.json i18n/core/anp.json i18n/core/eu.json i18n/search/zgh.json i18n/search/azb.json i18n/pagetranslation/lv.json i18n/core/saz.json i18n/search/atj.json i18n/core/ka.json i18n/core/ru.json i18n/search/lt.json i18n/core/nn.json i18n/search/kk-cyrl.json i18n/core/btm.json i18n/sandbox/yi.json i18n/api/sr-ec.json i18n/core/bqi.json i18n/core/rm.json resources/js/ext.translate.editor.js i18n/pagetranslation/ro.json i18n/pagetranslation/gd.json resources/js/ext.translate.special.pagemigration.js i18n/sandbox/th.json i18n/search/ksh.json i18n/core/ce.json i18n/core/krl.json i18n/pagetranslation/si.json i18n/search/is.json i18n/api/is.json i18n/sandbox/sr-ec.json i18n/pagetranslation/jbo.json i18n/core/ch.json i18n/core/nb.json i18n/core/awa.json i18n/search/uz.json i18n/search/fr.json i18n/core/mo.json i18n/pagetranslation/ka.json i18n/pagetranslation/mad.json i18n/pagetranslation/kum.json i18n/core/kjp.json resources/js/ext.translate.messagerenamedialog.js i18n/api/fi.json i18n/core/gu.json i18n/api/sdc.json resources/js/ext.translate.special.searchtranslations.js i18n/api/tly.json i18n/core/lzh.json i18n/pagetranslation/scn.json i18n/sandbox/el.json i18n/search/sl.json i18n/pagetranslation/hrx.json i18n/pagetranslation/mnc.json i18n/sandbox/ko.json i18n/sandbox/pl.json i18n/pagetranslation/pnb.json i18n/search/om.json i18n/core/sh.json i18n/core/uk.json i18n/pagetranslation/ja.json i18n/core/ang.json i18n/pagetranslation/eu.json i18n/api/ksh.json resources/js/ext.translate.special.managegroups.js i18n/core/cy.json i18n/core/ms.json i18n/pagetranslation/lki.json i18n/pagetranslation/da.json i18n/core/mai.json i18n/pagetranslation/el.json i18n/api/vec.json i18n/pagetranslation/es.json i18n/sandbox/ms.json i18n/pagetranslation/lfn.json i18n/search/mwl.json i18n/pagetranslation/sc.json i18n/core/sdh.json i18n/core/or.json i18n/pagetranslation/rm.json i18n/sandbox/sh.json i18n/search/el.json i18n/pagetranslation/be.json i18n/pagetranslation/ba.json i18n/core/th.json i18n/core/nap.json i18n/pagetranslation/ie.json i18n/pagetranslation/su.json i18n/search/pms.json i18n/pagetranslation/ee.json i18n/pagetranslation/lzh.json i18n/search/zh-hans.json i18n/pagetranslation/kw.json i18n/sandbox/sco.json i18n/search/te.json i18n/core/kk-latn.json i18n/sandbox/zh-hans.json i18n/sandbox/en.json i18n/core/fur.json i18n/api/pnb.json i18n/sandbox/hyw.json i18n/api/nn.json i18n/core/dty.json i18n/sandbox/ku-latn.json i18n/sandbox/pt.json i18n/pagetranslation/jut.json i18n/api/skr-arab.json i18n/core/frp.json i18n/core/haw.json i18n/pagetranslation/ug-arab.json i18n/core/ilo.json i18n/api/tg-cyrl.json i18n/search/cv.json i18n/core/inh.json resources/js/ext.translate.storage.js i18n/pagetranslation/sr-ec.json i18n/core/abs.json resources/js/ext.translate.statsbar.js i18n/core/ceb.json i18n/sandbox/fa.json i18n/pagetranslation/saz.json i18n/search/nn.json i18n/pagetranslation/pdc.json i18n/pagetranslation/hu.json i18n/core/ami.json i18n/core/pms.json i18n/core/map-bms.json i18n/pagetranslation/ary.json i18n/core/la.json i18n/pagetranslation/io.json resources/js/ext.translate.proofread.js i18n/pagetranslation/csb.json i18n/search/ee.json resources/js/ext.translate.special.importtranslations.js i18n/core/ko.json resources/js/ext.translate.workflowselector.js i18n/sandbox/pt-br.json i18n/search/ps.json i18n/pagetranslation/inh.json i18n/pagetranslation/ann.json i18n/core/ro.json i18n/core/am.json i18n/core/tn.json i18n/sandbox/sr-el.json i18n/core/shy-latn.json i18n/sandbox/sa.json i18n/search/inh.json i18n/core/lrc.json i18n/pagetranslation/en.json i18n/sandbox/hr.json i18n/pagetranslation/lo.json i18n/pagetranslation/glk.json i18n/pagetranslation/fi.json i18n/core/ary.json i18n/pagetranslation/nap.json i18n/core/bjn.json resources/js/ext.translate.translationstashstorage.js data/plural-cldr.json i18n/core/mhr.json i18n/core/fon.json i18n/api/nap.json i18n/core/pdc.json i18n/sandbox/de-ch.json i18n/core/got.json resources/js/ext.translate.special.translationstats.js i18n/core/mrh.json i18n/core/ha.json i18n/api/ne.json i18n/api/ar.json i18n/search/my.json i18n/pagetranslation/cnr-latn.json i18n/core/be.json i18n/pagetranslation/sk.json i18n/core/mzn.json i18n/pagetranslation/bo.json extension.json i18n/search/sk.json i18n/core/pfl.json i18n/sandbox/wa.json i18n/core/sq.json i18n/pagetranslation/th.json i18n/pagetranslation/pms.json i18n/core/bpy.json i18n/sandbox/qu.json i18n/sandbox/cy.json i18n/pagetranslation/bgn.json i18n/core/fi.json i18n/sandbox/gl.json i18n/api/kk-cyrl.json i18n/core/cak.json i18n/core/trv.json composer.json i18n/core/zh-hans.json i18n/core/aln.json i18n/pagetranslation/ses.json i18n/pagetranslation/uk.json i18n/sandbox/sk.json i18n/api/gl.json i18n/sandbox/skr-arab.json i18n/core/yi.json resources/js/ext.translate.special.pagepreparation.js i18n/sandbox/lb.json i18n/pagetranslation/id.json i18n/search/qqq.json i18n/pagetranslation/shn.json i18n/core/stq.json i18n/core/lmo.json i18n/core/gor.json i18n/api/ro.json i18n/search/fy.json i18n/pagetranslation/ht.json i18n/core/de-formal.json i18n/core/ig.json i18n/core/arz.json i18n/core/bs.json i18n/pagetranslation/sd.json i18n/core/nys.json i18n/pagetranslation/nb.json i18n/pagetranslation/sms.json i18n/core/sgs.json i18n/api/sr-el.json i18n/search/bn.json i18n/core/sat.json i18n/core/pt.json i18n/pagetranslation/kcg.json i18n/pagetranslation/lt.json i18n/search/ka.json i18n/pagetranslation/tl.json i18n/core/gom-latn.json i18n/pagetranslation/yue.json i18n/core/gl.json resources/js/ext.translate.recentgroups.js i18n/pagetranslation/bho.json i18n/core/alt.json i18n/pagetranslation/oc.json i18n/pagetranslation/gcr.json i18n/pagetranslation/gv.json i18n/core/bcc.json i18n/pagetranslation/bs.json i18n/pagetranslation/he.json i18n/core/uz.json i18n/core/csb.json i18n/core/be-tarask.json i18n/core/skr-arab.json i18n/core/ext.json i18n/api/ku-latn.json i18n/core/rif.json i18n/api/vi.json i18n/pagetranslation/anp.json i18n/pagetranslation/ur.json i18n/core/sty.json i18n/core/ady-cyrl.json i18n/pagetranslation/nan.json i18n/api/eo.json i18n/sandbox/kjp.json i18n/pagetranslation/sah.json i18n/pagetranslation/mn.json i18n/core/udm.json i18n/pagetranslation/sty.json i18n/pagetranslation/ha.json i18n/search/pnb.json i18n/pagetranslation/lb.json i18n/core/ga.json i18n/search/vi.json i18n/core/gom-deva.json i18n/core/sd.json i18n/core/gv.json i18n/pagetranslation/gl.json i18n/core/su.json i18n/sandbox/diq.json i18n/api/pt-br.json i18n/sandbox/lki.json i18n/pagetranslation/lg.json i18n/pagetranslation/kbp.json i18n/pagetranslation/af.json i18n/core/jv.json i18n/core/fit.json i18n/core/pt-br.json i18n/core/krc.json i18n/pagetranslation/hak.json i18n/search/yi.json i18n/core/nqo.json i18n/pagetranslation/ace.json i18n/sandbox/bn.json i18n/core/hif-latn.json i18n/core/yo.json i18n/core/ur.json i18n/api/lt.json i18n/sandbox/fit.json i18n/sandbox/scn.json i18n/core/hyw.json i18n/sandbox/io.json i18n/core/mad.json i18n/search/ckb.json i18n/core/tt-latn.json i18n/core/en-gb.json i18n/core/cdo.json i18n/search/bs.json i18n/search/id.json i18n/sandbox/lt.json i18n/core/xmf.json i18n/search/gom-latn.json i18n/pagetranslation/smn.json i18n/pagetranslation/ban.json Gruntfile.js i18n/api/lv.json i18n/api/roa-tara.json i18n/core/av.json i18n/pagetranslation/vep.json i18n/pagetranslation/bug.json i18n/pagetranslation/nqo.json i18n/pagetranslation/hy.json i18n/api/id.json i18n/core/tyv.json i18n/pagetranslation/mo.json i18n/pagetranslation/te.json i18n/api/ka.json i18n/pagetranslation/pfl.json i18n/search/gcr.json i18n/pagetranslation/frr.json i18n/core/diq.json i18n/search/kn.json i18n/pagetranslation/jv.json i18n/search/az.json i18n/core/vec.json i18n/pagetranslation/de-formal.json i18n/sandbox/sq.json i18n/pagetranslation/khw.json i18n/api/bn.json i18n/pagetranslation/frp.json i18n/pagetranslation/ig.json tests/qunit/ext.translate.parsers.test.js i18n/core/frc.json i18n/core/mwl.json i18n/core/bgn.json i18n/search/lag.json i18n/pagetranslation/fo.json i18n/pagetranslation/gu.json i18n/api/hyw.json i18n/core/sli.json i18n/sandbox/mr.json i18n/api/mk.json i18n/core/pnb.json i18n/api/es.json i18n/core/fa.json i18n/core/mni.json i18n/api/wa.json i18n/pagetranslation/sw.json i18n/core/sr-el.json i18n/pagetranslation/bjn.json i18n/pagetranslation/ast.json i18n/core/aeb-latn.json i18n/core/as.json i18n/pagetranslation/cdo.json i18n/pagetranslation/dty.json i18n/sandbox/my.json i18n/search/cs.json i18n/pagetranslation/din.json i18n/pagetranslation/skr-arab.json i18n/search/sv.json i18n/core/vep.json i18n/core/is.json i18n/search/olo.json i18n/api/th.json i18n/pagetranslation/so.json i18n/core/zgh.json i18n/core/ann.json i18n/api/fit.json i18n/api/gu.json i18n/pagetranslation/sat.json i18n/pagetranslation/btm.json i18n/api/sv.json i18n/pagetranslation/es-formal.json resources/js/LanguagesMultiselectWidget.js i18n/core/avk.json i18n/core/kn.json i18n/pagetranslation/lag.json i18n/core/li.json i18n/core/zh-hant.json i18n/core/vi.json i18n/core/ia.json i18n/core/sl.json i18n/pagetranslation/hif-latn.json i18n/pagetranslation/wa.json i18n/core/bug.json i18n/api/my.json i18n/pagetranslation/hi.json i18n/core/pam.json i18n/pagetranslation/rej.json i18n/sandbox/hi.json i18n/pagetranslation/lzz.json i18n/core/eo.json i18n/search/fa.json i18n/core/azb.json i18n/core/cnr-latn.json i18n/core/xh.json i18n/sandbox/hsb.json i18n/api/he.json i18n/core/mr.json i18n/core/guw.json i18n/api/km.json i18n/search/lkt.json i18n/core/he.json i18n/pagetranslation/nl.json i18n/core/kw.json i18n/core/tet.json i18n/pagetranslation/udm.json i18n/pagetranslation/sv.json i18n/pagetranslation/ms.json i18n/search/be.json resources/js/ext.translate.editor.helpers.js i18n/pagetranslation/min.json i18n/pagetranslation/ti.json i18n/core/lus.json i18n/pagetranslation/bbc-latn.json i18n/api/qu.json i18n/search/sa.json i18n/core/lv.json i18n/api/sa.json i18n/sandbox/roa-tara.json i18n/pagetranslation/ta.json i18n/sandbox/ro.json i18n/api/sq.json i18n/pagetranslation/mwl.json i18n/pagetranslation/wo.json i18n/search/km.json i18n/search/ca.json i18n/pagetranslation/kk-cyrl.json i18n/pagetranslation/lij.json i18n/search/be-tarask.json i18n/core/bo.json i18n/search/sco.json i18n/search/et.json i18n/pagetranslation/av.json i18n/search/hsb.json i18n/core/tay.json i18n/core/tk.json i18n/core/te.json i18n/core/tcy.json i18n/core/dtp.json i18n/core/hr.json i18n/core/hak.json i18n/search/rue.json resources/js/ext.translate.translationstats.graphbuilder.js i18n/pagetranslation/ko.json i18n/core/grc.json i18n/sandbox/ksh.json i18n/core/gd.json i18n/sandbox/ps.json i18n/api/ast.json i18n/core/vo.json i18n/pagetranslation/en-gb.json i18n/pagetranslation/ps.json i18n/sandbox/de.json i18n/core/tzm.json i18n/sandbox/it.json i18n/pagetranslation/trv.json i18n/core/jam.json i18n/pagetranslation/kn.json i18n/pagetranslation/bg.json i18n/search/ig.json i18n/core/mnw.json i18n/sandbox/tyv.json i18n/core/ast.json i18n/sandbox/dsb.json i18n/sandbox/tr.json i18n/pagetranslation/cu.json i18n/pagetranslation/fa.json i18n/search/af.json i18n/sandbox/tcy.json i18n/api/lki.json resources/js/ext.translate.translationstats.embedded.js i18n/search/sr-el.json i18n/core/nl.json i18n/core/jut.json i18n/pagetranslation/sl.json i18n/search/hi.json i18n/pagetranslation/uz.json i18n/core/sa.json i18n/core/rue.json i18n/core/el.json i18n/sandbox/es.json i18n/search/th.json i18n/core/lag.json i18n/core/ja.json i18n/core/tt-cyrl.json resources/js/ext.translate.special.translationstash.js i18n/core/kk-cyrl.json i18n/search/dsb.json i18n/core/et.json i18n/core/ss.json i18n/core/hrx.json i18n/sandbox/mk.json i18n/pagetranslation/gaa.json i18n/pagetranslation/bcl.json i18n/pagetranslation/bxr.json i18n/pagetranslation/eo.json i18n/pagetranslation/ru.json resources/js/ext.translate.special.operatorsuggest.js i18n/pagetranslation/mni.json i18n/search/ce.json i18n/api/tt-cyrl.json i18n/pagetranslation/ia.json i18n/core/ses.json i18n/pagetranslation/fit.json i18n/pagetranslation/arc.json i18n/core/lo.json i18n/api/zh-hans.json i18n/core/pl.json i18n/core/nso.json i18n/search/eu.json i18n/core/rtm.json i18n/search/kiu.json i18n/search/vec.json i18n/core/ml.json i18n/pagetranslation/et.json i18n/core/sc.json i18n/core/scn.json i18n/core/rej.json i18n/search/ro.json i18n/core/gld.json i18n/api/hu.json i18n/api/ta.json i18n/core/ksw.json i18n/core/lfn.json i18n/search/krc.json i18n/search/hu.json i18n/core/kaa.json resources/js/ext.translate.special.pagetranslation.js i18n/pagetranslation/tzm.json i18n/sandbox/uk.json i18n/search/ar.json resources/js/ext.translate.messagetable.js i18n/core/frr.json i18n/pagetranslation/pl.json i18n/pagetranslation/awa.json i18n/search/kjp.json i18n/pagetranslation/krc.json i18n/core/atj.json i18n/pagetranslation/ilo.json i18n/core/sr-ec.json i18n/api/yi.json i18n/search/cu.json i18n/core/shn.json i18n/pagetranslation/de.json i18n/core/khw.json i18n/search/sr-ec.json i18n/pagetranslation/ami.json i18n/core/aeb-arab.json i18n/pagetranslation/bn.json i18n/core/ps.json i18n/search/hr.json i18n/core/sk.json i18n/core/bcl.json i18n/sandbox/km.json i18n/pagetranslation/xsy.json i18n/core/ht.json i18n/core/tg-cyrl.json i18n/core/si.json i18n/core/kri.json i18n/core/tl.json i18n/api/yue.json package.json i18n/pagetranslation/is.json i18n/search/uk.json i18n/pagetranslation/rue.json i18n/pagetranslation/sh.json i18n/core/smn.json i18n/core/min.json i18n/core/km.json i18n/pagetranslation/dsb.json i18n/api/ca.json package-lock.json i18n/core/fy.json i18n/pagetranslation/pam.json i18n/sandbox/lag.json i18n/core/nan.json i18n/pagetranslation/roa-tara.json i18n/core/ca.json i18n/core/ar.json i18n/search/nl.json i18n/pagetranslation/pa.json i18n/core/es.json i18n/core/nah.json i18n/search/nb.json i18n/core/kk-arab.json i18n/core/arq.json i18n/pagetranslation/br.json i18n/core/ff.json i18n/search/he.json i18n/pagetranslation/myv.json i18n/pagetranslation/got.json i18n/search/ne.json i18n/pagetranslation/kbd-cyrl.json i18n/core/niu.json i18n/core/bn.json i18n/core/wuu.json i18n/pagetranslation/or.json i18n/api/fy.json i18n/core/szy.json i18n/core/hi.json i18n/pagetranslation/vec.json i18n/pagetranslation/ce.json i18n/api/hi.json i18n/pagetranslation/gsw.json i18n/pagetranslation/nah.json i18n/search/diq.json i18n/core/af.json i18n/pagetranslation/lld.json i18n/sandbox/ru.json i18n/core/kea.json i18n/pagetranslation/ga.json i18n/search/fit.json i18n/api/fr.json i18n/core/fo.json i18n/pagetranslation/sdc.json i18n/pagetranslation/vro.json i18n/api/eu.json i18n/search/lzh.json i18n/core/tg-latn.json i18n/sandbox/af.json i18n/core/szl.json i18n/search/tay.json i18n/search/pl.json i18n/pagetranslation/kiu.json i18n/core/ne.json tests/phpunit/data/jsontest_fi.json i18n/pagetranslation/ky.json i18n/core/de-ch.json i18n/pagetranslation/bar.json i18n/core/luz.json i18n/core/gaa.json i18n/core/fr.json i18n/pagetranslation/tg-cyrl.json i18n/core/sdc.json i18n/api/pdc.json resources/js/ext.translate.parsers.js i18n/core/az.json i18n/pagetranslation/sq.json i18n/api/uk.json i18n/core/sw.json resources/js/ext.translate.base.js i18n/search/eo.json i18n/search/sd.json i18n/core/sco.json i18n/pagetranslation/arz.json i18n/core/shi.json i18n/core/en.json i18n/core/tokipona.json i18n/sandbox/qqq.json i18n/pagetranslation/vo.json i18n/api/sah.json i18n/pagetranslation/mr.json i18n/pagetranslation/yo.json i18n/core/lt.json i18n/pagetranslation/pt.json i18n/core/myv.json i18n/search/wa.json i18n/core/mk.json i18n/pagetranslation/war.json i18n/sandbox/mt.json i18n/core/kab.json i18n/pagetranslation/gor.json i18n/search/yue.json i18n/api/da.json i18n/api/lb.json i18n/pagetranslation/avk.json i18n/core/dsb.json i18n/pagetranslation/ca.json i18n/core/hy.json i18n/api/fa.json i18n/search/ast.json i18n/pagetranslation/stq.json i18n/search/sq.json i18n/api/ckb.json i18n/core/nia.json i18n/core/oc.json i18n/pagetranslation/fr.json i18n/search/ru.json i18n/sandbox/en-gb.json i18n/search/scn.json i18n/api/ja.json i18n/pagetranslation/hsb.json i18n/sandbox/fi.json i18n/search/ia.json i18n/pagetranslation/be-tarask.json resources/js/ext.translate.edit.documentation.js i18n/pagetranslation/sa.json i18n/pagetranslation/grc.json i18n/core/ckb.json i18n/core/ace.json i18n/pagetranslation/shy-latn.json i18n/pagetranslation/cy.json i18n/sandbox/be.json i18n/search/tg-cyrl.json i18n/search/pt-br.json i18n/api/be-tarask.json i18n/pagetranslation/it.json i18n/pagetranslation/ckb.json i18n/search/gl.json resources/js/ext.translate.pagemode.js i18n/core/hu.json i18n/search/tr.json i18n/sandbox/da.json i18n/search/shy-latn.json i18n/search/da.json i18n/core/bg.json i18n/search/lb.json i18n/core/ky.json i18n/core/bbc-latn.json i18n/search/qu.json i18n/sandbox/lv.json i18n/core/tly.json i18n/api/ms.json i18n/core/de.json --fix

/src/repo/Gruntfile.js
  32:11  error  Object.assign() is not supported in Safari 5.1, iOS Safari 6.0-6.1, IE 11  compat/compat

/src/repo/resources/js/ext.translate.editor.helpers.js
  198:4  warning  All possible CSS classes should be documented. See https://w.wiki/PS2 for details  mediawiki/class-doc

/src/repo/resources/js/ext.translate.editor.js
   133:4   warning  All possible CSS classes should be documented. See https://w.wiki/PS2 for details  mediawiki/class-doc
   374:17  warning  Selector extensions are not allowed                                                no-jquery/no-sizzle
   393:11  warning  All possible CSS classes should be documented. See https://w.wiki/PS2 for details  mediawiki/class-doc
   667:6   warning  Selector extensions are not allowed                                                no-jquery/no-sizzle
  1076:18  warning  All possible CSS classes should be documented. See https://w.wiki/PS2 for details  mediawiki/class-doc

/src/repo/resources/js/ext.translate.editor.shortcuts.js
  36:4  warning  Selector extensions are not allowed  no-jquery/no-sizzle

/src/repo/resources/js/ext.translate.messagerenamedialog.js
  308:2  warning  All possible CSS classes should be documented. See https://w.wiki/PS2 for details  mediawiki/class-doc
  309:2  warning  All possible CSS classes should be documented. See https://w.wiki/PS2 for details  mediawiki/class-doc

/src/repo/resources/js/ext.translate.messagetable.js
  288:33  warning  Selector extensions are not allowed             no-jquery/no-sizzle
  388:9   warning  Selector extensions are not allowed             no-jquery/no-sizzle
  401:16  warning  Positional selector extensions are not allowed  no-jquery/no-sizzle
  518:7   warning  Positional selector extensions are not allowed  no-jquery/no-sizzle

/src/repo/resources/js/ext.translate.pagemode.js
  56:6  warning  All possible CSS classes should be documented. See https://w.wiki/PS2 for details  mediawiki/class-doc
  78:4  warning  All possible CSS classes should be documented. See https://w.wiki/PS2 for details  mediawiki/class-doc
  79:5  warning  All possible CSS classes should be documented. See https://w.wiki/PS2 for details  mediawiki/class-doc
  82:7  warning  All possible CSS classes should be documented. See https://w.wiki/PS2 for details  mediawiki/class-doc

/src/repo/resources/js/ext.translate.proofread.js
   64:6   warning  All possible CSS classes should be documented. See https://w.wiki/PS2 for details  mediawiki/class-doc
   95:23  warning  All possible CSS classes should be documented. See https://w.wiki/PS2 for details  mediawiki/class-doc
  121:4   warning  All possible CSS classes should be documented. See https://w.wiki/PS2 for details  mediawiki/class-doc
  125:7   warning  All possible CSS classes should be documented. See https://w.wiki/PS2 for details  mediawiki/class-doc

/src/repo/resources/js/ext.translate.special.languagestats.js
   17:0  warning  Missing JSDoc @param "$table" type                                                  jsdoc/require-param-type
   20:3  warning  Positional selector extensions are not allowed                                      no-jquery/no-sizzle
   21:3  warning  Positional selector extensions are not allowed                                      no-jquery/no-sizzle
  234:3  error    ResizeObserver.observe() is not supported in Safari 5.1, iOS Safari 6.0-6.1, IE 11  compat/compat
  234:3  error    ResizeObserver is not supported in Safari 5.1, IE 11, android 4.1                   compat/compat

/src/repo/resources/js/ext.translate.special.pagemigration.js
  132:27  warning  'pageName' is already declared in the upper scope on line 4 column 3     no-shadow
  234:25  warning  'sourceUnits' is already declared in the upper scope on line 6 column 3  no-shadow
  296:25  warning  'sourceUnits' is already declared in the upper scope on line 6 column 3  no-shadow
  487:22  warning  'sourceUnits' is already declared in the upper scope on line 6 column 3  no-shadow

/src/repo/resources/js/ext.translate.special.searchtranslations.js
  125:6   warning  All possible CSS classes should be documented. See https://w.wiki/PS2 for details  mediawiki/class-doc
  138:48  warning  'languageCode' is already declared in the upper scope on line 67 column 4          no-shadow
  235:16  warning  All possible CSS classes should be documented. See https://w.wiki/PS2 for details  mediawiki/class-doc
  238:6   warning  All possible CSS classes should be documented. See https://w.wiki/PS2 for details  mediawiki/class-doc

✖ 35 problems (3 errors, 32 warnings)


$ ./node_modules/.bin/eslint i18n/core/vro.json i18n/core/ln.json i18n/api/kjp.json i18n/pagetranslation/pcd.json i18n/api/zh-hant.json i18n/sandbox/sd.json resources/js/ext.translate.groupselector.js i18n/core/ksh.json i18n/search/it.json i18n/core/lij.json i18n/core/glk.json i18n/core/hil.json i18n/api/ia.json i18n/core/cs.json i18n/core/kbd-cyrl.json i18n/core/da.json i18n/sandbox/ce.json resources/js/ext.translate.special.translate.js i18n/core/gsw.json resources/js/ext.translate.pagetranslation.uls.js i18n/sandbox/nl.json i18n/core/cop.json i18n/core/qu.json i18n/sandbox/gu.json i18n/pagetranslation/as.json i18n/sandbox/et.json i18n/sandbox/hy.json i18n/core/tru.json i18n/pagetranslation/ceb.json i18n/sandbox/ast.json i18n/core/xal.json i18n/core/wa.json i18n/core/ku-latn.json i18n/api/en.json i18n/pagetranslation/tay.json i18n/search/krl.json i18n/pagetranslation/tly.json i18n/core/ug-arab.json i18n/core/mn.json i18n/api/tr.json i18n/pagetranslation/krl.json i18n/pagetranslation/tr.json i18n/pagetranslation/bm.json i18n/pagetranslation/ar.json i18n/core/os.json i18n/core/br.json i18n/api/ps.json i18n/api/bg.json i18n/pagetranslation/zh-hant.json i18n/sandbox/eo.json i18n/core/arn.json i18n/sandbox/ka.json i18n/search/fo.json i18n/pagetranslation/nn.json i18n/core/tr.json i18n/pagetranslation/tt-cyrl.json i18n/search/es.json i18n/pagetranslation/sdh.json i18n/pagetranslation/luz.json resources/js/jquery.ajaxdispatcher.js i18n/pagetranslation/li.json i18n/pagetranslation/sco.json i18n/core/se.json i18n/core/ug-latn.json i18n/api/cs.json i18n/pagetranslation/fur.json i18n/core/sms.json i18n/core/ta.json i18n/sandbox/ta.json i18n/search/fi.json i18n/core/lg.json i18n/api/bcl.json i18n/core/war.json i18n/api/nl.json i18n/core/jbo.json i18n/api/oc.json i18n/core/roa-tara.json i18n/core/qqq.json i18n/search/tcy.json i18n/pagetranslation/atj.json resources/js/jquery.textchange.js i18n/pagetranslation/qu.json i18n/core/kiu.json i18n/sandbox/kk-cyrl.json i18n/api/qqq.json i18n/api/awa.json i18n/core/pcd.json i18n/search/szy.json i18n/pagetranslation/nia.json i18n/pagetranslation/ff.json i18n/search/mr.json i18n/pagetranslation/shi.json i18n/sandbox/ne.json i18n/pagetranslation/mnw.json i18n/core/xsy.json i18n/core/arc.json i18n/sandbox/sah.json i18n/pagetranslation/kab.json i18n/core/ltg.json i18n/search/zh-hant.json i18n/core/pa.json resources/js/ext.translate.editor.shortcuts.js i18n/core/hsb.json i18n/core/sah.json i18n/pagetranslation/ang.json i18n/sandbox/he.json i18n/core/ny.json i18n/pagetranslation/zgh.json i18n/pagetranslation/ltg.json i18n/core/sv.json i18n/api/hr.json i18n/pagetranslation/olo.json i18n/pagetranslation/aeb-latn.json i18n/pagetranslation/mrh.json i18n/core/yue.json i18n/core/pap.json i18n/pagetranslation/az.json i18n/core/lki.json i18n/pagetranslation/szl.json i18n/api/pt.json i18n/sandbox/eu.json i18n/api/nb.json i18n/search/ilo.json i18n/pagetranslation/se.json i18n/core/mt.json i18n/core/guc.json i18n/pagetranslation/nds-nl.json i18n/sandbox/vi.json i18n/search/lfn.json i18n/sandbox/sw.json i18n/pagetranslation/wuu.json i18n/sandbox/yo.json i18n/api/tl.json i18n/api/pl.json i18n/pagetranslation/cs.json i18n/pagetranslation/hr.json i18n/core/ee.json i18n/pagetranslation/mk.json i18n/core/kum.json i18n/search/nah.json i18n/core/za.json i18n/search/ko.json resources/js/ext.translate.special.managetranslatorsandbox.js i18n/search/lrc.json i18n/core/kl.json i18n/pagetranslation/sr-el.json i18n/pagetranslation/abs.json i18n/search/en.json i18n/search/ti.json i18n/sandbox/id.json i18n/api/af.json i18n/pagetranslation/sli.json i18n/core/cv.json i18n/pagetranslation/bcc.json i18n/pagetranslation/alt.json tests/qunit/ext.translate.special.pagemigration.test.js i18n/search/tt-cyrl.json i18n/pagetranslation/mg.json i18n/api/sw.json i18n/pagetranslation/pt-br.json i18n/sandbox/oc.json i18n/sandbox/ar.json i18n/pagetranslation/hyw.json i18n/pagetranslation/vi.json i18n/api/io.json i18n/pagetranslation/mzn.json i18n/api/li.json i18n/pagetranslation/gom-deva.json i18n/search/oc.json i18n/core/lb.json i18n/core/mnc.json i18n/pagetranslation/yi.json i18n/sandbox/nb.json resources/js/ext.translate.navitoggle.js i18n/search/gu.json i18n/search/ku-latn.json i18n/sandbox/lrc.json i18n/api/ko.json i18n/sandbox/zh-hant.json i18n/search/gom-deva.json i18n/pagetranslation/gom-latn.json i18n/core/kk-kz.json i18n/core/lzz.json i18n/search/lv.json i18n/search/io.json i18n/core/ba.json i18n/api/bs.json i18n/sandbox/sv.json i18n/pagetranslation/arq.json i18n/search/shn.json i18n/search/mk.json i18n/core/bar.json i18n/api/it.json i18n/sandbox/tg-cyrl.json i18n/core/my.json i18n/api/nds-nl.json i18n/search/ja.json i18n/pagetranslation/my.json i18n/pagetranslation/tcy.json i18n/sandbox/cs.json i18n/sandbox/is.json i18n/search/as.json i18n/pagetranslation/jam.json i18n/sandbox/tt-cyrl.json i18n/pagetranslation/qqq.json i18n/pagetranslation/ku-latn.json resources/js/ext.translate.dropdownmenu.js i18n/pagetranslation/nys.json i18n/search/kab.json i18n/api/ce.json i18n/search/bg.json i18n/core/bci.json i18n/pagetranslation/guc.json i18n/core/id.json i18n/sandbox/bg.json i18n/sandbox/pnb.json i18n/core/ciw.json i18n/core/it.json i18n/core/gcr.json i18n/search/pt.json i18n/core/so.json i18n/search/ms.json i18n/core/cu.json i18n/pagetranslation/mt.json i18n/core/ti.json i18n/core/nds.json i18n/pagetranslation/fy.json i18n/pagetranslation/lmo.json i18n/core/kbp.json i18n/pagetranslation/kjp.json i18n/pagetranslation/ksw.json i18n/core/an.json i18n/pagetranslation/xmf.json i18n/sandbox/ia.json i18n/sandbox/fr.json i18n/api/pam.json i18n/search/de.json i18n/pagetranslation/lrc.json i18n/core/mg.json i18n/pagetranslation/bqi.json i18n/pagetranslation/sgs.json i18n/pagetranslation/ksh.json i18n/api/de.json i18n/search/udm.json i18n/core/wo.json resources/js/ext.translate.special.aggregategroups.js i18n/search/roa-tara.json i18n/core/kcg.json resources/js/ext.translate.special.languagestats.js i18n/sandbox/fy.json i18n/api/diq.json i18n/core/ban.json i18n/pagetranslation/km.json resources/js/ext.translate.selecttoinput.js i18n/core/nds-nl.json i18n/core/bxr.json i18n/pagetranslation/diq.json i18n/sandbox/te.json i18n/api/kab.json i18n/sandbox/bs.json i18n/pagetranslation/szy.json i18n/sandbox/kab.json i18n/pagetranslation/ml.json i18n/search/lki.json i18n/pagetranslation/ady-cyrl.json i18n/search/br.json i18n/pagetranslation/ne.json i18n/pagetranslation/zh-hans.json i18n/core/lld.json i18n/core/olo.json i18n/api/ru.json i18n/pagetranslation/azb.json i18n/pagetranslation/tk.json i18n/core/din.json i18n/core/bho.json i18n/pagetranslation/mai.json i18n/core/mui.json i18n/core/io.json i18n/sandbox/br.json i18n/sandbox/hu.json i18n/sandbox/ja.json i18n/core/anp.json i18n/core/eu.json i18n/search/zgh.json i18n/search/azb.json i18n/pagetranslation/lv.json i18n/core/saz.json i18n/search/atj.json i18n/core/ka.json i18n/core/ru.json i18n/search/lt.json i18n/core/nn.json i18n/search/kk-cyrl.json i18n/core/btm.json i18n/sandbox/yi.json i18n/api/sr-ec.json i18n/core/bqi.json i18n/core/rm.json resources/js/ext.translate.editor.js i18n/pagetranslation/ro.json i18n/pagetranslation/gd.json resources/js/ext.translate.special.pagemigration.js i18n/sandbox/th.json i18n/search/ksh.json i18n/core/ce.json i18n/core/krl.json i18n/pagetranslation/si.json i18n/search/is.json i18n/api/is.json i18n/sandbox/sr-ec.json i18n/pagetranslation/jbo.json i18n/core/ch.json i18n/core/nb.json i18n/core/awa.json i18n/search/uz.json i18n/search/fr.json i18n/core/mo.json i18n/pagetranslation/ka.json i18n/pagetranslation/mad.json i18n/pagetranslation/kum.json i18n/core/kjp.json resources/js/ext.translate.messagerenamedialog.js i18n/api/fi.json i18n/core/gu.json i18n/api/sdc.json resources/js/ext.translate.special.searchtranslations.js i18n/api/tly.json i18n/core/lzh.json i18n/pagetranslation/scn.json i18n/sandbox/el.json i18n/search/sl.json i18n/pagetranslation/hrx.json i18n/pagetranslation/mnc.json i18n/sandbox/ko.json i18n/sandbox/pl.json i18n/pagetranslation/pnb.json i18n/search/om.json i18n/core/sh.json i18n/core/uk.json i18n/pagetranslation/ja.json i18n/core/ang.json i18n/pagetranslation/eu.json i18n/api/ksh.json resources/js/ext.translate.special.managegroups.js i18n/core/cy.json i18n/core/ms.json i18n/pagetranslation/lki.json i18n/pagetranslation/da.json i18n/core/mai.json i18n/pagetranslation/el.json i18n/api/vec.json i18n/pagetranslation/es.json i18n/sandbox/ms.json i18n/pagetranslation/lfn.json i18n/search/mwl.json i18n/pagetranslation/sc.json i18n/core/sdh.json i18n/core/or.json i18n/pagetranslation/rm.json i18n/sandbox/sh.json i18n/search/el.json i18n/pagetranslation/be.json i18n/pagetranslation/ba.json i18n/core/th.json i18n/core/nap.json i18n/pagetranslation/ie.json i18n/pagetranslation/su.json i18n/search/pms.json i18n/pagetranslation/ee.json i18n/pagetranslation/lzh.json i18n/search/zh-hans.json i18n/pagetranslation/kw.json i18n/sandbox/sco.json i18n/search/te.json i18n/core/kk-latn.json i18n/sandbox/zh-hans.json i18n/sandbox/en.json i18n/core/fur.json i18n/api/pnb.json i18n/sandbox/hyw.json i18n/api/nn.json i18n/core/dty.json i18n/sandbox/ku-latn.json i18n/sandbox/pt.json i18n/pagetranslation/jut.json i18n/api/skr-arab.json i18n/core/frp.json i18n/core/haw.json i18n/pagetranslation/ug-arab.json i18n/core/ilo.json i18n/api/tg-cyrl.json i18n/search/cv.json i18n/core/inh.json resources/js/ext.translate.storage.js i18n/pagetranslation/sr-ec.json i18n/core/abs.json resources/js/ext.translate.statsbar.js i18n/core/ceb.json i18n/sandbox/fa.json i18n/pagetranslation/saz.json i18n/search/nn.json i18n/pagetranslation/pdc.json i18n/pagetranslation/hu.json i18n/core/ami.json i18n/core/pms.json i18n/core/map-bms.json i18n/pagetranslation/ary.json i18n/core/la.json i18n/pagetranslation/io.json resources/js/ext.translate.proofread.js i18n/pagetranslation/csb.json i18n/search/ee.json resources/js/ext.translate.special.importtranslations.js i18n/core/ko.json resources/js/ext.translate.workflowselector.js i18n/sandbox/pt-br.json i18n/search/ps.json i18n/pagetranslation/inh.json i18n/pagetranslation/ann.json i18n/core/ro.json i18n/core/am.json i18n/core/tn.json i18n/sandbox/sr-el.json i18n/core/shy-latn.json i18n/sandbox/sa.json i18n/search/inh.json i18n/core/lrc.json i18n/pagetranslation/en.json i18n/sandbox/hr.json i18n/pagetranslation/lo.json i18n/pagetranslation/glk.json i18n/pagetranslation/fi.json i18n/core/ary.json i18n/pagetranslation/nap.json i18n/core/bjn.json resources/js/ext.translate.translationstashstorage.js data/plural-cldr.json i18n/core/mhr.json i18n/core/fon.json i18n/api/nap.json i18n/core/pdc.json i18n/sandbox/de-ch.json i18n/core/got.json resources/js/ext.translate.special.translationstats.js i18n/core/mrh.json i18n/core/ha.json i18n/api/ne.json i18n/api/ar.json i18n/search/my.json i18n/pagetranslation/cnr-latn.json i18n/core/be.json i18n/pagetranslation/sk.json i18n/core/mzn.json i18n/pagetranslation/bo.json extension.json i18n/search/sk.json i18n/core/pfl.json i18n/sandbox/wa.json i18n/core/sq.json i18n/pagetranslation/th.json i18n/pagetranslation/pms.json i18n/core/bpy.json i18n/sandbox/qu.json i18n/sandbox/cy.json i18n/pagetranslation/bgn.json i18n/core/fi.json i18n/sandbox/gl.json i18n/api/kk-cyrl.json i18n/core/cak.json i18n/core/trv.json composer.json i18n/core/zh-hans.json i18n/core/aln.json i18n/pagetranslation/ses.json i18n/pagetranslation/uk.json i18n/sandbox/sk.json i18n/api/gl.json i18n/sandbox/skr-arab.json i18n/core/yi.json resources/js/ext.translate.special.pagepreparation.js i18n/sandbox/lb.json i18n/pagetranslation/id.json i18n/search/qqq.json i18n/pagetranslation/shn.json i18n/core/stq.json i18n/core/lmo.json i18n/core/gor.json i18n/api/ro.json i18n/search/fy.json i18n/pagetranslation/ht.json i18n/core/de-formal.json i18n/core/ig.json i18n/core/arz.json i18n/core/bs.json i18n/pagetranslation/sd.json i18n/core/nys.json i18n/pagetranslation/nb.json i18n/pagetranslation/sms.json i18n/core/sgs.json i18n/api/sr-el.json i18n/search/bn.json i18n/core/sat.json i18n/core/pt.json i18n/pagetranslation/kcg.json i18n/pagetranslation/lt.json i18n/search/ka.json i18n/pagetranslation/tl.json i18n/core/gom-latn.json i18n/pagetranslation/yue.json i18n/core/gl.json resources/js/ext.translate.recentgroups.js i18n/pagetranslation/bho.json i18n/core/alt.json i18n/pagetranslation/oc.json i18n/pagetranslation/gcr.json i18n/pagetranslation/gv.json i18n/core/bcc.json i18n/pagetranslation/bs.json i18n/pagetranslation/he.json i18n/core/uz.json i18n/core/csb.json i18n/core/be-tarask.json i18n/core/skr-arab.json i18n/core/ext.json i18n/api/ku-latn.json i18n/core/rif.json i18n/api/vi.json i18n/pagetranslation/anp.json i18n/pagetranslation/ur.json i18n/core/sty.json i18n/core/ady-cyrl.json i18n/pagetranslation/nan.json i18n/api/eo.json i18n/sandbox/kjp.json i18n/pagetranslation/sah.json i18n/pagetranslation/mn.json i18n/core/udm.json i18n/pagetranslation/sty.json i18n/pagetranslation/ha.json i18n/search/pnb.json i18n/pagetranslation/lb.json i18n/core/ga.json i18n/search/vi.json i18n/core/gom-deva.json i18n/core/sd.json i18n/core/gv.json i18n/pagetranslation/gl.json i18n/core/su.json i18n/sandbox/diq.json i18n/api/pt-br.json i18n/sandbox/lki.json i18n/pagetranslation/lg.json i18n/pagetranslation/kbp.json i18n/pagetranslation/af.json i18n/core/jv.json i18n/core/fit.json i18n/core/pt-br.json i18n/core/krc.json i18n/pagetranslation/hak.json i18n/search/yi.json i18n/core/nqo.json i18n/pagetranslation/ace.json i18n/sandbox/bn.json i18n/core/hif-latn.json i18n/core/yo.json i18n/core/ur.json i18n/api/lt.json i18n/sandbox/fit.json i18n/sandbox/scn.json i18n/core/hyw.json i18n/sandbox/io.json i18n/core/mad.json i18n/search/ckb.json i18n/core/tt-latn.json i18n/core/en-gb.json i18n/core/cdo.json i18n/search/bs.json i18n/search/id.json i18n/sandbox/lt.json i18n/core/xmf.json i18n/search/gom-latn.json i18n/pagetranslation/smn.json i18n/pagetranslation/ban.json Gruntfile.js i18n/api/lv.json i18n/api/roa-tara.json i18n/core/av.json i18n/pagetranslation/vep.json i18n/pagetranslation/bug.json i18n/pagetranslation/nqo.json i18n/pagetranslation/hy.json i18n/api/id.json i18n/core/tyv.json i18n/pagetranslation/mo.json i18n/pagetranslation/te.json i18n/api/ka.json i18n/pagetranslation/pfl.json i18n/search/gcr.json i18n/pagetranslation/frr.json i18n/core/diq.json i18n/search/kn.json i18n/pagetranslation/jv.json i18n/search/az.json i18n/core/vec.json i18n/pagetranslation/de-formal.json i18n/sandbox/sq.json i18n/pagetranslation/khw.json i18n/api/bn.json i18n/pagetranslation/frp.json i18n/pagetranslation/ig.json tests/qunit/ext.translate.parsers.test.js i18n/core/frc.json i18n/core/mwl.json i18n/core/bgn.json i18n/search/lag.json i18n/pagetranslation/fo.json i18n/pagetranslation/gu.json i18n/api/hyw.json i18n/core/sli.json i18n/sandbox/mr.json i18n/api/mk.json i18n/core/pnb.json i18n/api/es.json i18n/core/fa.json i18n/core/mni.json i18n/api/wa.json i18n/pagetranslation/sw.json i18n/core/sr-el.json i18n/pagetranslation/bjn.json i18n/pagetranslation/ast.json i18n/core/aeb-latn.json i18n/core/as.json i18n/pagetranslation/cdo.json i18n/pagetranslation/dty.json i18n/sandbox/my.json i18n/search/cs.json i18n/pagetranslation/din.json i18n/pagetranslation/skr-arab.json i18n/search/sv.json i18n/core/vep.json i18n/core/is.json i18n/search/olo.json i18n/api/th.json i18n/pagetranslation/so.json i18n/core/zgh.json i18n/core/ann.json i18n/api/fit.json i18n/api/gu.json i18n/pagetranslation/sat.json i18n/pagetranslation/btm.json i18n/api/sv.json i18n/pagetranslation/es-formal.json resources/js/LanguagesMultiselectWidget.js i18n/core/avk.json i18n/core/kn.json i18n/pagetranslation/lag.json i18n/core/li.json i18n/core/zh-hant.json i18n/core/vi.json i18n/core/ia.json i18n/core/sl.json i18n/pagetranslation/hif-latn.json i18n/pagetranslation/wa.json i18n/core/bug.json i18n/api/my.json i18n/pagetranslation/hi.json i18n/core/pam.json i18n/pagetranslation/rej.json i18n/sandbox/hi.json i18n/pagetranslation/lzz.json i18n/core/eo.json i18n/search/fa.json i18n/core/azb.json i18n/core/cnr-latn.json i18n/core/xh.json i18n/sandbox/hsb.json i18n/api/he.json i18n/core/mr.json i18n/core/guw.json i18n/api/km.json i18n/search/lkt.json i18n/core/he.json i18n/pagetranslation/nl.json i18n/core/kw.json i18n/core/tet.json i18n/pagetranslation/udm.json i18n/pagetranslation/sv.json i18n/pagetranslation/ms.json i18n/search/be.json resources/js/ext.translate.editor.helpers.js i18n/pagetranslation/min.json i18n/pagetranslation/ti.json i18n/core/lus.json i18n/pagetranslation/bbc-latn.json i18n/api/qu.json i18n/search/sa.json i18n/core/lv.json i18n/api/sa.json i18n/sandbox/roa-tara.json i18n/pagetranslation/ta.json i18n/sandbox/ro.json i18n/api/sq.json i18n/pagetranslation/mwl.json i18n/pagetranslation/wo.json i18n/search/km.json i18n/search/ca.json i18n/pagetranslation/kk-cyrl.json i18n/pagetranslation/lij.json i18n/search/be-tarask.json i18n/core/bo.json i18n/search/sco.json i18n/search/et.json i18n/pagetranslation/av.json i18n/search/hsb.json i18n/core/tay.json i18n/core/tk.json i18n/core/te.json i18n/core/tcy.json i18n/core/dtp.json i18n/core/hr.json i18n/core/hak.json i18n/search/rue.json resources/js/ext.translate.translationstats.graphbuilder.js i18n/pagetranslation/ko.json i18n/core/grc.json i18n/sandbox/ksh.json i18n/core/gd.json i18n/sandbox/ps.json i18n/api/ast.json i18n/core/vo.json i18n/pagetranslation/en-gb.json i18n/pagetranslation/ps.json i18n/sandbox/de.json i18n/core/tzm.json i18n/sandbox/it.json i18n/pagetranslation/trv.json i18n/core/jam.json i18n/pagetranslation/kn.json i18n/pagetranslation/bg.json i18n/search/ig.json i18n/core/mnw.json i18n/sandbox/tyv.json i18n/core/ast.json i18n/sandbox/dsb.json i18n/sandbox/tr.json i18n/pagetranslation/cu.json i18n/pagetranslation/fa.json i18n/search/af.json i18n/sandbox/tcy.json i18n/api/lki.json resources/js/ext.translate.translationstats.embedded.js i18n/search/sr-el.json i18n/core/nl.json i18n/core/jut.json i18n/pagetranslation/sl.json i18n/search/hi.json i18n/pagetranslation/uz.json i18n/core/sa.json i18n/core/rue.json i18n/core/el.json i18n/sandbox/es.json i18n/search/th.json i18n/core/lag.json i18n/core/ja.json i18n/core/tt-cyrl.json resources/js/ext.translate.special.translationstash.js i18n/core/kk-cyrl.json i18n/search/dsb.json i18n/core/et.json i18n/core/ss.json i18n/core/hrx.json i18n/sandbox/mk.json i18n/pagetranslation/gaa.json i18n/pagetranslation/bcl.json i18n/pagetranslation/bxr.json i18n/pagetranslation/eo.json i18n/pagetranslation/ru.json resources/js/ext.translate.special.operatorsuggest.js i18n/pagetranslation/mni.json i18n/search/ce.json i18n/api/tt-cyrl.json i18n/pagetranslation/ia.json i18n/core/ses.json i18n/pagetranslation/fit.json i18n/pagetranslation/arc.json i18n/core/lo.json i18n/api/zh-hans.json i18n/core/pl.json i18n/core/nso.json i18n/search/eu.json i18n/core/rtm.json i18n/search/kiu.json i18n/search/vec.json i18n/core/ml.json i18n/pagetranslation/et.json i18n/core/sc.json i18n/core/scn.json i18n/core/rej.json i18n/search/ro.json i18n/core/gld.json i18n/api/hu.json i18n/api/ta.json i18n/core/ksw.json i18n/core/lfn.json i18n/search/krc.json i18n/search/hu.json i18n/core/kaa.json resources/js/ext.translate.special.pagetranslation.js i18n/pagetranslation/tzm.json i18n/sandbox/uk.json i18n/search/ar.json resources/js/ext.translate.messagetable.js i18n/core/frr.json i18n/pagetranslation/pl.json i18n/pagetranslation/awa.json i18n/search/kjp.json i18n/pagetranslation/krc.json i18n/core/atj.json i18n/pagetranslation/ilo.json i18n/core/sr-ec.json i18n/api/yi.json i18n/search/cu.json i18n/core/shn.json i18n/pagetranslation/de.json i18n/core/khw.json i18n/search/sr-ec.json i18n/pagetranslation/ami.json i18n/core/aeb-arab.json i18n/pagetranslation/bn.json i18n/core/ps.json i18n/search/hr.json i18n/core/sk.json i18n/core/bcl.json i18n/sandbox/km.json i18n/pagetranslation/xsy.json i18n/core/ht.json i18n/core/tg-cyrl.json i18n/core/si.json i18n/core/kri.json i18n/core/tl.json i18n/api/yue.json package.json i18n/pagetranslation/is.json i18n/search/uk.json i18n/pagetranslation/rue.json i18n/pagetranslation/sh.json i18n/core/smn.json i18n/core/min.json i18n/core/km.json i18n/pagetranslation/dsb.json i18n/api/ca.json package-lock.json i18n/core/fy.json i18n/pagetranslation/pam.json i18n/sandbox/lag.json i18n/core/nan.json i18n/pagetranslation/roa-tara.json i18n/core/ca.json i18n/core/ar.json i18n/search/nl.json i18n/pagetranslation/pa.json i18n/core/es.json i18n/core/nah.json i18n/search/nb.json i18n/core/kk-arab.json i18n/core/arq.json i18n/pagetranslation/br.json i18n/core/ff.json i18n/search/he.json i18n/pagetranslation/myv.json i18n/pagetranslation/got.json i18n/search/ne.json i18n/pagetranslation/kbd-cyrl.json i18n/core/niu.json i18n/core/bn.json i18n/core/wuu.json i18n/pagetranslation/or.json i18n/api/fy.json i18n/core/szy.json i18n/core/hi.json i18n/pagetranslation/vec.json i18n/pagetranslation/ce.json i18n/api/hi.json i18n/pagetranslation/gsw.json i18n/pagetranslation/nah.json i18n/search/diq.json i18n/core/af.json i18n/pagetranslation/lld.json i18n/sandbox/ru.json i18n/core/kea.json i18n/pagetranslation/ga.json i18n/search/fit.json i18n/api/fr.json i18n/core/fo.json i18n/pagetranslation/sdc.json i18n/pagetranslation/vro.json i18n/api/eu.json i18n/search/lzh.json i18n/core/tg-latn.json i18n/sandbox/af.json i18n/core/szl.json i18n/search/tay.json i18n/search/pl.json i18n/pagetranslation/kiu.json i18n/core/ne.json tests/phpunit/data/jsontest_fi.json i18n/pagetranslation/ky.json i18n/core/de-ch.json i18n/pagetranslation/bar.json i18n/core/luz.json i18n/core/gaa.json i18n/core/fr.json i18n/pagetranslation/tg-cyrl.json i18n/core/sdc.json i18n/api/pdc.json resources/js/ext.translate.parsers.js i18n/core/az.json i18n/pagetranslation/sq.json i18n/api/uk.json i18n/core/sw.json resources/js/ext.translate.base.js i18n/search/eo.json i18n/search/sd.json i18n/core/sco.json i18n/pagetranslation/arz.json i18n/core/shi.json i18n/core/en.json i18n/core/tokipona.json i18n/sandbox/qqq.json i18n/pagetranslation/vo.json i18n/api/sah.json i18n/pagetranslation/mr.json i18n/pagetranslation/yo.json i18n/core/lt.json i18n/pagetranslation/pt.json i18n/core/myv.json i18n/search/wa.json i18n/core/mk.json i18n/pagetranslation/war.json i18n/sandbox/mt.json i18n/core/kab.json i18n/pagetranslation/gor.json i18n/search/yue.json i18n/api/da.json i18n/api/lb.json i18n/pagetranslation/avk.json i18n/core/dsb.json i18n/pagetranslation/ca.json i18n/core/hy.json i18n/api/fa.json i18n/search/ast.json i18n/pagetranslation/stq.json i18n/search/sq.json i18n/api/ckb.json i18n/core/nia.json i18n/core/oc.json i18n/pagetranslation/fr.json i18n/search/ru.json i18n/sandbox/en-gb.json i18n/search/scn.json i18n/api/ja.json i18n/pagetranslation/hsb.json i18n/sandbox/fi.json i18n/search/ia.json i18n/pagetranslation/be-tarask.json resources/js/ext.translate.edit.documentation.js i18n/pagetranslation/sa.json i18n/pagetranslation/grc.json i18n/core/ckb.json i18n/core/ace.json i18n/pagetranslation/shy-latn.json i18n/pagetranslation/cy.json i18n/sandbox/be.json i18n/search/tg-cyrl.json i18n/search/pt-br.json i18n/api/be-tarask.json i18n/pagetranslation/it.json i18n/pagetranslation/ckb.json i18n/search/gl.json resources/js/ext.translate.pagemode.js i18n/core/hu.json i18n/search/tr.json i18n/sandbox/da.json i18n/search/shy-latn.json i18n/search/da.json i18n/core/bg.json i18n/search/lb.json i18n/core/ky.json i18n/core/bbc-latn.json i18n/search/qu.json i18n/sandbox/lv.json i18n/core/tly.json i18n/api/ms.json i18n/core/de.json -f json
[{"filePath":"/src/repo/Gruntfile.js","messages":[{"ruleId":"compat/compat","severity":2,"message":"Object.assign() is not supported in Safari 5.1, iOS Safari 6.0-6.1, IE 11","line":32,"column":11,"nodeType":"MemberExpression","endLine":32,"endColumn":24}],"errorCount":1,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n/* eslint-env node */\nmodule.exports = function ( grunt ) {\n\tvar conf = grunt.file.readJSON( 'extension.json' );\n\n\tgrunt.loadNpmTasks( 'grunt-eslint' );\n\tgrunt.loadNpmTasks( 'grunt-banana-checker' );\n\tgrunt.loadNpmTasks( 'grunt-stylelint' );\n\n\tgrunt.initConfig( {\n\t\teslint: {\n\t\t\toptions: {\n\t\t\t\tcache: true,\n\t\t\t\tfix: grunt.option( 'fix' )\n\t\t\t},\n\t\t\tall: [\n\t\t\t\t'**/*.{js,json}',\n\t\t\t\t'!resources/lib/**',\n\t\t\t\t'!{vendor,node_modules}/**'\n\t\t\t]\n\t\t},\n\t\tstylelint: {\n\t\t\tall: [\n\t\t\t\t'**/*.css',\n\t\t\t\t'**/*.less',\n\t\t\t\t'!node_modules/**',\n\t\t\t\t'!vendor/**',\n\t\t\t\t'!resources/lib/**'\n\t\t\t]\n\t\t},\n\t\t// eslint-disable-next-line es/no-object-assign\n\t\tbanana: Object.assign( conf.MessagesDirs, {\n\t\t\toptions: {\n\t\t\t\trequireLowerCase: 'initial'\n\t\t\t}\n\t\t} )\n\t} );\n\n\tgrunt.registerTask( 'test', [ 'eslint', 'banana', 'stylelint' ] );\n\tgrunt.registerTask( 'default', 'test' );\n};\n","usedDeprecatedRules":[]},{"filePath":"/src/repo/composer.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/data/plural-cldr.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/extension.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/af.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/ar.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/ast.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/awa.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/bcl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/be-tarask.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/bg.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/bn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/bs.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/ca.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/ce.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/ckb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/cs.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/da.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/de.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/diq.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/en.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/eo.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/es.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/eu.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/fa.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/fi.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/fit.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/fr.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/fy.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/gl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/gu.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/he.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/hi.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/hr.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/hu.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/hyw.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/ia.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/id.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/io.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/is.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/it.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/ja.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/ka.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/kab.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/kjp.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/kk-cyrl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/km.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/ko.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/ksh.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/ku-latn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/lb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/li.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/lki.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/lt.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/lv.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/mk.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/ms.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/my.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/nap.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/nb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/nds-nl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/ne.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/nl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/nn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/oc.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/pam.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/pdc.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/pl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/pnb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/ps.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/pt-br.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/pt.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/qqq.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/qu.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/ro.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/roa-tara.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/ru.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/sa.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/sah.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/sdc.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/skr-arab.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/sq.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/sr-ec.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/sr-el.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/sv.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/sw.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/ta.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/tg-cyrl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/th.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/tl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/tly.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/tr.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/tt-cyrl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/uk.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/vec.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/vi.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/wa.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/yi.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/yue.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/zh-hans.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/api/zh-hant.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/abs.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ace.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ady-cyrl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/aeb-arab.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/aeb-latn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/af.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/aln.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/alt.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/am.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ami.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/an.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ang.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ann.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/anp.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ar.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/arc.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/arn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/arq.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ary.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/arz.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/as.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ast.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/atj.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/av.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/avk.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/awa.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/az.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/azb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ba.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ban.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/bar.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/bbc-latn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/bcc.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/bci.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/bcl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/be-tarask.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/be.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/bg.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/bgn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/bho.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/bjn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/bn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/bo.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/bpy.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/bqi.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/br.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/bs.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/btm.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/bug.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/bxr.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ca.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/cak.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/cdo.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ce.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ceb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ch.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ciw.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ckb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/cnr-latn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/cop.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/cs.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/csb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/cu.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/cv.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/cy.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/da.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/de-ch.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/de-formal.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/de.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/din.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/diq.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/dsb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/dtp.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/dty.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ee.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/el.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/en-gb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/en.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/eo.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/es.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/et.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/eu.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ext.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/fa.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ff.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/fi.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/fit.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/fo.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/fon.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/fr.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/frc.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/frp.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/frr.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/fur.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/fy.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ga.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/gaa.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/gcr.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/gd.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/gl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/gld.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/glk.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/gom-deva.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/gom-latn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/gor.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/got.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/grc.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/gsw.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/gu.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/guc.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/guw.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/gv.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ha.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/hak.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/haw.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/he.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/hi.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/hif-latn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/hil.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/hr.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/hrx.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/hsb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ht.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/hu.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/hy.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/hyw.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ia.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/id.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ig.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ilo.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/inh.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/io.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/is.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/it.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ja.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/jam.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/jbo.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/jut.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/jv.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ka.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/kaa.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/kab.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/kbd-cyrl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/kbp.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/kcg.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/kea.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/khw.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/kiu.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/kjp.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/kk-arab.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/kk-cyrl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/kk-kz.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/kk-latn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/kl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/km.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/kn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ko.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/krc.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/kri.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/krl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ksh.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ksw.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ku-latn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/kum.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/kw.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ky.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/la.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/lag.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/lb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/lfn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/lg.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/li.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/lij.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/lki.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/lld.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/lmo.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ln.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/lo.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/lrc.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/lt.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ltg.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/lus.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/luz.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/lv.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/lzh.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/lzz.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/mad.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/mai.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/map-bms.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/mg.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/mhr.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/min.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/mk.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ml.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/mn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/mnc.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/mni.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/mnw.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/mo.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/mr.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/mrh.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ms.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/mt.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/mui.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/mwl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/my.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/myv.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/mzn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/nah.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/nan.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/nap.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/nb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/nds-nl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/nds.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ne.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/nia.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/niu.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/nl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/nn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/nqo.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/nso.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ny.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/nys.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/oc.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/olo.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/or.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/os.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/pa.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/pam.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/pap.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/pcd.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/pdc.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/pfl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/pl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/pms.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/pnb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ps.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/pt-br.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/pt.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/qqq.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/qu.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/rej.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/rif.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/rm.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ro.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/roa-tara.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/rtm.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ru.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/rue.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/sa.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/sah.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/sat.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/saz.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/sc.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/scn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/sco.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/sd.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/sdc.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/sdh.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/se.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ses.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/sgs.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/sh.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/shi.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/shn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/shy-latn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/si.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/sk.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/skr-arab.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/sl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/sli.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/smn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/sms.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/so.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/sq.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/sr-ec.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/sr-el.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ss.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/stq.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/sty.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/su.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/sv.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/sw.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/szl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/szy.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ta.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/tay.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/tcy.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/te.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/tet.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/tg-cyrl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/tg-latn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/th.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ti.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/tk.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/tl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/tly.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/tn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/tokipona.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/tr.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/tru.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/trv.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/tt-cyrl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/tt-latn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/tyv.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/tzm.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/udm.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ug-arab.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ug-latn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/uk.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/ur.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/uz.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/vec.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/vep.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/vi.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/vo.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/vro.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/wa.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/war.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/wo.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/wuu.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/xal.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/xh.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/xmf.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/xsy.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/yi.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/yo.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/yue.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/za.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/zgh.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/zh-hans.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/core/zh-hant.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/abs.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/ace.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/ady-cyrl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/aeb-latn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/af.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/alt.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/ami.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/ang.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/ann.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/anp.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/ar.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/arc.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/arq.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/ary.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/arz.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/as.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/ast.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/atj.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/av.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/avk.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/awa.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/az.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/azb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/ba.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/ban.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/bar.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/bbc-latn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/bcc.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/bcl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/be-tarask.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/be.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/bg.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/bgn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/bho.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/bjn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/bm.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/bn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/bo.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/bqi.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/br.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/bs.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/btm.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/bug.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/bxr.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/ca.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/cdo.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/ce.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/ceb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/ckb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/cnr-latn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/cs.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/csb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/cu.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/cy.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/da.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/de-formal.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/de.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/din.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/diq.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/dsb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/dty.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/ee.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/el.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/en-gb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/en.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/eo.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/es-formal.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/es.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/et.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/eu.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/fa.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/ff.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/fi.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/fit.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/fo.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/fr.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/frp.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/frr.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/fur.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/fy.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/ga.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/gaa.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/gcr.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/gd.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/gl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/glk.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/gom-deva.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/gom-latn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/gor.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/got.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/grc.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/gsw.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/gu.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/guc.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/gv.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/ha.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/hak.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/he.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/hi.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/hif-latn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/hr.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/hrx.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/hsb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/ht.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/hu.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/hy.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/hyw.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/ia.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/id.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/ie.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/ig.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/ilo.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/inh.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/io.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/is.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/it.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/ja.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/jam.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/jbo.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/jut.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/jv.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/ka.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/kab.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/kbd-cyrl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/kbp.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/kcg.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/khw.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/kiu.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/kjp.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/kk-cyrl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/km.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/kn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/ko.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/krc.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/krl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/ksh.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/ksw.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/ku-latn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/kum.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/kw.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/ky.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/lag.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/lb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/lfn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/lg.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/li.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/lij.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/lki.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/lld.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/lmo.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/lo.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/lrc.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/lt.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/ltg.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/luz.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/lv.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/lzh.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/lzz.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/mad.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/mai.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/mg.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/min.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/mk.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/ml.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/mn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/mnc.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/mni.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/mnw.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/mo.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/mr.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/mrh.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/ms.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/mt.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/mwl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/my.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/myv.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/mzn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/nah.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/nan.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/nap.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/nb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/nds-nl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/ne.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/nia.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/nl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/nn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/nqo.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/nys.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/oc.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/olo.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/or.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/pa.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/pam.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/pcd.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/pdc.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/pfl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/pl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/pms.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/pnb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/ps.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/pt-br.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/pt.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/qqq.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/qu.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/rej.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/rm.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/ro.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/roa-tara.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/ru.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/rue.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/sa.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/sah.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/sat.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/saz.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/sc.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/scn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/sco.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/sd.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/sdc.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/sdh.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/se.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/ses.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/sgs.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/sh.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/shi.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/shn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/shy-latn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/si.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/sk.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/skr-arab.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/sl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/sli.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/smn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/sms.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/so.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/sq.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/sr-ec.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/sr-el.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/stq.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/sty.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/su.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/sv.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/sw.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/szl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/szy.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/ta.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/tay.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/tcy.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/te.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/tg-cyrl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/th.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/ti.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/tk.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/tl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/tly.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/tr.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/trv.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/tt-cyrl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/tzm.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/udm.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/ug-arab.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/uk.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/ur.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/uz.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/vec.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/vep.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/vi.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/vo.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/vro.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/wa.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/war.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/wo.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/wuu.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/xmf.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/xsy.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/yi.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/yo.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/yue.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/zgh.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/zh-hans.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pagetranslation/zh-hant.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/af.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/ar.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/ast.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/be.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/bg.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/bn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/br.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/bs.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/ce.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/cs.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/cy.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/da.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/de-ch.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/de.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/diq.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/dsb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/el.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/en-gb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/en.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/eo.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/es.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/et.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/eu.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/fa.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/fi.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/fit.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/fr.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/fy.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/gl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/gu.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/he.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/hi.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/hr.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/hsb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/hu.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/hy.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/hyw.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/ia.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/id.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/io.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/is.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/it.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/ja.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/ka.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/kab.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/kjp.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/kk-cyrl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/km.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/ko.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/ksh.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/ku-latn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/lag.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/lb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/lki.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/lrc.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/lt.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/lv.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/mk.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/mr.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/ms.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/mt.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/my.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/nb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/ne.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/nl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/oc.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/pl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/pnb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/ps.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/pt-br.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/pt.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/qqq.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/qu.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/ro.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/roa-tara.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/ru.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/sa.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/sah.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/scn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/sco.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/sd.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/sh.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/sk.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/skr-arab.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/sq.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/sr-ec.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/sr-el.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/sv.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/sw.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/ta.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/tcy.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/te.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/tg-cyrl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/th.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/tr.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/tt-cyrl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/tyv.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/uk.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/vi.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/wa.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/yi.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/yo.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/zh-hans.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sandbox/zh-hant.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/af.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/ar.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/as.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/ast.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/atj.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/az.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/azb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/be-tarask.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/be.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/bg.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/bn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/br.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/bs.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/ca.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/ce.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/ckb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/cs.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/cu.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/cv.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/da.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/de.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/diq.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/dsb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/ee.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/el.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/en.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/eo.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/es.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/et.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/eu.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/fa.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/fi.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/fit.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/fo.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/fr.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/fy.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/gcr.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/gl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/gom-deva.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/gom-latn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/gu.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/he.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/hi.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/hr.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/hsb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/hu.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/ia.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/id.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/ig.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/ilo.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/inh.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/io.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/is.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/it.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/ja.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/ka.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/kab.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/kiu.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/kjp.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/kk-cyrl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/km.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/kn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/ko.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/krc.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/krl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/ksh.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/ku-latn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/lag.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/lb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/lfn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/lki.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/lkt.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/lrc.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/lt.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/lv.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/lzh.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/mk.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/mr.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/ms.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/mwl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/my.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/nah.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/nb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/ne.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/nl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/nn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/oc.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/olo.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/om.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/pl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/pms.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/pnb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/ps.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/pt-br.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/pt.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/qqq.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/qu.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/ro.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/roa-tara.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/ru.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/rue.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/sa.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/scn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/sco.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/sd.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/shn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/shy-latn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/sk.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/sl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/sq.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/sr-ec.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/sr-el.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/sv.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/szy.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/tay.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/tcy.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/te.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/tg-cyrl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/th.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/ti.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/tr.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/tt-cyrl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/udm.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/uk.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/uz.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/vec.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/vi.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/wa.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/yi.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/yue.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/zgh.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/zh-hans.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/search/zh-hant.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/package-lock.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/package.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/resources/js/LanguagesMultiselectWidget.js","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/resources/js/ext.translate.base.js","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/resources/js/ext.translate.dropdownmenu.js","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/resources/js/ext.translate.edit.documentation.js","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/resources/js/ext.translate.editor.helpers.js","messages":[{"ruleId":"mediawiki/class-doc","severity":1,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":198,"column":4,"nodeType":"CallExpression","endLine":203,"endColumn":37}],"errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * Translate editor additional helper functionality\n */\n( function () {\n\t'use strict';\n\n\tvar translateEditorHelpers = {\n\t\tshowDocumentationEditor: function () {\n\t\t\tvar $infoColumnBlock = this.$editor.find( '.infocolumn-block' ),\n\t\t\t\t$editColumn = this.$editor.find( '.editcolumn' ),\n\t\t\t\t$messageDescEditor = $infoColumnBlock.find( '.message-desc-editor' ),\n\t\t\t\t$messageDescViewer = $infoColumnBlock.find( '.message-desc-viewer' );\n\n\t\t\t$infoColumnBlock\n\t\t\t\t.removeClass( 'five' )\n\t\t\t\t.addClass( 'seven' );\n\t\t\t$editColumn\n\t\t\t\t.removeClass( 'seven' )\n\t\t\t\t.addClass( 'five' );\n\n\t\t\t$messageDescViewer.addClass( 'hide' );\n\n\t\t\t$messageDescEditor.removeClass( 'hide' );\n\t\t\t$messageDescEditor.find( '.tux-textarea-documentation' ).trigger( 'focus' );\n\n\t\t\t// So that the link won't be followed\n\t\t\treturn false;\n\t\t},\n\n\t\thideDocumentationEditor: function () {\n\t\t\tvar $infoColumnBlock = this.$editor.find( '.infocolumn-block' ),\n\t\t\t\t$editColumn = this.$editor.find( '.editcolumn' ),\n\t\t\t\t$messageDescEditor = $infoColumnBlock.find( '.message-desc-editor' ),\n\t\t\t\t$messageDescViewer = $infoColumnBlock.find( '.message-desc-viewer' );\n\n\t\t\t$infoColumnBlock\n\t\t\t\t.removeClass( 'seven' )\n\t\t\t\t.addClass( 'five' );\n\t\t\t$editColumn\n\t\t\t\t.removeClass( 'five' )\n\t\t\t\t.addClass( 'seven' );\n\n\t\t\t$messageDescEditor.addClass( 'hide' );\n\t\t\t$messageDescViewer.removeClass( 'hide' );\n\t\t},\n\n\t\t/**\n\t\t * Save the documentation\n\t\t *\n\t\t * @return {jQuery.Promise}\n\t\t */\n\t\tsaveDocumentation: function () {\n\t\t\tvar translateEditor = this,\n\t\t\t\tapi = new mw.Api(),\n\t\t\t\tnewDocumentation = translateEditor.$editor.find( '.tux-textarea-documentation' ).val();\n\n\t\t\treturn api.postWithToken( 'csrf', {\n\t\t\t\taction: 'edit',\n\t\t\t\ttitle: translateEditor.message.title\n\t\t\t\t\t.replace( /\\/[a-z-]+$/, '/' + mw.config.get( 'wgTranslateDocumentationLanguageCode' ) ),\n\t\t\t\ttext: newDocumentation\n\t\t\t} ).done( function ( response ) {\n\t\t\t\tvar $messageDesc = translateEditor.$editor.find( '.infocolumn-block .message-desc' );\n\n\t\t\t\tif ( response.edit.result === 'Success' ) {\n\t\t\t\t\tapi.parse(\n\t\t\t\t\t\tnewDocumentation\n\t\t\t\t\t).done( function ( parsedDocumentation ) {\n\t\t\t\t\t\t$messageDesc.html( parsedDocumentation );\n\t\t\t\t\t} ).fail( function ( errorCode, results ) {\n\t\t\t\t\t\t// Note: It is possible for results to be undefined.\n\t\t\t\t\t\tvar errorInfo = results && results.error ? results.error.info : 'No information';\n\t\t\t\t\t\t$messageDesc.html( newDocumentation );\n\t\t\t\t\t\tmw.log( 'Error parsing documentation ' + errorCode + ' ' + errorInfo );\n\t\t\t\t\t} ).always( function () {\n\t\t\t\t\t\t// A collapsible element etc. may have been added\n\t\t\t\t\t\tmw.hook( 'wikipage.content' ).fire( $messageDesc );\n\t\t\t\t\t\ttranslateEditor.hideDocumentationEditor();\n\t\t\t\t\t} );\n\t\t\t\t} else {\n\t\t\t\t\tmw.notify( 'Error saving message documentation' );\n\t\t\t\t\tmw.log( 'Error saving documentation', response );\n\t\t\t\t}\n\t\t\t} ).fail( function ( errorCode, results ) {\n\t\t\t\tmw.notify( 'Error saving message documentation' );\n\t\t\t\tmw.log( 'Error saving documentation', errorCode, results );\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t * Shows the message documentation.\n\t\t *\n\t\t * @param {Object} documentation A documentation object as returned by API.\n\t\t */\n\t\tshowMessageDocumentation: function ( documentation ) {\n\t\t\tvar $descEditLink,\n\t\t\t\tdocumentationDir,\n\t\t\t\texpand,\n\t\t\t\t$messageDescViewer,\n\t\t\t\t$messageDoc,\n\t\t\t\treadMore,\n\t\t\t\tlangAttr,\n\t\t\t\t$readMore = null;\n\n\t\t\tif ( !mw.config.get( 'wgTranslateDocumentationLanguageCode' ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t$messageDescViewer = this.$editor.find( '.message-desc-viewer' );\n\t\t\t$descEditLink = $messageDescViewer.find( '.message-desc-edit' );\n\t\t\t$messageDoc = $messageDescViewer.find( '.message-desc' );\n\n\t\t\t// Display the documentation only if it's not empty and\n\t\t\t// documentation language is configured\n\t\t\tif ( documentation.error ) {\n\t\t\t\t// TODO: better error handling, especially since the presence of documentation\n\t\t\t\t// is heavily hinted at in the UI\n\t\t\t\treturn;\n\t\t\t} else if ( documentation.value ) {\n\t\t\t\tdocumentationDir = $.uls.data.getDir( documentation.language );\n\n\t\t\t\t// Show the documentation and set appropriate\n\t\t\t\t// lang and dir attributes.\n\t\t\t\t// The message documentation is assumed to be written\n\t\t\t\t// in the content language of the wiki.\n\t\t\t\tlangAttr = {\n\t\t\t\t\tlang: documentation.language,\n\t\t\t\t\tdir: documentationDir\n\t\t\t\t};\n\n\t\t\t\t// Possible classes:\n\t\t\t\t// * mw-content-ltr\n\t\t\t\t// * mw-content-rtl\n\t\t\t\t// (The direction classes are needed, because the documentation\n\t\t\t\t// is likely to be MediaWiki-formatted text.)\n\t\t\t\t$messageDoc\n\t\t\t\t\t.attr( langAttr )\n\t\t\t\t\t.addClass( 'mw-content-' + documentationDir )\n\t\t\t\t\t.html( documentation.html );\n\n\t\t\t\t$messageDoc.find( 'a[href]' ).prop( 'target', '_blank' );\n\n\t\t\t\tthis.$editor.find( '.tux-textarea-documentation' )\n\t\t\t\t\t.attr( langAttr )\n\t\t\t\t\t.val( documentation.value );\n\n\t\t\t\t$descEditLink.text( mw.msg( 'tux-editor-edit-desc' ) );\n\n\t\t\t\tif ( documentation.html.length > 500 ) {\n\t\t\t\t\texpand = function () {\n\t\t\t\t\t\t$messageDoc.removeClass( 'compact' );\n\t\t\t\t\t\t$readMore.text( mw.msg( 'tux-editor-message-desc-less' ) );\n\t\t\t\t\t};\n\n\t\t\t\t\treadMore = function () {\n\t\t\t\t\t\tif ( $messageDoc.hasClass( 'compact' ) ) {\n\t\t\t\t\t\t\texpand();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$messageDoc.addClass( 'compact' );\n\t\t\t\t\t\t\t$readMore.text( mw.msg( 'tux-editor-message-desc-more' ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\t$readMore = $( '<span>' )\n\t\t\t\t\t\t.addClass( 'read-more column' )\n\t\t\t\t\t\t.text( mw.msg( 'tux-editor-message-desc-more' ) )\n\t\t\t\t\t\t.on( 'click', readMore );\n\n\t\t\t\t\t$messageDescViewer.find( '.message-desc-control' )\n\t\t\t\t\t\t.prepend( $readMore );\n\n\t\t\t\t\t$messageDoc.addClass( 'long compact' ).on( 'mouseenter mouseleave', expand );\n\t\t\t\t}\n\n\t\t\t\t// Enable dynamic content, such as collapsible elements\n\t\t\t\tmw.hook( 'wikipage.content' ).fire( $messageDoc );\n\t\t\t} else {\n\t\t\t\t$descEditLink.text( mw.msg( 'tux-editor-add-desc' ) );\n\t\t\t}\n\n\t\t\t$messageDescViewer.removeClass( 'hide' );\n\t\t},\n\n\t\t/**\n\t\t * Shows uneditable documentation.\n\t\t *\n\t\t * @param {Object} documentation A gettext object as returned by API.\n\t\t */\n\t\tshowUneditableDocumentation: function ( documentation ) {\n\t\t\tvar dir;\n\n\t\t\tif ( documentation.error ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdir = $.uls.data.getDir( documentation.language );\n\n\t\t\tthis.$editor.find( '.uneditable-documentation' )\n\t\t\t\t.attr( {\n\t\t\t\t\tlang: documentation.language,\n\t\t\t\t\tdir: dir\n\t\t\t\t} )\n\t\t\t\t.addClass( 'mw-content-' + dir )\n\t\t\t\t.html( documentation.html )\n\t\t\t\t.removeClass( 'hide' );\n\t\t},\n\n\t\t/**\n\t\t * Shows the translations from other languages\n\t\t *\n\t\t * @param {Array} translations An inotherlanguages array as returned by the translation helpers API.\n\t\t */\n\t\tshowAssistantLanguages: function ( translations ) {\n\t\t\tvar $elements;\n\n\t\t\tif ( translations.error ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( !translations.length ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t$elements = translations.map( function ( translation ) {\n\t\t\t\tvar $element, langAttr;\n\n\t\t\t\tlangAttr = {\n\t\t\t\t\tlang: translation.language,\n\t\t\t\t\tdir: $.uls.data.getDir( translation.language )\n\t\t\t\t};\n\n\t\t\t\t$element = $( '<div>' )\n\t\t\t\t\t.addClass( 'row in-other-language' )\n\t\t\t\t\t.append(\n\t\t\t\t\t\t$( '<div>' )\n\t\t\t\t\t\t\t.addClass( 'nine columns suggestiontext' )\n\t\t\t\t\t\t\t.attr( langAttr )\n\t\t\t\t\t\t\t.text( translation.value ),\n\t\t\t\t\t\t$( '<div>' )\n\t\t\t\t\t\t\t.addClass( 'three columns language text-right' )\n\t\t\t\t\t\t\t.attr( langAttr )\n\t\t\t\t\t\t\t.text( $.uls.data.getAutonym( translation.language ) )\n\t\t\t\t\t);\n\n\t\t\t\tthis.suggestionAdder( $element, translation.value );\n\n\t\t\t\treturn $element;\n\t\t\t}.bind( this ) );\n\n\t\t\tthis.$editor.find( '.in-other-languages-title' )\n\t\t\t\t.removeClass( 'hide' )\n\t\t\t\t.after( $elements );\n\t\t},\n\n\t\t/**\n\t\t * Shows the translation suggestions from Translation Memory\n\t\t *\n\t\t * @param {Array} translations A ttmserver array as returned by API.\n\t\t */\n\t\tshowTranslationMemory: function ( translations ) {\n\t\t\tvar $heading, $tmSuggestions, $messageList, lang, dir,\n\t\t\t\tsuggestions = {};\n\n\t\t\tif ( !translations.length ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Container for the suggestions\n\t\t\t$tmSuggestions = $( '<div>' ).addClass( 'tm-suggestions' );\n\n\t\t\t$heading = this.$editor.find( '.tm-suggestions-title' );\n\t\t\t$heading.after( $tmSuggestions );\n\n\t\t\t$messageList = $( '.tux-messagelist' );\n\t\t\tlang = $messageList.data( 'targetlangcode' );\n\t\t\tdir = $messageList.data( 'targetlangdir' );\n\n\t\t\ttranslations.forEach( function ( translation ) {\n\t\t\t\tvar suggestion;\n\n\t\t\t\t// Remove once formatversion=2\n\t\t\t\tif ( translation.local === '' ) {\n\t\t\t\t\ttranslation.local = true;\n\t\t\t\t} else if ( translation.local === undefined ) {\n\t\t\t\t\ttranslation.local = false;\n\t\t\t\t}\n\n\t\t\t\tif ( translation.local && translation.location === this.message.title ) {\n\t\t\t\t\t// Do not add self-suggestions\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Check if suggestion with this value already exists\n\t\t\t\tsuggestion = suggestions[ translation.target ];\n\t\t\t\tif ( suggestion ) {\n\t\t\t\t\tsuggestion.count++;\n\t\t\t\t\tsuggestion.sources.push( translation );\n\t\t\t\t\tsuggestion.$showSourcesElement.children( 'a' ).text(\n\t\t\t\t\t\tmw.msg(\n\t\t\t\t\t\t\t'tux-editor-n-uses',\n\t\t\t\t\t\t\tmw.language.convertNumber( suggestion.count )\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tsuggestion = {};\n\n\t\t\t\tsuggestion.$showSourcesElement = $( '<div>' )\n\t\t\t\t\t.addClass( 'text-right columns twelve' )\n\t\t\t\t\t.append( $( '<a>' ).addClass( 'n-uses' ) );\n\n\t\t\t\tsuggestion.$element = $( '<div>' )\n\t\t\t\t\t.addClass( 'row tm-suggestion' )\n\t\t\t\t\t.append(\n\t\t\t\t\t\t$( '<div>' )\n\t\t\t\t\t\t\t.addClass( 'nine columns suggestiontext' )\n\t\t\t\t\t\t\t.attr( {\n\t\t\t\t\t\t\t\tlang: lang,\n\t\t\t\t\t\t\t\tdir: dir\n\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t.text( translation.target ),\n\t\t\t\t\t\t$( '<div>' )\n\t\t\t\t\t\t\t.addClass( 'three columns quality text-right' )\n\t\t\t\t\t\t\t.text(\n\t\t\t\t\t\t\t\tmw.msg(\n\t\t\t\t\t\t\t\t\t'tux-editor-tm-match',\n\t\t\t\t\t\t\t\t\tmw.language.convertNumber( Math.floor( translation.quality * 100 ) )\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\tsuggestion.$showSourcesElement\n\t\t\t\t\t);\n\n\t\t\t\tsuggestion.count = 1;\n\t\t\t\tsuggestion.sources = [];\n\t\t\t\tsuggestion.sources.push( translation );\n\n\t\t\t\tthis.suggestionAdder( suggestion.$element, translation.target );\n\n\t\t\t\tsuggestions[ translation.target ] = suggestion;\n\t\t\t}, this );\n\n\t\t\tif ( $.isEmptyObject( suggestions ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tObject.keys( suggestions ).forEach( function ( key ) {\n\t\t\t\tvar suggestion = suggestions[ key ];\n\n\t\t\t\tsuggestion.$showSourcesElement.on( 'click', function ( e ) {\n\t\t\t\t\tthis.onShowTranslationMemorySources( e, suggestion );\n\t\t\t\t}.bind( this ) );\n\t\t\t\t$tmSuggestions.append( suggestion.$element );\n\t\t\t}, this );\n\n\t\t\t$heading.removeClass( 'hide' );\n\t\t},\n\n\t\tonShowTranslationMemorySources: function ( e, suggestion ) {\n\t\t\te.stopPropagation();\n\n\t\t\tif ( suggestion.$sourcesElement ) {\n\t\t\t\tsuggestion.$sourcesElement.toggleClass( 'hide' );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Build the sources list. Add class to show external icons :(\n\t\t\tsuggestion.$sourcesElement = $( '<ul>' )\n\t\t\t\t.addClass( 'tux-tm-suggestion-source mw-parser-output' );\n\n\t\t\t// Sort local suggestions first, then alphabetically\n\t\t\tsuggestion.sources.sort( function ( a, b ) {\n\t\t\t\tif ( a.local === b.local ) {\n\t\t\t\t\treturn a.location.localeCompare( b.location );\n\t\t\t\t} else {\n\t\t\t\t\treturn a.local ? -1 : 1;\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tsuggestion.sources.forEach( function ( translation ) {\n\t\t\t\tsuggestion.$sourcesElement.append(\n\t\t\t\t\t$( '<li>' )\n\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\t$( '<a>' )\n\t\t\t\t\t\t\t\t.prop( 'target', '_blank' )\n\t\t\t\t\t\t\t\t.prop( 'href', translation.editorUrl || translation.uri )\n\t\t\t\t\t\t\t\t.text( translation.location )\n\t\t\t\t\t\t\t\t.toggleClass( 'external', !translation.local )\n\t\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t} );\n\t\t\tsuggestion.$element.after( suggestion.$sourcesElement );\n\t\t},\n\n\t\t/**\n\t\t * Shows the translation from machine translation systems\n\t\t *\n\t\t * @param {Array} suggestions\n\t\t */\n\t\tshowMachineTranslations: function ( suggestions ) {\n\t\t\tvar $mtSuggestions, $messageList, translationLang, translationDir,\n\t\t\t\ttranslateEditor = this;\n\n\t\t\tif ( !suggestions.length ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t$mtSuggestions = this.$editor.find( '.tm-suggestions' );\n\n\t\t\tif ( !$mtSuggestions.length ) {\n\t\t\t\t$mtSuggestions = $( '<div>' ).addClass( 'tm-suggestions' );\n\t\t\t}\n\n\t\t\tthis.$editor.find( '.tm-suggestions-title' )\n\t\t\t\t.removeClass( 'hide' )\n\t\t\t\t.after( $mtSuggestions );\n\n\t\t\t$messageList = $( '.tux-messagelist' );\n\t\t\ttranslationLang = $messageList.data( 'targetlangcode' );\n\t\t\ttranslationDir = $messageList.data( 'targetlangdir' );\n\n\t\t\tsuggestions.forEach( function ( translation ) {\n\t\t\t\tvar $translation;\n\n\t\t\t\t$translation = $( '<div>' )\n\t\t\t\t\t.addClass( 'row tm-suggestion' )\n\t\t\t\t\t.append(\n\t\t\t\t\t\t$( '<div>' )\n\t\t\t\t\t\t\t.addClass( 'nine columns suggestiontext' )\n\t\t\t\t\t\t\t.attr( {\n\t\t\t\t\t\t\t\tlang: translationLang,\n\t\t\t\t\t\t\t\tdir: translationDir\n\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t.text( translation.target ),\n\t\t\t\t\t\t$( '<div>' )\n\t\t\t\t\t\t\t.addClass( 'three columns text-right service' )\n\t\t\t\t\t\t\t.text( translation.service )\n\t\t\t\t\t);\n\n\t\t\t\ttranslateEditor.suggestionAdder( $translation, translation.target );\n\n\t\t\t\t$mtSuggestions.append( $translation );\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t * Makes the $source element clickable and clicking it will replace the\n\t\t * translation textarea with the given suggestion.\n\t\t *\n\t\t * @param {jQuery} $source\n\t\t * @param {string} suggestion Text to add\n\t\t */\n\t\tsuggestionAdder: function ( $source, suggestion ) {\n\t\t\tvar inserter,\n\t\t\t\t$target = this.$editor.find( '.tux-textarea-translation' );\n\n\t\t\tinserter = function () {\n\t\t\t\tvar selection;\n\t\t\t\tif ( window.getSelection ) {\n\t\t\t\t\tselection = window.getSelection().toString();\n\t\t\t\t} else if ( document.selection && document.selection.type !== 'Control' ) {\n\t\t\t\t\tselection = document.selection.createRange().text;\n\t\t\t\t}\n\n\t\t\t\tif ( !selection ) {\n\t\t\t\t\t$target.val( suggestion ).trigger( 'focus' ).trigger( 'input' );\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t$source.on( 'click', inserter );\n\t\t\t$source.addClass( 'shortcut-activated' );\n\t\t},\n\n\t\t/**\n\t\t * Shows the support options for the translator.\n\t\t *\n\t\t * @param {Object} support A support object as returned by API.\n\t\t */\n\t\tshowSupportOptions: function ( support ) {\n\t\t\t// Support URL\n\t\t\tif ( support.url ) {\n\t\t\t\tthis.$editor.find( '.help a' ).attr( 'href', support.url );\n\t\t\t\tthis.$editor.find( '.help' ).removeClass( 'hide' );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Adds buttons for quickly inserting insertables.\n\t\t *\n\t\t * @param {Object} insertables A insertables object as returned by API.\n\t\t */\n\t\taddInsertables: function ( insertables ) {\n\t\t\tvar i,\n\t\t\t\tcount = insertables.length,\n\t\t\t\t$sourceMessage = this.$editor.find( '.sourcemessage' ),\n\t\t\t\t$buttonArea = this.$editor.find( '.tux-editor-insert-buttons' ),\n\t\t\t\t$textarea = this.$editor.find( '.tux-textarea-translation' );\n\n\t\t\tfor ( i = 0; i < count; i++ ) {\n\t\t\t\t// The dir and lang attributes must be set here,\n\t\t\t\t// because the language of the insertables is the language\n\t\t\t\t// of the source message and not of the translation.\n\t\t\t\t// The direction may appear confusing, for example,\n\t\t\t\t// in tvar strings, which would appear with the dollar sign\n\t\t\t\t// on the wrong end.\n\t\t\t\t$( '<button>' )\n\t\t\t\t\t.prop( {\n\t\t\t\t\t\tlang: $sourceMessage.prop( 'lang' ),\n\t\t\t\t\t\tdir: $sourceMessage.prop( 'dir' )\n\t\t\t\t\t} )\n\t\t\t\t\t.addClass( 'insertable shortcut-activated' )\n\t\t\t\t\t.text( insertables[ i ].display )\n\t\t\t\t\t.data( 'iid', i )\n\t\t\t\t\t.appendTo( $buttonArea );\n\t\t\t}\n\n\t\t\t$buttonArea.on( 'click', '.insertable', function () {\n\t\t\t\tvar data = insertables[ $( this ).data( 'iid' ) ];\n\t\t\t\t$textarea.textSelection( 'encapsulateSelection', {\n\t\t\t\t\tpre: data.pre,\n\t\t\t\t\tpost: data.post\n\t\t\t\t} );\n\t\t\t\t$textarea.trigger( 'focus' ).trigger( 'input' );\n\t\t\t} );\n\n\t\t\tthis.resizeInsertables( $textarea );\n\t\t},\n\n\t\t/**\n\t\t * Loads and shows the translation helpers.\n\t\t */\n\t\tshowTranslationHelpers: function () {\n\t\t\t// API call to get translation suggestions from other languages\n\t\t\t// callback should render suggestions to the editor's info column\n\t\t\tvar api = new mw.Api();\n\n\t\t\tapi.get( {\n\t\t\t\taction: 'translationaids',\n\t\t\t\ttitle: this.message.title\n\t\t\t} ).done( function ( result ) {\n\t\t\t\tthis.$editor.find( '.infocolumn .loading' ).remove();\n\n\t\t\t\tif ( !result.helpers ) {\n\t\t\t\t\tmw.log.warn( 'API did not return any translation helpers.' );\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tthis.showMessageDocumentation( result.helpers.documentation );\n\t\t\t\tthis.showUneditableDocumentation( result.helpers.gettext );\n\t\t\t\tthis.showAssistantLanguages( result.helpers.inotherlanguages );\n\t\t\t\tthis.showTranslationMemory( result.helpers.ttmserver );\n\t\t\t\tthis.showMachineTranslations( result.helpers.mt );\n\t\t\t\tthis.showSupportOptions( result.helpers.support );\n\t\t\t\tthis.addDefinitionDiff( result.helpers.definitiondiff );\n\t\t\t\tthis.addInsertables( result.helpers.insertables );\n\n\t\t\t\t// Load the possible warnings as soon as possible, do not wait\n\t\t\t\t// for the user to make changes. Otherwise users might try confirming\n\t\t\t\t// translations which fail checks. Confirmation seems to work but\n\t\t\t\t// the message will continue to appear outdated.\n\t\t\t\tif ( this.message.properties &&\n\t\t\t\t\tthis.message.properties.status === 'fuzzy'\n\t\t\t\t) {\n\t\t\t\t\tthis.validateTranslation();\n\t\t\t\t}\n\n\t\t\t\tmw.hook( 'mw.translate.editor.showTranslationHelpers' ).fire(\n\t\t\t\t\tresult.helpers, this.$editor\n\t\t\t\t);\n\n\t\t\t}.bind( this ) ).fail( function ( errorCode, results ) {\n\t\t\t\t// results.error may be undefined\n\t\t\t\tvar errorInfo = results && results.error && results.error.info || 'Unknown error';\n\t\t\t\tthis.$editor.find( '.infocolumn .loading' ).remove();\n\t\t\t\tthis.$editor.find( '.infocolumn' ).append(\n\t\t\t\t\t$( '<div>' )\n\t\t\t\t\t\t.text( mw.msg( 'tux-editor-loading-failed', errorInfo ) )\n\t\t\t\t\t\t.addClass( 'warningbox tux-translation-aid-error' )\n\t\t\t\t);\n\t\t\t\tmw.log.error( 'Error loading translation aids:', errorCode, results );\n\t\t\t}.bind( this ) );\n\t\t}\n\t};\n\n\tmw.translate = mw.translate || {};\n\n\tmw.translate = $.extend( mw.translate, {\n\t\t/**\n\t\t * Get the documentation edit URL for a title\n\t\t *\n\t\t * @param {string} title Message title with namespace\n\t\t * @return {string} URL for editing the documentation\n\t\t */\n\t\tgetDocumentationEditURL: function ( title ) {\n\t\t\treturn mw.util.getUrl(\n\t\t\t\ttitle + '/' + mw.config.get( 'wgTranslateDocumentationLanguageCode' ),\n\t\t\t\t{ action: 'edit' }\n\t\t\t);\n\t\t}\n\t} );\n\n\t// Extend the translate editor\n\tmw.translate.editor = mw.translate.editor || {};\n\t$.extend( mw.translate.editor, translateEditorHelpers );\n\n}() );\n","usedDeprecatedRules":[]},{"filePath":"/src/repo/resources/js/ext.translate.editor.js","messages":[{"ruleId":"mediawiki/class-doc","severity":1,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":133,"column":4,"nodeType":"CallExpression","endLine":134,"endColumn":56},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":374,"column":17,"nodeType":"CallExpression","endLine":374,"endColumn":51},{"ruleId":"mediawiki/class-doc","severity":1,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":393,"column":11,"nodeType":"CallExpression","endLine":394,"endColumn":27},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":667,"column":6,"nodeType":"CallExpression","endLine":667,"endColumn":67},{"ruleId":"mediawiki/class-doc","severity":1,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":1076,"column":18,"nodeType":"CallExpression","endLine":1077,"endColumn":47}],"errorCount":0,"warningCount":5,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/* global autosize */\n\n( function () {\n\t'use strict';\n\n\t/**\n\t * Dictionary of classes that will be used by different types of notices\n\t * TODO: Should probably review and rename these classes in the future to\n\t * be more unique to the translate extension? Some themes use warning,\n\t * error classes to style elements, and we do take help from these.\n\t */\n\tvar noticeTypes = {\n\t\twarning: 'warning',\n\t\terror: 'error',\n\t\ttranslateFail: 'translation-saving',\n\t\tdiff: 'diff',\n\t\tfuzzy: 'fuzzy',\n\t\tgetAllClasses: function () {\n\t\t\tvar prop,\n\t\t\t\tclasses = [];\n\n\t\t\tfor ( prop in this ) {\n\t\t\t\tif ( typeof this[ prop ] === 'string' ) {\n\t\t\t\t\tclasses.push( this[ prop ] );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn classes;\n\t\t}\n\t};\n\n\t/**\n\t * TranslateEditor Plugin\n\t * Prepare the translation editor UI for a translation unit (message).\n\t * This is mainly used with the messagetable plugin,\n\t * but it is independent of messagetable.\n\t * Example usage:\n\t *\n\t *     $( 'div.messageRow' ).translateeditor( {\n\t *         message: messageObject // Mandatory message object\n\t *     } );\n\t *\n\t * Assumptions: The jquery element to which translateeditor is applied will\n\t * internally contain the editor's generated UI. So it is going to have the same width\n\t * and inherited properies of the container.\n\t * The container can mark the message item with class 'message'. This is not\n\t * mandatory, but if found, when the editor is opened, the message item will be hidden\n\t * and the editor will appear as if the message is replaced by the editor.\n\t * See the UI of Translate messagetable for a demo.\n\t *\n\t * @param {HTMLElement} element\n\t * @param {Object} options\n\t * @param {Function} [options.beforeSave] Callback to call when translation is going to be saved.\n\t * @param {Function} [options.onReady] Callback to call when the editor is ready.\n\t * @param {Function} [options.onSave] Callback to call when translation has been saved.\n\t * @param {Function} [options.onSkip] Callback to call when a message is skipped.\n\t * @param {Object} options.message Object as returned by messagecollection api.\n\t * @param {mw.translate.TranslationApiStorage} [options.storage]\n\t */\n\tfunction TranslateEditor( element, options ) {\n\t\tthis.$editTrigger = $( element );\n\t\tthis.$editor = null;\n\t\tthis.options = options;\n\t\tthis.message = this.options.message;\n\t\tthis.$messageItem = this.$editTrigger.find( '.message' );\n\t\tthis.shown = false;\n\t\tthis.dirty = false;\n\t\tthis.saving = false;\n\t\tthis.expanded = false;\n\t\tthis.listen();\n\t\tthis.storage = this.options.storage || new mw.translate.TranslationApiStorage();\n\t\tthis.canDelete = mw.translate.canDelete();\n\t\tthis.delayValidation = delayer();\n\t\tthis.validating = null;\n\t}\n\n\tTranslateEditor.prototype = {\n\n\t\t/**\n\t\t * Initialize the plugin\n\t\t */\n\t\tinit: function () {\n\t\t\t// In case we have already created the editor earlier,\n\t\t\t// don't add a new one. The existing one may have unsaved\n\t\t\t// changes.\n\t\t\tif ( this.$editor ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.render();\n\t\t\t// onReady callback\n\t\t\tif ( this.options.onReady ) {\n\t\t\t\tthis.options.onReady.call( this );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Render the editor UI\n\t\t */\n\t\trender: function () {\n\t\t\tthis.$editor = $( '<div>' )\n\t\t\t\t.addClass( 'row tux-message-editor hide' )\n\t\t\t\t.append(\n\t\t\t\t\tthis.prepareEditorColumn(),\n\t\t\t\t\tthis.prepareInfoColumn()\n\t\t\t\t);\n\n\t\t\tthis.expanded = false;\n\t\t\tthis.$editTrigger.append( this.$editor );\n\n\t\t\tif ( this.message.properties && this.message.properties.status === 'fuzzy' ) {\n\t\t\t\tthis.addNotice(\n\t\t\t\t\tmw.message( 'tux-editor-outdated-notice' ).escaped(),\n\t\t\t\t\tnoticeTypes.fuzzy\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.showTranslationHelpers();\n\t\t},\n\n\t\t/**\n\t\t * Mark the message as unsaved because of edits, can be resumed later\n\t\t *\n\t\t * @param {string} [highlightClass] Class for background highlighting\n\t\t */\n\t\tmarkUnsaved: function ( highlightClass ) {\n\t\t\tvar $tuxListStatus = this.$editTrigger.find( '.tux-list-status' );\n\n\t\t\thighlightClass = highlightClass || 'tux-highlight';\n\n\t\t\t$tuxListStatus.children( '.tux-status-unsaved' ).remove();\n\t\t\t$tuxListStatus.children().addClass( 'hide' );\n\t\t\t$( '<span>' )\n\t\t\t\t.addClass( 'tux-status-unsaved ' + highlightClass )\n\t\t\t\t.text( mw.msg( 'tux-status-unsaved' ) )\n\t\t\t\t.appendTo( $tuxListStatus );\n\t\t},\n\n\t\t/**\n\t\t * Mark the message as unsaved because of saving failure.\n\t\t */\n\t\tmarkUnsavedFailure: function () {\n\t\t\tthis.markUnsaved( 'tux-notice' );\n\t\t},\n\n\t\t/**\n\t\t * Mark the message as no longer unsaved\n\t\t */\n\t\tmarkUnunsaved: function () {\n\t\t\tvar $tuxListStatus = this.$editTrigger.find( '.tux-list-status' );\n\n\t\t\t$tuxListStatus.children( '.tux-status-unsaved' ).remove();\n\t\t\t$tuxListStatus.children().removeClass( 'hide' );\n\n\t\t\tthis.dirty = false;\n\t\t\tmw.translate.dirty = false;\n\t\t},\n\n\t\t/**\n\t\t * Mark the message as being saved\n\t\t */\n\t\tmarkSaving: function () {\n\t\t\tvar $tuxListStatus = this.$editTrigger.find( '.tux-list-status' );\n\n\t\t\t// Disable the save button\n\t\t\tthis.$editor.find( '.tux-editor-save-button' )\n\t\t\t\t.prop( 'disabled', true );\n\n\t\t\t// Add a \"Saving\" indicator\n\t\t\t$tuxListStatus.empty();\n\t\t\t$( '<span>' )\n\t\t\t\t.addClass( 'tux-status-unsaved' )\n\t\t\t\t.text( mw.msg( 'tux-status-saving' ) )\n\t\t\t\t.appendTo( $tuxListStatus );\n\t\t},\n\n\t\t/**\n\t\t * Mark the message as translated and successfully saved.\n\t\t */\n\t\tmarkTranslated: function () {\n\t\t\tthis.$editTrigger.find( '.tux-list-status' )\n\t\t\t\t.empty()\n\t\t\t\t.append( $( '<span>' )\n\t\t\t\t\t.addClass( 'tux-status-translated' )\n\t\t\t\t\t.text( mw.msg( 'tux-status-translated' ) )\n\t\t\t\t);\n\n\t\t\tthis.$messageItem\n\t\t\t\t.removeClass( 'untranslated translated fuzzy proofread' )\n\t\t\t\t.addClass( 'translated' );\n\n\t\t\tthis.dirty = false;\n\n\t\t\tif ( this.message.properties ) {\n\t\t\t\t$( '.tux-action-bar .tux-statsbar' ).trigger(\n\t\t\t\t\t'change',\n\t\t\t\t\t[ 'translated', this.message.properties.status ]\n\t\t\t\t);\n\n\t\t\t\tthis.message.properties.status = 'translated';\n\t\t\t\t// TODO: Update any other statsbar for the same group in the page.\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Save the translation\n\t\t */\n\t\tsave: function () {\n\t\t\tvar translation, editSummary,\n\t\t\t\ttranslateEditor = this;\n\n\t\t\tmw.hook( 'mw.translate.editor.beforeSubmit' ).fire( translateEditor.$editor );\n\t\t\ttranslation = translateEditor.$editor.find( '.tux-textarea-translation' ).val();\n\t\t\teditSummary = translateEditor.$editor.find( '.tux-input-editsummary' ).val() || '';\n\n\t\t\ttranslateEditor.saving = true;\n\n\t\t\t// beforeSave callback\n\t\t\tif ( translateEditor.options.beforeSave ) {\n\t\t\t\ttranslateEditor.options.beforeSave( translation );\n\t\t\t}\n\n\t\t\t// For responsiveness and efficiency,\n\t\t\t// immediately move to the next message.\n\t\t\ttranslateEditor.next();\n\n\t\t\t// Now the message definitely has a history,\n\t\t\t// so make sure the history menu item is shown\n\t\t\ttranslateEditor.$editor.find( '.message-tools-history' )\n\t\t\t\t.removeClass( 'hide' );\n\n\t\t\t// Show the delete menu item if the user can delete\n\t\t\tif ( this.canDelete ) {\n\t\t\t\ttranslateEditor.$editor.find( '.message-tools-delete' )\n\t\t\t\t\t.removeClass( 'hide' );\n\t\t\t}\n\n\t\t\tthis.storage.save(\n\t\t\t\ttranslateEditor.message.title,\n\t\t\t\ttranslation,\n\t\t\t\teditSummary\n\t\t\t).done( function ( response, xhr ) {\n\t\t\t\tvar editResp = response.edit;\n\t\t\t\tif ( editResp.result === 'Success' ) {\n\t\t\t\t\ttranslateEditor.message.translation = translation;\n\t\t\t\t\ttranslateEditor.onSaveSuccess();\n\t\t\t\t} else {\n\t\t\t\t\ttranslateEditor.onSaveFail( mw.msg( 'tux-save-unknown-error' ) );\n\t\t\t\t\tmw.log( response, xhr );\n\t\t\t\t}\n\t\t\t} ).fail( function ( errorCode, response ) {\n\t\t\t\ttranslateEditor.removeNotices( noticeTypes.translateFail );\n\n\t\t\t\tif ( errorCode === 'assertuserfailed' ) {\n\t\t\t\t\t// eslint-disable-next-line no-alert\n\t\t\t\t\talert( mw.msg( 'tux-session-expired' ) );\n\t\t\t\t} else if ( errorCode === 'translate-validation-failed' ) {\n\t\t\t\t\t// Cancel the translation check API call to avoid extra notices\n\t\t\t\t\t// from appearing.\n\t\t\t\t\tif ( translateEditor.validating ) {\n\t\t\t\t\t\ttranslateEditor.validating.abort();\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Cancel the translation check API call that might be made in the future.\n\t\t\t\t\t\ttranslateEditor.delayValidation( false );\n\t\t\t\t\t}\n\n\t\t\t\t\ttranslateEditor.removeNotices( [ noticeTypes.error, noticeTypes.warning ] );\n\n\t\t\t\t\tif ( response.error && response.error.validation ) {\n\t\t\t\t\t\ttranslateEditor.displayNotices( response.error.validation.warnings, noticeTypes.warning );\n\t\t\t\t\t\ttranslateEditor.displayNotices( response.error.validation.errors, noticeTypes.error );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// This is placed at the bottom to ensure that the save error appears at the\n\t\t\t\t// top of the notices\n\t\t\t\ttranslateEditor.onSaveFail(\n\t\t\t\t\tresponse.error && response.error.info || mw.msg( 'tux-save-unknown-error' )\n\t\t\t\t);\n\n\t\t\t\t// Display all the notices whenever an error occurs.\n\t\t\t\ttranslateEditor.showMoreNotices();\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t * Success handler for the translation saving.\n\t\t */\n\t\tonSaveSuccess: function () {\n\t\t\tthis.markTranslated();\n\t\t\tthis.$editTrigger.find( '.tux-list-translation' )\n\t\t\t\t.text( this.message.translation );\n\t\t\tthis.saving = false;\n\n\t\t\t// remove notices if any.\n\t\t\tthis.removeNotices( noticeTypes.getAllClasses() );\n\n\t\t\tthis.$editor.find( '.tux-notice' ).empty();\n\t\t\tthis.$editor.find( '.tux-more-notices' )\n\t\t\t\t.addClass( 'hide' )\n\t\t\t\t.empty();\n\n\t\t\t$( '.tux-editor-clear-translated' )\n\t\t\t\t.removeClass( 'hide' )\n\t\t\t\t.prop( 'disabled', false );\n\n\t\t\tthis.$editor.find( '.tux-input-editsummary' )\n\t\t\t\t.val( '' )\n\t\t\t\t.prop( 'disabled', true );\n\n\t\t\t// Save callback\n\t\t\tif ( this.options.onSave ) {\n\t\t\t\tthis.options.onSave( this.message.translation );\n\t\t\t}\n\n\t\t\tmw.translate.dirty = false;\n\t\t\tmw.hook( 'mw.translate.editor.afterSubmit' ).fire( this.$editor );\n\n\t\t\tif ( mw.track ) {\n\t\t\t\tmw.track( 'ext.translate.event.translation', this.message );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Marks that there was a problem saving a translation.\n\t\t *\n\t\t * @param {string} error Strings of notices to display.\n\t\t */\n\t\tonSaveFail: function ( error ) {\n\t\t\tthis.addNotice(\n\t\t\t\tmw.msg( 'tux-editor-save-failed', error ),\n\t\t\t\tnoticeTypes.translateFail\n\t\t\t);\n\t\t\tthis.saving = false;\n\t\t\tthis.markUnsavedFailure();\n\t\t},\n\n\t\t/**\n\t\t * Skip the current message.\n\t\t * Record it to mark as hard.\n\t\t */\n\t\tskip: function () {\n\t\t\t// @TODO devise good algorithm for identifying hard to translate messages\n\t\t},\n\n\t\t/**\n\t\t * Jump to the next translation editor row.\n\t\t */\n\t\tnext: function () {\n\t\t\tvar $next = this.$editTrigger.next( '.tux-message' );\n\n\t\t\t// Skip if the message is hidden. For example in a filter result.\n\t\t\tif ( $next.length && $next.hasClass( 'hide' ) ) {\n\t\t\t\tthis.$editTrigger = $next;\n\t\t\t\tthis.next();\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If this is the last message, just hide it\n\t\t\tif ( !$next.length ) {\n\t\t\t\tthis.hide();\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t$next.data( 'translateeditor' ).show();\n\n\t\t\t// Scroll the page a little bit up, slowly.\n\t\t\tif ( $( document ).height() -\n\t\t\t\t( $( window ).height() + window.pageYOffset + $next.height() ) > 0\n\t\t\t) {\n\t\t\t\t$( 'html, body' ).stop().animate( {\n\t\t\t\t\tscrollTop: $( '.tux-message-editor:visible' ).offset().top - 85\n\t\t\t\t}, 500 );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Creates a menu element for the message tools.\n\t\t *\n\t\t * @param {string} className Used as the element's CSS class\n\t\t * @param {Object} query Used as the query in the mw.Uri object\n\t\t * @param {string} message The message of the label of the menu item\n\t\t * @return {jQuery} The new menu item element\n\t\t */\n\t\tcreateMessageToolsItem: function ( className, query, message ) {\n\t\t\tvar uri = new mw.Uri();\n\n\t\t\turi.path = mw.config.get( 'wgScript' );\n\t\t\turi.query = query;\n\n\t\t\treturn $( '<li>' )\n\t\t\t\t.addClass( className )\n\t\t\t\t.append( $( '<a>' )\n\t\t\t\t\t.attr( {\n\t\t\t\t\t\thref: uri.toString(),\n\t\t\t\t\t\ttarget: '_blank'\n\t\t\t\t\t} )\n\t\t\t\t\t// eslint-disable-next-line mediawiki/msg-doc\n\t\t\t\t\t.text( mw.msg( message ) )\n\t\t\t\t);\n\t\t},\n\n\t\t/**\n\t\t * Creates an element with a dropdown menu including\n\t\t * tools for the translators.\n\t\t *\n\t\t * @return {jQuery} The new message tools menu element\n\t\t */\n\t\tcreateMessageTools: function () {\n\t\t\tvar $editItem, $historyItem, $deleteItem, $translationsItem, $linkToThisItem;\n\n\t\t\t$editItem = this.createMessageToolsItem(\n\t\t\t\t'message-tools-edit',\n\t\t\t\t{\n\t\t\t\t\ttitle: this.message.title,\n\t\t\t\t\taction: 'edit'\n\t\t\t\t},\n\t\t\t\t'tux-editor-message-tools-show-editor'\n\t\t\t);\n\n\t\t\tif ( !mw.translate.canTranslate() ) {\n\t\t\t\t$editItem.addClass( 'hide' );\n\t\t\t}\n\n\t\t\t$historyItem = this.createMessageToolsItem(\n\t\t\t\t'message-tools-history',\n\t\t\t\t{\n\t\t\t\t\ttitle: this.message.title,\n\t\t\t\t\taction: 'history'\n\t\t\t\t},\n\t\t\t\t'tux-editor-message-tools-history'\n\t\t\t);\n\n\t\t\t$deleteItem = this.createMessageToolsItem(\n\t\t\t\t'message-tools-delete',\n\t\t\t\t{\n\t\t\t\t\ttitle: this.message.title,\n\t\t\t\t\taction: 'delete'\n\t\t\t\t},\n\t\t\t\t'tux-editor-message-tools-delete'\n\t\t\t);\n\n\t\t\t// Hide these links if the translation doesn't actually exist.\n\t\t\t// They will be shown when a translation will be created.\n\t\t\tif ( this.message.translation === null ) {\n\t\t\t\t$historyItem.addClass( 'hide' );\n\t\t\t\t$deleteItem.addClass( 'hide' );\n\t\t\t} else if ( !this.canDelete ) {\n\t\t\t\t$deleteItem.addClass( 'hide' );\n\t\t\t}\n\n\t\t\t// A link to Special:Translations,\n\t\t\t// with translations of this message to other languages\n\t\t\t$translationsItem = this.createMessageToolsItem(\n\t\t\t\t'message-tools-translations',\n\t\t\t\t{\n\t\t\t\t\ttitle: 'Special:Translations',\n\t\t\t\t\tmessage: this.message.title\n\t\t\t\t},\n\t\t\t\t'tux-editor-message-tools-translations'\n\t\t\t);\n\n\t\t\t$linkToThisItem = this.createMessageToolsItem(\n\t\t\t\t'message-tools-linktothis',\n\t\t\t\t{\n\t\t\t\t\ttitle: 'Special:Translate',\n\t\t\t\t\tshowMessage: this.message.key,\n\t\t\t\t\tgroup: this.message.primaryGroup,\n\t\t\t\t\tlanguage: this.message.targetLanguage\n\t\t\t\t},\n\t\t\t\t'tux-editor-message-tools-linktothis'\n\t\t\t);\n\n\t\t\treturn $( '<ul>' )\n\t\t\t\t.addClass( 'tux-dropdown-menu tux-message-tools-menu hide' )\n\t\t\t\t.append( $editItem, $historyItem, $deleteItem, $translationsItem, $linkToThisItem );\n\t\t},\n\n\t\tprepareEditorColumn: function () {\n\t\t\tvar translateEditor = this,\n\t\t\t\tsourceString,\n\t\t\t\toriginalTranslation,\n\t\t\t\t$editorColumn,\n\t\t\t\t$messageKeyLabel,\n\t\t\t\t$moreNoticesTab,\n\t\t\t\t$notices,\n\t\t\t\t$noticesBlock,\n\t\t\t\t$editAreaBlock,\n\t\t\t\t$textarea,\n\t\t\t\t$controlButtonBlock,\n\t\t\t\t$editingButtonBlock,\n\t\t\t\t$pasteOriginalButton,\n\t\t\t\t$editSummary,\n\t\t\t\t$editSummaryBlock,\n\t\t\t\t$discardChangesButton = $( [] ),\n\t\t\t\t$saveButton = $( [] ),\n\t\t\t\t$requestRight,\n\t\t\t\t$skipButton,\n\t\t\t\t$cancelButton,\n\t\t\t\t$sourceString,\n\t\t\t\t$closeIcon,\n\t\t\t\t$layoutActions,\n\t\t\t\t$infoToggleIcon,\n\t\t\t\t$messageList,\n\t\t\t\ttargetLangAttrib, targetLangDir, targetLangCode, prefix,\n\t\t\t\t$messageTools = translateEditor.createMessageTools(),\n\t\t\t\tcanTranslate = mw.translate.canTranslate();\n\n\t\t\t$editorColumn = $( '<div>' )\n\t\t\t\t.addClass( 'seven columns editcolumn' );\n\n\t\t\t$messageKeyLabel = $( '<div>' )\n\t\t\t\t.addClass( 'ten columns messagekey' )\n\t\t\t\t.text( this.message.title )\n\t\t\t\t.append(\n\t\t\t\t\t$( '<span>' ).addClass( 'caret' ),\n\t\t\t\t\t$messageTools\n\t\t\t\t)\n\t\t\t\t.on( 'click', function ( e ) {\n\t\t\t\t\t$messageTools.toggleClass( 'hide' );\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t} );\n\n\t\t\t$closeIcon = $( '<span>' )\n\t\t\t\t.addClass( 'one column close' )\n\t\t\t\t.attr( 'title', mw.msg( 'tux-editor-close-tooltip' ) )\n\t\t\t\t.on( 'click', function ( e ) {\n\t\t\t\t\ttranslateEditor.hide();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t} );\n\n\t\t\t$infoToggleIcon = $( '<span>' )\n\t\t\t\t// Initially the editor column is contracted,\n\t\t\t\t// so show the expand button first\n\t\t\t\t.addClass( 'one column editor-info-toggle editor-expand' )\n\t\t\t\t.attr( 'title', mw.msg( 'tux-editor-expand-tooltip' ) )\n\t\t\t\t.on( 'click', function ( e ) {\n\t\t\t\t\ttranslateEditor.infoToggle( $( this ) );\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t} );\n\n\t\t\t$layoutActions = $( '<div>' )\n\t\t\t\t.addClass( 'two columns layout-actions' )\n\t\t\t\t.append( $closeIcon, $infoToggleIcon );\n\n\t\t\t$editorColumn.append( $( '<div>' )\n\t\t\t\t.addClass( 'row tux-editor-titletools' )\n\t\t\t\t.append( $messageKeyLabel, $layoutActions )\n\t\t\t);\n\n\t\t\t$messageList = $( '.tux-messagelist' );\n\t\t\toriginalTranslation = this.message.translation;\n\t\t\tsourceString = this.message.definition;\n\t\t\t$sourceString = $( '<span>' )\n\t\t\t\t.addClass( 'twelve columns sourcemessage' )\n\t\t\t\t.attr( {\n\t\t\t\t\tlang: $messageList.data( 'sourcelangcode' ),\n\t\t\t\t\tdir: $messageList.data( 'sourcelangdir' )\n\t\t\t\t} )\n\t\t\t\t.text( sourceString );\n\n\t\t\t// Adjust the font size for the message string based on the length\n\t\t\tif ( sourceString.length > 100 && sourceString.length < 200 ) {\n\t\t\t\t$sourceString.addClass( 'long' );\n\t\t\t}\n\n\t\t\tif ( sourceString.length > 200 ) {\n\t\t\t\t$sourceString.addClass( 'longer' );\n\t\t\t}\n\n\t\t\t$editorColumn.append( $( '<div>' )\n\t\t\t\t.addClass( 'row' )\n\t\t\t\t.append( $sourceString )\n\t\t\t);\n\n\t\t\t$notices = $( '<div>' )\n\t\t\t\t.addClass( 'tux-notice hide' );\n\n\t\t\t$moreNoticesTab = $( '<div>' )\n\t\t\t\t.addClass( 'tux-more-notices hide' )\n\t\t\t\t.on( 'click', function () {\n\t\t\t\t\tvar $this = $( this ),\n\t\t\t\t\t\t$moreNotices = $notices.children(),\n\t\t\t\t\t\tlastNoticeIndex = $moreNotices.length - 1;\n\n\t\t\t\t\t// If the notice list is not open, only one notice is shown\n\t\t\t\t\tif ( $this.hasClass( 'open' ) ) {\n\t\t\t\t\t\t$moreNotices.each( function ( index, element ) {\n\t\t\t\t\t\t\t// The first element must always be shown\n\t\t\t\t\t\t\tif ( index ) {\n\t\t\t\t\t\t\t\t$( element ).addClass( 'hide' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t$this\n\t\t\t\t\t\t\t.removeClass( 'open' )\n\t\t\t\t\t\t\t.text( mw.msg( 'tux-notices-more', lastNoticeIndex ) );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$moreNotices.each( function ( index, element ) {\n\t\t\t\t\t\t\t// The first element must always be shown\n\t\t\t\t\t\t\tif ( index ) {\n\t\t\t\t\t\t\t\t$( element ).removeClass( 'hide' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t$this\n\t\t\t\t\t\t\t.addClass( 'open' )\n\t\t\t\t\t\t\t.text( mw.msg( 'tux-notices-hide' ) );\n\t\t\t\t\t}\n\n\t\t\t\t\ttranslateEditor.toggleMoreButtonClass();\n\t\t\t\t} );\n\n\t\t\ttargetLangCode = this.message.targetLanguage;\n\t\t\tif ( targetLangCode === mw.config.get( 'wgTranslateDocumentationLanguageCode' ) ) {\n\t\t\t\ttargetLangAttrib = mw.config.get( 'wgContentLanguage' );\n\t\t\t\ttargetLangDir = $.uls.data.getDir( targetLangAttrib );\n\t\t\t} else {\n\t\t\t\ttargetLangAttrib = targetLangCode;\n\t\t\t\ttargetLangDir = $messageList.data( 'targetlangdir' );\n\t\t\t}\n\n\t\t\t$textarea = $( '<textarea>' )\n\t\t\t\t.addClass( 'tux-textarea-translation' )\n\t\t\t\t.attr( {\n\t\t\t\t\tlang: targetLangAttrib,\n\t\t\t\t\tdir: targetLangDir\n\t\t\t\t} )\n\t\t\t\t.val( this.message.translation || '' );\n\n\t\t\tif ( mw.translate.isPlaceholderSupported( $textarea ) ) {\n\t\t\t\t$textarea.prop( 'placeholder', mw.msg( 'tux-editor-placeholder' ) );\n\t\t\t}\n\n\t\t\t// Shortcuts for various insertable things\n\t\t\t$textarea.on( 'keyup keydown', function ( e ) {\n\t\t\t\tvar index, $info, direction;\n\n\t\t\t\tif ( e.type === 'keydown' && e.altKey === true ) {\n\t\t\t\t\t// Up and down arrows\n\t\t\t\t\tif ( e.keyCode === 38 || e.keyCode === 40 ) {\n\t\t\t\t\t\tdirection = e.keyCode === 40 ? 1 : -1;\n\t\t\t\t\t\t$info = translateEditor.$editor.find( '.infocolumn' );\n\t\t\t\t\t\t$info.scrollTop( $info.scrollTop() + 100 * direction );\n\t\t\t\t\t\ttranslateEditor.showShortcuts();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Move zero to last\n\t\t\t\tindex = e.keyCode - 49;\n\t\t\t\tif ( index === -1 ) {\n\t\t\t\t\tindex = 9;\n\t\t\t\t}\n\n\t\t\t\t// 0..9 ~ 48..57\n\t\t\t\tif (\n\t\t\t\t\te.type === 'keydown' &&\n\t\t\t\t\te.altKey === true &&\n\t\t\t\t\te.ctrlKey === false &&\n\t\t\t\t\te.shiftKey === false &&\n\t\t\t\t\tindex >= 0 && index < 10\n\t\t\t\t) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\ttranslateEditor.$editor.find( '.shortcut-activated:visible' ).eq( index ).trigger( 'click' );\n\t\t\t\t\t// Update numbers and locations after trigger should be completed\n\t\t\t\t\twindow.setTimeout( function () {\n\t\t\t\t\t\ttranslateEditor.showShortcuts();\n\t\t\t\t\t}, 100 );\n\t\t\t\t}\n\n\t\t\t\tif ( e.which === 18 && e.type === 'keyup' ) {\n\t\t\t\t\ttranslateEditor.hideShortcuts();\n\t\t\t\t} else if ( e.which === 18 && e.type === 'keydown' ) {\n\t\t\t\t\ttranslateEditor.showShortcuts();\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t$textarea.on( 'textchange', function () {\n\t\t\t\tvar $pasteSourceButton = translateEditor.$editor.find( '.tux-editor-paste-original-button' ),\n\t\t\t\t\toriginal = translateEditor.message.translation || '',\n\t\t\t\t\tcurrent = $textarea.val() || '';\n\n\t\t\t\tif ( original !== '' ) {\n\t\t\t\t\t$discardChangesButton.removeClass( 'hide' );\n\t\t\t\t}\n\n\t\t\t\t/* Avoid Unsaved marking when translated message is not changed in content.\n\t\t\t\t * - translateEditor.dirty: internal book keeping\n\t\t\t\t * - mw.translate.dirty: \"you have unchanged edits\" notice\n\t\t\t\t */\n\t\t\t\tif ( original === current ) {\n\t\t\t\t\ttranslateEditor.markUnunsaved();\n\t\t\t\t} else {\n\t\t\t\t\ttranslateEditor.dirty = true;\n\t\t\t\t\tmw.translate.dirty = true;\n\t\t\t\t}\n\n\t\t\t\ttranslateEditor.makeSaveButtonJustSave( $saveButton );\n\n\t\t\t\t// When there is content in the editor enable the button.\n\t\t\t\t// But do not enable when some saving is not finished yet.\n\t\t\t\tif ( current.trim() && !translateEditor.saving ) {\n\t\t\t\t\t$pasteSourceButton.addClass( 'hide' );\n\t\t\t\t\t$saveButton.prop( 'disabled', false );\n\t\t\t\t} else {\n\t\t\t\t\t$saveButton.prop( 'disabled', true );\n\t\t\t\t\t$pasteSourceButton.removeClass( 'hide' );\n\t\t\t\t}\n\n\t\t\t\ttranslateEditor.resizeInsertables( $textarea );\n\n\t\t\t\ttranslateEditor.delayValidation( function () {\n\t\t\t\t\ttranslateEditor.validateTranslation();\n\t\t\t\t}, 500 );\n\t\t\t} );\n\n\t\t\t$noticesBlock = $( '<div>' )\n\t\t\t\t.addClass( 'tux-notices-block' )\n\t\t\t\t.append( $moreNoticesTab, $notices );\n\n\t\t\t$editAreaBlock = $( '<div>' )\n\t\t\t\t.addClass( 'row tux-editor-editarea-block' )\n\t\t\t\t.append( $( '<div>' )\n\t\t\t\t\t.addClass( 'editarea twelve columns' )\n\t\t\t\t\t.append( $noticesBlock, $textarea )\n\t\t\t\t);\n\n\t\t\t$editorColumn.append( $editAreaBlock );\n\n\t\t\tif ( canTranslate ) {\n\t\t\t\t$pasteOriginalButton = $( '<button>' )\n\t\t\t\t\t.addClass( 'tux-editor-paste-original-button' )\n\t\t\t\t\t.text( mw.msg( 'tux-editor-paste-original-button-label' ) )\n\t\t\t\t\t.on( 'click', function () {\n\t\t\t\t\t\t$textarea\n\t\t\t\t\t\t\t.trigger( 'focus' )\n\t\t\t\t\t\t\t.val( sourceString )\n\t\t\t\t\t\t\t.trigger( 'input' );\n\n\t\t\t\t\t\t$pasteOriginalButton.addClass( 'hide' );\n\t\t\t\t\t} );\n\n\t\t\t\t$editSummary = $( '<input>' )\n\t\t\t\t\t.addClass( 'tux-input-editsummary' )\n\t\t\t\t\t.attr( {\n\t\t\t\t\t\tmaxlength: 255,\n\t\t\t\t\t\tdisabled: true,\n\t\t\t\t\t\tplaceholder: mw.msg( 'tux-editor-editsummary-placeholder' )\n\t\t\t\t\t} )\n\t\t\t\t\t.val( '' );\n\n\t\t\t\t// Enable edit summary if there was a change to translation area\n\t\t\t\t// or disable if there is no text in translation area\n\t\t\t\t$textarea.on( 'textchange', function () {\n\t\t\t\t\tif ( $editSummary.prop( 'disabled' ) ) {\n\t\t\t\t\t\t$editSummary.prop( 'disabled', false );\n\t\t\t\t\t}\n\t\t\t\t\tif ( $textarea.val().trim() === '' ) {\n\t\t\t\t\t\t$editSummary.prop( 'disabled', true );\n\t\t\t\t\t}\n\t\t\t\t} ).on( 'keydown', function ( e ) {\n\t\t\t\t\tif ( !e.ctrlKey || e.keyCode !== 13 ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !$saveButton.is( ':disabled' ) ) {\n\t\t\t\t\t\t$saveButton.trigger( 'click' );\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\t$skipButton.trigger( 'click' );\n\t\t\t\t} );\n\n\t\t\t\tif ( originalTranslation !== null ) {\n\t\t\t\t\t$discardChangesButton = $( '<button>' )\n\t\t\t\t\t\t.addClass( 'tux-editor-discard-changes-button hide' ) // Initially hidden\n\t\t\t\t\t\t.text( mw.msg( 'tux-editor-discard-changes-button-label' ) )\n\t\t\t\t\t\t.on( 'click', function () {\n\t\t\t\t\t\t\t// Restore the translation\n\t\t\t\t\t\t\t$textarea\n\t\t\t\t\t\t\t\t.trigger( 'focus' )\n\t\t\t\t\t\t\t\t.val( originalTranslation );\n\n\t\t\t\t\t\t\t// and go back to hiding.\n\t\t\t\t\t\t\t$discardChangesButton.addClass( 'hide' );\n\n\t\t\t\t\t\t\t// There's nothing new to save...\n\t\t\t\t\t\t\t$editSummary.val( '' ).prop( 'disabled', true );\n\t\t\t\t\t\t\t$saveButton.prop( 'disabled', true );\n\t\t\t\t\t\t\t// ...unless there is other action\n\t\t\t\t\t\t\ttranslateEditor.makeSaveButtonContextSensitive( $saveButton );\n\n\t\t\t\t\t\t\ttranslateEditor.markUnunsaved();\n\t\t\t\t\t\t\ttranslateEditor.resizeInsertables( $textarea );\n\t\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\tif ( this.message.translation ) {\n\t\t\t\t\t$pasteOriginalButton.addClass( 'hide' );\n\t\t\t\t}\n\n\t\t\t\t$editingButtonBlock = $( '<div>' )\n\t\t\t\t\t.addClass( 'twelve columns tux-editor-insert-buttons' )\n\t\t\t\t\t.append(\n\t\t\t\t\t\t$pasteOriginalButton,\n\t\t\t\t\t\t$discardChangesButton\n\t\t\t\t\t);\n\n\t\t\t\t$editSummaryBlock = $( '<div>' )\n\t\t\t\t\t.addClass( 'row tux-editor-editsummary-block' )\n\t\t\t\t\t.append(\n\t\t\t\t\t\t$( '<div>' )\n\t\t\t\t\t\t\t.addClass( 'twelve columns' )\n\t\t\t\t\t\t\t.append( $editSummary )\n\t\t\t\t\t);\n\n\t\t\t\t$requestRight = $( [] );\n\n\t\t\t\t$saveButton = $( '<button>' )\n\t\t\t\t\t.prop( 'disabled', true )\n\t\t\t\t\t.addClass( 'tux-editor-save-button mw-ui-button mw-ui-progressive' )\n\t\t\t\t\t.text( mw.msg( 'tux-editor-save-button-label' ) )\n\t\t\t\t\t.on( 'click', function ( e ) {\n\t\t\t\t\t\ttranslateEditor.save();\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t} );\n\n\t\t\t\tthis.makeSaveButtonContextSensitive( $saveButton, this.$messageItem );\n\t\t\t} else {\n\t\t\t\t$editingButtonBlock = $( [] );\n\n\t\t\t\t$editSummaryBlock = $( [] );\n\n\t\t\t\t$requestRight = $( '<span>' )\n\t\t\t\t\t.addClass( 'tux-editor-request-right' )\n\t\t\t\t\t.text( mw.msg( 'translate-edit-nopermission' ) );\n\t\t\t\t// Make sure wgTranslatePermissionUrl setting is not 'false'\n\t\t\t\tif ( mw.config.get( 'wgTranslatePermissionUrl' ) !== false ) {\n\t\t\t\t\t$requestRight\n\t\t\t\t\t\t.append( $( '<a>' )\n\t\t\t\t\t\t\t.text( mw.msg( 'translate-edit-askpermission' ) )\n\t\t\t\t\t\t\t.addClass( 'tux-editor-ask-permission' )\n\t\t\t\t\t\t\t.attr( {\n\t\t\t\t\t\t\t\thref: mw.util.getUrl(\n\t\t\t\t\t\t\t\t\tmw.config.get( 'wgTranslateUseSandbox' ) ?\n\t\t\t\t\t\t\t\t\t\t'Special:TranslationStash' :\n\t\t\t\t\t\t\t\t\t\tmw.config.get( 'wgTranslatePermissionUrl' )\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t// Disable the text area if user has no translation rights.\n\t\t\t\t// Use readonly to allow copy-pasting (except for placeholders)\n\t\t\t\t$textarea.prop( 'readonly', true );\n\n\t\t\t\t$saveButton = $( [] );\n\t\t\t}\n\n\t\t\t$skipButton = $( '<button>' )\n\t\t\t\t.addClass( 'tux-editor-skip-button mw-ui-button mw-ui-quiet' )\n\t\t\t\t.text( mw.msg( 'tux-editor-skip-button-label' ) )\n\t\t\t\t.on( 'click', function ( e ) {\n\t\t\t\t\ttranslateEditor.skip();\n\t\t\t\t\ttranslateEditor.next();\n\n\t\t\t\t\tif ( translateEditor.options.onSkip ) {\n\t\t\t\t\t\ttranslateEditor.options.onSkip.call( translateEditor );\n\t\t\t\t\t}\n\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t} );\n\n\t\t\t// This appears instead of \"Skip\" on the last message on the page\n\t\t\t$cancelButton = $( '<button>' )\n\t\t\t\t.addClass( 'tux-editor-cancel-button mw-ui-button mw-ui-quiet' )\n\t\t\t\t.text( mw.msg( 'tux-editor-cancel-button-label' ) )\n\t\t\t\t.on( 'click', function ( e ) {\n\t\t\t\t\ttranslateEditor.skip();\n\t\t\t\t\ttranslateEditor.hide();\n\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t} );\n\n\t\t\t$controlButtonBlock = $( '<div>' )\n\t\t\t\t.addClass( 'twelve columns tux-editor-control-buttons' )\n\t\t\t\t.append( $requestRight, $saveButton, $skipButton, $cancelButton );\n\n\t\t\t$editorColumn.append( $( '<div>' )\n\t\t\t\t.addClass( 'row tux-editor-actions-block' )\n\t\t\t\t.append( $editingButtonBlock )\n\t\t\t);\n\n\t\t\t$editorColumn.append( $editSummaryBlock );\n\n\t\t\t$editorColumn.append( $( '<div>' )\n\t\t\t\t.addClass( 'row tux-editor-actions-block' )\n\t\t\t\t.append( $controlButtonBlock )\n\t\t\t);\n\n\t\t\tif ( canTranslate ) {\n\t\t\t\tprefix = $.fn.updateTooltipAccessKeys.getAccessKeyPrefix();\n\t\t\t\t$editorColumn.append( $( '<div>' )\n\t\t\t\t\t.addClass( 'row shortcutinfo' )\n\t\t\t\t\t.text( mw.msg(\n\t\t\t\t\t\t'tux-editor-shortcut-info',\n\t\t\t\t\t\t'CTRL-ENTER',\n\t\t\t\t\t\t( prefix + 'd' ).toUpperCase(),\n\t\t\t\t\t\t'ALT',\n\t\t\t\t\t\t( prefix + 'b' ).toUpperCase()\n\t\t\t\t\t) )\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn $editorColumn;\n\t\t},\n\n\t\t/**\n\t\t * Modifies the save button to provide suitable default action for *unchanged*\n\t\t * message. It will revert back to normal save button if the text is changed.\n\t\t *\n\t\t * @param {jQuery} $button The save button.\n\t\t */\n\t\tmakeSaveButtonContextSensitive: function ( $button ) {\n\t\t\tvar self = this;\n\n\t\t\tif ( this.message.properties.status === 'fuzzy' ) {\n\t\t\t\t$button.prop( 'disabled', false );\n\t\t\t\t$button.text( mw.msg( 'tux-editor-confirm-button-label' ) );\n\t\t\t\t$button.off( 'click' );\n\t\t\t\t$button.on( 'click', function ( e ) {\n\t\t\t\t\tself.save();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t} );\n\t\t\t} else if ( this.message.proofreadable ) {\n\t\t\t\t$button.prop( 'disabled', false );\n\t\t\t\t$button.text( mw.msg( 'tux-editor-proofread-button-label' ) );\n\t\t\t\t$button.off( 'click' );\n\t\t\t\t$button.on( 'click', function ( e ) {\n\t\t\t\t\t$button.prop( 'disabled', true );\n\t\t\t\t\tself.message.proofreadAction();\n\t\t\t\t\tself.next();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Modifies the save button to just save the translation as usual. Whether the\n\t\t * button is enabled or not is controlled elsewhere.\n\t\t *\n\t\t * @param {jQuery} $button The save button.\n\t\t */\n\t\tmakeSaveButtonJustSave: function ( $button ) {\n\t\t\tvar self = this;\n\n\t\t\t$button.text( mw.msg( 'tux-editor-save-button-label' ) );\n\t\t\t$button.off( 'click' );\n\t\t\t$button.on( 'click', function ( e ) {\n\t\t\t\tself.save();\n\t\t\t\te.stopPropagation();\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t * Validate the current translation using the API\n\t\t * and show the notices.\n\t\t */\n\t\tvalidateTranslation: function () {\n\t\t\tvar translateEditor = this,\n\t\t\t\tapi,\n\t\t\t\t$textarea = translateEditor.$editor.find( '.tux-textarea-translation' );\n\n\t\t\tapi = new mw.Api();\n\n\t\t\tthis.validating = api.post( {\n\t\t\t\taction: 'translationcheck',\n\t\t\t\ttitle: this.message.title,\n\t\t\t\ttranslation: $textarea.val()\n\t\t\t} ).done( function ( data ) {\n\t\t\t\tvar warnings = data.validation.warnings,\n\t\t\t\t\terrors = data.validation.errors;\n\n\t\t\t\ttranslateEditor.removeNotices( [\n\t\t\t\t\tnoticeTypes.error,\n\t\t\t\t\tnoticeTypes.warning,\n\t\t\t\t\tnoticeTypes.translateFail\n\t\t\t\t] );\n\n\t\t\t\tif ( ( !warnings || !warnings.length ) &&\n\t\t\t\t\t( !errors || !errors.length ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Remove useless fuzzy notice if we have more details\n\t\t\t\ttranslateEditor.removeNotices( noticeTypes.fuzzy );\n\n\t\t\t\t// Disable confirm translation button, since fuzzy translations\n\t\t\t\t// cannot be confirmed. The check for dirty state can be removed\n\t\t\t\t// to prevent translations with notices.\n\t\t\t\tif ( !translateEditor.dirty ) {\n\t\t\t\t\ttranslateEditor.$editor.find( '.tux-editor-save-button' )\n\t\t\t\t\t\t.prop( 'disabled', true );\n\t\t\t\t}\n\n\t\t\t\t// Don't allow users to save if there are errors but allow admins to save\n\t\t\t\t// even if there are errors.\n\t\t\t\tif ( !mw.translate.canManage() ) {\n\t\t\t\t\tif ( errors && errors.length > 0 ) {\n\t\t\t\t\t\ttranslateEditor.$editor.find( '.tux-editor-save-button' )\n\t\t\t\t\t\t\t.prop( 'disabled', true );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\ttranslateEditor.displayNotices( warnings, noticeTypes.warning );\n\t\t\t\ttranslateEditor.displayNotices( errors, noticeTypes.error );\n\n\t\t\t} ).always( function () {\n\t\t\t\ttranslateEditor.validating = null;\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t * Remove all notices of given types\n\t\t *\n\t\t * @param {(string|string[])} types\n\t\t */\n\t\tremoveNotices: function ( types ) {\n\t\t\tvar $tuxNotice = this.$editor.find( '.tux-notice' ),\n\t\t\t\tstringTypes = [],\n\t\t\t\t$currentNotices,\n\t\t\t\tindex,\n\t\t\t\terrMsg,\n\t\t\t\tallNoticeTypes = noticeTypes.getAllClasses();\n\n\t\t\tif ( typeof types === 'string' ) {\n\t\t\t\tstringTypes.push( types );\n\t\t\t} else {\n\t\t\t\tstringTypes = types;\n\t\t\t}\n\n\t\t\tfor ( index = 0; index < stringTypes.length; index++ ) {\n\t\t\t\tif ( allNoticeTypes.indexOf( stringTypes[ index ] ) === -1 ) {\n\t\t\t\t\terrMsg = 'tux: Invalid notice type removeNotice - ' + stringTypes[ index ];\n\t\t\t\t\tmw.log.error( errMsg );\n\t\t\t\t\tthrow new Error( errMsg );\n\t\t\t\t}\n\t\t\t\t$tuxNotice.find( '.' + stringTypes[ index ] ).remove();\n\t\t\t}\n\n\t\t\t$currentNotices = $tuxNotice.children();\n\t\t\t// If a single notice is shown, we can hide the more notice button,\n\t\t\t// and display the hidden notice.\n\t\t\tif ( $currentNotices.length <= 1 ) {\n\t\t\t\tthis.$editor.find( '.tux-more-notices' ).addClass( 'hide' );\n\t\t\t\t$currentNotices.removeClass( 'hide' );\n\t\t\t}\n\t\t\tthis.toggleMoreButtonClass();\n\t\t},\n\n\t\t/**\n\t\t * Displays the supplied notice above the translation edit area.\n\t\t * Newer notices are added to the top while older notices are\n\t\t * added to the bottom. This also means that older notices will\n\t\t * not be shown by default unless the user clicks \"more notices\" tab.\n\t\t *\n\t\t * @param {string} notice used as html for the notices display\n\t\t * @param {string} type used to group the notices.eg: warning, diff, error\n\t\t * @return {jQuery} the new notice element\n\t\t */\n\t\taddNotice: function ( notice, type ) {\n\t\t\tvar noticeCount,\n\t\t\t\t$notices = this.$editor.find( '.tux-notice' ),\n\t\t\t\t$moreNoticesTab = this.$editor.find( '.tux-more-notices' ),\n\t\t\t\t$newNotice = $( '<div>' )\n\t\t\t\t\t.addClass( 'tux-notice-message ' + type )\n\t\t\t\t\t.html( notice );\n\n\t\t\tthis.$editor.find( '.tux-notice-message' ).addClass( 'hide' );\n\n\t\t\t$notices\n\t\t\t\t.removeClass( 'hide' )\n\t\t\t\t.prepend( $newNotice );\n\n\t\t\tnoticeCount = $notices.find( '.tux-notice-message' ).length;\n\n\t\t\tif ( noticeCount > 1 ) {\n\t\t\t\t$moreNoticesTab\n\t\t\t\t\t.text( mw.msg( 'tux-notices-more', noticeCount - 1 ) )\n\t\t\t\t\t.removeClass( 'hide open' );\n\t\t\t} else {\n\t\t\t\t$moreNoticesTab.addClass( 'hide' );\n\t\t\t}\n\t\t\tthis.toggleMoreButtonClass();\n\n\t\t\treturn $newNotice;\n\t\t},\n\n\t\t/**\n\t\t * Toggles the class on the more button based on the types of notice displayed, and whether\n\t\t * the more section is expanded. This is done in order to change the background color of the\n\t\t * button.\n\t\t */\n\t\ttoggleMoreButtonClass: function () {\n\t\t\tvar $allNotices = this.$editor.find( '.tux-notice-message' ),\n\t\t\t\terrorCount = $allNotices.filter( '.tux-notice-message.' + noticeTypes.error ).length +\n\t\t\t\t\t$allNotices.filter( '.tux-notice-message.' + noticeTypes.translateFail ).length,\n\t\t\t\totherErrorsCount = $allNotices.length - errorCount,\n\t\t\t\t$moreButton = this.$editor.find( '.tux-more-notices' );\n\n\t\t\tif ( errorCount === 0 ) {\n\t\t\t\t// if no error, no classes needed.\n\t\t\t\t$moreButton.removeClass( 'tux-has-errors' );\n\t\t\t} else if ( otherErrorsCount > 0 && $moreButton.hasClass( 'open' ) ) {\n\t\t\t\t// there are other notices, and more section is expanded.\n\t\t\t\t$moreButton.removeClass( 'tux-has-errors' );\n\t\t\t} else {\n\t\t\t\t$moreButton.addClass( 'tux-has-errors' );\n\t\t\t}\n\t\t},\n\n\t\tprepareInfoColumn: function () {\n\t\t\tvar $messageDescEditor, $messageDescTextarea,\n\t\t\t\t$messageDescSaveButton, $messageDescCancelButton,\n\t\t\t\t$messageDescViewer,\n\t\t\t\t$infoColumn = $( '<div>' ).addClass( 'infocolumn' ),\n\t\t\t\ttranslateEditor = this;\n\n\t\t\t$infoColumn.append( $( '<div>' )\n\t\t\t\t.addClass( 'row loading' )\n\t\t\t\t.text( mw.msg( 'tux-editor-loading' ) )\n\t\t\t);\n\n\t\t\tif ( mw.config.get( 'wgTranslateDocumentationLanguageCode' ) ) {\n\t\t\t\t$messageDescSaveButton = $( '<button>' )\n\t\t\t\t\t.addClass( 'tux-editor-savedoc-button mw-ui-button mw-ui-progressive' )\n\t\t\t\t\t.prop( 'disabled', true )\n\t\t\t\t\t.text( mw.msg( 'tux-editor-doc-editor-save' ) )\n\t\t\t\t\t.on( 'click', function () {\n\t\t\t\t\t\ttranslateEditor.saveDocumentation()\n\t\t\t\t\t\t\t.done( function () {\n\t\t\t\t\t\t\t\tvar $descEditLink = $messageDescViewer.find( '.message-desc-edit' );\n\t\t\t\t\t\t\t\t$descEditLink.text( mw.msg( 'tux-editor-edit-desc' ) );\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t} );\n\n\t\t\t\t$messageDescCancelButton = $( '<button>' )\n\t\t\t\t\t.addClass( 'tux-editor-skipdoc-button mw-ui-button mw-ui-quiet' )\n\t\t\t\t\t.text( mw.msg( 'tux-editor-doc-editor-cancel' ) )\n\t\t\t\t\t.on( 'click', function () {\n\t\t\t\t\t\ttranslateEditor.hideDocumentationEditor();\n\t\t\t\t\t} );\n\n\t\t\t\t$messageDescTextarea = $( '<textarea>' )\n\t\t\t\t\t.addClass( 'tux-textarea-documentation' )\n\t\t\t\t\t.on( 'textchange', function () {\n\t\t\t\t\t\t$messageDescSaveButton.prop( 'disabled', false );\n\t\t\t\t\t} );\n\n\t\t\t\tif ( mw.translate.isPlaceholderSupported( $messageDescTextarea ) ) {\n\t\t\t\t\t$messageDescTextarea.prop( 'placeholder', mw.msg( 'tux-editor-doc-editor-placeholder' ) );\n\t\t\t\t}\n\n\t\t\t\t$messageDescEditor = $( '<div>' )\n\t\t\t\t\t.addClass( 'row message-desc-editor hide' )\n\t\t\t\t\t.append(\n\t\t\t\t\t\t$messageDescTextarea,\n\t\t\t\t\t\t$( '<div>' )\n\t\t\t\t\t\t\t.addClass( 'row' )\n\t\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\t\t$messageDescSaveButton,\n\t\t\t\t\t\t\t\t$messageDescCancelButton\n\t\t\t\t\t\t\t)\n\t\t\t\t\t);\n\n\t\t\t\t$messageDescViewer = $( '<div>' )\n\t\t\t\t\t.addClass( 'message-desc-viewer hide' )\n\t\t\t\t\t.append(\n\t\t\t\t\t\t$( '<div>' )\n\t\t\t\t\t\t\t.addClass( 'row message-desc' ),\n\t\t\t\t\t\t$( '<div>' )\n\t\t\t\t\t\t\t.addClass( 'row message-desc-control' )\n\t\t\t\t\t\t\t.append( $( '<a>' )\n\t\t\t\t\t\t\t\t.attr( {\n\t\t\t\t\t\t\t\t\thref: mw.translate.getDocumentationEditURL(\n\t\t\t\t\t\t\t\t\t\tthis.message.title.replace( /\\/[a-z-]+$/, '' )\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\ttarget: '_blank'\n\t\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t\t.addClass( 'message-desc-edit' )\n\t\t\t\t\t\t\t\t.on( 'click', this.showDocumentationEditor.bind( this ) )\n\t\t\t\t\t\t\t)\n\t\t\t\t\t);\n\n\t\t\t\tif ( !mw.translate.canTranslate() ) {\n\t\t\t\t\t$messageDescViewer.find( '.message-desc-control' ).addClass( 'hide' );\n\t\t\t\t}\n\n\t\t\t\t$infoColumn.append(\n\t\t\t\t\t$messageDescEditor,\n\t\t\t\t\t$messageDescViewer\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t$infoColumn.append( $( '<div>' )\n\t\t\t\t.addClass( 'row uneditable-documentation hide mw-parser-output' )\n\t\t\t);\n\n\t\t\t$infoColumn.append( $( '<div>' )\n\t\t\t\t.addClass( 'row tm-suggestions-title hide' )\n\t\t\t\t.text( mw.msg( 'tux-editor-suggestions-title' ) )\n\t\t\t);\n\n\t\t\t$infoColumn.append( $( '<div>' )\n\t\t\t\t.addClass( 'row in-other-languages-title hide' )\n\t\t\t\t.text( mw.msg( 'tux-editor-in-other-languages' ) )\n\t\t\t);\n\n\t\t\t// The actual href is set when translationhelpers are loaded\n\t\t\t$infoColumn.append( $( '<div>' )\n\t\t\t\t.addClass( 'row help hide' )\n\t\t\t\t.append(\n\t\t\t\t\t$( '<span>' )\n\t\t\t\t\t\t.text( mw.msg( 'tux-editor-need-more-help' ) ),\n\t\t\t\t\t$( '<a>' )\n\t\t\t\t\t\t.attr( {\n\t\t\t\t\t\t\thref: '#',\n\t\t\t\t\t\t\ttarget: '_blank'\n\t\t\t\t\t\t} )\n\t\t\t\t\t\t.text( mw.msg( 'tux-editor-ask-help' ) )\n\t\t\t\t)\n\t\t\t);\n\n\t\t\treturn $( '<div>' )\n\t\t\t\t.addClass( 'five columns infocolumn-block' )\n\t\t\t\t.append(\n\t\t\t\t\t$( '<span>' ).addClass( 'tux-message-editor__caret' ),\n\t\t\t\t\t$infoColumn\n\t\t\t\t);\n\t\t},\n\n\t\tshow: function () {\n\t\t\tvar $next, $textarea;\n\n\t\t\tif ( !this.$editor ) {\n\t\t\t\tthis.init();\n\t\t\t}\n\n\t\t\t$textarea = this.$editor.find( '.editcolumn textarea' );\n\t\t\t// Hide all other open editors in the page\n\t\t\t$( '.tux-message.open' ).each( function () {\n\t\t\t\t$( this ).data( 'translateeditor' ).hide();\n\t\t\t} );\n\n\t\t\t// The access keys need to be shifted to the editor currently active\n\t\t\t$( '.tux-editor-save-button, .tux-editor-save-button' ).removeAttr( 'accesskey' );\n\t\t\tthis.$editor.find( '.tux-editor-save-button' ).attr( 'accesskey', 's' );\n\t\t\tthis.$editor.find( '.tux-editor-skip-button' ).attr( 'accesskey', 'd' );\n\t\t\tthis.$editor.find( '.tux-input-editsummary' ).attr( 'accesskey', 'b' );\n\t\t\t// @todo access key for the cancel button\n\n\t\t\tthis.$messageItem.addClass( 'hide' );\n\t\t\tthis.$editor.removeClass( 'hide' );\n\t\t\t$textarea.trigger( 'focus' );\n\n\t\t\tautosize( $textarea );\n\t\t\tthis.resizeInsertables( $textarea );\n\n\t\t\tthis.shown = true;\n\t\t\tthis.$editTrigger.addClass( 'open' );\n\n\t\t\t// don't waste time, get ready with next message\n\t\t\t$next = this.$editTrigger.next( '.tux-message' );\n\n\t\t\tif ( $next.length ) {\n\t\t\t\t$next.data( 'translateeditor' ).init();\n\t\t\t}\n\n\t\t\tmw.hook( 'mw.translate.editor.afterEditorShown' ).fire( this.$editor );\n\n\t\t\treturn false;\n\t\t},\n\n\t\thide: function () {\n\t\t\t// If the user has made changes, make sure they are either\n\t\t\t// in process of being saved or highlighted as unsaved.\n\t\t\tif ( this.dirty ) {\n\t\t\t\tif ( this.saving ) {\n\t\t\t\t\tthis.markSaving();\n\t\t\t\t} else {\n\t\t\t\t\tthis.markUnsaved();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( this.$editor ) {\n\t\t\t\tthis.$editor.addClass( 'hide' );\n\t\t\t}\n\n\t\t\tthis.hideShortcuts();\n\t\t\tthis.$editTrigger.removeClass( 'open' );\n\t\t\tthis.$messageItem.removeClass( 'hide' );\n\t\t\tthis.shown = false;\n\n\t\t\treturn false;\n\t\t},\n\n\t\tinfoToggle: function ( toggleIcon ) {\n\t\t\tif ( this.expanded ) {\n\t\t\t\tthis.contract( toggleIcon );\n\t\t\t} else {\n\t\t\t\tthis.expand( toggleIcon );\n\t\t\t}\n\t\t},\n\n\t\tcontract: function ( toggleIcon ) {\n\t\t\t// Change the icon image\n\t\t\ttoggleIcon\n\t\t\t\t.removeClass( 'editor-contract' )\n\t\t\t\t.addClass( 'editor-expand' )\n\t\t\t\t.attr( 'title', mw.msg( 'tux-editor-expand-tooltip' ) );\n\n\t\t\tthis.$editor.removeClass( 'tux-message-editor--expanded' );\n\t\t\tthis.expanded = false;\n\t\t},\n\n\t\texpand: function ( toggleIcon ) {\n\t\t\t// Change the icon image\n\t\t\ttoggleIcon\n\t\t\t\t.removeClass( 'editor-expand' )\n\t\t\t\t.addClass( 'editor-contract' )\n\t\t\t\t.attr( 'title', mw.msg( 'tux-editor-collapse-tooltip' ) );\n\n\t\t\tthis.$editor.addClass( 'tux-message-editor--expanded' );\n\t\t\tthis.expanded = true;\n\t\t},\n\n\t\t/**\n\t\t * Adds the diff between old and current definitions to the view.\n\t\t *\n\t\t * @param {Object} definitiondiff A definitiondiff object as returned by API.\n\t\t */\n\t\taddDefinitionDiff: function ( definitiondiff ) {\n\t\t\tvar $trigger;\n\n\t\t\tif ( !definitiondiff || definitiondiff.error ) {\n\t\t\t\tmw.log( 'Error loading translation diff ' + definitiondiff && definitiondiff.error );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Load the diff styles\n\t\t\tmw.loader.load( 'mediawiki.diff.styles' );\n\n\t\t\t$trigger = $( '<span>' )\n\t\t\t\t.addClass( 'show-diff-link' )\n\t\t\t\t.text( mw.msg( 'tux-editor-outdated-notice-diff-link' ) )\n\t\t\t\t.on( 'click', function () {\n\t\t\t\t\t$( this ).parent().html( definitiondiff.html );\n\t\t\t\t} );\n\n\t\t\tthis.removeNotices( noticeTypes.fuzzy );\n\t\t\tthis.addNotice(\n\t\t\t\tmw.message( 'tux-editor-outdated-notice' ).escaped(),\n\t\t\t\tnoticeTypes.diff\n\t\t\t).append( $trigger );\n\t\t},\n\n\t\t/**\n\t\t * Attach event listeners\n\t\t */\n\t\tlisten: function () {\n\t\t\tvar translateEditor = this;\n\n\t\t\tthis.$editTrigger.find( '.tux-message-item' ).on( 'click', function () {\n\t\t\t\ttranslateEditor.show();\n\n\t\t\t\treturn false;\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t * Makes the textarea large enough for insertables and positions the insertables.\n\t\t *\n\t\t * @param {jQuery} $textarea Text area.\n\t\t */\n\t\tresizeInsertables: function ( $textarea ) {\n\t\t\tvar $buttonArea, buttonAreaHeight;\n\n\t\t\t$buttonArea = this.$editor.find( '.tux-editor-insert-buttons' );\n\t\t\tbuttonAreaHeight = $buttonArea.height();\n\t\t\t$textarea.css( 'padding-bottom', buttonAreaHeight + 5 );\n\t\t\t$buttonArea.css( 'top', -buttonAreaHeight );\n\t\t\tautosize.update( $textarea );\n\t\t},\n\n\t\t/**\n\t\t * Utility method to display a list of notices on the UI\n\t\t *\n\t\t * @param {Array} notices\n\t\t * @param {string} noticeType\n\t\t */\n\t\tdisplayNotices: function ( notices, noticeType ) {\n\t\t\tvar index;\n\t\t\tfor ( index = 0; index < notices.length; ++index ) {\n\t\t\t\tthis.addNotice( notices[ index ], noticeType );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Ensures that all the notices are displayed\n\t\t */\n\t\tshowMoreNotices: function () {\n\t\t\tvar $moreNoticesTab = this.$editor.find( '.tux-more-notices' );\n\t\t\tif ( $moreNoticesTab.hasClass( 'open' ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t$moreNoticesTab.trigger( 'click' );\n\t\t}\n\t};\n\n\t/*\n\t * translateeditor PLUGIN DEFINITION\n\t */\n\n\t$.fn.translateeditor = function ( options ) {\n\t\treturn this.each( function () {\n\t\t\tvar $this = $( this ),\n\t\t\t\tdata = $this.data( 'translateeditor' );\n\n\t\t\tif ( !data ) {\n\t\t\t\t$this.data( 'translateeditor',\n\t\t\t\t\t( data = new TranslateEditor( this, options ) )\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif ( typeof options === 'string' ) {\n\t\t\t\tdata[ options ].call( $this );\n\t\t\t}\n\t\t} );\n\t};\n\n\tmw.translate.editor = mw.translate.editor || {};\n\tmw.translate.editor = $.extend( TranslateEditor.prototype, mw.translate.editor );\n\n\tfunction delayer() {\n\t\treturn ( function () {\n\t\t\tvar timer = 0;\n\n\t\t\treturn function ( callback, milliseconds ) {\n\t\t\t\tclearTimeout( timer );\n\n\t\t\t\tif ( callback === false ) {\n\t\t\t\t\t// sometimes we need to just cancel the timer without\n\t\t\t\t\t// setting up another one\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\ttimer = setTimeout( callback, milliseconds );\n\t\t\t};\n\t\t}() );\n\t}\n}() );\n","usedDeprecatedRules":[]},{"filePath":"/src/repo/resources/js/ext.translate.editor.shortcuts.js","messages":[{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":36,"column":4,"nodeType":"CallExpression","endLine":36,"endColumn":54}],"errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * Translate editor shortcuts\n */\n( function () {\n\t'use strict';\n\tvar translateEditorShortcuts = {\n\t\tshowShortcuts: function () {\n\t\t\tvar editorOffset, minTop, maxTop, maxLeft, middle, rtl;\n\n\t\t\t// Any better way?\n\t\t\trtl = $( document.body ).is( '.rtl' );\n\n\t\t\teditorOffset = this.$editor.offset();\n\t\t\tminTop = editorOffset.top;\n\t\t\tmaxTop = minTop + this.$editor.outerHeight();\n\t\t\tmiddle = minTop + ( maxTop - minTop ) / 2;\n\t\t\tmaxLeft = rtl ? editorOffset.left : editorOffset.left + this.$editor.outerWidth();\n\n\t\t\tthis.hideShortcuts();\n\n\t\t\t// For scrolling up and down\n\t\t\t$( '<div>' )\n\t\t\t\t.text( '↑' )\n\t\t\t\t.addClass( 'shortcut-popup' )\n\t\t\t\t.appendTo( document.body )\n\t\t\t\t.offset( { top: middle - 15, left: maxLeft } )\n\t\t\t\t.css( 'transform', 'translate( -50%, 0 )' );\n\n\t\t\t$( '<div>' )\n\t\t\t\t.text( '↓' )\n\t\t\t\t.addClass( 'shortcut-popup' )\n\t\t\t\t.appendTo( document.body )\n\t\t\t\t.offset( { top: middle + 15, left: maxLeft } )\n\t\t\t\t.css( 'transform', 'translate( -50%, 0 )' );\n\n\t\t\tthis.$editor.find( '.shortcut-activated:visible' ).each( function ( index ) {\n\t\t\t\tvar offset = getStartCornerOffsetOf( $( this ), rtl );\n\n\t\t\t\t// Let's not have numbers appear outside the editor over other content\n\t\t\t\tif ( offset.top > maxTop || offset.top < minTop ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t$( '<div>' )\n\t\t\t\t\t.text( index + 1 )\n\t\t\t\t\t.addClass( 'shortcut-popup' )\n\t\t\t\t\t.appendTo( document.body )\n\t\t\t\t\t.offset( offset )\n\t\t\t\t\t.css( 'transform', 'translate( -50%, -50% )' );\n\t\t\t} );\n\t\t},\n\n\t\thideShortcuts: function () {\n\t\t\t$( '.shortcut-popup' ).remove();\n\t\t}\n\t};\n\n\tfunction getStartCornerOffsetOf( $element, rtl ) {\n\t\tvar offset = $element.offset();\n\n\t\tif ( rtl ) {\n\t\t\toffset.left += $element.outerWidth();\n\t\t}\n\n\t\treturn offset;\n\t}\n\n\tmw.translate.editor = mw.translate.editor || {};\n\t$.extend( mw.translate.editor, translateEditorShortcuts );\n\n}() );\n","usedDeprecatedRules":[]},{"filePath":"/src/repo/resources/js/ext.translate.groupselector.js","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/resources/js/ext.translate.messagerenamedialog.js","messages":[{"ruleId":"mediawiki/class-doc","severity":1,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":308,"column":2,"nodeType":"CallExpression","endLine":308,"endColumn":55},{"ruleId":"mediawiki/class-doc","severity":1,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":309,"column":2,"nodeType":"CallExpression","endLine":309,"endColumn":43}],"errorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * Dialog for displaying possible renamed messages.\n * Note that methods are not safe to call before the dialog has initialized.\n *\n * @copyright See AUTHORS.txt\n * @license GPL-2.0-or-later\n */\n\n'use strict';\n\nmw.translate = mw.translate || {};\n\n/**\n * @class\n * @extends OO.ui.ProcessDialog\n *\n * @constructor\n * @param {Object} [config] Similar configuration as the OO.ui.ProcessDialog\n * @param {Function} [onRenameSelect] Function to call when the rename button is pressed\n */\nmw.translate.MessageRenameDialog = function ( config, onRenameSelect ) {\n\tvar errMsg;\n\n\t// HTML Elements\n\tthis.messageSearch = null;\n\tthis.searchButton = null;\n\tthis.panel = null;\n\tthis.form = null;\n\tthis.$notice = null;\n\n\t// Data properties\n\tthis.possibleRenames = null;\n\tthis.currentGroupId = null;\n\tthis.targetKey = null;\n\tthis.selectedMessage = null;\n\tthis.resetProperties();\n\n\tif ( !onRenameSelect ) {\n\t\terrMsg = 'Must provide the \"onRenameSelect\" callback function.';\n\t\tmw.log.error( errMsg );\n\t\tthrow new Error( errMsg );\n\t}\n\tthis.onRenameSelect = onRenameSelect;\n\n\t// Parent constructor\n\tmw.translate.MessageRenameDialog.super.call( this, config );\n};\n\n/* Inheritance */\nOO.inheritClass( mw.translate.MessageRenameDialog, OO.ui.ProcessDialog );\n\n/* Static Properties */\nmw.translate.MessageRenameDialog.static.name = 'MessageRenameDialog';\n\nmw.translate.MessageRenameDialog.static.actions = [\n\t{\n\t\tflags: [ 'primary', 'progressive' ],\n\t\tlabel: mw.msg( 'translate-smg-rename-select' ),\n\t\taction: 'select',\n\t\tactive: true\n\t},\n\t{\n\t\tflags: 'safe',\n\t\tlabel: mw.msg( 'translate-smg-rename-cancel' ),\n\t\taction: 'cancel'\n\t}\n];\n\n/**\n * @inheritdoc\n */\nmw.translate.MessageRenameDialog.prototype.initialize = function () {\n\tmw.translate.MessageRenameDialog.super.prototype.initialize.call( this );\n\n\tthis.messageSearch = new OO.ui.TextInputWidget( {\n\t\tplaceholder: mw.msg( 'translate-smg-rename-search' )\n\t} );\n\n\tthis.searchButton = new OO.ui.ButtonWidget( {\n\t\ticon: 'search',\n\t\tinvisibleLabel: true\n\t} );\n\n\tthis.panel = new OO.ui.PanelLayout( {\n\t\tpadded: true,\n\t\texpanded: false\n\t} );\n\n\tthis.form = new OO.ui.FormLayout( {\n\t\tpadded: true,\n\t\texpanded: false,\n\t\titems: [\n\t\t\tnew OO.ui.ActionFieldLayout( this.messageSearch, this.searchButton, {\n\t\t\t\tclasses: [ 'smg-rename-msg-search' ]\n\t\t\t} )\n\t\t],\n\t\tmethod: 'post'\n\t} );\n\n\tthis.$notice = $( '<p>' )\n\t\t.addClass( 'smg-rename-notice hide' );\n\n\tthis.form.$element.append( this.$notice );\n\tthis.panel.$element.append( this.form.$element );\n\tthis.$body.append( this.panel.$element );\n\n\tthis.addEvents();\n};\n\nmw.translate.MessageRenameDialog.prototype.addEvents = function () {\n\tthis.form.$element.on( 'click', '.smg-rename-list', this.selectMessage.bind( this ) );\n\tthis.messageSearch.on( 'change', OO.ui.debounce( this.filterMessages.bind( this ), 300 ) );\n};\n\n/**\n * @inheritdoc\n */\nmw.translate.MessageRenameDialog.prototype.getSetupProcess = function ( renameDialogData ) {\n\tvar dialogData = renameDialogData || {};\n\treturn mw.translate.MessageRenameDialog.super.prototype.getSetupProcess.call( this, dialogData )\n\t\t.next( function () {\n\t\t\t// Set up contents based on data\n\t\t\tthis.possibleRenames = dialogData.messages;\n\t\t\tthis.currentGroupId = dialogData.groupId;\n\t\t\tthis.targetKey = dialogData.targetKey;\n\t\t\tthis.selectedMessage = null;\n\n\t\t\tthis.displayMessages( this.possibleRenames );\n\t\t}, this );\n};\n\n/**\n * @inheritdoc\n */\nmw.translate.MessageRenameDialog.prototype.getActionProcess = function ( action ) {\n\tif ( action === 'cancel' ) {\n\t\treturn new OO.ui.Process( function () {\n\t\t\tthis.close();\n\t\t\tthis.emit( action );\n\t\t}, this );\n\t} else if ( action === 'select' ) {\n\t\tif ( !this.selectedMessage ) {\n\t\t\treturn new OO.ui.Process( function () {\n\t\t\t\tthis.displayNotice( mw.msg( 'translate-smg-rename-select-err' ), 'error' );\n\t\t\t}, this );\n\t\t}\n\t\treturn mw.translate.MessageRenameDialog.super.prototype.getActionProcess.call( this, action )\n\t\t\t.next( this.rename.bind( this ) )\n\t\t\t.next( function () {\n\t\t\t\treturn this.close().closed;\n\t\t\t}.bind( this ) );\n\t}\n\n\treturn mw.translate.MessageRenameDialog.super.prototype.getActionProcess.call( this, action );\n};\n\n/**\n * @inheritdoc\n */\nmw.translate.MessageRenameDialog.prototype.getTeardownProcess = function ( data ) {\n\treturn mw.translate.MessageRenameDialog.super.prototype.getTeardownProcess.call( this, data )\n\t\t.first( function () {\n\t\t\t// Perform any cleanup as needed\n\t\t\tthis.clearMessages();\n\t\t\tthis.messageSearch.setValue( '' );\n\n\t\t\tthis.resetProperties();\n\t\t}, this );\n};\n\n/**\n * Displays the given messages on the dialog box.\n *\n * @param {Array} messages\n */\nmw.translate.MessageRenameDialog.prototype.displayMessages = function ( messages ) {\n\tvar i;\n\tif ( !messages.length ) {\n\t\tthis.displayNotice( mw.msg( 'translate-smg-rename-no-msg' ), 'info' );\n\t\treturn;\n\t}\n\n\tfor ( i = 0; i < messages.length; i++ ) {\n\t\tthis.displayMessage( messages[ i ] );\n\t}\n};\n\n/**\n * Generates the HTML to display a single message\n *\n * @param {Object} message\n */\nmw.translate.MessageRenameDialog.prototype.displayMessage = function ( message ) {\n\tvar $title, $content, $container;\n\n\t$title = $( '<div>' ).append(\n\t\t$( '<a>' ).text( message.title ).addClass( 'smg-rename-msg-key' )\n\t\t\t.prop( 'href', message.link )\n\t\t\t.data( 'msg-key', message.key ),\n\t\t$( '<span>' ).text(\n\t\t\tmw.msg( 'percent', mw.language.convertNumber( ( message.similarity * 100 ).toFixed() ) )\n\t\t).addClass( 'smg-rename-similarity' )\n\t);\n\n\t$content = $( '<div>' ).text( message.content ).addClass( 'smg-rename-msg-content' );\n\n\t$container = $( '<div>' ).addClass( 'smg-rename-list' );\n\n\t$container.append( $title, $content );\n\n\tthis.form.$element.append( $container );\n};\n\n/**\n * Callback triggered when a message is selected.\n *\n * @param {Object} event\n */\nmw.translate.MessageRenameDialog.prototype.selectMessage = function ( event ) {\n\tvar $target = $( event.currentTarget );\n\tthis.selectedMessage = $target.find( '.smg-rename-msg-key' ).data( 'msgKey' );\n\n\tthis.form.$element.find( '.smg-rename-list' ).removeClass( 'smg-rename-selected' );\n\t$target.addClass( 'smg-rename-selected' );\n\n\tthis.hideNotice();\n};\n\n/**\n * Used to reset the state properties for the dialog box.\n */\nmw.translate.MessageRenameDialog.prototype.resetProperties = function () {\n\tthis.possibleRenames = [];\n\tthis.currentGroupId = null;\n\tthis.targetKey = null;\n\tthis.selectedMessage = null;\n};\n\n/**\n * Perform the actual rename\n *\n * @return {jQuery.Promise} Resolves after making call to the onRenameSelect function.\n */\nmw.translate.MessageRenameDialog.prototype.rename = function () {\n\tvar deferred, promise, renameData;\n\tdeferred = $.Deferred();\n\tpromise = deferred.promise();\n\n\trenameData = {\n\t\tgroupId: this.currentGroupId,\n\t\ttargetKey: this.targetKey,\n\t\tselectedKey: this.selectedMessage\n\t};\n\n\tthis.onRenameSelect( renameData ).done( function () {\n\t\treturn deferred.resolve();\n\t} ).fail( function ( code, result ) {\n\t\tif ( result.error ) {\n\t\t\tif ( result.error.code === 'permissiondenied' ) {\n\t\t\t\treturn deferred.reject( new OO.ui.Error( result.error.info,\n\t\t\t\t\t{ recoverable: false } ) );\n\t\t\t}\n\n\t\t\treturn deferred.reject( OO.ui.Error( result.error.info ) );\n\t\t}\n\t} );\n\n\treturn promise;\n};\n\n/**\n * Callback function triggered to handle the search.\n *\n * @param {Object} searchValue\n */\nmw.translate.MessageRenameDialog.prototype.filterMessages = function ( searchValue ) {\n\tvar normalizedSearchVal = searchValue.toLowerCase(), filteredMessages = [];\n\n\t// if the dialog is closing, let's not do anything.\n\tif ( this.isClosing() || !this.isVisible() ) {\n\t\treturn;\n\t}\n\n\tfilteredMessages = this.possibleRenames.filter( function ( message ) {\n\t\tif ( message.key.toLowerCase().indexOf( normalizedSearchVal ) !== -1 ) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif ( message.content.toLowerCase().indexOf( normalizedSearchVal ) !== -1 ) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t} );\n\n\tthis.clearMessages();\n\tthis.displayMessages( filteredMessages );\n\tthis.updateSize();\n};\n\n/**\n * Method use to display a notice on the dialog box\n *\n * @param {string} msg\n * @param {string} type\n */\nmw.translate.MessageRenameDialog.prototype.displayNotice = function ( msg, type ) {\n\tvar possibleTypes = [ 'info', 'error', 'warning' ];\n\tthis.$notice.removeClass( possibleTypes.join( ' ' ) );\n\tthis.$notice.text( msg ).addClass( type ).removeClass( 'hide' );\n\tthis.updateSize();\n};\n\n/**\n * Hide displayed notice.\n */\nmw.translate.MessageRenameDialog.prototype.hideNotice = function () {\n\tthis.$notice.addClass( 'hide' );\n\tthis.updateSize();\n};\n\n/**\n * Clears all messages from the DOM.\n */\nmw.translate.MessageRenameDialog.prototype.clearMessages = function () {\n\tthis.form.$element.find( '.smg-rename-list' ).remove();\n\tthis.hideNotice();\n};\n","usedDeprecatedRules":[]},{"filePath":"/src/repo/resources/js/ext.translate.messagetable.js","messages":[{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":288,"column":33,"nodeType":"CallExpression","endLine":288,"endColumn":60},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":388,"column":9,"nodeType":"CallExpression","endLine":388,"endColumn":41},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Positional selector extensions are not allowed","line":401,"column":16,"nodeType":"CallExpression","endLine":401,"endColumn":65},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Positional selector extensions are not allowed","line":518,"column":7,"nodeType":"CallExpression","endLine":518,"endColumn":32}],"errorCount":0,"warningCount":4,"fixableErrorCount":0,"fixableWarningCount":0,"source":"( function () {\n\t'use strict';\n\n\tvar itemsClass = {\n\t\tproofread: '.tux-message-proofread',\n\t\tpage: '.tux-message-pagemode',\n\t\ttranslate: '.tux-message'\n\t};\n\n\tmw.translate = mw.translate || {};\n\tmw.translate = $.extend( mw.translate, {\n\t\tgetMessages: function ( messageGroup, language, offset, limit, filter ) {\n\t\t\tvar api = new mw.Api();\n\n\t\t\treturn api.get( {\n\t\t\t\taction: 'query',\n\t\t\t\tlist: 'messagecollection',\n\t\t\t\tmcgroup: messageGroup,\n\t\t\t\tmclanguage: language,\n\t\t\t\tmcoffset: offset,\n\t\t\t\tmclimit: limit,\n\t\t\t\tmcfilter: filter,\n\t\t\t\tmcprop: 'definition|translation|tags|properties',\n\t\t\t\trawcontinue: 1,\n\t\t\t\terrorformat: 'html',\n\t\t\t\tformatversion: 2\n\t\t\t} );\n\t\t}\n\t} );\n\n\tfunction MessageTable( container, options, settings ) {\n\t\tthis.$container = $( container );\n\t\tthis.options = options;\n\t\tthis.options = $.extend( {}, $.fn.messagetable.defaults, options );\n\t\tthis.settings = settings;\n\t\t// mode can be proofread, page or translate\n\t\tthis.mode = this.options.mode;\n\t\tthis.firstProofreadTipShown = false;\n\t\tthis.initialized = false;\n\t\tthis.$header = this.$container.siblings( '.tux-messagetable-header' );\n\t\t// Container is between these in the dom.\n\t\tthis.$loader = this.$container.siblings( '.tux-messagetable-loader' );\n\t\tthis.$loaderIcon = this.$loader.find( '.tux-loading-indicator' );\n\t\tthis.$loaderInfo = this.$loader.find( '.tux-messagetable-loader-info' );\n\t\tthis.$actionBar = this.$container.siblings( '.tux-action-bar' );\n\t\tthis.$statsBar = this.$actionBar.find( '.tux-message-list-statsbar' );\n\t\tthis.$proofreadOwnTranslations = this.$actionBar.find( '.tux-proofread-own-translations-button' );\n\t\tthis.messages = [];\n\t\tthis.loading = false;\n\t\tthis.init();\n\t\tthis.listen();\n\t}\n\n\tMessageTable.prototype = {\n\t\tinit: function () {\n\t\t\tthis.$actionBar.removeClass( 'hide' );\n\t\t},\n\n\t\tlisten: function () {\n\t\t\tvar messageTable = this,\n\t\t\t\t$filterInput = this.$container.parent().find( '.tux-message-filter-box' );\n\n\t\t\t// Vector has transitions of 250ms which affect layout. Let those finish.\n\t\t\t$( window ).on( 'scroll', $.debounce( 250, function () {\n\t\t\t\tmessageTable.scroll();\n\n\t\t\t\tif ( isLoaderVisible( messageTable.$loader ) ) {\n\t\t\t\t\tmessageTable.load();\n\t\t\t\t}\n\t\t\t} ) ).on( 'resize', $.throttle( 250, function () {\n\t\t\t\tmessageTable.resize();\n\t\t\t\tmessageTable.scroll();\n\t\t\t} ) );\n\n\t\t\tif ( mw.translate.isPlaceholderSupported( $filterInput ) ) {\n\t\t\t\t$filterInput.prop( 'placeholder', mw.msg( 'tux-message-filter-placeholder' ) );\n\t\t\t}\n\n\t\t\t$filterInput.on( 'textchange', $.debounce( 250, function () {\n\t\t\t\tmessageTable.search( $filterInput.val() );\n\t\t\t} ) );\n\n\t\t\tthis.$actionBar.find( 'button.proofread-mode-button' ).on( 'click', function () {\n\t\t\t\tmessageTable.switchMode( 'proofread' );\n\t\t\t} );\n\n\t\t\tthis.$actionBar.find( 'button.translate-mode-button' ).on( 'click', function () {\n\t\t\t\tmessageTable.switchMode( 'translate' );\n\t\t\t} );\n\n\t\t\tthis.$actionBar.find( 'button.page-mode-button' ).on( 'click', function () {\n\t\t\t\tmessageTable.switchMode( 'page' );\n\t\t\t} );\n\n\t\t\tthis.$proofreadOwnTranslations.on( 'click', function () {\n\t\t\t\tvar $this = $( this ),\n\t\t\t\t\thideMessage = mw.msg( 'tux-editor-proofreading-hide-own-translations' ),\n\t\t\t\t\tshowMessage = mw.msg( 'tux-editor-proofreading-show-own-translations' );\n\n\t\t\t\tif ( $this.hasClass( 'down' ) ) {\n\t\t\t\t\tmessageTable.setHideOwnInProofreading( false );\n\t\t\t\t\t$this.removeClass( 'down' ).text( hideMessage );\n\t\t\t\t} else {\n\t\t\t\t\tmessageTable.setHideOwnInProofreading( true );\n\t\t\t\t\t$this.addClass( 'down' ).text( showMessage );\n\t\t\t\t}\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t * Clear the message table\n\t\t */\n\t\tclear: function () {\n\t\t\tthis.$container.empty();\n\t\t\t$( '.translate-tooltip' ).remove();\n\t\t\tthis.messages = [];\n\t\t\t// Any ongoing loading process will notice this and will reject results.\n\t\t\tthis.loading = false;\n\t\t},\n\n\t\t/**\n\t\t * Adds a new message using current mode.\n\t\t *\n\t\t * @param {Object} message\n\t\t */\n\t\tadd: function ( message ) {\n\t\t\t// Prepare the message for display\n\t\t\tmw.hook( 'mw.translate.messagetable.formatMessageBeforeTable' ).fire( message );\n\n\t\t\tif ( this.mode === 'translate' ) {\n\t\t\t\tthis.addTranslate( message );\n\t\t\t} else if ( this.mode === 'proofread' ) {\n\t\t\t\tthis.addProofread( message );\n\t\t\t} else if ( this.mode === 'page' ) {\n\t\t\t\tthis.addPageModeMessage( message );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Add a message to the message table for translation.\n\t\t *\n\t\t * @param {Object} message\n\t\t */\n\t\taddTranslate: function ( message ) {\n\t\t\tvar $message,\n\t\t\t\ttargetLangDir, targetLangAttrib,\n\t\t\t\ttargetLangCode = this.$container.data( 'targetlangcode' ),\n\t\t\t\tsourceLangCode = this.$container.data( 'sourcelangcode' ),\n\t\t\t\tsourceLangDir = $.uls.data.getDir( sourceLangCode ),\n\t\t\t\tstatus = message.properties.status,\n\t\t\t\tstatusClass = 'tux-status-' + status,\n\t\t\t\t$messageWrapper = $( '<div>' ).addClass( 'row tux-message' ),\n\t\t\t\tstatusMsg = '';\n\n\t\t\tmessage.proofreadable = false;\n\n\t\t\tif ( message.tags.length &&\n\t\t\t\tmessage.tags.indexOf( 'optional' ) >= 0 &&\n\t\t\t\tstatus === 'untranslated'\n\t\t\t) {\n\t\t\t\tstatus = 'optional';\n\t\t\t\tstatusClass = 'tux-status-optional';\n\t\t\t}\n\n\t\t\t// Fuzzy translations need warning class\n\t\t\tif ( status === 'fuzzy' ) {\n\t\t\t\tstatusClass = statusClass + ' tux-notice';\n\t\t\t}\n\n\t\t\t// Label the status if it is not untranslated\n\t\t\tif ( status !== 'untranslated' ) {\n\t\t\t\t// Give grep a chance to find the usages:\n\t\t\t\t// tux-status-optional, tux-status-fuzzy, tux-status-proofread,\n\t\t\t\t// tux-status-translated, tux-status-saving, tux-status-unsaved\n\t\t\t\tstatusMsg = 'tux-status-' + status;\n\t\t\t}\n\n\t\t\tif ( targetLangCode === mw.config.get( 'wgTranslateDocumentationLanguageCode' ) ) {\n\t\t\t\ttargetLangAttrib = mw.config.get( 'wgContentLanguage' );\n\t\t\t\ttargetLangDir = $.uls.data.getDir( targetLangAttrib );\n\t\t\t} else {\n\t\t\t\ttargetLangAttrib = targetLangCode;\n\t\t\t\ttargetLangDir = this.$container.data( 'targetlangdir' );\n\t\t\t}\n\n\t\t\t$message = $( '<div>' )\n\t\t\t\t.addClass( 'row message tux-message-item ' + status )\n\t\t\t\t.append(\n\t\t\t\t\t$( '<div>' )\n\t\t\t\t\t\t.addClass( 'eight columns tux-list-message' )\n\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\t$( '<span>' )\n\t\t\t\t\t\t\t\t.addClass( 'tux-list-source' )\n\t\t\t\t\t\t\t\t.attr( {\n\t\t\t\t\t\t\t\t\tlang: sourceLangCode,\n\t\t\t\t\t\t\t\t\tdir: sourceLangDir\n\t\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t\t.text( message.definition ),\n\t\t\t\t\t\t\t// Bidirectional isolation.\n\t\t\t\t\t\t\t// This should be removed some day when proper\n\t\t\t\t\t\t\t// unicode-bidi: isolate\n\t\t\t\t\t\t\t// is supported everywhere\n\t\t\t\t\t\t\t$( '<span>' )\n\t\t\t\t\t\t\t\t.html( $( document.body ).hasClass( 'rtl' ) ? '&rlm;' : '&lrm;' ),\n\t\t\t\t\t\t\t$( '<span>' )\n\t\t\t\t\t\t\t\t.addClass( 'tux-list-translation' )\n\t\t\t\t\t\t\t\t.attr( {\n\t\t\t\t\t\t\t\t\tlang: targetLangAttrib,\n\t\t\t\t\t\t\t\t\tdir: targetLangDir\n\t\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t\t.text( message.translation || '' )\n\t\t\t\t\t\t),\n\t\t\t\t\t$( '<div>' )\n\t\t\t\t\t\t.addClass( 'two columns tux-list-status text-center' )\n\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\t$( '<span>' )\n\t\t\t\t\t\t\t\t.addClass( statusClass )\n\t\t\t\t\t\t\t\t// The following messages are used here:\n\t\t\t\t\t\t\t\t// * tux-status-optional\n\t\t\t\t\t\t\t\t// * tux-status-fuzzy\n\t\t\t\t\t\t\t\t// * tux-status-proofread\n\t\t\t\t\t\t\t\t// * tux-status-translated\n\t\t\t\t\t\t\t\t// * tux-status-saving\n\t\t\t\t\t\t\t\t// * tux-status-unsaved\n\t\t\t\t\t\t\t\t.text( statusMsg ? mw.msg( statusMsg ) : '' )\n\t\t\t\t\t\t),\n\t\t\t\t\t$( '<div>' )\n\t\t\t\t\t\t.addClass( 'two column tux-list-edit text-right' )\n\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\t$( '<a>' )\n\t\t\t\t\t\t\t\t.attr( {\n\t\t\t\t\t\t\t\t\ttitle: mw.msg( 'translate-edit-title', message.key ),\n\t\t\t\t\t\t\t\t\thref: mw.util.getUrl( message.title, { action: 'edit' } )\n\t\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t\t.text( mw.msg( 'tux-edit' ) )\n\t\t\t\t\t\t)\n\t\t\t\t);\n\n\t\t\t$messageWrapper.append( $message );\n\t\t\tthis.$container.append( $messageWrapper );\n\n\t\t\t// Attach translate editor to the message\n\t\t\t$messageWrapper.translateeditor( {\n\t\t\t\tmessage: message\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t * Add a message to the message table for proofreading.\n\t\t *\n\t\t * @param {Object} message\n\t\t */\n\t\taddProofread: function ( message ) {\n\t\t\tvar $message, $icon;\n\n\t\t\t$message = $( '<div>' )\n\t\t\t\t.addClass( 'row tux-message tux-message-proofread' );\n\n\t\t\tthis.$container.append( $message );\n\t\t\t$message.proofread( {\n\t\t\t\tmessage: message,\n\t\t\t\tsourcelangcode: this.$container.data( 'sourcelangcode' ),\n\t\t\t\ttargetlangcode: this.$container.data( 'targetlangcode' )\n\t\t\t} );\n\n\t\t\t$icon = $message.find( '.tux-proofread-action' );\n\t\t\tif ( $icon.length === 0 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Add autotooltip to first available proofread action icon\n\t\t\tif ( this.firstProofreadTipShown ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.firstProofreadTipShown = true;\n\t\t\t$icon.addClass( 'autotooltip' );\n\n\t\t\tmw.loader.using( 'oojs-ui-core' ).done( function () {\n\t\t\t\tvar tooltip = new OO.ui.PopupWidget( {\n\t\t\t\t\tpadded: true,\n\t\t\t\t\talign: 'center',\n\t\t\t\t\twidth: 250,\n\t\t\t\t\tclasses: [ 'translate-tooltip' ],\n\t\t\t\t\t$content: $( '<p>' ).text( $icon.prop( 'title' ) )\n\t\t\t\t} );\n\n\t\t\t\tsetTimeout( function () {\n\t\t\t\t\tvar offset, $visibleIcon = $( '.autotooltip:visible' );\n\t\t\t\t\tif ( !$visibleIcon.length ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\toffset = $visibleIcon.offset();\n\t\t\t\t\ttooltip.$element.appendTo( document.body );\n\t\t\t\t\ttooltip.toggle( true ).toggleClipping( false ).togglePositioning( false );\n\t\t\t\t\ttooltip.$element.css( {\n\t\t\t\t\t\ttop: offset.top + $visibleIcon.outerHeight() + 5,\n\t\t\t\t\t\tleft: offset.left + $visibleIcon.outerWidth() - tooltip.$element.width() / 2 - 15\n\t\t\t\t\t} );\n\n\t\t\t\t\tsetTimeout( function () {\n\t\t\t\t\t\ttooltip.$element.remove();\n\t\t\t\t\t}, 4000 );\n\t\t\t\t}, 1000 );\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t * Add a message to the message table for wiki page mode.\n\t\t *\n\t\t * @param {Object} message\n\t\t */\n\t\taddPageModeMessage: function ( message ) {\n\t\t\tvar $message;\n\n\t\t\t$message = $( '<div>' )\n\t\t\t\t.addClass( 'row tux-message tux-message-pagemode' );\n\n\t\t\tthis.$container.append( $message );\n\t\t\t$message.pagemode( {\n\t\t\t\tmessage: message,\n\t\t\t\tsourcelangcode: this.$container.data( 'sourcelangcode' ),\n\t\t\t\ttargetlangcode: this.$container.data( 'targetlangcode' )\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t * Search the message filter\n\t\t *\n\t\t * @param {string} query\n\t\t */\n\t\tsearch: function ( query ) {\n\t\t\tvar $note, $button, $result,\n\t\t\t\tresultCount = 0,\n\t\t\t\tmatcher = new RegExp( '(^|\\\\s|\\\\b)' + escapeRegex( query ), 'gi' );\n\n\t\t\tthis.$container.find( itemsClass[ this.mode ] ).each( function () {\n\t\t\t\tvar $message = $( this ),\n\t\t\t\t\tmessage = ( $message.data( 'translateeditor' ) ||\n\t\t\t\t\t\t$message.data( 'pagemode' ) ||\n\t\t\t\t\t\t$message.data( 'proofread' ) ).message;\n\n\t\t\t\tif ( matcher.test( message.definition ) || matcher.test( message.translation ) ) {\n\t\t\t\t\t$message.removeClass( 'hide' );\n\t\t\t\t\tresultCount++;\n\t\t\t\t} else {\n\t\t\t\t\t$message.addClass( 'hide' );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t$result = this.$container.find( '.tux-message-filter-result' );\n\t\t\tif ( !$result.length ) {\n\t\t\t\t$note = $( '<div>' )\n\t\t\t\t\t.addClass( 'advanced-search' );\n\n\t\t\t\t$button = $( '<button>' )\n\t\t\t\t\t.addClass( 'mw-ui-button' )\n\t\t\t\t\t.text( mw.msg( 'tux-message-filter-advanced-button' ) );\n\n\t\t\t\t$result = $( '<div>' )\n\t\t\t\t\t.addClass( 'tux-message-filter-result' )\n\t\t\t\t\t.append( $note, $button );\n\n\t\t\t\tthis.$container.prepend( $result );\n\t\t\t}\n\n\t\t\tif ( !query ) {\n\t\t\t\t$result.addClass( 'hide' );\n\t\t\t} else {\n\t\t\t\t$result.removeClass( 'hide' )\n\t\t\t\t\t.find( '.advanced-search' )\n\t\t\t\t\t.text( mw.msg( 'tux-message-filter-result', resultCount, query ) );\n\t\t\t\t$result.find( 'button' ).on( 'click', function () {\n\t\t\t\t\twindow.location.href = mw.util.getUrl( 'Special:SearchTranslations', { query: query } );\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tthis.updateLastMessage();\n\n\t\t\t// Trigger a scroll event for the window to make sure all floating toolbars\n\t\t\t// are in their position.\n\t\t\t$( window ).trigger( 'scroll' );\n\t\t},\n\n\t\tresize: function () {\n\t\t\tvar actualWidth = 0, $messageSelector = $( '.row.tux-message-selector' );\n\n\t\t\tif ( $messageSelector.is( ':hidden' ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Calculate the total width required for the filters\n\t\t\t$messageSelector.children( 'li' ).each( function () {\n\t\t\t\tactualWidth += $( this ).outerWidth( true );\n\t\t\t} );\n\n\t\t\t// Grid row has a min width. After that scrollbars will appear.\n\t\t\t// We are checking whether the message table is wider than the current grid row width.\n\t\t\tif ( actualWidth >= parseInt( $( '.nine.columns' ).width(), 10 ) ) {\n\t\t\t\t$( '.tux-message-selector .more ul' ) // Overflow menu\n\t\t\t\t\t.prepend( $( '.row.tux-message-selector > li.column:last' ).prev() );\n\n\t\t\t\t// See if more items to be pushed to the overflow menu\n\t\t\t\tthis.resize();\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Start loading messages again with new settings.\n\t\t *\n\t\t * @param {Object} changes\n\t\t */\n\t\tchangeSettings: function ( changes ) {\n\t\t\t// Clear current messages\n\t\t\tthis.clear();\n\t\t\tthis.settings = $.extend( this.settings, changes );\n\n\t\t\tif ( this.initialized === false ) {\n\t\t\t\tthis.switchMode( this.mode );\n\t\t\t}\n\n\t\t\t// Reset the number of messages remaining\n\t\t\tthis.$loaderInfo.text(\n\t\t\t\tmw.msg( 'tux-messagetable-loading-messages', this.$loader.data( 'pagesize' ) )\n\t\t\t);\n\n\t\t\t// Update the target language\n\t\t\tthis.$container.data( 'targetlangcode', this.settings.language );\n\n\t\t\t// Reset the statsbar\n\t\t\tthis.$statsBar\n\t\t\t\t.empty()\n\t\t\t\t.removeData()\n\t\t\t\t.languagestatsbar( {\n\t\t\t\t\tlanguage: this.settings.language,\n\t\t\t\t\tgroup: this.settings.group\n\t\t\t\t} );\n\n\t\t\tthis.initialized = true;\n\t\t\t// Reset other info and make visible\n\t\t\tthis.$loader\n\t\t\t\t.removeData( 'offset' )\n\t\t\t\t.removeAttr( 'data-offset' )\n\t\t\t\t.removeClass( 'hide' );\n\n\t\t\tif ( changes.offset ) {\n\t\t\t\tthis.$loader.data( 'offset', changes.offset );\n\t\t\t}\n\n\t\t\tthis.$header.removeClass( 'hide' );\n\t\t\tthis.$actionBar.removeClass( 'hide' );\n\n\t\t\t// Start loading messages\n\t\t\tthis.load( changes.limit );\n\t\t},\n\n\t\t/**\n\t\t * @param {number} [limit] Only load this many messages and then stop even if there is more.\n\t\t */\n\t\tload: function ( limit ) {\n\t\t\tvar remaining,\n\t\t\t\tquery,\n\t\t\t\tself = this,\n\t\t\t\toffset = this.$loader.data( 'offset' ),\n\t\t\t\tpageSize = limit || this.$loader.data( 'pagesize' );\n\n\t\t\tif ( offset === -1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( this.loading ) {\n\t\t\t\t// Avoid duplicate loading - the offset will be wrong and it will result\n\t\t\t\t// in duplicate messages shown in the page\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.loading = true;\n\t\t\tthis.$loaderIcon.removeClass( 'tux-loading-indicator--stopped' );\n\n\t\t\tmw.translate.getMessages(\n\t\t\t\tthis.settings.group,\n\t\t\t\tthis.settings.language,\n\t\t\t\toffset,\n\t\t\t\tpageSize,\n\t\t\t\tthis.settings.filter\n\t\t\t).done( function ( result ) {\n\t\t\t\tvar messages = result.query.messagecollection,\n\t\t\t\t\tstate, i;\n\n\t\t\t\tif ( !self.loading ) {\n\t\t\t\t\t// reject. This was cancelled.\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif ( result.warnings ) {\n\t\t\t\t\tfor ( i = 0; i !== result.warnings.length; i++ ) {\n\t\t\t\t\t\tif ( result.warnings[ i ].code === 'translate-language-disabled-source' ) {\n\t\t\t\t\t\t\tself.handleLoadErrors( [ result.warnings[ i ] ] );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif ( messages.length === 0 ) {\n\t\t\t\t\t// And this is the first load for the filter...\n\t\t\t\t\tif ( self.$container.children().length === 0 ) {\n\t\t\t\t\t\tself.displayEmptyListHelp();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tmessages.forEach( function ( message, index ) {\n\t\t\t\t\tmessage.group = self.settings.group;\n\t\t\t\t\tself.add( message );\n\t\t\t\t\tself.messages.push( message );\n\n\t\t\t\t\tif ( index === 0 && self.mode === 'translate' ) {\n\t\t\t\t\t\t$( '.tux-message:first' ).data( 'translateeditor' ).init();\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tstate = result.query.metadata && result.query.metadata.state;\n\t\t\t\t$( '.tux-workflow' ).workflowselector(\n\t\t\t\t\tself.settings.group,\n\t\t\t\t\tself.settings.language,\n\t\t\t\t\tstate\n\t\t\t\t).removeClass( 'hide' );\n\n\t\t\t\t// Dynamically loaded messages should pass the search filter if present.\n\t\t\t\tquery = $( '.tux-message-filter-box' ).val();\n\n\t\t\t\tif ( query ) {\n\t\t\t\t\tself.search( query );\n\t\t\t\t}\n\n\t\t\t\tif ( result[ 'query-continue' ] === undefined || limit ) {\n\t\t\t\t\t// End of messages\n\t\t\t\t\tself.$loader.data( 'offset', -1 )\n\t\t\t\t\t\t.addClass( 'hide' );\n\n\t\t\t\t\t// Helpfully open the first message in show mode\n\t\t\t\t\t// TODO: Refactor to avoid direct DOM access\n\t\t\t\t\t$( '.tux-message-item' ).first().trigger( 'click' );\n\t\t\t\t} else {\n\t\t\t\t\tself.$loader.data( 'offset', result[ 'query-continue' ].messagecollection.mcoffset );\n\n\t\t\t\t\tremaining = result.query.metadata.remaining;\n\n\t\t\t\t\tself.$loaderInfo.text(\n\t\t\t\t\t\tmw.msg( 'tux-messagetable-more-messages', remaining )\n\t\t\t\t\t);\n\n\t\t\t\t\t// Make sure the floating toolbars are visible without the need for scroll\n\t\t\t\t\t$( window ).trigger( 'scroll' );\n\t\t\t\t}\n\n\t\t\t\tself.updateHideOwnInProofreadingToggleVisibility();\n\t\t\t\tself.updateLastMessage();\n\t\t\t} ).fail( function ( errorCode, response ) {\n\t\t\t\tself.handleLoadErrors( response.errors, errorCode );\n\t\t\t} ).always( function () {\n\t\t\t\tself.$loaderIcon.addClass( 'tux-loading-indicator--stopped' );\n\t\t\t\tself.loading = false;\n\t\t\t} );\n\t\t},\n\n\t\tupdateLastMessage: function () {\n\t\t\tvar $messages = this.$container.find( itemsClass[ this.mode ] );\n\n\t\t\t// If a message was previously marked as \"last\", restore it to normal state\n\t\t\t$messages.filter( '.last-message' ).removeClass( 'last-message' );\n\n\t\t\t// At the class to the current last shown message\n\t\t\t$messages\n\t\t\t\t.not( '.hide' )\n\t\t\t\t.last()\n\t\t\t\t.addClass( 'last-message' );\n\t\t},\n\n\t\t/**\n\t\t * Creates a uniformly styled button for different actions,\n\t\t * shown when there are no messages to display.\n\t\t *\n\t\t * @param {string} labelMsg A message key for the button label.\n\t\t * @param {Function} callback A callback for clicking the button.\n\t\t * @return {jQuery} A button element.\n\t\t */\n\t\totherActionButton: function ( labelMsg, callback ) {\n\t\t\treturn $( '<button>' )\n\t\t\t\t.addClass( 'mw-ui-button mw-ui-progressive mw-ui-big' )\n\t\t\t\t.text( mw.msg( labelMsg ) )\n\t\t\t\t.on( 'click', callback );\n\t\t},\n\n\t\t/**\n\t\t * Enables own message hiding in proofread mode.\n\t\t *\n\t\t * @param {boolean} enabled\n\t\t */\n\t\tsetHideOwnInProofreading: function ( enabled ) {\n\t\t\tif ( enabled ) {\n\t\t\t\tthis.$container.addClass( 'tux-hide-own' );\n\t\t\t} else {\n\t\t\t\tthis.$container.removeClass( 'tux-hide-own' );\n\t\t\t}\n\t\t},\n\n\t\tupdateHideOwnInProofreadingToggleVisibility: function () {\n\t\t\tif ( this.$container.find( '.tux-message-proofread.own-translation' ).length ) {\n\t\t\t\tthis.$proofreadOwnTranslations.removeClass( 'hide' );\n\t\t\t} else {\n\t\t\t\tthis.$proofreadOwnTranslations.addClass( 'hide' );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * If the user selection doesn't show anything,\n\t\t * give some pointers to other things to do.\n\t\t */\n\t\tdisplayEmptyListHelp: function () {\n\t\t\tvar messageTable = this,\n\t\t\t\t// @todo Ugly! This should be provided somehow\n\t\t\t\tselectedTab = $( '.tux-message-selector .selected' ).data( 'title' ),\n\t\t\t\t$wrap = $( '<div>' ).addClass( 'tux-empty-list' ),\n\t\t\t\t$emptyListHeader = $( '<div>' ).addClass( 'tux-empty-list-header' ),\n\t\t\t\t$guide = $( '<div>' ).addClass( 'tux-empty-list-guide' ),\n\t\t\t\t$actions = $( '<div>' ).addClass( 'tux-empty-list-actions' );\n\n\t\t\tif ( messageTable.mode === 'proofread' ) {\n\t\t\t\tif ( selectedTab === 'all' ) {\n\t\t\t\t\t$emptyListHeader.text( mw.msg( 'tux-empty-no-messages-to-display' ) );\n\t\t\t\t\t$guide.append(\n\t\t\t\t\t\t$( '<p>' )\n\t\t\t\t\t\t\t.text( mw.msg( 'tux-empty-there-are-optional' ) ),\n\t\t\t\t\t\t$( '<a>' )\n\t\t\t\t\t\t\t.attr( 'href', '#' )\n\t\t\t\t\t\t\t.text( mw.msg( 'tux-empty-show-optional-messages' ) )\n\t\t\t\t\t\t\t.on( 'click', function ( e ) {\n\t\t\t\t\t\t\t\t$( '#tux-option-optional' ).trigger( 'click' );\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t} )\n\t\t\t\t\t);\n\t\t\t\t} else if ( selectedTab === 'outdated' ) {\n\t\t\t\t\t$emptyListHeader.text( mw.msg( 'tux-empty-no-outdated-messages' ) );\n\t\t\t\t\t$guide.text( mw.msg( 'tux-empty-list-other-guide' ) );\n\t\t\t\t\t$actions.append( messageTable.otherActionButton(\n\t\t\t\t\t\t'tux-empty-list-other-action',\n\t\t\t\t\t\tfunction () {\n\t\t\t\t\t\t\t$( '.tux-tab-unproofread' ).trigger( 'click' );\n\t\t\t\t\t\t\t// @todo untranslated\n\t\t\t\t\t\t} )\n\t\t\t\t\t);\n\t\t\t\t\t// @todo View all\n\t\t\t\t} else if ( selectedTab === 'translated' ) {\n\t\t\t\t\t$emptyListHeader.text( mw.msg( 'tux-empty-nothing-to-proofread' ) );\n\t\t\t\t\t$guide.text( mw.msg( 'tux-empty-you-can-help-providing' ) );\n\t\t\t\t\t$actions.append( messageTable.otherActionButton(\n\t\t\t\t\t\t'tux-empty-list-translated-action',\n\t\t\t\t\t\tfunction () {\n\t\t\t\t\t\t\tmessageTable.switchMode( 'translate' );\n\t\t\t\t\t\t} )\n\t\t\t\t\t);\n\t\t\t\t} else if ( selectedTab === 'unproofread' ) {\n\t\t\t\t\t$emptyListHeader.text( mw.msg( 'tux-empty-nothing-new-to-proofread' ) );\n\t\t\t\t\t$guide.text( mw.msg( 'tux-empty-you-can-help-providing' ) );\n\t\t\t\t\t$actions.append( messageTable.otherActionButton(\n\t\t\t\t\t\t'tux-empty-you-can-review-already-proofread',\n\t\t\t\t\t\tfunction () {\n\t\t\t\t\t\t\t$( '.tux-tab-translated' ).trigger( 'click' );\n\t\t\t\t\t\t} )\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif ( selectedTab === 'all' ) {\n\t\t\t\t\t$emptyListHeader.text( mw.msg( 'tux-empty-list-all' ) );\n\t\t\t\t\t$guide.text( mw.msg( 'tux-empty-list-all-guide' ) );\n\t\t\t\t} else if ( selectedTab === 'translated' ) {\n\t\t\t\t\t$emptyListHeader.text( mw.msg( 'tux-empty-list-translated' ) );\n\t\t\t\t\t$guide.text( mw.msg( 'tux-empty-list-translated-guide' ) );\n\t\t\t\t\t$actions.append( messageTable.otherActionButton(\n\t\t\t\t\t\t'tux-empty-list-translated-action',\n\t\t\t\t\t\tfunction () {\n\t\t\t\t\t\t\tmw.translate.changeFilter( $( '.tux-tab-untranslated' ).trigger( 'click' ) );\n\t\t\t\t\t\t} )\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\t$emptyListHeader.text( mw.msg( 'tux-empty-list-other' ) );\n\n\t\t\t\t\tif ( mw.translate.canProofread() ) {\n\t\t\t\t\t\t$guide.text( mw.msg( 'tux-empty-list-other-guide' ) );\n\t\t\t\t\t\t$actions.append( messageTable.otherActionButton(\n\t\t\t\t\t\t\t'tux-empty-list-other-action',\n\t\t\t\t\t\t\tfunction () {\n\t\t\t\t\t\t\t\tmessageTable.switchMode( 'proofread' );\n\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\t$actions.append( $( '<a>' )\n\t\t\t\t\t\t.text( mw.msg( 'tux-empty-list-other-link' ) )\n\t\t\t\t\t\t.on( 'click', function () {\n\t\t\t\t\t\t\t$( '.tux-tab-all' ).trigger( 'click' );\n\t\t\t\t\t\t} )\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$wrap.append( $emptyListHeader, $guide, $actions );\n\t\t\tthis.$container.append( $wrap );\n\t\t},\n\n\t\t/**\n\t\t * Switch the message table mode\n\t\t *\n\t\t * @param {string} mode The message table mode to switch to: translate, page or proofread\n\t\t */\n\t\tswitchMode: function ( mode ) {\n\t\t\tvar messageTable = this,\n\t\t\t\tfilter = this.settings.filter,\n\t\t\t\tuserId = mw.config.get( 'wgUserId' ),\n\t\t\t\t$tuxTabUntranslated,\n\t\t\t\t$tuxTabUnproofread,\n\t\t\t\t$hideTranslatedButton;\n\n\t\t\tmessageTable.$actionBar.find( '.tux-view-switcher .down' ).removeClass( 'down' );\n\t\t\tif ( mode === 'translate' ) {\n\t\t\t\tmessageTable.$actionBar.find( '.translate-mode-button' ).addClass( 'down' );\n\t\t\t}\n\t\t\tif ( mode === 'proofread' ) {\n\t\t\t\tmessageTable.$actionBar.find( '.proofread-mode-button' ).addClass( 'down' );\n\t\t\t}\n\t\t\tif ( mode === 'page' ) {\n\t\t\t\tmessageTable.$actionBar.find( '.page-mode-button' ).addClass( 'down' );\n\t\t\t}\n\n\t\t\tmessageTable.firstProofreadTipShown = false;\n\n\t\t\tmessageTable.mode = mode;\n\t\t\tmw.translate.changeUrl( { action: messageTable.mode } );\n\n\t\t\t// Emulate clear without clearing loaded messages\n\t\t\tmessageTable.$container.empty();\n\t\t\t$( '.translate-tooltip' ).remove();\n\n\t\t\t$tuxTabUntranslated = $( '.tux-message-selector > .tux-tab-untranslated' );\n\t\t\t$tuxTabUnproofread = $( '.tux-message-selector > .tux-tab-unproofread' );\n\t\t\t$hideTranslatedButton = messageTable.$actionBar.find( '.tux-editor-clear-translated' );\n\n\t\t\tif ( messageTable.mode === 'proofread' ) {\n\t\t\t\t$tuxTabUntranslated.addClass( 'hide' );\n\t\t\t\t$tuxTabUnproofread.removeClass( 'hide' );\n\n\t\t\t\t// Fix the filter if it is untranslated. Untranslated does not make sense\n\t\t\t\t// for proofread mode. Keep the filter if it is not 'untranslated'\n\t\t\t\tif ( !filter || filter.indexOf( '!translated' ) >= 0 ) {\n\t\t\t\t\tmessageTable.messages = [];\n\t\t\t\t\t// default filter for proofread mode\n\t\t\t\t\tmw.translate.changeFilter( 'translated|!reviewer:' + userId +\n\t\t\t\t\t\t'|!last-translator:' + userId );\n\t\t\t\t\t$tuxTabUnproofread.addClass( 'selected' );\n\t\t\t\t\t// Own translations are not present in proofread + unreviewed mode\n\t\t\t\t}\n\n\t\t\t\t$hideTranslatedButton.addClass( 'hide' );\n\t\t\t} else {\n\t\t\t\t$tuxTabUntranslated.removeClass( 'hide' );\n\t\t\t\t$tuxTabUnproofread.addClass( 'hide' );\n\n\t\t\t\tif ( filter.indexOf( '!translated' ) > -1 ) {\n\t\t\t\t\t$hideTranslatedButton.removeClass( 'hide' );\n\t\t\t\t}\n\n\t\t\t\tif ( filter && filter.indexOf( '!last-translator' ) >= 0 ) {\n\t\t\t\t\tmessageTable.messages = [];\n\t\t\t\t\t// default filter for translate mode\n\t\t\t\t\tmw.translate.changeFilter( '!translated' );\n\t\t\t\t\t$tuxTabUntranslated.addClass( 'selected' );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( messageTable.messages.length ) {\n\t\t\t\tmessageTable.messages.forEach( function ( message ) {\n\t\t\t\t\tmessageTable.add( message );\n\t\t\t\t} );\n\t\t\t} else if ( messageTable.initialized && !messageTable.loading ) {\n\t\t\t\tmessageTable.displayEmptyListHelp();\n\t\t\t}\n\n\t\t\tthis.$loaderInfo.text(\n\t\t\t\tmw.msg( 'tux-messagetable-loading-messages', this.$loader.data( 'pagesize' ) )\n\t\t\t);\n\n\t\t\tmessageTable.updateHideOwnInProofreadingToggleVisibility();\n\t\t\tmessageTable.updateLastMessage();\n\t\t},\n\n\t\t/**\n\t\t * The scroll handler\n\t\t */\n\t\tscroll: function () {\n\t\t\tvar $window,\n\t\t\t\tisActionBarFloating,\n\t\t\t\tneedsTableHeaderFloat, needsTableHeaderStick,\n\t\t\t\tneedsActionBarFloat, needsActionBarStick,\n\t\t\t\twindowScrollTop, windowScrollBottom,\n\t\t\t\tmessageTableRelativePos,\n\t\t\t\tmessageListOffset,\n\t\t\t\tmessageListHeight, messageListWidth,\n\t\t\t\tmessageListTop, messageListBottom;\n\n\t\t\t$window = $( window );\n\n\t\t\twindowScrollTop = $window.scrollTop();\n\t\t\twindowScrollBottom = windowScrollTop + $window.height();\n\t\t\tmessageListOffset = this.$container.offset();\n\t\t\tmessageListHeight = this.$container.height();\n\t\t\tmessageListTop = messageListOffset.top;\n\t\t\tmessageListBottom = messageListTop + messageListHeight;\n\t\t\tmessageListWidth = this.$container.width();\n\n\t\t\t// Header:\n\t\t\tmessageTableRelativePos = messageListTop - this.$header.height() - windowScrollTop;\n\t\t\tneedsTableHeaderFloat = messageTableRelativePos + 10 < 0;\n\t\t\tneedsTableHeaderStick = messageTableRelativePos - 10 >= 0;\n\t\t\tif ( needsTableHeaderFloat ) {\n\t\t\t\tthis.$header.addClass( 'floating' ).width( messageListWidth );\n\t\t\t} else if ( needsTableHeaderStick ) {\n\t\t\t\t// Let the element change width automatically again\n\t\t\t\tthis.$header.removeClass( 'floating' ).css( 'width', '' );\n\t\t\t}\n\n\t\t\t// Action bar:\n\t\t\tisActionBarFloating = this.$actionBar.hasClass( 'floating' );\n\t\t\tneedsActionBarFloat = windowScrollBottom < messageListBottom;\n\t\t\tneedsActionBarStick = windowScrollBottom > ( messageListBottom + this.$actionBar.height() );\n\n\t\t\tif ( !isActionBarFloating && needsActionBarFloat ) {\n\t\t\t\tthis.$actionBar.addClass( 'floating' ).width( messageListWidth );\n\t\t\t} else if ( isActionBarFloating && needsActionBarStick ) {\n\t\t\t\t// Let the element change width automatically again\n\t\t\t\tthis.$actionBar.removeClass( 'floating' ).css( 'width', '' );\n\t\t\t} else if ( isActionBarFloating && needsActionBarFloat ) {\n\t\t\t\tthis.$actionBar.width( messageListWidth );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Handles errors encountered during the loading state.\n\t\t * Displays the errors and updates the state of the table.\n\t\t *\n\t\t * @param {Array} errors\n\t\t * @param {string} errorCode\n\t\t */\n\t\thandleLoadErrors: function ( errors, errorCode ) {\n\t\t\tvar $warningContainer = $( '.tux-editor-header .group-warning' );\n\n\t\t\tif ( errors ) {\n\t\t\t\terrors.forEach( function ( error ) {\n\t\t\t\t\t$warningContainer.append( error.html );\n\t\t\t\t} );\n\t\t\t} else {\n\t\t\t\t$warningContainer.text( mw.msg( 'api-error-unknownerror', errorCode ) );\n\t\t\t}\n\n\t\t\t$( '.tux-workflow' ).addClass( 'hide' );\n\t\t\tthis.$loader.data( 'offset', -1 ).addClass( 'hide' );\n\t\t\tthis.$actionBar.addClass( 'hide' );\n\t\t\tthis.$header.addClass( 'hide' );\n\t\t}\n\t};\n\n\t/*\n\t * messagetable PLUGIN DEFINITION\n\t */\n\n\t$.fn.messagetable = function ( options ) {\n\t\treturn this.each( function () {\n\t\t\tvar $this = $( this ),\n\t\t\t\tdata = $this.data( 'messagetable' );\n\n\t\t\tif ( !data ) {\n\t\t\t\t$this.data( 'messagetable', ( data = new MessageTable( this, options ) ) );\n\t\t\t}\n\n\t\t\tif ( typeof options === 'string' ) {\n\t\t\t\tdata[ options ].call( $this );\n\t\t\t}\n\t\t} );\n\t};\n\n\t$.fn.messagetable.Constructor = MessageTable;\n\n\t$.fn.messagetable.defaults = {\n\t\tmode: new mw.Uri().query.action || 'translate'\n\t};\n\n\t/**\n\t * Escape the search query for regex match.\n\t *\n\t * @param {string} value A search string to be escaped.\n\t * @return {string} Escaped string that is safe to use for a search.\n\t */\n\tfunction escapeRegex( value ) {\n\t\treturn value.replace( /[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&' );\n\t}\n\n\tfunction isLoaderVisible( $loader ) {\n\t\tvar viewportBottom, elementTop,\n\t\t\t$window = $( window );\n\n\t\tviewportBottom = ( window.innerHeight ? window.innerHeight : $window.height() ) +\n\t\t\t$window.scrollTop();\n\n\t\telementTop = $loader.offset().top;\n\n\t\t// Start already if user is reaching close to the bottom\n\t\treturn elementTop - viewportBottom < 200;\n\t}\n\n}() );\n","usedDeprecatedRules":[]},{"filePath":"/src/repo/resources/js/ext.translate.navitoggle.js","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/resources/js/ext.translate.pagemode.js","messages":[{"ruleId":"mediawiki/class-doc","severity":1,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":56,"column":6,"nodeType":"CallExpression","endLine":58,"endColumn":54},{"ruleId":"mediawiki/class-doc","severity":1,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":78,"column":4,"nodeType":"CallExpression","endLine":102,"endColumn":48},{"ruleId":"mediawiki/class-doc","severity":1,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":79,"column":5,"nodeType":"CallExpression","endLine":80,"endColumn":91},{"ruleId":"mediawiki/class-doc","severity":1,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":82,"column":7,"nodeType":"CallExpression","endLine":83,"endColumn":87}],"errorCount":0,"warningCount":4,"fixableErrorCount":0,"fixableWarningCount":0,"source":"( function () {\n\t'use strict';\n\t/**\n\t * Page mode plugin\n\t *\n\t * Prepare the page mode UI with all the required actions\n\t * for a translation unit (message).\n\t * This is mainly used with the messagetable plugin in page mode,\n\t * but it is independent of messagetable.\n\t * Example usage:\n\t *\n\t * $( 'div.pagemode' ).pagemode( {\n\t *     message: messageObject, // Mandatory message object\n\t *     sourcelangcode: 'en', // Mandatory source language code\n\t *     targetlangcode: 'hi' // Mandatory target language code\n\t * } );\n\t *\n\t * @param {Element} element\n\t * @param {Object} options\n\t * @param {Object} options.message\n\t * @param {string} options.sourcelangcode Language code.\n\t * @param {string} options.targetlangcode Language code.\n\t */\n\tfunction PageMode( element, options ) {\n\t\tthis.$message = $( element );\n\t\tthis.options = options;\n\t\tthis.message = this.options.message;\n\t\tthis.init();\n\t\tthis.listen();\n\t}\n\n\tPageMode.prototype = {\n\n\t\t/**\n\t\t * Initialize the plugin\n\t\t */\n\t\tinit: function () {\n\t\t\tvar pagemode = this;\n\n\t\t\tthis.message.proofreadable = false;\n\n\t\t\tthis.render();\n\n\t\t\tpagemode.$message.translateeditor( {\n\t\t\t\tmessage: pagemode.message,\n\t\t\t\tbeforeSave: function ( translation ) {\n\t\t\t\t\tpagemode.$message.find( '.tux-pagemode-translation' )\n\t\t\t\t\t\t.html( mw.translate.formatMessageGently( translation || '', pagemode.message.key ) )\n\t\t\t\t\t\t.addClass( 'highlight' );\n\t\t\t\t},\n\t\t\t\tonSave: function ( translation ) {\n\t\t\t\t\tpagemode.$message.find( '.tux-pagemode-translation' )\n\t\t\t\t\t\t.removeClass( 'highlight' );\n\t\t\t\t\tpagemode.message.translation = translation;\n\n\t\t\t\t\tpagemode.$message.find( '.tux-pagemode-status' )\n\t\t\t\t\t\t.removeClass( 'translated fuzzy proofread untranslated' )\n\t\t\t\t\t\t.addClass( pagemode.message.properties.status );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t},\n\n\t\trender: function () {\n\t\t\tvar targetLangAttrib, targetLangDir,\n\t\t\t\tsourceLangDir = $.uls.data.getDir( this.options.sourcelangcode );\n\n\t\t\tif ( this.options.targetlangcode ===\n\t\t\t\tmw.config.get( 'wgTranslateDocumentationLanguageCode' )\n\t\t\t) {\n\t\t\t\ttargetLangAttrib = mw.config.get( 'wgContentLanguage' );\n\t\t\t} else {\n\t\t\t\ttargetLangAttrib = this.options.targetlangcode;\n\t\t\t}\n\n\t\t\ttargetLangDir = $.uls.data.getDir( targetLangAttrib );\n\n\t\t\tthis.$message.append(\n\t\t\t\t$( '<div>' )\n\t\t\t\t\t.addClass( 'row tux-message-item-compact message ' + this.message.properties.status )\n\t\t\t\t\t.append(\n\t\t\t\t\t\t$( '<div>' )\n\t\t\t\t\t\t\t.addClass( 'one column tux-pagemode-status ' + this.message.properties.status ),\n\t\t\t\t\t\t$( '<div>' )\n\t\t\t\t\t\t\t.addClass( 'five columns tux-pagemode-source' )\n\t\t\t\t\t\t\t.attr( {\n\t\t\t\t\t\t\t\tlang: this.options.sourcelangcode,\n\t\t\t\t\t\t\t\tdir: sourceLangDir\n\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t.html( mw.translate.formatMessageGently( this.message.definition, this.message.key ) ),\n\t\t\t\t\t\t$( '<div>' )\n\t\t\t\t\t\t\t.addClass( 'five columns tux-pagemode-translation' )\n\t\t\t\t\t\t\t.attr( {\n\t\t\t\t\t\t\t\tlang: targetLangAttrib,\n\t\t\t\t\t\t\t\tdir: targetLangDir\n\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t.html( mw.translate.formatMessageGently( this.message.translation || '', this.message.key ) ),\n\t\t\t\t\t\t$( '<div>' )\n\t\t\t\t\t\t\t.attr( 'title', mw.msg( 'translate-edit-title', this.message.key ) )\n\t\t\t\t\t\t\t.addClass( 'tux-pagemode-edit' )\n\t\t\t\t\t)\n\t\t\t).addClass( this.message.properties.status );\n\t\t},\n\n\t\t/**\n\t\t * Attach event listeners\n\t\t */\n\t\tlisten: function () {\n\t\t\tvar pagemode = this;\n\n\t\t\tthis.$message.children( '.message' ).on( 'click', function ( e ) {\n\t\t\t\tpagemode.$message.data( 'translateeditor' ).show();\n\t\t\t\te.preventDefault();\n\t\t\t} );\n\t\t}\n\t};\n\n\t/*\n\t * pagemode PLUGIN DEFINITION\n\t */\n\t$.fn.pagemode = function ( options ) {\n\t\treturn this.each( function () {\n\t\t\tvar $this = $( this ),\n\t\t\t\tdata = $this.data( 'pagemode' );\n\n\t\t\tif ( !data ) {\n\t\t\t\t$this.data( 'pagemode', new PageMode( this, options ) );\n\t\t\t}\n\t\t} );\n\t};\n\n\t$.fn.pagemode.Constructor = PageMode;\n}() );\n","usedDeprecatedRules":[]},{"filePath":"/src/repo/resources/js/ext.translate.pagetranslation.uls.js","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/resources/js/ext.translate.parsers.js","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/resources/js/ext.translate.proofread.js","messages":[{"ruleId":"mediawiki/class-doc","severity":1,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":64,"column":6,"nodeType":"CallExpression","endLine":66,"endColumn":55},{"ruleId":"mediawiki/class-doc","severity":1,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":95,"column":23,"nodeType":"CallExpression","endLine":99,"endColumn":6},{"ruleId":"mediawiki/class-doc","severity":1,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":121,"column":4,"nodeType":"CallExpression","endLine":154,"endColumn":48},{"ruleId":"mediawiki/class-doc","severity":1,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":125,"column":7,"nodeType":"CallExpression","endLine":126,"endColumn":88}],"errorCount":0,"warningCount":4,"fixableErrorCount":0,"fixableWarningCount":0,"source":"( function () {\n\t'use strict';\n\n\t/**\n\t * Proofread Plugin\n\t * Prepare a proofread UI with all the required actions\n\t * for a translation unit (message).\n\t * This is mainly used with the messagetable plugin in proofread mode,\n\t * but it is independent of messagetable.\n\t * Example usage:\n\t *\n\t * $( 'div.proofread' ).proofread( {\n\t *     message: messageObject, // Mandatory message object\n\t *     sourcelangcode: 'en', // Mandatory source language code\n\t *     targetlangcode: 'hi' // Mandatory target language code\n\t * } );\n\t *\n\t * @param {Element} element\n\t * @param {Object} options\n\t * @param {Object} options.message\n\t * @param {string} options.sourcelangcode Language code.\n\t * @param {string} options.targetlangcode Language code.\n\t */\n\tfunction Proofread( element, options ) {\n\t\tthis.$message = $( element );\n\t\tthis.options = options;\n\t\tthis.message = this.options.message;\n\t\tthis.init();\n\t\tthis.listen();\n\t}\n\n\tProofread.prototype = {\n\n\t\t/**\n\t\t * Initialize the plugin\n\t\t */\n\t\tinit: function () {\n\t\t\tvar proofread = this;\n\n\t\t\tthis.render();\n\n\t\t\t// No review before translating.\n\t\t\tif ( !this.message.translation ) {\n\t\t\t\tthis.disableProofread();\n\t\t\t}\n\n\t\t\t// No review for fuzzy messages.\n\t\t\tif ( this.message.properties.status === 'fuzzy' ) {\n\t\t\t\tthis.disableProofread();\n\t\t\t}\n\n\t\t\tif ( !mw.translate.canProofread() ) {\n\t\t\t\tthis.disableProofread();\n\t\t\t}\n\n\t\t\tproofread.$message.translateeditor( {\n\t\t\t\tmessage: proofread.message,\n\t\t\t\tonSave: function ( translation ) {\n\t\t\t\t\tproofread.$message.find( '.tux-proofread-translation' )\n\t\t\t\t\t\t.text( translation );\n\t\t\t\t\tproofread.message.translation = translation;\n\t\t\t\t\tproofread.markSelfTranslation();\n\n\t\t\t\t\tproofread.$message.find( '.tux-proofread-status' )\n\t\t\t\t\t\t.removeClass( 'translated fuzzy proofread untranslated' )\n\t\t\t\t\t\t.addClass( proofread.message.properties.status );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t},\n\n\t\trender: function () {\n\t\t\tvar targetLangCode, targetLangDir, targetLangAttrib,\n\t\t\t\tsourceLangCode, sourceLangDir,\n\t\t\t\t$proofreadAction, $proofreadEdit, userId, reviewers, otherReviewers,\n\t\t\t\ttranslatedBySelf, proofreadBySelf;\n\n\t\t\t// List of all reviewers\n\t\t\treviewers = this.message.properties.reviewers || [];\n\t\t\t// The id of the current user, converted to string as the are in reviewers\n\t\t\tuserId = String( mw.config.get( 'wgUserId' ) );\n\t\t\t// List of all reviewers excluding the current user.\n\t\t\totherReviewers = reviewers.filter( function ( element ) {\n\t\t\t\treturn element !== userId;\n\t\t\t} );\n\t\t\t/* Whether the current user if the last translator of this message.\n\t\t\t * Accepting own translations is prohibited. */\n\t\t\ttranslatedBySelf = ( this.message.properties[ 'last-translator-text' ] === mw.user.getName() );\n\t\t\tproofreadBySelf = reviewers.indexOf( userId ) > -1;\n\n\t\t\tsourceLangCode = this.options.sourcelangcode;\n\t\t\tsourceLangDir = $.uls.data.getDir( sourceLangCode );\n\t\t\ttargetLangCode = this.options.targetlangcode;\n\n\t\t\t$proofreadAction = $( '<div>' )\n\t\t\t\t.attr( 'title', mw.msg( 'tux-proofread-action-tooltip' ) )\n\t\t\t\t.addClass(\n\t\t\t\t\t'tux-proofread-action ' + this.message.properties.status + ' ' + ( proofreadBySelf ? 'accepted' : '' )\n\t\t\t\t);\n\n\t\t\t$proofreadEdit = $( '<div>' )\n\t\t\t\t.addClass( 'tux-proofread-edit' )\n\t\t\t\t.append( $( '<span>' )\n\t\t\t\t\t.addClass( 'tux-proofread-edit-label hide' )\n\t\t\t\t\t.text( mw.msg( 'tux-proofread-edit-label' ) )\n\t\t\t\t)\n\t\t\t\t.on( 'mouseover', function () {\n\t\t\t\t\t$( this ).find( '.tux-proofread-edit-label' ).removeClass( 'hide' );\n\t\t\t\t} )\n\t\t\t\t.on( 'mouseout', function () {\n\t\t\t\t\t$( this ).find( '.tux-proofread-edit-label' ).addClass( 'hide' );\n\t\t\t\t} );\n\n\t\t\tif ( targetLangCode === mw.config.get( 'wgTranslateDocumentationLanguageCode' ) ) {\n\t\t\t\ttargetLangAttrib = mw.config.get( 'wgContentLanguage' );\n\t\t\t} else {\n\t\t\t\ttargetLangAttrib = targetLangCode;\n\t\t\t}\n\t\t\ttargetLangDir = $.uls.data.getDir( targetLangAttrib );\n\n\t\t\tthis.$message.append(\n\t\t\t\t$( '<div>' )\n\t\t\t\t\t.addClass( 'row tux-message-item-compact message' )\n\t\t\t\t\t.append(\n\t\t\t\t\t\t$( '<div>' )\n\t\t\t\t\t\t\t.addClass( 'one column tux-proofread-status ' + this.message.properties.status ),\n\t\t\t\t\t\t$( '<div>' )\n\t\t\t\t\t\t\t.addClass( 'five columns tux-proofread-source' )\n\t\t\t\t\t\t\t.attr( {\n\t\t\t\t\t\t\t\tlang: sourceLangCode,\n\t\t\t\t\t\t\t\tdir: sourceLangDir\n\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t.text( this.message.definition ),\n\t\t\t\t\t\t$( '<div>' )\n\t\t\t\t\t\t\t.addClass( 'five columns tux-proofread-translation' )\n\t\t\t\t\t\t\t.attr( {\n\t\t\t\t\t\t\t\tlang: targetLangAttrib,\n\t\t\t\t\t\t\t\tdir: targetLangDir\n\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t.text( this.message.translation || '' ),\n\t\t\t\t\t\t$( '<div>' )\n\t\t\t\t\t\t\t.addClass( 'tux-proofread-action-block one column' )\n\t\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\t\t$proofreadAction,\n\t\t\t\t\t\t\t\totherReviewers.length ?\n\t\t\t\t\t\t\t\t\t$( '<div>' )\n\t\t\t\t\t\t\t\t\t\t.addClass( 'tux-proofread-count' )\n\t\t\t\t\t\t\t\t\t\t.data( 'reviewCount', reviewers.length ) // To update when accepting\n\t\t\t\t\t\t\t\t\t\t.text( mw.language.convertNumber( reviewers.length ) ) :\n\t\t\t\t\t\t\t\t\t$( [] ),\n\t\t\t\t\t\t\t\t$proofreadEdit\n\t\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t).addClass( this.message.properties.status );\n\n\t\t\tif ( !translatedBySelf && !proofreadBySelf ) {\n\t\t\t\t// This will get removed later if any of various other reasons prevent it\n\t\t\t\tthis.message.proofreadable = true;\n\t\t\t\tthis.message.proofreadAction = this.proofread.bind( this );\n\t\t\t}\n\n\t\t\tif ( translatedBySelf ) {\n\t\t\t\tthis.markSelfTranslation();\n\t\t\t}\n\n\t\t\t/* Here we need to check that there are reviewers in the first place\n\t\t\t * before adding review markers */\n\t\t\tif ( reviewers.length && otherReviewers.length ) {\n\t\t\t\tthis.$message.addClass( 'proofread-by-others' );\n\t\t\t}\n\t\t},\n\n\t\tdisableProofread: function () {\n\t\t\tthis.message.proofreadable = false;\n\t\t\tthis.$message.find( '.tux-proofread-action' )\n\t\t\t\t.remove();\n\t\t},\n\n\t\t/**\n\t\t * Mark the message self translated.\n\t\t */\n\t\tmarkSelfTranslation: function () {\n\t\t\t// Own translations cannot be reviewed, so disable proofread\n\t\t\tthis.disableProofread();\n\t\t\tif ( !this.$message.hasClass( 'own-translation' ) ) {\n\t\t\t\tthis.$message.addClass( 'own-translation' )\n\t\t\t\t\t.find( '.tux-proofread-action-block' )\n\t\t\t\t\t.append( $( '<div>' )\n\t\t\t\t\t\t.addClass( 'translated-by-self' )\n\t\t\t\t\t\t.attr( 'title', mw.msg( 'tux-proofread-translated-by-self' ) )\n\t\t\t\t\t);\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t * Mark this message as proofread.\n\t\t */\n\t\tproofread: function () {\n\t\t\tvar reviews, $counter, params,\n\t\t\t\tmessage = this.message,\n\t\t\t\t$message = this.$message,\n\t\t\t\tapi = new mw.Api();\n\n\t\t\tparams = {\n\t\t\t\taction: 'translationreview',\n\t\t\t\trevision: this.message.properties.revision\n\t\t\t};\n\n\t\t\tif ( !mw.user.isAnon() ) {\n\t\t\t\tparams.assert = 'user';\n\t\t\t}\n\n\t\t\tapi.postWithToken( 'csrf', params ).done( function () {\n\t\t\t\t$message.find( '.tux-proofread-action' )\n\t\t\t\t\t.removeClass( 'tux-notice' ) // in case, it failed previously\n\t\t\t\t\t.addClass( 'accepted' );\n\n\t\t\t\t$counter = $message.find( '.tux-proofread-count' );\n\t\t\t\treviews = $counter.data( 'reviewCount' );\n\t\t\t\t$counter.text( mw.language.convertNumber( reviews + 1 ) );\n\n\t\t\t\t// Update stats\n\t\t\t\t$( '.tux-action-bar .tux-statsbar' ).trigger(\n\t\t\t\t\t'change',\n\t\t\t\t\t[ 'proofread', message.properties.status ]\n\t\t\t\t);\n\n\t\t\t\tmessage.properties.status = 'proofread';\n\n\t\t\t\tif ( mw.track ) {\n\t\t\t\t\tmw.track( 'ext.translate.event.proofread', message );\n\t\t\t\t}\n\t\t\t} ).fail( function ( errorCode ) {\n\t\t\t\t$message.find( '.tux-proofread-action' ).addClass( 'tux-notice' );\n\t\t\t\tif ( errorCode === 'assertuserfailed' ) {\n\t\t\t\t\t// eslint-disable-next-line no-alert\n\t\t\t\t\talert( mw.msg( 'tux-session-expired' ) );\n\t\t\t\t}\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t * Attach event listeners\n\t\t */\n\t\tlisten: function () {\n\t\t\tvar proofread = this;\n\n\t\t\tthis.$message.find( '.tux-proofread-action' ).on( 'click', function () {\n\t\t\t\tproofread.proofread();\n\t\t\t\treturn false;\n\t\t\t} );\n\n\t\t\tthis.$message.find( '.tux-proofread-edit' ).on( 'click', function () {\n\t\t\t\t// Make sure that the tooltip is hidden when going to the editor\n\t\t\t\t$( '.translate-tooltip' ).remove();\n\t\t\t\tproofread.$message.data( 'translateeditor' ).show();\n\n\t\t\t\treturn false;\n\t\t\t} );\n\t\t}\n\t};\n\n\t/*\n\t * proofread PLUGIN DEFINITION\n\t */\n\t$.fn.proofread = function ( options ) {\n\t\treturn this.each( function () {\n\t\t\tvar $this = $( this ),\n\t\t\t\tdata = $this.data( 'proofread' );\n\n\t\t\tif ( !data ) {\n\t\t\t\t$this.data( 'proofread', new Proofread( this, options ) );\n\t\t\t}\n\n\t\t} );\n\t};\n\n\t$.fn.proofread.Constructor = Proofread;\n\n}() );\n","usedDeprecatedRules":[]},{"filePath":"/src/repo/resources/js/ext.translate.recentgroups.js","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/resources/js/ext.translate.selecttoinput.js","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/resources/js/ext.translate.special.aggregategroups.js","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/resources/js/ext.translate.special.importtranslations.js","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/resources/js/ext.translate.special.languagestats.js","messages":[{"ruleId":"jsdoc/require-param-type","severity":1,"message":"Missing JSDoc @param \"$table\" type.","line":17,"column":null,"nodeType":"Block","endLine":17,"endColumn":null},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Positional selector extensions are not allowed","line":20,"column":3,"nodeType":"CallExpression","endLine":20,"endColumn":34},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Positional selector extensions are not allowed","line":21,"column":3,"nodeType":"CallExpression","endLine":21,"endColumn":35},{"ruleId":"compat/compat","severity":2,"message":"ResizeObserver.observe() is not supported in Safari 5.1, iOS Safari 6.0-6.1, IE 11","line":234,"column":3,"nodeType":"MemberExpression","endLine":253,"endColumn":14},{"ruleId":"compat/compat","severity":2,"message":"ResizeObserver is not supported in Safari 5.1, IE 11, android 4.1","line":234,"column":3,"nodeType":"NewExpression","endLine":253,"endColumn":6}],"errorCount":2,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * Collapsing script for Special:LanguageStats in MediaWiki Extension:Translate\n * @author Krinkle <krinklemail (at) gmail (dot) com>\n * @author Niklas Laxström\n * @license GPL-2.0-or-later, CC-BY-SA-3.0\n */\n\n( function () {\n\t'use strict';\n\n\tvar $columns;\n\n\t/**\n\t * Add css class to every other visible row.\n\t * It's not possible to do zebra colors with CSS only if there are hidden rows.\n\t *\n\t * @param $table\n\t */\n\tfunction doZebra( $table ) {\n\t\t$table.find( 'tr:visible:odd' ).toggleClass( 'tux-statstable-even', false );\n\t\t$table.find( 'tr:visible:even' ).toggleClass( 'tux-statstable-even', true );\n\t}\n\n\tfunction addExpanders( $table ) {\n\t\tvar $allChildRows, $allTogglesCache, $toggleAllButton,\n\t\t\t$metaRows = $( 'tr.AggregateMessageGroup', $table );\n\n\t\t// Quick return\n\t\tif ( !$metaRows.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$metaRows.each( function () {\n\t\t\tvar $toggler,\n\t\t\t\t$parent = $( this ),\n\t\t\t\tthisGroupId = $parent.attr( 'data-groupid' ),\n\t\t\t\t$children = $( 'tr[data-parentgroup=\"' + thisGroupId + '\"]', $table );\n\n\t\t\t// Only do the collapse stuff if this Meta-group actually has children on this page\n\t\t\tif ( !$children.length ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Build toggle link\n\t\t\t$toggler = $( '<span>' ).addClass( 'groupexpander collapsed' )\n\t\t\t\t.append(\n\t\t\t\t\t'[',\n\t\t\t\t\t$( '<a>' )\n\t\t\t\t\t\t.attr( 'href', '#' )\n\t\t\t\t\t\t.text( mw.msg( 'translate-langstats-expand' ) ),\n\t\t\t\t\t']'\n\t\t\t\t)\n\t\t\t\t.on( 'click', function ( e ) {\n\t\t\t\t\tvar $el = $( this );\n\t\t\t\t\t// Switch the state and toggle the rows\n\t\t\t\t\tif ( $el.hasClass( 'collapsed' ) ) {\n\t\t\t\t\t\t$children.removeClass( 'statstable-hide' ).trigger( 'show' );\n\t\t\t\t\t\tdoZebra( $table );\n\t\t\t\t\t\t$el.removeClass( 'collapsed' ).addClass( 'expanded' );\n\t\t\t\t\t\t$el.find( '> a' ).text( mw.msg( 'translate-langstats-collapse' ) );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$children.addClass( 'statstable-hide' ).trigger( 'hide' );\n\t\t\t\t\t\tdoZebra( $table );\n\t\t\t\t\t\t$el.addClass( 'collapsed' ).removeClass( 'expanded' );\n\t\t\t\t\t\t$el.find( '> a' ).text( mw.msg( 'translate-langstats-expand' ) );\n\t\t\t\t\t}\n\n\t\t\t\t\te.preventDefault();\n\t\t\t\t} );\n\n\t\t\t// Add the toggle link to the first cell of the meta group table-row\n\t\t\t$parent.find( ' > td' ).first().append( $toggler );\n\n\t\t\t// Handle hide/show recursively, so that collapsing parent group\n\t\t\t// hides all sub groups regardless of nesting level\n\t\t\t$parent.on( 'hide show', function ( event ) {\n\t\t\t\t// Reuse $toggle, $parent and $children from parent scope\n\t\t\t\tif ( $toggler.hasClass( 'expanded' ) ) {\n\t\t\t\t\t$children.trigger( event.type )[ event.type ]();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\n\t\t// Create, bind and append the toggle-all button\n\t\t$allChildRows = $( 'tr[data-parentgroup]', $table );\n\t\t$allTogglesCache = null;\n\t\t$toggleAllButton = $( '<span>' ).addClass( 'collapsed' )\n\t\t\t.append(\n\t\t\t\t'[',\n\t\t\t\t$( '<a>' )\n\t\t\t\t\t.attr( 'href', '#' )\n\t\t\t\t\t.text( mw.msg( 'translate-langstats-expandall' ) ),\n\t\t\t\t']'\n\t\t\t)\n\t\t\t.on( 'click', function ( e ) {\n\t\t\t\tvar $el = $( this ),\n\t\t\t\t\t$allToggles = $allTogglesCache || $( '.groupexpander', $table );\n\n\t\t\t\t// Switch the state and toggle the rows\n\t\t\t\t// and update the local toggles too\n\t\t\t\tif ( $el.hasClass( 'collapsed' ) ) {\n\t\t\t\t\t$allChildRows.removeClass( 'statstable-hide' );\n\t\t\t\t\t$el.add( $allToggles ).removeClass( 'collapsed' ).addClass( 'expanded' );\n\t\t\t\t\t$el.find( '> a' ).text( mw.msg( 'translate-langstats-collapseall' ) );\n\t\t\t\t\t$allToggles.find( '> a' ).text( mw.msg( 'translate-langstats-collapse' ) );\n\t\t\t\t} else {\n\t\t\t\t\t$allChildRows.addClass( 'statstable-hide' );\n\t\t\t\t\t$el.add( $allToggles ).addClass( 'collapsed' ).removeClass( 'expanded' );\n\t\t\t\t\t$el.find( '> a' ).text( mw.msg( 'translate-langstats-expandall' ) );\n\t\t\t\t\t$allToggles.find( '> a' ).text( mw.msg( 'translate-langstats-expand' ) );\n\t\t\t\t}\n\n\t\t\t\tdoZebra( $table );\n\t\t\t\te.preventDefault();\n\t\t\t} );\n\n\t\t// Initially hide them\n\t\t$allChildRows.addClass( 'statstable-hide' );\n\t\tdoZebra( $table );\n\n\t\t// Add the toggle-all button above the table\n\t\t$( '<p>' ).addClass( 'groupexpander-all' ).append( $toggleAllButton ).insertBefore( $table );\n\t}\n\n\tfunction applySorting( $table ) {\n\t\tvar index,\n\t\t\tsort = {},\n\t\t\tre = /#sortable:(\\d+)=(asc|desc)/,\n\t\t\tmatch = re.exec( location.hash );\n\n\t\tif ( match ) {\n\t\t\tindex = parseInt( match[ 1 ], 10 );\n\t\t\tsort[ index ] = match[ 2 ];\n\t\t}\n\t\t$table.tablesorter( { sortList: [ sort ] } );\n\n\t\t$table.on( 'sortEnd.tablesorter', function () {\n\t\t\t$table.find( '.headerSortDown, .headerSortUp' ).each( function () {\n\t\t\t\tvar headerIndex = $table.find( 'th' ).index( $( this ) ),\n\t\t\t\t\tdir = $( this ).hasClass( 'headerSortUp' ) ? 'asc' : 'desc';\n\t\t\t\tlocation.hash = 'sortable:' + headerIndex + '=' + dir;\n\n\t\t\t\tdoZebra( $table );\n\t\t\t} );\n\t\t} );\n\t}\n\n\tfunction narrowTable( $table, enable ) {\n\t\tvar $select,\n\t\t\tlabelColumnCount = 1,\n\t\t\t// 0-indexed\n\t\t\tdefaultValueColumn = 2;\n\n\t\tif ( $columns === undefined ) {\n\t\t\t$columns = $table.find( 'thead > tr > th ' ).map( function ( index, value ) {\n\t\t\t\treturn value.textContent;\n\t\t\t} );\n\t\t}\n\n\t\t$select = makeValueColumnSelector( $columns, labelColumnCount, defaultValueColumn );\n\t\t// Prevent table sorter from making the select inaccessible\n\t\t$select.on( 'mousedown click', function ( e ) {\n\t\t\te.stopPropagation();\n\t\t} ).on( 'change', function () {\n\t\t\tshowValueColumn( $table, $select, labelColumnCount );\n\t\t} );\n\n\t\tif ( enable ) {\n\t\t\tshowValueColumn( $table, $select, labelColumnCount );\n\t\t} else {\n\t\t\t// Restore original headings\n\t\t\t$table.find( 'thead > tr > th' ).map( function ( index ) {\n\t\t\t\treturn $( this ).text( $columns[ index ] );\n\t\t\t} );\n\t\t\t$table.find( 'tr > *' ).removeClass( 'statstable-hide' );\n\t\t}\n\n\t}\n\n\tfunction makeValueColumnSelector( headings, skip, def ) {\n\t\tvar i, $select = $( '<select>' );\n\n\t\tfor ( i = skip; i < headings.length; i++ ) {\n\t\t\t$( '<option>' )\n\t\t\t\t.text( headings[ i ] )\n\t\t\t\t.val( i )\n\t\t\t\t.prop( 'selected', i === def )\n\t\t\t\t.appendTo( $select );\n\t\t}\n\n\t\treturn $select;\n\t}\n\n\tfunction showValueColumn( $table, $select, skip ) {\n\t\tvar i, index, cssQuery;\n\n\t\tindex = parseInt( $select.val(), 10 );\n\t\tcssQuery = 'th:nth-child(_)'.replace( '_', index + 1 );\n\t\t$table.find( cssQuery ).html( $select );\n\n\t\tfor ( i = 0; i < $select.children().length; i++ ) {\n\t\t\tcssQuery = 'tr > *:nth-child(_)'.replace( '_', i + skip + 1 );\n\t\t\t$table.find( cssQuery ).toggleClass( 'statstable-hide', i + skip !== index );\n\t\t}\n\t}\n\n\t$( function () {\n\t\tvar isNarrowMode, minimumTableWidth,\n\t\t\t$table = $( '.statstable' );\n\n\t\t// Sometimes the table is not present on the page\n\t\tif ( !$table.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Calculate absolute minimum table width\n\t\tif ( window.ResizeObserver ) {\n\t\t\t$table.css( 'max-width', '1px' );\n\t\t}\n\n\t\tapplySorting( $table );\n\t\taddExpanders( $table );\n\n\t\tif ( !window.ResizeObserver ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Hopefully previous stuff have time to render by now to have accurate picture of the width\n\t\t( window.requestAnimationFrame || setTimeout )( function () {\n\t\t\tminimumTableWidth = $table.outerWidth();\n\t\t\t$table.css( 'max-width', '' );\n\t\t} );\n\n\t\tnew ResizeObserver( function ( entries ) {\n\t\t\tvar newMode, shouldCollapse, shouldExpand;\n\n\t\t\tshouldCollapse = entries[ 0 ].contentRect.width < minimumTableWidth;\n\t\t\t// Some fudge to avoid flapping\n\t\t\tshouldExpand = entries[ 0 ].contentRect.width - 20 > minimumTableWidth;\n\n\t\t\tif ( isNarrowMode && shouldExpand ) {\n\t\t\t\tnewMode = false;\n\t\t\t} else if ( !isNarrowMode && shouldCollapse ) {\n\t\t\t\tnewMode = true;\n\t\t\t} else {\n\t\t\t\tnewMode = isNarrowMode;\n\t\t\t}\n\n\t\t\tif ( newMode !== isNarrowMode ) {\n\t\t\t\tisNarrowMode = newMode;\n\t\t\t\tnarrowTable( $table, isNarrowMode );\n\t\t\t}\n\t\t} ).observe( $table.parent().get( 0 ) );\n\t} );\n}() );\n","usedDeprecatedRules":[]},{"filePath":"/src/repo/resources/js/ext.translate.special.managegroups.js","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/resources/js/ext.translate.special.managetranslatorsandbox.js","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/resources/js/ext.translate.special.operatorsuggest.js","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/resources/js/ext.translate.special.pagemigration.js","messages":[{"ruleId":"no-shadow","severity":1,"message":"'pageName' is already declared in the upper scope on line 4 column 3.","line":132,"column":27,"nodeType":"Identifier","messageId":"noShadow","endLine":132,"endColumn":35},{"ruleId":"no-shadow","severity":1,"message":"'sourceUnits' is already declared in the upper scope on line 6 column 3.","line":234,"column":25,"nodeType":"Identifier","messageId":"noShadow","endLine":234,"endColumn":36},{"ruleId":"no-shadow","severity":1,"message":"'sourceUnits' is already declared in the upper scope on line 6 column 3.","line":296,"column":25,"nodeType":"Identifier","messageId":"noShadow","endLine":296,"endColumn":36},{"ruleId":"no-shadow","severity":1,"message":"'sourceUnits' is already declared in the upper scope on line 6 column 3.","line":487,"column":22,"nodeType":"Identifier","messageId":"noShadow","endLine":487,"endColumn":33}],"errorCount":0,"warningCount":4,"fixableErrorCount":0,"fixableWarningCount":0,"source":"( function () {\n\t'use strict';\n\tvar noOfSourceUnits, noOfTranslationUnits,\n\t\tpageName = '',\n\t\tlangCode = '',\n\t\tsourceUnits = [];\n\n\t/**\n\t * Create translation pages using content of right hand side blocks\n\t * and identifiers from left hand side blocks. Create pages only if\n\t * content is not empty.\n\t *\n\t * @param {number} i Array index to sourceUnits.\n\t * @param {string} content\n\t * @return {Function} Returns a function which returns a jQuery.Promise\n\t */\n\tfunction createTranslationPage( i, content ) {\n\n\t\treturn function () {\n\t\t\tvar identifier, title, summary,\n\t\t\t\tapi = new mw.Api();\n\n\t\t\tidentifier = sourceUnits[ i ].identifier;\n\t\t\ttitle = 'Translations:' + pageName + '/' + identifier + '/' + langCode;\n\t\t\tsummary = $( '#pm-summary' ).val();\n\n\t\t\treturn api.postWithToken( 'csrf', {\n\t\t\t\taction: 'edit',\n\t\t\t\twatchlist: 'nochange',\n\t\t\t\ttitle: title,\n\t\t\t\ttext: content,\n\t\t\t\tsummary: summary\n\t\t\t} );\n\t\t};\n\t}\n\n\t/**\n\t * Get the old translations of a given page at given time.\n\t *\n\t * @param {string} fuzzyTimestamp Timestamp in MediaWiki format\n\t * @param {string} pageTitle\n\t * @return {jQuery.Promise}\n\t * @return {Function} return.done\n\t * @return {Array} return.done.data Array of old translations\n\t */\n\tfunction splitTranslationPage( fuzzyTimestamp, pageTitle ) {\n\t\tvar api = new mw.Api();\n\n\t\treturn api.get( {\n\t\t\taction: 'query',\n\t\t\tprop: 'revisions',\n\t\t\trvprop: 'content',\n\t\t\trvstart: fuzzyTimestamp,\n\t\t\ttitles: pageTitle\n\t\t} ).then( function ( data ) {\n\t\t\tvar pageContent, oldTranslationUnits, obj, page,\n\t\t\t\t$errorBox = $( '.mw-tpm-sp-error__message' );\n\t\t\tfor ( page in data.query.pages ) {\n\t\t\t\tobj = data.query.pages[ page ];\n\t\t\t}\n\t\t\tif ( obj === undefined ) {\n\t\t\t\t// obj was not initialized\n\t\t\t\t$errorBox.text( mw.msg( 'pm-page-does-not-exist', pageTitle ) ).removeClass( 'hide' );\n\t\t\t\treturn $.Deferred().reject();\n\t\t\t}\n\t\t\tif ( obj.revisions === undefined ) {\n\t\t\t\t// the case of /en subpage where first edit is by FuzzyBot\n\t\t\t\t$errorBox.text( mw.msg( 'pm-old-translations-missing', pageTitle ) ).removeClass( 'hide' );\n\t\t\t\treturn $.Deferred().reject();\n\t\t\t}\n\t\t\tpageContent = obj.revisions[ 0 ][ '*' ];\n\t\t\toldTranslationUnits = pageContent.split( '\\n\\n' );\n\t\t\treturn oldTranslationUnits;\n\t\t} );\n\t}\n\n\t/**\n\t * Get the timestamp before FuzzyBot's first edit on page.\n\t *\n\t * @param {string} pageTitle\n\t * @return {jQuery.Promise}\n\t * @return {Function} return.done\n\t * @return {string} return.done.data\n\t */\n\tfunction getFuzzyTimestamp( pageTitle ) {\n\t\tvar api = new mw.Api();\n\n\t\t// This api call returns the timestamp of FuzzyBot's edit\n\t\treturn api.get( {\n\t\t\taction: 'query',\n\t\t\tprop: 'revisions',\n\t\t\trvprop: 'timestamp',\n\t\t\trvuser: 'FuzzyBot',\n\t\t\trvdir: 'newer',\n\t\t\ttitles: pageTitle\n\t\t} ).then( function ( data ) {\n\t\t\tvar timestampFB, dateFB, timestampOld,\n\t\t\t\tpage, obj,\n\t\t\t\t$errorBox = $( '.mw-tpm-sp-error__message' );\n\t\t\tfor ( page in data.query.pages ) {\n\t\t\t\tobj = data.query.pages[ page ];\n\t\t\t}\n\t\t\t// Page does not exist if missing field is present\n\t\t\tif ( obj === undefined || obj.missing === '' ) {\n\t\t\t\t$errorBox.text( mw.msg( 'pm-page-does-not-exist', pageTitle ) ).removeClass( 'hide' );\n\t\t\t\treturn $.Deferred().reject();\n\t\t\t}\n\t\t\t// Page exists, but no edit by FuzzyBot\n\t\t\tif ( obj.revisions === undefined ) {\n\t\t\t\t$errorBox.text( mw.msg( 'pm-old-translations-missing', pageTitle ) ).removeClass( 'hide' );\n\t\t\t\treturn $.Deferred().reject();\n\t\t\t} else {\n\t\t\t\t// FB over here refers to FuzzyBot\n\t\t\t\ttimestampFB = obj.revisions[ 0 ].timestamp;\n\t\t\t\tdateFB = new Date( timestampFB );\n\t\t\t\tdateFB.setSeconds( dateFB.getSeconds() - 1 );\n\t\t\t\ttimestampOld = dateFB.toISOString();\n\t\t\t\tmw.log( 'New Timestamp: ' + timestampOld );\n\t\t\t\treturn timestampOld;\n\t\t\t}\n\t\t} );\n\t}\n\n\t/**\n\t * Get the translation units created by Translate extension.\n\t *\n\t * @param {string} pageName\n\t * @return {jQuery.Promise}\n\t * @return {Function} return.done\n\t * @return {Object[]} return.done.data Array of sUnit Objects\n\t */\n\tfunction getSourceUnits( pageName ) {\n\t\tvar api = new mw.Api();\n\n\t\treturn api.get( {\n\t\t\taction: 'query',\n\t\t\tlist: 'messagecollection',\n\t\t\tmcgroup: 'page-' + pageName,\n\t\t\tmclanguage: 'en',\n\t\t\tmcprop: 'definition'\n\t\t} ).then( function ( data ) {\n\t\t\tvar result, i, sUnit, key;\n\t\t\tsourceUnits = [];\n\t\t\tresult = data.query.messagecollection;\n\t\t\tfor ( i = 0; i < result.length; i++ ) {\n\t\t\t\tsUnit = {};\n\t\t\t\tkey = result[ i ].key;\n\t\t\t\tsUnit.identifier = key.slice( key.lastIndexOf( '/' ) + 1 );\n\t\t\t\tsUnit.definition = result[ i ].definition;\n\t\t\t\tsourceUnits.push( sUnit );\n\t\t\t}\n\t\t\treturn sourceUnits;\n\t\t} );\n\t}\n\n\t/**\n\t * Shift rows up by one unit. This is called after a unit is deleted.\n\t *\n\t * @param {jQuery} $start The starting node\n\t */\n\tfunction shiftRowsUp( $start ) {\n\t\tvar nextVal,\n\t\t\t$current = $start,\n\t\t\t$next = $start.next();\n\n\t\twhile ( $next.length ) {\n\t\t\tnextVal = $next.find( '.mw-tpm-sp-unit__target' ).val();\n\t\t\t$current.find( '.mw-tpm-sp-unit__target' ).val( nextVal );\n\t\t\t$current = $next;\n\t\t\t$next = $current.next();\n\t\t}\n\t\tif ( $current.find( '.mw-tpm-sp-unit__source' ).val() ) {\n\t\t\t$current.find( '.mw-tpm-sp-unit__target' ).val( '' );\n\t\t} else {\n\t\t\t$current.remove();\n\t\t}\n\t}\n\n\t/**\n\t * Shift rows down by one unit. This is called after a new empty unit is\n\t * added.\n\t *\n\t * @param {jQuery} $nextRow The next row to start with\n\t * @param {string} text The text of the next row\n\t * @return {string} text The text of the last row\n\t */\n\tfunction shiftRowsDown( $nextRow, text ) {\n\t\tvar oldText;\n\n\t\twhile ( $nextRow.length ) {\n\t\t\toldText = $nextRow.find( '.mw-tpm-sp-unit__target' ).val();\n\t\t\t$nextRow.find( '.mw-tpm-sp-unit__target' ).val( text );\n\t\t\t$nextRow = $nextRow.next();\n\t\t\ttext = oldText;\n\t\t}\n\t\treturn text;\n\t}\n\n\t/**\n\t * Create a new row of source text and target text with action icons.\n\t *\n\t * @param {string} sourceText\n\t * @param {string} targetText\n\t * @return {jQuery} newUnit The new row unit object\n\t */\n\n\tfunction createNewUnit( sourceText, targetText ) {\n\t\tvar $newUnit, $sourceUnit, $targetUnit, $actionUnit;\n\n\t\t$newUnit = $( '<div>' ).addClass( 'mw-tpm-sp-unit row' );\n\t\t$sourceUnit = $( '<textarea>' ).addClass( 'mw-tpm-sp-unit__source five columns' )\n\t\t\t.prop( 'readonly', true ).attr( 'tabindex', '-1' ).val( sourceText );\n\t\t$targetUnit = $( '<textarea>' ).addClass( 'mw-tpm-sp-unit__target five columns' )\n\t\t\t.val( targetText ).prop( 'dir', $.uls.data.getDir( langCode ) );\n\t\t$actionUnit = $( '<div>' ).addClass( 'mw-tpm-sp-unit__actions two columns' );\n\t\t$actionUnit.append(\n\t\t\t$( '<span>' ).addClass( 'mw-tpm-sp-action mw-tpm-sp-action--add' )\n\t\t\t\t.attr( 'title', mw.msg( 'pm-add-icon-hover-text' ) ),\n\t\t\t$( '<span>' ).addClass( 'mw-tpm-sp-action mw-tpm-sp-action--swap' )\n\t\t\t\t.attr( 'title', mw.msg( 'pm-swap-icon-hover-text' ) ),\n\t\t\t$( '<span>' ).addClass( 'mw-tpm-sp-action mw-tpm-sp-action--delete' )\n\t\t\t\t.attr( 'title', mw.msg( 'pm-delete-icon-hover-text' ) )\n\t\t);\n\t\t$newUnit.append( $sourceUnit, $targetUnit, $actionUnit );\n\t\treturn $newUnit;\n\t}\n\n\t/**\n\t * Display the source and target units alongwith the action icons.\n\t *\n\t * @param {Array} sourceUnits\n\t * @param {Array} translations\n\t */\n\tfunction displayUnits( sourceUnits, translations ) {\n\t\tvar i, totalUnits, $newUnit, $unitListing,\n\t\t\tsourceText, targetText;\n\n\t\tnoOfSourceUnits = sourceUnits.length;\n\t\tnoOfTranslationUnits = translations.length;\n\t\ttotalUnits = noOfSourceUnits > noOfTranslationUnits ? noOfSourceUnits : noOfTranslationUnits;\n\t\t$unitListing = $( '.mw-tpm-sp-unit-listing' );\n\t\t$unitListing.html( '' );\n\t\tfor ( i = 0; i < totalUnits; i++ ) {\n\t\t\tsourceText = targetText = '';\n\t\t\tif ( sourceUnits[ i ] !== undefined ) {\n\t\t\t\tsourceText = sourceUnits[ i ].definition;\n\t\t\t}\n\t\t\tif ( translations[ i ] !== undefined ) {\n\t\t\t\ttargetText = translations[ i ];\n\t\t\t}\n\t\t\t$newUnit = createNewUnit( sourceText, targetText );\n\t\t\t$unitListing.append( $newUnit );\n\t\t}\n\t}\n\n\t/**\n\t * Split headers from remaining text in each translation unit if present.\n\t *\n\t * @param {Array} translations Array of initial units obtained on splitting\n\t * @return {string[]} Array having the headers split into new unit\n\t */\n\tfunction splitHeaders( translations ) {\n\t\treturn translations.map( function ( elem ) {\n\t\t\t// Check https://regex101.com/r/oT7fZ2 for details\n\t\t\treturn elem.match( /(^==.+$|(?:(?!^==).+\\n?)+)/gm );\n\t\t} );\n\t}\n\n\t/**\n\t * Get the index of next translation unit containing h2 header.\n\t *\n\t * @param {number} startIndex Index to start the scan from\n\t * @param {string[]} translationUnits Segmented units.\n\t * @return {number} Index of the next unit found, -1 if not.\n\t */\n\tfunction getHeaderUnit( startIndex, translationUnits ) {\n\t\tvar i, regex;\n\t\tregex = new RegExp( /^==[^=]+==$/m );\n\t\tfor ( i = startIndex; i < translationUnits.length; i++ ) {\n\t\t\tif ( regex.test( translationUnits[ i ] ) ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t}\n\n\t/**\n\t * Align h2 headers in the order they appear.\n\t * Assumption: The source headers and translation headers appear in\n\t * the same order.\n\t *\n\t * @param {Object[]} sourceUnits\n\t * @param {string[]} translationUnits\n\t * @return {string[]}\n\t */\n\tfunction alignHeaders( sourceUnits, translationUnits ) {\n\t\tvar i, regex, tIndex = 0,\n\t\t\tmatchText, emptyCount, mergeText;\n\n\t\tregex = new RegExp( /^==[^=]+==$/m );\n\t\tfor ( i = 0; i < sourceUnits.length; i++ ) {\n\t\t\tif ( regex.test( sourceUnits[ i ].definition ) ) {\n\t\t\t\ttIndex = getHeaderUnit( tIndex, translationUnits );\n\t\t\t\tmergeText = '';\n\t\t\t\t// search is over\n\t\t\t\tif ( tIndex === -1 ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t// remove the unit\n\t\t\t\tmatchText = translationUnits.splice( tIndex, 1 ).toString();\n\t\t\t\temptyCount = i - tIndex;\n\t\t\t\tif ( emptyCount > 0 ) {\n\t\t\t\t\t// add empty units\n\t\t\t\t\twhile ( emptyCount !== 0 ) {\n\t\t\t\t\t\ttranslationUnits.splice( tIndex, 0, '' );\n\t\t\t\t\t\temptyCount -= 1;\n\t\t\t\t\t}\n\t\t\t\t} else if ( emptyCount < 0 ) {\n\t\t\t\t\t// merge units until there is room for tIndex translation unit to\n\t\t\t\t\t// align with ith source unit\n\t\t\t\t\twhile ( emptyCount !== 0 ) {\n\t\t\t\t\t\tmergeText += translationUnits.splice( i, 1 ).toString() + '\\n';\n\t\t\t\t\t\temptyCount += 1;\n\t\t\t\t\t}\n\t\t\t\t\tif ( i !== 0 ) {\n\t\t\t\t\t\ttranslationUnits[ i - 1 ] += '\\n' + mergeText;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmatchText = mergeText + matchText;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// add the unit back\n\t\t\t\ttranslationUnits.splice( i, 0, matchText );\n\t\t\t\ttIndex = i + 1;\n\t\t\t}\n\t\t}\n\t\treturn translationUnits;\n\t}\n\n\t/**\n\t * Handler for 'Save' button click event.\n\t */\n\tfunction saveHandler() {\n\t\tvar i, content, list = [];\n\n\t\t$( '.mw-tpm-sp-error__message' ).addClass( 'hide' );\n\t\tif ( noOfSourceUnits < noOfTranslationUnits ) {\n\t\t\t$( '.mw-tpm-sp-error__message' ).text( mw.msg( 'pm-extra-units-warning' ) )\n\t\t\t\t.removeClass( 'hide' );\n\t\t\treturn;\n\t\t} else {\n\t\t\t$( 'input' ).prop( 'disabled', true );\n\t\t\t$( '.mw-tpm-sp-instructions' ).addClass( 'hide' );\n\t\t\tfor ( i = 0; i < noOfSourceUnits; i++ ) {\n\t\t\t\tcontent = $( '.mw-tpm-sp-unit__target' ).eq( i ).val();\n\t\t\t\tcontent = content.trim();\n\t\t\t\tif ( content !== '' ) {\n\t\t\t\t\tlist.push( createTranslationPage( i, content ) );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$.ajaxDispatcher( list, 1 ).done( function () {\n\t\t\t\t$( '#action-import' ).removeClass( 'hide' );\n\t\t\t\t$( 'input' ).prop( 'disabled', false );\n\t\t\t\t$( '.mw-tpm-sp-instructions' )\n\t\t\t\t\t.text( mw.msg( 'pm-on-save-message-text' ) )\n\t\t\t\t\t.removeClass( 'hide' );\n\t\t\t} ).fail( function ( errmsg ) {\n\t\t\t\t$( 'input' ).prop( 'disabled', false );\n\t\t\t\t// eslint-disable-next-line mediawiki/msg-doc\n\t\t\t\t$( '.mw-tpm-sp-error__message' ).text( mw.msg( errmsg ) ).removeClass( 'hide' );\n\t\t\t} );\n\t\t}\n\t}\n\n\t/**\n\t * Handler for 'Cancel' button click event.\n\t */\n\tfunction cancelHandler() {\n\t\t$( '.mw-tpm-sp-error__message' ).addClass( 'hide' );\n\t\t$( '.mw-tpm-sp-instructions' ).addClass( 'hide' );\n\t\t$( '#action-save, #action-cancel' ).addClass( 'hide' );\n\t\t$( '#action-import' ).removeClass( 'hide' );\n\t\t$( '.mw-tpm-sp-unit-listing' ).html( '' );\n\t}\n\n\t/**\n\t * Handler for add new unit icon ('+') click event. Adds a translation unit\n\t * below the current unit.\n\t *\n\t * @param {jQuery.Event} event\n\t */\n\tfunction addHandler( event ) {\n\t\tvar $nextRow, text, $newUnit, $targetUnit;\n\n\t\t$nextRow = $( event.target ).closest( '.mw-tpm-sp-unit' ).next();\n\t\t$targetUnit = $nextRow.find( '.mw-tpm-sp-unit__target' );\n\t\ttext = $targetUnit.val();\n\t\t$targetUnit.val( '' );\n\t\t$nextRow = $nextRow.next();\n\t\ttext = shiftRowsDown( $nextRow, text );\n\t\tif ( text ) {\n\t\t\t$newUnit = createNewUnit( '', text );\n\t\t\t$( '.mw-tpm-sp-unit-listing' ).append( $newUnit );\n\t\t}\n\t\tnoOfTranslationUnits += 1;\n\t}\n\n\t/**\n\t * Handler for delete icon ('-') click event. Deletes the unit and shifts\n\t * the units up by one.\n\t *\n\t * @param {jQuery.Event} event\n\t */\n\tfunction deleteHandler( event ) {\n\t\tvar sourceText, $rowUnit;\n\t\t$rowUnit = $( event.target ).closest( '.mw-tpm-sp-unit' );\n\t\tsourceText = $rowUnit.find( '.mw-tpm-sp-unit__source' ).val();\n\t\tif ( !sourceText ) {\n\t\t\t$rowUnit.remove();\n\t\t} else {\n\t\t\t$rowUnit.find( '.mw-tpm-sp-unit__target' ).val( '' );\n\t\t\tshiftRowsUp( $rowUnit );\n\t\t}\n\t\tnoOfTranslationUnits -= 1;\n\t}\n\n\t/**\n\t * Handler for swap icon click event. Swaps the text in the current unit\n\t * with the text in the unit below.\n\t *\n\t * @param {jQuery.Event} event\n\t */\n\tfunction swapHandler( event ) {\n\t\tvar $rowUnit, tempText, nextVal;\n\t\t$rowUnit = $( event.target ).closest( '.mw-tpm-sp-unit' );\n\t\ttempText = $rowUnit.find( '.mw-tpm-sp-unit__target' ).val();\n\t\tnextVal = $rowUnit.next().find( '.mw-tpm-sp-unit__target' ).val();\n\t\t$rowUnit.find( '.mw-tpm-sp-unit__target' ).val( nextVal );\n\t\t$rowUnit.next().find( '.mw-tpm-sp-unit__target' ).val( tempText );\n\t}\n\n\t/**\n\t * Handler for 'Import' button click event. Imports source and translation\n\t * units and displays them.\n\t *\n\t * @param {jQuery.Event} e\n\t */\n\tfunction importHandler( e ) {\n\t\tvar pageTitle, slashPos, titleObj,\n\t\t\t$errorBox = $( '.mw-tpm-sp-error__message' ),\n\t\t\t$messageBox = $( '.mw-tpm-sp-instructions' );\n\n\t\te.preventDefault();\n\n\t\tpageTitle = $( '#title' ).val().trim();\n\t\tif ( pageTitle === '' ) {\n\t\t\t$errorBox.text( mw.msg( 'pm-pagetitle-missing' ) ).removeClass( 'hide' );\n\t\t\treturn;\n\t\t}\n\n\t\ttitleObj = mw.Title.newFromText( pageTitle );\n\t\t$messageBox.addClass( 'hide' );\n\t\tif ( titleObj === null ) {\n\t\t\t$errorBox.text( mw.msg( 'pm-pagetitle-invalid' ) ).removeClass( 'hide' );\n\t\t\treturn;\n\t\t}\n\n\t\tpageTitle = titleObj.getPrefixedDb();\n\t\tslashPos = pageTitle.lastIndexOf( '/' );\n\n\t\tif ( slashPos === -1 ) {\n\t\t\t$errorBox.text( mw.msg( 'pm-langcode-missing' ) ).removeClass( 'hide' );\n\t\t\treturn;\n\t\t}\n\n\t\tpageName = pageTitle.substring( 0, slashPos );\n\t\tlangCode = pageTitle.substring( slashPos + 1 );\n\n\t\tif ( pageName === '' ) {\n\t\t\t$errorBox.text( mw.msg( 'pm-pagetitle-invalid' ) ).removeClass( 'hide' );\n\t\t\treturn;\n\t\t}\n\n\t\t$errorBox.addClass( 'hide' );\n\n\t\t$.when( getSourceUnits( pageName ), getFuzzyTimestamp( pageTitle ) )\n\t\t\t.then( function ( sourceUnits, fuzzyTimestamp ) {\n\t\t\t\tnoOfSourceUnits = sourceUnits.length;\n\t\t\t\tsplitTranslationPage( fuzzyTimestamp, pageTitle ).done( function ( translations ) {\n\t\t\t\t\tvar translationUnits = splitHeaders( translations );\n\t\t\t\t\ttranslationUnits = alignHeaders( sourceUnits, translationUnits );\n\t\t\t\t\tnoOfTranslationUnits = translationUnits.length;\n\t\t\t\t\tdisplayUnits( sourceUnits, translationUnits );\n\t\t\t\t\t$( '#action-save, #action-cancel' ).removeClass( 'hide' );\n\t\t\t\t\t$( '#action-import' ).addClass( 'hide' );\n\t\t\t\t\t$messageBox.text( mw.msg( 'pm-on-import-message-text' ) ).removeClass( 'hide' );\n\t\t\t\t} );\n\t\t\t} );\n\t}\n\n\t/**\n\t * Listens to various click events\n\t */\n\tfunction listen() {\n\t\tvar $listing = $( '.mw-tpm-sp-unit-listing' );\n\n\t\t$( '#mw-tpm-sp-primary-form' ).on( 'submit', importHandler );\n\t\t$( '#action-import' ).on( 'click', importHandler );\n\t\t$( '#action-save' ).on( 'click', saveHandler );\n\t\t$( '#action-cancel' ).on( 'click', cancelHandler );\n\t\t$listing.on( 'click', '.mw-tpm-sp-action--swap', swapHandler );\n\t\t$listing.on( 'click', '.mw-tpm-sp-action--delete', deleteHandler );\n\t\t$listing.on( 'click', '.mw-tpm-sp-action--add', addHandler );\n\t}\n\n\t$( listen );\n\n\tmw.translate = mw.translate || {};\n\tmw.translate = $.extend( mw.translate, {\n\t\tgetSourceUnits: getSourceUnits,\n\t\tgetFuzzyTimestamp: getFuzzyTimestamp,\n\t\tsplitTranslationPage: splitTranslationPage,\n\t\talignHeaders: alignHeaders\n\t} );\n\n}() );\n","usedDeprecatedRules":[]},{"filePath":"/src/repo/resources/js/ext.translate.special.pagepreparation.js","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/resources/js/ext.translate.special.pagetranslation.js","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/resources/js/ext.translate.special.searchtranslations.js","messages":[{"ruleId":"mediawiki/class-doc","severity":1,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":125,"column":6,"nodeType":"CallExpression","endLine":126,"endColumn":50},{"ruleId":"no-shadow","severity":1,"message":"'languageCode' is already declared in the upper scope on line 67 column 4.","line":138,"column":48,"nodeType":"Identifier","messageId":"noShadow","endLine":138,"endColumn":60},{"ruleId":"mediawiki/class-doc","severity":1,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":235,"column":16,"nodeType":"CallExpression","endLine":236,"endColumn":55},{"ruleId":"mediawiki/class-doc","severity":1,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":238,"column":6,"nodeType":"CallExpression","endLine":239,"endColumn":49}],"errorCount":0,"warningCount":4,"fixableErrorCount":0,"fixableWarningCount":0,"source":"( function () {\n\t'use strict';\n\n\tvar resultGroups;\n\n\t$( function () {\n\t\tresultGroups = $( '.facet.groups' ).data( 'facets' );\n\n\t\t$( '.tux-searchpage .mw-ui-button' ).on( 'click', function () {\n\t\t\tvar query = $( '.tux-searchpage .searchinputbox' ).val(),\n\t\t\t\tresult = lexOperators( query ),\n\t\t\t\t$form = $( '.tux-searchpage form[name=searchform]' );\n\n\t\t\tObject.keys( result ).forEach( function ( index ) {\n\t\t\t\tvar $input = $( '<input>' ).prop( 'type', 'hidden' ),\n\t\t\t\t\t$elem = $form.find( 'input[name=' + index + ']' );\n\n\t\t\t\tif ( $elem.length ) {\n\t\t\t\t\t$elem.val( result[ index ] );\n\t\t\t\t} else {\n\t\t\t\t\t$form.append( $input\n\t\t\t\t\t\t.prop( {\n\t\t\t\t\t\t\tvalue: result[ index ],\n\t\t\t\t\t\t\tname: index\n\t\t\t\t\t\t} )\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\n\t\tbuildSelectedBox();\n\t\tshowLanguages();\n\t\tshowMessageGroups();\n\n\t\t// Make the whole rows clickable\n\t\t$( '.tux-searchpage .row .facet-item' ).on( 'click', function ( event ) {\n\t\t\twindow.location = $( this ).find( 'a' ).attr( 'href' );\n\t\t\tevent.stopPropagation();\n\t\t} );\n\t} );\n\n\t// ES5-compatible Chrome, IE 9+, FF 4+, or Safari 5+ has Object.keys.\n\t// Make other old browsers happy\n\tif ( !Object.keys ) {\n\t\tObject.keys = function ( obj ) {\n\t\t\tvar keys = [],\n\t\t\t\tk;\n\t\t\tfor ( k in obj ) {\n\t\t\t\tif ( Object.prototype.hasOwnProperty.call( obj, k ) ) {\n\t\t\t\t\tkeys.push( k );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn keys;\n\t\t};\n\t}\n\n\tfunction showLanguages() {\n\t\tvar $languages,\n\t\t\tlanguages,\n\t\t\tulslanguages = [],\n\t\t\tcurrentLanguage,\n\t\t\tresultCount,\n\t\t\t$count,\n\t\t\tresult,\n\t\t\ti,\n\t\t\tselectedClasss = '',\n\t\t\tlanguageCode,\n\t\t\tquickLanguageList = [],\n\t\t\tunique = [],\n\t\t\t$ulsTrigger,\n\t\t\turi;\n\n\t\t$languages = $( '.facet.languages' );\n\t\tlanguages = $languages.data( 'facets' );\n\t\tcurrentLanguage = $languages.data( 'language' );\n\t\tif ( !languages ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( currentLanguage !== '' ) {\n\t\t\turi = new mw.Uri( location.href );\n\t\t\turi.extend( { language: '', filter: '' } );\n\t\t\taddToSelectedBox( getLanguageLabel( currentLanguage ), uri.toString() );\n\t\t}\n\n\t\tresultCount = Object.keys( languages ).length;\n\t\tquickLanguageList = quickLanguageList.concat( mw.uls.getFrequentLanguageList() )\n\t\t\t.concat( Object.keys( languages ) );\n\n\t\t// Remove duplicates from the language list\n\t\tquickLanguageList.forEach( function ( lang ) {\n\t\t\tresult = languages[ lang ];\n\t\t\tif ( result && unique.indexOf( lang ) === -1 ) {\n\t\t\t\tunique.push( lang );\n\t\t\t}\n\t\t} );\n\n\t\tif ( currentLanguage && quickLanguageList.indexOf( currentLanguage ) >= 0 ) {\n\t\t\tquickLanguageList = unique.splice( 0, 5 );\n\t\t\tif ( quickLanguageList.indexOf( currentLanguage ) === -1 ) {\n\t\t\t\tquickLanguageList = quickLanguageList.concat( currentLanguage );\n\t\t\t}\n\t\t} else {\n\t\t\tquickLanguageList = unique.splice( 0, 6 );\n\t\t}\n\n\t\tquickLanguageList.sort( sortLanguages );\n\n\t\tfor ( i = 0; i <= quickLanguageList.length; i++ ) {\n\t\t\tlanguageCode = quickLanguageList[ i ];\n\t\t\tresult = languages[ languageCode ];\n\t\t\tif ( !result ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( currentLanguage === languageCode ) {\n\t\t\t\tselectedClasss = 'selected';\n\t\t\t} else {\n\t\t\t\tselectedClasss = '';\n\t\t\t}\n\n\t\t\t$languages.append( $( '<div>' )\n\t\t\t\t.addClass( 'row facet-item' )\n\t\t\t\t.append(\n\t\t\t\t\t$( '<span>' )\n\t\t\t\t\t\t.addClass( 'facet-name ' + selectedClasss )\n\t\t\t\t\t\t.append( $( '<a>' )\n\t\t\t\t\t\t\t.attr( 'href', result.url )\n\t\t\t\t\t\t\t.text( getLanguageLabel( languageCode ) )\n\t\t\t\t\t\t),\n\t\t\t\t\t$( '<span>' )\n\t\t\t\t\t\t.addClass( 'facet-count' )\n\t\t\t\t\t\t.text( result.count )\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\tObject.keys( languages ).forEach( function ( languageCode ) {\n\t\t\tulslanguages[ languageCode ] = mw.config.get( 'wgTranslateLanguages' )[ languageCode ];\n\t\t} );\n\n\t\tmw.translate.addExtraLanguagesToLanguageData( ulslanguages, [ 'SP' ] );\n\n\t\tif ( resultCount > 6 ) {\n\t\t\t$ulsTrigger = $( '<a>' )\n\t\t\t\t.text( '...' )\n\t\t\t\t.addClass( 'translate-search-more-languages' );\n\t\t\t$count = $( '<span>' )\n\t\t\t\t.addClass( 'translate-search-more-languages-info' )\n\t\t\t\t.text( mw.msg( 'translate-search-more-languages-info', resultCount - quickLanguageList.length ) );\n\t\t\t$languages.append( $ulsTrigger, $count );\n\n\t\t\t$ulsTrigger.uls( {\n\t\t\t\tonSelect: function ( language ) {\n\t\t\t\t\twindow.location = languages[ language ].url;\n\t\t\t\t},\n\t\t\t\tcompact: true,\n\t\t\t\tlanguages: ulslanguages,\n\t\t\t\tulsPurpose: 'translate-special-searchtranslations',\n\t\t\t\ttop: $languages.offset().top,\n\t\t\t\tshowRegions: [ 'SP' ].concat( $.fn.lcd.defaults.showRegions )\n\t\t\t} );\n\t\t}\n\t}\n\n\tfunction showMessageGroups() {\n\t\tvar currentGroup,\n\t\t\tgroupList,\n\t\t\t$groups;\n\n\t\t$groups = $( '.facet.groups' );\n\n\t\tif ( !resultGroups ) {\n\t\t\t// No search results\n\t\t\treturn;\n\t\t}\n\n\t\tgroupList = Object.keys( resultGroups );\n\t\tlistGroups( groupList, currentGroup, $groups );\n\t}\n\n\tfunction listGroups( groupList, parentGrouppath, $parent, level ) {\n\t\tvar i,\n\t\t\t$grouSelectorTrigger,\n\t\t\tselectedClass = '',\n\t\t\tgroup,\n\t\t\tgroupId,\n\t\t\t$groupRow,\n\t\t\turi,\n\t\t\tmaxListSize = 10,\n\t\t\tcurrentGroup = $( '.facet.groups' ).data( 'group' ),\n\t\t\tresultCount = groupList.length,\n\t\t\tposition,\n\t\t\toptions,\n\t\t\tgrouppath;\n\n\t\tlevel = level || 0;\n\t\tgroupList.sort( sortGroups );\n\t\tif ( level === 0 ) {\n\t\t\tgroupList = groupList.splice( 0, maxListSize );\n\t\t}\n\t\tgrouppath = getParameterByName( 'grouppath' ).split( '|' )[ 0 ];\n\t\tif ( currentGroup && resultGroups[ grouppath ] &&\n\t\t\tgroupList.indexOf( grouppath ) < 0 &&\n\t\t\tlevel === 0\n\t\t) {\n\t\t\t// Make sure current selected group is displayed always.\n\t\t\tgroupList = groupList.concat( grouppath );\n\t\t}\n\t\tgroupList.sort( sortGroups );\n\t\tfor ( i = 0; i < groupList.length; i++ ) {\n\t\t\tgroupId = groupList[ i ];\n\t\t\tgroup = findGroup( groupId, resultGroups );\n\t\t\tif ( !group ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\turi = new mw.Uri( location.href );\n\t\t\tif ( parentGrouppath !== undefined ) {\n\t\t\t\tgrouppath = parentGrouppath + '|' + groupId;\n\t\t\t} else {\n\t\t\t\tgrouppath = groupId;\n\t\t\t}\n\t\t\turi.extend( { group: groupId, grouppath: grouppath } );\n\n\t\t\tif ( currentGroup === groupId ) {\n\t\t\t\tselectedClass = 'selected';\n\t\t\t\turi.extend( { group: '', grouppath: '' } );\n\t\t\t\taddToSelectedBox( group.label, uri.toString() );\n\t\t\t} else {\n\t\t\t\tselectedClass = '';\n\t\t\t\turi.extend( { group: groupId, grouppath: grouppath } );\n\t\t\t}\n\n\t\t\t$groupRow = $( '<div>' )\n\t\t\t\t.addClass( 'row facet-item facet-level-' + level )\n\t\t\t\t.append(\n\t\t\t\t\t$( '<span>' )\n\t\t\t\t\t\t.addClass( 'facet-name ' + selectedClass )\n\t\t\t\t\t\t.append( $( '<a>' )\n\t\t\t\t\t\t\t.attr( 'href', uri.toString() )\n\t\t\t\t\t\t\t.text( group.label )\n\t\t\t\t\t\t),\n\t\t\t\t\t$( '<span>' )\n\t\t\t\t\t\t.addClass( 'facet-count' )\n\t\t\t\t\t\t.text( mw.language.convertNumber( group.count ) )\n\t\t\t\t);\n\t\t\t$parent.append( $groupRow );\n\t\t\tif ( group.groups && level < 2 ) {\n\t\t\t\tlistGroups( Object.keys( group.groups ), grouppath, $groupRow, level + 1 );\n\t\t\t}\n\t\t}\n\n\t\tif ( resultCount > maxListSize && resultCount - groupList.length > 0 && level === 0 ) {\n\t\t\t$grouSelectorTrigger = $( '<div>' )\n\t\t\t\t.addClass( 'rowfacet-item ' )\n\t\t\t\t.append(\n\t\t\t\t\t$( '<a>' )\n\t\t\t\t\t\t.text( '...' )\n\t\t\t\t\t\t.addClass( 'translate-search-more-groups' ),\n\t\t\t\t\t$( '<span>' )\n\t\t\t\t\t\t.addClass( 'translate-search-more-groups-info' )\n\t\t\t\t\t\t.text( mw.msg( 'translate-search-more-groups-info',\n\t\t\t\t\t\t\tresultCount - groupList.length ) )\n\t\t\t\t);\n\t\t\t$parent.append( $grouSelectorTrigger );\n\n\t\t\tif ( $( document.body ).hasClass( 'rtl' ) ) {\n\t\t\t\tposition = {\n\t\t\t\t\tmy: 'right top',\n\t\t\t\t\tat: 'right+90 top+40',\n\t\t\t\t\tcollision: 'none'\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tposition = {\n\t\t\t\t\tmy: 'left top',\n\t\t\t\t\tat: 'left-90 top+40',\n\t\t\t\t\tcollision: 'none'\n\t\t\t\t};\n\t\t\t}\n\t\t\toptions = {\n\t\t\t\tlanguage: mw.config.get( 'wgUserLanguage' ),\n\t\t\t\tposition: position,\n\t\t\t\tonSelect: function ( selectedGroup ) {\n\t\t\t\t\tvar currentUri = new mw.Uri( location.href );\n\t\t\t\t\tcurrentUri.extend( { group: selectedGroup.id, grouppath: selectedGroup.id } );\n\t\t\t\t\tlocation.href = currentUri.toString();\n\t\t\t\t},\n\t\t\t\tpreventSelector: true\n\t\t\t};\n\n\t\t\t$grouSelectorTrigger.msggroupselector(\n\t\t\t\toptions,\n\t\t\t\tObject.keys( resultGroups )\n\t\t\t);\n\t\t}\n\t}\n\n\tfunction lexOperators( str ) {\n\t\tvar splitValues = str.split( ' ' ),\n\t\t\tresult = {},\n\t\t\tquery = '';\n\n\t\tsplitValues.forEach( function ( string ) {\n\t\t\tmatchOperators( string, function ( obj ) {\n\t\t\t\tif ( obj === false ) {\n\t\t\t\t\tquery = query + ' ' + string;\n\t\t\t\t} else {\n\t\t\t\t\tresult[ obj.operator ] = obj.value;\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t\tresult.query = query.trim();\n\n\t\treturn result;\n\t}\n\n\tfunction matchOperators( str, callback ) {\n\t\tvar matches,\n\t\t\tcounter = false,\n\t\t\t// Add operators for different filters\n\t\t\toperatorRegex = [ 'language', 'group', 'filter' ];\n\n\t\toperatorRegex.forEach( function ( value ) {\n\t\t\tvar regex = new RegExp( value + ':(\\\\S+)', 'i' );\n\t\t\tif ( ( matches = regex.exec( str ) ) !== null ) {\n\t\t\t\tcounter = true;\n\t\t\t\tcallback( {\n\t\t\t\t\toperator: value,\n\t\t\t\t\tvalue: matches[ 1 ]\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t\tif ( !counter ) {\n\t\t\tcallback( false );\n\t\t}\n\t}\n\n\tfunction sortGroups( groupIdA, groupIdB ) {\n\t\tvar groupAName = findGroup( groupIdA, resultGroups ).count,\n\t\t\tgroupBName = findGroup( groupIdB, resultGroups ).count;\n\n\t\tif ( groupAName > groupBName ) {\n\t\t\treturn -1;\n\t\t} else if ( groupAName < groupBName ) {\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn 0;\n\t}\n\n\t/**\n\t * Finds a specific group from a groups object containing nested groups.\n\t *\n\t * @param {string} targetGroupId\n\t * @param {Object} groups\n\t * @return {Object} Message group object, or null if group is not found\n\t */\n\tfunction findGroup( targetGroupId, groups ) {\n\t\tvar group = groups[ targetGroupId ], groupId;\n\t\tif ( group ) {\n\t\t\treturn group;\n\t\t}\n\n\t\tfor ( groupId in groups ) {\n\t\t\tif ( groups[ groupId ].groups ) {\n\t\t\t\treturn findGroup( targetGroupId, groups[ groupId ].groups );\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tfunction sortLanguages( languageA, languageB ) {\n\t\tvar languageNameA = mw.config.get( 'wgULSLanguages' )[ languageA ] || languageA,\n\t\t\tlanguageNameB = mw.config.get( 'wgULSLanguages' )[ languageB ] || languageB;\n\n\t\treturn languageNameA.localeCompare( languageNameB );\n\t}\n\n\tfunction getParameterByName( name ) {\n\t\tvar uri = new mw.Uri();\n\t\treturn uri.query[ name ] || '';\n\t}\n\n\tfunction getLanguageLabel( languageCode ) {\n\t\treturn mw.config.get( 'wgULSLanguages' )[ languageCode ] || languageCode;\n\t}\n\n\t// Build a selected box to show the selected items\n\tfunction buildSelectedBox() {\n\t\t$( '.tux-search-inputs' )\n\t\t\t.removeClass( 'offset-by-three' )\n\t\t\t.before(\n\t\t\t\t$( '<div>' )\n\t\t\t\t\t.addClass( 'three columns tux-selectedbox' )\n\t\t\t);\n\t}\n\n\tfunction addToSelectedBox( label, url ) {\n\t\t$( '.tux-searchpage .tux-selectedbox' ).append( $( '<div>' )\n\t\t\t.addClass( 'row facet-item' )\n\t\t\t.append(\n\t\t\t\t$( '<span>' )\n\t\t\t\t\t.addClass( 'facet-name selected' )\n\t\t\t\t\t.append( $( '<a>' )\n\t\t\t\t\t\t.attr( 'href', url )\n\t\t\t\t\t\t.text( label )\n\t\t\t\t\t),\n\t\t\t\t$( '<span>' )\n\t\t\t\t\t.addClass( 'facet-count' )\n\t\t\t\t\t.text( 'X' )\n\t\t\t)\n\t\t);\n\t}\n}() );\n","usedDeprecatedRules":[]},{"filePath":"/src/repo/resources/js/ext.translate.special.translate.js","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/resources/js/ext.translate.special.translationstash.js","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/resources/js/ext.translate.special.translationstats.js","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/resources/js/ext.translate.statsbar.js","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/resources/js/ext.translate.storage.js","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/resources/js/ext.translate.translationstashstorage.js","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/resources/js/ext.translate.translationstats.embedded.js","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/resources/js/ext.translate.translationstats.graphbuilder.js","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/resources/js/ext.translate.workflowselector.js","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/resources/js/jquery.ajaxdispatcher.js","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/resources/js/jquery.textchange.js","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/tests/phpunit/data/jsontest_fi.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/tests/qunit/ext.translate.parsers.test.js","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/tests/qunit/ext.translate.special.pagemigration.test.js","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]}]

$ npm ci
npm WARN prepare removing existing node_modules/ before installation

> core-js@3.9.1 postinstall /src/repo/node_modules/core-js
> node -e "try{require('./postinstall')}catch(e){}"

Thank you for using core-js ( https://github.com/zloirock/core-js ) for polyfilling JavaScript standard library!

The project needs your help! Please consider supporting of core-js on Open Collective or Patreon: 
> https://opencollective.com/core-js 
> https://www.patreon.com/zloirock 

Also, the author of core-js ( https://github.com/zloirock ) is looking for a good job -)

added 684 packages in 13.738s

$ npm test

> @ test /src/repo
> grunt test

Running "eslint:all" (eslint) task

/src/repo/Gruntfile.js
  32:11  warning  Object.assign() is not supported in Safari 5.1, iOS Safari 6.0-6.1, IE 11  compat/compat

/src/repo/resources/js/ext.translate.editor.helpers.js
  198:4  warning  All possible CSS classes should be documented. See https://w.wiki/PS2 for details  mediawiki/class-doc

/src/repo/resources/js/ext.translate.editor.js
   133:4   warning  All possible CSS classes should be documented. See https://w.wiki/PS2 for details  mediawiki/class-doc
   374:17  warning  Selector extensions are not allowed                                                no-jquery/no-sizzle
   393:11  warning  All possible CSS classes should be documented. See https://w.wiki/PS2 for details  mediawiki/class-doc
   667:6   warning  Selector extensions are not allowed                                                no-jquery/no-sizzle
  1076:18  warning  All possible CSS classes should be documented. See https://w.wiki/PS2 for details  mediawiki/class-doc

/src/repo/resources/js/ext.translate.editor.shortcuts.js
  36:4  warning  Selector extensions are not allowed  no-jquery/no-sizzle

/src/repo/resources/js/ext.translate.messagerenamedialog.js
  308:2  warning  All possible CSS classes should be documented. See https://w.wiki/PS2 for details  mediawiki/class-doc
  309:2  warning  All possible CSS classes should be documented. See https://w.wiki/PS2 for details  mediawiki/class-doc

/src/repo/resources/js/ext.translate.messagetable.js
  288:33  warning  Selector extensions are not allowed             no-jquery/no-sizzle
  388:9   warning  Selector extensions are not allowed             no-jquery/no-sizzle
  401:16  warning  Positional selector extensions are not allowed  no-jquery/no-sizzle
  518:7   warning  Positional selector extensions are not allowed  no-jquery/no-sizzle

/src/repo/resources/js/ext.translate.pagemode.js
  56:6  warning  All possible CSS classes should be documented. See https://w.wiki/PS2 for details  mediawiki/class-doc
  78:4  warning  All possible CSS classes should be documented. See https://w.wiki/PS2 for details  mediawiki/class-doc
  79:5  warning  All possible CSS classes should be documented. See https://w.wiki/PS2 for details  mediawiki/class-doc
  82:7  warning  All possible CSS classes should be documented. See https://w.wiki/PS2 for details  mediawiki/class-doc

/src/repo/resources/js/ext.translate.proofread.js
   64:6   warning  All possible CSS classes should be documented. See https://w.wiki/PS2 for details  mediawiki/class-doc
   95:23  warning  All possible CSS classes should be documented. See https://w.wiki/PS2 for details  mediawiki/class-doc
  121:4   warning  All possible CSS classes should be documented. See https://w.wiki/PS2 for details  mediawiki/class-doc
  125:7   warning  All possible CSS classes should be documented. See https://w.wiki/PS2 for details  mediawiki/class-doc

/src/repo/resources/js/ext.translate.special.languagestats.js
   17:0  warning  Missing JSDoc @param "$table" type                                                  jsdoc/require-param-type
   20:3  warning  Positional selector extensions are not allowed                                      no-jquery/no-sizzle
   21:3  warning  Positional selector extensions are not allowed                                      no-jquery/no-sizzle
  234:3  warning  ResizeObserver.observe() is not supported in Safari 5.1, iOS Safari 6.0-6.1, IE 11  compat/compat
  234:3  warning  ResizeObserver is not supported in Safari 5.1, IE 11, android 4.1                   compat/compat

/src/repo/resources/js/ext.translate.special.pagemigration.js
  132:27  warning  'pageName' is already declared in the upper scope on line 4 column 3     no-shadow
  234:25  warning  'sourceUnits' is already declared in the upper scope on line 6 column 3  no-shadow
  296:25  warning  'sourceUnits' is already declared in the upper scope on line 6 column 3  no-shadow
  487:22  warning  'sourceUnits' is already declared in the upper scope on line 6 column 3  no-shadow

/src/repo/resources/js/ext.translate.special.searchtranslations.js
  125:6   warning  All possible CSS classes should be documented. See https://w.wiki/PS2 for details  mediawiki/class-doc
  138:48  warning  'languageCode' is already declared in the upper scope on line 67 column 4          no-shadow
  235:16  warning  All possible CSS classes should be documented. See https://w.wiki/PS2 for details  mediawiki/class-doc
  238:6   warning  All possible CSS classes should be documented. See https://w.wiki/PS2 for details  mediawiki/class-doc

✖ 35 problems (0 errors, 35 warnings)


Running "banana:PageTranslation" (banana) task
>> 1 message directory checked.

Running "banana:Translate" (banana) task
>> 1 message directory checked.

Running "banana:TranslateApi" (banana) task
>> 1 message directory checked.

Running "banana:TranslateSandbox" (banana) task
>> 1 message directory checked.

Running "banana:TranslateSearch" (banana) task
>> 1 message directory checked.

Running "stylelint:all" (stylelint) task
>> Linted 29 files without errors

Done.

Upgrading c:mediawiki/minus-x from 1.1.0 -> 1.1.1
$ composer update
Loading composer repositories with package information
Warning from https://repo.packagist.org: You are using an outdated version of Composer. Composer 2 is now available and you should upgrade. See https://getcomposer.org/2
Updating dependencies (including require-dev)
Package operations: 0 installs, 1 update, 0 removals
  - Updating mediawiki/minus-x (1.1.0 => 1.1.1): Loading from cache
Writing lock file
Generating autoload files
14 packages you are using are looking for funding.
Use the `composer fund` command to find out more!

$ composer install
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Nothing to install or update
Generating autoload files
14 packages you are using are looking for funding.
Use the `composer fund` command to find out more!

$ composer test
> parallel-lint . --exclude vendor --exclude node_modules
PHP 7.3.19 | 10 parallel jobs
............................................................  60/408 (14 %)
............................................................ 120/408 (29 %)
............................................................ 180/408 (44 %)
............................................................ 240/408 (58 %)
............................................................ 300/408 (73 %)
............................................................ 360/408 (88 %)
................................................             408/408 (100 %)


Checked 408 files in 1.7 seconds
No syntax error found
> phpcs -p -s
.............E..................E......................E....  60 / 408 (15%)
.............E.............................................. 120 / 408 (29%)
............................................................ 180 / 408 (44%)
............................................................ 240 / 408 (59%)
.......................................................E..EE 300 / 408 (74%)
E.E.EE..E.EE..............E..EE...EE..E..E....EEE.....E..... 360 / 408 (88%)
E.E.......E.............E.....E.................             408 / 408 (100%)



FILE: /src/repo/tests/phpunit/Cache/PersistentDatabaseCacheTest.php
----------------------------------------------------------------------
FOUND 3 ERRORS AFFECTING 1 LINE
----------------------------------------------------------------------
 325 | ERROR | Doc comment for parameter "$inputs" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 325 | ERROR | Doc comment for parameter "$exptime" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 325 | ERROR | Doc comment for parameter "$tag" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
----------------------------------------------------------------------


FILE: /src/repo/tests/phpunit/TranslateUtilsTest.php
----------------------------------------------------------------------
FOUND 1 ERROR AFFECTING 1 LINE
----------------------------------------------------------------------
 11 | ERROR | Doc comment for parameter "$user" missing
    |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
----------------------------------------------------------------------


FILE: /src/repo/tests/phpunit/unit/Utilities/JsonCodecTest.php
----------------------------------------------------------------------
FOUND 2 ERRORS AFFECTING 2 LINES
----------------------------------------------------------------------
  38 | ERROR | Doc comment for parameter "$serialization" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 121 | ERROR | Doc comment for parameter "$expected" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
----------------------------------------------------------------------


FILE: ...sts/phpunit/unit/Validation/Validators/BaseValidatorTestCase.php
----------------------------------------------------------------------
FOUND 1 ERROR AFFECTING 1 LINE
----------------------------------------------------------------------
 33 | ERROR | Doc comment for parameter "$issues" missing
    |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
----------------------------------------------------------------------


FILE: /src/repo/src/Services.php
----------------------------------------------------------------------
FOUND 6 ERRORS AFFECTING 6 LINES
----------------------------------------------------------------------
 57 | ERROR | Missing @return tag in function comment
    |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
 62 | ERROR | Missing @return tag in function comment
    |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
 67 | ERROR | Missing @return tag in function comment
    |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
 76 | ERROR | Missing @return tag in function comment
    |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
 81 | ERROR | Missing @return tag in function comment
    |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
 90 | ERROR | Missing @return tag in function comment
    |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
----------------------------------------------------------------------


FILE: ...epo/src/TranslatorSandbox/ManageTranslatorSandboxSpecialPage.php
----------------------------------------------------------------------
FOUND 3 ERRORS AFFECTING 2 LINES
----------------------------------------------------------------------
 210 | ERROR | Doc comment for parameter "$a" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 210 | ERROR | Doc comment for parameter "$b" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 213 | ERROR | Missing @return tag in function comment
     |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
----------------------------------------------------------------------


FILE: /src/repo/src/TranslatorSandbox/TranslationStashWriter.php
----------------------------------------------------------------------
FOUND 2 ERRORS AFFECTING 2 LINES
----------------------------------------------------------------------
  9 | ERROR | Doc comment for parameter "$item" missing
    |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 15 | ERROR | Doc comment for parameter "$user" missing
    |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
----------------------------------------------------------------------


FILE: /src/repo/src/TranslatorSandbox/TranslationStashReader.php
----------------------------------------------------------------------
FOUND 1 ERROR AFFECTING 1 LINE
----------------------------------------------------------------------
 14 | ERROR | Doc comment for parameter "$user" missing
    |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
----------------------------------------------------------------------


FILE: /src/repo/src/TranslatorSandbox/TranslationStashSpecialPage.php
----------------------------------------------------------------------
FOUND 3 ERRORS AFFECTING 3 LINES
----------------------------------------------------------------------
  84 | ERROR | Missing @return tag in function comment
     |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
 172 | ERROR | Missing @return tag in function comment
     |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
 178 | ERROR | Missing @return tag in function comment
     |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
----------------------------------------------------------------------


FILE: /src/repo/src/Cache/PersistentCache.php
----------------------------------------------------------------------
FOUND 2 ERRORS AFFECTING 2 LINES
----------------------------------------------------------------------
  8 | ERROR | Doc comment for parameter "...$keynames" missing
    |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 19 | ERROR | Doc comment for parameter "$tag" missing
    |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
----------------------------------------------------------------------


FILE: /src/repo/src/Cache/PersistentDatabaseCache.php
----------------------------------------------------------------------
FOUND 3 ERRORS AFFECTING 3 LINES
----------------------------------------------------------------------
  30 | ERROR | Doc comment for parameter "...$keynames" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
  60 | ERROR | Doc comment for parameter "$tag" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 170 | ERROR | Doc comment for parameter "$rows" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
----------------------------------------------------------------------


FILE: /src/repo/src/Synchronization/MessageUpdateParameter.php
----------------------------------------------------------------------
FOUND 2 ERRORS AFFECTING 1 LINE
----------------------------------------------------------------------
 92 | ERROR | Doc comment for parameter "$job" missing
    |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 92 | ERROR | Missing @return tag in function comment
    |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
----------------------------------------------------------------------


FILE: /src/repo/src/Synchronization/GroupSynchronizationCache.php
----------------------------------------------------------------------
FOUND 16 ERRORS AFFECTING 9 LINES
----------------------------------------------------------------------
  65 | ERROR | Doc comment for parameter "$groupId" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
  83 | ERROR | Doc comment for parameter "$groupId" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
  95 | ERROR | Doc comment for parameter "$groupId" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 101 | ERROR | Doc comment for parameter "$groupId" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 101 | ERROR | Doc comment for parameter "...$messageParams"
     |       | missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 118 | ERROR | Doc comment for parameter "$groupId" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 118 | ERROR | Missing @return tag in function comment
     |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
 147 | ERROR | Doc comment for parameter "$groupId" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 147 | ERROR | Doc comment for parameter "$messageKey" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 147 | ERROR | Missing @return tag in function comment
     |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
 153 | ERROR | Doc comment for parameter "$groupId" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 153 | ERROR | Missing @return tag in function comment
     |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
 187 | ERROR | Doc comment for parameter "$groupId" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 187 | ERROR | Doc comment for parameter "...$messageKeys"
     |       | missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 223 | ERROR | Doc comment for parameter "$groupId" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 223 | ERROR | Doc comment for parameter "...$messages" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
----------------------------------------------------------------------


FILE: ...repo/src/Synchronization/ExportTranslationsMaintenanceScript.php
----------------------------------------------------------------------
FOUND 3 ERRORS AFFECTING 1 LINE
----------------------------------------------------------------------
 290 | ERROR | Doc comment for parameter "$groupPattern" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 290 | ERROR | Doc comment for parameter "$excludePattern"
     |       | missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 290 | ERROR | Doc comment for parameter "$forOffline" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
----------------------------------------------------------------------


FILE: /src/repo/src/Statistics/TranslationStatsDataProvider.php
----------------------------------------------------------------------
FOUND 9 ERRORS AFFECTING 5 LINES
----------------------------------------------------------------------
 156 | ERROR | Doc comment for parameter "$type" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 156 | ERROR | Doc comment for parameter "$opts" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 156 | ERROR | Missing @return tag in function comment
     |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
 168 | ERROR | Doc comment for parameter "$scale" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 168 | ERROR | Doc comment for parameter "$cutoff" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 168 | ERROR | Doc comment for parameter "$direction" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 171 | ERROR | Missing @return tag in function comment
     |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
 211 | ERROR | Doc comment for parameter "$scale" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 216 | ERROR | Missing @return tag in function comment
     |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
----------------------------------------------------------------------


FILE: /src/repo/src/PageTranslation/ParserOutput.php
----------------------------------------------------------------------
FOUND 5 ERRORS AFFECTING 4 LINES
----------------------------------------------------------------------
 36 | ERROR | Missing @return tag in function comment
    |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
 46 | ERROR | Missing @return tag in function comment
    |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
 61 | ERROR | Doc comment for parameter "$sourceLanguage" missing
    |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 61 | ERROR | Missing @return tag in function comment
    |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
 73 | ERROR | Missing @return tag in function comment
    |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
----------------------------------------------------------------------


FILE: /src/repo/src/PageTranslation/TranslationPage.php
----------------------------------------------------------------------
FOUND 3 ERRORS AFFECTING 3 LINES
----------------------------------------------------------------------
 54 | ERROR | Missing @return tag in function comment
    |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
 75 | ERROR | Doc comment for parameter "$collection" missing
    |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 85 | ERROR | Missing @return tag in function comment
    |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
----------------------------------------------------------------------


FILE: /src/repo/src/PageTranslation/TranslationUnit.php
----------------------------------------------------------------------
FOUND 9 ERRORS AFFECTING 8 LINES
----------------------------------------------------------------------
  56 | ERROR | Missing @return tag in function comment
     |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
  61 | ERROR | Missing @return tag in function comment
     |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
  68 | ERROR | Missing @return tag in function comment
     |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
  75 | ERROR | Missing @return tag in function comment
     |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
  96 | ERROR | Missing @return tag in function comment
     |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
 101 | ERROR | Missing @return tag in function comment
     |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
 115 | ERROR | Missing @return tag in function comment
     |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
 127 | ERROR | Doc comment for parameter "$data" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 127 | ERROR | Missing @return tag in function comment
     |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
----------------------------------------------------------------------


FILE: /src/repo/src/PageTranslation/TranslatablePageParser.php
----------------------------------------------------------------------
FOUND 15 ERRORS AFFECTING 9 LINES
----------------------------------------------------------------------
  28 | ERROR | Doc comment for parameter "$text" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
  31 | ERROR | Missing @return tag in function comment
     |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
  48 | ERROR | Doc comment for parameter "$text" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
  48 | ERROR | Missing @return tag in function comment
     |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
 116 | ERROR | Doc comment for parameter "$text" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 116 | ERROR | Doc comment for parameter "$canWrap" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 121 | ERROR | Missing @return tag in function comment
     |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
 150 | ERROR | Doc comment for parameter "$content" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 155 | ERROR | Missing @return tag in function comment
     |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
 203 | ERROR | Doc comment for parameter "$holders" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 203 | ERROR | Doc comment for parameter "$text" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 203 | ERROR | Missing @return tag in function comment
     |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
 216 | ERROR | Doc comment for parameter "$holders" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 216 | ERROR | Doc comment for parameter "$text" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 216 | ERROR | Missing @return tag in function comment
     |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
----------------------------------------------------------------------


FILE: ...repo/src/TranslatorInterface/Insertable/InsertablesSuggester.php
----------------------------------------------------------------------
FOUND 1 ERROR AFFECTING 1 LINE
----------------------------------------------------------------------
 14 | ERROR | Doc comment for parameter "$text" missing
    |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
----------------------------------------------------------------------


FILE: ...rc/repo/src/TranslatorInterface/Insertable/InsertableFactory.php
----------------------------------------------------------------------
FOUND 1 ERROR AFFECTING 1 LINE
----------------------------------------------------------------------
 20 | ERROR | Missing @return tag in function comment
    |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
----------------------------------------------------------------------


FILE: /src/repo/src/Utilities/Json/JsonCodec.php
----------------------------------------------------------------------
FOUND 2 ERRORS AFFECTING 1 LINE
----------------------------------------------------------------------
 76 | ERROR | Doc comment for parameter "$json" missing
    |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 76 | ERROR | Missing @return tag in function comment
    |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
----------------------------------------------------------------------


FILE: /src/repo/src/Utilities/Json/JsonUnserializableTrait.php
----------------------------------------------------------------------
FOUND 3 ERRORS AFFECTING 2 LINES
----------------------------------------------------------------------
 23 | ERROR | Doc comment for parameter "$json" missing
    |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 23 | ERROR | Missing @return tag in function comment
    |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
 33 | ERROR | Missing @return tag in function comment
    |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
----------------------------------------------------------------------


FILE: /src/repo/src/Utilities/Json/JsonUnserializable.php
----------------------------------------------------------------------
FOUND 1 ERROR AFFECTING 1 LINE
----------------------------------------------------------------------
 15 | ERROR | Doc comment for parameter "$json" missing
    |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
----------------------------------------------------------------------


FILE: /src/repo/src/Utilities/ParsingPlaceholderFactory.php
----------------------------------------------------------------------
FOUND 1 ERROR AFFECTING 1 LINE
----------------------------------------------------------------------
 15 | ERROR | Missing @return tag in function comment
    |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
----------------------------------------------------------------------


FILE: /src/repo/src/Validation/ValidationIssue.php
----------------------------------------------------------------------
FOUND 4 ERRORS AFFECTING 1 LINE
----------------------------------------------------------------------
 26 | ERROR | Doc comment for parameter "$type" missing
    |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 26 | ERROR | Doc comment for parameter "$subType" missing
    |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 26 | ERROR | Doc comment for parameter "$messageKey" missing
    |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 26 | ERROR | Doc comment for parameter "$messageParams" missing
    |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
----------------------------------------------------------------------


FILE: /src/repo/src/Validation/ValidationRunner.php
----------------------------------------------------------------------
FOUND 20 ERRORS AFFECTING 7 LINES
----------------------------------------------------------------------
  54 | ERROR | Doc comment for parameter "$value" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
  54 | ERROR | Missing @return tag in function comment
     |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
  74 | ERROR | Doc comment for parameter "$validatorConfig"
     |       | missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 142 | ERROR | Doc comment for parameter "$message" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 142 | ERROR | Doc comment for parameter "$code" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 142 | ERROR | Doc comment for parameter "$ignoreWarnings"
     |       | missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 146 | ERROR | Missing @return tag in function comment
     |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
 172 | ERROR | Doc comment for parameter "$message" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 172 | ERROR | Doc comment for parameter "$code" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 172 | ERROR | Doc comment for parameter "$ignoreWarnings"
     |       | missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 172 | ERROR | Missing @return tag in function comment
     |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
 236 | ERROR | Doc comment for parameter "$issues" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 236 | ERROR | Doc comment for parameter "$targetLanguage"
     |       | missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 236 | ERROR | Missing @return tag in function comment
     |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
 327 | ERROR | Doc comment for parameter "$validatorData" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 327 | ERROR | Doc comment for parameter "$message" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 327 | ERROR | Doc comment for parameter "$targetLanguage"
     |       | missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 327 | ERROR | Doc comment for parameter "$errors" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 327 | ERROR | Doc comment for parameter "$warnings" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 327 | ERROR | Doc comment for parameter "$ignoreWarnings"
     |       | missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
----------------------------------------------------------------------


FILE: /src/repo/src/Validation/Validators/MediaWikiPluralValidator.php
----------------------------------------------------------------------
FOUND 5 ERRORS AFFECTING 3 LINES
----------------------------------------------------------------------
  83 | ERROR | Doc comment for parameter "$code" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
  83 | ERROR | Missing @return tag in function comment
     |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
  91 | ERROR | Doc comment for parameter "$translation" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 134 | ERROR | Doc comment for parameter "$forms" missing
     |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 134 | ERROR | Missing @return tag in function comment
     |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
----------------------------------------------------------------------


FILE: /src/repo/src/Validation/ValidationIssues.php
----------------------------------------------------------------------
FOUND 2 ERRORS AFFECTING 2 LINES
----------------------------------------------------------------------
 25 | ERROR | Doc comment for parameter "$issue" missing
    |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 30 | ERROR | Doc comment for parameter "$issues" missing
    |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
----------------------------------------------------------------------


FILE: /src/repo/src/TtmServer/TtmServerFactory.php
----------------------------------------------------------------------
FOUND 3 ERRORS AFFECTING 2 LINES
----------------------------------------------------------------------
 23 | ERROR | Doc comment for parameter "$configs" missing
    |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 23 | ERROR | Doc comment for parameter "$default" missing
    |       | (MediaWiki.Commenting.FunctionComment.MissingParamTag)
 66 | ERROR | Missing @return tag in function comment
    |       | (MediaWiki.Commenting.FunctionComment.MissingReturn)
----------------------------------------------------------------------

Time: 7.53 secs; Memory: 26MB

Script phpcs -p -s handling the test event returned with error code 1

Traceback (most recent call last):
  File "/venv/lib/python3.7/site-packages/libup-0.0.1-py3.7.egg/libup/ng.py", line 1188, in main
    libup.run(args.repo, args.output, args.branch)
  File "/venv/lib/python3.7/site-packages/libup-0.0.1-py3.7.egg/libup/ng.py", line 1131, in run
    self.composer_upgrade(plan)
  File "/venv/lib/python3.7/site-packages/libup-0.0.1-py3.7.egg/libup/ng.py", line 684, in composer_upgrade
    self.composer_test()
  File "/venv/lib/python3.7/site-packages/libup-0.0.1-py3.7.egg/libup/ng.py", line 246, in composer_test
    self.check_call(['composer', 'test'])
  File "/venv/lib/python3.7/site-packages/libup-0.0.1-py3.7.egg/libup/shell.py", line 38, in check_call
    res.check_returncode()
  File "/usr/lib/python3.7/subprocess.py", line 428, in check_returncode
    self.stderr)
subprocess.CalledProcessError: Command '['composer', 'test']' returned non-zero exit status 1.

composer dependencies

Dependencies
Development dependencies

npm dependencies

Development dependencies

Logs

Source code is licensed under the AGPL.